Form de Cliente
No
DataModule já deve ter uma
TSQLQuery e um
TDataSource devidamente configurados para acesso à tabela
Cliente. Vamos então inserir um novo form no programa definindo
Name como
frmCliente,
Caption como
Clientes. Mande salvar e informe
u_cliente no nome da unit. Acesse o editor de código referente a esse form e abaixo de
Implementation, para permitir que a unit
u_cliente tenha acesso aos objetos do
DataModule, digite:
uses u_dmdados;
Volte ao form e inclua um
TPanel da mesma forma que foi feito para o form de
Cidade. Selecione um
TDBNavigator da aba
Data Controls e coloque sobre o painel. Defina a propriedade
DataSource como
dsCliente. Insira um
TSpeedButton da aba
Additional no painel e o configure semelhante ao que fizemos no form de
Cidade, inclusive definindo o código do evento
OnClick para fechar o form. O form de
Cliente deverá ter essa aparência:
Coloque dois
TDBedit no form, o primeiro deve ter
Name definido como
edIdCliente,
DataSource como
dsCliente e
DataField como
ID_CLIENTE. No segundo defina
Name como
edNome,
DataSource como
dsCliente e
DataField como
NOME. Coloque dois
TLabel para identificar esse campos e defina os
Caption de acordo com a figura anterior.
O componente
TDBLookupComboBox é usado para que, no caso de uma chave estrangeira (
ID_CIDADE na tabela
Cliente), o usuário possa escolher o registro na tabela referenciada (
Cidade). Neste componente os dados da tabela referenciada são mostrados em uma lista. Pegue então um componente desses na aba
Data Controls e coloque no form abaixo do segundo
TDBEdit. Defina
Name como
dblIdCidade,
DataSource como
dsCliente e
DataField como
ID_CIDADE. Para definir a lista primeiramente defina a propriedade
ListSource como
dsCidade, na propriedade
ListField (campo que será visualizado na lista) defina
NOME e
KeyField (campo chave) defina como
ID_CIDADE. Existe ainda a propriedade
Sorted que define se a lista estará ordenada e
Style que define o comportamento do controle. Deixe
Sorted como
True e
Style como
dsDropDownList (o usuário não poderá digitar no controle, apenas selecionar da lista). Coloque um
TLabel para identificar este campo.
Coloque mais um
TDBEdit abaixo do
LookupComboBox. Defina
Name como
edTelefone,
DataSource como
dsCliente e
DataField como
TELEFONE. Coloque um
TLabel para fazer a identificação do campo.
O campo
TIPO da tabela
Cliente é usado para informar se o cliente é pessoa física - representado pela letra F - ou pessoa jurídica - representado pela letra J. Para este controle vamos usar um
TDBRadioGroup, que permite que sejam definidas opções para serem selecionadas. Pegue um componente desses e o coloque no form. Defina a propriedade
Caption como
Tipo e
Name como
rgTipo.
DataSource será
dsCliente e
DataField será
TIPO. Clique no botão da propriedade
Items. Será aberta uma janela com o editor de strings. Digite
Pessoa física na primeira linha e
Pessoa jurídica na segunda e pressione
OK. Na propriedade
Columns digite 2 para que as opções apareçam em linha. Clique no botão da propriedade
Values - onde estão os valores correspondentes às opções definidas em Items. Digite F na primeria linha e J na segunda. Desta forma quando for selecionada a opção
Pessoa física será gravado F no banco de dados, e J caso contrário. Redimensione o componente adequadamente.
Finalmente coloque um
TDBCheckBox no form. Defina
Caption como
Ativo e
Name como
chxStatus.
DataSource é definido como
dsCliente e em
DataField digite
STATUS. As propriedades
ValueChecked e
ValueUnchecked são usadas para definir o que será gravado no campo quando o componente estiver marcado ou não marcado. Como nosso campo no banco de dados é boolean, não é necessário alterar nada.
Para programar a abertura e o fechamento da
Query faça de forma análoga ao que foi feito no form de
Cidade. Escreva os códigos correspondentes nos eventos
OnShow e
OnClose de
frmCliente.
Mude para o
DataModule e selecione
queCliente. Selecione a aba
Eventos do
Inspetor de objetos e dê um duplo clique ao lado do evento
AfterPost. Digite o código como na figura:
Note que esse código é ligeiramente diferente do que fizemos para
queCidade. Em vez de usarmos
CommitRetaining, agora usamos
Commit.
Commit fecha todas as tabelas abertas, por isso a
Query é aberta na linha 68. Na linha 63 guardamos as chave primária do registro atual na variável chave. E depois que a
Query é aberta, usamos
Locate para localizar o registro correspondente à variável chave. Esta é outra forma de fazer o COMMIT na transação.
Localize o evento
AfterDelete da
Query. Clique no botão da caixa à direita para selecionar um método existente. Selecione
queClienteAfterPost para que a transação seja encerrada da mesma forma quando um registro for excluído.
Agora vamos ao form principal. Na linha
uses abaixo de
Implementation acrescente
u_cliente para que ela fique assim:
uses u_cidade, u_cliente;
Clique no menu
Cadastros -> Clientes e no código do evento
OnClick digite:
frmCliente.Show;
Execute o programa e chame o form de
Cliente para fazer os testes.
Consultas
O próximo passo do desenvolvimento será criar as telas de consulta às tabelas
Cidade e
Cliente. Neste artigo mostraremos a criação da consulta de cidades. Supomos que a consulta de clientes é análoga e não haverá dificuldade em criá-la.
Para iniciar vamos ao
DataModule inserir dois componentes necessários: um
TSQLQuery e um
TDataSource. Na
Query mude
Name para
queConsCidade. Na propriedade
Database selecione
dbCliente. Certifique-se que a propriedade
Transaction está corretamente definida como
trGeral. No
TDataSource mude
Name para
dsConsCidade e
DataSet para
queConsCidade.
Uma interface de consulta é necessária, portanto deve-se inserir um novo form. Defina
Name como
frmConsCidade e
Caption como
Consulta de cidades. Salve e digite
u_conscidade no nome da unit.
A consulta irá oferecer duas opções de consulta - pela chave primária ou por parte do nome. Então insira um
TRadioGroup da aba
Standard. Defina
Caption como
Campo. Na propriedade
Items inclua as linhas
Código e
Nome. Na propriedade
Name digite
rgCampo. Redimensione o componente adequadamente.
Observe a figura acima para orientar o seu desenho. Inclua um
TEdit da aba
Standard. Defina
Name como
edDado e delete o conteúdo da propriedade
Text.
Coloque um
TLabel para identificar o campo. Defina
Caption como
Dado a consultar.
Insira um
TButton. Defina
Name btnConsultar. Localize o componente
TDBGrid na aba
Data Controls. Insira um no form. Defina sua propriedade
Name com
dbgDados. Abra o editor de código e digite abaixo de
Implementation:
uses u_dmdados;
Volte ao form e na propriedade
DataSource da
TDBGrid selecione
dsConsCidade. Dê um duplo clique no botão
btnConsultar e digite o código:
Analisando o código:
linha 39 - define que propriedades e métodos sem referência a um objeto são considerados como sendo de queConsCidade.
linha 41 - fecha a Query.
linha 42 - limpa o conteúdo da propriedade SQL.
linha 43 - verifica que campo foi selecionado no RadioGroup.
linhas 45 e 46 - definem um comando SELECT para buscar linhas na tabela pela chave primária. pIdCidade é um parâmetro definido na linha 46.
linhas 50 e 51 - definem um comando SELECT para buscar linhas na tabela por parte do nome da cidade.
linha 53 - abre a Query.
Mude para o form principal. No editor de código inclua a unit u_conscidade na linha uses abaixo de Implementation. Clique na opção Consultas -> Cidades. Digite o código:
frmConsCidade.Show;
Execute o programa e faça testes de consulta. Falta validar
edDado para que aceite apenas dígitos numéricos quando a consulta for direcionada para o campo chave. Deixamos essa tarefa e a criação da consulta de clientes como um exercício.
Baixe
aqui o código completo do programa.
Algumas considerações
Durante a criação dessa pequena aplicação encontramos dificuldade em achar relatos de experiências usando os componentes
SQLdb. Já utilizamos outros componentes tanto em Lazarus quando no Delphi e sentimos algumas dificuldades principalmente no que diz respeito ao controle de transações.
SQLdb só permite um objeto
SQLTransaction na aplicação. Isso torna-se um obstáculo quando é necessário abrir mais de um form simultaneamente, pois quando fechamos uma transação todas as tabelas são fechadas. Outra dificuldade refere-se ao ponteiro
TBookmark. Antes de encerrar uma transação guardamos o ponteiro do registro atual. Após encerrar a transação, quando o método
GotoBookmark() é chamado para posicionar o registro no ponteiro salvo anteriormente ocorre uma exceção. Vale observar que chamar o
GotoBookmark() antes de encerrar a transação funciona normalmente. Por esses motivos nos próximos artigos usaremos os componentes ZeosLib.