Mudanças entre as edições de "Roteiro de Treinamento"
(→Exercicio final) |
|||
Linha 31: | Linha 31: | ||
#Criação de cadastro mestre/detalhe. Ex: Grupo e Subgrupo | #Criação de cadastro mestre/detalhe. Ex: Grupo e Subgrupo | ||
#Criação de uma tela para excluir apenas as unidades selecionadas. | #Criação de uma tela para excluir apenas as unidades selecionadas. | ||
+ | #Criação dos testes unitários e de integração dos cadastros e funções feitos nos itens anterioes. | ||
+ | |||
==Como iniciar um cadastro com valor padrão== | ==Como iniciar um cadastro com valor padrão== |
Edição das 16h54min de 5 de outubro de 2023
Índice
- 1 REGRA NÚMERO UM: NUNCA RODAR SCRIPT SEM PEDIR PARA OS SUPERIORES
- 2 Estudo do Futura Server
- 3 Padronização e nomenclaturas da programação
- 4 REGRA NÚMERO DOIS: NUNCA USAR NÚMEROS MÁGICOS
- 5 TBasePesquisa, TbaseSistema e TBaseSelecao
- 6 Como iniciar um cadastro com valor padrão
- 7 Como validar um campo
- 8 6. Eventos OnGetText / OnSetText
- 9 Evento OnChange=
- 10 LookUp
- 11 Soma de valores no mestre pelo item (mestre/detalhe)
- 12 Relatório Simples
- 13 Relatório com agrupamento
- 14 Exercicio final
- 15 Impressões Dinâmicas
REGRA NÚMERO UM: NUNCA RODAR SCRIPT SEM PEDIR PARA OS SUPERIORES
Como regra interna da futura, NINGUEM PODE RODAR SCRIPT sem solicitação de seus superiores, de forma alguma!!!!!!!
Estudo do Futura Server
- Verificar as funcionalidades do sistema observando principalmente os padrões e funcionamento do mesmo.
- Telas importantes para consulta:
- Menu: Cadastro -> Estoque -> Unidade
- Menu: Cadastro -> Cadastro -> Clientes
- Menu: Vendas -> Pedido de vendas
Padronização e nomenclaturas da programação
REGRA NÚMERO DOIS: NUNCA USAR NÚMEROS MÁGICOS
Como regra interna da futura, NUNCA use "números mágicos" no código, de forma alguma!!!!!!!
Use sempre o tipo criado, juntamente com a função Ord();
TBasePesquisa, TbaseSistema e TBaseSelecao
TBasePesquisa: Classe responsavel pelas consultas no sistema, é utilizada para fazer herança.
TBaseSistema : Classe responsavel pelos cadastros no sistema, é utilizado para fazer herança.
TBaseSelecao : Classe responsavel pelos cadastros no sistema, onde é possivel fazer a marcação de registros selecionados, é utilizado para fazer herança.
Exercícios:
- Criação de cadastro simples. Ex: Tabela de Preço.
- Criação de cadastro mestre/detalhe. Ex: Grupo e Subgrupo
- Criação de uma tela para excluir apenas as unidades selecionadas.
- Criação dos testes unitários e de integração dos cadastros e funções feitos nos itens anterioes.
Como iniciar um cadastro com valor padrão
Para iniciar um cadastro com valor padrão, utilizamos um evento do DataSet chamado "OnNewRecord".
Toda vez que é iniciado a inclusão de um registro, conseguimos fazer algumas definições e jogar valores padrão em nossos campos.
EX
procedure TCad_BaseLegal.DataSetNewRecord(DataSet: TDataSet); begin Campo('UF_ORIGEM').Value := 'SP'; end;
Como validar um campo
Devemos validar um campo antes que esse registro seja enviado para o banco de dados. Para isso usamos um evento do DataSet chamado "BeforePost".
EX
procedure TCad_BaseLegal.DataSetBeforePost(DataSet: TDataSet); begin if not TPF_DataBase.FieldValid(Campo('DESCRICAO')) then raise TExceptionValidacao.Create('Preencha o campo descrição!'); end;
6. Eventos OnGetText / OnSetText
Os eventos OnGetText e OnSetText são muito utilizados quando temos um DbComboBox.
Com esses eventos conseguimos mostrar no DbComboBox uma descrição, enquanto ao enviar ao banco de dados ele armazena outros valor.
- OnGetText: Quando pegamos a informação contida no banco, conseguimos transformar em descrição.
- OnSetText: Através da descrição informada no DbComboBox conseguimos transformar em valor para armazenar no banco
Quando fazemos um DbComboBox por Ex, armazenamos no banco de dados como Smallint, mais para facilitar para o cliente, mostramos a descrição do valor. Obs: Utilizamos Array de constante para armazenar os valore.
EX
OnGetText
if (Sender.FieldName = 'DESTINO')Then Text := cBaseLegalDestino[TBaseLegalDestino(Sender.AsInteger)];
Se o campo que está sendo acionado for o campo "DESTINO", então acessamos a contante "cBaseLegalDestino" e pegamos a posição em que o valor correto está através do valor que está informado no campo então utilizamos "Sender.AsInteger".
OnSetText
if (Sender.FieldName = 'DESTINO') Then for X := Ord(Low(TBaseLegalDestino)) to Ord(High(TBaseLegalDestino)) do if (Text = cBaseLegalDestino[TBaseLegalDestino(X)])then begin Sender.Value := cBaseLegalDestino[TBaseLegalDestino(X)]; Break; end;
Se o campo que estiver sendo acionado for o campo "DESTINO" então percorremos a constante onde está armazenando a descrição para ver qual está selecionado, assim conseguimos saber qual o valor correto a informar na hora de enviar ao banco de dados.
Evento OnChange=
Evento acionado toda vez que é setado o valor para um determinado campo do DataSet.
EX
if Sender.FieldName ='DATA_EMISSAO' Then Campo('DATA_SAIDA_ENTRADA').Value := Campo('DATA_EMISSAO').Value;
Toda vez que setar um valor na data de emissão, o dataset chamará o evento.
O codigo acima, representa que ao setar um valor para a data de emissão, a data de saída/entrada receberá o mesmo valor que foi setado na data de emissão.
LookUp
Utilizado para trazer informações de outras tabelas quando estamos utilizando um objeto para cadastro.
EX
AddLookup('CADASTRO', 'ID', 'FANTASIA', 'FK_EMPRESA', 'Lkp_Empresa', ftString, 50, 'CHK_EMPRESA = S');
Comparação do campo "ID" da tabela CADASTRO com "FK_EMPRESA" da tabela PEDIDO para fazer a pesquisa e trazer o nome fantasia.
Parâmetros no exemplo
- CADASTRO : Tabela onde vai pesquisar o resultado.
- ID : campo da tabela passada como cadastro onde vai fazer a comparação
- FANTASIA : Campo que vai puxar o resultado
- FK_EMPRESA : Campo de comparação.
- Lkp_Empresa : Nome do campo que retorna. pode ser acessado para consultar o valor.
- ftString : Tipo de retorno.
- 50 : Tamanho máximo do retorno.
- 'CHK_EMPRESA = S' : Filtros para retorno.
Soma de valores no mestre pelo item (mestre/detalhe)
Utilizando o conceito de mestre/detalhe no sistema, conseguimos acessar o MESTRE pelo DETALHE.
Muito utilizado em telas como o PEDIDO DE VENDA, onde temos
- MESTRE : PEDIDO
- DETALHE: PEDIDO_ITEM
Temos a necessidade de somar no campo TOTAL_PRODUTOS, a soma do valor total de cada item.
Para isso usamos o evento "DtSetCalcReg" do DataSet.
Como definição, passamos o mestre como owner (dono) do detalhe. isso é importante para sabermos qual classe acessamos para passar os valores
EX
TMestre(Self.Owner).Campo('TOTAL_PRODUTOS').AsFloat := TMestre(Self.Owner).Campo('TOTAL_PRODUTOS').AsFloat +(Self.Campo('VALOR_UNITARIO').AsFloat * Self.Campo('QUANTIDADE').AsFloat);
Relatório Simples
Exercício: Monte um relatório simples utilizando o ReportBuilder.
Traga todos os produtos com pelo menos 5 campos, e seu valor da tabela de preço que deverá ser informada para trazer o valor correto.
Relatório com agrupamento
Exercício: Monte um relatório de agrupamento. Traga todas as vendas do sistema agrupado por cliente.
Exercicio final
/*---------------------TABELA DE PEDIDO DE VENDAS--------------------------------*/
- pk
- cliente
- status (Aberto, Baixado, Faturado, Cancelado)
- Empresa
- Nro do pedido (Sequencial)
- Soma total dos produtos
- Total final da venda
- Desconto
- Acrescimo
- Mostrar percentual de desconto sem gravar na base de dados
- Mostrar percentual de acrescimo sem gravar na base de dados
- Data de cadastro
- Data de faturamento
- Tipo de pedido (consta na tabela TIPO_PEDIDO, só deve aceitar tipo de pedido do tipo venda)
- Motivo de cancelamento (Apresentar quando for cancelar um pedido)
/*---------------------TABELA DE PEDIDO ITEM DE VENDAS--------------------------------*/
- pk
- ligação com produto (Quando abrir tela de pesquisa F5, apresentar a tela com descrição e referencia do produto apenas)
- ligação com tabela de preço
- ligação com codigo de barras do produto quando o usuário utilizar
- valor unitário
- quantidade
- Sequencia
- Valor do ICMS (Deixar o usuário informar manualmente)
/*-------------------------------------------------------------------------------*/
-- Criar uma tela de pedido de venda com os campos e funções acima. Crie funções para baixa de pedido.
-- Crie 1 modelo de relatório de pedido de vendas e só possibilite ele ser acessado quando o pedido estiver baixado,
caso ele clique em imprimir, coloca o pedido para faturado
Impressões Dinâmicas
(Usar um Gerenciador Interno de teste)
1 - Criar um modelo de impressão de pedido de venda dinâmico baseado no modelo fixo 115, porem com as seguintes alterações:
Dados do Cliente/Pedido:
- Adicionar campo Tabela de Preço;
Dados dos produtos:
- Aumentar tamanho da fonte do campo "Descrição" dos produtos;
- Retirar os campos de IPI%, NCM e ST;
- Trocar Referência pelo campo Código de Barras;
2 - Criar um modelo de impressão de pedido de venda dinâmico, baseado no relatorio: Relatorios > Cadastro > Estoque > Produto (Tipo: Lista), porem com as seguintes alterações:
- Retirar campos: Código de Barras, Peso Bruto, Peso Liquido, Estoque Saldo, Estoque Minimo, Estoque Maximo
- Incluir campos: Cor, Tamanho, Especificação
- Ordenar por Descrição