Anda di halaman 1dari 54

Apostila de Delphi Trabalhando com bancos de dados no Delphi Uma viso geral

Marcos Ribeiro

Aplicaes de banco de dados permitem que usurios interajam com informaes que esto armazenadas em bancos de dados. Bancos de dados provem estruturas para o armazenamento de dados e permite que estes dados sejam compartilhados entre aplicaes diferentes. O Delphi tem suporte para aplicaes de banco de dados relacional. Bancos de dados Relacional organizam informaes em tabelas que contm linhas (registros) e colunas (campos). Estas tabelas podem ser manipuladas por operaes simples conhecidas como o clculo relacional. Quando voc projetar uma aplicao de banco de dados, voc deve entender como os dados estaro estruturados. Baseado na estrutura, voc pode ento desenhar a interface e exibir dados ao usurio, permitindo que o mesmo entre com novas informaes ou modifique dados existentes. O Delphi oferece recursos poderosos para a criao de aplicativos com acesso a bancos de dados. Aplicativos criados no Delphi podem ter acesso a dezenas de tipos de bancos de dados, locais ou remotos. Para os bancos de dados mais populares, como Oracle, Sybase, DB2, Access, etc., o Delphi oferece acesso nativo. Toda a comunicao entre o Delphi e esses SGBDs feita internamente no ambiente do Delphi. O acesso nativo geralmente muito mais rpido. Para bancos de dados menos populares, o Delphi oferece acesso via ODBC (Open Database Connectivity). Praticamente todos os bancos de dados profissionais so compatveis com a tecnologia ODBC. Um banco de dados compatvel com ODBC oferece drivers ODBC que podem ser instalados no Windows. Com o driver ODBC correspondente instalado, um banco de dados pode ser acessado facilmente a partir do Delphi . A arquitetura de acesso a bancos de dados O delphi at sua verso 4, s acessava banco de dados atravs da BDE. Mesmo quando era necessrio utilizar o ODBC, a camada BDE servia como intermediria de comunicao. Com o advento da programao para internet e a difuso do desenvolvimento em mltiplas camadas, a Borland viu a necessidade de extender o padro de acesso, visto que nem todos o provedores ou camadas Middletier poderao ter o BDE instalado. Sendo assim, a partir da verso 5, o delphi permite o acesso a banco de dados atravs de vrios mecanismos de acesso a dados: A Pgina BDE Os componentes que esto na paleta BDE usam o Borland Database Engine (BDE). O BDE define uma grande API para interagir com Banco de Dados. De todos os
1

Apostila de Delphi

Marcos Ribeiro

mecanismos de acesso a dados, o BDE o que trs o maior nmero de funes e utilitrios. Ele o melhor meio para trabalhar com tabelas Paradox ou dBASE. Porm ele possui um complicado mecanismo de distribuio de aplicao. A Pgina ADO A partir do delphi 5 a Borland incorporou uma biblioteca de 7 componentes para acesso camada ADO. A camada ADO um padro Microsoft para acesso a banco de dados, que veio para substituir a camada ODBC, mas a Microsoft percebeu que esta camada no serviria para aplicaes internet. Surgiu, ento, a OLE DB que alm de possuir drivers nativos para acessar banco de dados altamente integrada internet. A camada ADO so classes de alto nvel para acesso ao OLE DB Os componentes que esto na paleta ADO usam ActiveX Data Objects (ADO) para acessar informaes de banco de dados por meio do OLE DB. Usando componentes baseados em ADO voc integra sua aplicao dentro do ambiente baseado em ADO. A Pgina InterBase A paleta interbase contm componentes para acesso direto a banco de dados InterBase, sem precisar de uma camada de conexo intermediaria. A Pgina dbExpress Os componentes que esto na paleta dbExpress usam o dbExpress para fazer o acesso a dados. DbExpress um excelente conjunto de drives que permitem o rpido acesso a informaes de banco de dados. Os componentes DbExpress suportam desenvolvimento multi-plataforma porque eles esto disponveis tambm no Linux. Porm, os componentes dbExpress trazem um pequeno alcance de funes de manipulao de dados. NOTA: Neste curso iremos abordar apenas o mecanismo de acesso dbExpress

Apostila de Delphi Usando os componentes DbExpress

Marcos Ribeiro

No Delphi 6 e 7, e no Kylix 2 e 3 Enterprise os componentes DBExpress j vem originalmente instalados. Com a paleta j devidamente instalada, ns temos os seguintes componentes(iguais tanto no Delphi, quanto no Kylix): SQLConnection; SQLDataSet; SQLQuery; SQLStoredProc; SQLTable; SQLMonitor e SQLClienteDataSet. Temos uma exceo em relao ao Delphi 7, pois neste, o componente SQLClientDataSet foi substitudo pelo SimpleDataSet, mas nada que no possa ser contornado. No final, estarei explicando sobre o SimpleDataSet. O SQLConnection

Este o componente responsvel pela conexo com o arquivo fsico do banco de dados (*.gdb). atravs dele, que obtemos o acesso aos dados, mas no acesso direto ao contedo das tabelas, pois isto feito utilizando-se os outros componentes. Principais propriedades do componente SQLConnection: Propriedade Connected Significado Define se o componente est conectado ao banco. Ateno: para que a conexo ocorra corretamente, necessrio que o servidor Firebird ou Interbase esteja rodando, ou que o banco cliente esteja instalado, caso contrrio, na tentativa de conexo, o componente retornar a seguinte exceo: unavailable database. Define o nome da conexo a ser utilizada, no nosso caso IBConnection. Define qual ser o driver utilizado para acessar o banco, no nosso caso Interbase. Especifica se a conexo ficar ativa caso nenhum dataset estiver aberto. Define se o componente vai requerer o nome do usurio e a senha no momento da conexo.
3

Connection Name DriverName KeepConnection LoginPrompt

Apostila de Delphi Params*

Marcos Ribeiro Essa propriedade nos mostra uma lista de sub propriedades do componente, e dentre elas, destacamos: Params.Database: Define o caminho(path) do arquivo de banco de dados. Informa-se aqui o IP do host de onde estiver o banco, caso a aplicao seja usada em rede. Params.SQLDialect: Define qual dialeto ser utilizado no acesso ao banco. Dialeto o conjunto de caracteres aceito pelo banco. Utilizaremos sempre o Dialeto 3, pois aceita acentos. Params.User_Name: Define qual ser o nome do usurio. Params.Password: Define a senha do usurio. Estes parmetros podem ser tambm acessados, dando-se 2 cliques rpidos em cima do componente SQLConnection.

Nota: Para se definir os valores dos parmetros em modo de execuo, utilize a sintaxe: SQLConnection1.Params.NomeDoParametro := Valor; O SQLDataSet

Um DataSet uma estrutura onde so armazenadas listas de registros do banco. O SQLDataSet nos permite mostrar o resultado de uma consulta ou de uma StoredProcedure, executar StoredProcedures que no retornem dados, ou obter os parmetros disponveis no banco(tabelas, StoredProcedures, campos de uma tabela). O SQLDataSet um DataSet unidirecional, ou seja, ele no armazena em memria muitos registros simultneos, e por causa disto, voc s pode navegar usando os mtodos First e Next. Ele no suporta atualizao de dados na memria, atualizaes devero ser feitas utilizando-se a sintaxe SQL diretas no servidor. As principais propriedades deste componente so: Propriedade Active CommandText CommandType DataSource Significado Define se o componente est ativado, e executando o comando passado em CommandText, visto logo abaixo. Define o comando em linguagem SQL a ser passado. Podem ser passadas consultas, incluses e etc.. Define o tipo do comando que foi passado em CommandText. Seus valores so ctQuery, ctStoredProc e ctTable. Define qual ser o objeto TDataSource que ser conectado ao SQLDataSet.
4

Apostila de Delphi SQLConnetion

Marcos Ribeiro Define qual ser o componente do tipo TSQLConnection que prover acesso ao banco.

O SQLQuery

O SQLQuery executa comandos SQL no banco de dados, retornando resultados de consultas, incluses, excluses e etc.. O SQLQuery tambm unidirecional, s suportando a execuo de comandos SQL. Suas principais propriedades so: Propriedade Active SQL Significado Define se o SQLQuery est ativado. onde devemos informar qual comando SQL dever ser executado pela Query. SQLConnetion Define qual ser o componente do tipo TSQLConnection que prover acesso ao banco. O SQLStoredProc

O SQLStoredProc um componente especfico para a execuo de stored procedures existentes no banco. Pode armazenar o resultado de uma stored procedure que retorne um cursor (posio). Tambm um componente unidirecional. As execues das stored procedures usam sintaxe SQL. Principais propriedades: Propriedade Active SQLConnetion StoredProcName Significado Define se o SQLStoredProc est ativado. Define qual ser o componente do tipo TSQLConnection que prover acesso ao banco. Define o nome da stored procedure a ser executada e seus parmetros, se existirem.

Apostila de Delphi O SQLTable

Marcos Ribeiro

O SQLTable representa uma tabela do banco de dados. O TSQLTable traz todas as colunas e linhas da tabela especificada, mas tambm um componente unidirecional, no permitindo a movimentao entre os registros. Trabalha com uma nica tabela de cada vez, podendo realizar alteraes, incluses etc.. Principais propriedades: Propriedade Active SQLConnetion TableName O SQLMonitor Significado Define se o SQLTable est conectado tabela especificada. Define qual ser o componente do tipo TSQLConnection que prover acesso ao banco. onde definimos qual o nome da tabela a ser acessada.

O SQLMonitor um componente utilizado para fazer a depurao da comunicao entre a aplicao e o servidor de banco de dados. Ele grava em log os comandos SQL de uma conexo, adicionando uma stringlist. Principais propriedades do componente: Propriedade Active Significado Define se o SQLMonitor est ativo e monitorando as mensagens passadas ao banco. AutoSave Define se os eventos do banco logados sero automaticamente salvos em um arquivo no disco. FileName Define qual ser o arquivo no disco que receber os logs da conexo. SQLConnetion Define qual ser o componente do tipo TSQLConnection que prover acesso ao banco. TraceList a propriedade utilizada para se acessar a lista de comandos logados. do tipo stringlist. A lista automaticamente atualizada quando o componente de conexo passa alguma mensagem ao banco.

Apostila de Delphi O SQLClientDataSet

Marcos Ribeiro

O SQLClientDataSet um conjunto dos componentes TSQLDataSet e TDataSetProvider(provedor de acesso ao banco). Ele combina o acesso de um dataset unidirecional com a possibilidade de habilitar edies e navegao entre os dados. O componente armazena todo o contedo em memria, permitindo salvar as mudanas feitas pela aplicao. Pelo motivo de ter um dataset provider interno, pode armazenar as alteraes, e grav-las mais tarde no banco de dados. o tpico componente utilizado para conexo com o componente TDBGrid. Principais propriedades do SQLClienteDataSet: Propriedade Active Significado Define se o componente est conectado ao SQLConnection, e portanto com as informaes atualizadas. Ele pode trabalhar desconectado, pois faz cache dos dados em memria. Porm, os dados armazenados no sero os mais atuais. Define o comando SQL a ser passado. Define o tipo do comando que foi passado em CommandText. Seus valores so ctQuery, ctStoredProc e ctTable. Define qual ser o componente que prover acesso ao banco de dados.

CommandText CommandType DBConnection

O SimpleDataSet(Delphi 7)

O SimpleDataSet foi introduzido no lugar do SQLClientDataSet no Delphi 7. Ele tem a mesma funo bsica do SQLClientDataSet, ou seja, fazer cache de dados e permitir alteraes fora do servidor. Principais propriedades: Propriedade Active Significado Define se o componente est conectado ao SQLConnection, e portanto com as informaes atualizadas. Ele pode trabalhar desconectado, pois faz cache dos dados em memria. Porm, os dados armazenados no sero os mais atuais. Define qual ser o componente que prover acesso ao banco de dados. Esta propriedade refere-se a classe DataSet interna do SimpleDataSet. Suas sub propriedades so:
7

Connection DataSet

Apostila de Delphi

Marcos Ribeiro

DataSet.Active: define se o dataset interno est ativo. DataSet.CommandText: define qual ser o comando SQL passado ao dataset. DataSet.CommantType: define qual o comando passado em CommandText. Seus valores so ctQuery, ctStoredProc e ctTable. Atente que so SQLClientDataSet. os mesmos conceitos do j vistos no

Apostila de Delphi Componentes bsicos

Marcos Ribeiro

H dezenas de componentes no Delphi para o trabalho com bancos de dados. So duas pginas da paletas de componentes exclusivamente dedicadas a bancos de dados: as pginas Data Access e Data Controls. A Paleta Data Acess A paleta Data Access contm componentes que podem ser usados com algum mecanismo de acesso a dados. Os componentes desta pgina so usados para permitir acessar informaes de banco de dados. Os componentes mais importantes, e de longe os mais usados, so os trs primeiros: DataSource, ClientDataSet e DataSetProvider.

A pgina Data Access

Veja a seguir uma descrio breve dos componentes mais importantes da pgina Data Access (para os fins desse curso bsico). Componente Data Source Descrio Funciona como um intermedirio entre um componente dataset, como os componentes Table e Query e os componentes da paleta Data Controls. Implementa um cach de dados na memria. ClientDataSet pode ser usado em arquivos de dados local (MyBase) ou como busca de dados para um dataset usando um provedor dataset.

ClientDataSet

Codifica dados em pacotes que pode ser enviado para DataSetProvider clientes e aplicar atualizaes que so recebidas por clientes.

Apostila de Delphi A pgina Data Controls

Marcos Ribeiro

A pgina Data Controls contm componentes que podem ser ligados diretamente a campos e tabelas de um banco de dados. Muitos desses componentes so apenas verses mais poderosas dos componentes na pgina Standard.

A pgina Data Controls

Os componentes DBEdit e DBMemo, por exemplo so equivalentes aos componentes Edit e Memo, mas com o recurso adicional de acesso a bancos de dados. Veja a seguir uma descrio breve dos componentes mais importantes da pgina Data Controls. Componente DBGrid Descrio Exibe dados em formato de tabela. Este componente usado geralmente para exibir os dados de um componente Table ou Query. Usado para navegar os registros de uma tabela, permitindo que dados sejam apagados, inseridos ou alterados. Exibe o texto de um campo de forma no-editvel. Semelhante a um componente Label. Exibe o texto de um campo e permite edit-lo. Semelhante a um componente Edit. Exibe o texto de um campo com vrias linhas de texto (do tipo "BLOB" ou "Memo"). Semelhante a um componente Memo. Exibe imagens armazenadas em um campo do tipo BLOB, ou "Image". Exibe uma lista de itens a partir da qual, pode ser escolhido um valor para um campo. Semelhante ao componente ListBox. Semelhante ao componente DBListBox, mas permite a digitao direta de um valor, alm da escolha de um item listado. Semelhante ao componente ComboBox. Exibe um CheckBox que pode ser usado para exibir ou alterar o valor de um campo booleano.
10

DBNavigator

DBText DBEdit DBMemo

DBImage DBListBox

DBComboBox

DBCheckBox

Apostila de Delphi

Marcos Ribeiro

DBRadioGroup DBLookupListBox

Exibe um conjunto de valores mutuamente exclusivos para um campo. Exibe uma lista de itens extrada de outra tabela relacionada. Somente elementos da lista podem ser escolhidos. Tem a mesma aparncia e o mesmo funcionamento bsico do componente ListBox. Exibe uma lista de itens extrada de outra tabela relacionada. Pode-se digitar um valor diretamente. Tem a mesma aparncia e o mesmo funcionamento bsico do componente ComboBox.

DBLookUpComboBox

11

Apostila de Delphi Trabalhando com DataSets

Marcos Ribeiro

Um DataSet um conjunto de dados organizado em forma de tabela (em linhas e colunas). As colunas so os campos e as linhas so os registros. Todo o acesso a bancos de dados no Delphi feito atravs de DataSets. Os componentes SQLDataSet, SimpleDataSet e SQLQuery so os tipos principais de DataSets. Neste captulo, veremos as propriedades, eventos e mtodos dos DataSets. Abrindo e fechando DataSets Para alterar ou ler os dados em um DataSet, voc deve primeiro abrir o DataSet. Para abrir um DataSet, realize uma das seguintes operaes: Altere a propriedade Active do DataSet para True. Isso pode ser feito em tempo de desenvolvimento no Object Inspector, ou em tempo de execuo. O seguinte comando abre o componente chamado " SimpleDataSet1": SimpleDataSet1.Active := True; Use o mtodo Open no DataSet, como abaixo: SimpleDataSet1.Open; Quando um DataSet aberto os dados conectados a ele so lidos e exibidos automaticamente (se houver componentes onde os dados possam ser exibidos, claro). No exemplo do captulo anterior, abrimos um componente Table em um formulrio para que os dados fossem exibidos imediatamente em um componente DBGrid. Voc deve sempre fechar um DataSet depois de us-lo, para liberar recursos do sistema. Para fechar um DataSet, realize uma das seguintes operaes: Altere a propriedade Active do DataSet para False. Use o mtodo Close no DataSet, como em SimpleDataSet1.Close Estados de um DataSet Um DataSet pode estar em vrios estados diferentes. O estado de um DataSet determina o que pode ser feito (ou est sendo feito) com o DataSet. O valor da propriedade State de um DataSet determina o seu estado atual. Veja a seguir uma descrio breve dos estados mais importantes em que pode estar um DataSet.

12

Apostila de Delphi

Marcos Ribeiro

Estado (valor de State) dsInactive dsBrowse

Significado O Dataset est fechado. Seus dados no esto disponveis (no podem ser lidos nem alterados). O Dataset est aberto. Seus dados podem ser visualizados, mas no podem ser alterados. Este o estado padro de um DataSet. O DataSet est aberto. O registro atual pode ser modificado. O DataSet est aberto. Um novo registro acaba de ser inserido.

dsEdit dsInsert

O estado dsBrowse o estado padro. Quando um DataSet aberto, ele colocado automaticamente neste estado. Vrios mtodos de um DataSet podem ser usados para alterar o seu estado. Estados de um DataSet Para usar um dos mtodos da ilustrao, simplesmente use o nome do DataSet seguido pelo nome do mtodo. O trecho de cdigo abaixo, por exemplo, altera cinco vezes o estado de um componente SimpleDataSet1.
procedure TForm1.Button1Click(Sender: TObject); begin SimpleDataSet1.Open; //O estado muda para dsBrowse ... SimpleDataSet1.Edit; //... muda para dsEdit... SimpleDataSet1.Insert; //... muda novamente para dsInsert ... SimpleDataSet1.Post; //... volta a dsBrowse ... SimpleDataSet1.Close; //... e finalmente muda para dsInactive end;

13

Apostila de Delphi Navegando em um DataSet

Marcos Ribeiro

Os DataSets teriam pouca utilidade se no fosse possvel percorrer e consultar (navegar) os seus registros. H vrios mtodos e propriedades teis para a navegao de DataSets. Para permitir a navegao de seus registros, todo DataSet contm um cursor que indica o registro atual (ou linha atual) do DataSet. no registro atual que so feitas alteraes, ou onde so inseridos (ou removidos) registros. Todos os mtodos de navegao alteram a posio do cursor. Veja uma descrio breve desses mtodos na tabela a seguir: Mtodo First Last Next Descrio Move o cursor para o primeiro registro do DataSet. Move o cursor para o ltimo registro do DataSet. Move o cursor para o prximo registro do DataSet (imediatamente depois do registro atual). Se o cursor j estiver no ltimo registro, nada acontece. Move o cursor para o registro anterior do DataSet (imediatamente antes do registro atual). Se o cursor j estiver no primeiro registro, nada acontece. Move o cursor o nmero de registros especificado em num. Um valor positivo move o cursor para frente; um valor negativo move-o para trs. Por exemplo, Table1.moveBy(-10) move o cursor 10 registros para trs na tabela SimpleDataSet1. Se o nmero de registros especificado for maior do que o nmero que se pode mover, o cursor movido para o primeiro ou o ltimo registro, dependendo da direo do movimento.

Prior

MoveBy(num)

Alm dos mtodos descritos acima, h duas propriedades que indicam se o cursor chegou ao final ou ao incio de um DataSet: BOF e EOF. Propriedade BOF Descrio BOF alterado para True quando o cursor est no primeiro registro do DataSet. BOF a abreviao de Begin of File "Incio do Arquivo". Quando o cursor estiver em qualquer registro que no seja o primeiro do DataSet, o valor de BOF False. EOF alterado para True quando o cursor est no ltimo registro do DataSet. EOF a abreviao de End of File "Final do Arquivo".

EOF

14

Apostila de Delphi

Marcos Ribeiro

Quando o cursor estiver em qualquer registro que no seja o ltimo do DataSet, o valor de EOF False. Veja a seguir dois exemplos que usam os mtodos e propriedades vistas acima. O primeiro exemplo percorre uma query "SQLQuery1" do primeiro registro at o ltimo, somando todos os valores no campo "Quantidade". FieldValues[NomeDoCampo] usado para obter o valor de cada campo. Uma mensagem com o valor total mostrada no final.
procedure TForm1.Button1Click(Sender: TObject); var Total: Double; begin SQLQuery1.Open; {Abrir a Query} Total := 0; while not (SQLQuery1.EOF) do begin Total := Total + SQLQuery1['Quantidade']; SQLQuery1.Next; {Mover para o prximo registro} end; ShowMessage('Quantidade total: '+ FloatToStr(Total)); SQLQuery1.Close {Fechar a Query} end;

Este segundo exemplo percorre os registros do componente SimpleDataSet "SimpleDataSet1" do ltimo at o primeiro, calculando o valor total do estoque: a soma de todos os preos multiplicados pelas quantidades dos produtos. O exemplo semelhante ao anterior, a no ser pela ordem inversa e o uso de um componente SimpleDataSet1 em vez de um SQLQuery que no poderia ser usado porque um dataset unidirecional. Note que obviamente a ordem inversa no obrigatria. Ela foi usada somente para ilustrar BOF e os mtodos Last e Prior.
procedure TForm1.Button2Click(Sender: TObject); var Valor: Currency; begin SimpleDataSet1.Last; {Mover para o ltimo registro} Valor := 0; while not (SimpleDataSet1.BOF) do begin Valor := Valor + SimpleDataSet1['Quantidade'] * SimpleDataSet1['Preco']; SimpleDataSet1.Prior; {Mover para o registro anterior} end; ShowMessage('Valor do estoque: '+ FloatToStr(Valor)); end;

15

Apostila de Delphi Modificando Datasets

Marcos Ribeiro

Pode-se alterar um DataSet diretamente, modificando valores campo a campo, ou adicionando e removendo registros inteiros. Os seguintes mtodos permitem fazer essas alteraes: Mtodo Edit Descrio Coloca o DataSet no estado dsEdit. Isto permite a alterao dos valores do registro atual. Muitos componentes chamam esse mtodo implicitamente para permitir a alterao direta dos valores de um DataSet. O componente DBGrid, por exemplo, entra no estado dsEdit usando o mtodo Edit, quando se d um duplo clique em um dos registros. Adiciona um registro vazio ao final do DataSet. O estado do DataSet muda para dsInsert. Adiciona um registro vazio na posio atual do cursor. O estado do DataSet muda para dsInsert (como para o mtodo Append). Tenta enviar o novo registro ou o registro alterado para o banco de dados. Se tudo correr bem, o DataSet colocado no estado dsBrowse. Caso contrrio, o estado do DataSet no alterado. O comando Post um tipo de confirmao da ltima entrada. Muitos componentes chamam Post automaticamente (quando se passa de um registro para outro em um DBGrid, por exemplo). Cancela a ltima operao (uma alterao em um registro, por exemplo) e coloca o DataSet no estado dsBrowse. Apaga o registro atual e coloca o DataSet no estado dsBrowse.

Append Insert Post

Cancel Delete

Modificando campos O valor de um campo do registro atual de um DataSet pode ser alterado de vrias maneiras: Especificando o nome do campo diretamente: Tabela['Preco'] := 54.43; Usando a propriedade FieldValues: Tabela.FieldValues['Preco'] := 54.43; Usando o mtodo FieldByName e propriedades de converso:
16

Apostila de Delphi

Marcos Ribeiro

Tabela.FieldByName('Preco').AsCurrency := 54.43; Para que seja possvel alterar os valores dos campos, o DataSet deve estar no estado dsEdit ou dsInsert (use Edit, Insert ou Append para coloc-lo em um desses estados). Depois de realizar as alteraes, voc deve confirm-las, usando o mtodo Post. Veja um exemplo que usa FieldValues:
procedure TForm1.Button1Click(Sender: TObject); var NovaDesc: String; begin NovoNome := Edit1.Text; with TabProdutos do begin Edit; //Preparar para alterao FieldValues['Descricao'] := NovaDesc; Post; //Confirmar alterao end; end;

No exemplo, o campo "Descricao" do registro atual do componente Table "TabProdutos" alterado para o valor digitado no componente Edit1. O mtodo Edit usado para colocar a tabela no estado dsEdit, antes de fazer a alterao. O mtodo Post, confirma a alterao, tornando-a permanente. Adicionando registros Os mtodos Insert e Append so usados para adicionar novos registros a um DataSet. Insert adiciona um registro vazio na posio atual do cursor; Append adiciona um registro vazio depois do ltimo registro do DataSet. Os dois mtodos colocam o DataSet no estado dsInsert. NOTA: Para tabelas indexadas do tipo Paradox e dBASE, os comandos Insert e Append tm o mesmo efeito. Eles adicionam um novo registro na posio determinada pelo ndice da tabela. O exemplo a seguir insere um novo registro depois do dcimo registro da tabela. Moveby(10) move o cursor 10 registros adiante; Insert insere o novo registro na posio do cursor. Em seguida, valores so definidos para os campos "Descricao", "Preco" e "Quantidade" e as alteraes so confirmadas com Post.

17

Apostila de Delphi

Marcos Ribeiro

procedure TForm1.Button1Click(Sender: TObject); begin with TabProdutos do begin First; MoveBy(10); Insert; FieldByName('Codigo' ).AsInteger := 78; FieldByName('Descricao' ).AsString := 'Televiso'; FieldByName('Preco' ).AsCurrency := 754.00; FieldByName('Quantidade').AsInteger := 24; Post; end; end; Apagando registros Pode-se apagar registros inteiros rapidamente, com o mtodo Delete. Delete apaga o registro atual, sem confirmaes, e coloca o DataSet no estado dsBrowse. O registro imediatamente depois do registro apagado se torna o registro atual.
procedure TForm1.Button1Click(Sender: TObject); begin TabProdutos.First; TabProdutos.Delete; end;

Confirmando e cancelando mudanas Depois de inserir um registro, ou modificar os valores dos seus campos, voc pode usar o mtodo Post para tornar as mudanas permanentes, ou usar o comando Cancel para cancelar essas mudanas. Post chamado automaticamente, quando o cursor movido para outro registro, usando os mtodos First, Last, Prior, Next, ou MoveBy. Os mtodos Insert e Append tambm chamam o mtodo Post, tornando permanentes as mudanas que haviam sido feitas antes do registro ser adicionado. Durante a alterao de um registro, ou logo depois da insero de um novo registro, possvel desfazer alteraes recentes, usando o mtodo Cancel. Na maioria dos componentes Data Controls, o mtodo Cancel chamado automaticamente quando o usurio pressiona a tecla ESC, durante a edio de um campo. Quando o mtodo Cancel chamado, os valores dos campos do registro atual revertem para os valores antes da alterao. No caso em que um novo registro acabou de ser inserido, o mtodo Cancel remove o novo registro. O exemplo abaixo adiciona um novo registro a uma tabela com quatro campos (chamada "TabProdutos"). Os valores inseridos so lidos a partir de quatro Edits. As mudanas s
18

Apostila de Delphi

Marcos Ribeiro

tm efeito, entretanto, depois da confirmao do usurio (feita com a funo MessageDlg). Se o usurio confirmar a alterao, usado o mtodo Post para enviar os dados ao banco de dados; se no, o mtodo Cancel cancela todas as mudanas.
procedure TForm1.Button1Click(Sender: TObject); var NovoCodigo: Integer; NovaDescricao: String; NovoPreco: Currency; NovaQuant: Integer; begin // L os valores nos quatro Edits NovoCodigo := StrToInt(EditCodigo.Text); NovaDescricao := EditDescricao.Text; NovoPreco := StrToCurr(EditPreco.Text); NovaQuant := StrToInt(EditQuant.Text); with TabProdutos do begin Open; // Abre a tabela, colocando-a no estado dsBrowse Append; // Cria um novo registro no final (estado dsInsert) // Altera os valores de cada campo FieldValues['Codigo'] := NovoCodigo; FieldValues['Descricao'] := NovaDescricao; FieldValues['Preco'] := NovoPreco; FieldValues['Quantidade'] := NovaQuant; // Confirma as alteraes if MessageDlg('Confirma alterao?', mtConfirmation, mbYesNoCancel,0) = mrYes then Post else Cancel; end; end;

Inserindo e Modificando registros inteiros H trs mtodos que permitem inserir ou alterar registros inteiros: InsertRecord, AppendRecord e SetFields. Mtodo InsertRecord( [valor1, valor2, ...] ) Descrio Insere um novo registro, na posio atual do cursor, com os valores especificados. A lista de valores deve estar entre colchetes e os valores devem ser separados por vrgulas. Pode-se usar nil para especificar um valor nulo (vazio) para um ou mais campos. A ordem em que os valores so especificados deve ser a ordem dos campos no DataSet. Se o nmero de valores especificados for menor que o nmero de campos na tabela, o restante dos campos do novo registro so preenchidos com
19

Apostila de Delphi

Marcos Ribeiro

nil. O mtodo InsertRecord implicitamente no final.

chama

Post

AppendRecord( [valor1, valor2, ...] ) Idntico ao mtodo InsertRecord, mas o registro adicionado ao final do DataSet. Se o DataSet for uma tabela indexada, os mtodos AppendRecord e InsertRecord tm exatamente o mesmo efeito a posio do registro adicionado depende do ndice da tabela. O mtodo AppendRecord tambm chama Post implicitamente, tornando as alteraes permanentes. SetFields( [valor1, valor2, ...] ) Altera os valores dos campos correspondentes do registro atual. O DataSet deve estar no estado dsEdit para que SetFields possa ser usado (use o mtodo Edit). Para alterar apenas alguns campos do registro atual, use nil como argumento para cada campo que no deseja alterar. O mtodo Post no chamado implicitamente por SetFields. Deve-se chamar Post depois do mtodo para tornar as alteraes permanentes.

O exemplo a seguir usa o mtodo InsertRecord para inserir um novo registro na tabela TabProdutos (esta tabela tem os campos Codigo, Descricao, Preco e Quantidade). O exemplo altera somente os dois primeiros campos (usando os valores lidos) e o ltimo campo, assumindo uma quantidade fixa de 12 para este. Para o terceiro campo (o preo) especificado como nil. Isso deixa o campo vazio (ou inalterado). Em seguida, o programa pergunta se o campo Preco deve ser preenchido ou no. Caso positivo, usado o mtodo SetFields para alterar somente o preo do registro atual (note como nil usado para todos os outros campos).

20

Apostila de Delphi

Marcos Ribeiro

procedure TForm1.Button1Click(Sender: TObject); var NovoCodigo: Integer; NovaDescricao: String; NovoPreco: Currency; begin NovoCodigo := StrToInt(EditCodigo.Text); NovaDescricao := EditDescricao.Text; with TabProdutos do begin Open; // Insere um novo registro InsertRecord([NovoCodigo, NovaDescricao, nil, 12]); // Confirma a entrada do preco if MessageDlg('Entrar com preo agora?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then //Realiza a alteracao do preco (o campo estava vazio) begin NovoPreco := StrToCurr(InputBox('','Digite o preo','')); Edit; //Coloca o Table no estado dsEdit (essencial) SetFields([nil, nil, NovoPreco, nil]); //Altera o preco Post; //Confirma a alterao end; end; end;

Localizando registros com Locate O mtodo Locate maneira mais verstil e mais rpida de localizar registros em um DataSet. Como argumentos do mtodo Locate, voc especifica o nome dos campos a serem consultados, o valor desejado para cada campo especificado e um conjunto de opes de localizao (que pode ser vazio). Veja a seguir um exemplo de uma chamada ao mtodo Locate:
TabClientes.Locate('Nome;Sobrenome', VarArrayOf(['Maria', 'S']),[loPartialKey]);

O exemplo localiza o primeiro registro da tabela TabClientes, com nome "Maria" e sobrenome comeando com "S". O primeiro parmetro de Locate uma lista de campos separados por ponto-e-vrgula, entre aspas simples. O segundo parmetro um array especial que deve ser construdo com o comando VarArrayOf (para o caso de uma pesquisa em mais de um campo). Os valores aqui devem "casar" com os campos especificados no primeiro parmetro. O terceiro parmetro especifica opes de procura. H duas opes de procura disponveis para o mtodo Locate: LoPartialKey Permite que os valores de procura especificados no segundo parmetro sejam parciais (parte de um nome, por exemplo).

21

Apostila de Delphi

Marcos Ribeiro

loCaseInsensitive

Faz com que Locate ignore maisculas e minsculas. Com essa opo "maria", "Maria" e "MARIA" so considerados iguais, por exemplo.

Se houver algum registro que case com os valores especificados, o mtodo Locate retorna True e move o cursor para aquele registro. Se nenhum registro for encontrado, Locate retorna False. Se a localizao for baseada em apenas um campo, a sintaxe de Locate mais simples. Veja um exemplo, que localiza o cliente com cdigo igual a 100. TabClientes.Locate('Codigo', 100, []); Agora veja um exemplo que l os valores em dois componentes Edit ("EditNome" e "EditSobrenome") e localiza o primeiro registro que casa com esses valores, mostrando uma mensagem com o resultado da localizao.
procedure TForm1.Button1Click(Sender: TObject); var NomeProc, SobrenomeProc: String; //Valores procurados Achou: Boolean; //Resultado da pesquisa begin NomeProc := EditNome.Text; SobrenomeProc := EditSobrenome.Text; Achou := TabFunc.Locate('Nome;Sobrenome', VarArrayOf([NomeProc,SobrenomeProc]), [loPartialKey, loCaseInsensitive]); if Achou then ShowMessage('Registro encontrado.') else ShowMessage('Registro no encontrado.'); end;

Eventos dos DataSets Os DataSets oferecem vrios eventos que podem ser usados para verificar e validar mudanas antes de se tornarem permanentes. H eventos associados a todo os mtodos mais importantes, como Open, Close, Insert e Edit. Para a maioria desses mtodos h dois eventos: um que ocorre antes de o mtodo ser chamado (prefixo "Before"), e outro que ocorre depois (prefixo "After"). Veja uma descrio breve de cada um desses eventos: Estes eventos... BeforeOpen, AfterOpen BeforeClose, AfterClose ...ocorrem: Antes e depois de o DataSet ser aberto. Antes e depois de o DataSet ser fechado.

22

Apostila de Delphi

Marcos Ribeiro

BeforeInsert, AfterInsert BeforeEdit, AfterEdit

Antes e depois de o DataSet entrar no estado dsInsert. Antes e depois do DataSet entrar no estado dsEdit.

BeforeCancel, AfterCancel Antes e depois do comando Cancel ser chamado (implicitamente ou explicitamente). BeforePost, AfterPost BeforeDelete, AfterDelete OnNewRecord Antes e depois de as mudanas em um DataSet serem enviados para o Banco de Dados (comando Post). Antes e depois de um registro ser apagado. Quando um novo registro adicionado. Usado geralmente para definir valores padro para alguns campos. Quando os campos calculados do DataSet so calculados.

OnCalcFields

Controlando a atualizao de componentes Componentes associados a dados de um banco de dados, como o DBGrid e a maioria dos outros componentes Data Controls, so atualizados automaticamente quando o cursor movido de um registro para outro. Muitas vezes, essa atualizao no desejada como, por exemplo, quando o programa faz uma pesquisa em uma tabela, ou faz atualizaes em vrios registros. A atualizao dos componentes pode ser desabilitada temporariamente usando o mtodo DisableControls e depois reabilitada com EnableControls. Geralmente, esses mtodos so usados em um bloco try-finally para que os componentes sejam reabilitados mesmo se ocorrer uma exceo no processamento do DataSet. Veja a seguir um exemplo que usa esse dois mtodos.

23

Apostila de Delphi

Marcos Ribeiro

O exemplo aumenta, em 8%, o salrio de todos os funcionrios cadastrados no Table "TabFuncionarios". Os componentes associados ao Table so desabilitados antes do processamento da tabela e so reabilitados no final, na parte finally, mesmo se houver excees durante o processamento.
procedure TForm1.Button1Click(Sender: TObject); begin with TabFuncionarios do begin try Open; Edit; DisableControls; //Desabilitar atualizao while not EOF do begin FieldValues['Salario'] := FieldValues['Salario']*1.08; Next; end; finally EnableControls; //Habilitar atualizao end; end; end;

H mais um mtodo relacionado atualizao de componentes: o mtodo Refresh. Esse mtodo fora a atualizao dos componentes, fazendo com que os dados sejam buscados novamente no banco de dados. Refresh til quando so feitas alteraes no registro atual por outro usurio, por exemplo. Uma chamada a Refresh garante que os dados exibidos so os mais atuais.

24

Apostila de Delphi Usando o componente DataSource

Marcos Ribeiro

O componente DataSource funciona como um "canal de comunicao" entre DataSets e os componentes DataControls. Todo DataSet (Table, Query, etc.) deve ser associado a um componente DataSource para que seus dados possam ser exibidos em componentes Data Controls. Propriedades do componente DataSource O componente DataSource um componente simples, com apenas cinco propriedades, duas das quais (Name e Tag) so comuns a todos os componentes do Delphi. Veja uma descrio das outras trs: Propriedade AutoEdit Descrio Determina se o DataSet ligado ao DataSource entra no estado dsEdit automaticamente quando o usurio clica no componente associado (um DBGrid, por exemplo). Lembre-se que um DataSet no estado dsEdit pode ter seus registros alterados. O padro para essa propriedade True. Se for especificado o valor False, o DataSet deve ser colocado no estado dsEdit explicitamente, usando o mtodo Edit, para que seja possvel fazer alteraes nele. Contm o nome do DataSet associado ao DataSource. Determina se o DataSource est ou no ativo (True = ativo). Quando Enabled = False (desativado) todos os componentes ligados ao DataSource aparecem vazios (no exibem dados).

DataSet Enabled

Eventos do componente DataSource H apenas trs eventos para o componente DataSource: Evento OnDataChange Descrio Este evento ocorre quando o cursor do DataSet movido para outro registro, depois de alteraes no DataSet. Isso acontece, por exemplo, quando os mtodos First, Last, Next ou Prior so chamados. Voc pode usar esse evento para sincronizar os dados exibidos com os dados de um banco de dados (no caso em que componentes comuns so usados para exibir dados, por exemplo).

25

Apostila de Delphi

Marcos Ribeiro

OnStateChange OnUpdateData

Este evento ocorre quando o estado do DataSet associado ao DataSource alterado. Ocorre imediatamente antes de uma atualizao no DataSet associado depois de um comando Post, mas antes dos dados serem realmente atualizados. O evento ocorre mesmo se o comando Post for chamado implicitamente por outro comando ou outro componente.

Componentes TField Quando voc associa um DataSet a uma tabela de um banco de dados e abre o DataSet, o Delphi cria automaticamente campos dinmicos, um para cada campo da tabela. Os campos dinmicos so criados na memria do computador, temporariamente, quando o DataSet aberto e destrudos quando o DataSet fechado. O tipo dos campos dinmicos, as suas propriedades, e a ordem em que eles so exibidos dependem somente das tabelas s quais esses campos esto associados. Para que se tenha mais controle sobre os campos de um DataSet, o Delphi oferece os componentes TField. Componentes TField podem estar associados a um campo de um DataSet, ou podem ser novos campos, derivados de consultas ou clculos. Os componentes TField no podem ser adicionados diretamente a um formulrio. Eles fazem parte de um DataSet. Os campos definidos pelos componentes TField so tambm chamados de campos persistentes. Isso porque eles "persistem" durante a execuo do aplicativo e no so destrudos cada vez que o DataSet fechado (como acontece com os campos dinmicos). Com os componentes TField, voc pode controlar quais campos so exibidos, o tipo e a formatao de cada campo e vrias outras propriedades. Voc pode tambm criar campos calculados e campos lookup. Esses dois tipos de campos so, talvez, a principal razo para a existncia dos componentes TField. Criando campos persistentes Os componentes TField, ou campos persistentes, s podem ser criados dentro de DataSets. Na maioria das vezes, os campos persistentes so associados aos campos de uma tabela j existente, portanto o DataSet deve estar ligado a um banco de dados antes da criao dos campos. Como os DataSets mais usados so os componentes Table, usaremos esse componentes como base para os exemplos do restante dessa seo. Os procedimentos apresentados a seguir, no entanto, valem tambm para outros tipos de DataSets, como o componente Query, por exemplo.

26

Apostila de Delphi Para criar campos persistentes para um componente Table:

Marcos Ribeiro

Clique duas vezes no componente Table, para exibir o Fields Editor (veja ilustrao a seguir).

O Fields Editor

a partir do Fields Editor que so feitas todas as operaes com campos persistentes. Clique com o boto direito dentro do Fields Editor e escolha o comando Add Fields. Voc pode tambm usar o comando Add all Fields para criar campos persistentes para todos os campos do DataSet, rapidamente (neste caso, o passo 3 no necessrio). Uma janela com todos os campos da tabela exibida:

27

Apostila de Delphi

Marcos Ribeiro

Todos os campos so inicialmente selecionados. Clique em um campo para selecionar somente ele e use CTRL ou SHIFT para selecionar vrios campos. Depois clique em OK para criar um campo persistente para cada campo selecionado. O Fields Editor exibido novamente, agora com os novos campos criados:

Os campos criados dessa maneira substituem os campos dinmicos criados pelo Delphi. No pode haver campos dinmicos e persistentes em um mesmo DataSet. Se, por exemplo, voc criar apenas alguns campos persistentes (e no todos os disponveis), somente esses campos sero mostrados nos componentes ligados ao DataSet. A ordem em que os campos exibidos nos componentes ligados ao DataSet a ordem em que eles so listados no Fields Editor. Essa ordem pode ser alterada arrastando os nomes dos campos dentro do Fields Editor. Pode-se tambm apagar campos usando DELETE, ou adicionar novos campos usando o comando Add Fields novamente. Tipos de campos persistentes Quando voc cria campos persistentes para um DataSet, o Delphi adiciona, ao cdigo da Unit que contm o DataSet, declaraes para cada componente TField associado. Veja as declaraes geradas para o exemplo anterior (destacadas em negrito). unit Unit1; ... type TForm1 = class(TForm) TabEmp: TTable; TabEmpEmpNo: TIntegerField; TabEmpLastName: TStringField; TabEmpFirstName: TStringField; TabEmpPhoneExt: TStringField;
28

Apostila de Delphi TabEmpHireDate: TDateTimeField; TabEmpSalary: TFloatField; end; ...

Marcos Ribeiro

TIntegerField, TStringField, TDateTimeField e TFloatField so tipos de componentes TField. Esses tipos so definidos automaticamente pelo Delphi, dependendo dos campos associados no banco de dados. Por exemplo, um campo do tipo "Integer" em uma tabela Paradox, gera um componente do tipo TIntegerField; um campo do tipo "Alpha" gera um componente do tipo TStringField, e assim por diante. Veja uma lista dos tipos mais importantes de componentes TField: Tipo de TField TBooleanField TBlobField TCurrencyField TDateField TDateTimeField TFloatField TIntegerField TMemoField TStringField TTimeField Valores que podem ser armazenados Valores booleanos (True ou False) Dados binrios (figuras, por exemplo). Nmeros reais. Compatvel com tipo Currency. Datas. Compatvel com tipo TDate. Datas e horas. Compatvel com o tipo TDateTime Nmeros reais. Compatvel com tipos Float, Real e Double. Nmeros inteiros. Compatvel com tipo Integer. Textos longos. Compatvel com tipo String. Strings pequenos (limitados a 8192 bytes). Horas. Compatvel com tipo TTime.

Os componentes TField (de vrios tipos) podem ser manipulados diretamente no cdigo. Eles possuem propriedades e eventos como os outros componentes. A diferena que eles so componentes internos, que no aparecem diretamente nos formulrios. Isso algumas vezes assusta o programador iniciante, que est acostumado a trabalhar visualmente com os componentes. H vrios outros componentes desse tipo no Delphi, mas eles so apenas usados para programao avanada. Campos calculados Os campos calculados exibem valores que so calculados durante a execuo do aplicativo. Os clculos so geralmente baseados em valores de outros campos, mas podem tambm ser completamente independentes (o que raro).

29

Apostila de Delphi Para criar um campo calculado para um DataSet: Abra o Fields Editor para o DataSet. (Clique duas vezes no DataSet.)

Marcos Ribeiro

Dentro do Fields Editor, clique com o boto direito e escolha o comando New Field. O Delphi exibe a caixa de dilogo New Field, onde se pode definir vrias opes para o novo campo (veja ilustrao a seguir). Digite um nome para o campo na rea "Name". Este o nome pelo qual o componente ser identificado no Fields Editor. Enquanto o nome digitado, o nome na rea "Component" atualizado automaticamente. Este nome , por padro, o nome do DataSet que contm o campo, seguido pelo nome definido na rea "Name".

Defina um tipo para o campo. O tipo deve ser compatvel com os valores usados para o clculo do campo. Depois clique em OK para criar o campo. O Delphi adiciona o nome do campo lista de campos no Editor de Cdigo e acrescenta uma linha Unit do formulrio, declarando um componente para o novo campo. O exemplo de cdigo a seguir mostra (em negrito) a linha acrescentada. Note que o nome do componente o nome que o Delphi define em "Component", na hora da criao do campo.
... type TForm1 = class(TForm) TabEmp: TTable; TabEmpEmpNo: TIntegerField; TabEmpLastName: TStringField; TabEmpFirstName: TStringField;

30

Apostila de Delphi
TabEmpPhoneExt: TStringField; TabEmpHireDate: TDateTimeField; TabEmpSalary: TFloatField; TabEmpNomeCompleto: TStringField; end;

Marcos Ribeiro

... Assim que criado, um campo calculado contm apenas valores nulos. Para realizar os clculos necessrios para o campo, voc deve digitar cdigo para o evento OnCalcFields do DataSet que contm o campo. Esse cdigo deve calcular um valor para o campo. Veja um exemplo que "calcula" o nome completo de cada funcionrio (concatenando o primeiro e ltimo nomes).
procedure TForm1.TabEmpCalcFields(DataSet: TDataSet); begin DataSet['NomeCompleto'] := DataSet['FirstName'] + DataSet['LastName']; end;

Voc pode definir vrios campos calculados para um DataSet. O valor de todos os campos calculados deve ser calculado sempre dentro do cdigo para evento OnCalcFields do DataSet. No exemplo a seguir, o realizado o clculo de dois campos calculados e uma tabela de funcionrios (chamada "TabFunc"): um para o salrio anual e outro para o endereo completo.
procedure TForm1.TabFuncCalcFields(DataSet: TDataSet); begin DataSet['SalarioAnual']:= DataSet['SalarioMensal']*12; DataSet['EndCompleto']:= DataSet['Rua'] + ', ' + DataSet['Numero'] + ', ' + DataSet['Bairro']; end;

31

Apostila de Delphi Campos lookup

Marcos Ribeiro

Os campos lookup so campos especiais, usados para localizar automaticamente valores em um segundo DataSet, baseando-se em "valores-chave" de um primeiro DataSet. Por exemplo, suponha que o seu aplicativo use uma tabela Produtos com campos para o cdigo e a descrio de cada produto, e outra tabela Pedidos, com campos para o cdigo do produto, e a quantidade e a data do pedido. Nesse caso, voc poderia definir um campo lookup na tabela Pedidos para mostrar a descrio do produto, baseando-se no cdigo do produto. O campo lookup buscaria a descrio na tabela Produtos e a mostraria na tabela Pedidos (o cdigo do produto poderia at ser escondido). Para criar um campo lookup em um DataSet: Clique duas vezes no DataSet para exibir o Fields Editor. Dentro do Fields Editor, clique com o boto direito e escolha o comando New Field: Digite um nome para o novo campo em "Name" e defina um tipo para o campo em "Type". Para "Field Type", escolha "Lookup" Em "Lookup definition", defina valores para as opes descritas a seguir: Opo Dataset Key Fields Descrio O DataSet de onde sero buscados os valores para o campo lookup. Os campos chave que sero usados como base para realizar a busca. Estes so campos do DataSet que contm o campo lookup. Geralmente usado apenas um campo aqui. Escolha um campo da lista ou digite diretamente o nome do campo. Para usar mais de um campo chave, separe os nomes dos campos com ponto-e-vrgula. Os campos do DataSet que sero comparados com os campos especificados em Key Fields. Estes campos pertencem ao DataSet que contm os valores a serem buscados pelo campo lookup. O campo a ser retornado pela busca. O valor desse campo o valor exibido no campo lookup.

Lookup Keys

Result Field

A ilustrao abaixo mostra a definio de um campo lookup que exibe a descrio de um produto, baseando-se no seu cdigo. O campo lookup "casa" o campo CodProduto da
32

Apostila de Delphi

Marcos Ribeiro

tabela Pedidos com o campo Codigo da tabela Produtos, retornando a descrio do produto.

Propriedades dos componentes TField Uma das maiores vantagens dos componentes TField (campos persistentes) sobre os campos dinmicos (criados automaticamente pelo Delphi) o fato de que voc pode alterar as propriedades dos campos TField. Veja as propriedades mais teis dos campos TField na tabela a seguir: Propriedade Alignment DefaultExpression Descrio Determina o alinhamento do valor exibido no campo. Defina aqui um valor padro para o campo. O valor pode ser qualquer expresso vlida em SQL, mas que no se refira a nomes de campos. O valor deve ser especificado entre aspas simples, a no ser que seja formado apenas por dgitos. O ttulo mostrado para o campo em componentes como o DBGrid. Determina se o campo pode ou no ser alterado. Quando um campo criado, ReadOnly definido de acordo com o campo da tabela de banco de dados associado a ele. Voc pode alterar ReadOnly para True para proteger um campo contra alteraes, mesmo se o campo correspondente no banco de dados no estiver protegido. NOTA: Em um componente DBGrid, pressionar TAB pula os campos que tm a propriedade ReadOnly = True.
33

DisplayLabel ReadOnly

Apostila de Delphi

Marcos Ribeiro

Required

O valor de Required definido automaticamente pelo Delphi quando um campo criado. Essa propriedade determina se o campo pode ou no ser nulo. Faa Required = True para proibir valores nulos para um campo. Altere essa propriedade para False para esconder o campo em um DBGrid. O valor padro True. Essa propriedade muito til quando se usa campos calculados em uma tabela. Voc pode esconder os campos que foram usados para os clculos, mostrando apenas os campos com os resultados, por exemplo.

Visible

H vrias outras propriedades importantes que no foram citadas aqui. Muitas delas so definidas automaticamente quando um campo criado e raramente precisam ser alteradas. Outras so tratadas no curso avanado.

34

Apostila de Delphi Componentes Data Controls

Marcos Ribeiro

Os componentes da pgina Data Controls, da paleta de componentes do Delphi, permitem acessar e alterar dados em um banco de dados diretamente. J vimos uma introduo breve sobre esses componentes e j usamos um deles nos exemplos anteriores: o componente DBGrid. Neste captulo, veremos detalhes sobre como funcionam e como usar os mais importantes componentes Data Controls. Todos os componentes Data Controls tm a capacidade de exibir e alterar dados de um banco de dados. Muitas das tarefas necessrias para a leitura e a manipulao de dados so realizadas automaticamente por esses componentes. Algumas vezes, um aplicativo inteiro com acesso a bancos de dados pode ser desenvolvido usando componentes Data Controls, sem a necessidade de manipular dados diretamente com programao. Propriedades DataSource e DataField H dois tipos bsicos de componentes Data Controls: os que acessam campos de uma DataSet, como os componentes DBEdit e DBText, e os que acessam registros inteiros de um DataSet, como o componente DBGrid. Os componentes que acessam os dados de um DataSet campo a campo tm duas propriedades importantes em comum: DataSource e DataField. A propriedade DataSource determina o DataSource ao qual o componente est conectado. Este DataSource deve estar conectado a um DataSet, para que possa ter acesso ao banco. A propriedade DataField indica o campo ao qual o componente est associado. Este um dos campos do DataSet conectado ao DataSource. Os componentes DBGrid e DBNavigator acessam dados registro por registro, e no campo por campo, como os outros componentes Data Controls. Portanto, esses componentes no apresentam a propriedade DataField (eles no esto associados a um campo especfico). Outras propriedades e recursos comuns A maioria dos componentes Data Controls tm componentes correspondentes na pgina Standard da paleta de componentes. Por exemplo, o componente DBEdit corresponde ao componente Edit, e o componente DBText corresponde ao componente Label. Na verdade, vrios dos componentes Data Controls so apenas verses com acesso a bancos de dados dos componentes da pgina Standard. Por isso, a maioria das propriedades desses componentes so as mesmas, como aquelas que determinam a cor, o alinhamento, as dimenses, etc. Muitos eventos e mtodos tambm so os mesmos. Nas sees a seguir, veremos apenas as propriedades e eventos relevantes para o
35

Apostila de Delphi

Marcos Ribeiro

trabalho com bancos de dados (alm de algumas outras propriedades essenciais). Veja os captulos sobre os componentes comuns para mais detalhes sobre as outras propriedades e eventos. Componente DBEdit O componente DBEdit a verso com acesso a banco de dados do componente Edit. Voc pode us-lo para exibir ou alterar o valor de um campo de um banco de dados diretamente. Veja algumas propriedades importantes desse componente. Propriedade Text Descrio (Acessvel somente atravs de programao). Como o valor exibido nesse componente vem de um campo, no possvel alterar a propriedade Text em tempo de desenvolvimento, para definir um valor inicial a ser exibido. A propriedade Text, entretanto, pode ser lida e alterada em tempo de execuo. Quando o valor de Text alterado, o campo associado no banco de dados alterado tambm. Determina se o valor exibido pode ou no ser alterado pelo usurio. Altere ReadOnly para True para no permitir alteraes. O nmero mximo de caracteres que pode ser digitado dentro do DBEdit. Use essa propriedade para trabalhar com campos de tamanho fixo, como os usados para cdigos, por exemplo.

ReadOnly MaxLength

Componente DBText O componente DBText corresponde ao componente Label. Esse componente usado para exibir valores que no devem (nem podem) ser alterados. Use este componente para indicar que os campos so apenas para exibio. No h como alterar o que exibido no componente DBText diretamente, nem com programao. (O componente no apresenta a propriedade Caption). O que exibido no componente depende exclusivamente do campo associado no banco de dados, definido pelas propriedades DataSource e DataField.

36

Apostila de Delphi Componente DBMemo

Marcos Ribeiro

Este componente semelhante ao componente Memo. Ele usado para exibir trechos longos de texto, como os armazenados em campos do tipo "MEMO" dos bancos de dados. H algumas novas propriedades interessantes: Propriedade AutoDisplay Descrio Define se o texto do campo associado exibido imediatamente ou no. Se AutoDisplay for False, o texto s ser exibido quando o usurio clicar duas vezes no componente. Isso torna o aplicativo mais rpido, especialmente quando os textos a serem exibidos so muito extensos O valor padro True, que faz com o que texto seja exibido automaticamente, quando o usurio passa de um registro para outro. Determina se o texto exibido no componente pode ser alterado ou no pelo usurio.

ReadOnly

Componente DBCheckBox O componente DBCheckBox uma verso especial, com acesso a bancos de dados, do componente CheckBox. Esse componente geralmente ligado a um campo do tipo booleano, mas tambm pode ser ligado a outros tipos de campos com dois valores possveis, como "Sim/No", "Ligado/Desligado", etc. Os valores associados aos estados do DBCheckBox so definidos pelas propriedades ValueChecked e ValueUnchecked: Propriedade ValueChecked Descrio Os valores que correspondem ao DBCheckBox quando ele est marcado. Pode-se especificar um nico valor, ou uma lista de valores separados por ponto-e-vrgulas, como "Sim; Verdadeiro; True". Se o valor do campo associado for um dos valores especificados na lista, o componente DBCheckBox aparece marcado. Se o campo associado for um campo booleano, um valor True marca, e um valor False desmarca o DBCheckBox. Isso acontece mesmo se os valores True e False no forem especificados nas propriedades ValueChecked e ValueUnchecked. Os valores que correspondem ao DBCheckBox quando ele est desmarcado. Como para a propriedade anterior, pode-se especificar um nico valor, ou uma lista de valores, como por

ValueUnchecked

37

Apostila de Delphi

Marcos Ribeiro

exemplo: "No; False; Falso". NOTA: se o valor do campo associado ao DBCheckBox no for nem True, nem False, nem um valor das propriedades ValueChecked ou ValueUnchecked, o componente aparece acinzentado (nem marcado, nem desmarcado). Componente DBRadioGroup Esse componente semelhante ao componente RadioGroup. Ele usado para listar opes que so mutuamente exclusivas (somente uma pode ser escolhida). Uma caracterstica interessante desse componente que o ttulo exibido ao lado dos RadioButtons no precisa ser o mesmo valor que lido ou armazenado no campo associado. A propriedade Items define os ttulos que so exibidos e Values define os valores associados a cada ttulo. Propriedade Caption Items Descrio O texto que aparece na parte de cima do DBRadioGroup. Usado para identificar o grupo de opes. Os itens exibidos ao lado de cada RadioButton. Clique duas vezes ao lado dessa propriedade para definir a lista de itens digite um item para cada linha. (Apenas disponvel atravs de programao). Retorna o ndice do RadioButton que est selecionado no momento. O ndice um nmero inteiro. Zero corresponde ao primeiro RadioButton. Os valores associados aos itens exibidos. Os valores especificados so os valores que so lidos ou escritos no campo associado. Clique duas vezes ao lado da propriedade para definir a lista de valores. A ordem dos valores determina a associao com os itens especificados na propriedade Items. Se Values for deixada vazia vazia, os valores lidos e armazenados so os especificados na propriedade Items (os mesmos que aparecem na tela). (Apenas disponvel atravs de programao). correspondente ao RadioButton que est selecionado. O valor

ItemIndex

Values

Value

38

Apostila de Delphi Componente DBImage

Marcos Ribeiro

Este componente usado para exibir imagens armazenadas em campos do do tipo BLOB (Binary Large OBject). Veja as propriedades mais importantes do componente DBImage: Propriedade AutoDisplay Descrio Se AutoDisplay for True (o valor padro), a imagem atualizada automaticamente quando o campo associado alterado. Se AutoDisplay for False, a imagem s atualizada (recarregada) quando o usurio clicar duas vezes no componente DBImage. BorderStyle determina se exibida uma linha em volta da imagem. O valor bsNone no mostra um linha; bsSingle exibe uma linha fina. Se Center for True (o padro), a imagem exibida centralizada no componente. Se Center for False, a imagem exibida no canto esquerdo superior do componente. Altere QuickDraw para True para que imagens com 256 cores ou mais sejam exibidas mais rapidamente, mas com perda de qualidade. Altere QuickDraw para False para obter uma maior qualidade de exibio, mas com perda de velocidade. Determina se a imagem ser ou no "esticada" para preencher todo o espao do componente DBImage. Se Stretch for True, a imagem esticada (o que geralmente causa distores e perda de qualidade); se Stretch for False, o tamanho da imagem no alterado.

BorderStyle

Center

QuickDraw

Stretch

Componentes DBListBox e DBComboBox Os componentes DBListBox e DBComboBox so as verses com acesso a bancos de dados dos componente ListBox e ComboBox, respectivamente. Os valores listados nesses componentes devem ser adicionados diretamente, alterando a propriedade Items. Os valores no so trazidos do campo associado no banco de dados (isso no seria prtico para tabelas com centenas ou milhares de valores diferentes, por exemplo). Propriedade Items Descrio Items determina os itens exibidos. Esses itens podem ser adicionados manualmente, em tempo de desenvolvimento, ou em

39

Apostila de Delphi

Marcos Ribeiro

tempo de execuo. A propriedade Items do tipo TStrings. Isso significa que voc pode usar os mtodos Add e Append para adicionar itens, e Delete para apagar itens (veja detalhes sobre o tipo TStrings na seo sobre o componente Memo, no captulo "Componentes Visuais Comuns". Style (Somente para o componente DBComboBox). Determina o comportamento e a aparncia do componente DBComboBox. As opes so idnticas s do componente ComboBox elas so descritas em detalhe no seo sobre este componente.

Componentes DBLookupList e DBLookupCombo Estes dois componentes so semelhantes, na sua aparncia, aos componentes DBListBox e DBComboBox, mas oferecem vrios recursos a mais. Os dois componentes trabalham com dois DataSets e no um como acontece com a maioria dos outros componentes Data Controls. O comportamento dos componentes DBLookupList e DBLookupCombo parecido com o dos campos lookup, que vimos no captulo sobre componentes TField. Eles "casam" dois campos especificados em DataSets diferentes e exibem um valor resultante. Um componente DBLookupList ou DBLookupCombo pode ser ligado a um campo lookup. Nesse caso, basta definir as propriedades DataSource e DataField apropriadamente, para associar o campo lookup ao componente. O componente "reconhece" que o campo o do tipo lookup realiza as buscas automaticamente, exibindo os resultados. Os componentes DBLookupList e DBLookupCombo, no entanto, so geralmente ligados a campos comuns. Eles tm a capacidade de fazer a busca dos valores automaticamente, sem a necessidade de usar campos lookup predefinidos. Para isso, necessrio lig-los a campos de dois DataSets diferentes. Para configurar componentes DBLookupList ou DBLookupCombo: Na propriedade DataSource, escolha o DataSource a ser diretamente ligado ao componente. Os dados desse DataSource so os dados que sero alterados pelo componente. Na propriedade DataField, escolha o campo que ser alterado. Na propriedade ListSource defina o DataSet de onde sero lidos os valores, de acordo com o valor do campo especificado em DataField. Na propriedade ListField defina o campo de onde os valores sero lidos. Os valores lidos a partir do campo definido em ListField so os valores exibidos no componente. Finalmente, altere a propriedade KeyField para o campo que ser comparado com o campo definido em DataField.
40

Apostila de Delphi

Marcos Ribeiro

Isso termina a configurao. Quando os DataSets so ativados, o valor do campo DataField (do primeiro DataSet) lido e comparado com os valores no campo KeyField (do segundo DataSet). O valor retornado o valor do campo ListField (do segundo DataSet). Componente DBNavigator

O componente DBNavigator permite realizar uma serie de operaes comuns em registros de um DataSet, como navegao, insero e deleo. Um componente DBNavigator ligado a um DataSet atravs de um componente DataSource (como os outros componentes Data Controls), mas o acesso feito registro por registro e no campo por campo. comum usar um componente DBNavigator em associao com um componente DBGrid para a navegao dos dados em um DataSet. O componente DBNavigator composto de um conjunto de botes. Cada boto executa um dos mtodos do DataSet, como First, Last, Prior, Next, Post, Edit, etc. Tudo que pode ser feito com DBNavigator pode ser feito atravs de programao, usando esses mtodos diretamente. O DBNavigator apenas uma maneira simples e rpida de oferecer recursos para a navegao e alterao de um DataSet para o usurio, sem a necessidade de programao. Veja a seguir os mtodos associados a cada boto do DBNavigator:

First Post

Delete Last

Prior Cancel

Edit Insert

Next Refresh

H vrias propriedades importantes para o componente DBNavigator. Com elas, voc pode escolher quais os botes so exibidos no componente (VisibleButtons), e controlar a aparncia de "Dicas" para cada boto (Hints e Showhint). Propriedade ConfirmDelete Descrio Se ConfirmDelete for True, uma caixa de confirmao exibida quando o boto "Delete" clicado. Caso contrrio, o registro atual apagado sem confirmaes. Especifique aqui o DataSource ao qual o DBNavigator est ligado. Determina se os botes do DBNavigator so exibidos com efeito tridimensional, ou no. Se Flat for True, o efeito tridimensional no exibido e o componente se torna semelhante s barras de
41

DataSource Flat

Apostila de Delphi

Marcos Ribeiro

ferramentas do Office 97. Hints, ShowHint Altere Hint para definir as "dicas" que aparecem para cada boto no DBNavigator. Clique duas vezes ao lado da propriedade e digite uma linha de texto para cada dica. As dicas s sero mostradas se a propriedade ShowHint for True. Se Hints for deixada vazia e ShowHint for True, as dicas exibidas so os prprios nomes dos botes (em ingls). Especifique aqui quais botes do DBNavigator voc deseja exibir. Esta propriedade muito importante, pois na maioria das vezes o DBNavigator oferece mais botes do que necessrio. Para definir os botes a serem exibidos, clique duas vezes no nome da propriedade para abrir um lista de subpropriedades. mostrada uma subpropriedade para cada boto que pode ser exibido (veja a figura ao lado). Para esconder um boto, altere a propriedade correspondente para False. Para exibir um boto altere a propriedade correspondente para True.

VisibleButtons

Componente DBGrid O componente DBGrid um dos componentes mais usados para trabalhar com os dados de um DataSet. Da mesma forma que para o componente DBNavigator, o componente DBGrid trabalha com dados registro por registro. Veja um exemplo de um DBGrid em ao:

Um DBGrid formado por linhas, colunas e clulas. Cada clula contm um valor de um campo de um DataSet. Como padro, o DBGrid mostra tambm o nome de cada coluna e indica o registro atual, atravs de um pequeno tringulo no lado esquerdo.
42

Apostila de Delphi

Marcos Ribeiro

A propriedade mais usada no componente DBGrid a propriedade Options, que contm vrias opes que podem ser ligadas (valor True) ou desligadas (valor False). Veja a seguir o significado das opes mais importantes: Opo dgEditing dgAlwaysShowEditor dgTitles dgIndicator dgColumnResize dgColLins dgRowLines dgTabs dgRowSelect dgAlwaysShowSelect ion dgConfirmDelete dgCancelOnExit Efeito quando ligada Permite que o usurio altere dados dentro do DBGrid. Faz com que o DBGrid esteja sempre pronto para realizar alteraes (no estado dsEdit). Faz com que ttulos sejam exibidos no topo de cada coluna. Exibe o indicador do registro atual (um pequeno tringulo no lado esquerdo do DBGrid). Permite que colunas sejam movidas ou redimensionadas. Exibe linhas entre as colunas do DBGrid. Exibe linhas entre as linhas do DBGrid. Permite que o usurio use TAB e SHIFT+TAB para passar de uma clula do DBGrid para outra. Permite que o usurio selecione linhas inteiras no DBGrid. Faz com que a clula ou linha selecionada permanea selecionada, mesmo quando o DBGrid no est com o foco. Faz com que uma caixa de confirmao aparea, quando o usurio usa CTRL+DELETE para apagar um registro. Faz com que um novo registro inserido no DBGrid no seja enviado para o banco de dados, a no ser que o registro tenha sido alterado (no esteja vazio). Permite que mais de uma linha no DBGrid possa ser selecionada ao mesmo tempo.

dgMultiSelect

O componente SQLquery Neste captulo, veremos como usar o componente SQLQuery para realizar consultas SQL em bancos de dados. O componente SQLQuery permite realizar consultas SQL em qualquer tipo de banco de dados suportado pelo DbExpress.

43

Apostila de Delphi

Marcos Ribeiro

Um componente SQLQuery contm o texto de uma consulta SQL e a especificao dos parmetros usados na consulta. O componente SQLQuery se encarrega da execuo da consulta SQL e do processamento dos dados retornados pelo banco de dados, para a consulta. Configurando um componente SQLQuery O componente SQLQuery, um tipo de DataSet. Portanto, muitas das propriedades e mtodos que vimos no captulo sobre DataSets tambm se aplicam ao componente SQLQuery. Veja os passos bsicos necessrios para usar e configurar um componente SQLQuery em um formulrio: Adicione um componente SQLQuery ao formulrio. Configure a conexo na propriedade SQLConnection a ser utilizado. Na propriedade SQL, especifique a consulta SQL que a ser executada pelo componente. Adicione um componente DataSource ao formulrio e altere a sua propriedade DataSet para o nome do componente SQLQuery. Para exibir os resultados gerados pelo componente SQLQuery, adicione um componente DBGrid, ou outro componente com acesso a dados. Altere a propriedade DataSource desse componente para o nome do componente DataSource que voc acabou de adicionar. Para executar a consulta SQL, altere a propriedade Active do componente SQLQuery para True. Se tudo correr bem, os resultados da consulta SQL so exibidos imediatamente no DBGrid (ou outro componente com acesso a dados).

44

Apostila de Delphi Trabalhando com parmetros

Marcos Ribeiro

Quando voc define parmetros na consulta SQL de um componente SQLQuery, o Delphi l e registra automaticamente os parmetros definidos. Antes de executar a consulta parametrizada, no entanto, voc deve configurar os parmetros, definindo o tipo e (possivelmente) um valor inicial para cada parmetro. Para configurar os parmetros de um componente SQLQuery: Selecione o componente SQLQuery e clique duas vezes ao lado da propriedade Params, no Object Inspector. Isso mostra o Editor de Parmetros (figura abaixo)

O Editor de Parmetros

Para cada parmetro definido, clique no parmetro e altere as propriedades DataType e Value, usando o Object Inspector. A propriedade DataType determina o tipo (Real, Integer, etc.) do parmetro. DataType deve ser obrigatoriamente alterada. Para confirmar as alteraes, feche a janela do Editor de Parmetros. A propriedade Value de um parmetro pode ser alterada para definir um valor inicial para um parmetro, em tempo de desenvolvimento. Mas o mais comum alterar os valores dos parmetros usando programao. A maneira mais simples usando o mtodo ParamByName do componente SQLQuery. Para alterar os parmetros de uma query em tempo de execuo: Use o mtodo ParamByName(nome do parmetro). Use as propriedades de converso AsString, AsInteger, AsFloat, etc. para converter valores na hora de atribu-los aos parmetros. Veja um exemplo:

45

Apostila de Delphi
procedure TForm1.Button1Click(Sender: TObject); begin with SQLQuery1 do begin Close; ParamByName('val').AsCurrency := StrToCurr(Edit1.Text); ParamByName('quant').AsInteger := StrToInt(Edit2.Text); Open; end; end;

Marcos Ribeiro

O exemplo l dois valores digitados em componentes Edit e atribui esses valores aos parmetros val e quant (veja o exemplo da seo anterior). Em seguida a consulta SQL executada usando o mtodo Open do componente SQLQuery. Executando consultas Um componente SQLQuery deve ser "executado" para que sua consulta SQL seja executada. Quando voc executa um componente SQLQuery, o Delphi interpreta o seu comando SQL, substitui os parmetros pelos valores especificados e disponibiliza os dados resultantes da consulta. Nos exemplos anteriores, usamos o mtodo Open (ou a propriedade Active) do componente SQLQuery para executar consultas SQL. Open, no entanto, s pode ser usado para consultas com o comando SELECT. As consultas SQL que no retornam dados, como as que usam os comandos INSERT, UPDATE, DELETE, etc. devem ser executadas usando o mtodo ExecSQL, como em SQLQuery1.ExecSQL; As duas partes de SQL A linguagem SQL se divide em duas partes independentes (chamadas tambm de linguagens): uma linguagem de manipulao de dados, usada para consultar e alterar os dados de bancos de dados, e uma linguagem de definio de dados, usada para alterar a estrutura dos bancos. A linguagem de manipulao de dados constituda pelos seguintes comandos principais:

Comando SELECT

Funo Usado para recuperar dados de uma ou mais tabelas, baseandose em condies especificadas. O comando SELECT usado para realizar muitas operaes diferentes e muito poderoso. Usado para adicionar dados a uma tabela.

INSERT

46

Apostila de Delphi

Marcos Ribeiro

UPDATE DELETE

Usado para atualizar (modificar) dados existentes em uma tabela. Usado para apagar registros de uma tabela.

A linguagem de definio de dados constituda pelos seguintes comandos principais: Comando CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX DROP INDEX O comando SELECT O comando SELECT o mais poderoso e mais complexo dos comandos da linguagem SQL. Esse comando usado para recuperar dados de uma ou mais tabelas. Os dados recuperados dependem das condies definidas no comando SELECT. A forma bsica para o comando SELECT a seguinte: SELECT [campos retornados] FROM [tabelas consultadas] WHERE [condio] ORDER BY [campos de ordenao] GROUP BY [campos de agrupamento] Veja o que significa cada parte do comando: Parte do SELECT comando Descrio Os nomes dos campos a serem retornados. Se um asterisco (*) for especificado, todos os campos das tabelas so retornados. Os campos devem pertencer a uma das tabelas especificadas em tabelas consultadas. As tabelas de onde sero extrados os dados. Funo Criar uma tabela. Alterar a estrutura de uma tabela. Destruir uma tabela (remov-la do banco de dados). Criar um ndice para uma tabela. Remover um ndice para uma tabela.

campos retornados

tabelas consultadas

47

Apostila de Delphi

Marcos Ribeiro

condio

Uma condio que restringe os valores que so retornados. A condio pode usar os operadores booleanos comuns de Object Pascal, como <, >, <>, =, AND, OR, NOT, entre outros. Os campos usados como base para a ordenao dos valores retornados. O primeiro campo especificado tem prioridade. Os outros campos so usados como "critrios de desempate". Os campos usados para agrupar campos quando so usadas funes de agregao como COUNT, SUM e AVG.

campos de ordenao

campos de agrupamento

Veja agora alguns exemplos do uso do comando SELECT:


Este comando... SELECT * FROM Produtos SELECT Nome, Preco FROM Produtos SELECT Nome, Preco FROM Produtos WHERE Preco > 100.00 SELECT Codigo, Preco Produtos WHERE Quantidade > 12 FROM Retorna... Todos os valores de todos os campos da tabela Produtos (a tabela inteira). Todos os nomes e os preos da tabela Produtos (mas nenhum outro campo). O Nome e o Preo de todos os produtos com Preo maior que 100.00. O Cdigo e o Preo de todos os produtos com Quantidade maior que 12. Note que os campos na parte WHERE no precisam estar na parte SELECT. O Nome e a Quantidade de todos os produtos com Preo entre 100 e 500.

SELECT Nome, Quantidade FROM Produtos WHERE Preco > 100.00 AND Preco < 500.00 SELECT Nome FROM WHERE Quantidade ORDER BY Nome Produtos <> 0

Somente o Nome dos produtos com Quantidade diferente de zero, ordenados pelo Nome do produto. Todos os campos de ambas as tabelas Pedidos e Produtos, "casados" por cdigo. ( feita uma juno das duas tabelas, baseada nos campos Codigo e CodProduto). O Nome e o valor total dos produtos (Preo vezes Quantidade), agrupados por cdigo de produto. (Se houver um produto com o mesmo cdigo em vrios pedidos, o valor de todos os produtos pedidos somado o produto s aparece uma vez nos dados

SELECT * FROM Pedidos, Produtos WHERE Pedidos.CodProduto = Produtos.Codigo

SELECT Nome, SUM(Preco*Quantidade) FROM Pedidos, Produtos WHERE Pedidos.CodProduto = Produtos.Codigo

48

Apostila de Delphi

Marcos Ribeiro

GROUP BY Nome, Codigo

resultantes).

Usando IN e BETWEEN O comando IN usado em condies para determinar se um valor pertence a um conjunto especificado. O exemplo a seguir retorna o nome e o preo de todos os produtos com quantidades que estejam no conjunto {100, 200, 300, 400, 500}: SELECT Nome, Preco FROM Produtos WHERE Quantidade IN (100, 200, 300, 400, 500) O comando BETWEEN tambm usado em condies, junto com a palavra AND, para determinar se um valor est dentro de um intervalo especificado. Veja dois exemplos: SELECT Nome, Quantidade FROM Produtos WHERE Preco BETWEEN 100 AND 1000 SELECT * FROM Pedidos WHERE Codigo BETWEEN '0001' AND '0100' Usando LIKE e caracteres "curinga" Os comando LIKE usado em condies, junto com os caracteres % e _ , para fazer "casamentos" parciais. O caractere % vale por um ou mais caracteres (como o * do DOS); o caractere _ vale por exatamente um caractere (semelhante ao ? do DOS). Veja um exemplo: SELECT * FROM Produtos WHERE Nome LIKE 'Micro%' Este exemplo retorna todos os produtos com o nome comeando com "Micro".

49

Apostila de Delphi Usando funes de agregao

Marcos Ribeiro

As funes de agregao so usadas para realizar clculos simples nos valores de um campo, como somas, mdias e contagens. So cinco as funes de agregao: Funo SUM AVG MIN MAX COUNT Retorna... A soma de todos os valores numricos em um campo. A mdia de todos os valores no nulos em um campo. O valor mnimo em um campo. O valor mximo em um campo. O nmero de valores em um campo, ou o nmero total de registros retornados.

Veja alguns exemplos do uso de funes de agregao: Comando SQL SELECT AVG(Preco) FROM Produtos SELECT COUNT(*) FROM Produtos WHERE Preco < 100.00 SELECT SUM(Preco*Quantidade) FROM Produtos Retorna Retorna a mdia do preo de todos os produtos. Retorna o nmero de produtos com preo abaixo de 100.00. Um nico valor retornado. Retorna a soma da multiplicao do Preco e da Quantidade de todos os produtos. Um nico valor retornado.

50

Apostila de Delphi O comando INSERT

Marcos Ribeiro

O comando INSERT usado para inserir novos registros (com dados) em tabelas. Este comando usado da seguinte forma: INSERT INTO Nome da tabela (Campo1, Campo2, ...) VALUES (Valor1, Valor2, ...) Alguns exemplos: Comando INSERT INTO Clientes (Nome, Sobrenome) VALUES (Leonardo, Galvo) INSERT INTO Produtos VALUES ('0079','Arno 100',500,100,'12/10/97') Efeito / Comentrio Insere um novo registro na tabela Clientes com Nome = "Leonardo" e Sobrenome = "Galvo". Os outros campos do registro ficam vazios (nulos), se isso for permitido. Insere um novo registro na tabela Produtos, preenchendo todos os valores do registro (Codigo, Nome, Valor, Quantidade e Data de entrada). Note que os campos no precisam ser especificados nesse caso.

O comando UPDATE O comando UPDATE usado para atualizar (modificar) registros em uma tabela. Esse comando usado da seguinte forma: UPDATE Nome da Tabela SET Campo = Valor WHERE Condio Exemplos: Comando UPDATE Paises SET Capital Bratislava WHERE Pais = Eslovquia Efeito / Comentrio = Altera a capital do Pas "Eslovquia" para "Bratislava" (todas as ocorrncias).

UPDATE Produtos SET Preco = Preco Reduz o preo de todos os produtos da * 0.8 tabela Produtos para 80% do preo anterior.

51

Apostila de Delphi O comando DELETE

Marcos Ribeiro

O comando DELETE usado para apagar registros inteiros de uma tabela, que satisfaam uma condio especificada. DELETE FROM Nome da tabela WHERE Condio O seguinte exemplo, apaga todos os registros da tabela Produtos, que tm o campo Quantidade = 0: DELETE FROM Produtos WHERE Quantidade = 0 A linguagem de definio de dados O comando CREATE TABLE Usado para criar tabelas. Com esse comando, voc especifica o nome da tabela a ser criada e o nome e o tipo de cada campo da nova tabela: CREATE TABLE Nome da Tabela ( Campo1 TIPO1 Campo2 TIPO2 ... PRIMARY KEY (CampoChave) ) A parte PRIMARY KEY define a chave primria da tabela. Veja um exemplo do uso do comando CREATE TABLE: CREATE TABLE Jogadores ( Nome CHAR[40], Sobrenome CHAR[60], DataNasc DATE, Clube: CHAR[40], PRIMARY KEY (Sobrenome) ) Para criar uma tabela do tipo Paradox ou dBASE adicione .DB ou .DBF ao final do nome da tabela e coloque o nome entre aspas, como no exemplo a seguir: CREATE TABLE "Clientes.db" ( Codigo: INTEGER; Nome CHAR[30], Cidade CHAR[40], )

52

Apostila de Delphi O comando ALTER TABLE

Marcos Ribeiro

O comando ALTER TABLE usado para alterar a estrutura de uma tabela existente. H duas verses para esse comando, uma para adicionar campos e outra para remov-los. ALTER TABLE Nome da tabela ADD NovoCampo1 Tipo1, ADD NovoCampo2 Tipo2, (Adiciona os campos especificados depois de ADD). ALTER TABLE Nome da tabela DROP Campo1, DROP Campo2, (Remove os campos especificados depois de DROP) Veja alguns exemplos que usam o comando ALTER TABLE: Comando ALTER TABLE Produtos ADD DataExpiracao DATE, ADD Fornecedor CHAR[60] ALTER TABLE Jogadores DROP DataNasc O comando DROP TABLE O comando DROP TABLE usado para remover tabelas inteiras de um banco de dados (A palavra "Drop" significa "Deixar cair", ou "Abandonar"). O uso desse comando simples: DROP TABLE Nome da tabela Efeito Adiciona dois campos (colunas) tabela Produtos: "DataExpiracao" e "Fornecedor". Remove o campo "DataNasc" da tabela Jogadores.

53

Apostila de Delphi

Marcos Ribeiro

Bibliografia Boratti, Isaias Camilo. Programao Orientada a Objetos usando Delphi, 3 Edio, Visual Books, 2004. Cantu, Marco. Dominando o Delphi 6: a Bblia, So Paulo, Editora Makron Books, 2003. Barnes, J. David; Kolling Michael. Programao Orientada a Objetos com Java, Pearson, 2004 Facunte, Emerson. Delphi 7 Internet e Banco de Dados, Brasport,2003. Melo, Ana Cristina. Desenvolvendo Aplicaes com UML, 1 Edio, Brasport, 2002. Todd, Bill; Kellen, Vince. Delphi 2 Guia do Desenvolvedor, Makron Books, 1997.

54

Anda mungkin juga menyukai