Curso Delphi – Criando uma Aplicação do Início ao fim - Parte 12
Somando Valores e Campo Auto Incremento
Neste artigo irei demonstrar como somar o total dos itens e total do pedido, para isso iremos utilizar um campo agreggate e o evento OnValidate de alguns campos. Irei utilizar um campo auto incremento, para adicionarmos o numero do pedido.
OnValidate: É um evento do campo, ou seja, quando o campo recebe um determinado valor ele dispara o evento, para validar o campo.
Vamos utilizar esse evento para validarmos a quantidade e o valor unitário de cada item do nosso pedido, assim que ele receber a quantidade ele irá multiplicar pelo valor unitário, dando assim o total daquele item.
Abra o data module dmPedido e abra o cdsItens e selecione o campo quantidade e no Object Inspector selecione a aba Events e escolha o evento OnValidate e coloque o seguinte código:
procedure TdmPedido.cdsItensQUANTIDADEValidate(Sender: TField);
begin
With dmPedido.cdsItens do
begin
cdsItensTOTALITEN.AsFloat:=0;
cdsItensTOTALITEN.AsFloat:=
cdsItensUNITARIO.AsFloat * dmPedido.cdsItensQUANTIDADE.AsFloat;
end;
end;
Entendendo o código: Primeiro zeramos o campo TOTALITEN, caso ele possua algum valor, logo depois multiplicamos o campo UNITÁRIO pela QUANTIDADE e atribuímos o resultado ao campo TOTALITEN.
Vamos fazer o mesmo procedimento ao campo UNITARIO, adicionando o mesmo código anterior.
procedure TdmPedido.cdsItensUNITARIOValidate(Sender: TField);
begin
With dmPedido.cdsItens do
begin
cdsItensTOTALITEN.AsFloat:=0;
cdsItensTOTALITEN.AsFloat:=
cdsItensUNITARIO.AsFloat * dmPedido.cdsItensQUANTIDADE.AsFloat;
end;
end;
Assim se o usuário colocar a quantidade ou valor unitário ele irá multiplicar.
Agreggate: Este é um campo criado em memória para agregar valores, ou seja, precisamos saber qual o total do pedido, este campo agreggate irá somar todos os valores do campo TOTALITEN.
Abra o data module dmPedido e abra o cdsItens tecle com o botão direito do mouse sobre o field editor e escolha a opção New Field e preencha de acordo com a tela a seguir:
Dê OK e perceba que no Field Editor ele criou um novo campo totalpedido, mas percebemos também que este campo está separado dos outros, como demonstra a figura a seguir:
Selecione o campo totalpedido e mude a propriedade Active para True, feche o Field Editor e selecione o cdsItens e mude a propriedade AgreggatesActive para True. Ok acabemos de criar e configurar o campo agreggate, agora vamos faze uso deste campo, para isso abra o formulário frmCadVenda e selecione o DbEdit que representa o campo valor e mude a propriedade DataSource para dtsItens e a propriedade DataField para totalpedido. Pronto nosso campo agreggate está criado e já estamos fazendo uso do mesmo. Execute a aplicação e veja como ficou na figura a seguir:
Podemos perceber que assim que adicionamos um novo item e colocamos a quantidade e o valor unitário o campo totalpedido não recebe valor algum, isso ocorre porque o campo agreggate só começa a somar assim que o registro é validado, para resolvermos isso vamos colocar um código no evento OnExit do DbEdit da QUANTIDADE, coloque assim:
procedure TfrmCadVenda.DBEdit5Exit(Sender: TObject);
begin
dmPedido.cdsitens.next;
end;
Faça o mesmo no DbEdit UNITARIO:
procedure TfrmCadVenda.DBEdit6Exit(Sender: TObject);
begin
dmPedido.cdsitens.next;
end;
O que acabei de fazer é mandar ele ir para o próximo iten, mas como não há o próximo iten ele passa o registro de estado de edição para navegação, assim o campo agreggate é validado.
CAMPO AUTOINCREMENTO
Tenho recebido muitos emails me pedindo para implementar o campo auto incremento do pedido, é muito simples. Vamos criar um generator no banco de dados que nos servirá como referência.
Abra o IBExpert e selecione o nosso campo e na opção Generators dê Ctrl+N para gerarmos um novo generator, preencha a tela a seguir de acordo com a figura abaixo:
Precisamos criar uma tabela para receber o valor do generator temporariamente, crie uma tabela chamada codigo e crie um campo chamado ID, preencha um único registro com um número qualquer, como demonstra a figura a seguir:
Retorne ao Delphi e no nosso data module dmpedido coloque mais um SqlDataSet e mude as seguintes propriedades:
Vamos entender essa instrução SQL, Selecionamos através da função Gen_ID do firebird o generator GEN_CODPEDIDO, e adicionamos mais um ao valor do generator e atribuímos este valor ao campo NOVOID, a tabela código, nos serve apenas para gerar essa instrução SQL.
No evento OnNewRecord do ClientDataSet cdsCadPedido, coloque o seguinte código:
procedure TdmPedido.cdsCadPedidoNewRecord(DataSet: TDataSet);
begin
With sdsNovoID do
Begin
Open;
cdsCadPedidoIDPEDIDO.AsInteger:=sdsNovoIDNOVOID.AsInteger;
end;
end;
Toda vez que você abrir o SqlDataSet sdsNovoID ele irá retornar com o valor do generator.
Execute a aplicação e veja como ficou na figura a seguir:
Conclusão: Acabamos de implementar o campo OnValidate, Agreggate e auto incremento, de uma maneira simples, existem diversas maneiras como atribuir valores ao evento OnExit de um DbEdit, usar um campo calculado para agregar valores e criar uma trigger no banco de dados para executar um instrução para gerar o novo ID. Fico por aqui e no próximo artigo vamos melhorar a aparência do formulário. Até lá.