89
16. Para o Processamento:
A função Atribuir Valor ao Componente define o valor do componente que será mascarado através da função Formatar Número. 17. Salve o fluxo chamando-o de Exercicios - Grade Total de Salários na camada servidor; 18. Inicie um novo fluxo;
89
90
Este fluxo insere uma nova linha na grade, depois obtém os dados dos componentes e manda para a grade e totaliza os salários. 19. Inicie criando os Parâmetros de Entrada (clique duplo no componente Início):
20. Para o processamento chamado Inserir Linha na Grade:
90
91 21. Para o processamento chamado Inserir Nome na Grade:
A função principal é Grade – Atribuir Valor. Inicia identificando a grade, em seguida a posição da linha inserida (já que o índice da grade inicia com valor 0 (zero), utilizou-se a função Grade – Obter Total de Linhas e executou uma Subtração por 1 (um)). Os parâmetros seguintes correspondem a identificação da coluna e a origem do valor para inseerção. 22. Para o processamento chamado Inserir Idade na Grade:
91
92 23. Para o processamento chamado Inserir Salário na Grade:
24. Para o processamento chamado Limpar componente Nome:
Após a inserção dos dados na grade, o conteúdo do componente será apagado. 25. Para o processamento chamado Limpar componente Idade:
92
93
26. Para o processamento chamado Limpar componente Salário:
27. Para o processamento chamado Focar componente Nome:
93
94 28. Para o Sub-Fluxo:
Localize o fluxo Exercicios – Grade Total de Salários. Este fluxo necessita de um parâmetro de entrada:
Observe que a função principal chama-se Grade Somatória de uma coluna que recebe os parâmetros: nome do formulário que contém a grade e o nome da coluna que será totalizada. 29. Salvar o fluxo com o nome Exercicios - Grade Inserir Valores na camada cliente; 30. Associe o fluxo ao evento Ao Clicar do botão Inserir:
94
95
31. Inicie um novo fluxo:
Este fluxo executará a exclusão da linha selecionada e recalcula o total de salários. 32. Inicie definindo os Parâmetros de Entrada. No caso, apenas aponte o Formulário de Trabalho:
95
96 33. Para o Processamento:
A função principal chama-se Grade Remover Linha que necessita de dois parâmetros: o nome da grade e a linha que será excluída. A posição da linha é definida através da função Grade – Obter Linha Selecionada. 34. Para o Sub-Fluxo:
Localize o fluxo Exercicios – Grade Total de Salários. Este fluxo necessita de um parâmetro de entrada:
96
97
Observe que a função principal chama-se Grade Somatória de uma coluna que recebe os parâmetros: nome do formulário que contém a grade e o nome da coluna que será totalizada. 35. Salve o fluxo chamando-o de Exercicios - Grade Remover Linha na camada cliente; 36. Associe o fluxo ao evento Ao Clicar do botão Excluir Linha; 37. Inicie um novo fluxo:
Este fluxo removerá as linhas em um intervalo definido pelo usuário. 38. Inicie pelos Parâmetros de Entrada (clique duplo no componente Início):
97
98
39. Para a Decisão:
Enquanto o valor inicial for menor ou igual ao valor final do intervalo, o fluxo excluirá a linha. 40. Para o processamento Remove Fim:
98
99 A função principal é Grade – Remover Linha que recebe o nome da grade e a posição da linha. 41. Para o processamento Decrementa Fim:
Aqui redefine a posição da linha final do intervalo. 42. Para o Sub-Fluxo:
Localize o fluxo Exercicios – Grade Total de Salários. Este fluxo necessita de um parâmetro de entrada:
99
100
Observe que a função principal chama-se Grade Somatória de uma coluna que recebe os parâmetros: nome do formulário que contém a grade e o nome da coluna que será totalizada. 43. Salve o fluxo chamando-o de Exercicios - Grade Remover Intevalo na camada cliente; 44. Associe o fluxo ao evento Ao Clicar do botão Excluir Intervalo; 45. Salve o formulário e execute no Webrun. Obs.: Os formulários e fluxos envolvidos neste exemplo podem ser importados para o projeto através dos arquivos Grade.FRZ, Trabalhando com Grade.FRZ (os formulários), Exercicios – Focar Componente.FRZ, Exercicios – Inserir Valores.FRZ, Exercicios – Grade Remover Intervalo.FRZ, Exercicios – Remover Linha.FRZ, Exercicios – Total de Salários.FRZ os fluxos e STD_GRADE.FRZ (estrutura de dados).
Exercícios com Fluxos Exercício 7 •
Criar um formulário desvinculado do banco de dados, chamado Gerar Arquivo. Esse formulário deve conter um componente Caixa de Texto com o nome Caminho do Arquivo, um componente Texto Longo com o nome Conteúdo do arquivo e um botão chamado Gerar Arquivo. O botão deve executar um fluxo que gere o arquivo com o conteúdo descrito em Conteúdo do arquivo e com o caminho descrito em Caminho do Arquivo:
100
101 Passo a passo: 1. Crie um formulário contendo três componentes: duas caixas de texto chamadas Caminho e Conteúdo e um botão chamado Gerar Arquivo; 2. Abra o editor de fluxos e desenvolva a seguinte estrutura:
3. Defina os Parâmetros de Entrada:
4. Defina as variáveis:
5. Para o Primeiro Processamento é utilizada a função Abrir arquivo para escrita, passando como primeiro parâmetro o Caminho e segundo parâmetro como False, retornando a referência para a variável Arquivo como mostra a imagem abaixo:
101
102
6. Para o Segundo Processamento é utilizada a função Adicionar a arquivo, passando como primeiro parâmetro a referência do arquivo que é a variável Arquivo e o conteúdo do arquivo passado no inicio como Conteúdo, abaixo imagem deste processamento:
7. Para o Terceiro Processamento é utilizada a função Fechar arquivo, passando como primeiro parâmetro a referência do arquivo que é a variável Arquivo, abaixo imagem deste processamento:
8. Para a Mensagem de alerta definida uma mensagem para exibir ao termino da geração do arquivo como indicado abaixo (Arquivo gerado com sucesso):
102
103
9. Ao vincular no evento do clique do botão devem ser indicados os Parâmetros de Entrada do fluxo sendo eles os componentes do formulário como mostra imagem abaixo:
Obs.: O formulário e o fluxo deste exercício podem ser importados para o projeto através dos arquivos Exercício7.FRZ e FLUXO Exercício7.FRZ.
Exercício 8 •
Crie um formulário sem vínculo ao banco de dados, chamado Exportar Funcionários. Crie um fluxo para gerar um arquivo de exportação cuja extensão é .TXT e o nome do arquivo depende do departamento selecionado. O arquivo deve conter o Nome do funcionário, o nome do Gerente, a Idade, o Bairro e a Cidade do funcionário. As informações dos funcionários devem aparecer separadas por ";" e na mudança de cada funcionário deve haver uma quebra de linha.
Observação: usar a função Faça com barra de progresso Layout do Arquivo:
103
104 Nome do Funcionário; Gerente; Idade; Bairro; Cidade. Ex.: Rafael Alves; Ricardo Gomes;23;Costa Azul;Salvador André Silva;Renato Amaral;26;Pituba;Salvador Alex Lima;Ângelo Barbosa;22;Brotas;Salvador ... Passo a passo:
1. Através da paleta Objetos clique na opção ; 2. Na tela Assistente de Criação de Novo Formulário defina o nome Exportar Funcionários e clique no botão OK; 3. Redimencione o formulário e defina algumas Propriedades: para as propriedades Navegação e Abas informe Não; 4. Localize o formulário Cadastro de Departamentos e arraste-o para o formulário em forma de Lista Dinâmica. Ative as Propriedades do componente e apague a referência contida em Campo; 5. Insira um componente Botão ao lado da lista de departamentos do formulário. Na Propriedade Descrição defina o texto Exportar; 6. Ative o Editor de Fluxos de Ações ; 7. Inicialmente monte a seguinte estrutura de fluxo:
Este fluxo irá consultar os dados solicitados dos funcionários, obterá o total de registros que retornam da consulta para criar a barra de progresso e no loop a inserção ocorrerá linha a linha. Ao final uma mensagem será exibida informando a conclusão da geração do arquivo. 8. Agora defina os Parâmetros de Entrada. Execute clique duplo no elemento Início:
104
105
9. Agora defina os Identificadores (variáveis):
10. Para o primeiro Processamento:
105
106 11. A função Abrir Consulta deverá ser configurado o parâmetro SQL Consulta da seguinte forma:
Select sig_funcionario.fun_nome, sig_funcionario.fun_idade, GERENTE.fun_nome As "GERENTE", ger_endereco.end_bairro, ger_cidade.cid_nome, sig_funcionario.dep_cod, sig_departamento.dep_nome From sig_funcionario Left Join sig_funcionario GERENTE On sig_funcionario.fun_cod_gerente = GERENTE.fun_cod Left Join ger_endereco On sig_funcionario.fun_cod = ger_endereco.fun_cod Left Join ger_cidade On ger_endereco.cid_cod = ger_cidade.cid_cod Inner Join sig_departamento On sig_funcionario.dep_cod = sig_departamento.dep_cod Where (sig_funcionario.dep_cod = :DEPARTAMENTO) Obs.: Para o parâmetro da consulta chamado DEPARTAMENTO, aponte para o Parâmetro de Entrada definido no início do passo a passo:
106
107
12. Para o segundo Processamento:
107
108
13. A função Abrir Consulta deverá ser configurado o parâmetro SQL Consulta da seguinte forma:
Select Count(sig_funcionario.fun_cod), sig_funcionario.dep_cod From sig_funcionario Group By sig_funcionario.dep_cod Having (sig_funcionario.dep_cod = :DEPARTAMENTO)
108
109
Obs.: Para o parâmetro da consulta chamado DEPARTAMENTO, aponte para o Parâmetro de Entrada definido no início do passo a passo:
14. Para o terceiro Processamento:
109
110
Este processamento define o arquivo que será criado. Sempre que houver a necessidade de escrever ou ler arquivos, deverá criar uma variável do tipo Variante para armazenar a referência. 15. Para a Decisão será utilizada a função Faça com Barra de Progresso e a função Existem Registros mantendo a barra até percorrer todos os registros resultantes da consulta:
16. Para o quarto Processamento:
110
111
Neste processamento ocorre a concatenação de todos os dados que irão compor a linha do arquivo juntamente com um comendo de quebra de linha no final. 17. Para o quinto Processamento:
Utilize a função Dormir para pausar a execução do fluxo, permitindo assim que a barra de progresso possa ser desenhada na tela. Este recurso não é usualmente aplicado. Aqui estamos forçando a exibição provocando um daley no loop . 18. Para o sexto Processamento:
111
112
Neste processamento estamos movendo o cursor para o próximo registro da consulta. 19. Para o sétimo Processamento:
20. Para a Interação:
112
113
Uma simples mensagem de alerta para o usuário. 21. Salve o fluxo chamando-o de EXPORTANDO FUNCIONÁRIOS, direcionando para a camada servidor; 22. Retornando para o formulário, associe ao evento Ao Clicar do botão passando como parâmetro o valor que o componente Lista Dinâmica retorna; 23. Salve o formulário e execute-o no Webrun. Obs.: O formulário e o fluxo deste exercício podem ser importados para o projeto através dos arquivos Exportar Funcionários.FRZ e Fluxo Exportar Funcionários.FRZ.
Exercício 9 •
Crie um formulário chamando-o de Exportar Todos os Funcionários e insira um botão para executar um fluxo gerando a seguinte listagem em arquivo: Código do Departamento;Nome do Departamento Código do Funcionário;Nome do Funcionário;Idade;Sexo Código do Funcionário;Nome do Funcionário;Idade;Sexo Código do Funcionário;Nome do Funcionário;Idade;Sexo Quantidade de Funcionários: Quantidade Ex.: 1;Comercial 1;Luiz Carlos 2;Rafael Alves 3;Alex Lima Quantidade de Funcionário: 3 2;Desenvolvimento 4;Danilo Dantas 5;Rogério Correia Quantidade de Funcionários: 2
Passo a passo:
113
114 1. Crie um formulário sem vínculo ao banco contendo um componente botão chamado Exportar todos os Funcionários:
2. Crie um fluxo com a seguinte estrutura:
3. Defina uma variável chamada Tabela Dados do tipo Tabela que vai conter a consulta de departamentos e funcionários, Defina Cod Departamento do tipo Inteiro que vai receber o código do departamento atual, defina Lista Dados que vai armazenar temporariamente os registros e defina também uma variável chamada Count do tipo Inteiro iniciada como 0 (zero) que vai contar a quantidade de funcionários em um determinado departamento:
114
115 4. Para o Primeiro processamento - efetue uma consulta utilizando a função Abrir consulta e retorne o valor da consulta para uma variável do tipo tabela:
A consulta será estruturada da seguinte forma:
Select sig_departamento.dep_cod, sig_departamento.dep_nome, sig_funcionario.fun_cod, sig_funcionario.fun_nome, sig_funcionario.fun_idade, Case When sig_funcionario.fun_sexo = 'M' Then 'Masculino' Else 'Feminino' End As "Sexo" From sig_departamento Inner Join sig_funcionario On sig_departamento.dep_cod = sig_funcionario.dep_cod Order By
115
116 sig_departamento.dep_nome, sig_funcionario.fun_nome 5. Para a Decisão utilize a função Existem registro passando a tabela obtida pelo primeiro processamento:
6. Para o Processamento Condição “SIM” utilize a função Campo passando no primeiro parâmetro a tabela e segundo parâmetro o código do departamento, retornando para a variável Cod Departamento como indica imagem abaixo:
7. Para o Processamento Armazena departamento concatene a variável criada Lista Dados, Cod Departamento, com um ; (ponto e vírgula), com o campo da Tabela dados que contém o nome do departamento e por fim concatena com uma quebra de linha, sendo esta utilizada como Concatenação de dois parâmetros, sendo os dois convertidos utilizando a função Letra, passando como 13 no primeiro parâmetro e 10 no segundo parâmetro.
116
117
8. Para a Segunda Decisão, utiliza a função Igual, passando no primeiro parâmetro o código do departamento Cod Departamento e no segundo parâmetro a função Campo definindo no primeiro parâmetro Tabela Dados e no segundo parâmetro DEP_COD como mostra a imagem abaixo:
9. Para o Processamento Armazena Funcionários crie uma concatenação com os campos solicitados dos funcionários, definindo a função Concatenação, no primeiro parâmetro Lista dados, no segundo parâmetro utilizando a função Letra passando 9, e obtendo da Tabela dados os campos do funcionário utilizando a função Campo passando a tabela como primeiro parâmetro e escolhendo o campo para ser utilizado, por fim colocar Concatenação de dois parâmetros, sendo os dois convertidos utilizando a função Letra, passando como 13 no primeiro parâmetro e 10 no segundo parâmetro para adicionar uma quebra de linha que pode ser lida nos editores de textos:
117
118
10. Para o Processamento Próximo registro da tabela, utiliza a função Tabela – Próximo registro para passar o registro da tabela, ou seja é definido em seu parâmetro a Tabela Dados.
11. Para o Processamento Incrementa contador, utilizar a função Soma passando à variável Count e no segundo parâmetro o número 1, sendo retornado ao próprio Count, tendo a quantidade de funcionários, como mostra a imagem abaixo:
12. Para o Processamento Armazena Quantidade de Funcionários, utilizar a função Concatenação passando como parâmetros: a variável Lista Dados mais um texto escrito Quantidade de Funcionários:, mais a variável Count que agora contem a
118
119 quantidade de vezes passada no laço de repetição ou seja a quantidade de funcionários, depois é adicionado duas Concatenações adicionando duas quebras de linha como mostra imagem abaixo:
13. Para o Processamento Zerar contador atribua a variável Count o valor 0 para zerar esta e na próxima vez caso entre novamente no laço possa contar corretamente a quantidade de funcionário:
14. Para o Sub-Fluxo chamando o Exercicio 7, em Caminho que é esperado você deve passar C:\TodosFuncionarios.txt e em Conteudo deve ser passado a Lista Dados que está preenchida com toda a consulta e armazenada estruturalmente de forma como foi solicitado:
119
120
15. Salve o fluxo e atribua ao evento Ao Clicar do componente botão; 16. Insira o formulário ao menu e execute no Webrun. Obs.: O formulário e os fluxos deste exercício, podem ser importados a partir dos arquivos FORMULÁRIO EXPORTAR TODOS OS FUNCIONÁRIOS.FRZ e FLUXO EXPORTAR TODOS OS FUNCIONÁRIOS.FRZ (este arquivo inclui o fluxo do Exercício 7).
Obtendo dados de arquivo para tabela •
A partir do arquivo gerado no Exercício 8, importe os dados para o seguinte formulário:
O recurso de importação permitirá que o usuário selecione um arquivo da máquina local:
120
121
Passo a passo; 1. Inicialmente desenvolva o formulário acima ilustrado, contendo campos de texto e um botão que irá disparar o fluxo de importação; 2. Salve o formulário chamando-o de IMPORTAR DADOS e permita que o assistente crie a fonte de dados; 3. Agora abra o editor de fluxos e desenvolva a seguinte estrutura:
121
122 4. Agora defina os Parâmetros de Entrada:
Obs.: Será utilizado um parâmetro passando o nome do arquivo porquê será criado um fluxo chamador que passará a identificação do arquivo. 5. Agora defina os Identificadores (variáveis):
6. Para o primeiro Processamento:
122
123
Este processamento identifica o arquivo (nome e local); 7. Para a Decisão:
Observe que esta função mantém o loop enquanto existirem dados no arquivo. 8. Para o segundo Processamento:
123
124
A função Ler linha do arquivo retorna o conteúdo da linha e este retorno está sendo atribuído a uma variável do tipo Letras. 9. Para o terceiro Processamento:
Após obter o conteúdo da linha do arquivo no passo 8, deve-se obter o valor destinado para cada campo. A utilização da função Quebrar Texto cria uma lista de objetos e cada um possui uma posição definida e iniciando por 1. A lista é atribuída a uma variável do tipo Variante. 10. Para o quarto Processamento:
124
125
Este processamento responsabiliza-se em inserir os dados na tabela do formulário, através da função Executar Atualização. Clicando no parâmetro SQL Atualização, escolha a opção Inserção:
Após clicar no botão WIZARD a tela Construtor SQL:Inserção é exibida e deve-se configurar:
125
126
Selecionando campo a campo, utilize a função Obter objeto da lista para obter de cada posição o valor correspondente ao campo. 11. Após definir o valor de cada campo, clique no botão OK para sair da tela Construtor SQL e outro OK para sair da tela do Montador de Expressões; 12. Para o quinto Processamento:
13. Para o sexto Processamento:
126
127
A função de atualização de formulário é utilizado para mostrar os registros importados. 14. Para o sétimo Processamento:
Este comando é utilizado para remover o arquivo. Esta função será utilizada pois na rotina a seguir, o arquivo será enviado para o servidor e após a importação dos dados, o arquivo é excluído. 15. Salve o fluxo com o nome IMPORTAR DADOS; 16. Pelo menu Arquivo clique em Novo; 17. Crie a seguinte estrutura:
127
128
18. Para o componente Decisão:
A função Interação de Confirmação retorna um valor lógico. Esta função apresentará uma tela aguardando que o usuário clique no botão OK ou CANCELAR:
19. Para o componente Processamento:
128
129
A função Upload permitirá a interação do usuário na seleção do arquivo contendo os dados:
20. Salve o fluxo chamando-o de CONFIRMA IMPORTAR DADOS; 21. Feche o editor de fluxos e retorne para o formulário IMPORTAR DADOS; 22. Atribua ao evento Ao Clicar do botão o fluxo CONFIRMA IMPORTAR DADOS:
129
130
23. Salve o formulário e execute-o no Webrun. Obs.: O formulário, fluxo e o arquivo de texto utilizados neste exercício podem ser importados para o projeto através dos arquivos Formulário Importar Dados.FRZ e os fluxos IMPORTAR DADOS.FRZ e CONFIRMA IMPORTAR DADOS o arquivo de texto pode ser copiado para a unidade C: da sua máquina.
Lendo dados de um conteúdo XML •
Esse exemplo permite obter os filhos da raiz de um conteúdo XML. O conteúdo XML está em uma string passada como parâmetro na função Abrir XML, porém poderia ser obtido também de um arquivo.XML utilizando a função Abrir XML de um arquivo. Seguindo, utilize a função Obter raiz, no caso do exemplo será a tag
. Logo após é feito um laço com todos os filhos obtidos da função Filhos de um elemento XML. Nesta função se desejar obter um filho específico, deve-se passar o nome do mesmo no 2º parâmetro, caso não passe, a função retornará todos os filhos. A partir de então é utilizado um laço para exibir o valor de cada filho. Conteudo do XML:
Oi Jefferson Lembre-se Testando... Passo a passo: 1. Criar um formulário com um Botão que irá disparar o fluxo:
130
131
2. Através das Propriedades do formulário, desabilite Navegação, Abas e salve o formulário chamando-o de Exemplo XML; 3. Abra o Editor de Fluxos de Ação e crie a seguinte estrutura:
4. Crie os Identificadores (variáveis) (caso a janela não esteja presente, pressione F11):
131
132 5. Para o processamento Obtem XML;
É utilizada a função Abrir XML passando como parâmetro o conteúdo XML e o retorno desta função será atribuído a variável XML. 6. Para o processamento Obtem Raiz;
É utilizada a função Obter Raiz passando como parâmetro a variável XML, e o retorno desta função será atribuído a variável Raiz XML. 7. Para o processamento Obtem Filhos da Raiz;
132
133
É utilizada a função Filhos de Elemento XML passando como primeiro parâmetro a variável Raiz XML, o retorno desta função será atribuído a variável Filhos XML. 8. Para o processamento Obtem Total de Filhos;
É utilizada a função Tamanho da Lista passando como parâmetro a variável Filhos XML, o retorno desta função será atribuído a variável Total de Filhos. 9. Para a Decisão;
133
134
É utilizada a função Menor ou igual passando como primeiro parâmetro a variável Contador e no segundo parâmetro a variável Tamanho da Lista, e o retorno desta função será atribuído a variável Total de Filhos. 10. Para o processamento Obtem Filho do XML:
É utilizada a função Obter Objeto da Lista passando como primeiro parâmetro a variável Filhos XML e no segundo a variável Contador, o retorno desta função será atribuído a variável Filho. 11. Para o processamento Obtem Valor do Filho e Armazana em Valores:
134
135
É utilizada a função Concatenação passando como primeiro parâmetro a variável Valores, no segundo a variável Obter Valor de um elemento XML passando como parâmetro a variável Filho, e no terceiro parâmetro a função Quebra de Linha, o retorno desta função será atribuído a variável Valores. 12. Para o processamento Incrementa Contador:
13. Para o processamento Exibe Valores:
135
136
É utilizada a função Alerta Aguardando Ok passando como parâmetro a variável Valores. 14. Salve o fluxo na camada servidor, chamando-o de Fluxo Exemplo XML; 15. Atribua o fluxo ao evento Ao Clicar do botão do formulário. Obs.: O formulário e fluxo deste exemplo podem ser importados para o projeto através dos arquivos Exemplo XML.FRZ e Fluxo Exemplo XML.FRZ.
Trabalhando com MD5 •
Desenvolver uma tela de solicitação de nome de usuário e senha onde o usuário com o perfil de administrador editará. Aplicar aos eventos Antes de Alterar e Antes de Inserir. Este caso é muito freqüente em terminais de caixas quando o usuário não possui permissão de edição de partes do sistema. Para este exemplo utilize o formulário Cadastro de Funcionários para requisitar tela login e senha do usuário administrador quando o campo Salário for editado.
Passo a passo: 1. O formulário Cadastro de Funcionários será implementa com uma imagem que servirá de botão chamados da tela de login e senha. Para a implementação, inclua uma imagem na galeria do projeto. Acesse a galeria de imagens do Maker e adicione a seguinte imagem localizada no contexto do Webrun C:\Arquivos de programas\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun\Resource\add_system.gif ou C:\Program Files (x86)\Softwell Solutions\Maker 2.6\Webrun 2\tomcat\webapps\webrun\Resource\ add_system.gif (para Win 64):
136
137
2. Insira um componente Imagem no formulário Cadastro de funcionários apontando para a imagem recém inserida na Galeria de Imagens. O formulário deverá ficar da seguinte forma:
3. Salve o formulário; 4. Devem ser criados dois grupos através do menu Projeto – Controle de Acesso – Grupos:
137
138
5. Abra o projeto no Webrun; 6. Ative o para dar as permissões necessárias no componente Salário do formulário Cadastro de Funcionários; 7. Com o modo gerente ativado, clique no formulário Cadastro de funcionários será exibido a tela abaixo:
8. Clique no ícone para abrir o formulário; 9. Clique no componente Salário e na permissão Apenas Leitura deixe marcado o grupo Usuários e desmarcado o grupo Administradores; 10. Realize o mesmo procedimento para o componente imagem e na permissão Visível deixe marcado o grupo Usuários e desmarcado o grupo Administradores; 11. Retorne ao
; 138
139 12. Retorne ao Maker; 13. Criar um formulário com o nome Autorizar atualização sem vínculo com banco de dados, que deverá ficar como a estrutura abaixo:
O formulário além de não possuir origem de dados, defina Sim na Propriedade Modal. 14. Criar um fluxo chamado Coloca salário em apenas leitura e associar ao evento Ao Navegar do formulário Cadastro de funcionários. O fluxo deverá ficar com a seguinte estrutura:
15. Inicie declarando um Parâmetro de Entrada para receber o código do grupo passado como constante e defina o formulário Cadastro de funcionários como Formulário de Trabalho:
139
140
16. Para a Decisão,deve verificar se o usuário logado está no grupo Administradores:
A consulta deverá ser estruturada como mostra imagem abaixo:
140
141
Select fr_usuario_grupo.grp_codigo From fr_usuario_grupo Where (fr_usuario_grupo.usr_codigo = :usuario) No parâmetro usuario o deve ser utilizada a função Id do usuário para obter o usuário logado no momento.
141
142
17. Clique no OK do Montador de Expressões; Expressões; 18. Clique em Salvar na tela Propriedades; Propriedades; 19. Clique OK na tela Decisão; Decisão; 20. Para o Processamento, Processamento, define o campo Salário como apenas leitura utilizando a função Campo Apenas Leitura: Leitura:
21. Salve o fluxo; 22. Agora, criar um fluxo que será associado ao evento Ao Clicar da imagem que estará ao lado do campo Salário. Salário. Este fluxo abrirá o formulário que Autoriza atualização. atualização. Retornando ao editor de fluxos, desenvolva a seguinte estrutura:
142
143
23. Salve o fluxo chamando-o de Autorizar atualização, atualização, associe ao evento Ao Clicar da imagem que estará ao lado do campo Salário; Salário; 24. Retornando ao editor de fluxos, crie um fluxo chamando-o de Confirma autorização na camada servidor e associar ao subfluxo que se encontra no fluxo Autorização. Autorização. O fluxo deverá ficar da seguinte maneira:
25. Inicialmente defina os Parâmetros de Entrada: Entrada:
26. Defina os Identificadores (variáveis): (variáveis):
143
144
27. Para o primeiro Processamento (Obtém criptografia da senha) verifique que a criptografia da senha do usuário em Maker é realizada da seguinte maneira: é obtido o MD5 da concatenação do código do usuário (campo USR_CODIGO da tabela FR_USUARIO) com a senha informada:
Deve ser realizada um consulta para obter o código do usuário passando o login informado no formulário Autorizar atualização. atualização. A consulta deverá ficar da seguinte maneira:
144
145
Select fr_usuario.usr_login, fr_usuario.usr_codigo From fr_usuario Where (fr_usuario.usr_login = :usuario) 28. Para o Segundo Processamento (Consulta senha) deve-se criar uma consulta que retorne o registro que possua a senha e o código do grupo Administradores. Administradores. A consulta deverá ficar:
145
146 Select fr_usuario.usr_codigo From fr_usuario Inner Join fr_usuario_grupo On fr_usuario_grupo.usr_codigo = fr_usuario.usr_codigo Where (fr_usuario.usr_senha = :senha) And (fr_usuario_grupo.grp_codigo = 2) 29. Para a Decisão (Existem registro), deve-se verificar se existe registro no retorno da consulta anterior.
30. Caso exista registro, o fluxo retorna o inteiro 1, caso contrário retorna o inteiro 0. Então foram inseridos dois componentes Fim: para a terminação Sim:
31. E para a terminação Não definiu:
146
147
32. Salve o fluxo na camada servidor chamando-o de Confirma autorização; 33. Ainda no editor de fluxos, clique em Novo; 34. Criar um fluxo chamado Autorização na camada cliente e associar ao evento Ao clicar do botão Autorizar do formulário Autorizar atualização. O fluxo deverá ficar com a seguinte estrutura:
35. Inicialmente defina o Parâmetro de Entrada:
147
148
36. Defina os Identificadores (variáveis):
37. Para o SubFluxo, aponte para o fluxo Confirma Autorização passando dois parâmetros (usuário e senha) e retornando um inteiro que informa se o usuário existe e tem permissão para alterar o salário:
148
149
38. Para a Decisão, verificar se o retorno do Subfluxo é igual a 1:
39. Caso a decisão seja Sim o processamento Habilita componente salário deve utilizar a função Executar fluxo no formulário para remover a propriedade apenas leitura do componente Salário no formulário Cadastro de funcionários. No primeiro parâmetro da função são utilizadas as funções Obter formulário chamador e Obter formulário atual. Caso o retorno seja Não deve ser exibida a mensagem: Credenciais inválidas ou usuário não tem permissão para esta operação!.
149
150
40. No segundo parâmetro é passado o fluxo que será executado. No nosso caso é o fluxo HabilitaSalario, que remove a propriedade apenas leitura do campo salário.
41. No segundo Processamento (Fechar formulário) utilizar a função Fechar formulário:
150
151 42. No terceiro Processamento (Alerta!) utilizar a função Alertar Aguardando OK:
43. Salvar o fluxo chamando-o de Autorização na camada cliente e associar ao evento Ao clicar do botão Autorizar do formulário Autorizar atualização. Obs.: Os formulários e fluxos deste exercício podem ser importados para o projeto através dos arquivos CADASTRO DE FUNCIONÁRIOS COM EXEMPLO MD5.FRZ, Autorizar atualização.FRZ, Coloca salário em apenas leitura.FRZ, Autorização.FRZ, FLUXO Autorizar atualização.FRZ, FLUXO Coloca salário em apenas leitura.FRZ, Confirma autorização.FRZ e HabilitaSalario.FRZ.
Trabalhando com fluxos genéricos(Exemplo 1) •
Altere o formulário Estados, incluindo um componente Caixa de Texto que receberá a identificação do usuário logado, obtido através de um fluxo. Deve associar o fluxo aos eventos Antes de Alterar e Antes de Inserir do formulário:
Passo a passo:
151
152
1. Modifique o formulário incluindo um componente Caixa de Texto e defina algumas Propriedades: para a propriedade Descrição defina Usuário Logado e para a propriedade Apenas Leitura defina Não; 2. Salve o formulário e permita a criação do campo na tabela; 3. Abra o editor de fluxos e crie a seguinte estrutura:
Este fluxo cria uma variável de sessão contendo o nome do login do usuário. Este fluxo será atribuído ao evento Ao Entrar do sistema. A variável chama-se USUARIO e para cada usuário será gerada u 4. Salve o fluxo na camada servidor, chamando-o de CRIANDO VARIÁVEL DE SESSÃO; 5. Feche o editor de fluxo e ative os eventos da área de trabalho do Maker; 6. Para o evento Ao Entrar, atribua o fluxo criado; 7. Ative o menu Projeto do Maker e clique em Salvar. Caso esteja com o Webrun aberto, Recarregue o Sistema; 8. Abra do Editor de Fluxos de Ações e monte a seguinte estrutura
152
153
9. Para a Decisão:
Esta condição executará a atribuição ao componente caso o formulário esteja em Modo de Inclusão ou caso esteja em Modo de Ateração. 10. Para o Processamento:
153
154
Observe que a função Alterar Valor do Componente permitirá a atribuição do valor armazenado na variável de sessão ao componente do formulário através da função Obter variável da sessão. 11. Salve o fluxo chamando-o de ATRIBUINDO VALOR DA VARIÁVEL DE SESSÃO AO COMPONENTE; 12. Feche o editor de fluxos; 13. Abra o formulário ESTADOS e ative o evento Ao Navegar e associe o fluxo ATRIBUINDO VALOR DA VARIÁVEL DE SESSÃO AO COMPONENTE; 14. Salve o formulário e execute no Webrun. Obs. O formulário e os fluxos deste exercício podem ser importados para o projeto através dos arquivos Formulário ESTADOS.FRZ, ATRIBUINDO VALOR DA VARIÁVEL DE SESSÃO AO COMPONENTE.FRZ e CRIANDO VARIÁVEL DE SESSÃO.FRZ.
Trabalhando com fluxos genéricos (Exemplo 2) •
Exemplificar a utilização de fluxos de modo genérico.
Passo a passo: 1. Crie um formulário sem vínculo a banco de dados conforme estrutura abaixo:
154
155 2. Salve com o nome Exibe-Oculta Componentes; 3. Abra do editor de fluxo e crie um fluxo associado ao evento Ao modificar do componente Opções. Este fluxo receberá como parâmetros de entrada a lista de componentes que se deseja Exibir/Ocultar e o valor do componente Opções”; 4. Observe a estrutura do fluxo:
5. Observe os Parâmetros de Entrada:
6. Crie os Identificadores (variáveis):
155
156 O fluxo que Exibe/Oculta componentes de um formulário deve possuir os parâmetros de entrada: Componentes (Variante) e Exibir Componente? (Lógico). 7. Para o primeiro Processamento (Obtém lista de componentes) Converte os componentes em uma lista de objetos.
8. Para a Decisão, verificar se o tamanho da lista é maior ou igual a variável contador:
9. Para o segundo Processamento (Exibe/Oculta componente), utilize a função Mostrar componente obtendo o componente passado no primeiro parâmetro através da função Obter objeto da lista e definindo se o componente será exibido ou ocultado através da variável passada no segundo parâmetro:
156
157
10. Para o terceiro Processamento (Incrementa contador), incrementar a variável contador:
11. Salve o fluxo com o nome Exibe-Oculta Componentes; 12. Ative os eventos do componente Opções e para a opção Ao Modificar defina:
157
158
13. Salve o formulário e execute no Webrun. Obs.; O formulário e o fluxo usados neste exemplo podem ser importados para este projeto através dos arquivos FORMULÁRIO Exibe-Oculta Componentes.FRZ e FORMULÁRIO Exibe-Oculta Componentes.FRZ e FLUXO Exibe-Oculta Componentes.FRZ.
Utilizando Fluxo Web Service •
Desenvolva um fluxo que possa ser utilizado como web service e associe ao evento Ao Clicar do botão contido no formulário. Deve-se passar o código da cidade (tabela GER_CIDADE campo CID_COD) e retornar o estado (tabela GER_ESTADO, campo EST_NOME), que será atribuído ao componente do formulário.
Passo a passo: 1. Inicie criando o formulário acima apresentado. Este formulário não possuirá vínculos com fonte de dados. A Lista Dinâmica representa a relação de cidades, um botão para disparar o fluxo com a descrição OBTER ESTADO e por fim, uma Caixa de Texto com a Descrição e Apenas Leitura; 2. Salve o formulário chamando-o Consumindo fluxo web service; 3. Abra o Editor de Fluxo de Ações e monte a seguinte estrutura:
158
159
4. Inicie criando Parâmetro de Entrada:
5. Defina os Identificadores (variáveis):
159
160 6. Para o Processamento:
Este processamento executa uma conta que retorna um campo e deste obtém o nome do estado, atribuindo a variável ESTADO. Monte a seguinte consulta:
Select ger_cidade.cid_cod, ger_estado.est_nome From ger_cidade Inner Join ger_estado On ger_cidade.est_cod = ger_estado.est_cod Where (ger_cidade.cid_cod = :CIDADE)
160
161 Esta consulta possui o parâmetro CIDADE que recebe o valor do Parâmetro de Entrada. 7. Para o componente Fim:
O Valor de retorno provem da variável que foi utilizada no processamento:
8. Salve o fluxo como FLUXO PARA WEBSERVICE; 9. Clique na aba Fluxo da paleta Objetos; 10. Clique direito no fluxo FLUXO PARA WEBSERVICE e selecione a opção Externo; 11. Através do menu Projeto do Maker clique em Salvar. Caso esteja com o Webrun aberto, execute Recarregar Sistema; 12. Agora crie o fluxo que irá consumir o FLUXO PARA WEBSERVICE. Este fluxo será disparado pelo evento Ao Clicar do botão do formulário. Clique em Novo da barra de ferramentas do editor de fluxo e monte a seguinte estrutura:
13. Inicie criando o Parâmetro de Entrada:
161
162
Este parâmetro recebe o valor proveniente da lista de cidades do formulário. 14. Defina o Identificador (variável):
15. Para o primeiro Processamento:
162
163
A função utilizada para consumir WebServices é a função Chamar Serviço Web. Para consumir um fluxo como serviço, configure os parâmetros da função do seguinte modo: a. Primeiro parâmetro – aponte para o endereço do serviço web (o ip apresentado é um exemplo caso esteja local): http://127.0.0.1:8080/webrun/services/WFRWebService?wsdl b. Segundo parâmetro – aponte para a porta do serviço: WFRWebService c. Terceiro parâmetro – aponte para método: callRule d. Quarto parâmetro – passe os parâmetros. Já que está obtendo o retorno de um objeto que requisita vários parâmetros, deve-se obter os dados em forma de Lista. A função Criar lista a partir dos elementos permite isto. O primeiro parâmetro da função é informar a sigla do sistema onde se encontra o fluxo. No segundo parâmetro informe o nome de um usuário que tenha acesso ao objeto fluxo que está sendo consumido. No terceiro parâmetro informe a senha deste usuário. No quarto parâmetro informe o nome do fluxo que será consumido e no quinto parâmetro passe os parâmetros que este fluxo necessita (observe que também deve ser em forma de Lista e no formato de letras). 16. Para o segundo Processamento:
163
164
Neste processamento utiliza-se a função Alterar valor do componente para atribuir o valor recebido pela variável ESTADO ao componente do formulário. 17. Salve o fluxo chamando-o de CONSUMINDO FLUXO WEBSERVICE; 18. Feche o editor de fluxos; 19. Retorne ao formulário Consumindo fluxo web service. Abra o evento Ao Clicar do botão e associe o fluxo CONSUMINDO FLUXO WEBSERVICE:
20. Salve o formulário e execute no Webrun. Obs.; O formulário e os fluxos podem ser importados para o projeto através dos arquivos Formulário Consumindo fluxo web service.FRZ, FLUXO PARA WEBSERVICE.FRZ e CONSUMINDO FLUXO WEBSERVICE.FRZ.
164
165
QUARTO DIA Relatório Tipo de Relatório •
Comentário sobre a versão Legado e Maker Report (recordar a tela Configurações)
Criando Relatórios •
Tela Novo Relatório – comentar sobre: a. Relatório em Branco – esta opção será escolhida para abordagem; b. Assistente de Criação de Relatório; c. Baseado em Formulário; d. Relatório Legado.
Tela Gerador de Relatórios •
Aba Dados: Dados: conceituar e desenvolver duas consultas que tenham relacionamento
A primeira consulta possui a estrutura abaixo:
165
166 Select sig_funcionario.fun_cod, sig_funcionario.fun_nome, sig_funcionario.fun_idade, sig_funcionario.fun_salario, sig_funcionario.fun_sexo, sig_funcionario.dep_cod, sig_funcionario.fun_data_admissao, sig_departamento.dep_nome From sig_funcionario Inner Join sig_departamento On sig_funcionario.dep_cod = sig_departamento.dep_cod Where sig_funcionario.fun_cod = :fun_cod And sig_funcionario.fun_sexo = :fun_sexo And sig_funcionario.dep_cod = :dep_cod And sig_funcionario.fun_data_admissao = :fun_data_admissao /*WHERE_ADD*/ Order By sig_departamento.dep_nome, sig_funcionario.fun_nome /*ORDER_ADD*/ Seguem os parâmetros utilizados:
166
167
A segunda consulta possui a estrutura abaixo:
•
Aba Desenho: Desenho: comentar sobre: a. Bandas b. Menu Arquivo: i. Configurar Página ii. Configurar impressão para arquivo 167
168 c. Menu Visualizar: i. Barras de Ferramentas 1. Padrão 2. Dados 3. Avançado 4. Alinhamento e Espaçamento 5. Tamanho 6. Desenho 7. Editar 8. Formato d. Menu Relatório: i. Dados ii. Título iii. Resumo iv. Cabeçalho v. Rodapé vi. Grupos e. Componentes: i. Texto ii. Variável do Sistema iii. Variável iv. Imagem v. Polígono vi. Campo Texto vii. Campo Calculado viii. Sub-relatório •
Sugestão do layout do relatório:
168
169 Passo a passo: 1. Observe a estrutura abaixo:
2. Todo relatório possui inicialmente as faixas Cabeçalho, Detalhe e Rodapé. Rodapé. Para este exemplo ative a faixa Sumário través do menu Relatório – Resumo e através do menu Relatório – Grupos selecione o campo DEP_COD e as faixas Cabeçalho do Grupo e Rodapé do Grupo serão ativadas:
3. Para a faixa Cabeçalho foram inseridos os componentes Imagem, Imagem, Polígono e Texto: Texto:
169
170 4. Para a faixa Cabeçalho do Grupo foi inserido o componentes Campo Texto:
5. Para a faixa Detalhe foram inseridos os componentes Linha, Campo Texto e SubRelatório:
Após inserir o componente Sob-relatório aparecerá uma segunda aba (parte inferior da tela do relatório) chamada SubReport1. No item 9 deste passo a passo demonstraremos como configurá-la. 6. Para a faixa Rodapé do Grupo foram inseridos os componentes Texto e Campo Calculado (para configurar este componente através do clique direito do mouse, ativando a opção Cálculo selecione Soma e na barra de ferramentas do relatório aponte para o campo FUNN_SALARIO):
7. Para a faixa Rodapé foi inserido um componente Linha e um componente Variável do Sistema. Através da barra de ferramentas do relatório mude o valor da variável para Página no conjunto descritiva:
8. Para a faixa Sumário foram inseridos vários componentes: Linha, Texto e Campo Calculado. Cada componente associado a Campo Calculado executa uma forma de cálculo. O primeiro executa Somar, o segundo executa Mínimo, o terceiro executa Máximo e o quarto executa Média.
9. Para configurar o Sub-Relatório, clique na aba e observe a estrutura:
170
171
10. Através do menu Relatório – Dados defina a origem dos dados apontando para a consulta funcionarioXprojeto:
11. Para a faixa Título insira um componente Texto:
12. Para a faixa Detalhe insira um componente Campo de Texto apontando para o campo PRO_NOME:
13. Para a faixa Sumário foram inseridos os componentes Texto e Campo Calculado. O Campo Calculado executa Contar o número de projetos:
14. Salve o relatório chamando-o FUNCIONÁRIOS POR DEPARTAMENTO e insira-o no menu do projeto. Ao acessar pelo Webrun, a janela conterá quatro filtros. Obs.: O relatório deste exemplo pode ser importados para o projeto através do arquivo FUNCIONÁRIOS POR DEPARTAMENTO.FRZ.
171
172
Personalização e Skins Personalizando Barra de Ferramentas do Formulário •
Utilização do arquivo barra de botões.FRZ como exemplo de barra de ferramentas para formulário. Importar para o projeto e inserir em um formulário.
Utilizando Formulário Principal •
Criar um formulário composto por uma árvore e uma moldura para abrir formulário dentro da moldura após clicar no item da árvore.
Passo a passo: 1. Criar um formulário sem abas, fonte de dados e barra de navegação (usar as propriedades do formulário Navegação e Abas informando Não):
2. Salvar o formulário como Formulário Principal; 3. O componente Árvore inserido no formulário contém as propriedades: a. SQL – desenvolva a seguinte consulta:
172
173
Select fr_menu.mnu_codigo, fr_menu.mnu_descricao, fr_menu.mnu_codigo_parent, fr_menu.frm_codigo, fr_menu.mnu_tipo From fr_menu Where (fr_menu.mnu_descricao <> 'Formulário Principal') And (fr_menu.mnu_tipo <> 'R') b. Campo Chave – aponte para o campo MNU_CODIGO; c. Campo Lista – aponte para o campo MNU_DESCRICAO; d. Campo pai – aponte para o campo MNU_CODIGO_PARENT. 4. Salve o formulário; 5. Abra o Editor de Fluxo de Ações e desenvolva a seguinte estrutura:
6. Inicie definindo os Parâmetros de Entrada:
173
174
No inicio devem ser definidos dois parâmetros de entrada do fluxo e esses parâmetros serão passados automaticamente. 7. Defina os Identificadores (variáveis):
8. Para o primeiro processamento:
174
175
É utilizada a função Campo, passando como primeiro parâmetro a função Abrir Consulta e no segundo parâmetro o campo a ser obtido do valor na consulta. O retorno dessa função será atribuído à variável Código do Formulário.
Select FR_MENU.mnu_codigo, fr_formulario.frm_guid From FR_MENU Left Join fr_formulario On FR_MENU.frm_codigo = fr_formulario.frm_codigo Where (FR_MENU.mnu_codigo = :codigo_menu) 9. Na Decisão:
175
176
A verificação do retorno vazio é importante para verificar se o objeto que é selecionado com um clique não será aberto na moldura caso seja item do menu. 10. Para o segundo processamento:
É utilizada a função Abrir Formulário numa Moldura, passando como primeiro parâmetro o formulário onde se encontra a moldura. No segundo parâmetro informa-se o nome do componente moldura. No terceiro parâmetro deve identificar o formulário e no quarto parâmetro False indicando não irá aparecer barra de rolagem na moldura. 11. Salve o fluxo chamando-o de Abre um formulário numa moldura; 12. Feche o editor de fluxos; 13. Associe o fluxo ao evento Ao Clicar do componente árvore:
176
177
Não é necessário indicar os parâmetros de entrada pois o Webrun obterá automaticamente. 14. Para definir este formulário como formulário principal, execute clique direito na Área de Trabalho do Maker e através da Propriedade Formulário Principal aponte para o formulário; 15. Ative o menu Projeto e Salve; 16. Na tela do Webrun, execute a opção Recarregar Sistema. 17. Acesse projeto pelo Webrun. Para retornar à tela padrão: 1. Execute clique direito na Área de Trabalho do Maker e através da Propriedade Formulário Principal apague a refrência do formulário; 2. Ative o menu Projeto e Salve; 3. Pelo botão Iniciar do Windows, localize a pasta Softwell Solutions – Webrun 2.6 – Atualizações e Configurações; 4. Clique no botão Reiniciar; 5. Acesse o projeto pelo Webrun. Obs.: O formulário e o fluxo utilizados neste exemplo podem ser importados para o projeto através dos arquivos Formulário Principal.FRZ e Abre um formulário numa moldura.FRZ.
Pasta Maker.Commons •
Definição e utilização da pasta para personalizar
Pasta Components •
Demonstração da atualização do componente Lista dinâmica diretamente no código do objeto nativo (por exemplo this.filterOnKeyPress = true;) e mostrar atualizando o componente totalmente personalizado.
177
178
Recursos gerenciais do projeto Agendador de Tarefas •
Comentário sobre o recurso: funcionamento da tela, quando se aplica e observar configuração necessária no Webrun.
Lista de Sistemas •
Comentário sobre o recurso: funcionamento da tela, quando se aplica.
Empacotar projeto •
Comentário sobre o recurso: funcionamento da tela, quando se aplica e limitações.
Scanner de Dependências •
Comentário sobre o recurso: funcionamento da tela, quando se aplica.
Histórico de Alterações •
Comentário sobre o recurso: funcionamento da tela, quando se aplica.
Versões •
Comentário sobre o recurso: funcionamento da tela, quando se aplica.
Otimizador de Consultas •
Comentário sobre o recurso: funcionamento da tela, quando se aplica.
Verificar atualizações Maker e Help •
Comentário sobre o recurso: funcionamento da tela e lembrar do atualizador automático configurado através da aba Outros da tela Configurações.
Documentação Automática •
Comentário e utilização: a. Gerar documentação básica do projeto; b. Demonstrar possibilidade de edição do relatório; c. Apresentar local do arquivo rtm.
Exportar Relatório para JASPER •
Comentário sobre o recurso.
178
179
Webrun - Configurações e Publicação Configurações do Webrun •
• • •
Opções da tela do Webrun a. Modo gerente b. Log c. Alterar Senha d. Executor de Scripts SQL e. Recarregar Sistemas f. Conexões Adicionais Apresentar e comentar a tela Configuração do Webrun Verificação do Browser; Opções de Configurações (item da tela Sistemas): a. Gerenciar Sistemas b. Parâmetros de Configuração c. Recarregar Sistemas; d. Configurar: i. Configurações para conexão com o banco de dados; ii. Configurações Avançadas; iii. Modificar iv. Reiniciar; v. Exportar
Publicação •
•
Comentar e executar: d. Exportar código WAR; e. Exportar código JAR. Comentar a opção Desfazer exportação.
179
180
Modelagem das Tabelas para Treinamento
180
181
QUINTO DIA Projeto Integrador 1 – Agendamento de Reuniões Objetivo Este projeto é uma ferramenta complementar para o reforço do conhecimento adquirido. Deve ser aplicado ao final do treinamento ou extra curso para que o treinando possa auto avaliar. O projeto chamado Agendamento de Reuniões é um sistema projetado para o agendamento de eventos. Relação de recursos aplicados no projeto: • •
• • • • • • • •
Módulos de inclusão, alteração, exclusão, busca e log para todos os formulários. Utilização de componentes tais como: Caixa de Texto, Texto, Lista, Lista Dinâmica, Check, Imagem, Botão, Moldura, Opções, Texto Longo, Sub-Form, Grade. Menus e sub-menus. Relatório. Fluxos. Cadastro de imagens. Leitura Biométrica. Dicionário de Dados. Tipos de Dados. Assistentes para criação de formulários.
O projeto possui os seguintes objetos: •
•
•
Menu Cadastros 1. Localidade i. Cadastro de Países ii. Cadastro de Estados iii. Cadastro de Cidades iv. Cadastro de Bairros 2. Cadastro da Entidade 3. Cadastro de Funcionários Menu Agendamento 1. Participantes Externos 2. Cadastro de Empresas 3. Cadastro de Reuniões Menu Relatórios 1. Relação dos Eventos
Este projeto utiliza o PostgreSQL 8.2 e após a criação do mesmo, devem ser importadas as tabelas contidas no arquivo Tabelas para projeto de conclusão.frz. O banco possuem a seguinte modelagem: •
GER_BAIRRO
COLUMNS
181
182
CONSTRAINTES
•
GER_PAIS COLUMNS
•
GER_PESSOA COLUMNS
•
CONSTRAINTES
SCH_EMPRESA COLUMNS
•
CONSTRAINTES
CONSTRAINTES
SCH_ENTIDADE COLUMNS
CONSTRAINTES
182
183
•
SCH_FUNCIONARIO
COLUMNS
CONSTRAINTES
•
SCH_PARAMETRO_EMAIL COLUMNS
•
SCH_PARTICIPANTE COLUMNS
•
CONSTRAINTES
CONSTRAINTES
SCH_REUNIAO
COLUMNS
183
184 CONSTRAINTES
•
SCH_REUNIAO_PESSOA COLUMNS
•
CONSTRAINTES
SCH_SETOR COLUMNS
CONSTRAINTES
O menu do projeto está composto pelos formulários a seguir: •
CADASTRO DE PAÍSES
184
185 •
CADASTRO DE ESTADOS
•
CADASTRO DE CIDADES
185
186 •
CADASTRO DE BAIRROS
•
CADASTRO DA ENTIDADE
186
187 •
CADASTRO DE FUNCIONÁRIOS
•
PARTICIPANTES EXTERNOS
187
188 •
CADASTRO DE EMPRESAS
•
CADASTRO DE REUNIÕES
188
189 O menu do projeto está composto pelo relatório a seguir: •
RELAÇÃO DOS EVENTOS
Cadastro de Países Formulário para o cadastro de países. Este formulário não possui fonte de dados. Está composto por um componente Grade com origem no formulário PAÍS, que possui origem na tabela GER_PAIS:
189
190
Passos: 1. Inicie um novo formulário nomeando-o de PAÍS e defina a origem de dados GER_PAIS; 2. Após confirmar a geração do formulário, mantenha apenas o componente referente a descrição do país; 3. Inicie um novo formulário nomeando-o de CADASTRO DE PAÍSES e não defina origem de dados; 4. Insira um componente Moldura envolvendo o componente Grade; 5. Insira um componente Texto e defina para a propriedade DESCRIÇÃO o contexto CADASTRO DE PAÍSES; 6. Insira um componente Grade e defina para a propriedade FORMULÁRIO do componente o formulário PAÍS; 7. Salve e feche o formulário; 8. Edite a barra de menus do projeto, criando o menu CADASTROS e dentro deste, crie o menu LOCALIDADE;
190
191 9. Insira o formulário CADASTRO DE PAÍSES no menu LOCALIDADE e Salve a barra de menus.
Consulta SQL: Select ger_pais.pais_cod, ger_pais.pais_nome From ger_pais
Cadastro de Estados Formulário para o cadastro de estados. Está composto por dois componentes: uma Caixa de Texto e uma Lista Dinâmica. A origem dos dados do formulário vêem da tabela GER_ESTADO.
191
192
Passos: 1. Inicie um novo formulário nomeando-o de CADASTRO DE ESTADOS e defina a origem de dados GER_ESTADO; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição do estado e o combo que lista os países; 3. Insira um componente Moldura envolvendo os componentes; 4. Salve e feche o formulário; 5. Edite a barra de menus do projeto inserindo o formulário CADASTRO DE ESTADOS no menu LOCALIDADE e Salve a barra de menus.
192
193
Consulta SQL: Select ger_estado.est_cod, ger_estado.est_nome, ger_estado.pais_cod From ger_estado
193
194
Cadastro de Cidades Formulário para o cadastro de cidades. Está composto por dois componentes: uma Caixa de Texto e uma Lista Dinâmica. A origem dos dados do formulário vêem da tabela GER_CIDADES.
Passos: 1. Inicie um novo formulário nomeando-o de CADASTRO DE CIDADES e defina a origem de dados GER_CIDADES; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição da cidade e o combo que lista os estados; 3. Insira um componente Moldura envolvendo os componentes; 4. Salve e feche o formulário; 5. Edite a barra de menus do projeto inserindo o formulário CADASTRO DE CIDADES no menu LOCALIDADE e Salve a barra de menus.
194
195
Consulta SQL: Select ger_cidade.cid_cod, ger_cidade.cid_nome, ger_cidade.est_cod From ger_cidade
195
196
Cadastro de Bairros Formulário para o cadastro de bairros. Está composto por dois componentes: uma Caixa de Texto e uma Lista Dinâmica. A origem dos dados do formulário veem da tabela GER_BAIRRO.
Passos: 1. Inicie um novo formulário nomeando-o de CADASTRO DE BAIRROS e defina a origem de dados GER_BAIRROS; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição do bairro e o combo que lista as cidades; 3. Insira um componente Moldura envolvendo os componentes; 4. Salve e feche o formulário; 5. Edite a barra de menus do projeto inserindo o formulário CADASTRO DE BAIRROS no menu LOCALIDADE e Salve a barra de menus.
196
197
Consulta SQL: Select ger_bairro.bai_cod, ger_bairro.bai_nome, ger_bairro.cid_cod From ger_bairro
197
198
Cadastro de Entidade Formulário para o cadastro da empresa, dos setores da empresa e do servidor de envio de email. Este formulário está composto por três abas: Cadastro, Setores e Configurar SMTP. A origem dos dados do formulário vêem da tabela SCH_ENTIDADE.
198
199
Passos para a aba Cadastro: 1. Inicie um novo formulário nomeando-o de CADASTRO DE ENTIDADE e defina a origem de dados SCH_ENTIDADE; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição da entidade, site, telefone, fax e campo imagem para logomarca. Para os campos telefone e fax, aplique uma máscara (por exemplo, usar o tipo TELEFONE); 3. Insira um componente Moldura envolvendo os componentes.
199
200
Passos para a aba Setores: 1. Insira uma nova aba renomeando-a para Setores. Esta aba está composta por uma grade originada do formulário CADASTRO DE SETORES: i. Inicie um novo formulário nomeando-o de CADASTRO DE SETORES e defina a origem de dados SCH_SETOR; 200
201 ii.
Após confirmar a geração do formulário, mantenha apenas o componente referente a descrição do setor; 2. Insira um componente Moldura envolvendo a grade.
Passos para a aba Configurar SMTP: 1. Insira uma nova aba renomeando-a para Configurar SMTP. Esta aba está composta por um componente Sub-Form cujo formulário de origem é CONFIGURAÇÃO DO SMTP, baseado na tabela SCH_PARAMETRO_EMAIL, com a seguinte estrutura: composto por componentes Caixa de Texto referentes a descrições do servidor de email, porta, e-mail, usuário e senha e um componente Check para configurar o uso de SSL; 2. Salve e feche o formulário; 3. Edite a barra de menus do projeto inserindo o formulário CADASTRO DA ENTIDADE no menu CADASTROS e Salve a barra de menus.
201
202
Consulta SQL do CADASTRO DA ENTIDADE: Select sch_entidade.sch_ent_id, sch_entidade.sch_ent_entidade, sch_entidade.sch_ent_site, sch_entidade.sch_ent_telefone, sch_entidade.sch_ent_fax, sch_entidade.pcc_cad_logomarca From sch_entidade
202
203
Consulta SQL do CADASTRO DE SETORES: Select sch_setor.set_cod, sch_setor.set_nome, sch_setor.sch_ent_id From sch_setor
203
204
Cadastro de Funcionários Formulário para o cadastro de funcionários da empresa. Este formulário está composto por componentes Caixa de Texto (para cadastrar o nome, o telefone fixo e o celular), e um componente Sub-Formulário que será comentado abaixo.
Passos: 1. Inicie um novo formulário nomeando-o de CADASTRO DE FUNCIONÁRIOS e defina a origem de dados GER_PESSOA; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição do nome, telefone e celular. O formulário ficará da seguinte forma:
204
205
3. Inicie um novo formulário nomeando-o SUBFORM-FUNCIONÁRIOS. e defina a origem de dados SCH_FUNCIONARIO; 4. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição do e-mail, setor (uma Lista Dinâmica baseada na tabela SHC_SETOR) e um componente imagem para capturar a digital. O formulário ficará com o seguinte layout:
5. Salve o formulário e feche; 6. Insira o SUBFORM-FUNCIONÁRIOS no formulário CADASTRO DE FUNCIONÁRIOS; 205
206 7. Através da opção Controle, utilize a opção Enviar para trás, onde o formulário ficará com o seguinte layout:
8. Salve o formulário e feche. Consulta SQL do CADASTRO DE FUNCIONÁRIOS: Select ger_pessoa.pes_cod, ger_pessoa.pes_nome, ger_pessoa.pes_tel, ger_pessoa.pes_cel, ger_pessoa.pes_tipo From ger_pessoa Where ger_pessoa.pes_tipo = 'F' Consulta SQL do SUB-FORM FUNCIONÁRIO: Select sch_funcionario.pes_cod, sch_funcionario.pes_cod_digital, sch_funcionario.pes_digital, sch_funcionario.set_cod, sch_funcionario.pes_email From sch_funcionario Observação: Definir valor F como valor padrão para o campo TIPO.
206
207
Participantes Externos Formulário para o cadastro de participantes externos, ou seja, convidados. Este formulário está composto por componente Caixa de Texto (para cadastrar o nome, o telefone fixo e o celular), e um componente Sub-Formulário que será comentado abaixo.
Passos: 1. Inicie um novo formulário nomeando-o de PARTICIPANTES EXTERNOS e defina a origem de dados GER_PESSOA; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição do nome, telefone e celular. O formulário ficará da seguinte forma:
207
208
3. Inicie um novo formulário nomeando-o SUB-FORM PARTICIPANTES. e defina a origem de dados SCH_PARTICIPANTE; 4. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição do e-mail e empresar (uma lista dinâmica baseada na tabela SHC_EMPRESA). O formulário ficará com o seguinte layout:
5. Salve o formulário e feche; 208
209 6. Insira o SUB-FORM PARTICIPANTES no formulário PARTICIPANTES EXTERNOS; 7. Através da opção Controle, utilize a opção Enviar para trás, onde o formulário ficará com o seguinte layout:
8. Salve o formulário e feche;
209
210 9. Edite o menu da aplicação inserindo o formulário no menu AGENDAMENTO. Consulta SQL do PARTICIPANTES EXTERNOS: Select ger_pessoa.pes_cod, ger_pessoa.pes_nome, ger_pessoa.pes_tel, ger_pessoa.pes_cel, ger_pessoa.pes_tipo From ger_pessoa Where ger_pessoa.pes_tipo = 'P' Consulta SQL do SUB-FORM PARTICIPANTES: Select sch_participante.pes_cod, sch_participante.emp_cod, sch_participante.pes_email From sch_participante Observação: Definir valor P como valor padrão para o campo TIPO.
210
211
Cadastro de Empresas Formulário para o cadastro das empresas dos participantes externos. Este formulário está composto por duas abas: Cadastro (cadastro dos dados da empresa) e aba Endereço (cadastro dos dados para correspondência).
Passos para a aba Cadastro: 1. Inicie um novo formulário nomeando-o de CADASTRO DE EMPRESAS e defina a origem de dados SCH_EMPRESA; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a descrição da empresa, e-mail, telefone e fax. Para os campos telefone e fax, aplique uma máscara (por exemplo, usar o tipo TELEFONE); 3. Insira um componente Moldura envolvendo os componentes.
211
212
Passos para a aba Endereço: 1. Insira uma nova aba e renomei para Endereço; 2. Insira um componente Lista Dinâmica que possuirá a seguinte consulta: Select ger_bairro.bai_cod, ger_bairro.bai_nome, ger_cidade.cid_nome, ger_estado.est_nome, ger_pais.pais_nome From ger_bairro Inner Join ger_cidade On ger_bairro.cid_cod = ger_cidade.cid_cod Inner Join ger_estado On ger_cidade.est_cod = ger_estado.est_cod Inner Join ger_pais On ger_estado.pais_cod = ger_pais.pais_cod Configure para a Propriedade Campo Chave o campo bai_cod e para a Propriedade Campo Lista o campo bai_nome. 3. Para os campos CIDADE, ESTADO e PAÍS: duplique o campo BAIRRO alterando a Propriedade Campo Lista para cid_nome ou est_nome ou pais_nome, conforme o campo, e para estes três compoenentes, utilize a Propriedade Estilo com o valor Edit e ative a Propriedade Apenas Leitura; 4. Insira um componente Caixa de Texto associando ao campo emp_numero e outro para o campo emp_cep; 5. Para o campo de cadastro do cep, foram inseridas duas imagens. Existe um fluxo associado ao evento Ao Clicar da primeira imagem (a imagem representando uma lupa de pesquisa), e este fluxo está descrito abaixo; 6. Insira dois componentes Texto Longo representando os campos emp_end e emp_complemento respectivamente; 7. Insira um componente Moldura envolvendo os componentes.
212
213
Fluxo associado ao evento Ao Clicar do componente imagem (lupa de pesquisa):
213
214 1. Ative o Editor de Fluxo de Ações; 2. Inicialmente monte a estrutura do fluxo:
3. Crie as variáveis do fluxo:
214
215
4. Para o Processamento MOSTRAR GIF ANIMADO:
5. Para o Processamento CHAMAR SERVIÇO WEB:
215
216
Parâmetros: 1º - http://www.byjg.com.br/xmlnuke-php/webservice.php/ws/cep?WSDL 2º - CEPServicePort 3º - obterLogradouro 4º - CEP (parâmetro de entrada CEP) Retorno Logradouro do CEP passado como parâmetro para a variável ENDEREÇO. 6. Para o Processamento ATRIBUIR RESULTADO DA PESQUISA PARA ENDEREÇO:
216
217
7. Para o Processamento OCULTAR GIF ANIMADO:
8. Salve o fluxo na camada Servidor; 217
218 9. Atribua ao evento Ao Clicar do componente da imagem (lupa de pesquisa) obtendo do componente referente ao CEP o valor correspondente ao parâmetro de entrada do fluxo:
10. Salve o formulário e Feche; 11. Edite o menu da aplicação inserindo o formulário CADASTRO DE EMPRESAS no menu AGENDAMENTO.
218
219
Cadastro de Reuniões O formulário CADASTRO DE REUNIÕES é o principal objeto do sistema, é onde todos os dados se cruzam. Este formulário é composto por quatro abas: Cadastro, Participantes, Notificação e Status da Reunião. Este formulário possui origem na tabela SCH_REUNIAO.
219
220
Passos para a aba Cadastro: 1. Inicie um novo formulário nomeando-o de CADASTRO DE REUNIÕES e defina a origem de dados SCH_REUNIAO; 2. Após confirmar a geração do formulário, mantenha apenas os componentes referentes a data da reunião, HORA INICIAL e HORA FINAL, o tema, o local do evento e uma observação sobre o evento. Para os campos referentes a data do evento, aplique a Propriedade Conteúdo definindo o tipo Data. Para o campo LOCAL DA REUNIÃO SETOR, utilizando o componente Lista Dinâmica, obtenha da tabela SCH_SETOR as opções que serão exibidas na lista armazenando no campo EMP_COD; 3. Insira um componente Moldura envolvendo os componentes.
220
221
Passos para a aba Participantes: 1. Insira uma nova aba no formulário nomeando-a de Participantes e nesta, insira dois componentes Grade para o cadastro de FUNCIONÁRIOS (participantes da empresa promotora do evento) e para PARTICIPANTES CONVIDADOS;
221
222 i. Para a grade que representa a relação de funcionários, foi criado um formulário com o seguinte layout:
A consulta do formulário: Select sch_reuniao_pessoa.pes_cod, sch_reuniao_pessoa.reu_cod, ger_pessoa.pes_tipo From sch_reuniao_pessoa Inner Join ger_pessoa On sch_reuniao_pessoa.pes_cod = ger_pessoa.pes_cod Where ger_pessoa.pes_tipo = 'F' ii. Para o componente Lista Dinâmica que:representa o campo PES_COD da tabela SCH_REUNIAO_PESSOA, possui a propriedade Campo Chave apontando para PES_COD e para a propriedade Campo Lista, apontar para PES_NOME. Segue a consulta do componente: Select ger_pessoa.pes_cod, ger_pessoa.pes_nome, ger_pessoa.pes_tipo From ger_pessoa Where ger_pessoa.pes_tipo = 'F' Order By ger_pessoa.pes_nome iii. Salve o formulário e insira-o no formulário CADASTRO DE REUNIÕES, na aba Participantes como Grade; iv. Insira um botão sobrepondo o canto superior direito do componente grade que representa o cadastro de participantes convidados. Para a propriedade Formulário do botão, aponte para o formulário CADASTRO DE FUNCIONÁRIOS; v. Para a grade que representa a relação de participantes convidados, foi criado um formulário com o seguinte layout:
222
223
A consulta do formulário: Select sch_reuniao_pessoa.pes_cod, sch_reuniao_pessoa.reu_cod, ger_pessoa.pes_tipo From sch_reuniao_pessoa Inner Join ger_pessoa On sch_reuniao_pessoa.pes_cod = ger_pessoa.pes_cod Where ger_pessoa.pes_tipo = 'P' vi. Para o componente Lista Dinâmica que representa o campo PES_COD da tabela SCH_REUNIAO_PESSOA, possui a propriedade Campo Chave apontando para PES_COD e para a propriedade Campo Lista, apontar para PES_NOME. Segue a consulta do componente Select ger_pessoa.pes_cod, ger_pessoa.pes_nome, ger_pessoa.pes_tipo From ger_pessoa Where ger_pessoa.pes_tipo = 'P' Order By ger_pessoa.pes_nome vii. Salve o formulário e insira-o no formulário CADASTRO DE REUNIÕES, na aba Participantes como Grade; viii. Insira um botão sobrepondo o canto superior direito do componente grade que representa o cadastro de participantes convidados. Para a propriedade Formulário do botão, aponte para o formulário PARTICIPANTES EXTERNOS;
223
224
Passos para a aba Notificação: 1. Insira uma nova aba no formulário nomeando-a de Notificação e nesta, insira:
224
225 i. ii. iii.
iv.
um componente Caixa de Texto com as seguintes Propriedades: para a Propriedade Campo, aponte para REU_TEMA. Para a Propriedade Apenas Leitura defina Sim, para a Propriedade Descrição informe Assunto; um componente Texto Longo, apontando para o campo PCC_CAD_MENSAGEM. Para a Propriedade Quebra Automática defina Sim e para a Propriedade Texto Rico selecione HTML Básico; um componente Texto cuja Propriedade Descrição é "* Quando utilizada a palavra TEMA (maiúsculo), a mesma será substituída pelo TEMA DA REUNIÃO.". Ajuste a altura do componente para o equivalente a duas linhas de texto e ative a Propriedade Quebra Automática para Sim; um botão com a descrição Enviar notificação da reunião e ao Evento Ao Clicar associe o fluxo para enviar e-mails para os participantes cadastrados e o corpo do e-mail corresponde a mensagem digitada no campo MENSAGEM. Existe uma particularidade no contexto da mensagem que correspondente a pala TEMA quando usada no texto: esta palavra será substituída pelo conteúdo correspondente ao tema da reunião. O fluxo possui a seguinte estrutura:
Passos para a criação do fluxo: 1. Parâmetros de entrada do fluxo:
225
226
2. Identificadores (variáveis) do fluxo:
3. Processamento 1: Este processamento consulta os parâmetros necessários para o envio de e-mail e atribui o resultado para variável PARAMETROS_EMAIL:
226
227
Observe a consulta: Select sch_parametro_email.par_server_email, sch_parametro_email.par_usuario, sch_parametro_email.par_senha, sch_parametro_email.sch_con_porta, sch_parametro_email.sch_con_usa_ssl, sch_parametro_email.pcc_con_e_mail From sch_parametro_email 4. Processamento 2: Este processamento consulta os participantes do evento e atribui o resultado para variável LISTA_PARTICIPANTES:
227
228
Observe a consulta: Select sch_reuniao_pessoa.reu_cod, sch_funcionario.pes_email From sch_reuniao_pessoa Inner Join sch_funcionario On sch_reuniao_pessoa.pes_cod = sch_funcionario.pes_cod Where sch_reuniao_pessoa.reu_cod = :COD_REUNIAO Union Select sch_reuniao_pessoa.reu_cod, sch_participante.pes_email From sch_reuniao_pessoa Inner Join sch_participante On sch_reuniao_pessoa.pes_cod = sch_participante.pes_cod Where sch_reuniao_pessoa.reu_cod = :COD_REUNIAO 5. Decisão 3: Esta decisão apenas verifica se existe ou não dados na consulta:
228
229
6. Interação 4: Esta interação é apenas uma Mensagem de Alerta avisando quando não existir dados na consulta:
7. Interação 5: Esta decisão apenas verifica se existe ou não dados na consulta e mantém o loop:
229
230
8. Processamento 6: Este processamento monta o conteúdo que será enviado por e-mail. A função principal, E-mail - Enviar E-mail Instantaneamente, está estruturado da seguinte forma:
9. Processamento 7: Este processamento move o ponteiro na consulta dos participantes:
230
231
10. Interação 8: Esta interação é apenas uma Mensagem de Alerta avisando o envio do email:
Salve o fluxo chamando-o de ENVIAR NOTIFICAÇÃO POR E-MAIL e associe ao evento Ao Clicar do botão Enviar notificação da reunião passando os seguintes parâmetros:
231
232
Passos para a aba Status da Reunião: 1. Insira uma nova aba no formulário nomeando-a de Status da Reunião e nesta, insira: i. um componente Check com as seguintes Propriedades: para a Propriedade Campo, aponte para REU_INTERNA. Para a Propriedade Descrição defina REUNIÃO INTERNA?.Para a Propriedade Valor Marcado defina S e para a Propriedade Valor Desmarcado informe N; ii. um componente Opções, apontando para o campo REU_STATUS. Para a Propriedade Descrição defina SITUAÇÃO. Para a Propriedade Lista defina:
232
233
Salve e feche o formulário. Edite a barra de menus do projeto, inserindo-o no menu AGENDAMENTO e Salve a barra de menus.
233
234
Relação dos Eventos Este relatório lista todos os eventos cadastrados com a possibilidade de filtrar por STATUS.
Siga os passos para a constituição do relatório: 1. A partir da paleta de objetos, aba Relatório, clique em Novo; 2. Na tela Novo Relatório, selecione a opção Relatório em branco e clique no botão Ok; 3. Ative a Aba Dados e crie a consulta para o relatório: Select sch_reuniao.reu_cod, sch_reuniao.reu_data, sch_reuniao.reu_tema, sch_reuniao.reu_obs, sch_reuniao.reu_interna, sch_reuniao.emp_cod, sch_reuniao.reu_horainicio, sch_reuniao.reuhorafim, sch_entidade.sch_ent_entidade,
234
235 sch_entidade.sch_ent_site, sch_entidade.pcc_cad_logomarca, sch_reuniao.reu_status From sch_reuniao, sch_entidade Where sch_reuniao.reu_status = :STATUS
4. O critério STATUS é configurado através da tela Maker Params, acionada através do botão
com a seguinte consulta:
235
236
5. Clique no botão
e monte a consulta:
Select Cast(Case When sch_reuniao.reu_status = 1 Then 'Concluída' When sch_reuniao.reu_status = 2 Then 'Cancelada' When sch_reuniao.reu_status = 3 Then 'Andamento' End As VarChar(30)) As status, sch_reuniao.reu_status, Count(sch_reuniao.reu_status) As tota From sch_reuniao Group By Cast(Case When sch_reuniao.reu_status = 1 Then 'Concluída' When sch_reuniao.reu_status = 2 Then 'Cancelada' When sch_reuniao.reu_status = 3 Then 'Andamento' End As VarChar(30)), sch_reuniao.reu_status
236
237
6. Clique no botão Ok; 7. Retornando a tela Maker Params declare para Campo o atributo reu_status e para Campo para Listagem o atributo status; 8. Clique no botão Ok; 9. Crie uma nova consulta para a constituição do gráfico do relatório:
Select Cast(Case When sch_reuniao.reu_status = 1 Then 'Concluída' When sch_reuniao.reu_status = 2 Then 'Cancelada' When sch_reuniao.reu_status = 3 Then 'Andamento' End As VarChar(30)), Count(sch_reuniao.reu_status) From sch_reuniao Group By Cast(Case When sch_reuniao.reu_status = 1 Then 'Concluída' When sch_reuniao.reu_status = 2 Then 'Cancelada' When sch_reuniao.reu_status = 3 Then 'Andamento' End As VarChar(30))
237
238
10. Clique em Ok para confirmar a consulta; 11. Ative a aba Desenho e desenvolva o seguinte layout:
Para os itens do layout:
238
239
1. Insira um componente pcc_cad_logomarca;
(Campo Imagem) apontando para o campo
2. Utilizando o componente
(Texto) crie o título e os rótulos das colunas;
3. Utilizando o componente
(Campo Texto) crie os campos de dados;
4. Utilizando o componente
(Campo Texto) crie os campos do rodapé;
5. Utilizando o componente (Variável do Sistema) defina uma numeração de página através da barra de ferramentas chamada Editar escolhendo a opção Página no conjunto descritiva; 6. Constitua uma legenda que apresentará o valor do filtro selecionado: a. Desenhe um retângulo através da ferramenta insira um
(Polígono) e dentro deste
(Texto):
b. Arraste da coluna Estrutura de Dados o campo STATUS com a propriedade Visível desativada:
c. Insira um componente (Variável) e através da propriedade Cálculo e programe a seguinte rotina para o componente:
if Parametros['STATUS']='1' then variable1.text :='Reuniões Concluídas' else if Parametros['STATUS']='2' then variable1.text :='Reuniões Canceladas' else if Parametros['STATUS']='3' then variable1.text :='Reuniões em Andamento' else variable1.text :='Todos'; end;
239
240
7. Desenvolva um gráfico circular de setores na área Sumário, que venha resumir as ocorrências dos eventos. Siga os passos: a. Ative o menu Relatórios e ative a opção Resumo; b. Insira um componente gráfico;
(Campo Gráfico) e ative a propriedade Editar o
c. Clique no botão para acrescentar uma seqüência e escolhendo um gráfico. Neste exemplo escolheremos o gráfico de pizza com a opção 3D desativada; d. Localize a opção Série1 dentro das séries do gráfico e clique na aba Fonte de dados; e. Mude a opção Manual para Condutor de dados apontando para a segunda consulta; f. Na opção Rótulos aponte para a expressão que listará o status da reunião (expressão contendo a função Cast...); g. Na opção Pizza selecione o segundo campo (campo onde executou a função Count); h. No ítem Legenda, desative a opção de legenda; i. Feche a tela de edição de gráfico e ajuste o tamanho e posição. Salve o relatório e insira-o no menu do sistema.
Projeto Integrador 2 – Controle de Protocolo Objetivo Este projeto é uma ferramenta complementar para o reforço do conhecimento adquirido. Deve ser aplicado ao final do treinamento ou extra curso para que o treinando possa auto avaliar. O projeto chamado Controle de Protocolo é um sistema projetado para o controle de processos entre setores. Relação de recursos aplicados no projeto: • •
•
Módulos de inclusão, alteração, exclusão, busca e log para todos os formulários. Utilização de componentes tais como: Caixa de Texto, Texto, Lista, Lista Dinâmica, Check, Imagem, Botão, Moldura, Opções, Texto Longo, Sub-Form, Grade. Menus e sub-menus.
240
241
• • • • •
Relatório. Fluxos. Dicionário de Dados. Tipos de Dados. Assistentes para criação de formulários.
O projeto possui os seguintes objetos: •
•
•
Menu Cadastro 1. Tipo de Documento 2. Gerência 3. Fornecedor Menu Protocolo 1. Protocolo Menu Relatórios 1. Protocolos por período
Este projeto utiliza o PostgreSQL 8.2 e após a criação do mesmo, devem ser importadas as tabelas contidas no arquivo Tabelas para projeto de conclusão2.frz. O banco possuem a seguinte modelagem: •
FBB_FORNECEDOR
•
FBB_GERENCIA
241
242
•
FBB_MOVIMENTACAO
•
FBB_PROTOCOLO
242
243
•
FBB_TIPO_DE_DOCUMENTO
O menu do projeto está composto pelos formulários a seguir: •
TIPO DE DOCUMENTO
243
244 •
GERÊNCIA
•
FORNECEDOR
244
245 •
PROTOCOLO
•
PROTOCOLOS POR PERÍODO
245
246
Tipo de Documento Formulário para o cadastro de documentos. Está composto por um componente Caixa de Texto com origem na tabela FBB_TIPO_DE_DOCUMENTO:
Passos: 1. Crie um formulário novo como base na tabela FBB_TIPO_DE_DOCUMENTO, utilizando o Assistente de Criação de Formulários; 2. Remova o componente referente ao código e altere a descrição do componente criado para Descrição. Depois, adicione ao formulário um componente Moldura e um componente Texto com a descrição Cadastro de Tipo de Documento; 3. Salve o formulário chamando-o Tipo de Documento; 4. Leve-o para o menu Cadastro. Consulta SQL: Select FBB_TIPO_DE_DOCUMENTO.fbb_tip_id, FBB_TIPO_DE_DOCUMENTO.fbb_tip_descricao From FBB_TIPO_DE_DOCUMENTO /*WHERE_NEW*/ /*ORDER_NEW*/ Este formulário pode ser obtido através do arquivo Tipo de Documento.FRZ.
246
247
Gerência Formulário para o cadastro de setores. Está composto por um componente Caixa de Texto com origem na tabela FBB_GERENCIA:
Passos: 1. Crie um formulário novo como base na tabela FBB_GERENCIA, utilizando o Assistente de Criação de Formulários; 2. Remova o componente referente ao código e altere a descrição do componente criado para Descrição. Depois, adicione ao formulário um componente Moldura e um componente Texto com a descrição Cadastro de Gerência; 3. Salve o formulário chamando-o Tipo de Documento; 4. Leve-o para o menu Cadastro. 5. Consulta SQL: Select FBB_GERENCIA.fbb_ger_id, FBB_GERENCIA.fbb_ger_nome From FBB_GERENCIA /*WHERE_NEW*/ /*ORDER_NEW*/ Este formulário pode ser obtido através do arquivo GERENCIA.FRZ.
247
248
Fornecedor Formulário para o cadastro o cliente origem do processo. Está composto por um componente Caixa de Texto com origem na tabela FBB_FORNECEDOR:
Passos: 1. Crie um formulário novo como base na tabela FBB_FORNECEDOR, utilizando o Assistente de Criação de Formulários; 2. Remova o componente referente ao código e altere a descrição do componente criado para Descrição. Depois, adicione ao formulário um componente Moldura e um componente Texto com a descrição Cadastro de Fornecedor; 3. Salve o formulário chamando-o Tipo de Documento; 4. Leve-o para o menu Cadastro. 5. Consulta SQL: Select FBB_FORNECEDOR.fbb_for_id, FBB_FORNECEDOR.fbb_for_nome From FBB_FORNECEDOR /*WHERE_NEW*/ /*ORDER_NEW*/ Este formulário pode ser obtido através do arquivo FORNECEDOR.FRZ.
248
249
Protocolo Formulário para o cadastro do processo. Possui origem na tabela FBB_PROTOCOLO e na tabela FBB_MOVIMENTACAO que foi usada para a criação do formulário da grade:
Observação: •
No Sql do formulário (para alterar vá até Definições e depois em Assistente Sql) deve ser criado uma nova expressão com o apelido de Documento anexado, para preencher o componente checkbox Documento anexado do formulário. A expressão deve conter a seguinte sintax: Case When FBB_PROTOCOLO.fbb_pro_caimnho_do_documento Is Null Then 'N' Else 'S' End
Consulta SQL: Select FBB_PROTOCOLO.fbb_pro_numero, FBB_PROTOCOLO.fbb_pro_ano, FBB_PROTOCOLO.fbb_tip_id, FBB_PROTOCOLO.fbb_pro_tipo, FBB_PROTOCOLO.fbb_ger_id, FBB_PROTOCOLO.fbb_for_id, FBB_PROTOCOLO.fbb_pro_origem, FBB_PROTOCOLO.fbb_pro_destino, FBB_PROTOCOLO.fbb_for_id_fornecedor_destino, 249
250 FBB_PROTOCOLO.fbb_ger_id_gerencia_destino, FBB_PROTOCOLO.fbb_pro_data_entrada, FBB_PROTOCOLO.fbb_pro_data_saida, FBB_PROTOCOLO.usr_codigo, FBB_PROTOCOLO.fbb_pro_caimnho_do_documento, Case When FBB_PROTOCOLO.fbb_pro_caimnho_do_documento Is Null Then 'N' Else 'S' End As "ExisteDocumento" From FBB_PROTOCOLO /*WHERE_NEW*/ /*ORDER_NEW*/ Nas definições deste formulário, na aba Valor padrão e Máscaras como mostra abaixo:
Deve ser definido valor padrão clicando com botão direito e escolhendo “Funções” para os campos: (valor padrão Ano), FBB_PROTOCOLO.fbb_pro_ano FBB_PROTOCOLO.fbb_pro_data_entrada (valor padrão Data), FBB_PROTOCOLO.usr_codigo (valor padrão Código do usuário). Referente aos campos Origem (FBB_PRO_ORIGEM) e Destino (FBB_PRO_DESTINO) deve ser definido no componente Opções os valores a serem armazenados como: I e E, com suas respectivas descrições: Interno e Externo. Referente ao componente Lista (chamado Tipo) devem ser definidos os valores a serem armazenados como: E e S, com suas respectivas descrições: Entrada e Saída. Deve ser criado um formulário para onde a grade vai apontar, chamado de Movimentação, que com base na tabela FBB_MOVIMENTACAO.
250
251
O campo de ligação do formulário principal com a grade é fbb_pro_numero como mostra imagem abaixo:
Após a criação completa salve o formulário com o nome Protocolo e no menu chamado Protocolo adicione o formulário criado. Este formulário pode ser obtido através do arquivo PROTOCOLO.FRZ.
251
252 Este formulário possui um fluxo associado ao evento Ao Navegar:
Crie um fluxo chamado Mostrar ou Ocultar Componentes que oculte/exiba os componentes: Fornecedor Origem, Gerente Origem, Fornecedor Destino, Gerente Destino, texto que informa a necessidade de gravar o registro antes do upload do arquivo. Além disso, habilite/desabilite o botão Upload do Documento. Crie dois parâmetros de entrada para o fluxo chamados: Origem (Letras) e Destino (Letras) para receber os valores dos componentes Opção do formulário.
No primeiro componente decisão (Origem = Interno?), utilize a função igual para verificar se o parâmetro origem é igual a I.
252
253
Para ocultar/exibir um componente utilize a função Mostrar componente passando no segundo parâmetro o valor lógico false para ocultar e true para exibir.
Logo após a primeira decisão, caso a decisão seja SIM, oculte o componente Fornecedor Origem e exiba o componente Gerencia Origem. Caso a decisão seja NÃO, Oculte o componente Gerencia Origem e exiba o componente Fornecedor Origem. No segundo componente decisão (Destino= Interno?), é realizado o mesmo procedimento do passo anterior, porém exibe/oculta os componentes: Gerencia Destino e Fornecedor Destino. No terceiro componente decisão (Está em Modo de Inclusão?), utilize a função “Está em modo de inserção”.
Caso a decisão seja SIM exibe o componente Label (função “Mostrar componente”) e desabilita o botão “Upload do Documento”. Para habilitar/desabilitar um componente utilize a função Mostrar componente passando no segundo parâmetro o valor lógico false para desabilitar e true para habilitar.
Caso a decisão seja NÃO utilize as mesmas funções apenas invertendo os parâmetros lógicos. Lembre-se que pode ser utilizado o “Copiar e Colar” (Crtl+C/Crtl+V). Feito isso, Clique com o botão direito no formulário, menu eventos, e associe o fluxo ao evento “Ao navegar” passe os parâmetros Origem e Destino pegando dos componentes Opções. Conforme ilustrado na figura abaixo:
253
254
Este fluxo pode ser obtido através do arquivo Mostrar ou Ocultar Componentes .FRZ. O componente chamado Origem possui um fluxo associado ao evento Ao Modificar:
Crie um fluxo chamado “mostrar componente”, este fluxo tem como objetivo exibir/ocultar os componentes Lista dinâmica - Fornecedor Origem, Gerencia Origem. Para melhor entendimento, o fluxo ficará da seguinte maneira: Crie um parâmetro de entrada para o fluxo chamado: Origem (Letras) para receber o valor do componente Opção - Origem do formulário.
254
255
No primeiro componente decisão (Está em Modo de Inserção ou Alteração?), utilize as funções “Ou”, “Está em modo de Inserção’ e “Está em modo de Alteração” para verificar se o formulário está em modo de inserção ou alteração. O montador de expressões ficará da seguinte maneira:
No segundo componente decisão (Origem = Interno?), utilize a função igual para verificar se o parâmetro origem é igual a I.
Caso a decisão seja SIM exibe o componente Gerencia Origem (função “Mostrar componente”) e oculta o componente Fornecedor.
Caso a decisão seja NÃO utilize as mesmas funções apenas invertendo os parâmetros lógicos. Lembre-se que pode ser utilizado o “Copiar e Colar” (Crtl+C/Crtl+V). Feito isso, Clique com o botão direito no componente Opções - Origem, menu eventos, e associe o fluxo ao evento “Ao modificar” passe o parâmetro Origem pegando do componente Opções - Origem. Conforme ilustrado na figura abaixo: 255
256
Este fluxo pode ser importado para o projeto através do arquivo mostrar componente.FRZ. Este formulário possui um componente chamado Destino que possui um fluxo associado ao evento Ao Modificar: Crie um fluxo chamado “mostrar componente”, este fluxo tem como objetivo exibir/ocultar os componentes Lista dinâmica - Fornecedor Origem, Gerencia Origem. Para melhor entendimento, o fluxo ficará da seguinte maneira:
Crie um parâmetro de entrada para o fluxo chamado: Origem (Letras) para receber o valor do componente Opção - Origem do formulário.
256
257
No primeiro componente decisão (Está em Modo de Inserção ou Alteração?), utilize as funções “Ou”, “Está em modo de Inserção’ e “Está em modo de Alteração” para verificar se o formulário está em modo de inserção ou alteração. O montador de expressões ficará da seguinte maneira:
No segundo componente decisão (Origem = Interno?), utilize a função igual para verificar se o parâmetro origem é igual a I.
Caso a decisão seja SIM exibe o componente Gerencia Origem (função “Mostrar componente”) e oculta o componente Fornecedor.
Caso a decisão seja NÃO utilize as mesmas funções apenas invertendo os parâmetros lógicos. Lembre-se que pode ser utilizado o “Copiar e Colar” (Crtl+C/Crtl+V). Feito isso, Clique com o botão direito no componente Opções - Origem, menu eventos, e associe o fluxo ao evento “Ao modificar” passe o parâmetro Origem pegando do componente Opções - Origem. Conforme ilustrado na figura abaixo:
257
258
Obs.: Este fluxo pode ser importado ao projeto através do arquivo mostrar destino.FRZ. Ao botão chamado Upload do Documento existe um fluxo associado ao evento Ao clicar: Crie um fluxo no evento ao clicar do botão “Upload do Documento”, no parâmetro de entrada deste fluxo defina a seguinte variavel “Numero do protocolo “, do tipo inteiro:
No processamento adicione a função “Upload” passando nulo no primeiro parâmetro, no segundo parâmetro definindo uma constante como letras “Upload - Gravar Caminho do Arquivo” (que vai ser a regra a chamada) e no ultimo parâmetro definindo o parâmetro de entrada. Abaixo como ficou:
258
259
Voltando no evento ao clicar do botão deve ser definido o parâmetro de entrada criado, selecionando como “campo”, sendo ele “fbb_pro_numero” como segue abaixo:
A regra que foi passada como segundo parâmetro da função upload recebe como parâmetro de entrada “Caminho do arquivo” do tipo letras e “Numero do protocolo” do tipo inteiro.
No primeiro processamento utilize a função “Executar Atualização”, selecionando “Atualização”, passando o número do protocolo do parâmetro de entrada com critério igualando ao campo “fbb_pro_numero” e definindo o conteúdo do “Caminho do documento” como o parâmetro de entrada, segue abaixo:
259
260
No segundo processamento utilize a função “Alerta aguardando ok” passando como parâmetro uma constante letras “Upload Realizado com Sucesso!!!”:
No terceiro processamento utilize a função “Atualizar Registro Corrente” como mostra abaixo:
Salve o fluxo na camada servidor e com o nome utilizado na função anterior chamado de “Upload - Gravar Caminho do Arquivo”. Obs.: Este fluxo pode ser importado para o projeto através do arquivo Upload - Upload.FRZ. Para o botão chamado Download do Documento existe um fluxo associado ao evento Ao Clicar: Crie um fluxo no evento ao clicar do botão “Download do Documento”, no parâmetro de entrada deste fluxo defina a seguinte variavel “Caminho do Arquivo“, do tipo letras:
260
261 Na decisão verifique se o caminho é nulo ou não utilizando a função “É nulo ou vazio” como mostra abaixo:
Caso o caminho seja nulo crie uma mensagem de iteração do tipo “erro” e defina uma constante no montador de expressões: “Não Existe Documento Anexado para Esse Protocolo”. Caso exista caminho, adicione um processamento contendo a função “Iniciar Download”, passando no primeiro parâmetro uma concatenação indicando o arquivo que vai ser efetuado o download, como o que temos armazenado é o caminho, quebramos o texto removendo as barras retornando o caminho em uma lista, e no segundo parâmetro pegamos o ultimo objeto da lista que contém o nome do arquivo com a extensão. Abaixo mostra a estrutura dessas funções:
Voltando no evento ao clicar do botão deve ser definido o parâmetro de entrada criado, selecionando como “campo”, sendo ele “fbb_pro_caminho_do_documento” como segue abaixo:
Obs.: Este fluxo pode ser importado para o projeto através do arquivo Download Download.FRZ.
261
262
Protocolos por período Tela para listar os processos de um período ou todos. Possui origem no relatório Protocolos por período. O relatório possui o seguinte layout:
Siga os passos para a constituição do relatório: 1. A partir da paleta de objetos, aba Relatório, clique em Novo; 2. Na tela Novo Relatório, selecione a opção Relatório em branco e clique no botão Ok; 3. Ative a Aba Dados e crie a consulta para o relatório: Select fbb_protocolo.fbb_pro_numero, fbb_protocolo.fbb_pro_ano, Case When fbb_protocolo.fbb_pro_tipo = 'S' Then 'Saída' When fbb_protocolo.fbb_pro_tipo = 'E' Then 'Entrada' End As Tipo, fbb_protocolo.fbb_pro_data_entrada, fbb_protocolo.fbb_pro_data_saida, fbb_tipo_de_documento.fbb_tip_descricao, fr_usuario.usr_nome As Usuario, Case When FornecedorDestino.fbb_for_id Is Null Then GerenciaDestino.fbb_ger_nome Else FornecedorDestino.fbb_for_nome End As Destino, Case When FornecedorOrigem.fbb_for_id Is Null Then GerenciaOrigem.fbb_ger_nome
262
263 Else FornecedorOrigem.fbb_for_nome End As Origem From fbb_protocolo Left Join fbb_tipo_de_documento On fbb_protocolo.fbb_tip_id = fbb_tipo_de_documento.fbb_tip_id Left Join fbb_fornecedor FornecedorOrigem On fbb_protocolo.fbb_for_id = FornecedorOrigem.fbb_for_id Inner Join fr_usuario On fbb_protocolo.usr_codigo = fr_usuario.usr_codigo Left Join fbb_gerencia GerenciaDestino On fbb_protocolo.fbb_ger_id_gerencia_destino = GerenciaDestino.fbb_ger_id Left Join fbb_gerencia GerenciaOrigem On fbb_protocolo.fbb_ger_id = GerenciaOrigem.fbb_ger_id Left Join fbb_fornecedor FornecedorDestino On fbb_protocolo.fbb_for_id_fornecedor_destino = FornecedorDestino.fbb_for_id Where fbb_protocolo.fbb_pro_data_entrada Between :data_inicial And :data_final /*WHERE_ADD*/ Order By fbb_protocolo.fbb_pro_numero /*ORDER_ADD*/
5. O critério STATUS é configurado através da tela Maker Params, acionada através do botão
com a seguinte consulta:
263
264
10. Clique em Ok para confirmar a consulta; 11. Ative a aba Desenho e desenvolva o seguinte layout:
264