Sei sulla pagina 1di 44

http://www.planetadelphi.com.

br/artigo/150/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim Iremos comear nosso artigo, primeiro falando dos requisitos necessrios, primeiro requisito o banco de dados firebird, que pode ser encontrado em www.firebase.com.br, e tambm o IbExpert, que a ferramenta para manipular o banco de dados firebird e interbase, o ibExpert pode ser adquirido no seguinte endereo www.firebase.com.br Crie uma pasta chamada SisCom e uma subpasta chamada Banco e abra o IbExpert e d um clique no boto , Create Database e preencha a tela de acordo coma tela a seguir:

Obs.: o Password masterkey

10/11/2011 15:11

1 de 1

http://www.planetadelphi.com.br/artigo/150/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Tecle em Ok e preencha a tela de acordo com a tela a seguir:

Tecle em Ok e registre o Banco de dados no IbExpert. No Database Explorer selecione a opo tables e com o boto direito do mouse selecione a opo New Table ou tecle Ctrl+N e em New Table coloque CLIENTE e nos Field, preencha como a tabela abaixo:

Obs.: para marcar o PK, basta teclar a barra de spao. Aqui estamos denominando que o campo IDCLIENTE chave primria.

10/11/2011 15:13

1 de 1

http://www.planetadelphi.com.br/artigo/150/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Chave Primria um atributo que permite identificar uma nica ocorrncia de um registro em uma tabela. Desta forma, seu contedo deve ser nico, exclusivo e imutvel para cada linha da Tabela. Todos os demais atributos da entidade devem depender unicamente deste atributo. Caso no exista um atributo que possa assumir a posio de chave primria, preciso cri-lo. Veja que nem todo campo uma boa chave. Normalmente utilizamos campos numricos por serem localizados mais rapidamente pelos bancos de dados. Valores alfanumricos grandes tm acesso mais lento. Desta forma, fica claro que toda tabela deve conter uma chave primria, mas lgico que toda regra tem a sua exceo. Eventualmente uma chave primria pode conter mais de um atributo. Neste caso, a chave conter mais de um atributo, mas ser considerada a chave da tabela. A unio dos dois atributos que deve garantir o acesso a uma nica linha da entidade. Este caso de chave primria chamado de Chave Concatenada. Crie uma nova tabela e d o nome de PRODUTO e preencha de acordo com a tabela a seguir:

Crie um nova tabela e d o nome de PEDIDO e preencha de acordo com a tabela a seguir:

Crie um nova tabela e d o nome de ITENS:

Tipos de Dados O banco de dados firebird possui vrios tipos de dados que so suportados por ele. Abordaremos os tipos de dados que podem serem usados no firebird.

10/11/2011 15:14

1 de 1

http://www.planetadelphi.com.br/artigo/150/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Char e Varchar Os tipos CHAR e VARCHAR so usados para armazenar informaes textuais (letras, nmeros, caracteres especiais e etc). A diferena entre os dois tipos que o CHAR sempre recupera a string armazenada com espaos direita, mesmo que voc no utilize todo o espao definido para o campo. J o VARCHAR recupera a string sem espaos, ou seja, com o mesmo tamanho que foi inserida. O uso de campos CHAR recomendado quando os valores tm seu tamanho determinado previamente como, por exemplo, para armazenar CEPs ou siglas de UFs. DATE: O Campo Date serve para armazenar Data. TIME: O Campo Time serve para armazenar a hora. TIMESTAMP: a unio do campo Date com o Time. INTEGER e SMALLINT: O tipo INTEGER armazena valores inteiros com sinal; ocupa 32 bits e permite uma faixa de valores entre - 2.147.483.648 e 2.147.483.647. O tipo SMALLINT tambm armazena inteiros com sinal, mas ocupa 16 bits, permitindo uma de -32.768 at 32.767. FLOAT: O Campo FLOAT utilizado para armazenar valores de ponto flutuante; ocupam 32 bits. DOUBLE PRECISION: um Float duplo. armazenado em 64 bits, o que permite uma faixa maior de valores. Assim, como o Float, o tipo DOUBLE PRECISION sofre com problemas de preciso, pois tambm utiliza a metodologia do IEEE. NUMERIC E DECIMAL: Os tipos de dados NUMERIC e DECIMAL so os mais indicados para armazenar valores fracionrios, nos quais a preciso importante na recuperao dos dados. Ambos os tipos NUMERIC e DECIMAL so declarados com dois parmetros: precision e scale. O parmetro scale (escala) determina quantos dgitos depois da vrgula sero armazenados. O parmetro precision especifica o nmero mximo de dgitos, tanto inteiros como fracionrios. BLOB: Voc pode armazenar desde textos simples at arquivos binrios. Teoricamente o campo BLOB no tem limite de tamanho. Na prtica, claro, este tamanho pode ser limitado por outros fatores como, por exemplo, o espao disponvel em disco. Concluso: Acabamos de fazermos nosso banco de dados SisCom, colocamos apenas quatro tabelas, e estamos definindo que todo pedido ter que ter um cliente, esse cliente alimentado pelo campos IDCLIENTE. E os pedidos tero seus itens que originaram da tabela de produto e ser reconhecido pelo campo IDPRODUTO. At o prximo artigo de continuao.

10/11/2011 15:14

1 de 1

http://www.planetadelphi.com.br/artigo/152/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 2

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 2 Nesse nosso segundo artigo iremos criar o nosso menu, estarei utilizando o componente Ribbon, esse componente nos permite criar uma menu muito interessante que similar com o do Word 2007, esse componente comeou no Delphi 2009. Neste artigo estarei utilizando o Delphi 2010, voc poder fazer o donwload no site da codegear https://downloads.embarcadero.com/free/delphi voc precisa ser registrado no site para fazer o download. Inicie o Delphi e clique em File, New, Vcl form Application

Salve a aplicao clicando no boto Save all, salve-o formulrio como UfrmPrincipal na pasta SisCom e o projeto salve-o como SisCom. Mude a propriedade Caption para SisCom e a propriedade name para frmPrincipal do nosso formulrio. Coloque no formulrio o componente ActionManager da paleta Additional e logo em seguida o componente ImageList da paleta Image e d dois clique sobre o componente e na tela que se abre clique em Add e v ao diretrio C:\Program Files\Common Files\CodeGear Shared\Images\GlyFX\Icons\XP\BMP\16x16 neste endereo voc encontrar muitos cones que voc pode utilizar, escolha alguns e clique em abrir. Selecione o componente ActionManager e mude a propriedade images para ImageList1. D dois cliques sobre o New Action e mude as seguintes componente ActionManager e na tela que se abre clique no boto propriedades:

10/11/2011 15:16

1 de 1

http://www.planetadelphi.com.br/artigo/152/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Clique no boto

New Action e mude as seguintes propriedades:

Selecione o (No Category) e clique no boto

New Action e mude as seguintes propriedades:

Clique no boto

New Action e mude as seguintes propriedades:

Feche o ActionManager e clique com o boto direito do mouse no menu superior do componente Ribbon como demonstra a figura abaixo:

10/11/2011 15:17

1 de 1

http://www.planetadelphi.com.br/artigo/152/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Escolha Add Tab e mude a propriedade Caption para Cadastro. Dentro do tab criado clique como o boto direito do mouse e abrir a seguinte tela:

Escolha Add Group e mude a propriedade Caption para Cadastro. Adicione mais um Tab e mude a propriedade Capition para Pedidos e adicione mais um grupo e mude a propriedade caption para Pedidos. Agora abra o ActionManager e selecione a categoria Cadastro e arraste ao Cliente para o grupo de Cadastro como mostra a figura a seguir:

faa o mesmo com ao Produto, e arraste para o grupo Pedidos as aes PDF e Consulta Pedidos. Selecione o componente Ribbon e mude a propriedade Caption para SisCom Sistema Comercial. Com o boto direito do mouse sobre o componente Ribbon escolha a opo Add Application Menu, ele ir criar um atalho para que o usurio acesse os itens mais recentes.

10/11/2011 15:18

1 de 1

http://www.planetadelphi.com.br/artigo/152/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Sua aplicao dever ficar assim:

Concluso: Podemos perceber que a criao de menus muito simples, algo intuitivo, voc poder usar tambm um Main Menu, ou um toobar, mas resolvi escolher o que de mais recente no Delphi. Espero que vocs estejam gostando e por favor, me d um feedback para que eu possa ir melhorando os prximos artigos.

10/11/2011 15:18

1 de 1

http://www.planetadelphi.com.br/artigo/153/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 3

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 3 Conectando com o Banco de Dados Siscom.fdb Neste artigo estarei mostrando como fazer a conexo com o banco de dados, para isso irei utilizar a tecnologia de acesso a dados DbExpress, tecnologia esta que unidirecional. O que vem a ser o UNIDIRECIONAL, interpretado por muitas pessoas como "o problema" no momento de desenvolver um projeto? A nica navegao permitida que podemos realizar em um DataSet do dbExpress a navegao do tipo IR AO PRXIMO (o comando Next de uma query por exemplo), ou seja, ir de registro a registro do incio para o final do DataSet. Alm disso, estes DataSets nos permitem apenas a visualizao dos dados para leitura (dados contidos em uma base de dados relacional). Com essas caractersticas temos, ao meu ver, a principal caracterstica dos DataSets dbExpress. Eles so extremamente leves (ou seja, observamos uma alta performance de acesso a banco de dados, pois no existem tarefas extras para suportar o cursor bidirecional, buffering de registros, entre muitos outros). Neste momento, vale "lanar" uma observao interessante. Se tentarmos editar, ou excluir, ou inserir um registro no dbExpress ser gerada uma exceo! Vamos enfim fazer a conexo. V em File, New, Other, Delphi files e escolha Data Module ou tecle F6 e aparecer o ID Inseght, digite Data Module e escolha a opo Data Module no new itens. Isto s ser possvel se estiver usando o Delphi 2010, esse um novo recurso do mesmo. Mude a propriedade name para dmPrincipal e salve-o como UdmPrincipal. No Data Explorer a sua direita selecione a opo firebird e clique com o boto direito do mouse como demonstra a figura a seguir:

10/11/2011 15:20

1 de 1

http://www.planetadelphi.com.br/artigo/153/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Escolha Add New Connection e preencha a tela que se abre de acordo com a tela a seguir:

D OK. E D dois clique na opo Firebird e escolha a conexo ConexaoSisCom clicando com o boto direito do mouse e na tela que se abre escolha Modify Connection, na tela que abre preencha a tela de acordo com a figura a seguir:

O Password masterkey, tecle em Test Connection para testar a conexo, se d tudo certo, tecle em ok, pronto a nossa conexo j est pronta. Para terminar basta arrastar a conexo para o data module deixando-o dmPrincipal assim:

Caso voc esteja utilizando uma verso anterior ao Delphi 2009, basta colocar o componente SqlConnection no data module e dar dois clique no mesmo e preencha a tela que se abre como mostra a figura 03. Concluso: Neste artigo procurei mostrar como fazer a conexo, e como funcionar a tecnologia de acesso a dados DbExpress, no prximo artigo irei fazer o formulrio modelo, que servir de base para os nossos formulrios. Caso tenham alguma dvida, meu e-mail rubensantunes@yahoo.com.br.
10/11/2011 15:21

1 de 1

http://www.planetadelphi.com.br/artigo/154/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 4 Formulrio Modelo Neste artigo irei criar um formulrio que servir como padro, ou seja, iremos herdar deste formulrio, para criarmos os formulrios de cadastro de cliente e produto, para que no precisemos fazer vrios formulrios diferentes, isto serve tambm para o usurio se identificar melhor com o layout do formulrio. Crie um novo formulrio em File, New, Form Delphi e salve-o com UfrmModelo e mude a propriedade name para frmModelo. Coloque um componente panel da paleta standard e apague o contedo da propredade caption e mude a propriedade align para altop. Adicione ao panel sete componentes Bitbtn da paleta additional. Coloque um componente ImageList da paleta Win32 e d dois clique sobre o mesmo e tecle no boto Add e coloque algumas figuras a sua escolha da pasta C:\Program Files\Common Files\CodeGear Shared\Images\GlyFX\Icons \XP\BMP\16x16 Coloque agora no formulrio um DataSource da paleta DataAccess e mude a propriedade name para DTS, logo depois Coloque o componente BalloonHint da paleta Additional e por fim um ActionList da paleta Standard. Selecione o componente ActionList e mude a propriedade images para ImageList1, d dois clique no ActionList e tecle na setinha para baixo do lado do boto New Action e abrir a seguinte tela:

Escolha New Standard Action ou tecle Ctrl+Ins, na tela que se abre escolha os itens selecionados na tela a seguir:

Selecione os itens marcados dentro do dataset. Qual a idia aqui? A idia e fazer o controle dos botes direto no ActionList, assim ele ir controlar os botes, ou seja, se o usurio clicar no boto novo ele desabilita automaticamente o botes excluir, os botes funcionaram de acordo com o estado da tabela. Assim que

10/11/2011 15:24

1 de 1

http://www.planetadelphi.com.br/artigo/154/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

automaticamente o botes excluir, os botes funcionaram de acordo com o estado da tabela. Assim que selecionar os itens clique em Ok e selecione a primeira ao e mude as seguintes propriedades:

Selecione o primeiro boto e mude as seguintes propriedades:

10/11/2011 15:25

1 de 1

http://www.planetadelphi.com.br/artigo/154/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Selecione o primeiro boto e mude as seguintes propriedades:

O formulrio dever ficar assim:

10/11/2011 15:28

1 de 1

http://www.planetadelphi.com.br/artigo/154/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Vamos agora implementar os botes, d dois clique no componente ActionList e selecione a ao AC_Novo e d dois clique sobre ela e abrir o editor de cdigo do Delphi, coloque o seguinte cdigo a seguir: view sourceprint?
1.procedure TfrmModelo.AC_NovoExecute(Sender: TObject); 2.begin 3. DTS.DataSet.Append; 4.end;

Na ao AC_Alterar coloque o seguinte cdigo: view sourceprint?


1.procedure TfrmModelo.AC_AlterarExecute(Sender: TObject); 2.begin 3. DTS.DataSet.Edit; 4.end;

Na ao AC_Excluir coloque o seguinte cdigo: view sourceprint?


01.procedure TfrmModelo.AC_ExcluirExecute(Sender: TObject); 02.begin 03. if not DTS.DataSet.IsEmpty then 04. begin 05. DTS.DataSet.Delete; 06. if DTS.DataSet is TClientDataSet then 07. TClientDataSet(DTS.DataSet).ApplyUpdates(0); 08. end; 09.end;

Nesta ao excluir verificamos se o registro existe atravs da propriedade IsEmpty, logo depois apagamos o mesmo pelo delete e logo depois gravamos no banco a excluso usando o mtodo ApplyUpdates. Na ao AC_Cancelar coloque o seguinte cdigo: view sourceprint?
1.procedure TfrmModelo.AC_CancelarExecute(Sender: TObject); 2.begin 3. TClientDataSet(DTS.DataSet).CancelUpdates; 4.end;

Na ao AC_Gravar coloque o seguinte cdigo: view sourceprint?


1.procedure TfrmModelo.AC_GravarExecute(Sender: TObject); 2.begin 3. TClientDataSet(DTS.DataSet).ApplyUpdates(0); 4.end;

Crie duas novas aes no actionList e d o nome de Pesquisa e Sair, Implemente o ltimo boto com a ao sair , colocando assim: view sourceprint?
1.procedure TfrmModelo.AC_SairExecute(Sender: TObject); 2.begin 3. Close; 4.end;

10/11/2011 15:31

1 de 1

http://www.planetadelphi.com.br/artigo/154/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

A ao do boto pesquisar implementaremos futuramente. Vamos imaginar uma situao, o usurio est digitando um novo registro, de repende ele deseja fechar o formulrio sem antes salvar ou cancelar, ns no deixaremos que isso acontea, para isso selecione o frmModelo e no evento onClose coloque o seguinte cdigo: view sourceprint?
01.procedure TfrmModelo.FormClose(Sender: TObject; var Action: TCloseAction); 02.begin 03. if dts.state in [dsEdit, dsInsert] then 04. begin 05. Action:= caNone; 06. ShowMessage(' necessrio Voc Salvar ou Cancelar. '); 07. frmModelo.SetFocus; 08. end; 09.end;

Neste cdigo estou verificando se o Dataset est em estado de edio ou insero, caso ele esteja, eu no permito que o usurio feche o formulrio. Na prximo artigo, estarei falando sobre o formulrio de cadastro de cliente e formulrio. Abrao e at l. Rubens Antunes - Autor do Livro: Delphi Faa Uma Aplicao Comercial

10/11/2011 15:31

1 de 1

http://www.planetadelphi.com.br/artigo/156/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 5 Formulrio Cadastro Ol nesse quinto artigo, estarei escrevendo sobre o formulrio de cadastro de Cliente e Produto. Vamos constru-lo. Abra o Delphi e v em File, New, Other e abrir o repositrio do Delphi, o que vamos fazer aqui herdar o formulrio modelo, para aproveitarmos as mesmas funcionalidades, sem precisarmos digit-las novamente. Com o repositrio aberto escolha a opo inheritable items, podemos perceber que a direita a pareceu o formulrio modelo, d dois clique no mesmo e salve-o formulrio como UfrmCadCliente e mude as seguintes propriedades:

Antes de continuarmos, precisamos criar os componentes que iro dar manuteno ao formulrio, para isso v me File, New, Other e em Delphi Files escolha Data Module, d o nome de dmCliente e salve-o como UdmCliente. Tecle em Alf + f11 e na tela que se abre escolha UdmPrincipal, ou seja estamos instanciando o data module dmPrincipal para que possamos fazer uso dele. Adicione em nosso data module o componente SqlDataSet da Paleta DbExpress e mude as seguintes propriedades: SqlConnection: dmPrincipal.ConexaoSisCom Obs.: Caso no aparea nada a frente do SqlConnection voc deve apenas abrir o dmPrincipal Name: sdsCadCliente CommandText: Clique na reticncias a frente e na tela que se abre digite assim: view sourceprint?
01.select 02.BAIRRO, 03.CELULAR, 04.CEP, 05.CIDADE, 06.CPF_CNPJ, 07.ENDERECO, 08.IDCLIENTE, 09.NOME, 10.RG_INSC, 11.TELEFONE1, 12.TELEFONE2, 13.UF 14.from CLIENTE 15.Where IDCLIENTE =:pIDCLIENTE

10/11/2011 15:33

1 de 1

http://www.planetadelphi.com.br/artigo/156/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Isto uma instruo SQL, que nos retorna apenas um cliente por vez, devido a sua clausula where, que vai buscar a chave primria da tabela. Essa clausula cria um parmetro chamado pIDCLIENTE, esse parmetro ser alimentado com isso o select nos retorna o registro desejado. Clique em OK e abra a propriedade Params, abrir a seguinte tela:

Este o nosso parmetro, selecione o parmetro e mude as seguintes propriedades:

DataSetProvider: Este componente responsvel em transformar o SQL em DataPacket, o qual o Clientdataset entende. Coloque no Data Module um DataSetProvider da paleta DataAccess e altere as seguintes propriedades:

ClientDataSet: Esse o cara! O melhor componente do Delphi, as pesquisas so feitas em milsimos de segundos, ele recebe as informaes provindas do DataSetProvider, ele s entende o formato DataPacket. Podemos tambm guardar informaes XML nele e trabalhar desconectado, ou seja, o usurio est realizando uma venda, de repente o servidor cai, imediatamente ele salva os arquivos e um XML e depois atualiza o banco de dados. Coloque no Data Module um ClientDataSet da paleta DataAccess e altere as seguintes propriedades:

D dois clique no componente cdsCadCliene e abrir o fields Editor com o boto direito do mouse escolha add all fields, e todos os campos apareceram. Selecione agora o formulrio frmCadCliente e selecione o campo IDCLIENTE no fields editor e arraste-o para o formulrio. Continue arrastando todos os campos deixando o formulrio de acordo com a figura a seguir:

10/11/2011 15:33

1 de 1

http://www.planetadelphi.com.br/artigo/156/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Podemos perceber que ele criou um novo DataSource, mas ns no iremos faze uso do mesmo, por isso apague-o e selecione o comoponente DTS e mude a sua propriedade DataSet para dmCliente.cdsCadCliente, caso no esteja aparecendo nada na propriedade DataSet, voc deve instanciar o formulrio clicando em Alt+F11 e na tela que se abre escolha dmCliente. Selecione agora todos os DbEdit e altere a propriedade DataSource para DTS. Selecione o formulrio frmCadCliente e v no evento OnCreate e coloque o seguinte cdigo: view sourceprint?
1.procedure TfrmCadCliente.FormCreate(Sender: TObject); 2.begin 3.inherited; 4.dmCliente:=TdmCliente.Create(self); 5.dmCliente.cdsCadCliente.Open; 6.end;

Aqui estamos criando o data Module dmCliente e logo depois abrindo o ClientDataSet. Selecione agora o formulrio frmPrincipal e d dois cliques no Action Maneger escolha a opo Cadastro e d dois clique na opo cliente e coloque o seguinte cdigo: view sourceprint?
01.procedure TfrmPrincipal.AC_ClienteExecute(Sender: TObject); 02.begin 03.try 04.frmCadCliente:=TfrmCadCliente.create(self); 05.frmCadCliente.ShowModal; 06.finally 07.freeAndNil(frmCadCliente); 08.end; 09.end;

Voc precisa tambm instanciar o frmCadCliente no formulrio principal, para isso clique em Alt+F11 e na tela que se abre escolha frmCadCliente. Ok, Voc pode Salvar o projeto e execut-lo e inserir novos registros, alter-los e grav-los O formulrio de cadastro de Produto do mesmo jeito, como forma de aprendizado esse formulrio vou deixar para voc mesmo faz-lo, ele seguir o mesmo padro do formulrio de cadastro de cliente. No prximo artigo estarei falando de pesquisa, ou seja, como visualizar os dados j cadastrados. At o prximo.

10/11/2011 15:34

1 de 1

http://www.planetadelphi.com.br/artigo/157/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 6 Pesquisa Neste artigo irei mostrar como fazer pesquisa no Delphi, algo muito simples e interessante. Iremos comear utilizando Filtro, na continuidade do curso irei demonstrar como criar um ClientDataSet dinmico. Abra o Data Module dmCliente e adicione no mesmo o componente Sqldataset da paleta DbExpress e tecle Alt+F11 e instancie em nosso data module o UdmPrincipal, logo depois na propriedade SqlConnection do sqldataSet escolha dmPrincipal.ConexaoSisCom, e mude a propriedade name para sdsPesqCliente, fazendo isso tecle na reticncias em frente a propriedade CommandText e na tela que se abre, preencha de acordo com os dados a seguir: view sourceprint?
01.select 02.NOME, 03.BAIRRO, 04.CELULAR, 05.CEP, 06.CIDADE, 07.CPF_CNPJ, 08.ENDERECO, 09.IDCLIENTE, 10.RG_INSC, 11.TELEFONE1, 12.TELEFONE2, 13.UF 14.from CLIENTE

Neste select estamos trazendo todos os registros da tabela cliente. Adicione em nosso data module dmcliente o componente DataSetProvider e altere as seguintes propriedades:

Adicione tambm um ClientDataSet e altere as seguintes propriedades:

Aps Conectarmos os componentes crie um novo formulrio em File/new/Form Delphi e mude a propriedade name para frmPesquisa e salve-o como UfrmPesquisa. Adicione em nosso formulrio um Combobox da paleta Standard e altere a propriedade name para cbbCampos, este componente receber todos os campos de nossa tabela cliente, adicione tambm um label da paleta Standard e mude a propriedade Caption para Escolha Um Campo. Coloque tambm um Edit da paleta Standard e mude a propriedade name para edtPesquisar e depois um label logo em cima do edtPesquisar e mude a propriedade caption para Valor a Pesquisar. Coloque um DbGrid e mude a propriedade name para dbgPesquisa. Coloque um DataSource e mude a propriedade name para Dts. Seu formulrio dever ficar assim:

10/11/2011 15:36

1 de 1

http://www.planetadelphi.com.br/artigo/157/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

DataSource e mude a propriedade name para Dts. Seu formulrio dever ficar assim:

Vamos agora codificar, selecione o formulrio frmPesquisa e no evento OnShow coloque o seguinte cdigo: view sourceprint?
01.procedure TfrmPesquisa.FormShow(Sender: TObject); 02.var 03.I: Integer; 04.begin 05.for I := 0 to (Dts.DataSet.FieldCount)-1 do 06.begin 07.if Dts.DataSet.Fields[I].DataType in [ftString,ftWideString,ftFixedChar] then 08.cbbCampos.Items.Add(Dts.DataSet.Fields[I].FieldName); 09.end; 10.end;

Este evento disparado assim que o formulrio for criado. Ele traz todos os campos da tabela, representado pelo for, a propriedade FieldCount, representa a total de campos e o -1 para percorrer todos os campos, logo em seguida fazemos uma condicional, ou seja, queremos apensas os campos do tipo String ou Char representado pelo DataType, ou seja o tipo do campo, se ele for verdadeiro ele adicionar atravs da propriedade add os campos na propriedade items, a mesma que possue no comboBox. j o Dts.DataSet.Fields[I].fieldName o nome do campo provindo do DataSet.

10/11/2011 15:37

1 de 1

http://www.planetadelphi.com.br/artigo/157/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Selecione o EdtPesquisar e coloque o seguinte cdigo no evento OnKeyPress: view sourceprint?


01.procedure TfrmPesquisa.edtPesquisarKeyPress(Sender: TObject; var Key: Char); 02.begin 03.1. if key = #13 then // #13 o smbolo que representa a tecla Enter 04.2. begin 05.3. if (cbbCampos.Text <> EmptyStr) and //Verifico se o comboBox foi preenchido 06.4. (edtPesquisar.Text <> EmptyStr) then //verifico se o edtPesquisar possue algum valor 07.5. begin 08.6. Dts.DataSet.Filter := 'Upper('+cbbCampos.Text+') like '+ //Passo os valores a 09.pesquisar na propriede Filter 10.7. QuotedStr(UpperCase(edtPesquisar.Text)+'%'); 11.8. Dts.DataSet.Filtered := True; //Ativo a propriedade Fieltered 12.9. if not Dts.DataSet.Active then //Se o filtro no estiver ativo, eu apenas abro o DataSet 13.10. Dts.DataSet.Open; 14.11. end; 15.12. end; 16.end;

linha 1: Eu determino que assim que o usurio teclar Enter o cdigo ser executado. linha 3 e 4: Verifico se o comboBox est vazio e o edit tambm, se ele estiver ele ir sair do if. Linha 6: Passamos a instruo SQL pra o filtro. Linha 8: Apenas ativo o filtro. Linha 9 e 10: Se o filtro no estiver ativo, apenas abro a tabela; Selecione agora o DbgPesquisa e coloque o seguinte cdigo no evento OnClose: view sourceprint?
1.procedure TfrmPesquisa.dbgPesquisaDblClick(Sender: TObject); 2.begin 3.Close; 4.end;

No formulrio frmCadCliente na Ao Pesquisar coloque o seguinte cdigo: view sourceprint?


01.procedure TfrmCadCliente.AC_PesquisarExecute(Sender: TObject); 02.begin 03.inherited; 04.try 05.frmPesquisa:=TfrmPesquisa.Create(self); 06.frmPesquisa.Dts.DataSet:=dmCliente.cdsPesqCliente; 07.frmPesquisa.ShowModal; 08.finally 09.With dmcliente.cdsCadCliente do 10.begin 11.Close; 12.FetchParams; 13.Params.ParamByName('pIDCLIENTE').AsInteger:= 14.dmCliente.cdsPesqClienteIDCLIENTE.AsInteger; 15.Open; 16.end; 17.freeAndNil(frmPesquisa); 18.end; 19.end;

10/11/2011 15:38

1 de 1

http://www.planetadelphi.com.br/artigo/157/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Neste cdigo estamos criando o formulrio frmPesquisa e logo depois passando o qual o Dataset que ele ir utilizar, ou seja, voc pode criar o cadastro de Produto e utilizar o mesmo formulrio de pesquisa, trocando apenas o Dataset do DataSource. Execute a aplicao. Como forma de aprendizado crie o formulrio de cadastro de produto, ele seguir o mesmo padro do formulrio de cadastro de cliente e na hora de pesquisar basta apenas na hora de chamar o formulrio de pesquisa mudar o Dataset do nosso DataSource Dts. Concluso: Neste artigo eu procurei fazer algo simples, mas com bastante produtividade, uma vez que os dados j esto em memria no h a necessidade de pesquisarmos mais no banco de dados, sendo que, quando precisarmos fazer uma busca mais detalhada, a sim teremos que usar as instrues SQL. No prximo artigo estarei escrevendo sobre campo autoIncremento, Abrao e at l. Por: Rubens Antunes Autor do Livro: Delphi Faa Uma Aplicao Comercial

10/11/2011 15:39

1 de 1

http://www.planetadelphi.com.br/artigo/161/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 7

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 7 Campo Auto incremento e Captura de erros Ol, nesse artigo estarei escrevendo sobre campo auto incremento, como criar e como utilizar esse campo. Podemos perceber que o campo cdigo do cliente precisa ser colocado na mo, ou seja, no existe nenhum mtodo para alimentar o cdigo automaticamente, para isso iremos utilizar o generators. Abra o IbExpert e selecione o nosso banco de dados SisCom.fdb e logo depois clique em generators e tecle Ctrl+N ele criar um novo generator, em name mude para Gen_IDCliente e em value coloque 100, pronto, o nosso generator j est criado e alimentado, a nossa contagem comear de 100. Precisamos de uma tabela que sirva para armazenar o valor temporariamente, crie um nova tabela com o nome de cdigo e campo ID do tipo integer, coloque apenas um registro com nmero 1. Retornando ao Delphi, abra o Data Module dmCliente e adicione o componente SqldataSet da paleta DbExpress e altere as seguintes propriedades:

Esta instruo SQL nos retorna o ltimo generator mais 1 atravs do Gen_ID. D dois clique no sdsNovoID e adicione o campo NOVOID no Fields editor. Selecione o componente cdsCadCliente e v no evento OnNewRecord e digita o seguinte cdigo: view sourceprint?
1.procedure TdmCliente.cdsCadClienteNewRecord(DataSet: TDataSet); 2.begin 3.sdsNovoID.Close; 4.sdsNovoID.Open; 5.cdsCadClienteIDCLIENTE.AsInteger:=sdsNovoIDNOVOID.AsInteger; 6.end;

Como podemos perceber, criar um campo auto incremento muito simples, ou seja, o generator armazena um determinado valor e este select apenas busca esse valor e acrescentar mais 1.

10/11/2011 15:42

1 de 1

http://www.planetadelphi.com.br/artigo/161/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Captura de Erros O ClientDataSet tem erros silenciosos, ou seja, ele deixa de gravar e no avisa, para isso precisamos fazer que ele nos avise. Iremos utilizar o evento OnReconcileError do ClientDataset, vamos fazer um exemplo selecione o cdscadcliente e no Field editor aberto selecione o campo ENDERECO e passe para true a propriedade Required, ou seja, estamos exigindo que o usurio no deixe em branco o campo ENDERECO, agora com cdscadCliente selecionado v no evento OnReconcileError e coloque o seguinte cdigo: view sourceprint?
1.procedure TdmCliente.cdsCadClienteReconcileError(DataSet: TCustomClientDataSet; 2.E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction); 3.begin 4. ShowMessage(E.Message); 5.end;

Posicione o mouse em cima do ShowMessage e tecle Ctrl+Shift+A e coloque a unit Dialogs em nosso projeto. Execute a aplicao e inclua um novo cliente sem colocar dado nenhum no endereo ele dar a mensagem de erro:

Existe melhores maneiras de tratar os erros, ou seja, traduzindo as mensagens para portugus, mas a inteno deste artigo apenas voc conhecer como tratar erros. Concluso: Neste artigo estou mostrando como criar um campo auto incremento e como utiliz-lo e como tratar erros no ClientDataSet, no prximo artigo estarei demonstrando como criar Relacionamentos. Abrao e at l.

10/11/2011 15:42

1 de 1

http://www.planetadelphi.com.br/artigo/164/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 8

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 8 Relacionamento Vamos criar o relacionamento do nosso projeto, mas o que um relacionamento? quando uma tabela fica depedente da outra, ou melhor quando uma tabela pai tem vrios filhos, e aonde pai vai os filhos iram. Crie um novo data module em File, New, Other, Delphi Files e escolha Data Module, D o nome de dmPedido e salve-o como UdmPedido. Tabela Pai Adicione ao data module o componente sqldataset e mude as seguintes propriedades:

Obs.: Caso no aparea nada na propriedade SqlConnection voc deve instanciar o data module dmPrincipal clicando em Alt+F11. Adicione agora em nosso data module dmPedido o componente DataSetProvider e mude as seguintes propriedades:

Adicione o componente ClientDataSet e mude as seguintes propriedades:

Tabela Filho

10/11/2011 15:45

1 de 1

http://www.planetadelphi.com.br/artigo/164/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Adicionem um componente SqldataSet e mude as seguintes propriedades:

Um fator importante que na tabela de itens no haver DataSetProvider, iremos passar as informaes atravs da propriedade DataSetField do ClientDataSet. Adicione ento o componente ClientDataSet e mude a propriedade name para cdsItens. O Relacionamento se dar atravs da clausula Where da instruo Sql, podemos perceber que as duas instrues so idnticas. Aqui estamos pedindo que nos traga todos os itens o qual o IDPEDIDO seja igual ao da tabela sdsCadPedido. Para que o ClientDataSet entenda esse relacionamento precisamos de um DataSource para fazer esse ligamento. Adicione ento um DataSource e mude a propriedade name para dtsRelacionamento. Vamos definir agora o parmetro, selecione o componente sdsCadPedido e d dois clique na propriedade Params e configure de acordo a tela a seguir:

Faa o mesmo com o componente sdsItens. Selecione agora o componente dtsRelacionamento e mude a propriedade dataset para sdsCadPedido. Selecione o componente sdsItens e mude a propriedade DataSource para dtsRelaciomanento. A idia ligarmos o dtsRelacionamento ao sdsCadPedido e o sdsItens liglo ao dtsRelacionamento, ou seja, tudo ir passar pelo DataSource. D dois clique no componente cdsCadPedido e abrir o Field Editor, com o boto direito do mouse escolha add Fields e perceber que abrir uma caixa com novo campo do tipo DataSet, selecione esse novo campo e d OK. Como disse anteriormente ele criou um campo do tipo dataset, ou seja, todos os campos da tabela sdsItens esto dentro deste dataset, com isso ele usar apenas uma transao para as duas tabelas. Para finalizarmos o relacionamento selecione o componente cdsItens e mude a propriedade DataSetField para cdsCadPedidosdsItens, ok agora coloque todos os campos no Field editor do cdsItens. Concluso: Neste artigo podemos aprender como fazer um relacionamento NastedDataSet, o qual utilizamos apenas uma transao, este tipo de relacionamento o mais seguro, sabendo que o banco de dados grava as informaes de acordo a instruo SQL, ele obedecer a risca o que vem da clausula where. No prximo artigo estarei montando a tela de vendas. Abraos e at l.

10/11/2011 15:45

1 de 1

http://www.planetadelphi.com.br/artigo/165/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 9

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 9 Tela de Pedido No artigo anterior fizemos o nosso relacionamento, neste artigo estarei montando a tela de vendas. Crie um novo formulrio e mude a propriedade name para frmCadVenda e salve-o como UfrmCadVenda. Adicione um panel e mude a propriedade Align para Altop, adicione mais um panel e mude a propriedade align alLeft, Adicione um DbGrid e mude a propriedade align para alClient e mude a propriedade name para DBGitens. Adicione dois DataSource e mude as seguintes propriedades:

Obs.: Caso no aparea nada na propriedade DataSet, voc ter que teclar Alt+F11 para instanciar. Nota: O DataSource o grande responsvel para visualizao dos dados provindos de um DataSet como o ClientDataSet e SqlDataSet, ele que permite a visualizao num DbGrid ou qualquer outro componente de visualizao de dados. Abra o Data Module dmPedido e d dois clique no componente cdsCadPedido e arraste para o primeiro panel os campos IDCLIENTE, IDPEDIDO E DATA, o campo VALOR, arraste-o para o panel2. Selecione o DbGrid e mude a propriedade DataSource para dtsItens e logo depois d dois clique no DbGrid e na tela que se abre escolha o boto Add all Fields. Selecione o campo IDPRODUTO e mude a propriedade caption que est dentro da opo Title para CDIGO , o campo TOTITEN para TOTAL e UNITARIO para UNITRIO. Voc tambm pode mudar as posies que voc deseja que aparea no DbGrid, alterar a fonte, o tamanho da grid e da fonte dentro da grid, mudando cores tambm. Selecione todos os campos e marque a propriedade ReadOnly, essa propriedade no permite que faa qualquer operao no Dbgrid, ou seja, o DbGrid est servindo apenas para visualizar os dados.

10/11/2011 15:46

1 de 1

http://www.planetadelphi.com.br/artigo/165/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Com o cdsItens ativado arraste para o panel 2 o campo QUANTIDADE e UNITARIO. Sua tela de vendas dever ficar assim:

Concluso: Podemos perceber nesta tela que nos falta o nome do cliente e do produto, no prximo artigo estarei mostrando como fazer isso usando Joins e tambm utilizando o evento OnValidate do campo. Este foi apenas um artigo para montar nossa tela de vendas simples, sugiro a voc a melhorar essa tela colocando imagens e explorando melhor as propriedades dos panels e dbGrids. Abraos e at a prxima.

10/11/2011 15:47

1 de 1

http://www.planetadelphi.com.br/artigo/167/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 10

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 10 Join e OnValidate Neste artigo estarei demonstrando como trabalhar com Join e com o evento OnValidate. Abrindo o data module dmPedido, selecione o componente sdsCadPedido e d dois clique na propriedade command Text e mude a instruo Sql de acordo com o quadro a seguir: view sourceprint?
01.select 02.PED.DATA, 03.PED.IDCLIENTE, 04.PED.IDPEDIDO, 05.PED.VALOR, 06.CLI.NOME 07.from PEDIDO PED 08.Inner Join CLIENTE CLI ON CLI.IDCLIENTE = PED.IDCLIENTE 09.Where IDPEDIDO =:pIDPEDIDO

Existem dois tipos de Join o Inner Join que obriga que ele encontre o dado e o left Join que no, o dado pode ou no existir, Poderamos mudar o Inner Join para Left Join. D dois clique no componente sdsCadPedido e com o boto direito do mouse escolha add all fields, caso d algum erro voc precisar reconfigurar a propriedade params, e logo depois voc perceber que aparecer o campo nome, provindo da tabela CLIENTE. O Join faz a unio de duas tabelas, para que voc utilize os campos que desejar da outra tabela. Coloque em nosso data Module dmPedido um novo SqlDataSet e mude as seguintes propriedades:

10/11/2011 15:48

1 de 1

http://www.planetadelphi.com.br/artigo/167/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

D dois clique no componente cdsCadPedido e selecione o campo IDCLIENTE e d dois clique no evento OnValidate e coloque o seguinte cdigo: view sourceprint?
01.procedure TdmPedido.cdsCadPedidoIDCLIENTEValidate(Sender: TField); 02. begin 03. With sdsInfoCliente do 04. begin 05. Close; 06. Params.ParamByName('IDCLIENTE').AsInteger:= 07. cdsCadPedidoIDCLIENTE.AsInteger; 08. Open; 09. cdsCadPedidoNOME.AsString:=FieldByName('NOME').AsString; 10. end; 11.end;

No cdigo anterior estamos localizando o cliente e atribuindo ao campo NOME do Join com o nome do cliente que localizamos. Para testarmos v ao formulrio frmCadVenda adicione um boto e coloque o seguinte cdigo: view sourceprint?
1.procedure TfrmCadVenda.BitBtn1Click(Sender: TObject); 2.begin 3. dmPedido.cdsCadPedido.Open; 4. dmPedido.cdsCadPedido.Append; 5.end;

Nota: Voc deve colocar o campo NOME no Field Editor do Clientdataset cdscadPedido. Execute a aplicao e digite no IDCLIENTE um cdigo j existente em sua tabela de Cliente e veja o resultado:

Ao sair do campo IDCLIENTE ele trar o nome do cliente, muitos programadores utilizam o evento OnExit do prprio campo, ele surte o mesmo efeito, com a seguinte diferena, no OnExit s aparecer o nome assim que o usurio sair do campo, j o OnValidate tambm, mas ele quando recebe o cdigo ele tambm disparado, assim quando fizermos nossa pesquisa de cliente ele nos ser muito til.

10/11/2011 15:49

1 de 1

http://www.planetadelphi.com.br/artigo/167/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Assim como fizemos com o componente sdsCadPedido faa o mesmo com o componente sdsItens e mude a sua instruo Sql de acordo com a quadro a seguir: view sourceprint?
01.select 02.ITEN.IDPEDIDO, 03.ITEN.IDPRODUTO, 04.ITEN.QUANTIDADE, 05.ITEN.TOTALITEN, 06.ITEN.UNITARIO, 07.PROD.PRODUTO 08.from ITENS ITEN 09.Inner Join PRODUTO PROD ON PROD.IDPRODUTO = ITEN.IDPRODUTO 10.Where IDPEDIDO =:pIDPEDIDO

Nota: Quando coloco a palavra ITEN, antes do campo porque estou dando um apelido para tabela, poderia usar somente o nome da tabela. Adicione em nosso data module dmPedido mais um SqldataSet e mude as seguintes propriedades:

Ok, fizemos o nosso join, agora podemos fazer nossa pesquisa no evento OnValidate e trazer o nome do produto, vamos a prtica: D dois clique no componente cdsItens e selecione o campo IDPRODUTO e adicione o seguinte cdigo no evento OnValidate: view sourceprint?
01.procedure TdmPedido.cdsItensIDPRODUTOValidate(Sender: TField); 02.begin 03. With sdsInfoProduto do 04. begin 05. Close; 06. Params.ParamByName('pIDPRODUTO').AsInteger:= 07. cdsItensIDPRODUTO.AsInteger; 08. Open; 09. cdsItensPRODUTO.AsString:=FieldByName('PRODUTO').AsString; 10. end; 11.end;

Adicione Produtos a tabela de PRODUTO e execute a aplicao, s no esquea de dar qualquer cdigo ao campo IDPEDIDO, para no dar erro, j que as duas tabelas esto ligadas pelo relacionamento.

10/11/2011 15:50

1 de 1

http://www.planetadelphi.com.br/artigo/167/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Veja como ficou a execuo do projeto:

Concluso: Neste artigo procurei mostrar a utilizao de Joins e do evento OnValidate, voc pode melhorar e aprofundar mais essa idia. Busco neste curso dar uma base de sustentao para todos, para chegarmos ao mesmo nvel. Maiores informaes vocs podem adquirir no meu livro Delphi Faa Uma Aplicao Comercial, muito obrigado e at o prximo artigo onde mostrarei como selecionar os clientes e os produtos em uma tela de pesquisa.

10/11/2011 15:51

1 de 1

http://www.planetadelphi.com.br/artigo/168/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 11

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Neste artigo irei demonstrar como adicionar em nosso formulrio de venda o cliente e os produtos, vamos fazer uma pesquisa no prprio formulrio de vendas, apenas mandando ficar visvel ou no uma Dbgrid e um Edit. Vamos a prtica. Abra o formulrio de frmCadVendas e adicione um edit exatamente em cima DbEdit7, a onde mostrado o nome do cliente, e mude a propriedade name para edtCliente, logo abaixo coloque um Dbgrid e mude a propriedade name para dbgCliente e mude a propriedade visible para false, abra o data module dmPedido e adicione o componente SqlDataset e mude as seguintes propriedades:

Adicione um componente DataSetProvider e mude as seguintes propriedades:

Adicione um componente ClientDataSet e mude as seguintes propriedades:

Feito isso, retorne ao formulrio frmCadVenda e adicione o componente DataSource e mude as seguintes propriedades:

Selecione o o Edit edtCliente e coloque o seguinte cdigo no evento OnkeyPress: view sourceprint?
01.procedure TfrmCadVenda.edtClienteKeyPress(Sender: TObject; var Key: Char); 02.begin 03. With dmPedido.cdsPesqCliente do 04. begin 05. Close; 06. FetchParams; 07. Params.ParamByName('NOME').AsString:=edtCliente.Text+'%'; 08. Open; 09. end; 10.end;

10/11/2011 15:52

1 de 1

http://www.planetadelphi.com.br/artigo/168/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Aqui estamos alimentando o parmetro NOME em nossa instruo SQL dentro do evento OnKeyPress que assim que o usurio comear a digitar o nome do cliente ele ir comear a busca. No evento OnClick do edtNome coloque o seguinte cdigo: view sourceprint?
1.procedure TfrmCadVenda.edtClienteClick(Sender: TObject); 2.begin 3. dbgCliente.Visible:=True; 4.end;

Assim que o usurio acessar o edtNome ele tornar visvel o nosso dbgrid.. Execute a aplicao e veja como ficou a nossa pesquisa na figura a seguir:

Agora vamos selecionar o cliente. Iremos criar uma procedure, para podermos acessar de qualquer evento. No nosso formulrio frmCadVenda na declarao Private coloque o seguinte cdigo: view sourceprint?
1.private 2. procedure escolha; 3. { Private declarations } 4. public 5. { Public declarations }

Tecle Ctrl+Shift+C para implementar a procedure e coloque o seguinte cdigo: view sourceprint?
1.procedure TfrmCadVenda.escolha; 2.begin 3. dbgCliente.Visible:=False; // Torna o DbGrid Invisvel 4. edtCliente.Visible:=False; // Torna o edit invisvel 5. dmPedido.cdsCadPedido.Append; // Lana um novo registro em branco na tabela 6. dmPedido.cdsCadPedidoIDCLIENTE.AsInteger:= // Alimenta o campo IDCliente 7. dmPedido.cdsPesqClienteIDCLIENTE.AsInteger; 8.end;

10/11/2011 15:53

1 de 1

http://www.planetadelphi.com.br/artigo/168/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

No evento OnDblCllick do DbGrid dbgCliente coloque o seguinte cdigo: view sourceprint?


1.procedure TfrmCadVenda.dienteDblClick(Sender: TObject); 2.begin 3. Escolha; // Aciona a procedure Escolha 4.end;

No evento OnKeyPress do DbGrid dbgCliente coloque o seguinte cdigo: view sourceprint?


1.procedure TfrmCadVenda.dbgClienteKeyPress(Sender: TObject; var Key: Char); 2.begin 3. if key = #13 then // #13 a representao da tecla Enter, o key a chave 4. Escolha; 5.end;

Execute a aplicao e veja como ficou o nosso formulrio. Inserindo Produto Vamos inserir agora o produto, para isso, iremos fazer uso do boto cbsEllipsis presente dentro do Dbgrid,. D dois cliques no Dbgrid de itens a abrir a seguinte caixa:

Selecione a coluna PRODUTO e mude a propriedade ButtonStyle para cbsEllipsis, ok, j criamos o boto para fazermos uso do mesmo;

10/11/2011 15:53

1 de 1

http://www.planetadelphi.com.br/artigo/168/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Criando Formulrio Vamos criar um novo formulrio para pesquisar o produto, para isso v em File, new e form Delphi e mude as seguintes propriedades:

Salve o formulrio como UfrmPesqProduto e deixe o formulrio como a figura a seguir:

Abra o data module dmPedido o coloque os seguintes componentes e mude suas propriedades:

Retorne ao formulrio frmPesqProduto e adicione um DataSource em nosso formulrio e mude as seguintes propriedades:

Obs.: Caso no aparea nada na propriedade DataSet, voc deve clicar em Alt+F11 e colar a unit UdmPedido.

10/11/2011 15:54

1 de 1

http://www.planetadelphi.com.br/artigo/168/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Selecione o edit edtPesquisa e no evento OnKeypress, coloque o seguinte cdigo: view sourceprint?
01.procedure TfrmPesqProduto.edtPesquisarKeyPress(Sender: TObject; var Key: Char); 02.begin 03. With dmPedido.cdsPesqProduto do 04. begin 05. Close; 06. FetchParams; 07. Params.ParamByName('PRODUTO').AsString:=edtPesquisar.Text+'%'; 08. Open; 09. end; 10.end;

A pesquisa acima como as outras que j fizemos. Agora selecione o dbGrid e colque o seguinte cdigo no evento OnDblClick: view sourceprint?
1.procedure TfrmPesqProduto.DBGrid1DblClick(Sender: TObject); 2.begin 3. Close; 4.end;

No evento OnkeyPress: view sourceprint?


1.procedure TfrmPesqProduto.DBGrid1KeyPress(Sender: TObject; var Key: Char); 2.begin 3. if key = #13 then 4. Close; 5.end;

Agora iremos chamar o formulrio frmPesqProduto, para isso, retorne ao frmCadVenda e selecione o DbGrid de itens e no evento OnEditBurttonClick coloque o seguinte cdigo: view sourceprint?
01.procedure TfrmCadVenda.DBGrid1EditButtonClick(Sender: TObject); 02.begin 03. try 04. frmPesqProduto:=TfrmPesqProduto.Create(self); 05. frmPesqProduto.ShowModal; 06. finally 07. With dmPedido.cdsItens do 08. begin 09. Open; 10. Append; 11. FieldByName('IDPRODUTO').AsInteger:=dmPedido.cdsPesqProdutoIDPRODUTO.AsInteger; 12. FieldByName('PRODUTO').AsString:=dmPedido.cdsPesqProdutoPRODUTO.AsString; 13. end; 14. freeAndNIl(frmPesqProduto); 15. end; 16.end;

Aqui estamos chamando o formulrio de pesquisa de produto assim que fech-lo, eu recebo na tabela de itens o produto selecionado pelo usurio.

10/11/2011 15:55

1 de 1

http://www.planetadelphi.com.br/artigo/168/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

No evento OnCreate do formulrio frmCadVenda coloque o seguinte cdigo: view sourceprint?


1.procedure TfrmCadVenda.FormCreate(Sender: TObject); 2.begin 3. if not assigned(dmPedido) then 4. dmPedido:=TdmPedido.Create(self); 5.dmPedido.cdsCadPedido.Open; 6.end;

No menu principal, clique em Project, Options e deixe os formulrios e data modules como a figura a seguir:

Salve a aplicao a execute. Fico por aqui no prximo artigo vamos melhorar a aparncia do nosso formulrio de vendas e criarmos o nmero do pedido.

10/11/2011 15:56

1 de 1

http://www.planetadelphi.com.br/artigo/169/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Curso Delphi Criando uma Aplicao do Incio ao fim - Parte 12

Rubens Antunes
Rubens Antunes, Autor do Livro Delphi Faa uma Aplicao Comercial e Desenvolvedor Delphi desde de 2004. Curso Delphi Criando uma Aplicao do Incio 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 unitrio de cada item do nosso pedido, assim que ele receber a quantidade ele ir multiplicar pelo valor unitrio, 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 cdigo: view sourceprint?
01.procedure TdmPedido.cdsItensQUANTIDADEValidate(Sender: TField); 02.begin 03. With dmPedido.cdsItens do 04. begin 05. cdsItensTOTALITEN.AsFloat:=0; 06. cdsItensTOTALITEN.AsFloat:= 07. cdsItensUNITARIO.AsFloat * dmPedido.cdsItensQUANTIDADE.AsFloat; 08. end; 09.end;

Entendendo o cdigo: Primeiro zeramos o campo TOTALITEN, caso ele possua algum valor, logo depois multiplicamos o campo UNITRIO pela QUANTIDADE e atribumos o resultado ao campo TOTALITEN. Vamos fazer o mesmo procedimento ao campo UNITARIO, adicionando o mesmo cdigo anterior. view sourceprint?
01.procedure TdmPedido.cdsItensUNITARIOValidate(Sender: TField); 02.begin 03. With dmPedido.cdsItens do 04. begin 05. cdsItensTOTALITEN.AsFloat:=0; 06. cdsItensTOTALITEN.AsFloat:= 07. cdsItensUNITARIO.AsFloat * dmPedido.cdsItensQUANTIDADE.AsFloat; 08. end; 09.end;

10/11/2011 15:57

1 de 1

http://www.planetadelphi.com.br/artigo/169/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Assim se o usurio colocar a quantidade ou valor unitrio ele ir multiplicar. Agreggate: Este um campo criado em memria 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 boto direito do mouse sobre o field editor e escolha a opo 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 tambm 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 formulrio 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 aplicao

10/11/2011 15:57

1 de 1

http://www.planetadelphi.com.br/artigo/169/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

totalpedido. Pronto nosso campo agreggate est criado e j estamos fazendo uso do mesmo. Execute a aplicao e veja como ficou na figura a seguir:

Podemos perceber que assim que adicionamos um novo item e colocamos a quantidade e o valor unitrio o campo totalpedido no recebe valor algum, isso ocorre porque o campo agreggate s comea a somar assim que o registro validado, para resolvermos isso vamos colocar um cdigo no evento OnExit do DbEdit da QUANTIDADE, coloque assim: view sourceprint?
1.procedure TfrmCadVenda.DBEdit5Exit(Sender: TObject); 2.begin 3. dmPedido.cdsitens.next; 4.end;

Faa o mesmo no DbEdit UNITARIO: view sourceprint?


1.procedure TfrmCadVenda.DBEdit6Exit(Sender: TObject); 2.begin 3. dmPedido.cdsitens.next; 4.end;

O que acabei de fazer mandar ele ir para o prximo iten, mas como no h o prximo iten ele passa o registro de estado de edio para navegao, 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 referncia.

10/11/2011 15:58

1 de 1

http://www.planetadelphi.com.br/artigo/169/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

Abra o IBExpert e selecione o nosso campo e na opo Generators d Ctrl+N para gerarmos um novo generator, preencha a tela a seguir de acordo com a figura abaixo:

10/11/2011 16:00

1 de 1

http://www.planetadelphi.com.br/artigo/169/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

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 nmero 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 instruo SQL, Selecionamos atravs da funo Gen_ID do firebird o generator GEN_CODPEDIDO, e adicionamos mais um ao valor do generator e atribumos este valor ao campo NOVOID, a tabela cdigo, nos serve apenas para gerar essa instruo SQL.

10/11/2011 16:01

1 de 1

http://www.planetadelphi.com.br/artigo/169/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-1/

No evento OnNewRecord do ClientDataSet cdsCadPedido, coloque o seguinte cdigo: view sourceprint?


01.procedure TdmPedido.cdsCadPedidoNewRecord(DataSet: TDataSet); 02.begin 03. With sdsNovoID do 04. Begin 05. 06. Open; 07. cdsCadPedidoIDPEDIDO.AsInteger:=sdsNovoIDNOVOID.AsInteger; 08. end; 09.end;

Toda vez que voc abrir o SqlDataSet sdsNovoID ele ir retornar com o valor do generator. Execute a aplicao e veja como ficou na figura a seguir:

Concluso: 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 instruo para gerar o novo ID. Fico por aqui e no prximo artigo vamos melhorar a aparncia do formulrio. At l.

10/11/2011 16:01

1 de 1