Integrando Delphie Interbase
Integrando Delphie Interbase
Desenvolvimento
em Delphi com
Banco de Dados
1ª Parte
Índice
Índice....................................................................................................................................................2
1. Introdução.....................................................................................................................................3
2. BDE Admin..................................................................................................................................4
Exercício no Interbase..................................................................................................................4
2.1 Configuração do BDE Admin.................................................................................................5
3 Desenvolvendo o Programa Exemplo com BDE.........................................................................7
3.1 Data Module............................................................................................................................7
3.2 Configurando a conexão com o BD........................................................................................7
Exercício.......................................................................................................................................9
4 Tela de Cadastro.........................................................................................................................10
5 Field Editor (editor de campos)..................................................................................................12
Exercício.....................................................................................................................................12
6 Campo Código com Autoincremento.........................................................................................13
7 Ajustes no Sistema.....................................................................................................................14
7.1 Campo Loockup....................................................................................................................14
Exercício.....................................................................................................................................16
7.2 Botão de acesso rápido..........................................................................................................17
7.3 Busca Rápida de Dados.........................................................................................................17
7.3.1 Localizando registros em componentes Table...............................................................19
Exercício.....................................................................................................................................20
8 MENSAGENS DE ERRO EM PORTUGUÊS..........................................................................20
8.1 CAMPOS OBRIGATÓRIOS...............................................................................................20
Exercício.....................................................................................................................................21
8.2 CONFIRMANDO DELEÇÃO.............................................................................................21
Exercício.....................................................................................................................................22
9 Localização de Registros............................................................................................................22
10 Imprimindo dados com Qreport.................................................................................................24
Exercício.....................................................................................................................................27
11 Máscara de Entrada de Dados....................................................................................................27
12 Substituindo o DBNavigator por Buttons..................................................................................28
12.1 Habilitando e Desabilitando Buttons....................................................................................30
Exercício.....................................................................................................................................31
13 Select em Querys com Parâmetro..............................................................................................31
13.1 Usando Parâmetros nas Consultas........................................................................................34
Exercício.....................................................................................................................................36
1. Introdução
Atualmente o desenvolvimento de sistemas informatizados profissionais utiliza a combinação
linguagem de programação + banco de dados.
Em nossas aulas estaremos estudando os conceitos utilizados pela linguagem Delphi para
trabalhar com Banco de Dados utilizando a versão Delphi 6 e o sistema gerenciador de banco de
dados Interbase 6 (versão free).
No Delphi estaremos estudando as três formas atuais de acesso ao banco de dados disponíveis
nas versões do Delphi (até o Delphi 7) que são: o BDE Admin que é a forma mais antiga utilizada
pela Borland mas que está sendo abandonada (não estará mais disponível nas próximas versões do
Delphi segundo o fabricante), o dbexpress que veio para substituir o BDE Admin e os componentes
nativos para Interbase (que funcionam apenas se a base de dados for desenvolvida em Interbase).
A apostila estará dividida em partes e sua estrutura está baseada em conceitos e exercícios
práticos que irão resultar em pequenos sistemas exemplo.
Procure desenvolver todos os exemplos e ler todas as explicações escritas na apostila, se
existirem dúvidas não deixe de perguntar ao professor.
2. BDE Admin
O BDE Admin é a forma mais antiga utilizado pelo Delphi para acesso ao banco de dados. Para
começar vamos criar uma base de dados no Interbase que deverá ser nomeada como banco.gdb.
Utilize o script abaixo para criar as tabelas do banco de dados.
O código acima utiliza a estrutura mais simples de criação de banco de dados, o comando
FOREIGN KEY é utilizado para a criação do controle de integridade referencial entre os dados das
tabelas relacionadas.
Os índices ID_CAD_NOME, ID_CAD_TEL e ID_MUN_NOME foram criados para tornar a
consulta dos dados mais rápidas quando utilizamos estes campos como parâmetros de uma
instrução select.
Exercício no Interbase
Utilizando o interbase adicione 5 estados na tabela UF, 10 cidades na tabela MUNICIPIO e 20
pessoas na tabela CADASTRO.
O BDE Admin é um software criado pela Borland para fazer a conexão entre o sistema
desenvolvido em Delphi e o Banco de Dados. O BDE precisa ser configurado para que ele saiba
com qual tipo SGBD (sistema gerenciador de banco de dados) ele está trabalhando e qual é ou são
os arquivos que compõem esta base de dados.
Existem duas formas de acessar o BDE, através do menu INICIAR do Windows na pasta do
Delphi existe a opção BDE Administrator, ou então pelo menu do próprio Delphi como mostra a
imagem abaixo:
Em Databases temos uma lista de conexões ao banco de dados que chamamos de ALIAS, cada
banco de dados precisa ter uma conexão deste tipo configurada no BDE.
Vamos criar uma conexão (ALIAS) para o nosso sistema exemplo. Clique no menu OBJECT e
em NEW, neste momento será exibida a seguinte caixa de diálogo:
.
Nesta caixa de diálogo selecione o tipo INTRBASE que é utilizado quando queremos trabalhar
com uma base de dados do INTERBASE. Após a seleção clique no botão OK. Neste instante estará
criado um ALIAS com o nome INTRBASE1, altere este nome para exemplo.
A figura acima mostra a área de configuração do ALIAS (Definition), neste local precisamos
configurar dois campos: em SERVER NAME clique nos (...) e selecione o local onde o seu arquivo
GDB está gravado em sua máquina. Se você eventualmente alterar este local, você precisará alterar
o SERVER NAME do seu Alias.
Outra configuração que precisa ser feita é o USER NAME que precisa receber o login do SGBD
Interbase, no nosso caso escreva neste local SYSDBA.
Para salvar as configurações do Alias, clique na flecha azul que aparece na barra de ferramentas
do BDE. Após, feche esta janela.
Salve a UNIT (arquivo pas) com o nome UPrincipal e o projeto (arquivo dpr) como Agenda.
Insira um componente mainmenu e crie um menu no form frmPrincipal como mostra a figura
abaixo:
Siga os passos da apostila e depois que forem criados os outros forms, volte para esta tela e
escreva aqui o código para exibir cada um deles.
Altere a propriedade NAME do Data Module para DM e salve a sua unit como UDM.
Agora vamos configurar os componentes que irão fazer a conexão do nosso sistema com o
banco de dados. Os componentes que iremos utilizar estão na paleta de componentes BDE.
O Componente DataBase será usado para fazer a conexão do nosso sistema com o arquivo do
banco de dados. Dê um duplo clique sobre este componente para exibir a seguinte janela de
configuração:
Agora vamos fazer a configuração. Em Alias Name selecione o ALIAS que criamos
anteriormente no BDE Admin, localize na lista o nome exemplo. Em Name escreva um nome para
conexão que estamos fazendo, vamos escrever o nome DBEXEMPLO.
Desmarque o check box Login prompt. Desmarcando esta opção você estará evitando que o
Interbase exiba a sua tela de login exigindo que o usuário do seu programa digite a senha
masterkey.
Para finalizar, precisamos informar alguns parâmetros na caixa Parameter overrides. Escreva
nesta caixa as seguintes linhas:
USER NAME=SYSDBA
PASSWORD=masterkey
No final a configuração deve ficar assim:
Desta forma fizemos a conexão do nosso programa com a tabela Cadastro do banco de dados
que criamos no Interbase. Salve as alterações efetuadas no programa.
Exercício
Insira e configure os componentes table e data source necessários para fazer a conexão com as
tabelas MUNICIPIO e UF do banco de dados.
4 Tela de Cadastro
Agora vamos construir a tela de cadastro de dados para a tabela CADASTRO do banco de
dados. No menu do Delphi selecione FILE – NEW – FORM.
No form criado altere as propriedades:
Caption =Cadastro de Telefones
Name = frmCadastro
Position = poScreenCenter
Salve este form com o nome UCadastro. Como esta tela é uma área de cadastro ela não precisa
estar constantemente ativa na memória do sistema, acesse o menu PROJECT – OPTIONS e passe o
form frmCadastro para lista de forms available.
Vamos criar a interface do form de cadastro de telefones. Com exceção dos componentes labels,
todos os componentes utilizados nesta tela estão na paleta de componentes Data Controls.
Atenção: não é o componente EDIT que estamos usando mas sim o componente DBEDIT.
O primeiro componente (todos estão na paleta Data Controls) da tela de cadastro é o
componente DBNavigator e o último é o componente DBGrid.
Para configurar as propriedades dos componentes primeiro vá ao menu FILE + USE UNIT e
selecione UDM. Este processo indica ao form de cadastro, onde estão os componentes de acesso ao
BD.
Configure as seguintes propriedades nos componentes:
DBNavigator1 (barra utilizada para as operações de manipulação de dados)
DataSource = DM.dsCadastro (selecione na lista)
A propriedade DataSource indica com qual tabela estes componentes irão trabalhar.
DBEdit2
Name = dbeEndereco
DataSorce = DM.dsCadastro
DataField = END_CAD (selecione na lista)
DBEdit3
Name = dbeTelefone
DataSorce = DM.dsCadastro
DataField = TEL_CAD (selecione na lista)
Configure os componentes label para que eles fiquem como a figura abaixo:
Selecionando um dos campos, o object inspector do Delphi irá exibir várias propriedades
referentes aos campos das tabelas. Para ajustar os títulos da DBGrid vamos alterar a propriedade
DisplayLabel de cada campo da seguinte forma:
COD_CAD – DisplayLabel = Código
NOME_CAD – DisplayLabel = Nome
END_CAD – DisplayLabel = Endereço
MUNIC_CAD – DisplayLabel = Município
TEL_CAD – DisplayLabel = Telefone
Exercício
Da mesma forma como trabalhamos até aqui, crie os forms para cadastro de Município e
Estado.
Exemplo:
TblCadastro.fieldbyname(‘cod_cliente’).value := 1;
TblCadastroCOD_CLIENTE.value := 1;
Aplicação prática
No formulário Data Module insira um componente query, altere sua propriedade
DATABASENAME para DBEXEMPLO, name para qryCODCAD e em SQL escreva “select
Max(cod_cad) from cadastro”. Esta query sempre irá selecionar o maior código que exista na
tabela cadastro.
Adicione o campo resultante deste select no field editor da query qryCODCAD.
Agora selecione o componente tblCadastro e localize o seu evento OnNewRecord. Este evento
sempre é executado quando inserimos um novo registro na tabela correspondente, ele é muito útil
quando queremos atribuir um valor padrão para um campo no instante em que o usuário quiser
inserir um novo registro no banco de dados.
Neste evento escreva:
qrycodcad.close;
qrycodcad.Open;
tblCadastroCOD_CAD.Value := 1 + qryCODCADMAX.Value;
O código acima atualiza a consulta do maior código que existe na tabela cadastro (close e open)
e depois atribui para o campo COD_CAD da tabela cadastro o maior código encontrado mais 1.
Faça o mesmo processo para criar um código autoincremento para o município e para a uf sendo
que para cada tabela diferente é aconselhável inserir uma query diferente para localizar o maior
código.
Teste o sistema cadastrando alguns dados.
7 Ajustes no Sistema
Como os formulários de município e estado serão utilizados poucas vezes pelo sistema, eles
devem ser formulários do tipo available. Portanto acesse o menu PROJECT + OPTIONS e coloque
estes forms na lista available (não esqueça que o código para exibi-los deve ser alterado).
O acesso rápido aos campos pode ser feito através da opção ALT + letra, este processo é
possível através do componente label. Por exemplo, no form de cadastro, altere a propriedade
caption do label que identifica o campo nome para &NOME, altere também a propriedade
FOCUSCONTROL, ela deve informar para qual componente irá o foco (cursor) quando o usuário
teclar ALT+N (neste caso dbedit do nome).
Faça esta opção em todos os labels.
Outra forma de facilitar a movimentação entre os campos é a configuração do ENTER. A forma
mais fácil é utilizar o enter na mesma ordem do tab. Para isso, acesse o evento OnKeyPress do
formulário e escreva o seguinte código:
If key=#13 then
Begin
Key := #0;
Perform(WM_NEXTDLGCTL,0,0);
End;
Este processo faz com que, ao tecla enter o Delphi assuma esta operação como se fosse o tab.
Mas para que o procedimento funcione, é preciso alterar a propriedade KEYPREVIEW para TRUE
e verificar a ordem dos componentes no TabOrder.
Para facilitar o desenvolvimento e testes dos próximos passos do programa, cadastre alguns
dados nas tabelas.
Os campos que são chaves estrangeiras nas tabelas, trazem normalmente apenas um código e
não uma descrição na sua visualização. Veja o exemplo do campo município na tabela cadastro, o
dbgrid existente na tela de cadastro de telefones exibe o seguinte:
Para que não apareça o código, mas sim, o nome da cidade precisamos criar um campo virtual
chamado Loockup. Este campo faz o relacionamento entre duas tabelas e exibe qualquer campo da
tabela a qual referenciamos uma chave estrangeira. Abra o formulário DM e selecione o
componente tblCadastro. Altere a propriedade Active do tblCadastro para False. Agora exiba o field
editor da table tblCadastro (duplo clique sobre o componente).
No field editor clique com o botão direito do mouse e escolha no menu a opção NEW FIELD
(novo campo). Será exibida a seguinte tela de configuração para o campo:
Nesta tela vamos configurar o novo campo virtual para esta tabela. Campos virtuais são visíveis
apenas no Delphi e não no BD.
Vamos configurar os seguintes campos:
Name – colocamos um nome qualquer para o campo, só não pode repetir um já existente.
Type – selecionamos o tipo de dados que este campo vai receber ou exibir.
Size = tamanho do campo, em numéricos não precisa ser setado.
Key Fields = selecione o campo que a chave estrangeira da tabela.
DataSet = selecione com qual tabela esta chave faz o relacionamento.
Lookup Keys = selecione o campo chave primária da tabela relacionada.
Result Field = escolha qual dado da tabela relacionada você quer exibir.
Clique em OK.
Agora altere a propriedade display label deste campo recém criado para Município e arraste este
campo para ficar uma posição acima de telefone.
Para finalizar este processo, selecione no field editor o campo MUNIC_CAD e altere a sua
propriedade Visible para false. Feche a caixa do field editor e altere no componente tblCadastro a
propriedade active para true. Veja como ficou o dbgrid na tela de cadastro de telefones.
Exercício
Faça o mesmo processo para o campo UF na tabela Município. Teste seu programa.
No form de cadastro de clientes insira um botão para abrir a busca rápida e um botão (figura
abaixo) para abrir o cadastro de municípios.
frmMunicipio := TfrmMunicipio.Create(Application);
try
frmMunicipio.ShowModal;
finally
frmMunicipio.Free;
dm.tblCadastro.refresh;
end;
Para tanto o from frmMunicipio deve ser do tipo available. O comando dm.tblcadastro.refresh
serve para atualizar os dados da tabela cadastro na tela quando voltarmos para a tela de cadastro de
telefones. Isto é preciso porque o usuário pode alterar o nome de um município, portanto
precisamos atualizar este dado na tela.
Para configurar o componente DBNavigator para que ele tenha apenas as setas de navegação,
altere a sua propriedade VisibleButtons. O componente edtBusca é uma edit normal e não um
dbedit.
O componente de acesso à tabela que será usado neste formulário de busca é o componente
QUERY. Ele é utilizado sempre que utilizarmos comandos SQL dentro do sistema Delphi. Neste
componente devemos alterar as seguintes propriedades:
Databasename = DBEXEMPLO
SQL = (clique nos ...) e digite a sentença SQL : select * from cadastro
Name = qryBusca
Active = TRUE
O código acima seleciona todos os dados da tabela cadastro, quando o dado do campo
NOME_CAD for igual ao dado digitado na edit edtBusca. Como a propriedade SQL da query é
uma propriedade do tipo string, a instrução sql deve estar entre ‘ ‘, o edtBusca.text fica fora das
aspas porque queremos utilizar o conteúdo da edtBusca e não a palavra edtBusca.text. As “ estão no
código, porque quando fazemos um select que compara informações em campos varchar ou char, o
valor a ser comparado deve estar entre “ “. Teste o programa.
SELECT
A instrução select possui várias possibilidades de aplicação, abaixo estão exemplos de estruturas
select que podem ser utilizadas dependendo da necessidade de agrupar dados em uma consulta.
1. Select simples:
1.1. Select * from tabela - seleciona todos os dados de uma única tabela
1.2. Select campo1, campo2 from tabela - seleciona apenas alguns campos de uma tabela
2. Select com condição:
2.1. Select * from tabela where campotexto = “palavra”
2.2. Select * from tabela where camponumero = 2
2.3. Select * from tabela where campo1 < 10 and campo2 >=15 - neste select as duas
comparações devem ser verdadeiras para que o dado seja selecionado.
2.4. Select * from tabela where campo1 = 10 or campo2 >=15 - neste select uma das
comparações devem ser verdadeiras para que o dado seja selecionado.
3. Select com seleção por aproximação
3.1. Select * from tabela where campo like “A%” - like é o comando da busca por
aproximação, A a letra que a palavra deve possuir (constante) e % é o símbolo que
identifica continuação. Ou seja, este select seleciona todos os registros da tabela que
iniciam com a letra A no campo.
3.2. Select * from tabela where campo like “%a%” - este select seleciona todos os registros
da tabela que tem a letra a no campo.
Para dar uma melhor funcionalidade para o código de busca, vamos alterar o SQL da busca a
fim de que o sistema tente localizar registros por aproximação. Para isso escreva os seguintes
comandos no evento clic do button.
Agora, ao clicar no botão, o sistema vai localizar todos os registros que tiverem o conteúdo da
edtBusca mais alguma coisa. Teste o programa.
Para melhorar ainda mais a consulta de dados podemos utilizar o comando UPPER que é
utilizado na consulta para comparar os dados todos como sendo letras maiúsculas. Isto facilita para
o usuário já que não exige dele cuidado em digitar letras maiúsculas ou minúsculas em um nome. O
código fica assim:
qryBusca.close;
qryBusca.SQL.Clear;
qryBusca.Sql.Add('select * from cadastro');
qryBusca.SQL.Add('where upper(NOME_CAD) like upper("' + edtBusca.Text + '%")');
qryBusca.Open;
Para facilitar ainda mais o processo de seleção, podemos copiar o código acima para o evento
onKeyUp da edtBusca, o que fria com que a seleção dos dados ocorresse no momento em que o
usuário digite uma letra, ou seja, conforme ele for preenchendo o nome, a seleção já vai sendo
executada.
Para finalizar o formulário de busca rápida, precisamos incluir o código que permite ao usuário
fechar o formulário de busca e visualizar o mesmo registro localizado no form de cadastro. Para
isso no evento OnClose do frmBusca escreva o seguinte código:
dm.tblCadastro.findkey([qryBusca.fieldbyname(‘COD_CAD’).value]);
O código acima aplica o método findkey que localiza através do componente table um valor na
chave primária de uma tabela. O código busca no campo chave primária da tabela cadastro o dados
que foi encontrado e está no campo primário da query que efetuou a busca.
Coloque um button para chamar o form de busca dentro do form de cadastro de telefones e teste
seu programa.
Obs.: os comandos FindNearest e FindKey só funcionam para busca em campos que são índices.
Exercício
Faça janela de busca rápida e botão de acesso rápido no cadastro de municípios.
O teste de obrigatoriedade pode ser feito pelo banco de dados, mas neste caso a mensagem que
será exibida ao usuário é em inglês. Para exibir mensagens em português faça o seguinte processo.
Liste todos os campos no Field Editor do componente tblCadastro que está no Data Module. Altere
a propriedade REQUIRED (requerido, obrigatório) de cada campo para false.
Antes de escrever o código de teste de preenchimento dos dados altere a cláusula USES do DM.
Procure o código:
unit UDM;
interface
uses
SysUtils, Classes, DB, DBTables;
type
E altere-o para:
unit UDM;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB;
type
Isto precisa ser feito para que possamos trabalhar sem restrições com os códigos de mensagens.
Agora no evento BEFOREPOST (antes de salvar) do componente tblCadastro escreva o
seguinte código.
Note que para cada campo obrigatório é preciso escrever uma linha de teste. A instrução
AsString = ‘’ testa se o campo está em branco e o método abort cancela uma operação, neste caso o
post na tabela.
Exercício
Faça o mesmo processo para testar obrigatoriedade em Município e UF. Teste seu programa.
No caso da deleção de registros que estão armazenados nas tabelas MUNICIPIO e UF, o
processo é um pouco mais complicado pois lida com informações que estão relacionadas por chave
estrangeira. Ou seja, se o município PANAMBI possui clientes cadastrados, para deletar este
município é preciso primeiro deletar todos os clientes que moram em PANAMBI. Este tipo de
deleção é chamada deleção em cascata. A deleção em cascata pode ser feita pelo BD através de
código SQL. Para tanto, as instruções foreing key da banco de dados devem ter o código ON
DELETE CASCADE que faz a deleção em cascata dos dados.
Para deleção em cascata o script do seu banco de dados deveria ficar assim:
);
Exercício
Altere seu banco de dados e faça o código para confirmação de deleção para as tabelas
MUNICIPIO e UF no Delphi.
Teste seu programa.
9 Localização de Registros
Na tela principal do nosso programa exemplo, vamos fazer uma tela para localizar registros
através da busca de dados em três níveis: nome, telefone e município.
qryBusca.Close;
qryBusca.SQL.clear;
qryBusca.SQL.add('select nome_cad, end_cad, nome_mun, nome_uf, tel_cad');
qryBusca.SQL.add('from cadastro, municipio, uf');
qryBusca.SQL.add('where cadastro.munic_cad = municipio.cod_mun');
qryBusca.SQL.add('and municipio.uf_mun = uf.cod_uf');
if rdgBusca.ItemIndex = 0 then //compara pelo nome
qryBusca.SQL.add('and upper(cadastro.nome_cad) like upper("' + edtBusca.text +
'%")');
if rdgBusca.ItemIndex = 1 then //compara pelo nome
qryBusca.SQL.add('and upper(cadastro.tel_cad) like upper("' + edtBusca.text +
'%")');
if rdgBusca.ItemIndex = 2 then //compara pelo nome
qryBusca.SQL.add('and upper(municipio.nome_mun) like upper("' + edtBusca.text +
'%")');
qryBusca.SQL.add('order by nome_cad');
qryBusca.open;
O código acima fará o select no banco de dados de acordo com a opção que estiver selecionada
no radiogroup rdgBusca.
Quando o usuário clicar no radiogroup alterando a sua opção de busca, vamos zerar a busca
efetuada anteriormente da seguinte forma, no evento OnClick do radiogroup rdgBusca escreva:
edtBusca.Text := '';
edtBusca.SetFocus;
qryBusca.Close;
qryBusca.SQL.Clear;
qryBusca.SQL.add('select nome_cad, end_cad, nome_mun, nome_uf, tel_cad');
qryBusca.SQL.add('from cadastro, municipio, uf');
qryBusca.SQL.add('where cadastro.munic_cad = municipio.cod_mun');
qryBusca.SQL.add('and municipio.uf_mun = uf.cod_uf');
qryBusca.SQL.add('order by nome_cad');
qryBusca.Open;
Observe que o código acima vai limpar o que estiver escrito na edit edtBusca e vai colocar o
select sem condição especial na query qryBusca.
Para que o programa seja aberto exibindo todos os dados existentes na tabela de cadastro,
escreva o seguinte código no evento OnShow do form frmPrincipal:
qryBusca.Open;
Dê um duplo clique na área em branco do form, será exibida a seguinte tela de configuração:
Desta forma estaremos criando um cabeçalho (Page header), corpo (Detail band) e rodapé (Page
footer) para o nosso relatório.
Clique em OK.
No componente QuickRep1 altere a propriedade DATASET para qryPrint. Esta propriedade irá
indicar de onde virão os dados que serão impressos no relatório.
Vamos criar agora o corpo do nosso relatório, o local onde irão aparecer os dados que queremos
imprimir. Insira componentes como mostra a imagem abaixo:
Serão cinco (um para cada campo) componentes QRLabel no cabeçalho do relatório e cinco
componentes QRDBTEXT no corpo (Detail band) do relatório. Na propriedade caption dos
componentes QRLabel escreva pela ordem:
- Nome
- Endereço
- Município
- Estado
- Telefone
Deverá ficar assim:
Exercício
Faça agora um relatório que imprima apenas os dados encontrados na seleção feita no form
frmPrincipal.
Nesta caixa é que configuramos a máscara de entrada de dados. Existem formatos já definidos
em SAMPLE MASK, você pode escolher um deles clicando sobre a opção desejada. Mas nós
iremos criar um formato novo.
A máscara deve ser digitada em Input Mask. Para criar a máscara de números utilizamos
normalmente os algarismos 0 e 9, 0 quando o preenchimento é obrigatório e 9 quando é opcional.
A máscara de telefone é (__)____-____ então vamos digitar em Input Mask o seguinte:
(00)0000-0000.
Em Character for Blanks informamos qual símbolo deve aparecer nos espaços em branco,
normalmente usamos _.
O check Box Save Literal Characters quando selecionado, grava a máscara junto com os dados
na tabela do banco de dados, quando não estiver selecionado serão gravados só os números sem os (
) e -. No nosso exemplo deixe está check selecionada.
A caixa deve ficar assim:
Altere o caption de cada button como mostra a figura acima e dê o seguinte nome para cada um:
btnPrimeiro, btnAnterior, btnProximo, btnUltimo, btnInserir, btnAlterar, btnDeletar, btnSalvar,
btnCancelar.
Agora vamos escrever o código para executar cada uma das operações do DBNavigator
seguindo a seguinte sintaxe:
First = primeiro, Prior = anterior, Next = próximo, Last = último, Insert = inserir, Edit = alterar,
Delete = deletar, Post = salvar, Cancel = cancelar.
Escreva no evento OnClick do button btnPrimeiro o seguinte código:
dm.tblUF.First;
dm.tblUF.Prior;
dm.tblUF.Next;
dm.tblUF.Last;
dm.tblUF.Insert;
dm.tblUF.Edit;
dm.tblUF.Delete;
dm.tblUF.Post;
dm.tblUF.Cancel;
Teste o funcionamento dos buttons que você acabou de inserir no form de cadastro de UFs.
Se você observar o funcionamento dos botões que existem no componente DBNavigator, irá
perceber que, dependendo da situação ou operação selecionada, os buttons são habilitados ou
desabilitados. Por exemplo, quando você clica no button que posiciona no primeiro registro da
tabela, este button e o button que volta um registro são desabilitados. Isso ocorre para avisar ao
usuário que chegamos ao início da tabela e não existe mais nenhum registro antes deste.
No nosso form de cadastro de Ufs também iremos fazer com que os buttons que inserimos no
lugar do componente DBNavigator funcionem desta forma.
No button btnPrimeiro usaremos a função BOF (begin of file) que testa se chegamos ao
primeiro registro da tabela, faremos este teste e se for verdadeiro o retorno, vamos desabilitar os
button btnPrimeiro e btnAnterior. Escreva o código abaixo no evento OnClick do button
btnPrimeiro:
dm.tblUF.First;
if dm.tblUF.Bof then //se está no inicio da tabela
begin
btnPrimeiro.Enabled := false;
btnAnterior.Enabled := false;
end;
btnProximo.Enabled := true;
btnUltimo.Enabled := true;
Neste código executando a função que irá mover a tabela para o primeiro registro (FIRST), na
segunda linha testamos se chegamos ao início da tabela usando a função BOF (begin of file). Se
chegamos desabilitamos os button btnPrimeiro e btnAnterior. Como nos movimentamos para o
primeiro registro da tabela, é provável que existam registros para frente, por isso habilitamos os
button btnProximo e btnUltimo, assim garantimos que o usuário possa avançar nos registros da
tabela.
O código para o botão btnAnterior é semelhante ao do btnPrimeiro. Escreva o seguinte código
no button btnAnterior:
dm.tblUF.Prior;
if dm.tblUF.Bof then //se está no inicio da tabela
begin
btnPrimeiro.Enabled := false;
btnAnterior.Enabled := false;
end;
btnProximo.Enabled := true;
btnUltimo.Enabled := true;
No caso dos buttons btnProximo e btnUltimo a lógica de teste é inversa. Neste caso vamos
utilizar a função EOF (end of file) que irá testar se chegamos ao final da tabela.
dm.tblUF.Next;
if dm.tblUF.Eof then //se está no fim da tabela
begin
btnProximo.Enabled := false;
btnUltimo.Enabled := false;
end;
btnPrimeiro.Enabled := true;
btnAnterior.Enabled := true;
dm.tblUF.Last;
if dm.tblUF.Eof then //se está no fim da tabela
begin
btnProximo.Enabled := false;
btnUltimo.Enabled := false;
end;
btnPrimeiro.Enabled := true;
btnAnterior.Enabled := true;
Exercício
Observe como o componente DBNavigator desabilita ou habilita os buttons para inserir, alterar,
deletar, salvar e cancelar e tente fazer o mesmo funcionamento em seu programa na tela de cadastro
de Ufs.
Quando usamos o BDE como conexão entre o banco de dados e o sistema Delphi, o tipo DATE
do Interbase não funciona no Delphi. Isso acontece porque o BDE é um aplicativo antigo e
desatualizado. Portanto, quando for usar o BDE como conexão ao banco de dados os tipos DATE
devem ser substituídos por TIMESTAMP no Interbase.
Feche o Interbase e abra a sua aplicação no Delphi. Abra o form DM e adicione os campos
DATANASC, DIANASC e MESNASC ao Field Editor do componente tblCadastro. Altere o
Display Label do campo DATANASC para Data de Nascimento e crie uma máscara de entrada de
Colégio Evangélico Panambi – Técnico em Informática pg. 31
Delphi com Banco de Dados Professor: Klaus Reinke
Os campos DATANASC e MESNASC não serão informados pelo usuário do programa, nós
vamos pegar esta informação do campo DATANASC preenchido na tela de cadastro. Portanto, abra
novamente o form DM e selecione o componente tblCadastro e localize o evento BEFOREPOST.
No evento before post já existe o código para controlar os campos obrigatórios. Declare neste
procedimento as variáveis:
O código acima irá testar se foi informada uma data em DATANASC, se foi será aplicada a
função decodedate na data informada. A função decodedate separa as informações dia, mês e ano da
data informada e as armazena nas variáveis declaradas com o nome de ano, mes e dia. De posse
destas informações basta atribuir o valor do dia para o campo DIANASC e do mês para o campo
MESNASC. Este código será executado sempre que o usuário clicar no button salvar da tabela de
cadastro de telefones.
Teste seu programa e cadastre datas de nascimento para as pessoas que já estão cadastradas
nele.
Agora no form principal do seu programa adicione um menu Aniversário com as opções Hoje e
Consultar.
Altere a propriedade name do componente maskedit para edtBusca e na sua propriedade edit
mask adicione uma máscara no formato 00/00/0000.
No componente Query altere a propriedade DATABASENAME para DBEXEMPLO, a
propriedade NAME para qryBusca e na propriedade SQL escreva:
edtBusca.Text := datetostr(date);
qryBusca.Close;
qryBusca.SQL.Clear;
qryBusca.SQL.Add('select cadastro.nome_cad, cadastro.datanasc, cadastro.tel_cad,');
qryBusca.SQL.Add('cadastro.end_cad, municipio.nome_mun, uf.nome_uf');
qryBusca.SQL.Add('from cadastro, municipio, uf');
qryBusca.SQL.Add('where cadastro.munic_cad = municipio.cod_mun');
qryBusca.SQL.Add('and municipio.uf_mun = uf.cod_uf');
qryBusca.SQL.Add('and cadastro.dianasc = ' + formatdatetime('dd',strtodate(edtBusca.Text)));
qryBusca.SQL.Add('and cadastro.mesnasc = ' + formatdatetime('mm',strtodate(edtBusca.Text)));
qryBusca.Open;
Na primeira linha do código acima, atribuímos para o componente edtBusca a data atual do
micro (date).
No select acima usamos duas condições de seleção dianasc = dia de hoje e mesnasc = mês de
hoje. Procuramos os dados das pessoas que tem seu dia de nascimento igual ao dia de hoje e o mês
de nascimento igual ao mês de hoje. Na função formatdatetime extraímos o dia (dd) e o mês (mm)
da data informada no componente edtBusca.Text.
Para que o usuário possa fazer a busca de aniversariante de um outro dia qualquer, escreva no
evento Click do button OK o seguinte código:
qryBusca.Close;
qryBusca.SQL.Clear;
qryBusca.SQL.Add('select cadastro.nome_cad, cadastro.datanasc, cadastro.tel_cad,');
qryBusca.SQL.Add('cadastro.end_cad, municipio.nome_mun, uf.nome_uf');
qryBusca.SQL.Add('from cadastro, municipio, uf');
qryBusca.SQL.Add('where cadastro.munic_cad = municipio.cod_mun');
qryBusca.SQL.Add('and municipio.uf_mun = uf.cod_uf');
qryBusca.SQL.Add('and cadastro.dianasc = ' + formatdatetime('dd',strtodate(edtBusca.Text)));
qryBusca.SQL.Add('and cadastro.mesnasc = ' + formatdatetime('mm',strtodate(edtBusca.Text)));
qryBusca.Open;
Note que é o mesmo código select, mas ele precisa ser rescrito porque possivelmente em
edtBusca existirá outra data informada.
No menu de acesso do form frmPrincipal escreva o código para exibir esta tela de consulta
quando o usuário escolher a opção HOJE do menu Aniversários.
Teste o seu programa.
No código escrito anteriormente, sempre que o usuário informar um outro valor de data, é
preciso que o programa apague a instrução select anterior e rescreva a mesma instrução adicionando
os dados novos constantes na edit edtBusca. Para o programador, fica de certa forma um pouco
extenso a digitação de três vezes o mesmo select, uma no componente query, outra no evento Show
do form e a outra no evento click do button.
Para facilitar na manutenção do programa, economizar digitação de linhas de códigos repetidas
para as mesmas instruções select e consequentemente diminuir a possibilidade de erro no código,
usamos no Delphi o conceito de PARÂMETROS em componentes QUERY. Parâmetros nada mais
são do que variáveis que podemos incluir em uma instrução SQL escrita em um componente
QUERY.
Para exemplificar vamos alterar os códigos de consulta escritos no form de aniversários. Abra o
form frmAniver e altere a propriedade SQL para:
No código acima dia e mês são os parâmetros (variáveis) que criamos em nossa instrução select.
Um parâmetro sempre deve ser precedido de : e não deve existir espaço entre os : e o nome dado ao
parâmetro. Depois de digitar o código select da query localize na mesma query qryBusca a
propriedade PARAMS. Em PARAMS são configurados os tipos de dados que cada um dos
parâmetros escritos na instrução select poderão receber. Em PARAMS clique nos ... que aparecem e
será exibida uma janela com o nome dos parâmetros criados na instrução select.
Na janela que abriu, selecione o parâmetro dia e altere a sua propriedade DataType para
ftInteger (já que o campo DIANASC foi configurado como sendo do tipo Integer no banco de
dados). Depois selecione o parâmetro mes e também altere a sua propriedade DataType para
ftInteger.
A propriedade DataType dos parâmetros sempre deve ser do mesmo tipo de dado do campo
com o qual seu valor será comparado no select.
Agora no código fonte escrito no Delphi não precisamos mais rescrever a instrução select a
cada alteração do valor de consulta, a única coisa que precisamos fazer é atribuir o valor para o
parâmetro e este valor será incorporado no select da query.
Selecione o form frmAniver e localize o evento OnShow deste form. Substitua o código
existente neste evento pelo seguinte código:
edtBusca.Text := datetostr(date);
qryBusca.close;
qryBusca.ParamByName('dia').Value := formatdatetime('dd',strtodate(edtBusca.Text));
qryBusca.ParamByName('mes').Value := formatdatetime('mm',strtodate(edtBusca.Text));
qryBusca.Open;
Para atribuir os valores aos parâmetros basta escrever o nome do componente query a instrução
parambyname e identificar o nome do parâmetro entre aspas. Note que diminuiu consideravelmente
o número de linhas de programação digitados neste evento. Faça a alteração no evento click do
button OK substituindo o código existente por este:
qryBusca.close;
qryBusca.ParamByName('dia').Value := formatdatetime('dd',strtodate(edtBusca.Text));
qryBusca.ParamByName('mes').Value := formatdatetime('mm',strtodate(edtBusca.Text));
qryBusca.Open;
Colégio Evangélico Panambi – Técnico em Informática pg. 35
Delphi com Banco de Dados Professor: Klaus Reinke
Com este capítulo concluímos o estudo da conexão de sistemas Delphi com Banco de Dados
via BDE. Praticamente todos os recursos estudados até aqui poderão ser usados nas outras formas
de conexão, assim como também alguns dos recursos vistos nos próximos tópicos poderão ser
adotados na conexão via BDE. Teste a consulta de aniversariantes e veja se o funcionamento está
correto.
Exercício
Crie a tela de consulta de Aniversários por período, onde o usuário possa digitar duas datas e o
sistema mostre quem faz aniversário neste período de datas. Nesta tela de consulta você deve usar
parâmetros na consulta SQL.
Ao terminar apresente sua aplicação ao professor.