Você está na página 1de 12

Utilizando imagens no forms 6i.

Manipular imagens no Oracle Forms. Para isso, utilizaremos a procedure READ_IMAGE_FILE, nativa do forms. Sua definio : Sintaxe PROCEDURE READ_IMAGE_FILE (file_name VARCHAR2,file_type VARCHAR2,item_id ITEM);

PROCEDURE READ_IMAGE_FILE (file_name VARCHAR2,file_type VARCHAR2,item_name VARCHAR2); Parametros file_name Nome do arquivo de imagem, se passado apenas o nome ir buscar o caminho default da Path, tambm possvel passar o caminho completo. file_type Tipo do arquivo: BMP, CALS, GIF, JFIF, JPG, PICT, RAS, TIFF, ou TPIC. item_id Id do item que ir receber um a imagem. item_name Nome do item que ir receber a imagem. Bom, vamos aos passos para a construo do form.

1 - Vamos criar um data block, no base table (aquele que no referencia a estrutura de um objeto do banco de dados) com nome de IMAGEM.

2 - Entre na propriedade do data block, altere o valor da opo DATABASE DATA BLOCK para NO. Afinal, este bloco no precisa acessar o banco de dados.

3 - Neste data block, criaremos dois campos. So eles: IMAGEM do tipo Image

CAMINHO do tipo TEXT ITEM

4 - Devemos criar um canvas chamado Imagem.

5 - Depois de criado, alterar os campos para que ficam dentro dele. Para isso entre na propriedade do campo, e na opo canvas escolha IMAGEM. Faa isso para os dois campos.

6 - Aps isso entre no Layout Editor [F2] e posicione os campos da melhor forma

7 - Agora, vamos criar um procedure com o nome de LEIMAGEM.

Com o contedo:

PROCEDURE leImagem(p_imagem varchar2) IS button_pressed number; alerta Alert; begin :SYSTEM.MESSAGE_LEVEL := 25; IF(:IMAGEM.CAMINHO IS NOT NULL)THEN READ_IMAGE_FILE(p_imagem,BMP,'IMAGEM.IMAGEM); END IF; IF NOT FORM_SUCCESS THEN alerta := find_alert(ERRO);

button_pressed := SHOW_ALERT(alerta); END IF; :SYSTEM.MESSAGE_LEVEL := 0; END; Esta dever ser chamada quando houver uma alterao no campo CAMINHO, vamos colocar no WHEN-VALIDATE-ITEM a chamada para esta procedure. Optei de criar nesta trigger pois apenas quando mudar o contedo deste campo que a imagem ser recarregada.

8 - Vamos criar a trigger WHEN-VALIDATE-ITEM no campo CAMINHO com contedo:

declare begin leImagem(p_imagem => :IMAGEM.CAMINHO); end; legal observar que o Oracle possibilita dois tipos de passagem de parmetros, so eles: O habitual posicional onde os parmetros so passados na mesma seqncia que declarados. Exemplo: leImagem(:IMAGEM.CAMINHO);. E o referenciado onde os parmetros so passados com a referencia identificada. Exemplo: leImagem(p_imagem => :IMAGEM.CAMINHO);. 9 - Agora vamos criar um alerta para tratar a exceo, pois possvel que o usurio digite um caminho que no h uma imagem.

Vamos mudar algumas propriedades: 10 - No alert ERRO: Title: Erro ao Encontrar a Imagem Message: Imagem no encontrada! Deixe a propriedade Button 2 Label em branco, utilizaremos apenas o boto OK no alert. 11 - Na Window WINDOW1: Title: Imagem No campo CAMINHO: Maximum Length: 120 12 - Compile todo o form [Ctrl + Shift + K].

13 - Execute o forms [Ctrl + R] e se divirta.

Viso inicial do programa ao ser executado.

Viso do programa com a imagem encontrada.

Viso do programa com a imagem no encontrada.

Validando diversos campos no Oracle Forms 6i Existem alguns Forms que pelo seu tempo de vida e diversas correes e implementaes de novas regras de negcio fazem com que um nico Forms contenha as funes e complexidades de um sistema completo (j operei com um Forms que o arquivo fonte .FMB tinha 10 Mb). Um Forms desse tipo com certeza ter diversos campos, e estes campos por sua vez devero conter validaes e consistncias com o intuito de manter e assegurar que os dados inseridos pelos usurios so os corretos ou na pior das situaes o menos errado possvel. E deixar o cdigo-fonte do seu PL/SQL embutido no Forms completamente abarrotado de IFs para realizar essas consistncias, realmente no o melhor caminho, pois torna a manuteno maante e lenta, alm de deixar o seu cdigo feio. Veja um exemplo, de como consistir campos de forma inteligente e elegante, dando simplicidade e agilidade tanto no desenvolvimento quanto na manuteno do cdigo-fonte PL/SQL:
/* ************************************************************************************************** * Autor: Petter Rafael * Empresa: Viamais Web Intelligence * Desde: Dezembro/2010 * Verso: 1.0.1 Oracle Forms 6i / Oracle PL/SQL 8 * * Objetivo: Consistir blocos de dados no Forms de forma automtica e funcional, eliminando a * necessidade de construo de procedures e outros artefatos para consistir diversos * campos. Ideal para blocos de dados com grande quantidade de campos. * * Variveis: p_nome_bloco = Nome do bloco que ser consistido. * p_tipo_valida = Tipo de consistncia que ser realizada. * 1 - para consistncia de campos nulos. * 2 - para consistncia de campos negativos. * p_campo_tipo = Tipo do campo que ser consistido. Obs.: precisar ser idntico nomenclatura do Forms (consulte F1 para ajuda). * p_mens_err_pro = Identifica se q mensagem de erro padro ser substituda por uma mensagem de erro definida pelo desenvolvedor. * p_mensagem_erro = Texto da mensagem de erro prpria. Somente ser preenchido caso a mensagem de erro personalizada esteja ativa. * p_cor_erro = Cor que o fundo do campo deve assumir caso sinalize inconsistncia. Caso esteja nulo uma cor padro assumida. Padro de cores Forms (consulte F1 para ajuda). * * Retorno: Retorna mensagem de erro caso os critrios indiquem inconsistncia informando o * HINT do campo para sinalizar para o usurio qual campo precisa ser corrigido. * Alterar a cor de fundo (background) do campo caso possvel. ************************************************************************************************* */ PROCEDURE C_CONSIS_GERAL(p_nome_bloco IN varchar2 ,p_tipo_valida IN NUMBER ,p_campo_tipo IN varchar2 ,p_mens_err_pro IN BOOLEAN ,p_mensagem_erro IN varchar2 ,p_cor_erro IN varchar2) IS w_campo_fim varchar2(400); w_campo_ini varchar2(400); w_erro varchar2(4000); w_cor_back varchar2(15) := 'r350g0b0'; BEGIN -- Controle da mensagem de erro. IF p_mens_err_pro = TRUE THEN w_erro := p_mensagem_erro; ELSE w_erro := 'Os seguintes campos esto com erros: '; END IF; -- Controle para cor de background de campos consistidos IF p_cor_erro IS NOT NULL THEN w_cor_back := p_cor_erro; END IF; -- Resgatando dados para incio da consistncia. w_campo_ini := get_block_property(p_nome_bloco, first_item); w_campo_fim := get_block_property(p_nome_bloco, last_item); go_item(p_nome_bloco || '.' || w_campo_ini); loop -- Somente atua sobre campos de tipo especfico IF get_item_property(:system.cursor_item, item_type) = p_campo_tipo THEN IF p_tipo_valida = 1 THEN

IF :system.current_value IS NULL THEN message(w_erro || get_item_property(:system.cursor_item, set_item_property(:system.cursor_item, background_color, END IF; elsif p_tipo_valida = 2 THEN IF :system.current_value < 0 THEN message(w_erro || get_item_property(:system.cursor_item, set_item_property(:system.cursor_item, background_color, END IF; END IF; END IF; -- Sada caso alcance o ltimo campo do bloco IF w_campo_fim = :system.current_item THEN exit; END IF; next_item; END loop; END;

hint_text)); w_cor_back);

hint_text)); w_cor_back);

Como utilizar? muito simples, no Forms crie uma procedure (Program units) e cole o cdigo PL/SQL que listei acima. Pronto, agora s chamar a procedure, passando os parmetros de acordo com a sua necessidade. Pode ser utilizada a partir de qualquer triggers do Forms ou ainda embutida em outra procedure ou function. As principais vantagens so: Cdigo PL/SQL embutido no Forms, mais coeso, simples de ser mantido e/ou alterado; Maior eficincia, pois trata a consistncia orientada por tipo do campo e validao e no caso a caso como normalmente vemos; Maior agilidade no desenvolvimento mais verstil; Permite customizar a mensagem de erro por campo, de forma transparente para o desenvolvedor, sem a necessidade de alterar cdigo-fonte PL/SQL; Testada no Oracle Forms 6i, porm no existem restries para verses posteriores do Forms.

mar/11

24
Falha de segurana no PL/SQL Developer afeta OracleTodo bom DBA, AD ou mesmo qualquer analista de sistemas e/ou programador sabe que a senha dos usurios com privilgios mster de um determinado banco de dados deve ser muito bem guardada. Porm notei um comportamento muito estranho no PL/SQL Developer, uma das ferramentas mais utilizadas para quem trabalha com Oracle. Supondo que o DBA utilize o PL/SQL Developer para seus trabalhos, como logicamente ou ele ter a senha do SYSDBA ou pelo menos um usurio com mais privilgios ele ir utilizar este usurio no PL/SQL Developer, feito isso, dentro da pasta Preferences ir ser armazena seu perfil de uso, em um arquivo criptografado. Os arquivos de devem ser copiados so: default.ini e user.prefs. Qual o problema? Se o arquivo criptografado quem tentar abri-lo no vai conseguir decifrar a senha. Porm, eu posso copiar o perfil de uso utilizado pelo DBA e simplesmente copia-lo para dentro da pasta Preferences do meu PL/SQL Developer, assim eu poderei utilizar a senha do usurio do DBA e terei os mesmos privilgios. Simples assim. Creio eu que o pessoal que desenvolve o PL/SQL Developer poderia pelo menos colocar uma validao para ver se o usurio da pasta Preferences o mesmo do usurio informado dentro do arquivo. Embora a senha de alto privilgio continue indecifrvel um usurio mal intencionado poder conseguir acesso privilegiado ao banco de dados Oracle, efetuar o que ele quiser e a culpa ainda ficar com a pessoa que utiliza o usurio roubado.

Descobrindo a semana com PL/SQL


Talvez voc ainda no tenha precisado ou talvez nem saiba, mas em todo calendrio temos uma informao que no muito utilizado no cenrio brasileiro, o nmero da semana. Comeando obviamente a contar da primeira semana do ano, esse nmero pode auxiliar bastante se a preciso de clculo de data do seu no pode ser diria ou mensal e sim semanal (j trabalhei em diversos sistemas de agenciamento de fretes que utilizam a semana para montagem de cargas, pois em termos de transporte a preciso diria demasia e a preciso mensal obsoleta demais). Em PL/SQL, realizar esse procedimento muito simples, veja o exemplo abaixo:
SELECT to_char(to_date('02-feb-2011'), 'WW') FROM dual

E como retorno eu obtive o nmero 05, que significa que a data informada da quinta semana do ano de 2011. claro que a formatao da instalao do seu banco de dados Oracle pode influenciar um pouco no PL/SQL que passei, por exemplo, o formato de data 02-feb-2011 o formato norte-americano, mas poderia ser tambm o mais usual no Brasil que 02/02/2011.

Goto no PL/SQL
Noto que alguns programadores/desenvolvedores tem certa repulsa pelo comando GOTO (v para, em traduo livre) seja de qual for linguagem, talvez esse sentimento seja antigo, pois algumas linguagens de outros tempos permitiam uma verdadeira salada com o comando GOTO o que tornava a manuteno do cdigo ou alguma melhoria um verdadeiro trabalho Herculano. Porm se o cdigo-fonte for bem estruturado, totalmente passvel e de bom tom utilizar o comando GOTO quando a linguagem o possuir (obviamente). No sei se endmico da regio em que trabalho, mas o pessoal do PL/SQL daqui no utiliza muito o GOTO em seus softwares, quando preciso fazer algum jump para outra parte do cdigo-fonte ou tudo separado em diversas procedures dentro de um mesmo body (package) o que pode gerar uma confuso maior do que com o uso do GOTO, ou o que pior, fica uma parte do cdigo-fonte dentro de um if e a outra parte dentro do else, nem preciso comentar muito, veja o resultado por voc mesmo:
IF varTeste = TRUE THEN -- Todo o seu cdigo que ser executado caso a condio seja verdadeira ELSE -- Todo o seu cdigo que ser executado caso a condio no seja verdadeira END IF;

Em pequenos fragmentos de cdigo-fonte isso no trs problemas, mas experimente dividir o seu cdigo em duas partes, cada uma com mais de 2.000 linhas e veja que isso fica muito boal. Agora veja a diferena com o uso do GOTO:
IF varTeste != TRUE THEN GOTO EXEC END IF; -- Todo o seu cdigo que ser executado caso a condio seja verdadeira <<exec>> -- Todo o seu cdigo que ser executado caso a condio no seja verdadeira

Fica muito mais fcil de manter e mais performtico tambm. Realmente no sei para que no utilizar. Ainda duvida da aplicao do GOTO no PL/SQL, veja um exemplo mais conciso:
DECLARE w_teste varchar2(1000); w_laco varchar2(10); cursor u_teste IS SELECT cod_venda FROM vendas WHERE ; BEGIN OPEN u_teste; loop fetch u_teste INTO w_laco;

exit WHEN u_teste%notfound; IF w_teste IS NULL THEN w_teste := w_laco; ELSE w_teste := w_teste || ', ' || w_laco; END IF; END loop; IF w_teste IS NULL THEN GOTO sem_erro; END IF; close u_teste; dbms_output.put_line('Sada de teste:'); dbms_output.put_line('Valor: ' || w_teste); <<sem_erro>> dbms_output.put_line('Fim de execuo!'); END;