Você está na página 1de 145

DELPHI

Delphi

Wendel Wagner Martins Nogueira Rua Gener al Osrio n 255 !EP " #$%2&' (&( Dourados ' M) *ele+one ,(-#. &2 ' 5/2 0 ,(-#. &22' 5 22 ra1 al 2/% In+or1 ati2a32 p a o4 e 1 5 r a p a 4 5 r

ndice Analtico
INTRODUO AO MODELO CLIENTE/SERVIDOR................................................................1 Mudan6as de Paradig1as 44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 Paradigma Computacional...............................................................................................................1 Paradigma do Negcio.....................................................................................................................3 E7olu68o da 9r:uitetura44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444& Arquitetura Time-Sharing.................................................................................................................4 Arquitetura Resource-Sharing.......................................................................................................... Arquitetura Cliente!Ser"idor............................................................................................................# Pri1eira Gera68o !liente;)er7idor444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444% )egunda Gera68o !liente;)er7idor4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444$ SGDB - SISTEMAS GERENCIADORES DE BANCO DE DADOS..........................................10 Modelos de <an2o de Dados444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 ( Sistema de $erenciamento de Arqui"os.........................................................................................11 %anco de &ados 'ier(rquico.........................................................................................................1) %anco de &ados de Rede................................................................................................................1) %anco de &ados Relacional............................................................................................................13 BANCOS DE DADOS RELACIONAIS..........................................................................................15 !lassi+i2a68o444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 5 Corporati"os....................................................................................................................................1# &epartamentais...............................................................................................................................1# *ocais ou +"eis.............................................................................................................................1, Modelage1 de Dados44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 # Normali-a./o..................................................................................................................................10 Propaga./o de cha"es prim(rias...................................................................................................)3 1erramentas....................................................................................................................................)4 Cria./o da %ase de &ados ............................................................................................................) 2tili-ando 3nter4ase 5indo6s 3S7*...............................................................................................) Linguage1 )=L44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444442# Categorias da *inguagem S7*.......................................................................................................), 2tili-ando o 5indo6s 3S7* para de8inir o %anco de &ados........................................................)0 2tili-ando o 5indo6s 3S7* para acessar o %anco de &ados.......................................................)0 !onsist>n2ia e Integridade dos Dados444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444/( 3ntegridade Re8erencial..................................................................................................................39 &om:nio dos dados..........................................................................................................................3) Regras de Negcio..........................................................................................................................3) 2tili-ando o 5indo6s 3S7* para de8inir integridades e consist;ncias.........................................3) 2tili-ando o 5indo6s 3S7* para testar as consist;ncias..............................................................33 &istri4ui./o da Consist;ncia e 3ntegridade dos &ados ..............................................................34 SQL EXPLORER..............................................................................................................................36 !ria68o de 9lias4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444/?isuali@a68o e Edi68o de Dados444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444/# De+ini68o de no7os ele1entos444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444/$ De+ini68o de Di2ionArios de dados44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444&(

Cria./o de um no"o &icion(rio.....................................................................................................41 3mporta./o das de8ini.<es do %anco de &ados.............................................................................41 &e8ini./o das propriedades dos Attri4ute Sets..............................................................................41 2tili-a./o do &icion(rio no &elphi ..............................................................................................4) TRABALHANDO COM BANCOS DE DADOS RELACIONAIS.............................................. !o1ponentes da 9r:uitetura !liente;)er7idor'dls+444444444444444444444444444444444444444444444444444444444444444444444444444&& !oneBCes e !onteBtos4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444&5 Cone=<es e Conte=tos no &elphi....................................................................................................4# !ursores e Result )ets 444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444&% Cursores e Result Sets no &elphi....................................................................................................4> *ransa6Ces44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444445( Transa.<es no &elphi..................................................................................................................... 1 !on2orr>n2ia ' DL)D4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444455 Tipos de tra"amentos ?loc@sA.......................................................................................................... N:"eis de isolamento....................................................................................................................... # Bptimistic *oc@............................................................................................................................... , Concorr;ncia no &elphi................................................................................................................. > PRO!ETANDO APLICA"ES CLIENTE/SERVIDOR.............................................................66 Estrutura de u1a 9pli2a68o444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444-Apresenta./o...................................................................................................................................## *gica do Negcio..........................................................................................................................#, $erenciamento de &ados................................................................................................................#0 ?antagens da Organi@a68o da 9pli2a68o e1 !a1adas444444444444444444444444444444444444444444444444444444444444444444444-% Estrutura de u1a 9pli2a68o Delphi444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444-$ Componentes "isuais ......................................................................................................................,9 Componentes de Acesso C 4ase de dados ......................................................................................,9 Componente de liga./o...................................................................................................................,9 CONSTRUINDO APLICA"ES CLIENTE/SERVIDOR...........................................................#1 Etili@ando Data Modules44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444# !o1ponente *Data5ase4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444#2 Es2olhendo entre **a5le e *=uerF4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444#/ A4ertura...........................................................................................................................................,3 1iltros .............................................................................................................................................,4 Transa.<es ......................................................................................................................................, NDmero de Ta4elas Acessadas........................................................................................................, *ra5alhando 2o1 o *=uerF4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444#5 Etili@ando !a2hed Epdates4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444## Etili@ando o !o1ponente *Epdate)=L44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444%( Gra7a68o Linha a Linha ou e1 <at2h444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444%2 *ra5alhando 2o1 o **a5le44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444%$ILTRANDO REGISTROS.............................................................................................................%& =<E na 1es1a *ela de Manuten68o4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444$ !ontrolando os Estados da *ela444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444$& *ela de !onsulta Espe2G+i2a44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 ( Tela de Consulta...........................................................................................................................191 Tela de +anuten./o......................................................................................................................19, Recursos de *oo@2p.....................................................................................................................11) %uscando Registros de outras Ta4Sheets.....................................................................................11 Controlando Transa.<es...............................................................................................................11# +antendo o Result Set da Consulta..............................................................................................11> CONTROLANDO TRANSA"ES MASTER/DETAIL............................................................1'' *ela de !onsulta4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 22 *ela de Manuten68o44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 2# *gica "isual.................................................................................................................................139 Controle "isual da Transa./o.......................................................................................................134 Transa./o - *gica de negcio....................................................................................................13

Calculando o Ealor Total do Pedido............................................................................................13, Regras de Negcio........................................................................................................................130

Introduo ao Modelo Cliente/Servidor


Fss e ca p:tulo m o s tra a e " olu./o n a arq uit e t ura d e co m p u t a dore s e a t e n d ; n cia a a m 4i e n t e s d e a plica.< e s ca da " e - m ais distri4u:dos.

Captulo

ter1o !liente;) er7idor +oi ini2ial1ent e apli2ado para a ar:uitetur a de so+tHare :ue des2re7ia o pro2ess a 1 e n t o entre dois progra 1 a s 4 Nesse 2onteBtoI a apli2a68o 2liente re:uisita7a u1 ser7i6o :ue era ent8o eBe2ut a d o pelo progra 1 a ser7idor4 Entreta n toI esse ter1o ainda n8o distinguia se o progra 1 a 2liente e o progra 1 a ser7idor esta7 a 1 sendo eBe2ut a d o s e1 u1a 1es 1 a 1A:uina ou e1 1A:uinas di+erent e s4 HoJeI :uando se +ala e1 2liente;s er7idorI estA se re+erindo a u1 pro2ess a 1 e n t o 2ooperati7o distri5uGdoI onde o rela2iona 1 e n t o entre 2lientes e ser7idores s8o rela2iona 1 e n t o s entre 2o1pon e n t e s tanto de so+tHare :uanto de hardH ar e4 PortantoI estare 1 o s interess a d o s na ar:uitetur a 2liente;s er7idor en7ol7endo duas ou 1ais 1A:uinas e1 u1 pro2ess o 2ooperati7o para eBe2ut ar a apli2a68o4

Mudanas de Paradigmas
Paradigma Computacional 9 7is8o tradi2ional da 2o1put a 6 8 o era 2entrali@ada na +igura do 2o1put a d or4 :ue 2on2entr a7 a todos os ser7i6os e re2ursos +orne2idos aos usuArios4 O a2esso a esses 2o1put a d or e s era +eito direta 1 e n t e pelo usuArio atra7K s de te2lados e 1onitores4 E1 alguns 2asosI essa 1A:uina era u1 e:uipa 1 e n t o poderoso 2apa@ de atend er 7Arios usuArios si1ultan e a 1 e n t e ,Main+ra 1 e.4 Ou ent8oI era 1 pe:u e no s 2o1put a d or e s isolados 2apa@es de atend er u1 Lni2o usuArio de 2ada 7e@4

Delphi Client/Server

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

Dig4 4 M 9r:uitetura de Main+ra1e N es:uerda e u1 2o1putador P! isolado N direita4 915os si15oli@a1 a 7is8o 2o1puta2ional tradi2ionalI onde o +o2o K o 2o1putador4

Para :ue essas 1A:uinas pudes s e 1 a2o1p a n h a r a 2res2ent e de1a n d a de no7os re2ursos e ser7i6os seria ne2es s Ario eBpan dir seus re2ursos de 1e 1ria e pro2ess a 1 e n t o4 No 2aso de se utili@ar apen a s u1a 1A:uina ser7indo 7Arios usuArios ,Main+ra1 e.I seria di+G2il eBpandir ainda 1ais seus re2ursos para suportar as no7as de1a n d a s te2nolgi2asI prin2ipal1e n t e a inter+a2e grA+i2a4 Por outro ladoI atra7Ks de 7Arias 1A:uinas isoladasI os ser7i6os teria1 :ue ser repli2ados e 2ada 1A:uina in2re1e n t a d a para suportar tal pro2ess a 1 e n t o4 9lK1 dissoI essa alterna ti7a n8o pro7> u1a 1aneira de 2o1uni2a68 o entre os usuArios4 Para atend er a ne2es sida d e 2res2ent e do usuArio de no7os ser7i6os e re2ursosI surgiu' se a ne2es sida d e de interligar essas 1A:uinasI para :ue Juntas pudess e 1 +orne2er u1 nL1ero 1aior de 5ene+G2ios4 9ssi1 2o1e6 ar a 1 a apare2 er a15ient e s de redes :ue per1itia 1 a distri5ui68o de re2ursos e ser7i6os e1 lo2ais di+erent e s I au1e n t a n d o a 2apa2idad e do usuArio +inal4 !o1 isso as 1A:uinas :ue tinha 1 :ue ser e:uipa 1 e n t o s 2aros e poderosos podia1 ser aos pou2os su5stituGdas por 7Arias 1A:uinas 1enore s e de 2usto 1ais 5aiBoI 1as :ue atra7K s de u1 pro2ess o 2ooperati7o 2onseg uia 1 pro7er +un2ionalidad e 1aior4 !o1 o nL1ero 2ada 7e@ 1aior de 2o1put a d or e s interligadosI esses deiBara 1 de ser o +o2o do a15ient e 2o1put a 2ion al e toda a aten68 o e i1portOn2ia +ora1 destinad a s Ns redesI ele1e n t os respons A7 eis e1 reunir os re2ursos e ser7i6os de 7Arias 1A:uinas e disponi5ili@A' los aos usuArios de +or1a transp ar e n t e e e+i2a@4

Delphi Client/Server

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

We5 In+or1a68o

Rede
Data WareHousing

Dados

Dig 42M 9s redes interliga1 os 2o1putadores +orne2endo ser7i6os e re2ursos de +or1a es2alar e transparente para os usuArios +inais4

9s redes per1ite 1 o 2res2i1e n to do a15ient e 2o1put a2ion al de +or1a +leBG7el e es2alarI possi5ilitando a disponi5ilidade de no7os re2ursos e ser7i6os ao usuArio +inal 2o1 u1a 2erta transp ar > n 2ia4 HoJeI ser7i6os no7os 2o1o We5I DataWareHousing e outros pode 1 ser 1ais +a2il1ent e agreg a d o s ao par:u e 2o1put a 2ion al e disponi5ili@ados a 7Arios usuArios JA perten2 e n t e s a rede4 Nesse 1odeloI o 2o1put a d or se torna apen a s u1 1eio de a2esso a in+inidade de ser7i6os e re2ursos o+ere2idos por toda a rede4 Paradigma do eg+cio

Do ponto de 7ista do neg2ioI as organi@a6C es est8o sendo a+etad a s por grand e s 1uda n6 a s no 1er2ado4 9s e1pres a s pre2isa 1 se prepar ar para a glo5ali@a68o da e2ono 1ia e sere 1 1ais rApidas na to1ad a de de2is8o tornando' se 1ais 2o1pe titi7as4

Dig 4/M Glo5ali@a68o da e2ono1ia4 9 e1presas atua1 1undial1enteI n8o ha7endo 1ais li1ites geogrA+i2os para a 2o1petiti7idade4

E1a aten6 8o espe2ial de7e ser dada aos 2lientes :ue eBige 1 produtos 2ada 7e@ 1ais espe2G+i2os e person ali@ados4 Para suportar essa press 8o 2o1pe titi7a do 1er2adoI os gerent e s de neg2io de7e 1 estar 1unidos de in+or1a6C e s e +erra1 e n t a s :ue os per1ita 1 to1ar
Delphi Client/Server ,

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

de2isCes de +or1a rApida e pre2isa4 In+or1a6C e s espe2G+i2as e +unda 1 e n t ais de7e 1 ser eBtraGdas da 5ase de dados 2orporati7a para dare 1 suporte a essas de2isCes4 PortantoI a 7elo2idad e :ue a in+or1a6 8 o tra+ega pela e1pre s a K 1uito i1portan t e e u1 a15ient e 2apa@ de pro7er essa +un2ionalidad e se torna real1e nt e ne2es s Ario4

In+or1a68o

DigM 4&M Des2entrali@a68o da in+or1a68o4

!o1 o o5Jeti7o de se tornare 1 1ais 2o1pe titi7asI as e1pres a s t>1 pro2urado u1a +or1a de se organi@ar 1elhor pro1o7e n d o u1 2onJunto de 1uda n6 a s organi@a2ionais e estrutur ais e1 toda a 2orpora6 8o4 *K2ni2as 2o1o PReeng e n h a riaQ s8o nor1al 1 e n t e apli2adasI 2o1 o o5Jeti7o de reorgani@ar a e1pre s a e seus pro2essos de neg2io4 Essas organi@a6Ce s do neg2io s8o 1uitas 7e@es a2o1p a n h a d a s de u1a restrutur a6 8 o dos siste 1 a s de in+or1Ati2a e de todo o a15ient e 2o1put a 2ion al4 R pre2iso estrutur ar u1 no7o a15ient e des2entr ali@ado e e+i2iente :ue propor2ione a +un2ionalidad e e a 7elo2idad e deseJad a para 7ia5ili@ar a 2orpora68 o e1 u1 1er2ado 2ada 7e@ 1ais a5rang e n t e e 2o1p etiti7o4

'voluo da Ar-uitetura
O o5Jeti7o da ar:uitetur a 2liente;s er7idor K propor2ionar u1 a15ient e 2apa@ de 2o1partilhar os re2ursos e ser7i6os de 7Arias 1A:uinas interligad a s e pro7er u1a 1aneira 2ooperati7a de eBe2ut ar as apli2a6Ces dos usuArios +inais4 9 seguir ser8o 1ostrad a s algu1 a s ar:uitetur a s para eBpli2ar a +orte tend> n2ia a a15ient e s distri5uGdos 2oopera ti7os4 Ar-uitetura !ime.Sharing Essa ar:uitetur a K 5ase a d a e1 u1 pro2ess a 1 e n t o 2entrali@ado4 E1a 1A:uinaI 2ha1a d a de hosped eiroI K respons A7 el por rodar todos os progra 1 a s e geren2iar todos os re2ursos4 O te1po de pro2ess a 1 e n t o K 2o1p artilhado pelos progra 1 a s I si1ulando u1a eBe2u6 8o e1 paralelo4 Os usuArios t>1 a2esso a esses ser7i6os e re2ursos atra7Ks de ter1inais 2one2ta d os lo2al1en t e ou
Delphi Client/Server /

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

re1ota 1 e n t e 4 Esse ter1inais n8o possue 1 nenhu 1 a 2apa2idad e de pro2ess a 1 e n t o e 2onsiste 1 5asi2a 1 e n t e de u1a telaI u1 te2lado e do hardHare ne2es s Ario para se 2o1uni2ar 2o1 o hosped eiro4 Essa ar:uitetur a per1ite o 2o1partilha 1 e n t o da 5ase de dados da apli2a68o tornando a in+or1a6 8 o disponG7el de :ual:uer ter1inal4 Entreta nt oI 2o1 o surgi1en to de no7as ne2essidad e s I 2o1o a inter+a2e grA+i2a e outros ser7i6os :ue ne2es sita 1 2ada 7e@ 1ais de pro2ess a 1 e n t oI esse 1odelo 2o1e6ou' se a tornar e2ono 1i2a 1 e n t e e +isi2a1e n t e in7iA7el JA :ue todo o pro2ess a 1 e n t o K reali@ado e1 u1a Lni2a 1A:uina4 Os eBe1plos 1ais 2onhe2idos dess a ar:uitetur a s8o os siste 1 a s e1 Main+ra1e s e alguns siste 1 a s e1 ENIS4

Processamento

Dig 454 9r:uitetura *i1e' )haring

Ar-uitetura "esource.Sharing Essa ar:uitetur a 2onsiste de 7Arios 2o1put a d or e s ,esta6C e s de tra5alho. interligadosI sendo 2ada u1 2apa@ de reali@ar seu prprio pro2ess a 1 e n t o4 9lguns dess es 2o1put a d or e s s8o respons A 7 eis e1 2o1partilhar e geren2iar re2ursos tais 2o1o i1pressoraI dis2oI et2 ,ser7idores de rede.4 Entreta nt oI a rede n8o K utili@ada para propor2ionar u1 pro2ess a 1 e n t o 2oopera ti7o entre as 1A:uinas4 *odo o pro2ess a 1 e n t o da apli2a68o K ainda +eito por u1a Lni2a 1A:uinaI ha7endo apen a s o 2o1partilha 1 e n t o de re2ursos4 9tra7Ks dessa ar:uitetur a K possG7el 2o1p artilhar a 5ase de dados da apli2a68oI per1itindo o a2esso por 7Arias pessoa s si1ultan e a 1 e n t e 4 Mas 2o1o todo o pro2ess a 1 e n t o dos dados K reali@ado e1 2ada 1A:uinaI a ne2es sida d e de u1 7olu1e 1aior de in+or1a6C e s torna in7iA7el o trA+ego de in+or1a6C e s pela rede4 Para resol7er esse pro5le 1 a seria ne2es s Ario :ue a 1A:uina respons A7 el e1 ar1a@ e n a r os dados +i@esse u1 pro2ess a 1 e n t o lo2al 2apa@ de en7iar u1a :uantida d e 1enor de dados para a 1A:uina :ue estA pro2ess a n d o a apli2a68o4
Delphi Client/Server 0

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

)er7idor de Rede

9pli2a6Ces

Processamento Processamento
Dig4 4-M 9r:uitetura Resour2e' )haring4

Ar-uitetura Cliente/Servidor Essa ar:uitetur a ta15 K 1 2onsiste de 7Arios 2o1put a d or e s I 2ada u1 2o1 seu prprio pro2ess a 1 e n t oI interligados e1 rede4 9 di+eren6a 5Asi2a para a ar:uitetur a Resour2e' )haring K :ue a:ui JA 2o1e6a a ha7er u1 pro2es s a 1 e n t o distri5uGdo 2ooperati7o4 Parte do pro2ess a 1 e n t oI :ue era +eito pela 1A:uina da apli2a68oI K +eito agora pela prpria 1A:uina respons A7 el pelo ar1a@ e n a 1 e n t o e distri5ui68o da in+or1a6 8 oI di1inuindo assi1 o trA+ego de in+or1a6C e s na rede4 PortantoI pode' se e de7e' se sele2ionar os dados :ue ser8o en7iados para o usuArio para u1a 1elhor e+i2i>n2ia do a15ient e4 Esse 1odelo JA 2o1e6 a a retirar partes espe2G+i2as de pro2ess a 1 e n t o das apli2a6Ces :ue era 1 eBe2ut a d a s pelas 1A:uinas 2lientesI 2entrali@ando' as nas 1A:uinas de lo2ali@a68o +Gsi2a 1ais ade:u a d a I garantindo assi1 u1a 1elhor distri5ui68o do pro2ess a 1 e n t o e utili@a68o do a15ient e4 9tra7Ks dess as espe2iali@a6Ces garant e' se ta15 K 1 u1 1elhor geren2ia 1 e n t o e +a2ilidade de 1anut e n 6 8 o dos ser7i6os de7ido a sua 2on2entr a6 8 o e1 u1 ou pou2os lo2ais +Gsi2os4

Delphi Client/Server

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

)er7idor de <an2o de Dados ,D<M).

)er7idor de Rede

Processamento Processamento

Processamento

9pli2a6Ces
Processamento
Dig4 4# 9r:uitetura !liente;)er7idor4

Pode1o s 2itar alguns 5ene+G2ios :ue esta no7a ar:uitetur a tra@ para o a15ient e 2o1put a2ion al das e1pres a sM Per1ite Ns 2orpora6C e s ala7a2ar e 1 a te2nologia de 2o1put a d or e s PdesTtopsQ4 HoJeI as esta6C e s de tra5alho JA possue 1 u1 poder 2o1put a 2ion al 2onsiderA7 elI por u1 2usto 1uito 1ais 5aiBoI antes s disponG7el e1 PMain+ra1 e s Q4 Per1ite :ue o pro2ess a 1 e n t o seJa +eito 1ais prBi1o da orige 1 dos dados redu@indo o trA+ego na rede4 Da2ilita a utili@a68o de apli2a6Ces grA+i2as e 1ulti1Gdias4 Isto per1ite a 2onstru68o de apli2a6Ces :ue eB2ed e 1 as eBpe2t a ti7as dos usuArios propor2ionan d o' lhes u1 real au1e n t o de produti7idad e4 Per1ite e en2oraJa a utili@a68o de siste 1 a s a5ertosI JA :ue 2lientes e ser7idores pode 1 rodar e1 di+erent e s hardH ar es e so+tHaresI li7rando as 2orpora6C es de ar:uitetur a s proprietArias4 Entreta nt oI essa ar:uitetur a ainda n8o K per+eita4 9lgu1as 2ara2terGsti2as ne2ess Arias para u1 2o1pleto pro2ess o distri5uGdo ainda n8o +ora1 o5ser7ad a s ness e 1odelo :ue ainda apres e n t a algu1 a s de+i2i>n2iasM

Delphi Client/Server

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

)e u1a por68o signi+i2ante da lgi2a da apli2a68o +or 1o7ida para o ser7idorI esse se torna u1 PgargaloQ assi1 2o1o na ar:uitetur a de PMain+ra1 eQ4 Para resol7er esse pro5le 1 a seria ne2ess Ario u1a 1elhor distri5ui68o e geren2ia 1 e n t o do pro2es s a 1 e n t o da lgi2a da apli2a68o4 Isto dA orige 1 a u1a no7a ar:uitetur a 2ha1a d a P)egund a Gera68o !liente;)er7idorQ4 O pro2esso de 2onstru68o de apli2a6Ces distri5uGdas K 5e1 1ais 2o1pleBo :ue o desen7ol7i1e n to de apli2a6Ces n8o distri5uGdas de7ido ao 1aior nL1ero de parO 1 e t ro s a sere 1 de+inidosI ao des2onh e2i1 e n t o da te2nologia e a +alta de padrCes e +erra 1 e n t a s :ue auBilie1 essa a15ient a6 8 o4 PortantoI 1uito te1po pode ser 2onsu 1ido no pro2ess o de de+ini68o e 2onstru68o do a15ient e de desen7ol7i1en to4 Esse te1po K 1uitas 7e@es su5es ti1a d o pelas e1pres a s de7ido ao des2onh e 2i 1 e n t o e as +alsas propag a n d a s dos 7endedor e s de +erra1 e n t a s 4

Primeira 3erao Cliente/Servidor


Pode1o s de+inir 2liente;s er7idor 2o1o u1a ar:uitetur a 2o1put a2ion al :ue 7isa distri5uir os re2ursos e o pro2ess a 1 e n t o de +or1a inteligent e 2o1 o o5Jeti7o de oti1i@ar o dese 1 p e n h o da rede e dos siste 1 a s I 1aBi1i@ando a utili@a68o dos re2ursos de 2ada 1A:uina e +orne2en d o u1a 5ase slida e +leBG7el para a i1planta6 8 o de u1 nL1ero 2res2ent e de ser7i6os4 9lgu1as i1ple1 e n t a 6 C e s 7Arias e1pres a s e s8o 2liente;s er7idor4 dess e tipo JA 7>1 sendo utili@adas e1 2onhe2idas 2o1o a pri1eira gera68o

Para 2o1partilhar re2ursosI 2o1o dis2o e i1press or aI s8o utili@ados )er7idores de 9r:ui7os na rede4 Estes s8o siste 1 a s 2o1 a +un68o de pro2ess ar as re:uisi6Ces aos ar:ui7os e i1press or as e geren2iar seu a2esso e distri5ui68o4 9lK1 dissoI parte do pro2ess a 1 e n t o das apli2a6Ces ta15 K 1 +oi distri5uGdo4 9lguns ser7i6os de 1anipula68o e geren2ia 1 e n t o de dados +ora1 retirados das apli2a6Ces e 2olo2ados e1 pontos 2entrali@ados 2onhe2idos 2o1o P)er7idores de <an2o de DadosQI tornando o pro2es s a 1 e n t o dos dados 1ais prBi1o do seu lo2al de ar1a@ e n a 1 e n t o 4 Os siste 1 a s :ue +orne2e 1 tais ser7i6os +ora1 2ha1a d o s de P)iste 1 a s Geren2iadore s de <an2o de DadosQ ' )GD<4 <asi2a1 e n t eI a pri1eira gera68o de 2liente;s er7idor se 2ara2t eri@a por essa distri5ui68o do pro2ess a 1 e n t o da apli2a68o entre dois 2o1pon e n t e s M a esta6 8o de tra5alho do usuArio e o ser7idor de 5an2o de dados4 U 1edida :ue a ar:uitetur a 2liente;s er7idor e7oluiI no7as partes da apli2a68o 78o sendo distri5uGdas e no7os ele1e n t o s 78o apare2 e n d o no a15ient e4
Delphi Client/Server 4

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

Segunda 3erao Cliente/Servidor


HoJeI a te2nologia 2liente;s er7idor JA 2a1inh a para sua segund a gera68o4 Essa gera68o eBplora 1ais o a15ient e de rede e suas 1A:uinas4 )urge 1 no7os ser7idores 2o1a +inalidade de retirar das esta6C es de tra5alho grande parte do pro2ess a 1 e n t o :ue elas reali@a14 Os prin2ipais ele1e n to s dess a no7a ar:uitetur a s8o os ser7idores de apli2a68o e os ser7idores PWe5Q4 Os ser7idores de apli2a68o s8o respons A 7 eis por retirar o restant e da 2a1a d a de 1anipula68o de dados :ue ainda ha7ia na esta68 o 2liente4 9lK1 dissoI te1 o o5Jeti7o de 2on2entr ar a lgi2a de neg2ioI antes distri5uGda entre a esta6 8o 2liente e o ser7idor de 5an2o4 Nor1al1 e n t e I esse tra5alho n8o K +eito por u1 Lni2o ser7idor de apli2a68o e si1 por u1 2onJunto de ser7idores onde o pro2ess a 1 e n t o K 5alan2e a d o atra7K s de ele1e n t o s 2ha1a d o s PMidlleHareQ4 Desta +or1a resta para a esta6 8o 2lienteI o pro2ess a 1 e n t o da inter+a2e 7isual 2o1 o usuArioI deiBando' a 1ais le7eI eBigindo u1a 1enor 2on+igura6 8o e 1elhoran do seu dese 1 p e n h o4 Os ser7idores PWe5Q tenta 1 ir 1ais longe aindaI per1itindo retirar das esta6C e s de tra5alho atK parte da lgi2a da inter+a2e 7isualI deiBando' as respons A7 eis apen a s por interpret ar o 2digo PH*MLQ en7iado pelos ser7idores4 Entreta nt oI 2o1 a utili@a68o de 2o1pon e n t e s 2o1o Va7a e 92ti7eSI parte do pro2ess a 1 e n t o pode retornar N esta68 o de tra5alho4 Essas no7as te2nologias tra@e 1 1ais re2ursosI 1as torna 1 o a15ient e 1ais 2o1pleBo e di+G2il de ser i1ple1 e n t a d o4 R pre2iso estar 5e1 2erto do :ue se pretend e e n8o +a@er uso de u1a te2nologia 1ais no7a se1 a 2onhe2>' la direito ou se1 a real ne2es sida d e de utili@A' la4

Delphi Client/Server

! " # D $ % & #

A #

M # D ' ( #

C ( I '

! ' / S ' " ) I D # "

S3D6 . Sistemas 3erenciadores de 6anco de Dados


Fss e ca p:tulo a pre s e n t a os sist e m a s g ere nciadore s d e 4 a nco d e d a dosG s e u s s er"i.osG rec ursos e m o d elos.

Captulo

s )G<Ds s8o siste 1 a s respons A 7 eis e1 ar1a@e n a r os dados e +orne2er ser7i6os 2apa@es de 1anipulA' los4 Para ar1a@ e n a r os dados e1 u1 dis2oI os )G<Ds possue 1 u1a +or1a estrutura d a padr8o de repres e n t a r os registros e 2a1posI +orne2en d o ser7i6os :ue per1ite 1 a 2ria68o e altera6 8o dess as de+ini6Ces de dados4 Dorne2e 1 aindaI u1 1e2anis 1o interno para 1ant er os dados no dis2o e para sa5er onde estA 2ada ele1e n to e1 parti2ular4 *a15K 1 s8o respons a 5ilidad e s do )GD<s disponi5ili@ar ser7i6os para in2luirI 2lassi+i2arI atuali@ar e eli1inar os dados ar1a@ e n a d o s4 Pela +or1a 2o1 :ue os dados s8o ar1a@ e n a d o s e de 2o1o eles se rela2iona 1 pode 1o s 2lassi+i2ar os )G<Ds atra7Ks de 7Arios 1odelos atK 2hegar 1 o s aos 5an2os de dados rela2ionais4

Modelos de 6anco de Dados


9nalisando os di7ersos 1odelos de 5an2o de dadosI pode' se notar u1a e7olu68o no rela2iona 1 e n t o entre os dadosI eli1inando 2ada 7e@ 1ais a redund O n2ia e propor2ionan d o 1ais +leBi5ilidade e portanto u1a 1aior +a2ilidade de 1anut e n 6 8 o das de+ini6Ces de dados4 Para 1elhor entend e r 1 o s os 1odelos 7a1os utili@ar os dados das tr>s guias de pedidos da +ig4 24 4

Delphi Client/Server

17

Dig4 24 M Guia de Pedido4

Sistema de 3erenciamento de Ar-uivos Esse K o Lni2o siste 1 a :ue des2re7 e 2o1o os dados s8o ar1a@ e n a d o s 4 Nesse 1odelo 2ada 2a1po ou ite1 de dado K ar1a@ e n a d o se:We n2ial1e n t e no dis2o e1 u1 Lni2o e grand e ar:ui7o4 Para en2ontrar u1 ite1 de dado K ne2ess Ario 7eri+i2ar 2ada ele1e n t o desde o inG2io do ar:ui7o4 9 Lni2a 7antag e 1 dess e 1Ktodo K sua si1pli2idadeI JA :ue seu +or1ato 1uito se pare2e 2o1 o de u1 ar:ui7o teBto onde as pala7ras se en2ontra 1 es2ritas e1 u1a deter 1in a d a se:W>n2ia4 Entreta nt oI por 2aus a dess a si1pli2idadeI 1uitos dados t>1 :ue ser es2ritos repetida 1 e n t e gerando u1a enor1 e redund O n2ia :ue di+i2ulta a 1anut e n6 8 o e a integridad e dos dados4 N8o hA ta15 K 1 nenhu 1 a indi2a68o de rela2iona 1 e n t o entre os dadosI e o progra 1 a d or pre2isa sa5er eBata 1 e n t e 2o1o os dados est8o ar1a@ e n a d o s para poder a2ess A' los de +or1a 2onsistent e4 9lK1 dissoI sua estrutur a +Gsi2a K rGgidaI o :ue di+i2ulta altera6C e s na de+ini6Ces dos dadosI gerando a ne2es sida d e de re2onstruir todo o ar:ui7o4

X 2(; (;$- X 9na Maria Li1a X $$$4%#-4555'22 X !aneta X ( X (I(( X LApis X 5 X 5I(( X 5I(( X 2 X 2 ; (;$- X Maria VosK X 4 '22 X !aneta X 5 X 5I(( X !aderno X 444
Dig4 242M )iste1a de Geren2ia1ento de 9r:ui7os4 Delphi Client/Server 11

6anco de Dados 8ier9r-uico Nesse 1odeloI os dados s8o organi@ados e1 u1a estrutur a de Ar7ore :ue se origina a partir de u1a rai@4 Essa estrutur a identi+i2a as rela6Ces Ppai' +ilhoQ entre os 7Arios itens do 5an2o de dadosI 1ostran d o assi1 suas 7antag e n s so5re o 1odelo de geren2ia 1 e n t o de ar:ui7os4 No 1odelo hierAr:ui2o K possG7el de+inir rela6Ces Pde' u1' para' 1uitosQ :ue +a2ilita e a2elera o pro2es so de pes:uisa dos dados4 Para en2ontrar u1a in+or1a6 8 oI n8o K 1ais ne2ess Ario per2orrer o ar:ui7o inteiro4 <asta eBa1inar o ite1 pedidoI de2o1pY' lo e1 2o1pon e n t e s e des2er pelos ra1os ne2es s Arios atK en2ontrA' lo4 Esse 1KtodoI ta15 K 1 +a2ilita a inser68o de no7os dadosI de7ido aos rela2iona 1 e n t o s entre os 2a1pos sere 1 +eitos atra7K s de ponteiros4 Para inserir u1 no7o ele1e n t o 5asta alterar os ponteiros dos rela2iona 1 e n t o s entre pais e +ilhos4

Rai@ 2
2(; (;$5I(( 9na Maria ( !aneta (I(( 5 LApis 5I(( 2 ; (;$- -5I((
4 4 '22

/
Maria VosK 5 !aneta 5I(( !aderno 5 5(I((

$$$4%#-4555'22

Dig4 24/M <an2o de Dados HierAr:ui2o4

Entreta nt oI esse 1Ktodo ainda possui alguns pro5le1 a s 4 !ada nG7el da Ar7ore K ini2ial1ent e de+inido e :ual:uer altera6 8 o na estrutur a dess es nG7eis K u1a tare+a di+G2il4 9lK1 dissoI o pro5le1 a da redund O n 2ia de dados ainda n8o +oi resol7idoI JA :ue esse 1odelo n8o i1ple1 e n t a rela6Ces de P1uitos' para' 1uitosQ4 No eBe 1ploI pode 1o s notar a repeti68o de algu1 a s in+or1a6C e s I o :ue di+i2ulta a integridad e e 1anut e n6 8 o dos dados4 6anco de Dados de "ede O 1odelo de rede des2re7 eI 2on2eitual 1 e n t e I os 5an2o de dados nos :uais per1ite 1 rela6Ces de P1uitos' para' 1uitosQ entre os ele1e n t o s de dados4 Desta +or1a 2ada ite1 possui u1 ponteiro para os itens 2o1 os :uais se rela2ionaI eli1inando assi1 a ne2essidad e de :ual:uer tipo de redund O n 2ia de dados4 O grand e pro5le1 a dess e 1odelo K a sua 2o1pleBidad e de7ido a +leBi5ilidade eBistent e e1 suas rela6Ces4 =uando o 7olu1e de dados 2o1e6 a a 2res2erI os rela2iona 1 e n t o s entre os itens de dados +i2a1 2ada 7e@ 1ais 2o1pleBosI tornando sua 7isuali@a68o e enten di1 e n t o 2ada 7e@ 1ais di+G2eis4

Delphi Client/Server

1*

Rai@ 2 /

9na Maria
$$$4%#-4555'22

LApis

!aneta

!aderno

Maria VosK
4 4 '22

Dig4 24&M <an2o de Dados de Rede4

6anco de Dados "elacional E1 $-$I +oi pu5li2ado pelo Dr4 E4 D4 !oddI o pri1eiro artigo :ue de+inia u1 1odelo 2o1 5ase no 2on2eito 1ate 1 A ti2o dos 2onJuntos rela2ionais4 9 partir dess e artigoI o 1odelo rela2ional te1 sido re+inadoI atK :ue $%5 o prprio Dr4 !odd lan6ou as P 2 regrasQ :ue de+inia1 u1 5an2o de dados rela2ional4 E1 $$(I +ora1 pu5li2adas as /// regras :ue s8o su52onJuntos e eBpans C e s das 2 regras originais4 O 1odelo rela2ional a5ando n a o 2on2eito de rela6Ces Ppai' +ilhoQ +eitas direta 1 e n t e entre os dados e os organi@a e1 2onJuntos 1ate 1 A ti2os lgi2os de estrutur a ta5ular4 Nesse 1odeloI 2ada ite1 de dado perten2 e a u1a 2oluna da ta5ela e u1a linha da ta5ela K 2o1pos t a por 7Arios ele1e n t o s direta 1 e n t e rela2ionados4 9s ta5elas ta15 K 1 se rela2iona 1 atra7Ks de +un6Ces 1ate 1 A ti2 as 2o1o VOINs e ENIONs4 Para +a@er esse rela2iona 1 e n t o parte dos dadosI :ue identi+i2a1 uni2a1 e n t e o registro da ta5elaI s8o repetidos dentro da outra ta5ela4 9s 7antag e n s desse 1Ktodo s8o sua si1pli2idad e e +leBi5ilidade nas de+ini6Ces das rela6Ces entre os 7Arios itens de dadosI JA :ue n8o s8o +eitos direta 1 e n t e entre os dados e si1 entre as ta5elas4 Entretan toI esse 1Ktodo n8o eli1ina por 2o1pleto a redund O n 2ia de dadosI JA :ue no 1Gni1o os rela2iona 1 e n t o s entre as ta5ela s8o +eitos atra7Ks da repeti68o de parte dos dados4 9lK1 dess a redudO n2iaI +i2a a 2argo do proJetista do 5an2o de dados se 1ais repeti6Ces de dados ir8o ou n8o +a@er parte do 1odelo4 O pro2es so de +rag1e n t a 6 8 o dos dadosI a +i1 de sere 1 organi@ados e1 su52onJuntos ,ta5elas.I K 2onhe2ido 2o1o nor1ali@a68o4

Delphi Client/Server

1,

Pedido
Nu1Ped 2 / Data 2(; (;$2 ; (;$22; (;$?alor 5I(( -5I(( 25I(( !liente 2 2

Itens
Nu1Ped Produto =uantid4 ?alor (I(( 5I(( 5I(( 5(I(( 5I(( (I(( !aneta ( LApis 5 !aneta 5 !aderno 5 LApis 5 !aderno

!liente
!odigo 2 No1e !PD 9na Maria Li1a $$$4%#-4555'22 Maria VosK 4 4 '22

2 2 / /

Dig4 245M <an2o de Dados Rela2ional4

Delphi Client/Server

1/

6ancos de Dados "elacionais


Fss e ca p:tulo a pre s e n t a algu m a s caract er:sticas dos 4 a ncos d e d a do s relacionais.

Captulo

s 5an2os de dados rela2ionais 7>1 se tornando u1 padr8o no 1er2adoI ser7indo 2o1o 5ase de dados para a 1aioria dos siste 1 a s das e1pres a s 4 9 2ada diaI 1ais +erra 1 e n t a s s8o 2onstruGdas para tirar pro7eito dess a te2nologiaI +a@endo surgir u1 nL1ero 2res2ent e de re2ursos e produtos a sere 1 o+ere2idos para os usuArios4 Pode' se di@er ent8oI :ue esta K u1a te2nologia slida e 2onsistent e e :ue irA a2o1p a n h a r o 1er2ado por u1 longo perGodo de te1po4 No entantoI K u1a te2nologia :ue 2ontinua e7oluindo 2o1 o o5Jeti7o de disponi5ili@ar as in+or1a6C e s para os usuArios de 1aneira e+i2ienteI 7ia5ili@ando o neg2io da 2orpora68 o e des2entr ali@ando as to1ad a s de de2is8o4

Classi:icao
=uanto a 2apa2idad eI re2ursos e +a2ilidade de usoI os 5an2o de dados rela2ionais pode 1 ser di7ididos e1 tr>s 2ategoriasM 2orporati7osI depart a 1 e n t ais e lo2ais4 E1 u1a 1es 1 a e1pres a todas as 2ategorias pode 1 2oeBistir e 2ooper ar entre si para Juntas +or1are 1 u1a poderos a 5ase de dados distri5uGda4

Delphi Client/Server

10

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

!orporati7o

Departa1entais

Lo2ais

Dig /4 M !lassi+i2a68o dos 5an2os de dados4

Corporativos )iste1 a de 5an2o de dados para atend er toda a 2orpora6 8o4 Os prin2ipais siste 1 a s dess a 2ategoria s8oM D<2I Ora2leI )F5as eI In+or1iB e Ingres4 Estes 5an2os de7e 1 ser 2apa@es de ar1a@ e n a r e 1anipular de 1aneira e+i2iente grande s 7olu1es de dados e per1itir a2esso rApido a u1 nL1ero ele7ado de usuArios 2one2ta d os ao 1es 1o te1po4 De7ido a sua enor1e 2apa2idad eI os pre6os dess es 5an2os s8o ta15 K 1 1ais ele7ados e nor1al 1 e n t e ne2essita 1 de pro+issionais espe2iali@ados para 2on+igurA' los e 1onitorA' los no dia a dia4 Departamentais )iste1 a s de 5an2o de dados 2apa@es de atend er as re:uisi6Ces de dados a nG7el de u1 depart a 1 e n t o4 Nesse pata 1 a rI eBiste 1 5an2os de dados 1ais 5aratos e 1ais +A2eis de 2on+igurarI entre eles est8oM Inter5as eI )=L)er7erI )=L<ase4 9 1aioria dos +orne2edor e s de 5an2os de dados da 2ategoria 2orporati7a est8o ta15 K 1 disponi5ili@ando 7ersCes depart a 1 e n t ais para disputar esse 1er2adoI tra@endo 2o1o 7antag e 1 a possi5ilidad e de per1a n e 2 e r 2o1 o 1es 1o +orne2e dor e1 todos os nG7eisI tornando o a15ient e 1ais integrado4 Por outro ladoI as prin2ipais 7antag e n s dos 5an2os desen7ol7idos espe2ial1e n t e para essa plata+or1 a s8oM a +a2ilidade de 2on+igura6 8oI o pre6o dos produtos e a 1enor re:uisi68o de re2ursos de hardH ar e4

Delphi Client/Server

11

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

(ocais ou M+veis )iste1 a s de 5an2o de dados 2apa@es de rodar na 1es 1 a 1A:uina :ue a apli2a68o4 Nessa 2ategoria os prin2ipais re:uisitos s8oM ser u1 5an2o de dados 5astan t e le7e :ue gaste pou2os re2ursos do siste 1 a opera2ional e da 1A:uina, 1 e 1 riaI pro2ess a 1 e n t oI et2. e :ue n8o ne2es site de geren2ia 1 e n t o podendo rodar 5asi2a 1 e n t e 2o1 sua 2on+igura6 8o original4 Nessa 2ategoria pode 1o s 2itar os 5an2os Inter5as eI )=L<ase e )=L9nFHhere4 Os +orne2edor e s 2orporati7os ta15 K 1 est8o des2en do para esse nG7el4 PorK1I para 1ant er os 5an2os de dados 2o1 os 1es 1o s re2ursos te1 sido di+G2il tornA' los le7es e +A2eis su+i2iente 1 e n t e 4 9lguns +orne2e dor e s possue 1 atK siste 1 a s de 5an2o de dados di+erent e s para 2ada plata+or1 a4 !o1o esses 5an2os s8o instalados na 1es 1 a 1A:uina K possG7el sua utili@a68o e1 Pnote5ooTsQ4 Isso per1ite as e1pres a s 1ant er e 1 a 1es 1 a te2nologia de 5an2o de dados rela2ional e1 apli2a6Ces 17eisI +a2ilitando a integra6 8 o 2o1 a 5ase 2orporati7a da e1pre s a4 De7e' se notar entret a n t oI :ue n8o estA se +a@endo uso da ar:uitetur a 2liente;s er7idor ness e 2asoI JA :ue a 1es 1 a 1A:uina K utili@ada para rodar o apli2ati7o e o siste 1 a geren2iador de 5an2o de dados4 9 prin2ipal 7antag e 1 dess a utili@a68o so5re a utili@a68o de 5ase de dados de ar:ui7osI K :ue a Llti1a n8o possui re2ursos su+i2ientes para 1ant er a integridad e dos dados e das trans a6C e s 4 Os siste 1 a s geren2iador e s de 5an2o de dados s8o ta15 K 1 1enos +a2tG7eis a 2orrup68o de dados e +alhas do :ue os siste 1 a s 5ase a d o s e1 ar:ui7os onde o geren2ia 1 e n t o K +eito por 2ada apli2a68o4 Outra 7antag e 1 K pro7er 1ais +a2ilidade de integra6 8 o 2o1 as 5ases depart a 1 e n t ais e 2orporati7asI por utili@are 1 a 1es 1 a te2nologia4 Entreta nt oI os )GD<s possue 1 u1 2usto adi2ional e eBige 1 u1a 2on+igura6 8o de 1A:uina 1elhor de7ido a u1 nL1ero 1aior de 2a1a d a s :ue ter8o :ue ser per2orridas para se 2hegar ao dado4

Modelagem de Dados
Modelage 1 de dados K o pro2esso utili@ado para de+inir a estrutur a do 5an2o de dados atra7Ks da distri5ui68o dos dados nas ta5elas4 EBiste1 1an eiras di+erent e s de se de+inir o 1es 1o 2onJunto de dadosI e u1a 5oa 1odelag e 1 de dados pode +a2ilitar 5asta nt e o desen7ol7i1e nt o das apli2a6Ces4 ?a1os ressaltar a:uiI dois pontos :ue de7e 1 ser o5ser7a do s na 2onstru6 8o do 1odeloM o pro2esso de nor1ali@a68o e a propag a 6 8 o de 2ha7es pri1Arias4

Delphi Client/Server

12

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

ormali;ao *K2ni2a de anAlise e organi@a6 8o de dados :ue 7isa deter 1in ar a 1elhor 2o1posi68o para u1a estrutur a de dados4 Os prin2ipais o5Jeti7os dess a tK2ni2a s8oM Eli1inar ano1 alias :ue di+i2ulta1 as opera6C e s so5re os dadosZ Mini1i@ar as redund O n 2ias in2onsist> n2iasZ e os 2onse: W e n t e s ris2os de

Redu@ir e +a2ilitar as 1anut e n6 C e s 4 !o1o eBe1ploI 7a1os utili@ar u1 1odeloI no :ual todos os dados +ora1 2olo2ados e1 u1a Lni2a ta5ela atra7Ks dos seguintes 2a1posM

NumPed, DataPed, ValorPed, NomeCliente, CPFCliente, NomeProduto1, PreoProduto1, Quantidade1, ValorItem1, NomeProduto2, PreoProduto2, Quantidade2, ValorItem2,..., NomeProduto5, PreoProduto5, Quantidade5, ValorItem5
Primeira <orma ormal

E1a ta5ela estA na pri1eira +or1a nor1al se n8o possuir grupos de atri5utos repetiti7os4

C C C

D D D

Chave

Grupo Repetitivo
Dig4 /42M Presen6a de grupos repetiti7os e1 u1a ta5ela rela2ional4

Para resol7er esse pro5le1 aI de7e' se re1o7er os grupos repetiti7os para u1a outra ta5ela 9 2ha7e pri1Aria dess a no7a ta5ela pode ser +or1ad a atra7Ks da 2ha7e pri1Aria da ta5ela original 1ais u1 2onJunto de no7os atri5utos4

Delphi Client/Server

14

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

* *

Estrutura Original Nova Estrutura

Obs. Chave prim!ria "a nova estrutura # atributo$chave "a estrutura original % atributo i"enti&ica"or "o grupo repetitivo.
Dig4 /4/M Eli1ina68o de grupos repetiti7os e1 u1a ta5ela4

Desta +or1aI eli1ina' se a de+i2i>n2ia do pri1eiro 1odelo :ue li1ita7a o nL1ero de itens de produto :ue u1 pedido podia ter4 Nessa no7a estrutura n8o hA li1ite para os itensI 1as 2ontinua' se 1ant e n d o a rela68o :ue eBistia entre os itens e o pedido atra7Ks da in2lus8o do nL1ero do pedido na no7a ta5ela4

[Nu1Ped [Nu1Ped DataPed [No1eProduto ?alorPed Pre6oProduto No1e!liente =uantidade !PD!liente ?alorIte1
Dig4 /&M EBe1plo na pri1eira +or1a nor1al4

Segunda <orma

ormal

E1a ta5ela estA na segund a +or1a nor1al :uando sua 2ha7e pri1Aria n8o +or 2o1pos t a ou :uando todos os atri5utos Pn8o 2ha7esQ +ore1 +un2ional1e n t e depend e n t e s da 2ha7e inteira e esta esti7er na pri1eira +or1a nor1al4 E1 atri5uto P5Q K depen d e n t e +un2ional1e n t e de PaQ se dado o 7alor de PaQI o 7alor de P5Q puder ser deter 1in a d o4

Delphi Client/Server

15

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

Chave Composta

C "epen"e "e A e B D "epen"e s' "e A


Dig4 /45M Modelo na DN 1as n8o e1 2DN4 Presen6a de atri5utos dependente s +un2ional1ente de apenas parte da 2ha7e pri1Aria4

Para resol7er esse pro5le1 aI 5asta re1o7 er os atri5utos :ue depen d e 1 apen a s de parte da 2ha7e pri1Aria para u1a no7a ta5ela4 9 2ha7e pri1Aria da no7a ta5ela pass a a ser ent8o essa parte da 2ha7e pri1Aria da ta5ela original da :ual o atri5uto dependia4

A A

* *

*
D

Estrutura Original

Nova Estrutura

Obs. Chave prim!ria "a nova estrutura # atributo "o (ual o)s* atributo)s* removi"o)s* "epen"e)m*.
Dig /4-M Restrutura68o do 1odelo na segunda +or1a nor1al

No eBe 1plo de pedidoI isso o2orre 2o1 a 2oluna PRE!OPRODE*OI :ue depen d e apen a s do NOMEPRODE*O e n8o depend e de NEMPED4 Dado o no1e do produto K possG7el sa5er seu pre6o n8o i1portand o o pedido :ue o produto perten6 a4 9ssi1 o pre6o do produto seria repetido e1 7Arios registros da estrutur a desne2 e s s a ria 1 e n t e e di+i2ultando a 1anut e n 6 8 o e 2onsist>n2ia dos dados4 Para e7itar essa redund O n 2iaI de7e' se 2riar u1a no7a estrutura e a 2ha7e pri1Aria dess a no7a ta5ela seria o NOMEPRODE*OI porK 1 por :uestC e s de
Delphi Client/Server *7

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

e+i2i>n2ia pode' se 2riar u1a no7a 2oluna !ODPRODE*O de ta1a n h o 1enor para +a@er a liga68o entre as ta5elas4 9lK1 da e+i2i>n2iaI esse pro2edi1 e n t o possi5ilita altera6C e s +uturas nos no1es dos produtosI JA :ue esses n8o s8o 1ais usados 2o1o 2ha7e pri1Aria4

[Nu1Ped [Nu1Ped DataPed [!odProduto ?alorPed =uantidade No1e!liente ?alorIte1 !PD!liente


Dig4 /4#4 EBe1plo na segunda +or1a nor1al4

[!odProduto No1eProduto Pre6oProduto

!erceira <orma

ormal

E1a ta5ela estA na ter2eira +or1a nor1al :uando estA na segund a +or1a nor1al e n8o possui nenhu 1 atri5uto Pn8o 2ha7eQ depen d e n d o +un2ional1e n t e de outro atri5uto Pn8o 2ha7eQ4

C "epen"e "e B (ue n+o , chave.


Dig4 /4%M Presen6a de atri5utos depende ntes +un2ional1ente de outros atri5utos n8o' 2ha7e4

Para resol7er esse pro5le1 aI 5asta re1o7 er os atri5utos :ue depen d e 1 de outros atri5utos n8o 2ha7e para u1a no7a ta5ela4 9 2ha7e pri1Aria da no7a ta5ela pass a a ser ent8o o atri5uto n8o 2ha7e :ue possui depend e n t e s 4

Delphi Client/Server

*1

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

* *

Estrutura Original

Nova Estrutura

Obs. Chave prim!ria "a nova estrutura # atributo "o (ual o)s* atributo)s* removi"o)s* "epen"e)m*.
Dig4 /4$M Restrutura68o do 1odelo na ter2eira +or1a nor1al4

No eBe1plo apres e n t a d oI hA u1a depend > n 2ia +un2ional do !PD!LIEN*E 2o1 o NOME!LIEN*EI ou 7i2e' 7ersa JA :ue a15os s8o 2andidatos a de+inir uni2a1 e n t e u1 2liente4 Dado o 7alor de NOME!LIEN*E K possG7el deter 1in ar o 7alor de !PD!LIEN*E portanto esse n8o depend e da 2ha7e pri1Aria NEMPED4 Para eli1inar tal redund O n 2iaI de7e' se 2riar u1a outra estrutura e 2olo2ar o 1odelo na ter2eira +or1a nor1al4

Pedido [Nu1Ped DataPed ?alorPed !od!liente Ite1Pedido [Nu1Ped [!odProduto =uantidade ?alorIte1
Dig4 /4 (M EBe1plo na ter2eira +or1a nor1al4

!liente [!od!liente No1e!liente !PD!liente Produto [!odProduto No1eProduto Pre6oProduto

Delphi Client/Server

**

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

EBiste1 outras +or1as nor1aisI entret a n t oI 2olo2ando' se o 1odelo na ter2eira +or1a nor1al JA K possG7el tratar os dados de +or1a 2onsistent e e segura pro7endo u1a 2erta +a2ilidade no desen7ol7i1e nt o4 Propagao de chaves prim9rias Outro pro2esso :ue de7e ser 5e1 de+inido K :uanto a +or1a de propag a 6 8 o de 2ha7es entre as ta5elas4 No eBe1plo anterior pode' se o5ser7ar :ue a 2ha7e pri1Aria da ta5ela Ite1 +oi +or1ad a pela propag a 6 8 o da 2ha7e pri1Aria das ta5elas Pedido e Produto4

Ite1Pedido [Nu1Ped [!odProduto =uantidade ?alorIte1


Dig4 /4 M *a5ela de Itens4 !ha7e pri1Aria 2o1posta pela propaga68o das 2ha7es pri1Arias de outras ta5elas4

Essa tK2ni2a de propag ar as 2ha7es pri1Arias tornando' as ta15 K 1 2ha7es pri1Arias na ta5ela destino pode +a2ilitar 2onsultas di1inuindo o nL1ero de ta5elas utili@adas no 2o1and o4 I1agine u1a ta5ela de histri2os de itens :ue ar1a@ e n a s s e 2ada atuali@a68o :ue o2orress e e1 2ada ite14 )eria +A2il ent8o 2onsultar os histri2os de u1 deter 1in a d o pedido ou produtoI se1 a ne2es sida d e de utili@ar u1a outra ta5elaI JA :ue essa ta5ela possui os 2a1pos NEMPED e !ODPRODE*O4

Hist Itens [Nu1Ped [!odProduto [Data


Dig /4 2M *a5ela de Hist4 Itens

Entreta nt oI esse 1Ktodo pode tornar 1ais di+G2il a 2onstru68o das apli2a6Ces de in2lus8o e 1anut e n6 8 o dos dados4 E1a outra alternati7a para 1ontar a 2ha7e pri1Aria da ta5ela de itens K 2riar u1a outra 2oluna 2o1 u1 nL1ero se:Wen2ial do siste 1 a
Delphi Client/Server *,

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

e su5stituir a 2oluna !ODPRODE*O4 Desta +or1a o 2a1po !ODPRODE*O seria utili@ado apen a s para se +a@er o rela2iona 1 e n t o entre as ta5elas4

Ite1Pedido [Nu1Ped [Nu1)e: !odProduto =uantidade ?alorIte1


Dig /4 / *a5ela de Itens 2o1 2ha7e pri1Aria alternati7a4

9ssi1I de+inindo no7a 1 e n t e a ta5ela de histri2o de itens +i2aria da seguinte +or1aM

Hist Itens [Nu1Ped [Nu1)e: [Data


Dig /4 & *a5ela de Hist4 De Itens4

Per2e5e' seI agoraI :ue n8o hA in+or1a6 8 o na ta5ela de histri2o de itens so5re o produto4 Para 2onsultar os registros de u1 deter 1in a d o produto K ne2ess Ario +a@er u1 PJoin H 2o1 a ta5ela de ItensI di+i2ultando a 2onsulta 1as +a2ilitando a 2onstru68o das telas de 1anut e n6 8 o4 9lK1 dissoI esta alternati7a per1ite :ue o usuArio altere o produto de u1 ite1 JA :ue esse n8o K 1ais parte da 2ha7e pri1Aria4 !on2luindoI n8o eBiste u1a 1elhor +or1a de se de+inir as 2ha7es pri1Arias4 EBiste a 1elhor alterna ti7a para u1 deter 1in a d o 2aso4 <erramentas Para 1odelar e de+inir a 5ase de dadosI 7Arias +erra 1 e n t a s !9)E +orne2e 1 u1 diagra 1 a de PEntidad e' Rela2iona 1 e n t oQ :ue per1ite de+inir as entidad e s :ue ir8o originar as ta5elas do 5an2o de dados e seus rela2iona 1 e n t o s 4 !ria' se gra+i2a 1 e n t e todos os ele1e n t o s ne2es s AriosI gerando u1a do2u1e n t a 6 8 o do 1odelo atra7Ks de u1 di2ionArio de dados4 Essas in+or1a6C e s pode 1 ser utili@adas para
Delphi Client/Server */

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

2ontinuar o pro2ess o de de+ini68o do siste 1 a4 E1 alguns 2asosI per1itindo a gera68o da 5ase de dados e atK 1es 1o a gera68o da apli2a68o4 Criao da 6ase de Dados 9lgu1as +erra1 e n t a s !9)E per1ite 1 a gera68o do Ps2riptQ da 5ase de dados4 Esse Ps2riptQ K u1 ar:ui7o teBto 2o1 as de+ini6Ces das ta5elasI 2olunas e outros ele1e n t o s es2ritos na linguag e 1 )=L suportad a pela 5ase de dados a ser utili@ada4 9tra7Ks de +erra1 e n t a s do siste 1 a de 5an2o de dados K possG7el 2riar a 5ase de dados si1ples 1 e n t e a5rindo esse ar:ui7o Ps2riptQ e eBe2ut a n d o' o4 $tili;ando Inter=ase >indo?s IS@( Para o Inter5as e da <orland pode' se utili@ar a +erra 1 e n t a WindoHs I)=L para l> o ar:ui7o Ps2riptQ e 2riar o 5an2o de dados4 O WindoHs I)=L K u1a +erra1 e n t a :ue per1ite geren2iarI de+inir e 1anipular o 5an2o de dados interati7a 1 e n t e atra7Ks de 2o1and os )=L ou atra7Ks de op6Ces 2ontidas no Menu4

Dig4 /4 5M Intera2ti7e )=L progra14

Pode' se 2riar u1 no7o 5an2o de dados atra7Ks da op68o $()*/C+* , - * D,-,. , / * do Menu4

Delphi Client/Server

*0

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

Ese L01,) E23(2 * para de+inir u1 5an2o de dados lo2al e R*4 0 - * S*+5 *+ 2aso o 5an2o de dados esteJa e1 u1 ser7idor re1oto na rede4 Na op68o D,-, . , / * entre o no1e do 5an2o de dados 2o1 seu respe2ti7o diretrio4 9 seguir entre 2o1 u1 usuArio;sen h a :ue tenha per1iss 8o para 2riar u1 no7o 5an2o de dados4

Dig4 /4 -4 !ria68o de u1 no7o 5an2o de dados4

9 seguir de7e' se eBe2ut ar o ar:ui7o Ps2riptQ 7endas4s :l atra7Ks da op68o do Menu $()*/R62 ,2 ISQL S1+(7- 4 9ssi1 o progra 1 a irA 2riar as ta5elasI 2olunas e outras de+ini6Ces pres ent e s no ar:ui7o4 9 estrutura 2riada K repres e n t a d a pelo 1odelo de dados da +igura /4 24

Delphi Client/Server

*1

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

ED [ED\)G ED\NM

!ID9DE [!ID\!D [ED\)G !ID\NM !ID\NEMH9<I*9N*E)

PE))O9 [PE)\!D PE)\NM PE)\*P PE)\!G!!PD PE)\LOGR9DOERO PE)\NEMERO PE)\!OMPLEMEN*O PE)\<9IRRO !ID\!D ED\)G

?ENDEDOR [PE)\!D ?EN\?END9) ?EN\PER!!OMI))9O ?EN\!OMI))9O

PRODE*O [PRO\!D PRO\NM PRO\PRE!O PRO\E)*O=EE

!LIEN*E [PE)\!D !LI\LIMI*E!REDI*O !LI\DE<I*O

PEDIDO [PED\!D PED\D* PED\?9LOR PED\*IPO PE)\!D\!LI PE)\!D\?EN

I*EM [PED\!D [PRO\!D I*E\?9LOR I*E\=E9N*

Dig4 /4 #M Modelo de Dados EBe1plo4

(inguagem S@(
Para a2ess ar os 5an2os de dados rela2ionais +oi desen7ol7ida u1a linguag e 1 2ha1a d a )=L4 O O5Jeti7o dess a linguag e 1 K +orne2er u1a +or1a padr8o de a2esso aos 5an2os de dadosI n8o i1portand o a linguag e 1 2o1 :ue esses tenha 1 sido desen7ol7idos4 9pesar da tentati7a de se tornar u1 padr8o ,9N)I.I 2ada +orne2e dor hoJe possui u1a sKrie de eBtens C e s :ue torna 1 as 7Arias 7ersCes in2o1p a tG7eis entre si4 Por issoI n8o pens e :ue u1a apli2a68o 2onstruGda para a2ess ar u1 deter 1in a d o 5an2o de dados de u1 +orne2e dorI irA a2ess ar ta15 K 1 I se1 :ual:uer 1odi+i2a68oI o 5an2o de dados de u1 outro +orne2e dor4 Isto s K possG7el se a apli2a68o utili@ar so1en t e a parte 2o1u 1 ,9N)I. da linguag e 1 )=LI 1as isto +a@ 2o1 :ue ela per2a 7Arios re2ursos i1portant e s disponG7eis e1 2ada 7ers8o )=L de +orne2e dor e s di+erent e s 4 9lguns 5an2os de dados JA suporta 1 o padr8o )=L 9N)I'$2 :ue JA K 1ais a5rang e n t e nu1a tentati7a de +a2ilitar o pro2ess o de deiBar transp ar e n t e a 5ase de dados utili@ada pela apli2a68o4 Entretan toI alguns +orne2e dor e s ainda n8o +orne2e 1 suporte ao )=L 9N)I'$2 de +or1a 2o1pleta por:ue teria1 :ue alterar partes estruturais de seus siste 1 a s geren2iadore s4 Categorias da (inguagem S@( 9 linguag e 1 )=L se di7ide e1 tr>s 2ategoriasM DDL , Linguag e 1 de De+ini68o de Dados.4 Parte da linguag e 1 2o1 2o1an do s para 2ria68o das estrutura s de dados 2o1o as ta5elasI 2olunasI et24 EBM !RE9*E *9<LE4

Delphi Client/Server

*2

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

DML , Linguag e 1 de Manipula68o de Dados.4 Parte da linguag e 1 2o1 2o1and os para a2ess ar e alterar os dados ar1a@ e n a d o s no 5an2o de dados4 Os prin2ipais 2o1and os dess a 2ategoria s8oM )ELE!*I EPD9*EI IN)ER*I DELE*E4 D!L , Linguag e 1 de !ontrole de Dados.4 Parte da linguag e 1 2o1 2o1an do s para de+inir usuArios e 2ontrolar seus a2essos aos dados4 EBM GR9N*4 $tili;ando o >indo?s IS@( para de:inir o 6anco de Dados O ar:ui7o Ps2riptQ utili@ado para 2ria68o do 5an2o de dados possui u1a sKrie de 2o1and os )=L do tipo DDL4 Esses 2o1and os pode 1 ser utili@ados direta 1 e n t e na linha de 2o1and o do I)=L4 E1 eBe 1plo de )=L'DDL K o 2o1an do para 2ria68o de ta5elas e 2olunasM
CREATE TABLE PEDIDO (PED_CD CODIGO NOT NULL, PED_DT DATE NOT NULL, PED_VALOR VALOR, PED_TIPO TIPO NOT NULL, PES_CD_CLI CODIGO NOT NULL, PES_CD_VEN CODIGO NOT NULL, TIMESTAMP DATE, PRIMARY KEY (PED_CD));

Esse 2o1an do 2ria a ta5ela pedido e suas 2olunas JA identi+i2ando sua 2ha7e pri1Aria atra7Ks da 2lAusula 7+(4 ,+8 9*8. $tili;ando o >indo?s IS@( para acessar o 6anco de Dados Para se 2one2tar ao 5an2o de dadosI pode' se utili@ar a op68o $()*/C02 2 * 1 - -0 D,-,. , / * 4 De7e' se sele2ionar o 5an2o de dados e entrar 2o1 o usuArio e senha de a2esso4

Delphi Client/Server

*4

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

Dig4 /4 %M !oneB8o 2o1 o <an2o de Dados4

Para eBe2ut ar u1 2o1an do )=LI 5asta es2re7>' lo na se68o SQL S-,- * 4 * 2 - 4 O 2o1and o seguinte insere u1 registro na ta5ela de produto4 Para eBe2ut ar o 2o1and oI pode' se utili@ar o 5ot8o R62 4
insert into PRODUTO(PRO_CD,PRO_NM,PRO_ESTOQUE,PRO_PRECO) values (1,Impressor ,!,"##$##)

Para 7eri+i2ar a inser68oI pode' se sele2ionar o registro atra7Ks do 2o1and o seguinte e pressionar no7a 1 e n t e o 5ot8o R62 M
select % from PRODUTO

ou
select PRO_CD,PRO_NM,PRO_ESTOQUE,PRO_PRECO from PRODUTO

Para alterar os dados de u1 registro eBistent eI pode' se utili@ar o 2o1and o U7:,- * ;


up ate PRODUTO set PRO_PRECO & "!#$##,PRO_ESTOQUE & ' !"ere PRO_CD& 1

Para 7eri+i2ar os dados no7a 1 e n t e I pode' se pressionar o 5ot8o P+*5(0 6 / atK en2ontrA' lo e a seguir pressionar o 5ot8o R62 4 Dinal1ent eI para eB2luir u1 registroI pode' se utili@ar o 2o1and o D*)* - * M
elete from PRODUTO !"ere PRO_CD & 1

Delphi Client/Server

*5

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

Para 2on2luir as opera6C e s +eitas e registrA' las no 5an2oI de 1odo :ue outros usuArios seJa1 2apa@es de 7>' lasI utili@a' se o 2o1and oM
commit

ConsistAncia e Integridade dos Dados


9 1aioria dos 5an2os de dados rela2ionais possue 1 re2ursos para 2onsistir e tornar Gntegro os dados ar1a@e n a d o s e1 suas ta5elas4 Desta +or1aI :ual:uer +erra 1 e n t a :ue o usuArio utili@ar para a2ess A' lo K o5rigad a a respeitar as regrasI 1ant e n d o a integridad e dos dados4 Os re2ursos de 2onsist>n2ia 7aria1 de 5an2o para 5an2oI 1as pode' se de+inir 2on2eitual1 e n t e algu1a s 2ategorias de integridad e 2o1oM integridad e re+eren2ialI do1Gnios e regras do neg2io4 Integridade "e:erencial Integridad e re+eren2ial K u1 2onJunto de regras e de 2onsist>n2ias entre os registros de duas ta5elas :ue se rela2iona 14 !o1o +oi 7isto no 1odelo rela2ionalI :uando duas ta5elas se rela2iona 1I a 2ha7e pri1Aria de u1a K 2opiada para a outra e se esses dados +ore1 alterados ou eB2luGdos da ta5ela original K ne2ess Ario 7eri+i2ar o :ue serA +eito 2o1 os dados e registros dupli2ados na outra ta5ela4 =uando se de+ine u1a integridad e re+eren2ialI estA se de+inindo o pro2edi1 e n t o :ue serA to1ad o :uando esses pro2essos o2orrere 14 )eJa1 duas ta5elas P9Q e P<Q :ue se rela2iona 1 atra7Ks de u1a 2oluna P2Q :ue K a 2ha7e pri1Aria de P9Q e portanto +oi repetida e1 P<Q para se +a@er o rela2iona 1 e n t o4 =uando se de+ine u1a integridad e re+eren2ial para esse rela2iona 1 e n t oI estA se de+inindo :ue a 2oluna P2Q da ta5ela P<Q s pode 2onter 7alores JA 2adas tr a d o s na 2oluna P2Q da ta5ela P9Q4

*a5ela 9 [2 d e 4 4
Dig /4 $M Integridade Re+eren2ial4 Delphi Client/Server ,7

*a5ela < [a 5 2

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

EBiste1 tr>s +or1as de se 1ant er essa regra :uando registros da ta5ela P9Q s8o eB2luGdosM R*/-+(1- M De+ine :ue se o 7alor da 2oluna P2Q de P9Q eBistir e1 algu1 registro de P<QI o registro n8o poderA ser eB2luGdo e u1a 1ens a g e 1 de erro retornar A para a apli2a68oZ C,/1, : * M De+ine :ue se o 7alor da 2oluna P2Q de P9Q eBistir e1 algu1 registro de P<QI todos os registros :ue possuGre 1 esse 7alor ser8o ta15 K 1 eB2luGdosZ S*- N6)) M De+ine :ue se o 7alor da 2oluna P2Q de P9Q eBistir e1 algu1 registro de P<QI os 7alores de P2Q e1 todos os registros ser8o trans+or1 a d o s para PNullQZ E1 todos os 2asosI se o usuArio tentar inserir u1 registro e1 P<Q 2o1 u1 7alor de P2Q :ue n8o eBista na ta5ela P9QI u1 erro serA reporta do N apli2a68o4 9lguns 5an2osI ta15 K 1 per1ite 1 +a@er o 1es 1o trata 1 e n t o :uando a 2ha7e da ta5ela +or alterad aI ao in7Ks de eB2luGda4 Entretan toI essa altera6 8o de 2ha7es n8o de7e ser u1 pro2ess o 2o1u 1 nas apli2a6CesI sendo nor1al 1 e n t e proi5idas4 Os 5an2os de dados possu e 1 +or1as di+erent e s de disponi5ili@ar esses ser7i6os4 9lguns possue 1 atK 1ais de u1a +or1a de +a@er o 1es 1o pro2ess o4 Mas de 1aneira geral eBiste 1 duas possi5ilidad es de i1ple1e n t a 6 8 oM
Integridade "e:erencial Declarativa

Essa K u1a +or1a 1ais +A2ilI porK 1 1enos +leBG7el4 !o1 apen a s u1 2o1and o se de+ine a integridad e4 PorK1I alguns 5an2os n8o suporta 1 essa sintaBe ou a +orne2e 1 de 1an eira li1itada so1en t e para regras do tipo PRestri2tQ4 9 1aior 7antag e 1 dess a alterna ti7a K sua si1pli2idad e e por isso 1enos suJeita a erros de i1ple1e n t a 6 8 o4
!riggers

Os triggers s8o peda6os de 2digo es2ritos e1 u1a eBtens 8 o da linguag e 1 )=L +orne2ida por 2ada +orne2e dorI sendo portanto u1a linguag e 1 proprietAria4 Essa eBtens 8 o possui instru6Ces para i1ple1e n t a r PloopsQ e 7eri+i2ar 2ondi6Ces per1itindo +a@er pe:ue n os progra 1 a s estrutur a do s4 Os triggers s8o dispara dos auto 1 a ti2a 1 e n t e pelo 5an2o :uando e7entos de in2lus8oI altera6 8 o ou eB2lus8o o2orre 1 e1 u1a deter 1in a d a ta5ela4 PortantoI atra7K s dos triggers pode' se desen7ol7er a lgi2a ne2ess Aria para se 1ant er a integridad e re+eren2ial entre as ta5elas4

Delphi Client/Server

,1

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

Domnio dos dados Outro tipo de 2onsist>n2ia K 2o1 rela68o ao do1Gnio dos dados4 Para u1 deter 1ina d o 2a1po de dado pode eBistir u1 2onJunto de 7alores per1itidos e o 5an2o de dados de7e reportar u1 erro N apli2a68o se u1 7alor in7Alido +or in+or1ad o4 E1 tipo de 2onsist>n2ia de do1Gnio :ue K nor1al1 e n t e +orne2ido pelos 5an2os K a possi5ilidade do 2a1po ser nulo ou n8o4 9lguns 5an2os possue 1 ta15 K 1 2o1and os para de+inir u1 2onJunto de 7alores 7Alidos para u1 deter 1ina d o 2a1po4 EBM ?alores ,]V^I^D^. para u1 2a1po :ue ar1a@ e n a se a pesso a K +Gsi2a ou JurGdi2a4 Outros possu e 1 u1a sintaBe para de+inir 7alores 1Gni1os e 1ABi1os4 Pode' seI aindaI utili@ar o re2urso de triggers para esse propsito4 "egras de eg+cio

Pode' se de+inir 2o1o regras de neg2io a integridad e :ue de7e eBistir entre os 7alores de 1ais de u1 2a1po de u1a ou 1ais ta5elas4 Pode' se 2onsiderar 2o1o regra do neg2io as 2onsist>n2ias e atuali@a6Ces :ue de7e 1 ser +eitas e1 7Arias ta5elasI :uando u1 registro K inseridoI alterado ou eB2luGdo de u1a ta5ela4 Ou u1 pro2esso de 2Al2ulo disparad o so5re os dados do 5an2o :ue ta15 K 1 +a@e1 atuali@a6Ce s e1 di+erent e s lo2aisI 1as de +or1a a 1ant er os 7alores dos dados se1pr e Gntegros e 2onsistent e s4 E1 eBe1plo seria a atuali@a68o de esto:u e :ue nor1al1 e n t e en7ol7e outras tare+as e1 u1 siste 1 a de 2ontrole de esto:u e4 Para i1ple1e n t a r essas regras de neg2io no 5an2o de dados s8o utili@ados os re2ursos de triggers e stored pro2edur e s4 )tored pro2edur e s s8o 5lo2os de 2digo assi1 2o1o os triggers4 9 di+eren6a entre eles K :ue os triggers s8o dispara do s auto 1 a ti2a 1 e n t e por inser6CesI altera6C e s e eB2lusCes +eitas nas ta5elasI en:ua n to as stored pro2edur e s8o 2ha1 a d a s eBpli2ita1 e n t e pela apli2a68o4 $tili;ando o >indo?s IS@( para de:inir integridades e consistAncias O ar:ui7o Ps2riptQ utili@ado na 2ria68o do 5an2o de dados eBe1plo ta15 K 1 possui 2o1and os :ue de+ine1 regras de integridad e e do1Gnios :ue ser8o seguidas pela 5ase de dadosM
CREATE TABLE PEDIDO (PED_CD CODIGO NOT NULL, PED_DT DATE NOT NULL, PED_VALOR VALOR, PED_TIPO TIPO NOT NULL, PES_CD_CLI CODIGO NOT NULL, PES_CD_VEN CODIGO NOT NULL, TIMESTAMP DATE, PRIMARY KEY (PED_CD));
Delphi Client/Server ,*

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

Na prpria de+ini68o da ta5ela JA K atri5uGda a 7eri+i2a68o de nulidad e para alguns 2a1pos atra7Ks da sintaBe N0- N6)). O prBi1o 2o1and o de+ine u1 2onJunto de 7alores possG7eis para o 2a1po PE)\*P da ta5ela PE))O94
ALTER TABLE PESSOA A## C$ECK( (PES_TP&()() OR (PES_TP&(*())

Para de+inir a integridad e re+eren2ial entre duas ta5elas +oi usada a +or1a de2larati7a atra7Ks do 2o1an doM
ALTER TABLE ITEM A## %OREI&N KEY (PED_CD) RE%ERENCE' PEDIDO(PED_CD);

Esse 2o1an do de+ine :ue u1 ite1 s pode ser in2luGdo se o 7alor da 2oluna PED\!D da ta5ela de I*EM JA eBistir na ta5ela PEDIDO4 9lK1 dissoI s K possG7el eB2luir u1 PEDIDO :ue n8o possua I*EN) asso2iados4 9 sintaBe do Inter5as e para de+ini68o de integridad e re+eren2ial de2larati7a so1e nt e per1ite a +or1a Prestri2tQ4 9s de1ais +or1as teria1 :ue ser de+inidas atra7Ks de triggers4 $tili;ando o >indo?s IS@( para testar as consistAnciasB O 1odelo eBe1plo de pedido possui de+ini6Ces para +a@er a integridad e re+eren2ial entre suas ta5elas4 E1a delas K na rela68o :ue eBiste entre as ta5elas ED e !ID9DE 2o1o 1ostrad a na +igura /4 /4 Esta integridad e n8o per1ite ent8o inserir u1 registro na ta5ela !ID9DE se o 7alor atri5uGdo a ED\)G n8o eBistir na ta5ela ED4 9lK1 dissoI se tentar 1o s eB2luir u1 registro da ta5ela ED :ue esteJa sendo re+eren2iado pela ta5ela !ID9DE irA retornar u1a 1ens a g e 1 de erroI JA :ue o tipo da integridad e K Prestri2tQ4
ED [ED\)G ED\NM

R*/-+(1!ID9DE [!ID\!D [ED\)G !ID\NM !ID\NEMH9<I*9N*E)


Dig /42(M Integridade Re+eren2ial

EBe2utan d o o seguinte 2o1and o no WindoHs I)=L444


insert into CIDADE(CID_CD,U*_SG,CID_NM,CID_NUM+A,ITANTES) values (1,-MG-,-,e.o +or/0o12e-, !#####)
Delphi Client/Server ,,

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

u1a 1ens a g e 1 de erro irA retornar JA :ue n8o eBiste u1 registro 2o1 ED\)G _ ]MG^ na ta5ela EDI portanto de7e' se pri1eiro inserir o registroM
insert into U*(U*_SG,U*_NM) values (3MG-, -M/1 s Ger /s-)

9 seguir pode' se inserir no7a 1 e n t e o registro na ta5ela !ID9DE


insert into CIDADE(CID_CD,U*_SG,CID_NM,CID_NUM+A,ITANTES) values (1,-MG-,-,e.o +or/0o12e-, !#####)

9ssi1I os dois registros +ora1 inseridos 2o1 su2essoI e de7e' se portanto e+eti7ar as inser6Ces utili@ando o 2o1an do 104 4 (- 4 Pode' se tentar eB2luir o registro da ta5ela ED atra7Ks do 2o1an doM
elete from U* !"ere U*_SG & 3MG-

Pelo 1es 1o 1oti7o 7isto anterior1e n t eI o registro ta15 K 1 n8o pode ser eB2luGdo4 De7e' se ent8o eB2luir pri1eiro o registro de !ID9DE para depois poder eB2luir o de ED4 O 1odelo eBe1plo ta15 K 1 possui algu1 a s 2onsist>n2ias de do1GnioI prin2ipal1e n t e e1 rela68o a nulidade4 Pode' se tentar inserir na ta5ela ED utili@ando o seguinte 2o1an doM
insert into U*(U*_SG,U*_NM) values ( N4.., N4..)

Esse 2o1and o de7e retornar erro in+or1a n do :ue ED\)G n8o pode ser nulo4 )e o 2o1and o +or alterado paraM
insert into U*(U*_SG,U*_NM) values ( 3SP-, N4..)

irA 2ontinuar apres e n t a n d o erroI agora na 2oluna ED\NM :ue ta15 K 1 n8o pode 2onter nula4

Distri=uio da ConsistAncia e Integridade dos Dados !o1o +oi 7istoI K possG7el i1ple1 e n t a r 7Arias regras de 2onsist>n2ia dos dados no prprio 5an2o de dados4 Entreta nt oI K possG7el i1ple1e n t A' las ta15 K 1 na apli2a68o e portanto +i2a u1a dL7ida de :ual seria o 1elhor lugar para i1ple1 e n t A' las4 915as as alternati7as possue 1 7antag e n s e des7ant a g e n s :ue de7e 1 ser o5ser7a d a s no inG2io do pro2esso de desen7ol7i1e nt o4 9 prin2ipal 7antag e 1 e1 se 2olo2ar todas as regras no 5an2o de dados K :ue esse 1ant K 1 a 2onsist>n2ia e integridad e dos dados indepe n d e n t e da +erra1 e n t a de a2esso utili@ada pelo usuArio4 9lK1
Delphi Client/Server ,/

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

dissoI as 1anut e n 6C e s dessas regras +i2a1 lo2ali@adas e1 u1 Lni2o lo2alI ao in7Ks de +i2are 1 espalha d a s por toda a apli2a68o ou por di7ers as apli2a6Ces4 Entreta nt oI o desen7ol7i1e n to utili@ando essa linha de tra5alho K 1uito 1ais Arduo e de1ora d o4 9s +erra 1 e n t a s disponG7eis ness e a15ient e n8o apres e n t a 1 ainda 1uitos re2ursos :ue d>e 1 produti7idad e na 2onstru68o das regras4 9s linguag e n s utili@adas para es2re7 er as Pstored pro2edur e s Q e PtriggersQ s8o proprietArias dos +orne2edor e s I tornando a e1pres a depend e n t e de Lni2o +orne2e dorI di+i2ultando a distri5ui68o dos dados e1 5an2os de +orne2e dor e s di+erent e s 4 9lK1 disso K ne2ess Ario di7idir o desen7ol7i1e nt o e1 duas linguag e n s4 9 linguag e 1 da +erra1 e n t a para se 1ontar a inter+a2e e a 2ha1 a d a dos pro2essos e a linguag e 1 para 2onstru68o das Pstored pro2edur e sQ4 9tual1e nt eI o 1er2ado se en2ontra di7idido 2o1 2ada e1pre s a to1an d o u1 2a1inho di+erent e para distri5uir essas regras entre o 2liente e o ser7idor4 Mas n8o pode' se di@er :ue u1 2a1inho JA seguido por u1a e1pre s a :ue o5te7e su2esso K o 1ais indi2ado para u1a outra e1pres a4 Muitas outras 7ariA7eis pre2isa 1 ser 2onsiderad a s e di+i2il1ent e ser8o iguais entre duas e1pres a s 4 9lK1 dissoI as +erra 1 e n t a s e a te2nologia e7olue 1 +a@endo 2o1o :ue u1 1es 1o 2a1inho possa o5ter resultados di+erent e sI 2onsidera n d o' se a te2nologia atual1e n t e disponG7el4 De u1a 1aneira geralI as duas pri1eiras 2ategorias de 2onsist>n2ia ,integridad e re+eren2ial e do1Gnios. s8o nor1al1 e n t e i1ple1e n t a d a s no 5an2o de dadosI sendo :ue os do1Gnios s8o i1ple1e n t a d o s repetida 1 e n t e na apli2a68o para e7itar :ue os 2o1an do s seJa1 en7iados ao 5an2o4 9 grand e dL7ida 1es 1oI K 2o1 rela68o Ns regras de neg2io :ue algu1 a s e1pres a s i1ple1 e n t a 1 total1e n t e no 5an2o de dadosI outras total1e n t e na apli2a68o e algu1 a s distri5ue 1 entre esses dois 2o1pon e n t e s 4 9tual1en t eI eBiste 1ais u1 alterna ti7a na no7a gera68o da ar:uitetur a !liente;) er7idorM a i1ple1e n t a 6 8 o das regras de neg2io e1 u1 no7o 2o1pon e n t e 2ha1a d o P)er7idor de 9pli2a6CesQ4

Delphi Client/Server

,0

S 3 D 6

S I S ! ' M A S

3 ' " '

C I A D # " ' S

D '

6 A

C #

D '

D A D # S

S@( 'Cplorer
Fss e ca p:tulo a pre s e n t a a 8 erra m e n t a d e d e8ini./o e m a nip ula./o d e d a do s S7* F=plorer d a %orland.

Captulo

ode' se utili@ar a +erra 1 e n t a )=L EBplorer para 2riar a estrutur a do 5an2o de dados de 1an eira grA+i2a e interati7a4 9lK1 dissoI essa +erra1 e n t a per1ite de+inir no7os aliases para os 5ases de dadosI 1anipular os dados ,inserirI alterarI eB2luir.I e 2onstruir u1 di2ionArio de dados 2o1 de+ini6Ces :ue pode 1 ser utili@adas para +a2ilitar a 2onstru68o de apli2a6Ces e1 Delphi4

Criao de Alias
E1a das possi5ilidad es do )=L EBplorer K a de+ini68o de PaliasesQ4 9o a5rir o )=L EBplorer K eBi5ido na lista D,-,. , / * / todos os PaliasesQ de+inidos no <DE4

Dig &4 M Lista de aliases no )=L EBplorer

Delphi Client/Server

,1

Para 2riar u1 no7o aliasI de7e' se pressionar o 5ot8o direito do P1ous eQ e1 :ual:uer regi8o do )=L EBplorer para eBi5ir u1 Ppopup 1enuQ e sele2ionar a op68o N*< ... 4 E1a tela serA eBi5ida para :ue seJa in+or1a do o tipo de Pdri7erQ do no7o alias4

Dig4 &42M De+ini68o de u1 no7o alias4

)isuali;ao e 'dio de Dados


Para 7isuali@ar e editar os dados de u1 5an2o de dadosI de7e' se eBpandir sua lista de op6Ces eBi5indo seus 2o1pon e n t e s 4 !ada tipo de Pdri7erQ de 5an2o de dados pode possuir op6Ces di+erent e s na listaI entret a n t o u1a op68o 2o1u 1 a todos KM T,.)* / 4 9o eBpan dir ta15 K 1 essa op68oI serA listada todas as ta5elas 2ontidas ness e 5an2o de dados4 Pode' seI ent8oI sele2ionar u1a das ta5elas e eBi5ir seus dados atra7Ks da +i2ha D,-, do lado direito da tela4 Na 5arra de +erra1 e n t a s eBiste 1 5otCes :ue per1ite 1 a na7eg a 6 8 o entre os registrosI in2lus8oI edi68o e eB2lus8o dos dados4

Delphi Client/Server

,2

Dig &4/M ?isuali@a68o e edi68o dos dados4

Pode' se ta15 K 1 utili@ar 2o1an do s )=L par 7isuali@ar e editar os dados atra7Ks da +i2ha E2-*+ SQL 4

Delphi Client/Server

,4

Dig &4&M ?isuali@a68o de dados atra7Ks de )=L

Pode' se ta15 K 1 1anipular os dados atra7K s de 2o1and os )=Ls4

Dig4 &45 Edi68o de dados atra7Ks de )=l4

De:inio de novos elementos


9tra7Ks do )=L EBplorer pode' se ta15 K 1 de+inir no7os ele1e n to s na estrutura do 5an2o de dados4 Para 2riar u1a no7a ta5ela no 5an2o de
Delphi Client/Server ,5

dadosI de7e' se pressionar o 5ot8o direito so5re o ite1 T,.)* / e sele2ionar a op68o N*< ... 4 no Ppopup 1enuQ4 E1a no7a ta5ela K 2riada 2o1 u1 no1e de+ault4 Pode' se ent8o alterar seu no1e e de+inir os de1ais ele1e n t o s :ue a 2o1pCe 14

Dig &4-M De+ini68o de u1a no7a ta5ela4

Pode' se de+inir as 2olunasI 2ha7e pri1AriaI integridad e re+eren2ialI PtriggersQI Gndi2es e outros ele1e n t o s para as ta5elas atra7Ks do )=L EBplorer para os 7Arios tipos de 5an2o de dados4

De:inio de Dicion9rios de dados


9tra7Ks do )=L EBplorer pode' se de+inir u1 di2ionArio de dados4 Esse di2ionArio K u1 5an2o de dados espe2ial usado para ar1a@ e n a r u1 2onJunto de de+ini6Ces dos itens de dado eBistent e nas ta5elas do 5an2o de dados da apli2a68o4 Esse 2onJunto de de+ini6Ces des2re7e as propried a d e s do 2o1pon e n t e 1ield de u1 &ataSet no DelphiI o tipo do 2a1po e o tipo de 2ontrole 7isual a ser 2riado :uando o 2o1pon e n t e 1ield K arrast a d o para a tela4 Desta +or1aI 2onseg u e' se de+inir u1a Lni2a 7e@ as proprieda d e s de u1 do1Gnio de dado :ue pode estar sendo utili@ado por di7ersos itens e1 7Arios lo2ais da apli2a68o4

Delphi Client/Server

/7

Criao de um novo Dicion9rio Para 2riar u1 no7o di2ionArio de dadosI de7e' se sele2ionar a +i2ha D(1-(02 ,+8 do lado es:uerdo da telaI pressionar o 5ot8o direito e es2olher a op68o N*< do Menu4 9 seguir serA eBi5ida u1a tela para se de+inir o no1e do di2ionArioI o alias do 5an2o aonde a ta5ela do di2ionArio serA 2riada e o no1e da ta5ela4

Dig &4#M !ria68o do Di2ionArio de Dados

Importao das de:iniDes do 6anco de Dados Para i1portar os atri5utos e de+ini6Ces do 5an2o de dados da apli2a68o de7e' se sele2ionar a op68o D(1-(02 ,+8 /I4 7 0+ - $+04 D,-,. , / * .

Dig &4%M I1porta68o das de+ini6Ces do <an2o de Dados4

De:inio das propriedades dos Attri=ute Sets 9 seguir s8o eBi5idas as de+ini6Ces i1portad a s e os P Attri4ute SetsH en2ontra do s pelos P2onstraintsQ de+inidos no 5an2o de dados para 2ada ele1e n t o4

Delphi Client/Server

/1

Dig &4%M De+ini68o de propriedade s dos Attri4ute Sets 4

$tili;ao do Dicion9rio no Delphi Para utili@ar as de+ini6Ces esta5 ele2idas no di2ionArio e1 u1a apli2a68o DelphiI pode' se arrast ar os 2a1pos deseJA7 eis do )=L EBplorer para a tela da apli2a68o4 9uto1ati2a 1 e n t e I ser8o 2riados u1 &ataSet e u1 &atasource para 2ada ta5ela do 5an2o de dados4

Delphi Client/Server

/*

Dig &4$M !ria68o da tela atra7Ks do Di2ionArio do )=L EBplorer4

9lK1 dissoI pode' se ta15 K 1 asso2iar u1 2o1pon e n t e 1ield atra7Ks da op68o A// 0 1( , - * ,--+(.6 - * / . . . do Ppopup 1enuQ4

Dig &4 (M 9sso2ia68o de 1ields 2o1 o di2ionArio4

Delphi Client/Server

/,

!ra=alhando com 6ancos de Dados "elacionais


Fss e ca p:tulo a pre s e n t a a 8or m a d e tra4alho do s 4 a ncos d e d a dos relacionais.

Captulo

s 5an2os de dados rela2ionais +orne2e 1 u1 2onJunto de ser7i6os para :ue as apli2a6Ces possa 1 a2ess A' los e 1anipulA' los4 PortantoI K i1portan t e enten d er 5e1 sua +un2ionalidad e para 1elhor apro7eitar seus re2ursos nas apli2a6Ces4 EBiste1 algu1a s di+eren6a s na +or1a de tra5alhar entre os +orne2e dor e sI 1as grande parte dos 2on2eitos pode 1 ser apli2ados a todos os 5an2os de dados rela2ionais4

Componentes da Ar-uitetura Cliente/Servidor.dls:


!o1o +oi 7istoI a ar:uitetur a !liente;) er7idor K 2o1post a de dois 2o1pon e n t e s +Gsi2os :ue se 2o1uni2a 1 atra7Ks da redeM a esta6 8o de tra5alho do usuArio e o ser7idor de 5an2o de dados4 Para se esta5 ele2 er a 2o1uni2a68 o entre esses dois 2o1pon e n t e s s8o utili@adas 7Arias 2a1a d a s de so+tHare :ue s8o instalad a s e1 2ada 2o1pon e n t e +Gsi2o4 9 esta6 8o de tra5alho 2liente de7e terI alK1 da apli2a68o +inalI 7Arios outros ele1e n t o s para a2ess ar a 5ase de dados e1 u1 )G<D atra7Ks de rede4 D,-, . , / * E23(2 * M 5i5liote2a +orne2ida pelo +orne2edor da +erra 1 e n t a de desen7ol7i1en to 2o1 o o5Jeti7o de +orne2er u1a +or1a Lni2a e transp ar e n t e da apli2a68o a2ess ar di+erent e s 5ases de dados4 EBM <DE ,<orland Data5 a s e Engine.Z SQL L(29/ M Pdri7erQ +orne2ido ta15 K 1 pelo +orne2e dor da +erra 1 e n t a de desen7ol7i1en to respons A 7 el pela 2o1uni2a68 o do Data5a s e Enginer 2o1 u1a 5ase de dados espe2G+i2a4 )ua prin2ipal 2ara2t erGsti2a K tradu@ir os 2o1and os utili@ados pelo Data5a s e Enginer para 2o1an do s 2onhe2idos pela 5ase de dados utili@ada4 EBM )=L linTs para a2ess ar Ora2leI )F5as eI In+or1iBI M) )=L )er7erI Inter5as eI et24 9 apli2a68o pode optar por utili@ar o padr8o OD<! para a2ess ar a 5ase de dadosI ao in7Ks de utili@ar )=L LinTs ,a2esso nati7o.4 Entreta n toI o a2esso +eito pelos )=L LinTs ainda possui u1 dese 1 p e n h o superior e1 rela68o ao a2esso +eito 7ia Pdri7erQ OD<!4

Delphi Client/Server

//

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

C)(*2- :0 B,210 :* D,: 0 / M 9PI +orne2ida pelo +orne2edor do )GD< e instalad a na esta68 o 2liente para esta5 ele2 er a 2o1uni2a6 8o 2o1 o 5an2o de dados4 Nessa 9PI se en2ontra 1 as +un6Ces de a2esso a 5ase de dados4 R ta15 K 1I respons A7 el por utili@ar u1 deter 1in a d o proto2olo de rede para en2ontrar o ser7idor de 5an2o para :ue a apli2a68o possa a2ess A' lo en7iando 2o1an do s e 5us2an do os dados4 P+0-0 1 0) 0 :* R*: * M so+tHares respons A7 eis pela trans 1iss 8 o dos dados pela rede entre a 1A:uina 2liente e o ser7idor4

CLIENTE CLIENTE
A7)(1,>B*/ $*++,4*2-,/ D*/*250)5(4*2-0 D,-,.,/* D,-,.,/*E23(2*+ E23(2*+

MIDDLE=ARE
S*+5(>0/ E/7*1@A(10/
SQL/API SQL/API

SERVIDOR SERVIDOR
B,210 B,210:* :*D,:0/ D,:0/

T+,2/70+-*
N*-B(0/ N*-B(0/ TCP/IP TCP/IP IPX/SPX IPX/SPX SNA SNA

SOR
S*+5. S*+5.D(+*-?+(0 D(+*-?+(0
S(/-*4, O7*+,1(02,)

S*+5. S*+5.D(+*-?+(0 D(+*-?+(0 S*36+,2>, S*36+,2>,


S(/-*4, O7*+,1(02,)

RPC RPC

M*2/,3*2/ M*2/,3*2/

Dig 54 M !o1ponente s da 2o1uni2a68o entre o !liente e o )er7idor4

ConeCDes e ConteCtos
Pode' se de+inir 2o1o 2oneB8o u1 2a1inho esta5 ele2ido entre a apli2a68o e o 5an2o de dados atra7Ks de u1 usuArio e sua senha4 Para 2ada 2oneB8o K 2riada u1a estrutura na 1e1ria do ser7idor de 5an2o prepar a d a para re2e5er os 2o1an do s )=L en7iados pela apli2a68o4 !ada 2oneB8o pode ter u1 ou 1ais 2onteBtos4 Para eBe2ut ar u1 2o1and o )=L na apli2a68o K ne2ess Aria a 2ria68o de pelo 1enos u1 2onteBto dentro da 2oneB8o4 Os 2o1and os )=Ls en7iados por u1 2onteBto pass a 1 por pelo 1enos duas +asesM prepar a6 8 o e eBe2u6 8o4 Na pri1eira +ase K 7eri+i2ada a sintaBe do 2o1an do e K de+inido o 2a1inho de a2esso :ue serA utili@ado pela eBe2u6 8o do 2o1and o ,oti1i@a68o.4 Na segund a +ase o 2o1an do K +inal1ent e eBe2ut a d o4 Depois :ue a pri1eira +ase +or 2o1plet a d aI pode' se repetir 7Arias 7e@es a eBe2u6 8o da segund a +aseI oti1i@ando o pro2es soI JA :ue o te1po gasto para 2o1pilar e oti1i@ar o 2o1and o n8o serA gasto no7a 1 e n t e4 Entretan toI u1 1es 1o 2onteBto pode ser usado para a
Delphi Client/Server /0

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

eBe2u6 8o de 1ais de u1 2o1and o )=L4 =uando u1 outro 2o1an do )=L K en7iado pelo 1es 1o 2onteBtoI o 2o1an do anterior deiBa de eBistir e u1a no7a ne2es sida d e de eBe2u6 8o dess e 2o1and o terA :ue pass ar no7a 1 e n t e pelas duas +ases4 Portanto u1 2onteBto s per1ite 2ontrolar e 1ant er prepar a d o u1 Lni2o 2o1an do )=L4 !o1andos anteriores n8o s8o 1ais 7istos pelo 2onteBto4

!onteBtos 9pli2a68o !oneB8o <an2o

Dig 542M !oneBCes e !onteBtos

Para resol7er esse pro5le1 aI alguns 5an2os per1ite 1 a utili@a68o de 1Lltiplos 2onteBtos dentro de u1a 1es 1 a 2oneB8oI possi5ilitando o 2ontrole de 1ais de u1 2o1an do )=L ao 1es 1o te1po4 Para os 5an2os :ue n8o possue 1 1Lltiplos 2onteBtosI K ne2es s Ario 2riar 7Arias 2oneBCe s para se ter o 1es 1o re2urso4 PorK1 eBiste 1 algu1 a s di+eren6a s entre essas duas +or1as de utili@a68o4 E1a 2oneB8o K total1e n t e indepen d e n t e de u1a outra 2oneB8oI 2o1o se +osse 1 dois usuArios di+erent e s a2ess a n d o o 5an2o de dados4 VA 7Arios 2onteBtos dentro de u1a 2oneB8o s8o interligados e 2oopera 1 para a eBe2u68o de u1 1es 1o pro2esso4 ConeCDes e ConteCtos no Delphi Para a2ess ar a 5ase de dadosI de7e' se pri1eira 1 e n t e 2riar u1 PaliasQ no <DE para o 5an2o de dados eBe 1plo no inter5as e4 Pode' se atri5uir o no1e P7enda sQ para o PaliasQI de+inir o parO 1 e t ro /*+5 * + 2,4 * para o no1e do 5an2o de dados e seu diretrioI 6/ *+ 2,4 * para )`)D<94

Delphi Client/Server

/1

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 54/M !on+igura68o do alias no <DE4

!Data=ase e !DataSet

O 2o1pon e n t e do Delphi :ue repres e n t a u1a 2oneB8o 2o1 o 5an2o de dados K o T&ata4as e 4 De7e' se utili@ar u1 2o1pon e n t e T&ata4as e para 2ada 2oneB8o :ue se deseJe +a@er 2o1 o 5an2o4 9lguns 5an2os 2ontrola 1 o nL1ero de li2en6as de usuArios atra7K s do nL1ero de 2oneBCe s4 PortantoI o nL1ero de 2oneBCe s de7e ser 5e1 redu@ido4

Dig 54&M !o1ponente *Data5ase do Delphi4

Os 2o1pon e n t e s T7uerI e TTa4le s8o utili@ados para +orne2er 2onteBtos dentro de u1a 2oneB8o do 5an2o de dados4 9tra7Ks da propried a d e D,-,. , / * N , 4 * K possG7el ligA' los a u1 2o1pon e n t e T&ata4as e 4
Delphi Client/Server /2

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 545M Os 2o1ponentes T7uerI e TTa4le do Delphi4

Cursores e "esult Sets


=uando o )=L eBe2ut a d o K u1 2o1and o /*) * 1 - e retorna 1ais de u1 registroI K ne2ess Ario :ue a apli2a68o a5ra u1 2ursor para poder per2orrer e tra@er todos os registros do 5an2o de dados para a apli2a68o4 Desta +or1a K 2riado u1 Presult setQI :ue K u1a estrutura te1por Aria 2o1 a indi2a68o dos registros :ue +ora1 sele2ionados4 O 2ursor K ini2ial1ent e posi2ionado na pri1eira linha e a apli2a68o pode re:uisitar :ue o 2ursor a7an2 e linha a linha no Presult setQ atK :ue seu +inal seJa al2an6ad o4 Os 2ursores e Presult setsQ pode 1 ser 2riados no 5an2o de dados se estes suportar e 1 ou na prpria esta6 8o de tra5alho4 9 prin2ipal utilidade dos 2ursores e Presult setsQ K per1itir per2orrer os dados e1 :ual:uer sentido e poder +a@er atuali@a6Ces de registro atra7Ks do posi2iona 1 e n t o do 2ursor4 )e nenhu 1 2ursor +or de2larado eBpli2ita1 e n t e no 5an2o de dadosI o 5an2o de dados 2ria u1 2ursor interna 1 e n t e apen a s para en7iar se:We n2ial1e n t e os dados para a apli2a68o :uando estes +ore1 re:uisitados4 9ssi1I n8o K ne2ess Ario :ue o ser7idor en7ie todos os dados sele2ionados de u1a s 7e@ para apli2a68o4 !a5e a apli2a68o di@er :uando 2ada registro de dados de7e ser tra@idos para a 1A:uina 2liente4 Nor1al1 e n t e I K utili@ado P5u++ersQ :ue pode 2onter 1ais de u1 registro para en7iar os dados para apli2a68o4 O ta1a n h o dess es P5u++ersQ pode ser rede+inido para oti1i@ar os pa2otes de dados en7iados pela rede4

Delphi Client/Server

/4

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

!onteBtos 9pli2a68o !oneB8o


!o1ando Insert !o1ando Epdate !ursor Result )et 4 4 4 4

<an2o

!o1ando )ele2t

Dig 54-M !ursores e Result )ets

O 2o1and o /*) * 1 - I 2o1o :ual:uer outro 2o1an do K eBe2ut a d o e1 u1 deter 1ina d o 2onteBto de u1a 2oneB8o4 Ent8oI se outro 2o1and o )=L utili@ar o 1es 1o 2onteBto antes :ue todas as linhas do 2o1and o /*) * 1 - anterior tenha 1 sido tra@idas para apli2a68o o 2ursor e seu Presult setQ ser8o destruGdos e o restant e das linhas K perdido4 PortantoI para se 1ant er o Presult setQ de u1 2o1an do /*) * 1 - atK :ue todas as linhas seJa1 tra@idasI K pre2iso a5rir u1 2onteBto de 1aneira eB2lusi7a para esse 2o1and o4 9 1edida :ue as linhas s8o tra@idas para apli2a68oI nor1al 1 e n t e s8o 2riados 2a2hes na 1e 1ria ou e1 dis2o para ar1a@ e n a r os dados per1itindo a na7eg a6 8 o entre registros ,in2lusi7e registros anteriores.4 Esse re2urso K nor1al1 e n t e 2onhe2ido 2o1o PDront End Result )etQ por estar lo2ali@ado na 1A:uina 2liente4 Cursores e "esult Sets no Delphi Os 2o1pon e n t e s TTa4le e T7uerI do Delphi utili@a1 esses re2ursos para a2ess ar o 5an2o de dados4 =uando se a5re u1a P=uerFQ ou u1a P*a5leQ no DelphiI u1 2ursor aponta n d o para u1 Presult setQ K 2riado e as linhas s8o tra@idas e ar1a@ e n a d a s na apli2a68o a 1edida :ue o usuArio per2orre os registros atK o +inal da 2onsulta4 PortantoI se o usuArio sele2ionar u1 nL1ero grand e de registros , 4(((4(((.I ele irA esper ar apen a s o te1po ne2es s Ario para 2o1pilar e eBe2ut ar a 2onsulta e tra@er alguns pou2os registros su+i2ientes para popular a parte 7isG7el dos dados na tela4 Os de1ais registros ser8o tra@idos a 1edida :ue o usuArio na7egu e e1 dire68o ao +inal da 2onsulta4 )e o usuArio eBe2ut ar u1 2o1an do para ir para o +inal da 2onsultaI poderA ter :ue esper ar o te1po ne2es s Ario para se tra@er todos os 4(((4((( de registros para a esta68 o 2liente4

Delphi Client/Server

/5

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 54#M !ursores e PResult )etsQ no Delphi4

!ransaDes
E1 dos re2ursos 1ais i1portant e s +orne2idos pelos 5an2os de dados K o 2ontrole de trans a6 8 o4 O 2ontrole de trans a6 8 o per1ite as apli2a6Ces 1ant er e 1 a integridad e lgi2a dos dados e1 u1 deter 1in a d o pro2ess o4 E1a trans a6 8 o K u1 2onJunto de 2o1an do s eBe2ut a d o s no 5an2o de dados :ue de7e 1 ser apli2ados integral1e n t e4 )e u1 dos 2o1and os +alharI todos os outros t>1 :ue ser des+eitos para 1ant er a integridad e e a uni2idad e do pro2ess o e1 eBe2u6 8o4 Desta +or1a pode' se garantir a 2on+ia5ilidade dos dados ar1a@ e n a d o s no 5an2o4 !onsidere o seguinte eBe1ploM u1 pro2esso de trans+er> n2ia entre 2ontas 2orrente s :ue de7e de5itar u1 7alor e1 u1a das 2ontas e 2reditar eBata 1 e n t e o 1es 1o 7alor e1 u1a outra 2onta4 )e o pro2esso +alhar no 1eio e esse re2urso de 2ontrole de trans a6 8 o n8o esti7er sendo utili@adoI o dinheiro pode ser retirado da pri1eira 2ontaI 1as n8o ser 2reditado na segund aI assi1 o 7alor :ue de7eria ser trans+eridoI si1ples 1 e n t e desap ar e2 e da 5ase de dados4 Para +a@er o 2ontrole de trans a6 8 oI s8o +orne2idos nor1al 1 e n t e pelos 5an2os de dados tr>s 2o1an do sM u1 para ini2iar a trans a6 8 o , .* 3( 2 -+,2 / , 1 - ( 0 2 .I u1 para +inali@ar e apli2ar as 1odi+i2a6Ces eBe2ut a d a s , 104 4 (- . e outro para +inali@ar 2an2elando e des+a@end o toda a opera68 o , +0)).,19 .4 PortantoI :uando u1a trans a6 8 o K ini2iadaI todos os 2o1an do s seguintes +a@e1 parte de u1a Lni2a trans a6 8 o atK ser en2ontrad o u1 2o1an do :ue a +inali@e , 104 4 (- ou +0)).,19 .4 )e todos os 2o1an do s +ora1 eBe2ut a d o s 2o1 >BitoI pode' se ent8o disparar o 2o1and o 104 4 (- para :ue estes seJa1 apli2ados e se torne 1 7isG7eis para os de1ais usuArios4 !aso 2ontrArioI se u1 erro +oi en2ontra do e1 algu1 dos 2o1and osI pode' se disparar u1
Delphi Client/Server 07

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

+0)).,19 des2art a n d o trans a6 8 o4

todas

as

altera6C e s

desde

o 2o1e6o

da

!ada 2oneB8oI nor1al 1 e n t e suporta apen a s u1 2ontrole de trans a6 8 o e todos os seus 2onteBtos +a@e1 parte dess a 1es 1 a trans a6 8 o4 =uando u1a trans a6 8 o K ini2iadaI :ual:uer 2o1an do disparado e1 :ual:uer u1 dos 2onteBtos +a@ parte da trans a6 8 o4 E :uando a trans a6 8 o K +e2had a os 2o1and os eBe2ut a d o s por todos os 2onteBtos s8o apli2ados e os 2onteBtos s8o destruGdos4 )endo assi1I 2o1and os :ue era1 1antidos prepar a d o s e1 algu1 2onteBto ne2es sita 1 ser no7a 1 e n t e 2o1pilados e 2onteBtos :ue possuGa 1 2ursores e Presult setsQ :ue n8o ha7ia1 sido tra@idos total1e n t e para a apli2a68o s8o +e2hados e portanto seus dados perdidos4 9lgu1as +erra1 e n t a s I 2o1o o DelphiI ao 7eri+i2are 1 :ue os 2onteBtos ser8o destruGdos 5us2a 1 todos os registros de Presult setsQ pend e nt e s para a apli2a68o antes :ue estes seJa1 destruGdos4 9lguns 5an2os de dados per1ite 1 :ue seJa1 1antidos os 2onteBtos :uando a trans a6 8 o K +inali@ada4 Entretan toI K ne2es s Ario :ue a +erra1 e n t a de desen7ol7i1e nt o ta15 K 1 +a6a uso dess e re2urso4 Pode' se ta15 K 1 2riar 1ais de u1a 2oneB8oI para 2onseg uir 1ant er a5ertos os 2onteBtosI deiBando' os e1 u1a 2oneB8o separa d a da 2oneB8o :ue a trans a6 8 o estA sendo eBe2ut a d a I JA :ue o 2ontrole de trans a6 8 o s K 7Alido para u1a Lni2a 2oneB8o4 PorK1I de7e' se to1ar 5astan t e 2uidado 2o1 essa Llti1a alternati7a4 !o1o serA 7isto adiant eI o 2ontrole de tra7a 1 e n t o de registros ta15 K 1 K +eito para 2ada trans a6 8 o e portanto u1a 2oneB8o pode tra7ar 2o1an do s da outra 2oneB8o deiBando a apli2a68o e1 PDeadLo2TQI se os 2uidados ne2es s Arios n8o +ore1 to1ad os4 9lguns ser7idores de 5an2o de dados ta15 K 1 suporta 1 o 2ontrole de trans a6 8 o entre dois 5an2os di+erent e s atra7Ks do re2urso 2ha1a d o PtHo' phas e 2o11itQ4 Esse re2urso per1ite :ue a +inali@a68o da trans a6 8 o seJa +eita e1 dois passosI possi5ilitando :ue u1 5an2o de dados noti+i:ue ao outro o su2esso da trans a6 8 o para :ue ela possa ser +inali@ada 2o1o u1 todo4 !ransaDes no Delphi Para se +a@er esse 2ontrole de trans a6 8 o no Delphi de7e' se utili@ar u1 2onJunto de 1Ktodos eBistent e s no 2o1pon e n t e T&ata4as e 4 S-,+-T+,2 / , 1 - ( 0 2 C04 4(trans a6 8 o R0)).,19 trans a6 8 o
Delphi Client/Server

' Ini2ia a trans a6 8 o4 +eitas desde o inG2io da

' E+eti7a as altera6C e s

' !an2ela as altera6C e s +eitas desde o inG2io da

01

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

ProEeto 'Cemplo

O proJeto a seguir 1ostra 2o1o as trans a6C e s s8o tratad a s nas opera6C e s +eitas pelo prprio Delphi e 2o1o se 2o1port a 1 os 2ursores e 2onteBtos JA a5ertos4 =uando n8o se usa eBpli2ita 1 e n t e os 2o1and os 7istos a2i1aI o Delphi a5re i1pli2ita1 e n t e u1a trans a6 8 o a 2ada 2o1an do de atuali@a68o disparad o no 5an2o e logo a seguir +e2ha a trans a6 8 o 2o1 u1 2o1an do 104 4 (- 4 O o5Jeti7o do proJeto K o5ser7ar o :ue o2orre 2o1 o PResult )etQ a5ertoI :uando u1 2o1and o :ue +inali@a a trans a6 8 o K eBe2ut a d o4 Para 2onstruir a apli2a68o de7e' se desen h ar o P+or1Q 2o1o 1ostrado na +igura e de+inir as propried a d e s listadas na ta5ela4

Dig 54%M Dor1 do proJeto de transa6Ces4

Componente Form1 Table1

Data"ource1 #rid1 Quer$1 Data"ource2 #rid2

Proprie"a"e Name DatabaseName TableName cti!e Data"et Data"ource DatabaseName "Q% 'e(uest %i!e Data"et Data"ource

-alor frmTransacao Vendas Produto True Table1 Data"ource1 Vendas "elect & from Produto True Quer$1 Data"ource2

*a5ela de PropriedadesM ProJeto de transa6Ces4

9ps ter 2onstruGdo o P+or1QI de7e' se a5rir o )=LMonitor atra7Ks da op68o do Menu D,-, . , / * / S QL M02(-0+ para :ue se possa o5ser7ar os 2o1and os en7iados pelo Delphi ao ser7idor de 5an2o de dados4
Delphi Client/Server 0*

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

SQL M02(-0+ ' Derra 1 e n t a 2apa@ de 1onitorar as 2ha1a d a s +eitas pelas apli2a6Ces Delphi aos ser7idores de 5an2o de dados4 Per1ite 7er as instru6Ces en7iadas para o 5an2o 2o1o os 2o1an do s )=Ls , /*) * 1 - I 67: ,- * I (2/ *+- I :*)* - * .4 9lK1 disso per1ite 7er os 7alores de parO 1 e t ro s en7iados para os 2o1an do s e os dados :ue s8o retornad os pelo ser7idor4 !on2luindoI essa K u1a i1portan t e +erra1 e n t a :ue auBilia o desen7ol7edor a des2o5rir o 2o1porta 1 e n t o da apli2a68o e1 rela68o ao 5an2o de dadosI tornando possG7el o aper+ei6oa 1 e n t o da apli2a68o para se o5ter u1a 1elhor per+or1a n2 e no a15ient e 2liente;s er7idor4

Dig 54$M )=L Monitor4

Pode' se es2olher o :ue serA 1onitorado pelo )=L Monitor atra7Ks da op68o T+,1* O7-(02 4

Delphi Client/Server

0,

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 54 (M *ra2e Options do )=LMonitor

9ps a5rir o )=L Monitor de7e' se eBe2ut ar a apli2a68o e o5ser7ar :ue so1e nt e s8o tra@idos para a apli2a68o u1a :uantidad e de dados su+i2iente para preen2h er a parte 7isG7el do PGridQ4 =uando o usuArio na7eg a pelo PGridQI no7as linhas s8o tra@idasI atK :ue o usuArio atinJa o +i1 do Presult setQ4 9lK1 dissoI de7e' se o5ser7ar :ue se +or +eita u1a atuali@a68o e1 algu1 registroI serA disparad o u1 2o1and o 1)0/ * +e2hando o Presult setQ e :uando o usuArio na7eg a para u1a linha :ue ainda n8o +oi tra@ida para a apli2a68oI u1 no7o 2o1an do /*) * 1 - serA +eito 5us2an do as linhas :ue ainda n8o +ora1 tra@idas atra7Ks de u1 +iltro 2olo2ado na 2lAusula <C *+ * do 2o1and o4
SELECT PRO_CD ,PRO_NM ,PRO_PRECO ,PRO_ESTOQUE ,TIMESTAMP 5+ERE (PRO)C#* +, ORDER ,6 PRO_CD ASC *ROM PRODUTO

9tra7Ks dess e eBe 1ploI pode' se o5ser7ar :ue :uando u1a trans a6 8 o K +inali@ada todos os Presult setsQ a5ertos s8o +e2hados e no 2aso do 2o1pon e n t e TTa4le u1 no7o /*) * 1 - K +eito :uando o usuArio na7eg a por registros ainda n8o en7iados a esta6 8o4 EBisteI no entantoI u1a di+eren6a :uando se utili@a o 2o1pon e n t e T7uerI 4 Nesse 2o1pon e n t e I :uando a trans a6 8 o K +inali@adaI o Delphi l> todas as linhas pend e nt e s atK o +inal do Presult setQ antes de eBe2ut ar o 2o1an do 104 4 (- 4 Para 7eri+i2ar esse 2o1port a 1 e n t oI de7e' se alterar a propried a d e A1-(5 * do Ta4le1 para PDalseQ e a
Delphi Client/Server 0/

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

propried a d e A1-(5 * do 7uerI1 para P*rueQ e +a@er os 1es 1o s pro2edi1 e n t o s do eBe 1plo anterior4 PorK1 alguns 5an2os suporta 1 :ue os 2ursores per1a n e 6 a 1 a5ertos :uando a trans a6 8 o K +inali@ada4 O Inter5as e K u1 dos 5an2os :ue possue 1 essa 2ara2terGsti2a e para utili@A' la K ne2es s Ario alterar a propried a d e DRI?ER DL9G) no <DE4 Entretan to essa alterna ti7a s K 7Alida para trans a6C e s 2ontrolada s i1pli2ita1 e n t e pelo Delphi4
DRIVER $LAGS ( 5 2 &($ &(- % I/0) , -( 0 2 )*5 * ) ,2 : 10 4 4 ( - -87 * Read 2o1 1 it t e d I hard 2o1 1i t Repe a t a 5l e rea dI hard 2o1 1i t Read 2o1 1 it t e d I so+t 2o1 1i t Repe a t a 5l e rea dI so+t 2o1 1i t

Para 2ada ser7idor de 5an2o de dados eBiste u1a 2on+igura68 o di+erent e4 Para o Ora2leI por eBe 1ploI nada pre2isa ser +eito por:ue este K o 2o1port a 1 e n t o padr8o4

ConcorrAncia . D(S<
Pode' se de+inir 2o1o 2on2orr>n2ia o pro2esso de disponi5ili@ar a 1es 1 a 5ase de dados N 7Arios usuArios 2one2ta d os si1ultan e a 1 e n t e 4 Para 1ant er a uni2idad e de u1a trans a6 8 o e a 2on+ia5ilidad e no 7alor do dado apres e n t a d o ao usuArioI K ne2es s Ario a utili@a68o de alguns 2ontroles so5re os registros do 5an2o de dados4 !ipos de travamentos FlocGsH Para disponi5ili@ar tal +un2ionalidad eI o 5an2o de dados pro7> ser7i6os para 5lo:ue ar u1 registroI de +or1a :ue outros usuArios n8o possa 1 a2ess A' lo4 9lguns 5an2os per1ite 1 o tra7a 1 e n t o de u1 Lni2o registroI en:ua n to outros tra5alha 1 2o1 unidad e s 2o1p atG7eis 2o1 o dispositi7o +Gsi2oI per1itindo o tra7a 1 e n t o atra7K s de pAginas4 Depend e n d o do 5an2oI o ta1a n h o dessas pAginas pode 7ariar ,2aI a.I podendo essas sere 1 +or1ad a s por 1ais de u1 registro4 PortantoI :uando u1a pAgina K tra7ad aI todos os registros :ue ela possui ser8o tra7ados4 Esse 2ontrole de atri5uir e re1o7 er as tra7as K reali@ado para 2ada trans a6 8 o e1 2ada 2oneB8o4 Mes1o se duas 2oneBCe s s8o +eitas pelo 1es 1o usuArioI o 2ontrole de tra7a 1 e n t o K distintoI podendo assi1 u1a das 2oneBC es 5lo:ue ar registros para a outra 2oneB8o4 De7e' se ter 2uidado ao se tra5alhar e1 1ais de u1a 2oneB8o para n8o a2onte2 er os 2ha1 a d o s PDeadlo2TsQI :ue s8o tra7a 1 e n t o s 2ausa dos por 1ais de u1a 2oneB8o e :ue 2ada u1a
Delphi Client/Server 00

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

delas estA a espera da li5era68o 2ontinuar sua eBe2u68o4

de u1 registro da outra para

Pode' se di@er :ue os 5an2os de dados tra5alha 1 2o1 dois tipos de tra7asM PeB2lusi7e lo2TQ e Pshared lo2TQ4
'Cclusive (ocG

)8o tra7as atri5uGdas aos registros ou pAginas :uando o usuArio eBe2ut a 2o1an do s de atuali@a68o so5re elas , 67: ,- * I (2/ *+- I :*) * - * .4 !o1o seu no1e indi2aI nenhu 1 a outra tra7a pode ser 2olo2ada na 1es 1 a pAgina ou registroI proi5indo :ual:uer tipo de a2esso ao registro ou pAgina por outra 2oneB8o ,trans a6 8 o.4 *odas as tra7as PeB2lusi7e lo2TsQ s8o retirada s auto1 a ti2a 1 e n t e :uando a trans a6 8 o +or +inali@ada por u1 104 4 (- ou +0)).,19 4
Shared (ocG

)8o tra7as :ue pode 1 ser 2olo2ad as nos registros ou pAginas :uando o usuArio sele2iona o registro4 E1a tra7a Pshared lo2TQ per1ite :ue outras tra7as do 1es 1o tipo seJa1 atri5uGdas ao 1es 1o registro ou pAginaI entret a n t o proG5e a atri5ui68o de u1a tra7a PeB2lusi7e lo2TQ4 PortantoI :uando se atri5ui a u1 registro ou pAgina u1a tra7a Pshared lo2TQI 5lo:ueia' se :ual:uer atuali@a68o por outra trans a6 8 o ,2oneB8o.I per1itindo assi1 a apli2a68o ter a2esso ao dado 2o1 a 2erte@a :ue este n8o serA alterado por 1ais ninguK 14 Entreta nt oI K possG7el :ue o 1es 1o usuArio na 1es 1 a 2oneB8o possa alterar o registro ou pAgina 1ar2ado por ele 2o1o Pshared lo2TQ trans+or1 a n d o' o para PeB2lusi7e lo2TQI desde :ue nenhu 1 a outra 2oneB8o possua ta15 K 1 u1a tra7a Pshared lo2TQ para o 1es 1o registro ou pAgina4 *odas as tra7as Pshared lo2TQ ta15 K 1 s8o retirad as :uando se +inali@a a trans a6 8 o4
PD 3 . 06 R*3( / - . ET+ , 2 / , > B * / 1 ' 3 1 EB2lusi7 e )har e d ' 3 5

)har e d )har e d

)har e d

)har e d EB2lusi7 e

5
*a5ela de *ransa6CesM E1 PeB2lusi7e lo2TQ e1 u1a linhaI eB2lui a possi5ilidade de eBistir outro PeB2lusi7e lo2TQ ou Pshared lo2TQ e1 u1a outra 2oluna na 1es1a linha4

veis de isolamento Pode1o s de+inir alguns nG7eis de isola1e n toI de a2ordo 2o1 a +or1a :ue os Pshared lo2TsQ s8o atri5uGdos aos registros ou pAginas4 9 seguir ser8o 1ostra d a s as 7Arias +or1as de se tra5alhar 2o1 Plo2TsQ no 5an2o de dadosI indepe n d e n t e dos no1es utili@ados pelos 7Arios +orne2e dor e s4 )endo possG7el :ue alguns 5an2os de dados n8o apres e n t e 1 todas as possi5ilidade s des2ritas a5aiBo4
Delphi Client/Server 01

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

!ravamento de todos os registros

Nessa 1odalidad e K atri5uGda u1a tra7a Pshared lo2TQ para todos os registros da sele68o +eita atra7Ks de u1 2o1and o /*) * 1 - 4 Este K o nG7el de isola1e n t o :ue 1ais tra7a os registros e de7e ser utili@ado 2o1 2autela para n8o in7ia5ili@ar a 2on2orr>n2ia dos dados e o +un2iona 1 e n t o da apli2a68o4
!ravamento de um registro ou p9gina

Nesse tipo de tra7a 1 e n t oI s8o 2olo2ada s tra7as Pshared lo2TsQ so1e nt e para o registro ou pAgina onde o 2ursor se en2ontra posi2ionado4 =uando a apli2a68o 1o7i1en t a o 2ursor para u1 prBi1o registroI K retirada a tra7a do registro anterior e 2olo2ada no registro atual 4 PortantoI so1en t e u1 registro ou pAgina +i2a tra7ado e1 u1 deter 1in a d o 1o1e n t o4
Sem travamento

Nessa 1odalidad e K atri5uGda u1a tra7a Pshared lo2TQ no 1o1e n t o de a2esso a 2ada registro4 Entreta nt oI essa tra7a K retirad a logo a seguir e o registro ou pAgina n8o per1a n e 2 e tra7ado4 Essa pe:ue n a atri5ui68o da tra7a K si1ples 1 e n t e para 7eri+i2ar se n8o eBiste nenhu 1 a outra tra7a do tipo PeB2lusi7e lo2TQ so5re o registroI :ue n8o per1itiria a sua leitura4 PortantoI 1es 1o ness a 2ategoria n8o K possG7el a2ess ar registros alterados no 1eio de u1a trans a6 8 o :ue est8o 1ar2ados 2o1o PeB2lusi7e lo2TQ4
Seleo de registros travados com um eCclusive locGB

9lguns 5an2os per1ite 1 :ue u1a 2oneB8o a2ess e os dados de u1 registro ou pAgina 1es 1o se estes esteJa 1 1ar2ado s 2o1o PeB2lusi7e lo2TQ4 Para talI o registro K a2ess a d o se1 a atri5ui68o de nenhu 1 a tra7aI JA :ue u1a tra7a P)LQ n8o pode 2oeBistir 2o1 u1a tra7a PELQ e1 u1 1es 1o registro ou pAgina4 !o1o os registros a2ess a d o s possue 1 dados :ue n8o +ora1 e+eti7ados atra7Ks de u1 104 4 (- I s8o nor1al1 e n t e disponi5ili@adas 2pias antigas do 1es 1o registro ar1a@ e n a d a s pelo 5an2o de dados4 9pesar de per1itir esse tipo de a2essoI 1uitos 5an2os de dados proG5e 1 a altera6 8o dos dados :uando a2ess a d o s desta +or1a4 #ptimistic (ocG Para se 1aBi1i@ar a 2on2orr>n2ia entre os dados nas apli2a6CesI pode 1 ser utili@adas outras +or1as de 2ontrole :ue di1inue 1 os tra7a 1 e n t o s 2aus ado s na 5ase de dados4 Para isso pode' se utili@ar o nG7el de isola1e n t o P)e1 tra7a 1 e n t o s Q e +a@er u1 2ontrole adi2ional para ter 2erte@a :ue os dados 1ostra dos para o usuArio n8o +ora1 alterados :uando esse ini2ia o pro2esso de altera6 8o do registro4 EBiste1 algu1 a s alterna ti7as :ue pode 1 ser seguidas para se i1ple1e n t a r esse pro2ess o4 O pro2ess o nor1al de u1 2o1and o de 67: ,- * ou :*)* - * K 2onter na 2lAusula <C *+ * a 7eri+i2a68o da 2ha7e pri1Aria para possi5ilitar a identi+i2a68o do registro na ta5ela4
Delphi Client/Server 02

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Entreta nt oI eBplorando u1 pou2o 1ais esse re2urso de identi+i2a68o do registroI pode' se i1ple1e n t a r u1 5o1 2ontrole de 2on2orr>n2ia4
>here All

!onsiste e1 7eri+i2ar na 2lAusula <C *+ * n8o s a 2ha7e pri1AriaI 1as todos os registros4 9ssi1I se :ual:uer u1 dos registros +or alterado ou eB2luGdo por outro usuArioI esse n8o serA en2ontra d o :uando o 2o1and o 67: , - * ou :*) * - * +or disparad oI sendo possG7el a apli2a68o noti+i2ar o usuArio tal a2onte2i1e n t o4 9 apli2a68o pode ent8o per1itir o usuArio 5us2ar no7a 1 e n t e os dados para 7eri+i2ar as altera6C e s +eitas e reini2iar o pro2esso de altera6 8o4 Entreta nt oI 2a1pos de di+G2il 2o1par a6 8 oI 2o1o 2a1pos 2ontendo i1agen s e teBtos grande sI nor1al 1 e n t e n8o pode 1 ou n8o de7e 1 ser utili@ados desta +or1a4
>here Changed/IeJ

!onsiste e1 7eri+i2ar na 2lAusula <C *+ * a 2ha7e pri1Aria 1ais os 2a1pos :ue so+rera 1 altera6 8o pelo usuArio4 Desta +or1a garant e' se :ue os 1es 1o s 2a1pos n8o +ora1 alterados por outro usuArio4 MasI per1ite atuali@ar u1 registro alterado por outro usuArio desde :ue n8o seJa1 os 1es 1o s 2a1pos4
>here IeJ

Nesse 1Ktodo a 2on2orr>n2ia K li7reI pois per1ite :ue o registro seJa alterado se1 7eri+i2ar se este +oi alterado por outro usuArio4 Na 2lAusula <C *+ * de altera6 8oI K so1en t e utili@ada a 2ha7e pri1Aria da ta5ela para lo2ali@ar o registro4
>here !imestamp/"o?id

!onsiste e1 7eri+i2ar na !lAusula <C *+ * a 2ha7e pri1Aria 1ais u1a 2oluna de+inida eB2lusi7a 1 e n t e para +a@er o 2ontrole de 2on2orr>n2ia4 Essa 2oluna K atuali@ad a para u1 no7o 7alor toda 7e@ :ue o registro +or inserido ou alterado4 PortantoI se o registro +or alterado por u1 outro usuArioI o registro n8o serA en2ontra do para atuali@a68o4 9lguns tipos de 5an2os de dados JA possue 1 algu1 suporte para esse tipo de 2ontrole4 O )=L)er7er e o )F5as e possue 1 u1 tipo de dado 2ha1a d o -(4 * / - , 4 7 I para o :ual pode se 2riar u1a 2oluna :ue serA atuali@ada auto1 a ti2a 1 e n t e 2o1 a horaI 1inutoI segundo e dK2i1os de segundo do 1o1e n t o e1 :ue o2orrer u1a opera68 o de inser68o ou altera6 8o4 O )=L<ase K u1 outro 5an2o :ue per1ite esse 2ontrole atra7Ks de u1a 2oluna 2ha1a d a +0<(: :ue JA K de+inida auto 1 a ti2a 1 e n t e para todas as ta5elas e K atuali@ada para u1 7alor Lni2o :uando o2orre as opera6C e s (2/ *+- e 67: , - * 4 Para os 5an2os :ue n8o possu e 1 auto 1 a ti2a 1 e n t e esses re2ursosI de7e' se 2riar u1a no7a 2oluna :ue pode ar1a@ e n a r a Data;hora 2o1o no 2aso do -(4 * / - , 4 7 I desde :ue o tipo per1ita a atri5ui68o de dK2i1os de segundoI por:ue a unidad e segundo n8o possui
Delphi Client/Server 04

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

pre2is8o su+i2iente para essa opera6 8o4 Ou pode' se 2riar u1a 2oluna nu1Kri2aI 2uJo o 7alor serA in2re1 e n t a d o atra7Ks de u1 2ontador Lni2o a 2ada atuali@a68o reali@ada so5re o registro4 9lK1 de 2riar a 2olunaI K pre2iso +a@er ta15 K 1 o pro2ess o de atuali@a68o dos dados :uando u1a opera68 o de (2/ *+- ou 67: ,- * o2orrer4 Pode' se +a@er isso atra7K s da apli2a68o ou atra7Ks do re2urso de PtriggersQ dos 5an2os de dados4 9 utili@a68o de PtriggersQ possi5ilita :ue a atuali@a68o possa ser +eita atra7Ks de outras +erra1 e n t a s :ue n8o seJa1 a prpria apli2a68o e K portanto 1ais re2o1e n d a d o4 ConcorrAncia no Delphi Para se 2on+igurar os nG7eis de isola1e n t o utili@ados pelo Delphi de7e' se utili@ar a propried a d e T+,2/I/ 0) , -( 0 2 do 2o1pon e n t e T&ata4as e 4 tiDirtFRea d ' Per1ite ler altera6C e s +eitas por outro usuArio ,ou trans a6 8 o. ainda n8o P2o1itad a s Q ,e+eti7ad a s.I ou seJa n8o respeita n do os PeB2lusi7es lo2TsQ4 Essa op68o nor1al1 e n t e n8o estA disponG7el nos 5an2o de dados4 tiRead!o 1 1itt e d ' Esse K o tipo 1ais nor1al de se tra5alhar4 )o1ent e as altera6C e s +eitas por outro usuArio ,ou trans a6 8 o. JA P2o1itad a sQ s8o 7istas pelo usuArio4 )e a altera6 8o ainda n8o +oi e+eti7ad a o registro +i2a tra7ado e a leitura +i2a esper a n d o o +i1 da trans a6 8 o4 tiRepe at a 5l eRe a d ' Esse 1Ktodo K utili@ado para :ue o dado 7isto pelo usuArio seJa se1pr e o 1es 1o durant e a trans a6 8 o se este +or lido no7a 1 e n t e 4 9lguns 5an2os i1ple1 e n t a 1 este re2urso per1itindo 7er u1a 2pia 1ais antiga de u1 registro alterado por outra trans a6 8 o e ainda n8o P2o1itadoQ4 Desta +or1a a apli2a68o n8o +i2a tra7ad a espera n d o a li5era68o do registro pela trans a6 8 o4 Esta alterna ti7a di1inui a possi5ilidade de tra7a 1 e n t o s entre as trans a6C e s I porK 1 2onso 1 e u1 nL1ero 1aior de re2ursos do 5an2o para +a@er as 2pias ,7ersCes. dos registros4 Outros 5an2osI i1ple1 e n t a 1 este re2urso tra7ando 2o1 u1 Pshared lo2TQ todos os registros lidosI n8o per1itindo assi1 :ue outro usuArio altere o registroI desta +or1a se os dados +ore1 relidos seus 7alores per1a n e 2 e 1 o 1es 1o4 9o 2ontrArio da i1ple1e n t a 6 8 o anteriorI essa alternati7a au1e n t a a possi5ilidad e de tra7a 1 e n t o s entre as trans a6C e s e de7e ser utili@ada 2o1 5astan t e 2uidado4

Delphi Client/Server

05

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 54

M *Data5ase4*ransIsolation4

Para se 2on+igurar o pro2esso de POpti1isti2 Lo2TQ no DelphiI de7e' se utili@ar a proprieda d e U7:,- * M 0 : * dos 2o1pon e n t e s &ataSetsJ T7uerI e TTa4le 4

Delphi Client/Server

17

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 54 2M *=uerF4EpdateMode4

ProEeto 'Cemplo

O proJeto a seguir 1ostra 2o1o esses re2ursos s8o utili@ados no Delphi4 O +or1ulArio apres e n t a d o na +igura de+ine 2o1o a apli2a68o de7e ser 2onstruGda4 De7e' se utili@ar duas instOn2ias da apli2a68o para si1ular o a2esso de dois usuArios si1ultan e a 1 e n t e 4 O eBe 1plo 1ostra o pro2esso de tra7a 1 e n t o do registro :uando u1a atuali@a68o K +eita por u1 usuArio antes do 2o1an do 104 4 (- ser eBe2ut a d o4

Delphi Client/Server

11

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Dig 54 /M ProJeto EBe1plo

Componente Form1 Database1

Quer$1 Data"ource1 #rid1 +utton1 +utton2 +utton*a5ela de Propriedades4

Proprie"a"e Name lias DatabaseName Connected DatabaseName "Q% 'e(uest %i!e Data"et Data"ource Ca,tion Ca,tion Ca,tion

-alor frm%oc) V*ND " D+V*ND " True D+V*ND " "elect & from Cidade True Quer$1 Data"ource1 "tart Trans Commit .,en

O 5ot8o P)tart *ransQ serA utili@ado para ini2iar a trans a6 8 o portanto K i1ple1e n t a d o da seguinte 1an eiraM
proce ure TfrmLoc-.Button/Clic-('en er0 TO12ect,3 1e4in #ata1ase/.'tartTransaction3 en 3

O 5ot8o P!o11itQ ao ser pressiona do +e2harA eBe2ut a n d o o 1Ktodo 104 4 (- do T&ata4as e M


proce ure TfrmLoc-.Button5Clic-('en er0 TO12ect,3 1e4in #ata1ase/.Commit3 en 3

trans a6 8 o

E o 5ot8o POpenQ de7e alternar entre a5rir e +e2har o &ataset 7uerI1 4


proce ure TfrmLoc-.Button6Clic-('en er0 TO12ect,3
Delphi Client/Server 1*

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

1e4in 7uer8/.Active09 Not 7uer8/.Active3 en 3

Depois de 1ontad a a apli2a68o de7e' se 2o1pilA' laI eBe2ut A' la e a5rir 1ais u1a instOn2ia eBe2ut a n d o o ESE atra7K s do HindoHs eBplorer4

Dig 54 &M Duas instOn2ias do proJeto eBe1plo e1 eBe2u68o4

De7e' se eBe2ut ar agora os seguintes passosM 4 Pressionar &ataSet Z o 5ot8o POpenQ da pri1eira instOn2ia para a5rir o

24 Pressionar o 5ot8o P)tart *ransQ da 1es 1 a instOn2ia para ini2iar a trans a6 8 oZ /4 9lterar o 2a1po !ID\NEMH9<I*9N*E) do pri1eiro registro para &((4(((Z &4 Na7egar para o segundo registro para :ue a gra7a68 o seJa +eita no 5an2oZ 54 *entar a5rir a P:uerFQ na segund a instOn2ia da apli2a68o atra7Ks do 5ot8o POpenQ4 O Presult setQ 7irA 7a@ioI trata 1 e n t o +eito pelo Delphi :uando en2ontra o registro 5lo:ue a d oZ -4 Pressionar o 5ot8o P2o11itQ da pri1eira instOn2ia para e+eti7ar a gra7a6 8o e li5erar os Plo2TsQZ
Delphi Client/Server 1,

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

#4 De2har e a5rir no7a 1 e n t e a P:uerFQ da segund a instOn2ia atra7K s do 5ot8o POpenQ4 9goraI os registros s8o tra@idos para a telaZ %4 O 1es 1o a2onte2 e se o usuArio da segund a instOn2ia tentar alterar os dados :ue ainda n8o +ora1 e+eti7ados4 Pressionar no7a 1 e n t e o 5ot8o P)tart *ransQ da pri1eira instOn2ia e alterar o 2a1po !ID\NEMH9<I*9N*E) para /((4(((Z $4 *entarI agoraI alterar o 1es 1o registro na segund a instOn2ia4 E1a 1ens a g e 1 de PDeadLo2TQ K retorna d a in+or1a n do :ue o registro se en2ontra tra7ado4 Isso a2onte2 eI por:ue :uando se tenta alterar o registro da segund a instOn2ia o Delphi tenta atuali@ar o registroI 1as esse se en2ontra 5lo:ue a d o e n8o pode ser lidoZ

Dig 54 5M DeadLo2T4

Nesse eBe1plo +oi utili@ado o nG7el de isola1e n t o PRead!o 1 1it e dQI :ue so1e nt e per1ite o usuArio l> registros :ue JA +ora1 e+eti7ados por outro usuArio4 Pode' se +a@er o 1es 1o eBe1plo anterior alterand o antes o nG7el de isola1e n t o no 2o1pon e n t e &ata4as e 1 para PRepe at a 5l eRe a dQZ

Dig4 54 -M Propriedade *ransIsolation do 2o1ponente Data5ase

Entreta nt oI esse nG7el s K atri5uGdo :uando se ini2ia a trans a6 8 o4 PortantoI antes de eBe2ut ar o passo 5I :ue a5re a P:uerFQI de7e' se a5rir a trans a6 8 o na segund a instOn2ia da apli2a68o para de+inir o
Delphi Client/Server 1/

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

no7o nG7el de isola1e n to4 9ssi1I os dados s8o lidos 1es 1o antes do pri1eiro usuArio e+etuar o 104 4 (- I 1as 2o1 os 7alores anteriores a altera6 8o +eita por ele4 Pode1o s utili@ar esse eBe 1plo para 7eri+i2ar 2o1porta 1 e n t o da proprieda d e U7:,- * M 0 : * do 7uerI1 4 ta15 K 1 o 2o1pon e n t e

Dig4 54 #M Propriedade U7:,- *M 0: * do 2o1ponente 7uerI1 4

O o5Jeti7o dess e eBe1plo +oi 1onitorar o a2esso ao 5an2o de dados atra7Ks da alternO n2ia de 7Arias propried a d e s dos 2o1pon e n t e s de u1a apli2a68o DelphiI de +or1a a 7eri+i2ar as di7ersas possi5ilidad es :ue o desen7ol7edor pode optar durant e a 2onstru68o da apli2a68o4 E1 u1a apli2a68o realI n8o se separ a dess a +or1a os 2o1and os de a5rir u1a trans a6 8 oI eBe2ut ar a opera68 o e +e2har a trans a6 8 o4 Essas opera6C e s de7e 1 ser eBe2ut a d a s se:Wen2ial1 e n t e e1 u1a Lni2a intera6 8o 2o1 o usuArio e1 u1 perGodo de te1po 5e1 pe:ue n o4 N8o 2a5e ao usuArio to1ar a de2is8o de a5rir e +e2har a trans a6 8 oI por:ue ele poderia deiBar tra7ado durant e 1uito te1po u1 registro :ue 7Arios outros usuArios pre2isa 1 utili@ar4

Delphi Client/Server

10

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

Captulo

ProEetando AplicaDes Cliente/Servidor


Fss e ca p:tulo m o s tra algu m a s t K c nicas d e con stru./o d e a plica.< e s "oltada s p ara o a m 4i e n t e Client e! S er"idor.

2onstru68o de apli2a6Ces !liente;)er7idor de7e o5ede2 er algu1 a s regras de organi@a68o para :ue os siste 1 a s possa 1 ter u1 te1po de 7ida 1ais longo e a2o1p a n h a r a e7olu68o do neg2io da e1pres a e a e7olu68o te2nolgi2a da ar:uitetur a4

'strutura de uma Aplicao


!o1o +oi 7istoI o a15ient e 2liente ser7idor per1ite :ue a apli2a68o seJa distri5uGda entre dois 2o1pon e n t e s +Gsi2osM a esta68 o 2liente e o ser7idor de 5an2o de dados4 Entreta n toI logi2a1e n t e pode 1o s identi+i2ar tr>s 2a1a d a s distintas dentro de u1a apli2a68o4 Apresentao !o1post a por 2o1pon e n t e s respons A 7 eis pela intera6 8o da apli2a68o 2o1 o usuArio +inal4 R respons a 5ilidad e dess a 2a1a d a re2e5 er os dados e 2o1and os do usuArio e de7ol7er' lhe in+or1a6C e s atra7K s de ele1e n t o s 7isuais 2o1o 2onsultasI grA+i2osI relatrios e et2Z

Delphi Client/Server

11

6 A

C # S

D '

D A D # S

" ' ( A C I #

A I S

(+gica do

eg+cio

Parte da apli2a68o respons A7 el por 1ant er as regras de neg2io da e1pre s a4 Essa 2a1ad a re2e5e os dados da 2a1a d a de inter+a2e e eBe2ut a as opera6C e s e 7alida6Ces ne2es s Arias para en7iA' los ao 5an2o de dados4 Da 1es 1 a +or1aI eBtrai os dados do 5an2o de dados de a2ordo 2o1 as regras de neg2io da apli2a68o e os en7ia para ele1e n t o s da inter+a2e para :ue seJa1 eBi5idos4 PortantoI essa 2a1ad a K respons A7 el e1 interligar a inter+a2e 7isual 2o1 o 5an2o de dados atra7Ks da eBe2u68o de trans a6C e s I 2onsist>n2ia dos dados e regras de neg2ioI ou seJaI a parte +un2ional da apli2a68o4

Delphi Client/Server

12

3erenciamento de Dados Parte da apli2a68o respons A7 el pelo a2esso e a 1anipula68o dos dados no ser7idor4 !o1o JA +oi 7isto anterior1 e n t e I grand e parte dess a 2a1a d a K i1ple1 e n t a d a pelo prprio ser7idor de 5an2o de dados4 Nor1al1 e n t e o a2esso aos ser7i6os K +eito atra7Ks da linguag e 1 )=L4 PorK1I K ta15 K 1 ne2ess Ario u1 2onJunto de 2o1an do s para en7iar as senten6 a s )=Ls e geren2iar a 2o1uni2a68 o entre a apli2a68o e o ser7idor4 Esses 2o1an do s se en2ontra 1 e1 5i5liote2as disponi5ili@adas pelos prprios +orne2edor e s de 5an2o de dados :ue s8o instalad a s e1 2ada esta6 8o de tra5alho4 9lK1 disso 2ada +a5ri2ant e de +erra 1 e n t a s de desen7ol7i1e nt o +orne2e ta15 K 1 1Ktodos e 2o1pon e n t e s 2apa@es de si1pli+i2ar e tornar 1ais trans p ar e n t e o a2esso aos di7ersos )GD<s4

C.0EN2E APRE3EN2A45O F630CO ./G0CA "o NEG/C0O GERENC0A1EN2O "e DADO3 3ER-0DOR
Dig -4 M !a1adas DGsi2as e Lgi2as de u1a 9pli2a68o4

./G0CO

)antagens da #rgani;ao da Aplicao em Camadas


9 di7is8o da apli2a68o nessas tr>s 2a1a d a s lgi2as possi5ilita a organi@a68o e padroni@a68o da 2odi+i2a68o e 2onstru68o da apli2a68oI alK1 de propor2ionar u1a 1aior +a2ilidade de 1anut e n 6 8 o e e7olu68o para no7as +ases da ar:uitetur a !liente;)er7idor4 !o1o JA +oi 7istoI a tend>n2ia da ar:uitetur a !liente;) er7idor K retirar 2ada 7e@ 1ais parte do pro2ess a 1 e n t o da apli2a68o reali@ado pelas esta6C es de tra5alho 2lientes e 2entrali@A' lo e1 ser7idoresI pro7endo u1 1elhor geren2ia 1 e n t o do pro2es so e +a2ilitando a e7olu68o da +un2ionalidad e :ue +oi distri5uGda4

Delphi Client/Server

14

9 distri5ui68o da apli2a68o e1 2a1a d a s lgi2as possi5ilita ta15 K 1 :ue 2ada 2a1ad a possa e7oluir indepen d e n t e das outras desde :ue se 1ant e n h a a inter+a2e entre elas4 Por eBe1ploI pode' se alterar as regras de neg2io para atend er as ne2essidad e s do 1er2ado se1 ne2es s aria 1 e n t e ter :ue 1odi+i2ar a 2a1ad a de inter+a2e ou a 2a1a d a de geren2ia 1 e n t o de dados4 Por outro ladoI pode' se e7oluir a apres e n t a 6 8 o para no7as te2nologias 2o1o 1ulti1GdiaI se1 pre2isar alterar as regras de neg2io4 E7olu6Ces te2nolgi2asI 2o1o a distri5ui68o da 5ase de dados na 2a1a d a de geren2ia 1 e n t o de dados pode ser +eita de +or1a transp ar e n t e das de1ais 2a1ad a s 4 PortantoI esses tipos de distri5ui68o torna 1 as apli2a6Ces 1ais es2alA7eis para suportar +uturas i1ple1e n t a 6 C e s possi5ilitando u1 te1po de 7ida 1uito 1ais longo4

'strutura de uma Aplicao Delphi


9 +erra1 e n t a de desen7ol7i1e nt o DelphiI desde sua pri1eira 7ers8o JA se 1ostrou preo2up a d a e1 distri5uir a apli2a68o nas tr>s 2a1a d a s lgi2as4 Esse es+or6o ini2ial te1 5ene+i2iado a <orland a e7oluir a +erra1 e n t a para as no7as gera6Ce s da ar:uitetur a !liente;) er7idor4 Muitas outras +erra 1 e n t a s :ue n8o possuGa 1 essa +iloso+ia de tra5alho est8o en+rent a n d o sKrios pro5le1 a s para sensi5ili@ar seus 2lientes a ne2essidad e de tra5alhar dess a +or1a para 2onseg uire 1 1igrar e re2e5er os 5ene+G2ios da no7a gera68o !liente;)er7idor4 Para i1ple1 e n t a r essa +iloso+ia de tra5alho no DelphiI a <orland esta5 ele2 e u tr>s 2ategorias de 2o1pon e n t e s M 2o1pon e n t e s 7isuaisI 2o1pon e n t e s de a2esso N 5ase de dados e 2o1pon e n t e s de liga68o4

Dig -42M !ategorias de 2o1ponente s do Delphi para a2esso a 5ase de dados4

Essa +or1a de tra5alho organi@ad a e1 2a1a d a s distintas per1ite ta15 K 1 u1a 1aior reutili@a68o de 2digo e portanto u1 au1e n t o de produti7idad e na 2onstru68o de apli2a6Ces atra7Ks dos re2ursos do Delphi de 2ria68o de 2o1pon e n t e s e Pte1plat e sQ de telas4
Delphi Client/Server 15

Componentes visuais !o1pon e n t e s respons A7 eis pela inter+a2e 2o1 o usuArio4 !orrespond e 1 N 2a1a d a de 9present a 6 8 o dis2utida anterior1 e n t e 4 Esses 2o1pon e n t e s est8o lo2ali@ados na pAgina D,-, C02-+0) / da paleta de 2o1pon e n t e s do Delphi4

Componentes de Acesso K =ase de dados !o1pon e n t e s respons A 7 eis e1 2riar toda a estrutur a ne2es s Aria para a2ess ar e 1anipular o 5an2o de dados4 )8o os 2o1pon e n t e s en2arre g a d o s e1 inter+a2e ar 2o1 os ser7i6os de geren2ia 1 e n t o e 1anipula68o +orne2idos pela 5ase de dados4 Esses 2o1pon e n t e s ta15 K 1 possue 1 propried a d e s e e7entos destinados a i1ple1e n t a 6 8 o da lgi2a de neg2io na apli2a68o4 Esses 2o1pon e n t e s est8o lo2ali@ados na pAgina D,-, A11* / / da paleta de 2o1pon e n t e s 4

Componente de ligao !o1pon e n t e respons A7 el pela inter+a2e entre as duas 2a1a d a s a2i1a4 )ua prin2ipal 2ara2terGsti2a K tornar os 2o1pon e n t e s 7isuais indepe n d e n t e s dos 2o1pon e n t e s de a2essoI ou seJaI a 2a1a d a de 9present a 6 8 o da Lgi2a do Neg2io4 Esse 2o1pon e n t e K o T&ataSource :ue +i2a lo2ali@ado ta15 K 1 na pAgina D,-, A11* / / da paleta de 2o1pon e n t e s 4

Delphi Client/Server

27

Construindo AplicaDes Cliente/Servidor


Fss e ca p:tulo m o s tra a con stru./o d e u m a t ela d e m a n u t e n . /o u tili-an do-s e os co m p o n e n t e s do &elphi e co m o con8igur(-los p ara tra4alhar co m 4 a nco d e d a dos.

Captulo

Biste 1 7Arias 1aneiras de se utili@ar os 2o1pon e n t e s do Delphi para tra5alhar 2o1 5an2o de dados4 R pre2iso sa5er es2olher as +or1as 1ais ade:u a d a s para 2ada tipo de i1ple1 e n t a 6 8 o4 9tra7Ks dess e 2apGtulo ser8o 1ostrad a 7Arias dess as op6Ces e o :ue 2ada u1a di+ere no 2o1port a 1 e n t o da apli2a68o 2o1 o 5an2o de dados4

$tili;ando Data Modules


E1 u1a apli2a68o !liente;)er7idor K interess a n t e utili@ar o re2urso de Data Module +orne2ido pelo Delphi4 Data Module K u1 2o1pon e n t e :ue +orne2e u1a lo2ali@a68o 2entrali@ad a para 2o1pon e n t e s n8o' 7isG7eis do Delphi4 Pode' se ent8o utili@ar o Data Module para 2onter os 2o1pon e n t e s da 2ategoria Data 922essI respons A7 eis pela lgi2a de neg2io da apli2a68o e inter+a2e 2o1 o 5an2o de dados4 9ssi1I toda a lgi2a de neg2io +i2a 2on2entr a d a e1 u1 Lni2o ponto da apli2a68o +a2ilitando a 1anut e n 6 8 o e e7olu68o4 Para apli2a6Ces 1aiores K nor1al :ue se utili@e 1ais de u1 Data Module su5di7idindo a lgi2a de neg2io4 Para eBe1pli+i2ar1os esse re2ursoI ire1os 2onstruir a tela de 2adas tro de produtos44 Para se 2onstruir essa telaI de7e' se ini2ial1ent e 2riar u1 &ata+odule e 2olo2ar nele u1 2o1pon e n t e &ata4as e.

Dig #4 M !o1ponente T&ata4ase 4

Delphi Client/Server

21

Componente Data/odule1
*a5ela de Propriedades4

Proprie"a"e Name

-alor D/"istVendas

Componente !Data=ase
!o1o +oi 7isto o 2o1pon e n t e T&ata4as e K respons A 7 el pela 2oneB8o 2o1 o 5an2o de dados4 Esse 2o1pon e n t e possui algu1a s propried a d e s :ue per1ite 1 a 2on+igura68 o dess a 2oneB8o4 Pode' se utili@ar a op68o D,-,. , / * E:(-0+ do popup 1enu :ue K eBi5ido ao se pressionar o 5ot8o direito do 1ous e so5re o 2o1pon e n t e &ata4as e 1 4

Dig #42M Data5ase Editor

9tra7Ks do Data5 as e Editor pode' se atri5uir os 7alores para 7Arias propried a d e s 2o1o +oi 1ostrado na +igura4 9lK1 dissoI so5repor 7alores do P9liasQ de+inidos no <DE atra7Ks do 5ot8o D*A, 6)- / 4 USER NAME; Esse parO 1 e tr o pode ser utili@ado para deiBar +iBo o usuArio :ue irA a2ess ar o 5an2o de dados4 9lgu1as e1pres a s adota 1 essa +or1a de tra5alho ao in7Ks de 2riar 7Arios usuArios no 5an2o de dados4 E1 nosso eBe1ploI ire1os atri5uir o 7alor )`)D<9 para o parO 1 e t ro4 PASS=ORD; )e +or +iBado o 7alor de E)ER N9MEI pode' se ta15 K 1 JA deiBar espe2i+i2ada a senha do usuArio4 P9))WORD_ 1 a s t e rT e F SQLPASSTHRU MODE; Esse parO 1 e tr o possui tr>s 7alores possG7eisM )H9RED 9E*O!OMMI*I )H9RED NO9E*O!OMMI* e NO*
Delphi Client/Server 2*

)H9RED4 De7e' se espe2i+i2ar )H9REDI :uando deseJa' se :ue todos as atuali@a6Ce s +eitas auto 1 a ti2a 1 e n t e pelo DelphiI as atuali@a6Ce s +eitas 1anu al 1 e n t e e o 2ontrole de trans a6 8 o use 1 a 1es 1 a 2oneB8o4 =uando a op68o NO* )H9RED K utili@adaI u1a no7a 2oneB8o es2ondida K esta5 ele2ida 2o1 o 5an2o de dados4 9ssi1I todas as atuali@a6Ces +eitas 1anu al 1 e n t e atra7Ks do 1Ktodo EF*1S G) de u1a 7uerI e o 2ontrole de trans a6 8 o +eito atra7K s dos 1Ktodos do 2o1pon e n t e T&ata4as e utili@a1 essa no7a 2oneB8o4 9lK1 dissoI se espe2i+i2ad a a op68o )H9REDI pode' se ainda es2olher entre as op6Ces 9E*O!OMMI* e NO9E*O!OMMI*4 9 pri1eira e+eti7a auto 1 a ti2a 1 e n t e :ual:uer 2o1an do )=L en7iado ao ser7idorI a 1enos :ue u1a trans a6 8 o seJa a5ert a eBpli2ita 1 e n t e atra7K s do 2o1and o /-,+-+,2 / , 1 -( 0 2 4 Na segund a op68oI os 2o1and os espera 1 pela eBe2u68o eBplG2ita do 2o1and o 104 4 (- para sere 1 e+eti7ados4 E1 nosso eBe 1ploI ire1os atri5uir o 7alor )H9RED 9E*O!OMMI* para o parO 1 e t ro4

'scolhendo entre !!a=le e !@uerJ


O Delphi possui dois 2o1pon e n t e s :ue per1ite 1 o a2esso e 1anipula68o dos dados do ser7idorM TTa4le e T7uerI 4 O pri1eiro K 5ase a d o no a2esso a u1a deter 1ina d a ta5ela do 5an2o de dados e o segundo K 5ase a d o e1 u1a senten6 a )=L ,2o1a n do /*) * 1 - .4 Por ser 5ase a d o e1 u1a senten6 a )=LI o 2o1pon e n t e T7uerI per1ite tra5alhar 2o1 1ais de u1a ta5ela do 5an2o de dados ao 1es 1o te1po4 915os os 2o1pon e n t e s utili@a1 a linguag e 1 )=L para a2ess ar a 5ase de dados4 =uando se tra5alha 2o1 TTa4le I o Delphi gera auto1 a ti2a 1 e n t e u1a sente n6 a )=L de a2ordo 2o1 os parO 1 e t ro s de+inidos para o 2o1pon e n t e4 9lK1 dess a di+eren6a 5Asi2a entre os dois 2o1pon e n t e s I outros +atores de7e 1 ser o5ser7a do s na es2olha4 A=ertura Opera68o +eita :uando K eBe2ut a d o o 1Ktodo O7*2 do 2o1pon e n t e TTa4le ou T7uerI I :ue produ@ a 2o1pila68o e eBe2u6 8o do 2o1and o /*) * 1 - 4 =uando esse 1Ktodo K eBe2ut a d o atra7Ks do 2o1pon e n t e TTa4le I o Delphi reali@a u1a sKrie de outros 2o1and os )=Ls para 5us2ar in+or1a6C e s do 2atAlogo da ta5ela ne2ess Arias para as opera6C e s de sele68o e atuali@a68o4 Essa 5us2a pode ser oti1i@ada atra7Ks da op68o EN9<LE )!HEM9 !9!HE do <DEI +a@endo 2o1 :ue essas in+or1a6C e s seJa1 lidas apen a s u1a 7e@ durant e a eBe2u6 8o da apli2a68o4 =uando o pri1eiro a2esso K +eitoI o <DE ar1a@ e n a as in+or1a6C e s e1 u1 ar:ui7o e :ual:uer no7a ne2essidad e de a5ertur a da 1es 1 a ta5ela n8o ne2essita 5us2ar no7a 1 e n t e os ele1e n t o s do 2atAlogo4

Delphi Client/Server

2,

Por outro ladoI utili@ando' se o 2o1pon e n t e T7uerI I pode' se des7iar dess a 5us2a desde :ue n8o se utili@e a proprieda d e R*G6 * / - L(5* :ue torna o Presult setQ da P:uerFQ atuali@A7el auto 1 a ti2a 1 e n t e pelo Delphi4 )e o 7alor da proprieda d e R*G6 * / - L(5* +or *REE e o )ELE!* utili@ado o5ede2 er as restri6Ces para :ue o Delphi 2onsiga atuali@ar o Presult setQI as 1es 1 a s 5us2as utili@adas para o 2o1pon e n t e TTa4le ter8o :ue ser +eitas4 !on2luindoI para :ue a 5us2a de ele1e n to s do 2atAlogo n8o seJa +eita K ne2es s Ario utili@ar o 2o1pon e n t e T7uerI e 2ontrolar as atuali@a6Ce s 1anu al 1 e n t e ou atra7K s de 2o1pon e n t e s do tipo T2pdateS7* 4 <iltros E1a das grand e s 7antag e n s de se utili@ar )G<Ds K poder +a@er o +iltro no prprio ser7idor e portanto tra+eg ar u1 nL1ero 1enor de linhas pela rede4 Para se +a@er issoI K ne2ess Ario utili@ar a 2lAusula <C *+ * do 2o1and o /*) * 1 - 4 =uando se en7ia u1a 2lAusula <C *+ * no 2o1and o )=LI o prprio ser7idor se en2arreg a de sele2ionar os registros :ue 2o1pCe 1 a pes:uisa reali@adaI JA o5ser7a n do as 1elhores alternati7as de a2esso tenta n do utili@ar o 1ABi1o dos Gndi2es esta5 ele2idos no 5an2o de dados4 !o1 o 2o1pon e n t e T7uerI isso K +eito direta 1 e n t e no 2o1and o )=L suportan d o a sintaBe +orne2ida pela linguag e 1 )=L do 5an2o de dados utili@ado4 Entreta nt oI se +or utili@ada a propried a d e A()-*+ do T7uerI para +iltrar o Presult setQI o Delphi n8o utili@arA os re2ursos do )G<D para sele2ionar os registros e irA tra@er todas as linhas resultant e s da =uerF para a esta68 o4 )o1ent e :uando essas linhas +ore1 tra@idas para 1A:uina 2lienteI K :ue o +iltro serA apli2ado lo2al1en t eI tornando 2ada linha 7isG7el ou n8o na tela4 Entreta nt oI 2o1 o 2o1pon e n t e TTa4le a proprieda d e A()-*+ e as +un6Ces de sele68o 2o1o S*-R, 2 3 * age 1 de +or1a di+erent e4 O Delphi tenta tradu@ir as espe2i+i2a6Ces +eitas atra7K s dess es dois 1Ktodos e 2olo2A' las direta 1 e n t e na 2lAusula <C *+ * do /*) * 1 reali@ado4 Desta +or1aI 2onseg u e' se o 1es 1o dese 1 p e n h o do 2o1pon e n t e T7uerI I JA :ue o +iltro K +eito na prpria 2lAusula <C *+ * 4 Entreta nt oI 2o1o o Delphi K :ue reali@a a tradu68 o das espe2i+i2a6Ces para a 2lAusula <C *+ * I eBiste u1a 2erta li1ita68o dess as espe2i+i2a6Ces e se essas n8o 2onseguire 1 ser tradu@idasI o +iltro serA +eito na prpria 1A:uina 2liente4 PortantoI o 2o1pon e n t e T7uerI K 1ais a5rang e n t e no :ue se di@ respeito a +iltrosI suportan d o de +or1a 1ais 2o1plet a a sintaBe +orne2ida pelo 5an2o de dados4 !o1 rela68o ao e7ento O2$()- *+R * 1 0 + : I e1 a15os os 2o1pon e n t e s o +iltro K apli2ado lo2al1en t e e portanto todas as linhas :ue 2o1pC e 1 o Presult setQ pre2isa 1 ser tra@idas para a esta68 o 2lienteI n8o utili@ando os re2ursos do ser7idor4
Delphi Client/Server 2/

!ransaDes !o1o JA +oi 7isto o 2o1pon e n t e TTa4le possui u1a +or1a 1ais inteligent e de se 2o1port ar do :ue o 2o1pon e n t e T7uerI :uando o Presult setQ estA prestes a ser destruGdo atra7Ks da reali@a68o de u1 2o1and o 104 4 (- para +inali@ar a trans a6 8 o4 O 2o1pon e n t e T7uerI ne2es sita :ue todas as linhas atK o +inal da sele68o seJa1 tra@idas para a esta6 8o 2liente antes :ue o 104 4 (seJa eBe2ut a d o no 5an2o para :ue o usuArio n8o per2a as linhas :ue ainda n8o +ora1 tra@idas para apli2a68o4 VA o 2o1pon e n t e TTa4le si1ples 1 e n t e +e2ha o Presult setQ se1 nenhu 1 e+eito :ue di1inua o dese 1 p e n h o da atuali@a68o e se hou7er a ne2essidad e de 5us2ar as linhas restant e s da ta5ela u1 no7o /*) * 1 - K +eito a partir da Llti1a linha tra@ida4 Entreta nt oI alguns 5an2os de dados per1ite 1 :ue o 104 4 (- n8o destrua os Presult setQ ou pode' se ta15 K 1 utili@ar 2oneBCe s separa d a s para a atuali@a68o e para o Presult setQ4 Desta +or1a n8o hA ne2essidad e do 2o1pon e n t e T7uerI reali@ar as 5us2as antes da real ne2essidad e do usuArio4 Por outro ladoI o 2o1pon e n t e TTa4le I deiBa a5ert a u1a trans a6 8 o :ue podeI depend e n d o do 5an2o de dadosI estar tra7an do algu1a pAgina da ta5ela4 Lmero de !a=elas Acessadas E1 outro +ator rele7ant e na es2olha do 2o1pon e n t eI K o nL1ero de ta5elas :ue de7e 1 ser a2ess a d a s para 5us2ar as in+or1a6C e s ne2es s Arias para o usuArio e1 u1a 1es 1 a tela4 9tK u1 2erto nL1ero de ta5elas K 1ais interess a n t e utili@ar o re2urso de PJoinsQ dos 5an2os para tra@er e1 u1 Lni2o 2o1and o )=LI todo o 2onJunto de in+or1a6C e s4 Nesse 2aso u1 2o1pon e n t e T7uerI de7eria ser utili@ado4 =uando isso K +eito atra7Ks de 7Arios 2o1pon e n t e s TTa4le I K as 7e@es ne2es s Ario tra@er os dados de todas as ta5elas para a 1A:uina 2liente para :ue a rela68o entre elas possa ser +eita4 No 1elhor 2asoI se +iltrar1os 2ada ta5ela pelo registro sele2ionado na outraI terGa1os :ue eBe2ut ar 7Arios 2o1an do s )ELE!*s 1ais si1ples no ser7idor 2ontra u1 Lni2o 2o1an do u1 pou2o 1ais 2o1pleBo do 2o1pon e n t e T7uerI 4

!ra=alhando com o !@uerJ


O 2o1pon e n t e T7uerI pode ser ent8o utili@ado para a2ess ar e 1anipular os dados4 !o1o +oi 7istoI a utili@a68o dess e 2o1pon e n t e deiBa 1ais +leBG7el o a2esso ao 5an2oI JA :ue tra5alha direta 1 e n t e 2o1 a linguag e 1 )=L4 PortantoI 1anut e n 6C e s e7oluti7as 2o1o
Delphi Client/Server 20

a2ess ar 1ais de u1a ta5ela atra7K s do 1es 1o 2o1pon e n t e pode 1 ser i1ple1 e n t a d a s 2o1 1ais +a2ilidade4 9+i1 de 2ontinuar 1o s nossa apli2a68oI de7e 1o s 2o1pon e n t e T7uerI no &ata+odule &+SistEendas. 2olo2ar u1

Dig #4/M !o1ponente T7uerI

Componente Quer$1

Proprie"a"e Name DatabaseName "Q% 'e(uest %i!e cti!e

-alor QProduto D+V*ND " "elect & from ,roduto order b$ ,roduto.,rod0cd T'1* T'1*

*a5ela de Propriedades4

9 propried a d e R*G6 * / - L(5* ligadaI +a@ 2o1 :ue o Delphi tente atuali@ar auto1 a ti2a 1 e n t e o Presult setQ tra@ido pela P:uerFQ4 Desta +or1aI o 2o1pon e n t e T7uerI se 2o1porta de +or1a se1elha n t e ao 2o1pon e n t e TTa4le 4 Entreta nt oI para :ue isso seJa possG7elI o 2o1and o )=L te1 :ue o5ede2 er algu1a s restri6Ces 2o1o por eBe1ploM !onter apen a s u1a ta5ela na 2lAusula $+04 Z N8o possuir agreg a6C e s atra7Ks de 3+06 7 .8 e +un6Ces 2o1o /6 4 I 4,F I et2Z 9ps ter1os preen2hido o &ata+odule 2o1 os 2o1pon e n t e s respons A7 eis pelo a2esso ao 5an2o de dadosI pode 1o s 2onstruir o P+or1Q de 1anut e n 6 8 o da ta5ela de produto 2o1o a +igura a seguirM

Delphi Client/Server

21

Dig #4&M Dor1 de Produto4

Componente Form1 Panel1 Panel2 Data"ource1 D+Na!i2ator1 D+*dit1..D+*dit3


*a5ela de Propriedades4

Proprie"a"e Name Ca,tion li2n Ca,tion li2n Ca,tion Name Data"et Data"ource Data"ource DataField

-alor frmProduto Produtos alTo, alClient D"/ain D/"istVendas.Q,roduto D"/ain D"/ain ,ro0cd..,ro0esto(ue

Pode1o s ent8o eBe2ut ar a apli2a68o e 7eri+i2ar :ue atra7Ks da propried a d e R*/ 6)- L(5* do 7produto I +oi possG7el atuali@ar os dados e a2res2e nt ar no7as linhas N ta5ela4 Entretan toI pode 1o s notar :ue as linhas inseridas desap ar e 2 e 1 do PResult )etQ ao na7erg ar 1 o s para outro registro4 Esta K u1a restri68o :ue eBiste no 2o1pon e n t e T7uerI :uando se utili@a a proprieda d e R*/ 6)- L(5* para tornA' lo atuali@A7el auto 1 a ti2a 1 e n t e pelo Delphi4 9lK1 dissoI +oi 7isto :ue para ser possG7el tornar o Presult setQ atuali@A7elI eBiste 1 algu1a s restri6Ces :uanto ao 2o1and o )=L de+inido4 Por 2ausa dess es 1oti7osI tal7e@ seJa ent8o ne2ess Ario tra5alhar 2o1 a proprieda d e R*/ 6)- L(5* igual a PDalseQ e utili@ar u1 outro arti+G2io para tornar o Presult li7eQ atuali@A7el se1 restri6Ces no 2o1and o )=L e se1 perder as linhas inseridas4

$tili;ando Cached $pdates


9 outra +or1a de tornar o Presult setQ de u1 2o1pon e n t e T7uerI atuali@A7el K utili@ando o re2urso de P2a2hed updat e s Q do Delphi4
Delphi Client/Server 22

=uando a proprieda d e C,1C * : U 7 : , - * / estA ligadaI todas as inser6CesI altera6C e s e eB2lusCes reali@adas so5re o &ataset n8o s8o en7iad as direta 1 e n t e para o 5an2o4 9o in7Ks dissoI s8o ar1a@e n a d a s e1 u1 P2a2heQ lo2al na 1e 1ria atK :ue se dispare u1 2o1an do do &ataset para apli2ar todas as atuali@a6Ces atra7Ks de Lni2o pro2ess o no 5an2o de dados4 !o1 issoI toda 7e@ :ue +or reali@ado u1 2o1and o 70/ - I as altera6C e s ser8o en7iad as para o P2a2heQ ao in7Ks de ire1 direta 1 e n t e para o 5an2oI seJa atra7Ks do &%Na"igator I auto 1 a ti2a 1 e n t e :uando se deiBa a linha ou atra7Ks da 2ha1 a d a eBplG2ita do 2o1and o4 Mes1o se :uiser 1o s en7iar linha a linha os registros para o 5an2o de dadosI tal7e@ seJa ne2ess Aria a utili@a68o do re2urso de P2a2hed updat e s Q si1ples 1 e n t e para tornar o Presult setQ atuali@A7elI 2aso n8o seJa possG7el utili@ar a proprieda d e R*/ 6)- L(5* do T7uerI 4 Para utili@ar o re2urso de P2a2hed updat e sQI de7e' se ligar a propried a d e de 1es 1o no1e do 2o1pon e n t e T7uerI 4 ?a1os +a@er isso para o 7Produto I 1as 1ant e n d o por en:ua n to a proprieda d e R*/ 6)- L(5* _ P*rueQ4 ?a1os retirar do &%Na"igator alguns 5otCes deiBando so1e nt e os 5otCes de na7eg a6 8 o4 9 seguirI 7a1os 2olo2ar :uatro no7os 5otCes do tipo Speed%utto n para i1ple1 e n t a r 1 o s as opera6C e s de inser68oI eB2lus8oI sal7a 1 e n t o e 2an2ela 1 e n t o4

Dig #45M O +or1 de Produto4

Componente ",,ed+utton1 ",,ed+utton2 ",,ed+utton",,ed+utton3


*a5ela de Propriedades Delphi Client/Server

Proprie"a"e Name Name Name Name

-alor btn ,,end btnDelete btn"a!e btnDiscard

24

De7e 1o s agoraI i1ple1e n t a r o 2digo para os e7entos O2C)(19 dos 5otCes4 O pri1eiro 5ot8o P5tn9ppendQ de7e apen a s 2riar u1a no7a linha no Presult setQ atra7K s do 1Ktodo ,77 * 2 : do 2o1pon e n t e 7Produto 4 Entreta nt o 7a1os tentar ser u1 pou2o 1ais genKri2o no 2digo para depois poder 1o s reutili@ar o 2digo es2rito atra7Ks de Pte1plat e s Q4
proce ure TfrmPro uto.1tnAppen Clic-('en er0 TO12ect,3 1e4in #'Main.#ata'et.Appen 3 en 3

Para o segundo 5ot8oI ta15 K 1 n8o hA nenhu 1 a no7idad e4


proce ure TfrmPro uto.1tn#eleteClic-('en er0 TO12ect,3 1e4in #'Main.#ata'et.#elete3 en 3

Esare 1o s o ter2eiro 5ot8o P5tn)a7eQ para apli2ar no 5an2o de dados todas as altera6C e s +eitas nos di7ersos registros e :ue est8o por en:ua n to ar1a@ e n a d a s no P2a2hed updat e s Q4
proce ure TfrmPro uto.1tn'aveClic-('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 en 3

Nesse 2asoI +oi ne2es s Ario +a@er u1 PtFpe2a s tQ na propried a d e D,-,S * - para :ue ela possa identi+i2ar os 1Ktodos A77)8U7 : , - * / e C044(-U 7 : , - * / 4 Esses dois 1Ktodos s8o respons A7 eis e1 apli2ar as altera6C e s pende n t e s no P2a2heQ no 5an2o de dados4 9lK1 dissoI K ne2ess Ario utili@ar a PunitQ :ue 2ontK 1 a 2lasse T%&F&ataSet 4 Pode 1os +a@er isso na 2lAusula 6/ * da se68o (47)* 4 * 2 - , - ( 0 2 4 A77)8U7 : , - * / M esse 1Ktodo apli2a no 5an2o de dados todas as altera6C e s pend e nt e s no P2a2hed updat eQ4 C04 4(-U 7 : , - * / M esse 1Ktodo li1pa do P5u++erQ do P2a2hed updat eQ os registros :ue +ora1 apli2ados no 5an2oI aps u1a atuali@a68o reali@ada 2o1 su2esso4 Para o Llti1o 5ot8o ,P5tnDis2ardQ.I pode 1o s utili@ar o 1Ktodo C,21 *)U 7 : , - * / :ue ta15 K 1 li1pa o P5u++erQI 1as des2art a n d o todas as altera6C e s atual1e n t e 2ontidas no P2a2hed updat eQ4
proce ure TfrmPro uto.1tn#iscar Clic-('en er0 TO12ect,3
Delphi Client/Server 25

1e4in TB#E#ata'et(#'Main.#ata'et,.CancelUp ates3 en 3

Desta +or1aI te1os a tela de produtos +un2ionan do atra7Ks do re2urso P2a2hed updat e s QI ou seJaI as altera6C e s sendo en7iadas e1 2onJunto para o 5an2o de dados4 9lK1 dissoI essa K u1a alterna ti7a para 2riar Presult atuali@A7eis se1 utili@ar a propried a d e R*G6 * / - L(5* I 7erer1os a seguir4 setsQ 2o1o

$tili;ando o Componente !$pdateS@(


EBiste1 duas 1an eiras de se tornar o Presult setQ de u1a P:uerFQ atuali@A7elI se1 as li1ita6Ces i1postas pela de+ini68o da propried a d e R*G6 * / - L(5* 4 9 pri1eira K utili@ando o 2o1pon e n t e T2pdateS7* 4 9tra7Ks dess e 2o1pon e n t e K possG7el de+inir os 2o1an do s :ue ser8o utili@ados para e+etuar as opera6C e s de inser68oI altera6 8 o e eB2lus8o4 9 segund a +or1a K atra7Ks do e7ento O2U7: , - * R * 1 0 + : e serA 7ista 1ais adiant e nos prBi1os 2apGtulos4 ?a1os ent8o 2olo2ar u1 2o1pon e n t e T2pdateS7* no &ata+odule da apli2a68oI 2o1o 1ostra do na +iguraI e de+inir algu1 a s proprieda d e s atra7Ks da ta5ela a seguir4

Dig #4-M !o1ponente 2SProduto.

Componente 1,date"Q%1 QProduto


*a5ela de Propriedades

Proprie"a"e Name 'e(uest %i!e 1,date.b4ect

-alor 1"Produto False 1"Produto

Pressionan d o o 5ot8o direito do 1ous e so5re o 2o1pon e n t eI pode' se sele2ionar a op68o U7:,- * SQL E:(-0+... para a5rir u1a tela :ue irA per1itir a gera68o dos 2o1an do s )=Ls de atuali@a68o si1ples 1 e n t e de+inindo alguns parO 1 e tr os4

Delphi Client/Server

47

Dig #4#M Epdate )=L Editor4

Na lista T,.)* N,4 * ir8o apare2 er as ta5elas :ue +a@e1 parte da 2lAusula $+04 do 2o1an do )=L4 De7e' se es2olher na lista a ta5ela :ue irA so+rer as atuali@a6Ces4 9ps sele2ionad a a ta5elaI pode' se pressionar o 5ot8o G*- T,.)* $(*): / para tra@er os 2a1pos dess a ta5ela para as listas N direita da tela4 )e eBistir so1e nt e u1a ta5elaI toda esse pro2edi1 e n t o n8o serA ne2ess ArioI JA :ue a ta5ela e seus 2a1pos ser8o tra@idos auto 1 a ti2a 1 e n t e 4 9s duas listas da direita apres e n t a 1 todos os 2a1pos 2ontidos na ta5ela4 De7e' se sele2ionar na pri1eira lista PaeF Dields H I os 2a1pos :ue ser8o utili@ados na 2lAusula <C *+ * dos 2o1and os 67: ,- * e :*) * - * 4 Pode' se optar so1e nt e pela 2ha7eI 2aso se :ueira deiBar a 2on2orr>n2ia 1ais li7reI ou es2olher todos os 2a1pos para 7eri+i2ar se o registro JA +oi alterado por outro usuArio4 Desta +or1aI 2onsegu e' se si1ular os 7alores PupWhereaeFOnlFQ e PupWhere9llQ respe2ti7a 1 e n t e da propried a d e U7:,- *M 0 : * do &ataSet I JA :ue essa propried a d e s K 7Alida :uando se utili@a a propried a d e R*G6 * / - L(5* igual a P*rueQ4 Para sele2ionar apen a s a 2ha7e pri1AriaI pode' se utili@ar o 5ot8o S*) * 1 - P+(4 ,+8 I*8/ 4 E1 nosso eBe1ploI 7a1os utili@ar esse 5ot8o para sele2ionar apen a s a 2ha7e pri1Aria4 De7e' se sele2ionar na lista U7:,- * $( * ) : / I os 2a1pos :ue ser8o alterados e inseridos pelos 2o1an do s 67: ,- * e (2/ *+- 4 Dinali@andoI o Llti1o 5ot8o ser7e para gerar os 2o1an do s )=LsI seguindo o :ue JA +oi de+inido4

Delphi Client/Server

41

Depois de geradoI os 2o1and os pode 1 ainda so+rer 1odi+i2a6Ces4 Pode' se por eBe1plo retirar a 2oluna PRO\!D da 2lAusula /*- do 2o1and o 67: , - * I JA :ue n8o de7e 1o s deiBar o usuArio alterar a 2ha7e pri1Aria4 Isso pode atK 2aus ar u1 erro e1 alguns 5an2os de dados4 Pode' se notar :ue e1 alguns lugares +ora1 utili@ados pre+iBos POLDQ antes do no1e das 2olunas4 Isso +oi +eito para :ue seJa testado o 7alor anterior a 1odi+i2a68o reali@ada ao in7Ks do 7alor atual4 Esse pro2esso K ne2ess Ario :uando utili@a' se todos os 2a1pos na 2lAusula <C *+ * I para per1itir :ue os 2a1pos seJa1 alterados e a 7eri+i2a68o seJa +eita a partir de seus 7alores anteriores4

3ravao (inha a (inha ou em 6atch


No inG2io do eBe1ploI as gra7a6C e s era1 +eitas linha a linha4 9o sair de u1 registro para o outroI as altera6C e s era1 auto1 a ti2a 1 e n t e gra7ad a s no 5an2o de dados4 Entreta nt oI este 2o1porta 1 e n t o +oi alterado :uando se optou e1 tra5alhar 2o1 P2a2hed updat eQ4 9pesar do re2urso P2a2hed updat eQ apres e n t a r tais 2ara2t erGsti2asI n8o +oi por esse 1oti7o :ue ns o utili@a1os e1 nosso eBe 1plo4 O 1oti7o prin2ipal de ter1os utili@ado o re2urso de P2a2hed updat e s Q +oi para per1itir :ue u1 2o1an do :ual:uer )=LI se1 li1ita6CesI pudess e gerar u1 Presult setQ atuali@A7el4 =ual serA ent8o a 1elhor +or1a de tra5alhar b Da@er as gra7a6C e s linha a linha ou ar1a@ e n A' las e1 u1 P2a2heQ e depois en7iA' las todas de u1a 7e@ para o ser7idor4 !ada u1a das alternati7as possue 1 7antag e n s e des7ant a g e n s :ue de7e 1 ser o5ser7ad a s antes de se es2olher o pro2esso :ue serA utili@ado4 Pode' se 2itar 2o1o 7antag e n s de se tra5alhar 2o1 atuali@a6Ces e1 P5at2hQI ou seJaI ar1a@ e n a n d o no P2a2heQ e en7iando o 2onJunto de atuali@a6Ces de u1a Lni2a 7e@ para o 5an2oM Os pa2otes da rede ser8o 1elhor di1ension a d o sI alK1 de di1inuir o nL1ero de 2o1an do s :ue ser8o en7iados pela redeI tendo no total u1 trA+ego 5e1 1enor na rede4 )e u1 2ontrole de trans a6 8 o esti7er sendo utili@adoI per1ite :ue a atuali@a68o seJa u1a opera68 o Lni2a4 )e u1 dos 2o1and os +alharI nenhu 1 2o1and o K e+eti7ado e o 5an2o de dados 7olta para o estado original antes do inG2io da trans a6 8 o4 PorK1 este 1Ktodo ta15 K 1 possui algu1 a s des7ant a g e n s M Esse 1Ktodo pode 2on+undir o usuArio4 O usuArio pode perder o 2ontrole do :ue ele JA atuali@ou4 9lK1 dissoI se u1 erro o2orrer na
Delphi Client/Server 4*

gra7a6 8oI a 2orre68o do registro ou dos registros pelo usuArio K u1 pro2ess o di+G2il de ser i1ple1e n t a d o4 !o1o o usuArio pode le7ar 1uito te1po para alterar os registrosI eBiste u1a pro5a5ilidad e 1aior de u1 outro usuArio ter alterado o 1es 1o registro e portanto 5lo:ue ar a gra7a68 o4 Outro +ator i1portant e a ser 2onsiderad o K o te1po de esper a do usuArio4 E1 u1 siste 1 aI o usuArio nun2a gosta de esperar 1uito te1po por u1 deter 1in a d o pro2ess o4 9 gra7a6 8o linha a linha distri5ui o pro2ess o total de atuali@a68o e1 pe:ue n os inter7alos de te1po :ue s8o 1uitas 7e@es 2onsu 1idos pelo prprio te1po de digita68o do usuArio tornando' os i1per2e ptG7eis4 VA a gra7a6 8o e1 P5at2hQI depend e n d o da 2o1pleBidad e do pro2ess o :ue estA sendo reali@adoI pode de1or ar 1uitoI JA :ue toda a atuali@a68o K +eita de u1a Lni2a 7e@4 O te1po total da atuali@a68o e1 P5at2hQ K atK 1enor do :ue os +eitos linha a linhaI JA :ue u1 nL1ero 1enor de 2o1an do s s8o en7iados ao 5an2o4 Entreta nt o o usuArio poderA a2har a per+or1a n 2 e da gra7a6 8o linha a linha 5e1 1elhor do :ue a outraI por:ue o te1po total K diluGdo e1 di7ersas opera6C e s de te1po 5e1 1enore s4 9tra7Ks da dis2uss 8o a2i1aI pode' se 2on2luir :ue as gra7a6C es linha a linha pare2e 1 ser u1 1Ktodo 1ais interess a n t e de se utili@arI a 1enos :ue haJa a ne2es sida d e da gra7a68 o ser reali@ada dentro de u1a Lni2a trans a6 8 oI 2o1o por eBe1ploI o 2adas tro de u1 pedido e de seus itens4 Para +a@er isso no DelphiI pode 1o s 2ontinuar utili@ando o re2urso P2a2hed updat e sQI 1as :uestion a n d o ao usuArio o sal7ando ou 2an2ela 1 e n t o das altera6C e s antes :ue ele deiBe o registro4 9ntes de +a@er issoI 7a1os organi@ar u1 pou2o 1ais nossa apli2a68o4 9o in7Ks de i1ple1 e n t a r 1 o s a lgi2a direta 1 e n t e nos e7entos dos 5otCesI 7a1os 2riar 7+01 * : 6 + * / separa d a s para 2ada e7ento para :ue estes possa 1 depois sere 1 reutili@ados 1ais +a2il1ent e4
. . pu1lic : Pu1lic proce ure proce ure proce ure proce ure en 3 . .

eclarations ; 'ave3 Ne!%orInsert3 #elete3 #iscar 3

Depois de 2riar as pro2edur e sI 7a1os trans+erir o 2digo 2ontido nos e7entos dos 5otCes para as no7as pro2edur e sM
Delphi Client/Server 4,

proce ure TfrmPro uto.1tnAppen Clic-('en er0 TO12ect,3 1e4in Ne!%orInsert3 en 3 proce ure TfrmPro uto.1tn#eleteClic-('en er0 TO12ect,3 1e4in #elete3 en 3 proce ure TfrmPro uto.1tn'aveClic-('en er0 TO12ect,3 1e4in 'ave3 en 3 proce ure TfrmPro uto.1tn#iscar Clic-('en er0 TO12ect,3 1e4in #iscar 3 en 3 proce ure TfrmPro uto.Ne!%orInsert3 1e4in #'Main.#ata'et.Appen 3 en 3 proce ure TfrmPro uto.#elete3 1e4in #'Main.#ata'et.#elete3 en 3 proce ure TfrmPro uto.'ave3 1e4in TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 en 3 proce ure TfrmPro uto.#iscar 3 1e4in TB#E#ata'et(#'Main.#ata'et,.CancelUp ates en 3

Para +a2ilitar o geren2ia 1 e n t o dos e7entos K interess a n t e 2riar u1a 7ariA7el :ue indi:ue se u1 deter 1ina d o e7ento estA sendo eBe2ut a d o4 9tra7Ks dess e 1KtodoI pode' se 7eri+i2ar dentro de e7entoI se ele estA sendo eBe2ut a d o por u1 outro e7ento e assi1 5lo:ue ar 2ha1 a d a s 1Lltiplas de u1 1es 1o e7ento4 ?a1os 2riar o seguinte tipo de dado na se68o -87 * da (2-*+A , 1 * M
TOper'tate9(opNone<opNe!%orInsert<op#elete<op'ave<op#iscar ,3

Na se68o 76.)(1 da 7ariA7el dess e tipoM


. . pu1lic : Pu1lic eclarations ; Oper'tate0 TOper'tate3 proce ure 'ave3 proce ure Ne!%orInsert3
Delphi Client/Server

2lasse

TA+4P+0: 6 - 0 I pode 1o s

2riar

u1a

4/

proce ure #elete3 proce ure #iscar 3 en 3 .

Pode1o s ini2iali@A' la no e7ento O2C+*,- * da 1orm M


proce ure TfrmPro uto.%ormCreate('en er0 TO12ect,3 1e4in Oper'tate09opNone3 en 3

9goraI para 2ada e7ento de7e 1o s 2ontrolar o 7alor da 7ariA7el atri5uindo a ela a opera68 o :ue estA sendo eBe2ut a d a e retorna n d o ao 7alor original no +inal do e7ento4
proce ure TfrmPro uto.Ne!%orInsert3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09Oper'tate3 Oper'tate09opNe!%orInsert3 tr8 #'Main.#ata'et.Appen 3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3

!o1 issoI JA te1os o 2digo 1ais organi@ado e 2o1 1ais poder de geren2ia 1 e n t o4 ?a1os agora i1ple1 e n t a r o sal7a1 e n t o linha a linha4 Para isso 7a1os utili@ar o e7ento O2U7: , - * D , - , do &ataSource :ue K dispara do se1pr e :ue se tentar en7iar u1a linha alterad a para o P2a2heQI ou seJaI se1pr e :ue K eBe2ut a d o u1 2o1and o 70/ - 4 Nesse e7ento ire1os pergunt ar ao usuArio se ele deseJa gra7ar o registroI des2art ar as altera6C e s ou 2an2elar a tentati7a de sair do registro4
proce ure TfrmPro uto.#'MainUp ate#ata('en er0 TO12ect,3 var ret0 inte4er3 1e4in If Oper'tate in =opNone<opNe!%orInsert> t"en 1e4in ret09Application.Messa4eBo?(@#ese2a salvar as alteraABes@< @ConfirmaACo@< MB)YE'NOCANCEL D MB)ICON7UE'TION ,3 case ret of i Yes0 'ave3 i No0 #iscar 3 i Cancel0 A1ort3 en 3 en 3 en 3

9 pri1eira 2oisa :ue serA +eita no e7ento K 2he2ar se nenhu 1 a opera68 o 2onhe2ida estA sendo eBe2ut a d a 4 N8o :uere 1o sI por eBe1ploI :ue a pergunt a seJa +eita se o usuArio apert ar o 5ot8o de sal7ar4
Delphi Client/Server 40

Depois serA +eita a pergunt a para o usuArio e 2o1 a respost a +oi 1ontad o u1 2o1an do 1,/ * 4 )e o usuArio :uiser sal7arI si1ples 1 e n t e 2ha1 a 1 o s o 2o1an do S,5 * . )e ele n8o :uiserI des2art a 1 o s a altera6 8o antes de sair do registro4 E se ele :uiser 2an2elarI eBe2ut a 1 o s o 2o1an do A.0+- 4 Pode1o s 1elhorar o e7ento D(/1,+: para des2art ar e li1par o P2a2heQ apen a s se ele 2onter algu1 registro4 !aso 2ontrArio pode 1o s apen a s des2art ar as altera6C e s antes 1es 1o delas ire1 para o P2a2heQ4
proce ure TfrmPro uto.#iscar 3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09op#iscar 3 tr8 If TB#E#ata'et(#'Main.#ata'et,.Up atesPen in4 TB#E#ata'et(#'Main.#ata'et,.CancelUp ates else TB#E#ata'et(#'Main.#ata'et,.Cancel3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3

t"en

O 1Ktodo 1,2 1 *) do &ataSet des2art a as altera6C e s :ue ainda n8o +ora1 para o P2a2hed updat e s Q4 9tra7Ks da propried a d e U7:,- * / P * 2 : ( 2 3 I pode' se 7eri+i2ar se eBiste 1 registros pende n t e s no P2a2heQ :ue ainda n8o +ora1 en7iados para o 5an2o4 Para +inali@arI de7e 1o s a2res2e nt ar os 2o1an do s :ue e+eti7a 1 o P2a2hed updat e s Q no 5an2o aps o eB2lus8o de u1 registro no e7ento D*)* - * 4
proce ure TfrmPro uto.#elete3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09op#elete3 tr8 #'Main.#ata'et.#elete3 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3

!ra=alhando com o !!a=le


!o1o +oi 7istoI +a@er u1a si1ples tela de 2adastro 2o1 o 2o1pon e n t e T7uerI +oi u1 pou2o tra5alhoso4 O 1es 1o n8o a2onte2 e 2o1 o 2o1pon e n t e TTa4le I :ue poderia +orne2er a 1es 1 a +un2ionalidad e atra7K s de u1 pro2esso 1uito 1ais si1ples4
Delphi Client/Server 41

?a1os i1ple1e n t a r ent8o u1a outra tela de 2adas troI 1as agora utili@ando o 2o1pon e n t e TTa4le 4 Para isso 7a1os 2olo2ar u1 2o1pon e n t e TTa4le no &ata+odule DM)ist?enda s4

Dig #4%M !o1ponente TTa4le 4

Componente Table1

Proprie"a"e Name DatabaseName TableName cti!e

-alor T1F D+V*ND " 1F T'1*

*a5ela de Propriedades4

Etili@are 1os este 2o1pon e n t e TTa4le para a2ess ar a ta5ela de ED no 5an2o de dados4 ?a1os 1ontar a tela de 1an eira pare2ida 2o1 a :ue 1onta 1 o s para a tela de Produto4

Dig #4$M *ela de ED4

Componente form1 Panel1 Panel2 Data"ource1 D+Na!i2ator


Delphi Client/Server

Proprie"a"e Name Ca,tion Ca,tion Ca,tion Name Data"et Data"ource


42

-alor frm1F 1F

D"/ain D/"istVendas.T1F D"/ain

",,ed+utton1 ",,ed+utton2 ",,ed+utton",,ed+utton3 D+*dit1..D+*dit2


*a5ela de Propriedades4

Name Name Name Name Data"ource DataField

btn ,,end btnDelete btn"a!e btnDiscard D"/ain 1F0"#..1F0N/

Pode1o s i1ple1e n t a r os e7entos O2C)(19 dos 5otCes si1ples 1 e n t e eBe2ut a n d o os respe2ti7os 1Ktodos do &ataSet asso2iado ao &ataSource &S+ain 4
proce ure TfrmU%.1tnAppen Clic-('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.Appen 3 en 3 proce ure TfrmU%.1tn#eleteClic-('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.#elete3 en 3 proce ure TfrmU%.1tn'aveClic-('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.Post3 en 3 proce ure TfrmU%.1tn#iscar Clic-('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.Cancel3 en 3

Pode1o s agora alterar a tela prin2ipal do proJeto para +r1ED e eBe2ut ar a apli2a68o4 Ire1os notar :ue a tela +un2iona de u1a +or1a 5e1 se1elh a n t e N tela de Produto4 Por:ue ent8o i1ple1 e n t a r telas 2o1 T7uerI I se atra7Ks do 2o1pon e n t e TTa4le K 1uito 1ais si1ples e rApida a 2onstru68o b 9lK1 da +a2ilidadeI a i1ple1 e n t a 6 8 o atra7Ks do 2o1pon e n t e TTa4le K 1ais e+i2iente :uando a trans a6 8 o K +inali@ada JA :ue n8o 5us2a todos os registros no 5an2o4 Entretan toI tere 1o s :ue optar pela i1ple1e n t a 6 8 o atra7Ks do T7uerI :uando eBistir u1 nL1ero 1aior de ta5elas en7ol7idas e1 u1a Lni2a tela4 !ada TTa4le irA eBe2ut ar u1 2o1and o /*) * 1 - I :ue poderia tal7e@I ser eBe2ut a d o por u1 Lni2o 2o1and o atra7Ks do 2o1pon e n t e T7uerI 2o1 u1a per+or1a n 2 e 5e1 1elhor4 Outra pe:u e n a des7ant a g e 1 do 2o1pon e n t e TTa4le K :ue ele ne2essita 5us2ar as in+or1a6C e s de 2atAlogo o :ue +a@ de1orar 1ais na pri1eira a5ertura de 2ada ta5ela4 PorK1 2o1 a op68o EN9<LED )!HEM9 !9!HE do <DE ligadaI esse pro5le1 a pode ser 1ini1i@ado4

Delphi Client/Server

44

Captulo

<iltrando "egistros
Fss e ca p:tulo m o s tra algu m a s pos si4ilidad e s d e s el e./o q u e po d e m s er a pre s e n t a d a s ao u s u (rio

1 apli2a6Ces !liente;)er7idor K 1uito 2o1u 1 ha7er ta5elas 2o1 1ilhares e atK 1ilhCes de registros4 )endo assi1I K pre2iso i1ple1e n t a r 2onsultas de +or1a a n8o tra@er todos esses registros desne2 e s s a ria 1 e n t e para a apli2a68o4 E1 u1a apli2a68o e prin2ipal1e n t e e1 u1a apli2a68o !liente;) er7idor onde a in+or1a6 8 o estA lo2ali@ada e1 u1 lo2al +Gsi2o di+erent e do apli2ati7o e esse lo2al 2onsegu e pro7er u1a intelig>n2ia 2apa@ de 1anipular os dadosI de7e' se ter 2o1o regra tra@er para apli2a68o so1en t e as in+or1a6C e s real1e n t e ne2es s Arias para o usuArio 4 =ual:uer outra in+or1a6 8 oI alK1 de poluir a telaI gera u1 trA+ego adi2ional e desne2 e s s A rio na rede4 Muitas 7e@es tenta 1 o s adi7inhar a in+or1a6 8 o :ue o usuArio deseJa ao in7Ks de deiBar :ue ele 1es 1o a pe6a4 9s 1elhores apli2a6Ces !liente;)er7idor s8o a:uelas :ue 2ondu@e 1 os usuArios atra7Ks das in+or1a6C e s real1e n t e ne2es s Arias detalhan d o' as a 1edida do ne2es s Ario4 9s duas telas :ue ns 2onstruG1os JA 2o1e6 a 1 ati7asI ou seJaI 1ostran d o as pri1eiras linhas da ta5ela4 Doi en7iado u1 /*) * 1 - para o 5an2o de dadosI algu1a s linhas +ora1 tra@idas para apli2a68o atra7Ks da rede e ne1 se:uer sa5e 1o s se o usuArio as deseJa7a 7er4 I1agine :ue a ta5ela de produto possua 2er2a de 4(((4((( de registros tra@idos orden a d a 1 e n t e por no1e4 Na nossa tela de produtoI o pri1eiro registro JA iria apare2 er :uando o usuArio a5risse a tela4 Mas se o usuArio deseJass e 7er u1 produto :ue 2o1e6 a s s e 2o1 ]M^I serA :ue ele iria :uerer na7eg ar pelos 5otCes de na7eg a6 8 o atK en2ontrA' lob
Delphi Client/Server 45

9lK1 dissoI de7e' se le15rar :ue :uando se utili@a o 2o1pon e n t e T7uerI para 2riar o Presult setQ e u1 2o1an do 104 4 (- K eBe2ut a d oI todas as linhas restant e s do Presult setQ s8o tra@idas para apli2a68o4 I1agine isso 2o1 4(((4((( de registros4 PortantoI e1 apli2a6Ces !liente;)er7idorI prin2ipal1e n t e e1 Presult setsQ :ue retorna 1 u1a grand e :uantida d e de registroI K 2o1u 1 indu@ir o usuArio a +iltrar seu 2onJunto de registros antes de tra@>' los para a apli2a68o4 EBiste1 7Arias +or1as de se i1ple1 e n t a r esse 1e2anis 1o na apli2a68o e a seguir 7a1os apres e n t a r alguns deles4

Delphi Client/Server

57

S @ (

' M P ( # " ' "

@6' na mesma !ela de Manuteno


E1a +or1a de i1ple1 e n t a 6 8 o K per1itir o usuArio reali@ar u1a pes:uis a atra7Ks dos prprios 2a1pos utili@ados para 1anut e n 6 8 o4 !ria' se u1a no7a linha e1 5ran2o e o usuArio atri5ui 7alores para os 2a1pos :ue ser8o utili@ados na pes:uisa4 Esse re2urso K 2onhe2ido 2o1o =<E ,=uerF 5F EBe1plo.I :ue K o pro2es so de 2riar u1 2o1and o )=L dina1i2a 1 e n t e atra7Ks de 7alores atri5uGdos aos 2a1pos da ta5ela4 )o1ent e os 2a1pos :ue possue 1 7alores entra 1 no +iltro4 Portanto o 2o1an do )=L /*) * 1 - te1 :ue ser 1onta do dina1i2a 1 e n t e durant e a eBe2u6 8o da apli2a68o4 Esse re2urso +orne2e u1a 5oa +leBi5ilidade nas 2onsultas per1itindo o usuArio 2hegar 5e1 prBi1o do dado antes de utili@ar os re2ursos de na7eg a6 8 o4 Pode1o s i1ple1 e n t a r esse re2urso na tela de produto4 Para isso 7a1os a2res2e nt ar dois 5otCes para per1itir a pes:uisa4 O pri1eiro para 2riar u1a no7a linha e1 5ran2o :ue per1ita o usuArio atri5uir 7alores aos 2a1pos4 O segundo para disparar a pes:uisa4 ?a1os ta15 K 1 desligar a proprieda d e A1-(5 * do &ataSet 7Produto para :ue ini2ial1ent e nenhu 1 registro seJa tra@ido4

Dig %4 M *ela de Produto4

Componente ",,ed+utton1 ",,ed+utton2


*a5ela de Propriedades

Proprie"a"e Name Name

-alor btnNe5For"earc6 btn"earc6

De7e 1o s ent8o i1ple1 e n t a r o e7ento pro2edur e s da seguinte 1an eiraM

O2C)(19 dos 5otCes e as

proce ure TfrmPro uto.1tnNe!%or'earc"Clic-('en er0 TO12ect,3


Delphi Client/Server 51

S @ (

' M P ( # " ' "

1e4in Ne!%or'earc"3 en 3 proce ure TfrmPro uto.1tn'earc"Clic-('en er0 TO12ect,3 1e4in 'earc"3 en 3 proce ure TfrmPro uto.Ne!%or'earc"3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09opNe!%or'earc"3 tr8 If Not TB#E#ata'et(#'Main.#ata'et,.Active t"en 1e4in T7uer8(#'Main.#ata'et,.'7L.Te?t09Cm 'elect D Cm 'electNull3 TB#E#ata'et(#'Main.#ata'et,.Open3 en 3 TB#E#ata'et(#'Main.#ata'et,.Appen 3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.'earc"Clic-3 var Ol Oper'tate0 TOPer'tate3 s7BE0 'trin43 1e4in ActiveControl09Nil3 Ol Oper'tate09OPer'tate3 Oper'tate09op'earc"3 tr8 s7BE09Buil 7BE3 TB#E#ata'et(#'Main.#ata'et,.close3 T7uer8(#'Main.#ata'et,.'7L.Te?t09Cm 'electD @ !"ere @ D s7BE D Cm Or erB83 TB#E#ata'et(#'Main.#ata'et,.Open3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3

9 pro2edure N*< $0+I2 / * + - de7e ser alterad a in2lus8o da linha se o &ataSet esti7er +e2hado4

para

suportar

proce ure TfrmPro uto.Ne!%orInsert3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09opNe!%orInsert3 tr8 If Not TB#E#ata'et(#'Main.#ata'et,.Active t"en 1e4in T7uer8(#'Main.#ata'et,.'7L.Te?t09 Cm 'elect D Cm 'electNull3 TB#E#ata'et(#'Main.#ata'et,.Open3 en 3 #'Main.#ata'et.Appen 3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3

Delphi Client/Server

5*

S @ (

' M P ( # " ' "

De7e 1o s 2uidar apli2a68oM

de 1ais

alguns

detalhes

antes

de eBe2ut ar

?a1os a2res2 en t a r duas no7as opera6C e s ao tipo TO7*+S - , - * M


TOPer'tate9(opNone<opNe!%orInsert<op#elete<op'ave<op#iscar <opNe!%or'earc"<op 'earc",3

De7e 1o s 2riar 1ais tr>s 7ariA7eis na se68o 7+(5,- * do 8orm para 2ontrolar o 2o1an do /*) * 1 - M
. . private : Private eclarations ; Cm 'elect0 'trin43 Cm Or erB80 'trin43 Cm 'electNull0 'trin43 pu1lic : Pu1lic eclarations ; . .

?a1os ta15 K 1 alterar a proprieda d e 2lAusula 0+: *+ .8 M


Componente QProduto
*a5ela de Propriedades

SQL do 7Produto tirando a

Proprie"a"e cti!e "Q%

-alor False select & from Produto

?a1os a2res2e nt ar a ini2iali@a68o das 7ariA7eis no e7ento O2C+*,- * do 1orm e retornar o 7alor da propried a d e SQL do 7Produto para o 7alor original no e7ento O2D * / -+ 0 8 4
proce ure TfrmPro uto.%ormCreate('en er0 TO12ect,3 1e4in Oper'tate09opNone3 Cm 'elect09T7uer8(#'Main.#ata'et,.'7L.Te?t3 Cm Or erB809@ or er 18 pro)c @3 Cm 'electNull09@ !"ere pro)c is null @3 en 3

proce ure TfrmPro uto.%orm#estro8('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.close3 T7uer8(#'Main.#ata'et,.'7L.Te?t09Cm 'elect3 en 3

Dinal1ent eI te1os :ue i1ple1 e n t a r a +un68o B6():QBE 4 Dutura 1 e n t e I de7e' se tra5alhar 1elhor essa +un68o para suportar 2a1pos PdatasQ e tratar os 2a1pos 2al2ulados e PlooTupsQ do &ataSet 4
Delphi Client/Server 5,

S @ (

' M P ( # " ' "

function TfrmPro uto.Buil 7BE0 'trin43 var sep0strin43 20inte4er3 1e4in 'ep09@@3 %or 209E to #'Main.#ata'et.%iel CountF/ o If (#'Main.#ata'et.%iel s=2>.As'trin4 G* @@, t"en 1e4in If #'Main.#ata'et.%iel s=2>.#ataT8pe 9 ft'trin4 t"en Result09 %ormat(@Hs Hs (Hs li-e @@HsHs@@,@< =Result< 'ep< #'Main.#ata'et.%iel s=2>.%iel Name< #'Main.#ata'et.%iel s=2>.As'trin4<@H@>, else Result09 %ormat(@Hs Hs (Hs 9 Hs,@< =Result<'ep< #'Main.#ata'et.%iel s=2>.%iel Name< #'Main.#ata'et.%iel s=2>.As'trin4>,3 'ep09@An @3 en 3 en 3

9ntes ainda de eBe2ut arI 7a1os aJustar a a5ertur a dos 8orms no P+0J*1 -/O7 -( 0 2 / 4 De7e' se alterar o M,(2 $0+4 no7a 1 e n t e para ]+r1Produto^ e arrast ar o ]DMsist?endas^ para o topo da lista dos 9uto' !reate para :ue ele seJa o pri1eiro a ser 2riado4

Dig %42M ProJe2t;Options4

Controlando os 'stados da !ela


Para +inali@ar a tela de produtosI de7e' se utili@ar os estados da tela para 2ontrolar a ha5ilita68o dos 5otCes de edi68o4 O 2o1pon e n t e
Delphi Client/Server 5/

S @ (

' M P ( # " ' "

7uerI do Delphi JA possui interna 1 e n t e u1a 1A:uina de estado 2ontrolada atra7Ks do atri5uto /-,- * I onde os prin2ipais estados s8oM dsIna2ti7eI ds<roHs eI dsEdit e dsInsert4

dsIna2ti7e

dsInsert

ds<roHse

dsEdit
DigM %4/M Estados do Data)et4

Entreta nt o esses estados n8o s8o su+i2ientes para repres e n t a r a tela de produto4 R ne2es s Aria a in2lus8o de u1 no7o estado na 1A:uina de estadosI +i2ando da seguinte +or1aM

dsIna2ti7e

dsNeHDor Insert

ds<roHse

dsNeHDor )ear2h

dsEdit
Dig %4&M No7a 1A:uina de estados4

E1 nosso eBe1ploI pode 1o s 2riar a 1A:uina de estado no prprio 8orm atra7Ks da de2lara68 o de u1 tipo e u1a 7ariA7el4
TRecor 'tate9(r Inactive<r Ne!%or'earc"<r Ne!%orInsert<r Bro!se<r E it,3 pu1lic : Pu1lic eclarations ; Oper'tate0 TOper'tate3 Recor 'tate0 TRecor 'tate3
Delphi Client/Server 50

S @ (

' M P ( # " ' "

function Buil 7BE0 'trin43 proce ure 'ave3 proce ure Ne!%orInsert3 proce ure #elete3 proce ure #iscar 3 proce ure Ne!%or'earc"3 proce ure 'earc"3 proce ure 'etRecor 'tate(Ialue0 TRecor 'tate,3 en 3

9lK1 dissoI u1a sKrie de 1odi+i2a6Ces nos e7entos de7e 1 ser +eitas e o 2digo 2o1pleto e +inal da tela de produto K apres e n t a d o a5aiBo4 Pode' se +a2il1ent e trans+or1 ar a tela de Produtos e1 u1 P*e1plat eQ e adi2ionar no repositrio de o5Jetos do Delphi4 Pode' se +a@er 2o1o eBer2G2ioI a tela de 2idades utili@ando' se o Pte1plat eQ 2onstruGdo4 9s Lni2as depend > n 2ias da tela 2o1 a ta5ela de PRODE*O s8o as 7ariA7eisM C4:O+: *+B8 e C4:S *) * 1 - N 6 )) 4 Essas 7ariA7eis pre2isa 1 ent8o ser rede+inidas no e7ento O2C+*,- * do 1orm :ue herdar do Pte1plat eQ original4
unit pro uto3 interface uses Jin o!s< Messa4es< '8sUtils< Classes< &rap"ics< Controls< %orms< #ialo4s< #1< E?tCtrls< 't Ctrls< Mas-< #BCtrls< Buttons3 t8pe TOper'tate9(opNone<opNe!%orInsert<op#elete<op'ave<op#iscar <opNe!%or'earc"<op 'earc",3 TRecor 'tate9(r Inactive<r Ne!%or'earc"<r Ne!%orInsert<r Bro!se<r E it,3 TfrmPro uto 9 class(T%orm, Panel/0 TPanel3 Panel50 TPanel3 #'Main0 T#ata'ource3 #BNavi4ator/0 T#BNavi4ator3 La1el/0 TLa1el3 #BE it/0 T#BE it3 La1el50 TLa1el3 #BE it50 T#BE it3 La1el60 TLa1el3 #BE it60 T#BE it3 La1elK0 TLa1el3 #BE itK0 T#BE it3 1tnAppen 0 T'pee Button3 1tn#elete0 T'pee Button3 1tn'ave0 T'pee Button3 1tn#iscar 0 T'pee Button3 1tnNe!%or'earc"0 T'pee Button3 1tn'earc"0 T'pee Button3 proce ure 1tnAppen Clic-('en er0 TO12ect,3 proce ure 1tn#eleteClic-('en er0 TO12ect,3 proce ure 1tn'aveClic-('en er0 TO12ect,3 proce ure 1tn#iscar Clic-('en er0 TO12ect,3 proce ure #'MainUp ate#ata('en er0 TO12ect,3 proce ure %ormCreate('en er0 TO12ect,3 proce ure 1tnNe!%or'earc"Clic-('en er0 TO12ect,3 proce ure %orm#estro8('en er0 TO12ect,3
Delphi Client/Server 51

S @ (

' M P ( # " ' "

proce ure 1tn'earc"Clic-('en er0 TO12ect,3 proce ure #'Main'tateC"an4e('en er0 TO12ect,3 private : Private eclarations ; Cm 'elect0 'trin43 pu1lic : Pu1lic eclarations ; Cm Or erB80 'trin43 Cm 'electNull0 'trin43 Oper'tate0 TOper'tate3 Recor 'tate0 TRecor 'tate3 function Buil 7BE0 'trin43 proce ure 'ave3 proce ure Ne!%orInsert3 proce ure #elete3 proce ure #iscar 3 proce ure Ne!%or'earc"3 proce ure 'earc"3 proce ure 'etRecor 'tate(Ialue0 TRecor 'tate,3 en 3 var frmPro uto0 TfrmPro uto3 implementation uses #mE/< :LR M.#%M; proce ure TfrmPro uto.%ormCreate('en er0 TO12ect,3 1e4in Oper'tate09opNone3 'etRecor 'tate(r Inactive,3 Cm 'elect09T7uer8(#'Main.#ata'et,.'7L.Te?t3 Cm Or erB809@ or er 18 pro)c @3 Cm 'electNull09@ !"ere pro)c is null@3 en 3 proce ure TfrmPro uto.1tnAppen Clic-('en er0 TO12ect,3 1e4in Ne!%orInsert3 en 3 proce ure TfrmPro uto.1tn#eleteClic-('en er0 TO12ect,3 1e4in #elete3 en 3 proce ure TfrmPro uto.1tn'aveClic-('en er0 TO12ect,3 1e4in 'ave3 en 3 proce ure TfrmPro uto.1tn#iscar Clic-('en er0 TO12ect,3 1e4in #iscar 3 en 3 proce ure TfrmPro uto.1tnNe!%or'earc"Clic-('en er0 TO12ect,3 1e4in Ne!%or'earc"3 en 3 proce ure TfrmPro uto.1tn'earc"Clic-('en er0 TO12ect,3 1e4in
Delphi Client/Server 52

1ta1les3

S @ (

' M P ( # " ' "

'earc"3 en 3 proce ure TfrmPro uto.Ne!%orInsert3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09opNe!%orInsert3 tr8 If Not TB#E#ata'et(#'Main.#ata'et,.Active t"en 1e4in T7uer8(#'Main.#ata'et,.'7L.Te?t09 Cm 'elect D Cm 'electNull3 TB#E#ata'et(#'Main.#ata'et,.Open3 en 3 #'Main.#ata'et.Appen 3 'etRecor 'tate(r Ne!%orInsert,3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.#elete3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09op#elete3 tr8 #'Main.#ata'et.#elete3 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 If TB#E#ata'et(#'Main.#ata'et,.IsEmpt8 t"en 1e4in TB#E#ata'et(#'Main.#ata'et,.close3 'etRecor 'tate(r Inactive,3 en else 'etRecor 'tate(r Bro!se,3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.'ave3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09op'ave3 tr8 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 'etRecor 'tate(r Bro!se,3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.#iscar 3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09op#iscar 3 tr8 If TB#E#ata'et(#'Main.#ata'et,.Up atesPen in4 t"en TB#E#ata'et(#'Main.#ata'et,.CancelUp ates else TB#E#ata'et(#'Main.#ata'et,.Cancel3 If TB#E#ata'et(#'Main.#ata'et,.IsEmpt8 t"en 1e4in TB#E#ata'et(#'Main.#ata'et,.close3 'etRecor 'tate(r Inactive,3
Delphi Client/Server 54

S @ (

' M P ( # " ' "

en else 'etRecor 'tate(r Bro!se,3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.Ne!%or'earc"3 var Ol Oper'tate0 TOPer'tate3 1e4in Ol Oper'tate09OPer'tate3 Oper'tate09opNe!%or'earc"3 tr8 If Not TB#E#ata'et(#'Main.#ata'et,.Active t"en 1e4in T7uer8(#'Main.#ata'et,.'7L.Te?t09 Cm 'elect D Cm 'electNull3 TB#E#ata'et(#'Main.#ata'et,.Open3 en 3 TB#E#ata'et(#'Main.#ata'et,.Appen 3 'etRecor 'tate(r Ne!%or'earc",3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.%orm#estro8('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.close3 T7uer8(#'Main.#ata'et,.'7L.Te?t09Cm 'elect3 en 3 proce ure TfrmPro uto.'earc"3 var Ol Oper'tate0 TOPer'tate3 s7BE0 'trin43 1e4in ActiveControl09Nil3 Ol Oper'tate09OPer'tate3 Oper'tate09op'earc"3 tr8 s7BE09Buil 7BE3 TB#E#ata'et(#'Main.#ata'et,.close3 T7uer8(#'Main.#ata'et,.'7L.Te?t09 Cm 'elect3 If s7BE G* @@ t"en T7uer8(#'Main.#ata'et,.'7L.Te?t09 T7uer8(#'Main.#ata'et,.'7L.Te?t D@ !"ere @ D s7BE3 T7uer8(#'Main.#ata'et,.'7L.Te?t09T7uer8(#'Main.#ata'et,.'7L.Te?t D Cm Or erB83 TB#E#ata'et(#'Main.#ata'et,.Open3 If TB#E#ata'et(#'Main.#ata'et,.IsEmpt8 t"en 'etRecor 'tate(r Ne!%or'earc", else 'etRecor 'tate(r Bro!se,3 finall8 Oper'tate09Ol Oper'tate3 en 3 en 3 proce ure TfrmPro uto.#'MainUp ate#ata('en er0 TO12ect,3 var ret0 inte4er3 1e4in If Oper'tate 9 opNone t"en 1e4in If Recor 'tate 9 r Ne!%or'earc" t"en #iscar else 1e4in ret09Application.Messa4eBo?(@#ese2a salvar as alteraABes@< @ConfirmaACo@< MB)YE'NOCANCEL D MB)ICON7UE'TION ,3 case ret of
Delphi Client/Server 55

S @ (

' M P ( # " ' "

i Yes0 'ave3 i No0 #iscar 3 i Cancel0 A1ort3 en 3 en 3 en 3 en 3 proce ure TfrmPro uto.#'Main'tateC"an4e('en er0 TO12ect,3 1e4in If #'Main.'tate9 sE it t"en 'etRecor 'tate(r E it,3 en 3 function TfrmPro uto.Buil 7BE0 'trin43 var sep0strin43 20inte4er3 1e4in 'ep09@@3 %or 209E to #'Main.#ata'et.%iel CountF/ o If (#'Main.#ata'et.%iel s=2>.As'trin4 G* @@, t"en 1e4in If #'Main.#ata'et.%iel s=2>.#ataT8pe 9 ft'trin4 t"en Result09 %ormat(@Hs Hs (Hs li-e @@HsHs@@,@< =Result<'ep<#'Main.#ata'et.%iel s=2>.%iel Name< #'Main.#ata'et.%iel s=2>.As'trin4<@H@>, else Result09 %ormat(@Hs Hs (Hs 9 Hs,@< =Result<'ep<#'Main.#ata'et.%iel s=2>.%iel Name< #'Main.#ata'et.%iel s=2>.As'trin4>,3 'ep09@An @3 en 3 en 3 proce ure TfrmPro uto.'etRecor 'tate(Ialue0 TRecor 'tate,3 1e4in Recor 'tate09Ialue3 Case Recor 'tate of r Inactive0 1e4in 1tnNe!%or'earc".Ena1le 09TRUE3 1tnAppen .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 en 3 r Ne!%or'earc"0 1e4in 1tnNe!%or'earc".Ena1le 09%AL'E3 1tnAppen .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09TRUE3 1tn#elete.Ena1le 09%AL'E3 en 3 r Ne!%orInsert0 1e4in 1tnNe!%or'earc".Ena1le 09%AL'E3 1tnAppen .Ena1le 09%AL'E3 1tn'earc".Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn#elete.Ena1le 09%AL'E3 en 3 r Bro!se0 1e4in
Delphi Client/Server 177

S @ (

' M P ( # " ' "

1tnNe!%or'earc".Ena1le 09TRUE3 1tnAppen .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn#elete.Ena1le 09TRUE3 en 3 r E it0 1e4in 1tnNe!%or'earc".Ena1le 09%AL'E3 1tnAppen .Ena1le 09%AL'E3 1tn'earc".Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn#elete.Ena1le 09%AL'E3 en 3 en 3 en 3 en .

!ela de Consulta 'spec:ica


E1a outra +or1a de +iltrar a pes:uis a :ue serA +eita no 5an2o de dados para 5us2ar o registro :ue o usuArio deseJaI K 2riar u1a tela de 2onsulta separa d a da tela de 1anut e n 6 8 o4 !o1 isso a tela de 1anut e n6 8 o n8o pre2isa 2onter ele1e n t o s de na7eg a 6 8 oI JA :ue pode tra5alhar 2o1 apen a s u1 registro de 2ada 7e@4 O usuArio utili@a a tela de 2onsulta para +iltrarI pes:uis ar e sele2ionar o registro deseJado :ue K trans+erido para a tela de 1anut e n 6 8 oI onde nor1al 1 e n t e in+or1a6C e s 1ais detalha d a s s8o apres e n t a d a s I per1itindo ao usuArio reali@ar as 1anut e n6 C e s ne2ess Arias so5re esse registro4 !o1 esse tipo de padr8o de 2adas tro K possG7el ta15 K 1 I +a@er u1 1elhor 5alan2e a 1 e n t o entre os dados ne2es s Arios para 2onsulta e os dados ne2ess Arios para a 1anut e n 6 8 oI JA :ue estes est8o e1 telas di+erent e s4 Para dis2utir esses 2on2eitosI 7a1os i1ple1e n t a r a tela de 2liente na apli2a68o eBe1plo4 !ela de Consulta Na tela de 2onsulta eBplora' se a ta5ela ou as ta5elas en7ol7idasI no sentido 7erti2alI ou seJaI u1 nL1ero 1aior de registros de7e 1 ser tra@idos para apli2a68o para per1itir :ue o usuArio +a6a a es2olha na7eg a n d o entre eles4 Entreta n toI a sele68o pode ser redu@ida hori@ontal1 e n t eI JA :ue a es2olha do usuArio pode ser +eita eBi5indo' se u1 nL1ero pe:u e no de 2olunasI e 2onse:W e n t e 1 e n t e de ta5elasI :ue o auBilie1 na sele68o4 Para isso K pre2iso apli2ar o seguinte 2on2eitoM in+or1a6C e s de ta5elas rela2ionad a s N ta5ela prin2ipal n8o de7e 1 parti2ipar da sele68o e si1 dos +iltros4 Por eBe1ploI se o usuArio ne2es sitar es2olher 2lientes de u1a deter 1in a d a 2idadeI ao in7Ks de 1ostrar na 2onsulta as 2idades :ue o 2liente perten2 eI +a6a' o in+or1ar antes da 2onsulta a 2idade da :ual os 2lientes ele deseJa4 9tra7Ks dess a tK2ni2aI eli1ina' se o nL1ero de ta5elas ne2es s Arias na
Delphi Client/Server 171

S @ (

' M P ( # " ' "

2lAusula A+04 I tornando o 2o1and o /*) * 1 - 5e1 1ais e+i2iente 2o1 o 1es 1o resultado para o usuArio :ue deseJa7 a sele2ionar u1 2liente de u1a deter 1ina d a 2idade4 Ire1os e1 nosso eBe 1plo 2onstruir u1a tela de 2onsulta espe2G+i2a para sele2ionar 1 o s o 2liente4 9ntes porK 1I ire1os 2riar alguns 2o1pon e n t e s &ataSets no &ata+odule 4

Dig %45M DataModule DM)ist?endas

Componente Quer$1

Proprie"a"e Name DatabaseName "Q%

-alor QConsCliente D+V*ND "


"*%*CT P*"". .P*"0CD , P*"". .P*"0N/ , P*"". .P*"0TP , P*"". .P*"0C#CCPF F'./ C%I*NT* C%I*NT* , P*"". P*"". 78*'* 9 C%I*NT*.P*"0CD : P*"". .P*"0CD ; .'D*' +< P*"". .P*"0N/

Table1

Quer$2

Name DatabaseName TableName Name DatabaseName "Q% Params

TConsCli1F D+V*ND " 1F QConsCliCidade D+V*ND "


"*%*CT & F'./ CID D* 78*'* 1F0"# : =1F0"#

1F0"# > "trin2

*a5ela de Propriedades

9 +igura a seguir 1ostra a tela de 2onsulta de 2lientes4 Note :ue s8o 2olo2ados na parte de 2i1a da tela 2o1pon e n t e s TFdit para :ue o usuArio possa +a@er a pes:uis a antes de tra@er os dados para tela4 Nessa sele68oI en2ontra 1' se os 2a1pos ED e !ID9DE :ue repres e n t a 1 o rela2iona 1 e n t o da ta5ela prin2ipal PE))O9 2o1 as ta5elas ED e !ID9DE4 Portanto estas ta5elas ser8o utili@adas para per1itir o usuArio +a@er o +iltroI 1as n8o entra 1 no /*) * 1 - prin2ipal da tela4

Delphi Client/Server

17*

S @ (

' M P ( # " ' "

Dig %4-M *ela de !onsulta de !lientes4

Componente form1 Panel1 %abel1 %abel2 %abel%abel3 *dit1 *dit2 *dit*dit3 +utton1 button2 Data"ource1 Data"ource2 Data"ourcePanel2 Db#rid1 Panel+itbtn1 +itbtn2
*a5ela de Propriedades

Proprie"a"e Name Ca,tion li2n Ca,tion Ca,tion Ca,tion Ca,tion Name Name Name Name Name Ca,tion Name Ca,tion Name Data"et Name Data"et Name Data"et li2n Data"ource li2n @ind @ind

-alor frmConsCliente Clientes alTo, C?di2o Nome 1F Cidade edtCodi2o edtNome edt1F edtCidade btnPes(uisa Pes(uisa btnNo!o No!o D"/ain D/"istVendas.QConsCliente D"1F D/"istVendas.TConsCli1F D"Cidade D/"istVendas.QConsCliCidade alClient D"/ain al+ottom b).) b)Cancel

Delphi Client/Server

17,

S @ (

' M P ( # " ' "

Para o usuArio poder sele2ionar u1a 2idade e ou u1a ED utili@are 1o s u1 Grid :ue serA eBi5ido :uando ele posi2ionar no 2a1po de ED ou de !idade4

Dig %4-M Grid para per1itir a sele68o de u1 ED pelo usuArio4

Para +a@er1os essa 2onsultaI ire1os 2riar u1a tela 2o1 u1 Grid dentro 2o1o 1ostra do na +igura seguinteM

Dig %4#M Grid para 2onsulta4

Componente Form1 D+#rid1

Proprie"a"e Name +order"$le li2n .,tions

-alor frm#rid bsNone alClient Adg*itlesI

dg!olu1nRe si@ eI dg!olLinesI dg*a5sI dgRoH) ele2 tI dg!on+ir 1Dele t eI dg!a n2 elOnEBit B

*a5ela de Propriedades

De7e 1o s i1ple1 e n t a r ta15 K 1 os seguintes e7entosM


proce ure Tfrm&ri .#B&ri /Ke8Press('en er0 TO12ect3 var Ke80 C"ar,3 1e4in If Ke8 9 N/6 t"en 1e4in
Delphi Client/Server 17/

S @ (

' M P ( # " ' "

Mo alResult09mrO-3 en else if -e8 9 N5O t"en 1e4in Mo alResult09mrCancel3 en 3 en 3 proce ure Tfrm&ri .%ormClose('en er0TO12ect3 var Action0TCloseAction,3 1e4in Action09ca%ree3 en 3 proce ure Tfrm&ri .#B&ri /#1lClic-('en er0 TO12ect,3 1e4in Mo alResult09mrO-3 en 3 proce ure Tfrm&ri .%orm'"o!('en er0 TO12ect,3 var p/0TPoint3 1e4in P/.?09T%orm(O!ner,.ActiveControl.Left3 P/.809(T%orm(O!ner,.ActiveControl.Top D T%orm(O!ner,.ActiveControl.$ei4"t,3 P/09TControl(T%orm(O!ner,.ActiveControl.Parent,.ClientTo'creen(P/,3 If (P/.8 D /PE, * 'creen.$ei4"t t"en P/.809P/.8 F /PE F T%orm(O!ner,.ActiveControl.$ei4"t3 'etBoun s(P/.?<P/.8<5PE</PE,3 en 3

9 i1ple1 e n t a 6 8 o do e7ento $0+4 S C 0 < +a@ 2o1 :ue a 1orm seJa a5erta eBata 1 e n t e e15 aiBo dos 2o1pon e n t e s edits da tela de 2onsulta4 O 2digo da tela de 2onsulta +i2a ent8o da seguinte +or1aM
unit conscliente3 interface uses Jin o!s< Messa4es< '8sUtils< Classes< &rap"ics< Controls< %orms< #ialo4s< #1< Buttons< 't Ctrls< &ri s< #B&ri s< E?tCtrls< #BCtrls3 t8pe TfrmConsCliente 9 class(T%orm, Panel/0 TPanel3 Panel50 TPanel3 #B&ri /0 T#B&ri 3 e tCo i4o0 TE it3 La1el/0 TLa1el3 La1el50 TLa1el3 e tNome0 TE it3 1tnPesQuisa0 TButton3 Panel60 TPanel3 BitBtn/0 TBitBtn3 BitBtn50 TBitBtn3 #'Main0 T#ata'ource3 1tnNovo0 TButton3 #'U%0 T#ata'ource3 #'Ci a e0 T#ata'ource3 e tU%0 TE it3 e tCi a e0 TE it3 La1el60 TLa1el3 La1elK0 TLa1el3 proce ure 1tnNovoClic-('en er0 TO12ect,3
Delphi Client/Server 170

S @ (

' M P ( # " ' "

proce ure 1tnPesQuisaClic-('en er0 TO12ect,3 proce ure %ormCreate('en er0 TO12ect,3 proce ure %orm#estro8('en er0 TO12ect,3 proce ure e tU%Enter('en er0 TO12ect,3 proce ure e tCi a eEnter('en er0 TO12ect,3 private : Private eclarations ; Cm 'elect0 'trin43 pu1lic : Pu1lic eclarations ; sCo Ci a e0 'trin43 en 3 var frmConsCliente0 TfrmConsCliente3 implementation uses #mE/< :LR M.#%M; proce ure TfrmConsCliente.1tnNovoClic-('en er0 TO12ect,3 1e4in e tCo i4o.Clear3 e tNome.Clear3 e tU%.Clear3 e tCi a e.Clear3 en 3 proce ure TfrmConsCliente.1tnPesQuisaClic-('en er0 TO12ect,3 var sJ"ere<s'elect<sep0strin43 nPosOr erB80inte4er3 1e4in T7uer8(#'Main.#ata'et,.Close3 'ep09@@3 sJ"ere09@ An @3 s'elect09Cm 'elect3 If (e tCo i4o.Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs 9 Hs,@<=sJ"ere<'ep<@PE')C#@<e tCo i4o.Te?t>,3 'ep09@An @3 en 3 If (e tNome.Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs li-e @@HsHs@@, @< =sJ"ere<'ep<@PE')NM@<e tNome.Te?t<@H@>,3 'ep09@An @3 en 3 If (e tU%.Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs 9 @@Hs@@, @<=sJ"ere<'ep<@U%)'&@<e tU%.Te?t>,3 'ep09@An @3 en 3 If (e tCi a e.Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs 9 Hs, @<=sJ"ere<'ep<@CI#)C#@<sCo Ci a e>,3 'ep09@An @3 en 3 If 'ep G* @@ t"en 1e4in nPosOr erB809Pos(@OR#ER BY@< UpperCase(s'elect,,3 if nPosOr erB8 9 E t"en s'elect09s'elect D sJ"ere else Insert(sJ"ere<s'elect<nPosOr erB8,3 en 3
Delphi Client/Server 171

1ta1les< Cons&ri 3

S @ (

' M P ( # " ' "

T7uer8(#'Main.#ata'et,.'7L.Te?t09s'elect3 T7uer8(#'Main.#ata'et,.Open3 en 3 proce ure TfrmConsCliente.%ormCreate('en er0 TO12ect,3 1e4in Cm 'elect09T7uer8(#'Main.#ata'et,.'7L.TE?t3 #'U%.#ata'et.Open3 en 3 proce ure TfrmConsCliente.%orm#estro8('en er0 TO12ect,3 1e4in #'U%.#ata'et.Close3 #'Ci a e.#ata'et.close3 T7uer8(#'Main.#ata'et,.'7L.TE?t09Cm 'elect3 en 3 proce ure TfrmConsCliente.e tU%Enter('en er0 TO12ect,3 1e4in frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'U%3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'U%.#ata'et.IsEmpt8, t"en 1e4in TE it('en er,.Te?t09#'U%.#ata'et=@U%)'&@>3 e tCi a e.Clear3 en 3 en 3 proce ure TfrmConsCliente.e tCi a eEnter('en er0 TO12ect,3 1e4in #'Ci a e.#ata'et.Close3 T7uer8(#'Ci a e.#ata'et,.Params=E>.value09e tU%.Te?t3 #'Ci a e.#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'Ci a e3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'Ci a e.#ata'et.IsEmpt8, t"en 1e4in TE it('en er,.Te?t09#'Ci a e.#ata'et=@CI#)NM@>3 sCo Ci a e09#'Ci a e.#ata'et.%iel B8Name(@CI#)C#@,.As'trin43 en 3 en 3 en .

!ela de Manuteno !o1o so1en t e u1 registro K tra@ido na tela de 1anut e n 6 8 oI pode' se eBplorar 1ais o sentido hori@ontalI tra@endo in+or1a6C e s 1ais detalha d a s 4 PorK1I respeitan d o ainda a regra de n8o tra@er in+or1a6C e s ainda n8o re:uisitad a s pelo usuArio4 Por eBe 1ploI pode ser :ue a tela da 1anut e n6 8 o apres e n t e' se di7idida e1 P+i2hasQ ou PpAginaQ4 )e a in+or1a6 8 o de u1a pAgina te1 :ue a2ess ar u1a outra ta5ela :ue n8o seJa a ta5ela prin2ipalI pode' se esper ar o usuArio sele2ionar a pAgina para ent8o 5us2ar essas in+or1a6C e s no 5an2o de dados4

Delphi Client/Server

172

S @ (

' M P ( # " ' "

Para i1ple1e n t a r 1 o s a tela de 1anut e n6 8 o de 2lientesI de7e 1o s pri1eiro 2riar o &ataSet respons A7 el pela 5us2a dos dados no 5an2o4 Etili@are 1os u1 2o1pon e n t e T7uerI 2o1 u1 2o1an do )=L sele2ionan d o dados de :uatro ta5elas do 5an2o de dadosM PE))O9I !LIEN*EI !ID9DEI ED4 9lK1 disso serA +eito u1 +iltro pelo 2digo da pesso a para :ue seJa sele2ionado apen a s u1 registro no 5an2o de dados4 Desta +or1a redu@ire 1o s o nL1ero de linhas e au1e n t a r e 1 o s a :uantidad e de in+or1a6C e s so5re u1 deter 1in a d o 2liente4

Dig %4%M Data Module4

Componente Quer$1

Proprie"a"e Name DatabaseName Cac6ed1,date 1,date.b4ect "Q%

-alor Qcliente D+V*ND " T'1* 1"Pessoa


"*%*CT P*"". .P*"0CD, P*"". .P*"0N/, P*"". .P*"0TP , P*"". .P*"0C#CCPF , P*"". .P*"0%.#' D.1'. , P*"". .P*"0N1/*'. , P*"". .P*"0C./P%*/*NT. , P*"". .P*"0+ I''. , P*"". .CID0CD , P*"". .1F0"# , P*"". .P*"0DT0N "C , P*"". .CID0CD0N "C , P*"". .1F0"#0N "C , C%I*NT*.C%I0%I/IT*C'*DIT. , C%I*NT*.C%I0D*+IT. , CID D*.CID0N/ , 1F.1F0N/ F'./ P*"". P*"". , C%I*NT* C%I*NT*, CID D* CID D*, 1F 1F 78*'* P*"". .P*"0CD : C%I*NT*.P*"0CD ND P*"". .CID0CD : CID D*.CID0CD ND P*"". .1F0"# : CID D*.1F0"# ND CID D*.1F0"# : 1F.1F0"# ND P*"". .P*"0CD: =P*"0CD .'D*' +< P*"". .P*"0N/

1,date"Q%1
*a5ela de Propriedades

Params Name TableName

P*"0CD > Inte2er 1"Pessoa P*"".

Pode1o s agoraI 2onstruir a tela de 1anut e n 6 8 o 2o1o 1ostra as +iguras seguintesM

Delphi Client/Server

174

S @ (

' M P ( # " ' "

Dig %4$M *ela de Manuten68o de !lientes ,PAg .4

Dig %4 (M *ela de Manuten68o de !lientes ,PAg 2.4

Delphi Client/Server

175

S @ (

' M P ( # " ' "

Dig %4

M *ela de Manuten68o de !lientes ,PAg /.4

Componente Form1 Panel1 ",eed+utton1 ",eed+utton2 ",eed+utton",eed+utton3 ",eed+utton5 Pa2eControl1 Tab"6eet1 Tab"6eet2 Tab"6eetData"ource1 D+Controls
*a5ela de Propriedades

Proprie"a"e Name Ca,tion li2n Name Name Name Name Name li2n Ca,tion Ca,tion Ca,tion Name Data"et .....

-alor frmCliente Clientes alTo, btn ,,end btnDelete btn"a!e btnDiscard btn"earc6 alClient InformaCes #erais Pessoa FDsica CrEditos D"/ain D/"istVendas.Qcliente .....

Os e7entos dos 5otCes de edi68o ser8o de+inidos de 1an eira si1ilar ao padr8o utili@ado pela tela de produtoI +i2ando 2ada u1 da seguinte +or1aM
proce ure TfrmCliente.1tnAppen Clic-('en er0 TO12ect,3 1e4in If Not #'Main.#ata'et.Active t"en 1e4in #'Main.#ata'et.Open3 en 3 #'Main.#ata'et.Appen 3 en 3 proce ure TfrmCliente.1tn#eleteClic-('en er0 TO12ect,3 1e4in #'Main.#ata'et.#elete3 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3
Delphi Client/Server 117

S @ (

' M P ( # " ' "

#'Main.#ata'et.close3 en 3 proce ure TfrmCliente.1tn'aveClic-('en er0 TO12ect,3 1e4in TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 en 3 proce ure TfrmCliente.1tn#iscar Clic-('en er0 TO12ect,3 1e4in If TB#E#ata'et(#'Main.#ata'et,.Up atesPen in4 t"en TB#E#ata'et(#'Main.#ata'et,.CancelUp ates else TB#E#ata'et(#'Main.#ata'et,.Cancel3 If TB#E#ata'et(#'Main.#ata'et,.IsEmpt8 t"en 1e4in TB#E#ata'et(#'Main.#ata'et,.close3 en 3 en 3

O 5ot8o de PPes:uisaQ irA 2ha1ar a tela de 2onsulta de 2lientes para :ue o usuArio possa es2olher u1 deter 1in a d o 2liente para tra5alhar4 Depois de es2olhidoI in+or1a6C e s 1ais detalha d a s desse 2liente s8o tra@idas para a tela de 1anut e n 6 8 o para :ue possa 1 ser 7isuali@ada s e editad a s pelo usuArio4
proce ure TfrmCliente.1tn'earc"Clic-('en er0 TO12ect,3 1e4in #'Main.#ata'et.Close3 frmConsCliente09TfrmConsCliente.Create('elf,3 If (frmConsCliente.'"o!Mo al9mrO-, an (Not (frmConsCliente.#'Main.#ata'et=@PE')C#@> 9 Null,, t"en 1e4in T7uer8(#'Main.#ata'et,.Params=E>.value09 frmConsCliente.#'Main.#ata'et=@PE')C#@>3 #'Main.#ata'et.Open3 en 3 frmConsCliente.free3 en 3

Pode1o s utili@ar a prpria 1A:uina de estado do &ataSource +orne2ida pelo Delphi para 2ontrolar a ha5ilita68o dos 5otCesM
proce ure TfrmCliente.#'Main'tateC"an4e('en er0 TO12ect,3 1e4in Case #'Main.'tate of sInactive0 1e4in 1tnAppen .Ena1le 09TRUE3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 en 3 sInsert0 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3
Delphi Client/Server 111

S @ (

' M P ( # " ' "

1tn'earc".Ena1le 09%AL'E3 en 3 sE it0 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en 3 sBro!se0 1e4in 1tnAppen .Ena1le 09TRUE3 1tn#elete.Ena1le 09TRUE3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 en 3 en 3 en 3

Para +inali@ar de7e 1o s +e2har o &ataSet antes de sair1os da tela de 1anut e n6 8 oI i1ple1 e n t a n d o o e7ento O2C)0/ * da seguinte +or1aM
proce ure TfrmCliente.%ormClose('en er0 TO12ect3 var Action0 TCloseAction,3 1e4in #'Main.#ata'et.Close3 en 3

"ecursos de (ooG$p EBiste1 7Arias +or1as de +orne2er para o usuArio u1a pes:uisa e1 registros de ta5elas se2und Arias rela2ionad a s 2o1 a ta5ela prin2ipal4 Esse re2ursoI 1uitas 7e@es 2ha1 a d o de PlooTupQ de7e pro7er i1ple1e n t a 6 C e s para as tr>s +ases seguintesM Preen2h er e eBi5ir u1a lista ou ta5ela de registros para per1itir a es2olha do usuArioZ 9o se es2olher u1 registroI de7e' se atuali@ar o 2digo rela2ionado na ta5ela prin2ipalZ =uando +or sele2ionado u1 registro na ta5ela prin2ipalI de7e' se sele2ionar o registro 2orrespond e n t e na ta5ela se2und AriaI per1itindo a eBi5i68o de alguns 2a1pos 2o1o a des2ri68o4
Campo (ooG$p do Delphi

O Delphi per1ite a 2ria68o de 2a1pos PlooTup^sQ dentro de u1 datas et para apres e n t a r u1a lista 2o1 os registros de u1a outra ta5ela rela2ionad a4 Esse re2urso i1ple1e n t a as tr>s +ases dis2utidas a2i1a da seguinte +or1aM Dase 4 9 lista K preen2hida atra7K s de u1 &ataSet :ue sele2iona os registros da ta5ela rela2ionad a4 R utili@ado 2o1pon e n t e s com4o 4o= ou list 4o= para apres e n t a r a lista4 =uando utili@ado
11*

Delphi Client/Server

S @ (

' M P ( # " ' "

com4o 4o= I a parte edit n8o K ha5ilitad a para edi68oI +or6ando o usuArio a real1e n t e es2olher u1 ele1e n t o 7Alido da lista4 !o1o K utili@ado u1 2o1pon e n t e &ataSet para pro7er a sele68oI K possG7el atri5uir +iltros ao Presult setQI desde :ue n8o in7ia5ili@e a +ase /4 =uando o re2urso K i1ple1e n t a d o direta 1 e n t e atra7Ks dos 2o1pon e n t e s ,2o15o 5oB e list 5oB. per1ite :ue o usuArio 7isuali@e 1ais de u1 2a1po ao 1es 1o te1po para sele68o4 Para se a5rir a lista de op6Ces K ne2ess Ario o57ia1 e n t e :ue o &ataSet esteJa a5erto4 Dase 24 =uando K sele2ionado u1 registro da listaI auto1 a ti2a 1 e n t e K +eita a atuali@a68o do 2a1po da ta5ela prin2ipal rela2ionado 2o1 a 2ha7e pri1Aria da ta5ela utili@ada para sele68o4 Dase /4 N8o K ne2ess Aria a parti2ipa68o da des2ri68o ou de :ual:uer outro 2a1po :ue se deseJe 7isuali@ar da ta5ela se2und Aria no 2o1an do /*) * 1 - da ta5ela prin2ipal4 =uando o 2a1po ,2ha7e estran g eira. da ta5ela prin2ipal :ue se rela2iona 2o1 a ta5ela se2und Aria K tra@ido para a telaI auto1 a ti2a 1 e n t e o Delphi pro2ura no &ataSet se2und Ario o registro e 1ostra os 2a1pos des2riti7os da ta5ela se2und Aria4 PortantoI todas as linhas da ta5ela se2und Aria de7e 1 estar disponG7eis na esta68 o 2liente para :ue :ual:uer 2digo seJa en2ontra d o4 Por isso K pre2iso to1ar 5asta nt e 2uidado na atri5ui68o de +iltros para per1itir :ue os registros ne2ess Arios seJa1 en2ontra do s pelo Delphi4 9 prin2ipal 7antag e 1 dess e 1Ktodo K a +a2ilidade de i1ple1e n t A' lo no Delphi4 9lK1 disso ele si1pli+i2a o 2o1and o )=L utili@ado para a ta5ela prin2ipalI JA :ue n8o ne2essita da parti2ipa68o de outras ta5elas no /*) * 1 - 4 Mas de7e' se to1ar 2uidado 2o1 sua utili@a68o :uando as ta5elas rela2ionad a s possue 1 1uitos registros por:ue 5asi2a 1 e n t e todos os registros ter8o :ue ser tra@idos para a 1A:uina do usuArio pela rede4 I1agine sele2ionar atra7Ks dess e re2urso u1a ta5ela de 2lientes 2o1 2er2a de 4(((4((( de registros4 9pesar da possi5ilidade de se atri5uir +iltros ao &ataSet respons A7 el e1 popular a listaI isto K di+G2il de7ido a ne2essidad e da +ase tr>s de en2ontrar o registro atra7Ks do 2digo4 )e +iltros +ore1 2olo2adosI pode ser :ue esse registro n8o seJa en2ontra d o4 Outro +ator :ue de7e ser o5ser7ad o K a :uantidad e de ta5elas rela2ionad a s 2o1 a ta5ela prin2ipal4 )e a ta5ela prin2ipal possuir 1uitas ta5elas rela2ionad a s I para a5rir a ta5ela prin2ipal K ne2es s Ario a5rir ta15 K 1 todas as ta5elas se2und Arias o :ue pode preJudi2ar 1uito a per+or1a n2 e ness e ponto4

Delphi Client/Server

11,

S @ (

' M P ( # " ' "

#utros MNtodos

9pesar do nosso eBe1plo da tela de 2liente tratar ta5elas pe:ue n a s 2o1o ED e 2idadeI tentar e 1 o s 1ostrar a utili@a68o de re2ursos alterna ti7os :uando o 1Ktodo PlooTupQ do Delphi n8o +or satis+atrio4 Dase 4 Etili@are 1os o 1es 1o re2urso utili@ado na tela de 2onsulta de 2lientes para propi2iar a sele68o de u1 registro se2und Ario na tela de 1anut e n6 8 o de 2lientes4 =uando o usuArio posi2ionar nos 2a1pos da ta5ela prin2ipal :ue se rela2iona 1 2o1 as ta5elas se2und AriasI u1 PgridQ serA eBi5ido para per1itir a es2olha4

Dase 24 9 atuali@a68o dos 2a1pos da ta5ela prin2ipal K +eita :uando o usuArio +e2ha a tela de pes:uisa es2olhendo u1a das op6Ces4 Dase /4 Para e7itar :ue os &ataSets respons A 7 eis pelas ta5elas se2und Arios ne2es site 1 ser a5ertos para a sele68o de u1 registro da ta5ela prin2ipalI in2luG1os os 2a1pos de des2ri68o no prprio 2o1an do /*) * 1 - 4 Mais adiant eI nos prBi1os 2apGtulosI tentare 1 o s 1elhorar ainda 1ais esse re2ursoI per1itindo ao usuArio a atri5ui68o de +iltros4 Portanto os e7entos O2E2- *+ dos 2a1pos rela2ionados ED\)G e !ID\!D +i2a1 da seguinte +or1aM
proce ure TfrmCliente.#BE itREnter('en er0 TO12ect,3 1e4in If #'Main.'tate G* sInactive t"en 1e4in If Not #'U%.#ata'et.Active t"en #'U%.#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'U%3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'U%.#ata'et.IsEmpt8, t"en 1e4in If #'Main.'tate 9 sBro!se t"en #'Main.#ata'et.E it3 #'Main.#ata'et=@U%)'&@>09#'U%.#ata'et=@U%)'&@>3 #'Main.#ata'et=@U%)NM@>09#'U%.#ata'et=@U%)NM@>3 #'Main.#ata'et=@CI#)NM@>09@@3 #'Main.#ata'et=@CI#)C#@>09Null3 en 3 en 3 en 3 proce ure TfrmCliente.#BE itSEnter('en er0 TO12ect,3 1e4in If #'Main.'tate G* sInactive t"en 1e4in #'Ci a e.#ata'et.Close3 T7uer8(#'Ci a e.#ata'et,.Params=E>.As'trin409 #'Main.#ata'et.%iel B8Name(@U%)'&@,.As'trin43 #'Ci a e.#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'Ci a e3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'Ci a e.#ata'et.IsEmpt8, t"en 1e4in If #'Main.'tate 9 sBro!se t"en #'Main.#ata'et.E it3 #'Main.#ata'et=@CI#)NM@>09#'Ci a e.#ata'et=@CI#)NM@>3 #'Main.#ata'et=@CI#)C#@>09#'Ci a e.#ata'et=@CI#)C#@>3 en 3 en 3
Delphi Client/Server 11/

S @ (

' M P ( # " ' "

en 3

6uscando "egistros de outras !a=Sheets Para n8o se PpesarQ 1uito o 2o1and o /*) * 1 - da ta5ela prin2ipalI n8o +oi in2luGda a 5us2a da des2ri68o da ED e !ID9DE de nas2i1e n to :ue est8o lo2ali@ados e1 u1a outra Ta4She e t 4 N8o 7ale a pena a2res2e nt ar 1ais duas ta5elas na 2lAusula A+04 do 2o1and oI sendo :ue o usuArio pode ne1 se :uer entrar na pAgina onde se en2ontra 1 os dados4 De7e' se se1pr e seguir o le1a de n8o tra@er para a apli2a68o in+or1a6C e s :ue o usuArio ainda n8o pediu para 7er ou editar4 )e dados de u1a ta5ela se2und Aria s ser8o 7istos se o usuArio sele2ionar deter 1ina d a Ta4She e t I pode' se posterg ar sua 5us2a para :uando a Ta4She e t +or sele2ionad a4 Entretan toI :uando as in+or1a6C e s est8o e1 u1a 1es 1 a ta5ela JA utili@ada no 2o1and o /*) * 1 - para tra@er os dados da Ta4She e t ini2ialI n8o 7ale a pena en7iar outro /*) * 1 - para 5us2ar o restant e das in+or1a6C e s de u1a 1es 1 a ta5ela4 9 i1ple1e n t a 6 8 o do 2digo +i2a ent8o 2o1o a seguirM
proce ure TfrmCliente.Pa4eControl/C"an4e('en er0 TO12ect,3 1e4in If (Pa4eControl/.ActivePa4e 9 Ta1'"eet5, an (#'Main.'tate 9 sBro!se, t"en 1e4in If #'Main.#ata'et=@U%)'&)NA'C@> G* Null t"en 1e4in #M'istIen as.7&eral.'7L.Te?t09 @select U%)NM from U% !"ere U%)'& 9 @@@ D #'Main.#ata'et=@U%)'&)NA'C@> D @@@@3 #M'istIen as.7&eral.Open3 E tU%NmNasc.Te?t09#M'istIen as.7&eral=@U%)NM@>3 #M'istIen as.7&eral.close3 en else 1e4in E tU%NmNasc.Te?t09@@3 en 3 If #'Main.#ata'et=@CI#)C#)NA'C@> G* Null t"en 1e4in #M'istIen as.7&eral.'7L.Te?t09 @select CI#)NM from Ci a e !"ere CI#)C# 9 @ D #'Main.#ata'et.%iel B8Name(@CI#)C#)NA'C@,.As'trin4 D @ an U%)'& 9 @ D #'Main.#ata'et.%iel B8Name(@U%)'&)NA'C@,.As'trin43 #M'istIen as.7&eral.Open3 E tCi NmNasc.Te?t09#M'istIen as.7&eral=@CI#)NM@>3 #M'istIen as.7&eral.close3 en else 1e4in E tCi NmNasc.Te?t09@@3 en 3 en 3 en 3 proce ure TfrmCliente.#BE it/KEnter('en er0 TO12ect,3 1e4in If #'Main.'tate G* sInactive t"en 1e4in If Not #'U%.#ata'et.Active t"en #'U%.#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'U%3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'U%.#ata'et.IsEmpt8, t"en 1e4in If #'Main.'tate 9 sBro!se t"en #'Main.#ata'et.E it3 #'Main.#ata'et=@U%)'&)NA'C@>09#'U%.#ata'et=@U%)'&@>3
Delphi Client/Server 110

S @ (

' M P ( # " ' "

#'Main.#ata'et=@CI#)C#)NA'C@>09Null3 e tU%NmNasc.Te?t09#'U%.#ata'et=@U%)NM@>3 e tCi NmNasc.Te?t09@@3 en 3 en 3 en 3 proce ure TfrmCliente.#BE it/6Enter('en er0 TO12ect,3 1e4in If #'Main.'tate G* sInactive t"en 1e4in #'Ci a e.#ata'et.Close3 T7uer8(#'Ci a e.#ata'et,.Params=E>.As'trin409 #'Main.#ata'et.%iel B8Name(@U%)'&)NA'C@,.As'trin43 #'Ci a e.#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'Ci a e3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'Ci a e.#ata'et.IsEmpt8, t"en 1e4in if #'Main.'tate 9 sBro!se t"en #'Main.#ata'et.E it3 e tCi NmNasc.Te?t09#'Ci a e.#ata'et=@CI#)NM@>3 #'Main.#ata'et=@CI#)C#)NA'C@>09#'Ci a e.#ata'et=@CI#)C#@>3 en 3 en 3 en 3

Controlando !ransaDes =uando se tra5alha 2o1 5an2o de dados rela2ionaisI pode' se utili@ar o re2urso de trans a6 8 o para e+eti7ar o pro2esso 2o1o u1 todo ou 7oltar todas as atuali@a6Ce s desde o inG2io do pro2esso 2aso algu1 erro o2orra4 E1 nosso eBe1ploI por en:u a nt oI a 1anut e n 6 8 o de 2lientes estA sendo +eita so1e nt e na ta5ela de PE))O94 Para :ue ele +i:ue 2orreto de a2ordo 2o1 a lgi2a de neg2io da apli2a68oI de7e 1o s atuali@ar ta15 K 1 a ta5ela de !LIEN*E nas 1anut e n 6C e s +eitas pelo usuArio4 PortantoI :uando inseri1os u1 registro de7e 1o s inserG' lo na ta5ela de PE))O9 e ta15 K 1 na ta5ela de !LIEN*E4 E essa inser68o de7e estar dentro de u1a trans a6 8 oI para :ue esse pro2esso seJa +eito 2o1o u1 todo4 Ou inseri1os nas duas ta5elas ou e1 nenhu 1 a I 1ant e n d o assi1 a integridad e dos dados no 5an2o4 9 1es 1 a 2oisa de7e ser +eita para as altera6C e s e eB2lusCes4 Para eBe2ut ar 1 o s as opera6C e s de inser68oI altera6 8 o e eB2lus8o nas duas ta5elas pode 1o s utili@ar dois 2o1pon e n t e s 2pdateS7* 4 9ssi1I n8o serA 1ais possG7el utili@ar a proprieda d e U7:,- * O .J * 1 - do 2o1pon e n t e T7uerI para de+inir :ual dos dois 2o1pon e n t e s serA utili@adoI JA :ue :uere 1 o s utili@ar os dois4 De7e 1o s ent8o utili@arI ao in7Ks dess a proprieda d eI u1 e7ento do 2o1pon e n t e T7uerI 2ha1a d o O2U7: , - * R * 1 0 + : 4 9tra7Ks dess e e7entoI pode 1o s 2ha1ar 2ada u1 dos 2o1and os +orne2idos pelos 2o1pon e n t e s 2pdateS7* e +a@er todas as atuali@a6Ce s ne2ess Arias nas ta5elas4
Delphi Client/Server 111

S @ (

' M P ( # " ' "

Dig %4 2M Data Module4

proce ure T#M'istIen as.7ClienteUp ateRecor (#ata'et0 T#ata'et3 Up ateKin 0 TUp ateKin 3 var Up ateAction0 TUp ateAction,3 1e4in If Not Assi4ne (U'Pessoa.#ata'et, t"en 1e4in U'Pessoa.#ata'et09TB#E#ata'et(#ata'et,3 U'Cliente.#ata'et09TB#E#ata'et(#ata'et,3 en 3 if Up ateKin 9 u-#elete t"en 1e4in U'Cliente.Appl8(Up ateKin ,3 U'Pessoa.Appl8(Up ateKin ,3 en else 1e4in U'Pessoa.Appl8(Up ateKin ,3 U'Cliente.Appl8(Up ateKin ,3 en 3 Up ateAction09uaApplie 3 en 3

Na i1ple1 e n t a 6 8 oI de7e 1o s pri1eira 1 e n t e ini2iali@ar a propried a d e D,-,S * - dos 2o1pon e n t e s 2pdateS7* 2aso seJa a pri1eira 7e@ :ue o 2digo esteJa sendo eBe2ut a d o4 9 seguir K utili@ado o 1Ktodo A77)8 dos 2o1pon e n t e s 2pdateS7* para eBe2ut ar o 2o1and o )=L de a2ordo 2o1 a in+or1a6 8 o pass ad a pelo <DE de :ual opera68 o estA sendo reali@ada4 )e a opera68 o +or de eB2lus8oI ire1os eB2luir pri1eiro na ta5ela de !LIEN*E e depois na ta5ela de PE))O9 para 1ant er a integridad e4 E o 2ontrArio K +eito no 2aso de inser6Ces e altera6C e s de registros4 )e a opera68 o +or reali@ada 2o1o su2essoI ire1os de+inir o parO 1 e tr o U7:,- *A 1 -( 0 2 2o1o sendo Pua9ppliedQ :ue per1ite :ue 1ais tarde o registro seJa retirado do P2a2hed updat eQ atra7Ks do 2o1an do C044(-U 7 : , - * / 4 )e algu1 erro o2orrer de+ine o parO 1 e tr o 2o1o PusDailQ e 2ontinua a propag a6 8 o do erro para :ue o 2ontrole de trans a6 8 o +eito na tela de 2liente possa +a@er o Proll5a2TQ no 5an2o de dados4 De7e 1o s agora +a@er algu1 a s 1odi+i2a6Ces na tela de 1anut e n 6 8 o de 2lientes para i1ple1e n t a r o 2ontrole de trans a6 8 o4 Pri1eiro 7a1os 2riar u1a pro2edur e no7a para 2uidar da ha5ilita68o dos
Delphi Client/Server 112

S @ (

' M P ( # " ' "

5otCes4 Retira' se o 2digo :ue esta7 a no e7ento O2S-, - *C C , 2 3 * do &ataSource e o 2olo2a nessa no7a pro2edur e 2o1 algu1a s 1odi+i2a6Ces4
proce ure TfrmCliente.Ena1leBtnControls3 1e4in Case #'Main.'tate of sInactive0 1e4in 1tnAppen .Ena1le 09TRUE3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 en 3 sInsert0 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en 3 sE it0 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en 3 sBro!se0 If T7uer8(#'Main.#ata'et,.Up atesPen in4 t"en 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en else 1e4in 1tnAppen .Ena1le 09TRUE3 1tn#elete.Ena1le 09TRUE3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 en 3 en 3 en 3

9gora pode 1o s 1odi+i2ar os e7entos de gra7a68 o e eB2lus8oM


proce ure TfrmCliente.1tn#eleteClic-('en er0 TO12ect,3 1e4in #M'istIen as.#ata1ase/.'tartTransaction3 tr8 #'Main.#ata'et.#elete3 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 #M'istIen as.#ata1ase/.Commit3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 #'Main.#ata'et.close3 e?cept #M'istIen as.#ata1ase/.Roll1ac-3 TB#E#ata'et(#'Main.#ata'et,.CancelUp ates3 en 3
Delphi Client/Server 114

S @ (

' M P ( # " ' "

en 3 proce ure TfrmCliente.1tn'aveClic-('en er0 TO12ect,3 1e4in #M'istIen as.#ata1ase/.'tartTransaction3 tr8 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 #M'istIen as.#ata1ase/.Commit3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 Ena1leBtnControls3 e?cept #M'istIen as.#ata1ase/.Roll1ac-3 en 3 en 3

Mantendo o "esult Set da Consulta *oda 7e@ :ue a tela de 2onsulta de 2lientes K a5ert a o &ataSet estA +e2hado para per1itir u1a no7a pes:uis a do usuArio4 No entantoI pode' se optar e1 1ant er o Llti1o Presult setQ +eito :uando se a5rir a tela no7a 1 e n t e I supondo :ue o usuArio tenha u1a grande 2han2e de en2ontrar o prBi1o registro para 1anut e n 6 8 o no prprio 2onJunto de linhas retorna do pela pes:uis a anterior4 Para +a@er isso de7e 1o s alterar o 2digo da tela de 2onsulta para :ue ela n8o +e2he o &ataSet :uando o +or1 +or destruGdo4 9lK1 disso algu1 a s outras altera6C e s de7e 1 ser +eitas4 De7e 1o s alterar os seguinte s e7entos do +or1M
proce ure TfrmConsCliente.%ormCreate('en er0 TO12ect,3 1e4in TT Cm 'elect09T7uer8(#'Main.#ata'et,.'7L.TE?t3 Cm 'elect09#M'istIen as.Cm 'elect7Cliente3 If Not #'U%.#ata'et.Active t"en #'U%.#ata'et.Open3 en 3 proce ure TfrmConsCliente.%orm#estro8('en er0 TO12ect,3 1e4in TT#'Ci a e.#ata'et.close3 TTT7uer8(#'Main.#ata'et,.'7L.TE?t09Cm 'elect3 en 3

De7e 1o s ta15 K 1 de2larar e ini2iali@ar a 7ariA7el C4:S *) * 1 - QC)( * 2 - * no &ata+odule para ar1a@ e n a r o 2o1and o original da P:uerFQ4
private : Private eclarations ; pu1lic : Pu1lic eclarations ; Cm 'elect7Cliente0 'trin43 en 3

proce ure T#M'istIen as.#M'istIen asCreate('en er0 TO12ect,3 1e4in


Delphi Client/Server 115

S @ (

' M P ( # " ' "

Cm 'elect7Cliente097ConsCliente.'7L.Te?t3 en 3

Da@endo essas altera6C e sI :uando se a5re no7a 1 e n t e a tela a Llti1a 2onsulta +eita pelo usuArio per1a n e 2 e ati7a4 Entretan toI de7e' se ter 2uidado 2o1 essa a5ordag e 1 4 )e o Presult setQ per1a n e 2 e r a5erto e esse possuir 1uitas linhas :ue ainda n8o +ora1 tra@idas para apli2a68oI essas pode 1 ser tra@idas :uando o usuArio reali@ar u1a 1anut e n6 8 o no registro e sal7ar as altera6C e s4 !o1o +oi 7istoI para alguns 5an2os de dados o Delphi reali@a a 5us2a pre1 a t ur a dos registro de u1 Presult setQ pende n t e antes de reali@ar o 104 4 (- 4 PortantoI de7e' se optar pelo 1elhor dese 1 p e n h o e +un2ionalidad e para o usuArio de a2ordo 2o1 o 5an2o de dados4 9s op6Ces para os 5an2os :ue n8o suporta 1 1ant er u1 2ursor a5erto aps o +e2ha 1 e n t o da trans a6 8 o seria1M *entar 1ini1i@ar o nL1ero de registros :ue ser8o tra@idos na 2onsulta +or6ando o usuArio a atri5uir algu1 tipo de +iltro4 Etili@ar u1a outra 2oneB8oI atra7K s de u1 outro 2o1pon e n t e &ata4as e para se +a@er a 2onsultaI desta +or1a a +inali@a68o da trans a6 8 o de u1a 2oneB8o n8o inter+ere na outra4 Entreta n toI essa op68o 2ostu1 a 2onsu 1ir u1 nL1ero 1aior de li2en6as de usuArios do 5an2o de dados4 Nor1al1e n t eI 2ada 2oneB8o 2orrespon d e ao uso de u1a li2en6a4 *entar utili@ar na tela de 2onsulta u1 2o1pon e n t e TTa4le ao in7Ks do 2o1pon e n t e T7uerI 4 !o1o +oi 7isto o 2o1pon e n t e TTa4le possui u1 2o1porta 1 e n t o 1ais inteligent e no 2aso do +e2ha 1 e n t o da trans a6 8 oI JA :ue per1ite :ue o 2ursor seJa +e2hado e :uando hou7er a ne2es sida d e de 2a1inh ar por linhas ainda n8o tra@idas dispara u1 no7o 2o1an do /*) * 1 - 4 Entreta nt oI esse 2o1pon e n t e 2ostu 1 a a5rir u1a trans a6 8 o e pode estar 1ant e n d o algu1 registro tra7adoI depend e n d o do 5an2o de dados utili@ado4

Delphi Client/Server

1*7

S @ (

' M P ( # " ' "

Delphi Client/Server

1*1

S @ (

' M P ( # " ' "

Controlando !ransaDes Master/Detail


Fss e ca p:tulo m o s tra co m o i m pl e m e n t ar t elas q u e e =ig e m u m controle d e trans a./o do tipo +ast er!&et ail.

Captulo

tra7Ks do re2urso de 2ontrole de trans a6C e s disponG7eis nos ser7idores de 5an2o de dadosI K possG7el 2onstruir apli2a6Ces :ue 1ant e n h a 1 a uni2idade lgi2a de u1 2onJunto de opera6C e s4 Muitas 7e@es K ne2ess Ario :ue as atuali@a6Ces e1 7Arias ta5elas seJa1 +eitas e1 2onJunto para :ue a integridad e dos dados seJa preser7 a d a 4 )e :ual:uer pro5le1 a +or en2ontra d o durant e a trans a6 8 oI os dados de7e 1 retornar aos seus 7alores originais antes do inG2io da trans a6 8 o4

E1 algu1 a s apli2a6CesI para 1ant er a integridad e dos dados atra7K s do 2ontrole de trans a6 8 o K ne2ess Ario inserir u1 registro de u1a ta5ela prin2ipal Junta 1 e n t e 2o1 7Arios outros registros rela2ionados de u1a segund a ta5ela4 R o 2aso por eBe 1plo de u1a tela de entrad a de pedidos4 E1 u1 2adas tro de pedido K inserido dados do 2a5e6 alho ,nL1eroI 2lienteI 7endedorI data. e dados de 2ada ite1 :ue estA sendo 7endido4 R 2o1u 1 :ue as regras de neg2io :ue a apli2a68o de7a seguirI i1ponha :ue o pedido de7a ser inserido 2o1o u1 todo ,2a5e6alho e seus itens.I ou seJaI e1 u1 Lni2a trans a6 8 o4 9 esse tipo de tela K dado o no1e de Master;DetailI ou seJaI a ta5ela 1estre e seus detalhes4 No eBe 1plo de pedidoI a entidad e 1ast er K repres e n t a d a pela ta5ela de PEDIDO e a entidad e detalhe K repres e n t a d a pela ta5ela de I*EM4

!ela de Consulta
Pode1o s 2o1e6 ar de+inindo nossa tela de 2onsultaI :ue o usuArio irA utili@ar para pes:uisar u1 pedidoI assi1 2o1o +oi +eito para a tela de 2lientes4 Etili@are 1os 1ais tr>s 2o1pon e n t e s T7uerI :ue ser8o 2olo2ados no &ata +odule 4

Delphi Client/Server

1**

DigM $4 M Data Module4

Componente Quer$1

Proprie"a"e Name DatabaseName "Q%

-alor QConsPed D+V*ND "


"*%*CT P*DID..P*D0CD , P*DID..P*D0DT , P*DID..P*D0V %.' , P*DID..P*D0TIP. F'./ P*DID. P*DID. .'D*' +< P*DID..P*D0CD

Quer$2

Name DatabaseName "Q%

QConsPedCliente D+V*ND "


"*%*CT P*"". .P*"0CD , P*"". .P*"0N/ F'./ C%I*NT* C%I*NT* , P*"". P*"". 78*'* 9 C%I*NT*.P*"0CD : P*"". .P*"0CD ; .'D*' +< P*"". .P*"0N/ &.bs= DeiFe a (uarta lin6a em branco

Quer$-

Name DatabaseName "Q%

QConsPedVend D+V*ND "


"*%*CT P*"". .P*"0CD , P*"". .P*"0N/ F'./ V*ND*D.' V*ND*D.' , P*"". P*"". 78*'* 9 V*ND*D.'.P*"0CD : P*"". .P*"0CD ; .'D*' +< P*"". .P*"0N/

*a5ela de Propriedades

De7e 1o sI agoraI 1ontar a tela 2o1o a +igura a seguirM

Delphi Client/Server

1*,

Dig $42M *ela de !onsulta de Pedidos4

Componente form1 Data"ource1 Data"ource2 Data"ourcePanel1 *dit... button1 button2 Panel2 D+#rid1 Panelbitbtn1 bibtn2
*a5ela de Propriedades

Proprie"a"e Name Ca,tion Name Data"et Name Data"et Name Data"et li2n Name Name Ca,tion Name Ca,tion li2n li2n Data"ource li2n @ind @ind

-alor frmConsPedido Pedidos D"/ain D/"istVendas.QConsPed D"Cliente D/"istVendas.QConsPedCliente D"Vend D/"istVendas.QConsPedVend alTo, edtNumero, edtCodCliente, edtNomeCliente, edtCodVend, edtNomeVend btnPes(uisa Pes(uisa btnNo!o No!o alClient alClient D"/ain al+ottom b).) b)Cancel

Ire1os propor a:ui u1a 2onsulta u1 pou2o di+erent e da apres e n t a d a na tela de 2onsulta de 2lientes e 7endedor e s 4 Para es2olher u1 2lienteI o usuArio poderA digitar as pri1eiras letras do no1eI antes de a5rir o Grid para 2onsultaI tornando a pes:uis a 1ais seleti7a4 Desta +or1a e7itare 1 o s tra@er todos os registros da ta5ela de 2liente a esta68 o de tra5alhoI alK1 de per1itir u1a lo2ali@a68o 1ais rApida e pre2isa do registro pelo usuArio4 !o1 isso o usuArio utili@a 1elhor e se 5ene+i2ia dos re2ursos +orne2idos pelos ser7idores de 5an2o de dados4
Delphi Client/Server 1*/

Dig $4/M Pes:uisa de 2liente +iltrada pelas letras digitadas pelo usuArio4

9 seguir apres e n t a 1 o s o 2digo da PunitQ da tela de 2onsulta de pedidosM


unit conspe i o3 interface uses Jin o!s< Messa4es< '8sUtils< Classes< &rap"ics< Controls< %orms< #ialo4s< 't Ctrls< &ri s< #B&ri s< E?tCtrls< #1< Buttons3 t8pe TfrmConsPe i o 9 class(T%orm, Panel/0 TPanel3 Panel50 TPanel3 e tNumero0 TE it3 La1el/0 TLa1el3 La1elK0 TLa1el3 e tCo Cliente0 TE it3 e tNomeCliente0 TE it3 La1elP0 TLa1el3 e tNomeIen 0 TE it3 #B&ri /0 T#B&ri 3 1tnPesQuisa0 TButton3 1tnNovo0 TButton3 e tCo Ien 0 TE it3 Panel60 TPanel3 BitBtn/0 TBitBtn3 BitBtn50 TBitBtn3 #'Main0 T#ata'ource3 #'Cliente0 T#ata'ource3 #'Ien 0 T#ata'ource3 proce ure 1tnNovoClic-('en er0 TO12ect,3 proce ure 1tnPesQuisaClic-('en er0 TO12ect,3 proce ure %ormCreate('en er0 TO12ect,3 proce ure %orm#estro8('en er0 TO12ect,3 proce ure e tNomeClienteKe8Up('en er0 TO12ect3 var Ke80 Jor 3 '"ift0 T'"ift'tate,3
Delphi Client/Server 1*0

proce ure e tNomeIen Ke8Up('en er0 TO12ect3 var Ke80 Jor 3 '"ift0 T'"ift'tate,3 private : Private eclarations ; pu1lic : Pu1lic eclarations ; Cm 'elect0'trin43 en 3 var frmConsPe i o0 TfrmConsPe i o3 implementation uses #mE/< 1ta1les< Cons&ri 3 :LR M.#%M; proce ure TfrmConsPe i o.1tnNovoClic-('en er0 TO12ect,3 var i0inte4er3 1e4in %or i09E to Panel/.ControlCount F / o If Panel/.Controls=i> is TE it t"en (Panel/.Controls=i> as TE it,.Clear3 en 3 proce ure TfrmConsPe i o.1tnPesQuisaClic-('en er0 TO12ect,3 var sJ"ere<s'elect<sep0strin43 nPosOr erB80inte4er3 1e4in T7uer8(#'Main.#ata'et,.Close3 'ep09@@3 sJ"ere09@ !"ere @3 s'elect09Cm 'elect3 If (e tNumero.Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs 9 Hs, @<=sJ"ere<'ep<@PE#)C#@<e tNumero.Te?t>,3 'ep09@An @3 en 3 If (e tCo Cliente.Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs 9 Hs,@< =sJ"ere<'ep<@PE')C#)CLI@<e tCo Cliente.Te?t>,3 'ep09@An @3 en 3 If (e tCo Ien .Te?t G* @@, t"en 1e4in sJ"ere09%ormat(@Hs Hs (Hs 9 Hs,@< =sJ"ere<'ep<@PE')C#)IEN@<e tCo Ien .Te?t>,3 'ep09@An @3 en 3 If 'ep G* @@ t"en 1e4in nPosOr erB809Pos(@OR#ER BY@< UpperCase(s'elect,,3 if nPosOr erB8 9 E t"en s'elect09s'elect D sJ"ere else Insert(sJ"ere<s'elect<nPosOr erB8,3 en 3 T7uer8(#'Main.#ata'et,.'7L.Te?t09s'elect3 T7uer8(#'Main.#ata'et,.Open3 en 3 proce ure TfrmConsPe i o.%ormCreate('en er0 TO12ect,3 1e4in Cm 'elect09T7uer8(#'Main.#ata'et,.'7L.TE?t3 en 3 proce ure TfrmConsPe i o.%orm#estro8('en er0 TO12ect,3 1e4in
Delphi Client/Server 1*1

#'Main.#ata'et.Close3 T7uer8(#'Main.#ata'et,.'7L.TE?t09Cm 'elect3 en 3 proce ure TfrmConsPe i o.e tNomeClienteKe8Up('en er0 TO12ect3 var Ke80 Jor 3 '"ift0 T'"ift'tate,3 1e4in If Ke8 9 //6 t"en 1e4in #'Cliente.#ata'et.Close3 If e tNomeCliente.Te?t G* @@ t"en T7uer8(#'Cliente.#ata'et,.'7L=6>09@ AN# PE''OA.PE')NM LIKE @@@ D e tNomeCliente.TE?t D @H@@@ Else T7uer8(#'Cliente.#ata'et,.'7L=6>09@@3 #'Cliente.#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'Cliente3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'Cliente.#ata'et.IsEmpt8, t"en 1e4in TE it('en er,.Te?t09#'Cliente.#ata'et=@PE')NM@>3 e tCo Cliente.Te?t09#'Cliente.#ata'et.%iel B8Name(@PE')C#@,.As'trin43 en 3 en 3 en 3 proce ure TfrmConsPe i o.e tNomeIen Ke8Up('en er0 TO12ect3 var Ke80 Jor 3 '"ift0 T'"ift'tate,3 1e4in If Ke8 9 //6 t"en 1e4in If Not #'Ien .#ata'et.Active t"en #'Ien .#ata'et.Open3 frm&ri 09T%rm&ri .Create('elf,3 frm&ri .#B&ri /.#ata'ource09#'Ien 3 If (frm&ri .'"o!Mo al9mrO-, an (Not #'Ien .#ata'et.IsEmpt8, t"en 1e4in TE it('en er,.Te?t09#'Ien .#ata'et=@PE')NM@>3 e tCo Ien .Te?t09#'Ien .#ata'et.%iel B8Name(@PE')C#@,.As'trin43 en 3 en 3 en 3 en .

!ela de Manuteno
Para +a@er a 1anut e n6 8 o do pedidoI 7a1os a2res2e nt ar no &ata +odule os seguintes 2o1pon e n t e s M

Delphi Client/Server

1*2

Dig4 $4&M Data Module

Componente Quer$1

Proprie"a"e Name DatabaseName "Q%

-alor Q,edido D+V*ND "


"*%*CT P*DID..P*D0CD , P*DID..P*D0DT , P*DID..P*D0V %.' , P*DID..P*D0TIP. , P*DID..P*"0CD0C%I , P*DID..P*"0CD0V*N , P*"". .P*"0N/ F'./ P*DID. P*DID. , C%I*NT* C%I*NT* , P*"". P*"". 78*'* 9 C%I*NT*.P*"0CD : P*"". .P*"0CD ; ND 9 P*DID..P*"0CD0C%I : C%I*NT*.P*"0CD ; ND 9P*DID..P*D0CD : =P*D0CD; .'D*' +< P*DID..P*D0CD

Quer$2

1,date.b4ect Cac6ed1,date Name DatabaseName "Q%

1"Pedido T'1* Qitem D+V*ND "


"*%*CT IT*/.P*D0CD , IT*/.P'.0CD , IT*/.IT*0V %.' , IT*/.IT*0Q1 NT , P'.D1T..P'.0N/ F'./ IT*/ IT*/ , P'.D1T. P'.D1T. 78*'* 9 IT*/.P'.0CD : P'.D1T..P'.0CD ; and 9 IT*/.P*D0CD : =P*D0CD; .'D*' +< IT*/.P'.0CD

1,date"Q%1 1,date"Q%2 Quer$-

1,date.b4ect Cac6ed1,date Name Name Name DatabaseName "Q%

1"Item T'1* 1"Pedido 1"Item QConsPedProd D+V*ND "


"*%*CT & F'./ P'.D1T. .'D*' +< P'.0N/ .bs= DeiFar a se2unda lin6a em branco.

*a5ela de Propriedades

De7e' se 2riar ta15 K 1I u1 no7o 2a1po do tipo PlooTupQ e1 7Pedido para per1itir a es2olha do 7ended or atra7Ks de seu no1e4 Ire1os
Delphi Client/Server 1*4

ness a telaI utili@ar o prprio re2urso de PlooTupQ do Delphi para a sele68o do 7ende dor4 9 tela de 1anut e n 6 8 o de pedidos de7erA ser 2onstruGda 2o1o a +igura a5aiBo4 Pode' se notar :ue ser8o apres e n t a d a s na 1es 1 a tela os dados das ta5elas PEDIDO e I*EM para per1itir a 1anut e n 6 8 o integral dos dados do pedido4

Dig $45M *ela de Manuten68o de Pedido4

Componente form1 Data"ource1 Data"ource2 Data"ourcePanel1 ",eed+utton1 ",eed+utton2 ",eed+utton",,ed+utton3 ",eed+utton5 D+*dit..., D+'adio#rou, D+#rid1 ",eed+uttonG ",eed+uttonH ",eed+uttonI
Delphi Client/Server

Proprie"a"e Name Ca,tion Name Data"et Name Data"et Name Data"et li2n Name Name Name Name Name Data"ource Data"ource Name Name Name

-alor frmPedido Pedidos D"/ain D/"istVendas.Q,edido D"Detail D/"istVendas.QItem D"Cliente D/"istVendas.QConsPedCliente alTo, btn ,,end btnDelete btn"a!e btnDiscard btn"earc6 D"/ain D"Detail btnDetail ,,end btnDetailDelete btnDetailDiscard
1*5

*a5ela de Propriedades

(+gica visual 9ntes de 2o1e6 ar a de+inir os e7entos dos 5otCesI ire1os 2riar u1 pro2edi1 e n t o para 2ontrolar a ha5ilita68o dess es 5otCes4
proce ure TfrmPe i o.Ena1leBtnControls3 1e4in Case #'Main.'tate of sInactive0 1e4in 1tnAppen .Ena1le 09TRUE3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 en 3 sInsert0 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en 3 sE it0 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en 3 sBro!se0 If T7uer8(#'Main.#ata'et,.Up atesPen in4 t"en 1e4in 1tnAppen .Ena1le 09%AL'E3 1tn#elete.Ena1le 09%AL'E3 1tn'ave.Ena1le 09TRUE3 1tn#iscar .Ena1le 09TRUE3 1tn'earc".Ena1le 09%AL'E3 en else 1e4in 1tnAppen .Ena1le 09TRUE3 1tn#elete.Ena1le 09TRUE3 1tn'ave.Ena1le 09%AL'E3 1tn#iscar .Ena1le 09%AL'E3 1tn'earc".Ena1le 09TRUE3 en 3 en 3 en 3

Pode1o s ta15 K 1 de+inir alguns e7entos de 2o1porta 1 e n t o geralM


proce ure TfrmPe i o.%ormClose('en er0 TO12ect3 var Action0 TCloseAction,3 1e4in #'#etail.#ata'et.Close3 #'Main.#ata'et.Close3 #'Cliente.#ata'et.close3 en 3

Delphi Client/Server

1,7

O e7ento O2C)0/ * do 1orm pode ser utili@ado &ataSets :ue ser8o a5ertos durant e o uso da tela4

para

+e2har

os

9tra7Ks do e7ento O2S-, - *C C , 2 3 * I pode 1o s 2ha1ar a procedure E2,.) *B - 2C 0 2 -+ 0) / para 2ontrolar a ha5ilita68o dos 5otCes4
proce ure TfrmPe i o.#'Main'tateC"an4e('en er0 TO12ect,3 1e4in Ena1leBtnControls3 en 3

9gora 7a1os i1ple1 e n t a r os e7entos de 2ada 5ot8o da telaI a 2o1e6 ar pelos da Detail ,ta5ela de itens.4 No e7ento O2C)(19 do 5ot8o 4tn&etailAppen d da DetailI pode 1o s i1ple1e n t a r a a5ertur a de u1a no7a linha no $rid atra7K s do 2o1and o A77 * 2 : 4
proce ure TfrmPe i o.1tn#etailAppen Clic-('en er0 TO12ect,3 1e4in #'#etail.#ata'et.Appen 3 en 3

9lK1 dissoI de7e 1o s i1ple1e n t a r o e7ento O2S-, - *C C , 2 3 * do D ataSource Detail para poder 1o s noti+i2ar a Master de :ual:uer altera6 8o +eita na DetailM
proce ure TfrmPe i o.#'#etail'tateC"an4e('en er0 TO12ect,3 1e4in If #'#etail.'tate in = sInsert< sE it> t"en #'Main.#ata'et.E it3 en 3

O 5ot8o de PDeleteQ pode ser i1ple1 e n t a d o da seguinte +or1aM


proce ure TfrmPe i o.1tn#etail#eleteClic-('en er0 TO12ect,3 1e4in If TB#E#ata'et(#'#etail.#ata'et,.Up ate'tatus G* us#elete 1e4in #'Main.#ata'et.E it3 #'#etail.#ata'et.#elete3 en 3 en 3

t"en

9 inten68o do 5ot8o 4tn&etail&elete K si1ples 1 e n t e 1ar2ar a linha para eB2lus8o4 9 eB2lus8o no 5an2o de dados s serA +eita :uando o usuArio 1and ar sal7ar todas as altera6C e s 4 9 proprieda d e U7:,- * S - , - 6 / indi2a o estado da linha no P2a2hed updat e s Q4 Os estados pode 1 serM n8o 1odi+i2adaI 1odi+i2adaI inserida ou alterad a4 No e7ento a2i1a esta 1 o s 7eri+i2ando se a linha JA n8o estA 1ar2ad a para eB2lus8oI para e7itar1os de tentar eB2luir a linha no7a 1 e n t e 4
Delphi Client/Server 1,1

Para sensi5ili@ar a Master da altera6 8 o +eita na DetailI pode 1o s 2ha1ar o 1Ktodo E:(- do &ataSet 4 Desta +or1a os 5otCes de sal7a1 e n t o e 2an2ela 1 e n t o asso2iados a Master ser8o ha5ilitados4 E por Llti1o de7e 1o s 2ha1 ar o 1Ktodo D*)* - * do &ataSet para 1ar2ar a linha para eB2lus8o 1and a n d o' a para o P2a2hed updat e s Q4 O 5ot8o 4tn&etail&iscard ser7e para des2art ar as altera6C e s +eitas e1 u1a deter 1in a d a linha4 )e as altera6C e s ainda n8o +ora1 en7iad as para o P2a2hed updat e sQI a opera68 o de Dis2ard si1ples 1 e n t e 2an2ela as altera6C e s atra7K s do 1Ktodo C,21 *) 4 MasI se a linha JA +oi en7iadaI esta de7erA ser re7ertida a seu estado original atra7Ks do 1Ktodo R*5 *+-R * 1 0 + : I sendo portanto retirad a do P2a2hed updat e s Q4
proce ure TfrmPe i o.1tn#etail#iscar Clic-('en er0 TO12ect,3 1e4in If #'#etail.'tate in = sE it< sInsert> t"en 1e4in #'#etail.#ata'et.Cancel en else 1e4in TB#E#ata'et(#'#etail.#ata'et,.RevertRecor 3 en 3 en 3

Pode1o s +orne2er u1 e+eito 7isual para possi5ilitar o usuArio identi+i2ar as linhas alterad a sI eB2luGdas e inseridas4 Para +a@er issoI pode 1o s i1ple1 e n t a r o e7ento O2D+,<C0)6 4 2C *)) do $rid e alterar as 2ores do +onte de 2ada u1a dess as situa6C es4 Para isso pode 1o s utili@ar a proprieda d e U7:,- * S - , - 6 / do &ataSet.
proce ure TfrmPe i o.#B&ri /#ra!ColumnCell('en er0 TO12ect3 const Rect0 TRect3 #ataCol0 Inte4er3 Column0 TColumn3 'tate0 T&ri #ra!'tate,3 var Ol Color0Tcolor3 1e4in !it" T#B&ri ('en er, o TTAtri1ui cores iferentes para ca a lin"a a ta1ela e acor o com seu status case T7uer8(#'#etail.#ata'et,.Up ate'tatus of us#elete 0 1e4in Ol Color09Canvas.%ont.Color3 Canvas.%ont.Color09clre 3 Canvas.%ont.'t8le09Canvas.%ont.'t8le D =fs'tri-eOut>3 #efault#ra!ColumnCell(Rect<#ataCol<Column<'tate,3 Canvas.%ont.Color09Ol Color3 Canvas.%ont.'t8le09Canvas.%ont.'t8le F =fs'tri-eOut>3 en 3 usMo ifie 0 1e4in Ol Color09Canvas.%ont.Color3 Canvas.%ont.Color09clBlue3 #efault#ra!ColumnCell(Rect<#ataCol<Column<'tate,3 Canvas.%ont.Color09Ol Color3 en 3 usInserte 0
Delphi Client/Server 1,*

1e4in Ol Color09Canvas.%ont.Color3 Canvas.%ont.Color09cl&reen3 #efault#ra!ColumnCell(Rect<#ataCol<Column<'tate,3 Canvas.%ont.Color09Ol Color3 en 3 en 3 en 3

9ntes de i1ple1e n t a r 1 o s os e7entos da MasterI 7a1os 2riar u1 pro2edi1 e n t o :ue nos per1ita pes:uis ar os registro da Detail de a2ordo 2o1 o registro sele2ionado na Master4
proce ure TfrmPe i o.#etail'earc"3 1e4in #'#etail.#ata'et.close3 If #'Main.#ata'et.%iel B8Name(@PE#)C#@,.IsNull t"en T7uer8(#'#etail.#ata'et,.Params=E>.clear else T7uer8(#'#etail.#ata'et,.Params=E>.value09 #'Main.#ata'et=@PE#)C#@>3 #'#etail.#ata'et.Open3 TB#E#ata'et(#'#etail.#ata'et,.Up ateRecor T8pes09 TB#E#ata'et(#'#etail.#ata'et,.Up ateRecor T8pes D =rt#elete >3 en 3

9 Llti1a linha do 2digo per1ite :ue os registros eB2luGdos 2ontinue 1 7isG7eis no &ataSet para :ue possa 1 ser re7ertidos 2on+or1e a ne2essidad e do usuArio4 Pode1o s 2o1e6 ar a i1ple1e n t a 6 8 o dos e7entos da Master atra7Ks do 5ot8o 4tnAppe n d 4
proce ure TfrmPe i o.1tnAppen Clic-('en er0 TO12ect,3 1e4in If Not #'Main.#ata'et.Active t"en 1e4in #'Main.#ata'et.Open3 en 3 #'Main.#ata'et.Appen 3 #etail'earc"3 en 3

Esse e7ento 7eri+i2a se o &ataSet Master estA a5erto e a seguir insere u1a no7a linha atra7Ks do 2o1an do A77 * 2 : 4 Depois K +eita u1a pes:uis a na ta5ela Detail 2o1 o parO 1 e tr o nulo para :ue nenhu 1 registro seJa en2ontra do e per1ita assi1 a inser68o de no7os registros no Grid de Itens4 9 pes:uis a da Master reali@ada i1ple1e n t a d a da seguinte +or1a pelo 5ot8o 4tnSearch pode ser

proce ure TfrmPe i o.1tn'earc"Clic-('en er0 TO12ect,3 1e4in #'Main.#ata'et.Close3 frmConsPe i o09TfrmConsPe i o.Create('elf,3 If (frmConsPe i o.'"o!Mo al9mrO-,
Delphi Client/Server 1,,

an (Not (frmConsPe i o.#'Main.#ata'et=@PE#)C#@> 9 Null,, t"en 1e4in T7uer8(#'Main.#ata'et,.Params=E>.value09 frmConsPe i o.#'Main.#ata'et=@PE#)C#@>3 #'Main.#ata'et.Open3 #etail'earc"3 en 3 frmConsPe i o.free3 en 3

O 5ot8o 4tn&iscard K respons A7 el pelo 2an2ela 1 e n t o das altera6C e s da Master4 9pesar da Master estar tratand o u1a Lni2a linha de 2ada 7e@I n8o K su+i2iente 7eri+i2ar1os o estado do &ataSource para sa5er 1o s se a linha possui altera6C e s4 =uando u1a tentati7a n8o 5e1 su2edida de sal7ar o registro a2onte2 eI o registro +oi 2olo2ado no P2a2hed updat e sQI portanto seu estado serA Pds<roHseQ4 Por isso K ne2es s Ario 7eri+i2ar1os a proprieda d e U7:,- * S - , - 6 / para sa5er 1o s 2o1o des2art ar as altera6C e s4
proce ure TfrmPe i o.1tn#iscar Clic-('en er0 TO12ect,3 1e4in If TB#E#ata'et(#'Main.#ata'et,.Up ate'tatus in =usMo ifie < usInserte < us#elete > t"en TB#E#ata'et(#'Main.#ata'et,.RevertRecor else TB#E#ata'et(#'Main.#ata'et,.Cancel3 If TB#E#ata'et(#'Main.#ata'et,.IsEmpt8 t"en 1e4in #'Main.#ata'et.close3 #'#etail.#ata'et.Close3 en else 1e4in #etail'earc"3 en 3 Ena1leBtnControls3 en 3

Controle visual da !ransao O e7ento de sal7a 1 e n t o +eito pelo 5ot8o 4tnSa" e pode ser i1ple1e n t a d o da seguinte +or1a para 1ant er e1 u1a Lni2a trans a6 8 o a inser68o do pedido e de seus itens4
proce ure TfrmPe i o.1tn'aveClic-('en er0 TO12ect,3 1e4in If #'#etail.#ata'et.'tate in = sInsert< sE it> t"en #'#etail.#ata'et.Post3 If #'Main.#ata'et.'tate in = sInsert< sE it> t"en #'Main.#ata'et.Post3 #M'istIen as.#ata1ase/.'tartTransaction3 tr8 TB#E#ata'et(#'Main.#ata'et,.Appl8Up ates3 TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 #M'istIen as.#ata1ase/.Commit3 Ena1leBtnControls3 #etail'earc"3 e?cept On E0E?ception o 1e4in TB#E#ata'et(#'Main.#ata'et,.CommitUp ates3 #M'istIen as.#ata1ase/.Roll1ac-3 #'Main.#ata'et.E it3
Delphi Client/Server 1,/

if Not ((E is E#BEn4ineError, an (E#BEn4ineError(E,.Errors=E>.NativeError 9 E,, t"en raise3 en 3 en 3 en 3

Desta +or1a se algu1 pro5le1 a o2orrer na inser68o do pedido ou de seus itens K eBe2ut a d o u1 +0)).,19 no 5an2o de dados para des+a@er toda a trans a6 8 o e a tela +i2a inta2ta para :ue o usuArio possa 2orrigir o pro5le1 a e re+a@er a gra7a68 o4 9 pri1eira parte do 2digo 2uida de en7iar para o P2a2hed updat eQ :ual:uer linha :ue esteJa pende n t e na Detail ou na Master4 9 linha da Detail K en7iada pri1eiroI por:ue ela pode 2ausar 1odi+i2a6Ces no registro 2orrent e da Master4
If #'#etail.#ata'et.'tate in = sInsert< sE it> t"en #'#etail.#ata'et.Post3 If #'Main.#ata'et.'tate in = sInsert< sE it> t"en #'Main.#ata'et.Post3

9 seguir 2o1e6 a a trans a6 8 o e toda a opera68 o de sal7a1 e n t o K +eita dentro do 2o1and o -+8.. * F 1 * 7 - para :ue a +inali@a68o da trans a6 8 o possa ser 2ontrolad aI tanto no 2aso de su2esso 2o1o no 2aso de o2orrer algu1 a +alha4 O sal7a1 e n t o K +eito atra7Ks do 2o1an do A77)8U7 : , - * / I respons A7 el por en7iar as pend > n2ias do P2a2hed updat eQ para o 5an2o4 9ps o en7io 2o1 su2essoI K ne2ess Ario eBe2ut ar o 2o1and o C04 4(-U 7 : , - * / I respons A 7 el e1 retirar do P2a2hed updat eQ as linhas sal7as 2o1 su2esso4 Entreta nt oI para :ue o Delphi atuali@e alguns +lagsI esse 2o1and o K ne2es s Ario 1es 1o se a atuali@a68o +alhar4 )e essas opera6C e s o2orrere 1 2o1 su2essoI K eBe2ut a d o o 2o1an do 104 4 (- no 5an2o de dados e todo o 2onJunto de atuali@a6Ces K +inal1en t e apli2ado no 5an2oI 2aso 2ontrArio toda a trans a6 8 o K des+eita atra7Ks do 2o1and o +0)).,19 4 O 2digo ainda apres e n t a alguns detalhes 2o1oM 2ha1 ar o 2ontrole de ha5ilita68o dos 5otCes e +a@er a 5us2a no7a 1 e n t e dos dados da Detail para :ue os registros possa 1 ser atuali@ados na tela4 !ransao . (+gica de neg+cio 9lguns e7entos de7e 1 ser i1ple1e n t a d o s no &ata+odule para :ue o 2ontrole da trans a6 8 o Master;Det ail seJa +eito por 2o1pleto4 ?a1os 2o1e6 ar pelo e7ento :ue de7e ser utili@ado para +orne2er 7alores Pde+aultQ para os 2a1posI :uando o usuArio 2riar u1 no7o registroM
proce ure T#M'istIen as.7Pe i oNe!Recor (#ata'et0 T#ata'et,3 1e4in
Delphi Client/Server 1,0

#ata'et=@PE#)IALOR@>09E3 #ata'et=@PE#)TIPO@>09@I@3 en 3

9gora 7a1os 7Pedido 4

i1ple1 e n t a r

o e7ento

U7:,- * R * 1 0 + :

do &ataSet

proce ure T#M'istIen as.7Pe i oUp ateRecor (#ata'et0 T#ata'et3 Up ateKin 0 TUp ateKin 3 var Up ateAction0 TUp ateAction,3 1e4in U'Pe i o.Appl8(Up ateKin ,3 tr8 7Item.Appl8Up ates3 finall8 7Item.CommitUp ates3 en 3 Up ateAction09uaApplie 3 en 3

Esse e7ento si1ples 1 e n t e 2uida de eBe2ut ar o 2o1an do de atuali@a68o atra7Ks do 2o1pon e n t e 2pdateS7* e +a@er a 2ha1a d a para a e+eti7a68o do P2a2hed updat eQ da Detail4 Desta +or1a se algu1 erro a2onte2 er na Master ou na DetailI o 7alor do +lag retornad o atra7Ks do parO 1 e tr o U7:,- * A 1 -( 0 2 K Pua95ortQI o :ue +a@ a linha da Master 2ontinuar no 2a2he para no7as tentati7as de atuali@a68o pelo usuArio4 =uando se retorna o 7alor Pua9ppliedQ no parO 1 e t ro U7:,- * A 1 -( 0 2 I o Delphi re7erte o status da linha para n8o 1odi+i2ada 2o1o se ela ti7ess e sido apli2ada no 5an2o4 Isso s pode ser +eito se toda a trans a6 8 o +oi reali@ada 2o1 su2esso e ti7er1os 2erte@a :ue o 2o1an do 104 4 (- serA eBe2ut a d o4 De7e 1o s ta15 K 1 i1ple1e n t a r o e7ento da Detail4
proce ure T#M'istIen as.7ItemUp ateRecor (#ata'et0 T#ata'et3 Up ateKin 0 TUp ateKin 3 var Up ateAction0 TUp ateAction,3 1e4in U'Item.Appl8(Up ateKin ,3 Up ateAction09ua'-ip3 en 3

Para e7itar1os :ue os +lags dos registros seJa1 re7ertidos para n8o 1odi+i2adoI +oi retornad o atra7K s do parO 1 e t ro U7:,- *A 1 -( 0 2 o 7alor Pua)TipQ :ue n8o produ@ nenhu 1 a eB2e68o e n8o 1odi+i2a o +lag dos registros4 =uando a trans a6 8 o K +inali@ada 2o1 su2essoI K +eita u1a no7a pes:uis a no prprio e7ento do 5ot8o 4tnSa" e para :ue todos os +lags seJa1 atuali@ados4 Desta +or1a 2onsegui1o s 1ant er a integridad e da trans a6 8 o e per1itir a 2orre68o dos registros pelo usuArio para :ue possa 1 ser reen7iados para o 5an2o de dados4

Delphi Client/Server

1,1

Calculando o )alor !otal do Pedido ?oltando a tela de pedidoI pode 1o s 2al2ular o 7alor do pedido se1pr e :ue hou7er u1a atuali@a68o no 7alor do ite14 O 7alor do ite1 K ta15 K 1 +un68o de dois outros 7aloresM o pre6o do produto e a :uantidad e do ite14 ?a1os utili@ar o e7ento O2D,- ,C C , 2 3 * do &ataSource Detail para +a@er1os os 2Al2ulos4
proce ure TfrmPe i o.#'#etail#ataC"an4e('en er0 TO12ect3 %iel 0 T%iel ,3 1e4in If (%iel 9 #'#etail.#ata'et.%iel B8Name(@PRO)C#@,, or (%iel 9 #'#etail.#ata'et.%iel B8Name(@ITE)7UANT@,, t"en 1e4in If #'Main.'tate 9 sBro!se t"en #'Main.#ata'et.E it3 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloatF #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 #'#etail.#ata'et=@ITE)IALOR@>09 #'#etail.#ata'et=@PRO)PRECO@> M #'#etail.#ata'et=@ITE)7UANT@>3 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat D #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 en 3 en 3

9lK1 disso de7e 1o s re2al2ular o 7alor total e1 7Arias situa6C es de altera6 8o :ue pode 1 a2onte2 er na Detail4 Por issoI ire1os adi2ionar algu1 a s linhas de 2digo e1 alguns dos e7entos JA i1ple1e n t a d o s anterior1 e n t e 4 O pri1eiro K o e7ento do 5ot8o 4tn&etail&elete :ue de7e su5trair o 7alor do ite1 do total do pedido4
proce ure TfrmPe i o.1tn#etail#eleteClic-('en er0 TO12ect,3 1e4in If TB#E#ata'et(#'#etail.#ata'et,.Up ate'tatus G* us#elete #'Main.#ata'et.E it3 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat F #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 #'#etail.#ata'et.#elete3 en 3 en 3

t"en 1e4in

9lK1 dissoI de7e 1o s ta15 K 1 re2al2ular o 7alor do pedido no e7ento do 5ot8o 4tn&etail&iscard 4
proce ure TfrmPe i o.1tn#etail#iscar Clic-('en er0 TO12ect,3 1e4in If #'#etail.'tate in = sE it< sInsert> t"en 1e4in If #'#etail.'tate 9 sInsert t"en 1e4in #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat F #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 #'#etail.#ata'et.Cancel3 en else 1e4in
Delphi Client/Server 1,2

#'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat F #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 #'#etail.#ata'et.Cancel3 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat D #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 en 3 en else 1e4in if TB#E#ata'et(#'#etail.#ata'et,.Up ate'tatus 9 usInserte t"en 1e4in #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat F #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 TB#E#ata'et(#'#etail.#ata'et,.RevertRecor 3 en else if TB#E#ata'et(#'#etail.#ata'et,.Up ate'tatus 9 us#elete t"en 1e4in #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat D #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 TB#E#ata'et(#'#etail.#ata'et,.RevertRecor 3 en else if TB#E#ata'et(#'#etail.#ata'et,.Up ate'tatus 9 usMo ifie t"en 1e4in #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat F #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 TB#E#ata'et(#'#etail.#ata'et,.RevertRecor 3 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.As%loat09 #'Main.#ata'et.%iel B8Name(@PE#)IALOR@,.asfloat D #'#etail.#ata'et.%iel B8Name(@ITE)IALOR@,.asfloat3 en 3 en 3 en 3

"egras de

eg+cio

9lK1 de inserir os registros do pedido e de seus itensI de7e 1o s i1ple1e n t a r algu1a s regras de neg2io e1 torno dess as inser6Ces4 !o1o eBe 1plo ire1os i1ple1 e n t a r duas regras de neg2ioM a 7eri+i2a68o do li1ite de 2rKdito do 2liente e1 2o1pras a pra@o e a 5aiBa do esto:u e do produto4 Essas regras de neg2io de7e 1 ser i1ple1 e n t a d a s dentro da trans a6 8 o para :ue seJa1 e+eti7ad a s Junta 1 e n t e 2o1 a inser68o dos registros4 Para si1pli+i2ar o pro2ess o ire1os +a@er os e7entos apen a s para inser68o do pedido e dos itens4 N8o ire1os tratar portanto a atuali@a68o e eB2lus8o de itens ou do pedido4 ?a1os i1ple1e n t a r duas pro2edur e s dentro do &ata+odule M
pu1lic : Pu1lic eclarations ; proce ure IerificaLimiteCre itoCliente(Cliente0 inte4er3 Ialor0 proce ure Up ateEstoQue(Pro uto0 inte4er3 7uant0 inte4er,3 en 3

ou1le,3

proce ure T#M'istIen as.IerificaLimiteCre itoCliente(Cliente0 inte4er3 Ialor0 ou1le,3 1e4in 7&eral.close3
Delphi Client/Server 1,4

7&eral.'7L.Te?t09@up ate cliente set cli) e1ito 9 cli) e1ito D 0p/ @ D @!"ere pes)c 9 0p5@3 7&eral.ParamB8Name(@p/@,.As%loat09Ialor3 7&eral.ParamB8Name(@p5@,.AsInte4er09Cliente3 7&eral.E?ec'7L3 7&eral.'7L.Te?t09@select cli)limitecre ito F cli) e1ito from cliente @ D @!"ere pes)c 9 0p/@3 7&eral.ParamB8Name(@p/@,.AsInte4er09Cliente3 7&eral.Open3 if 7&eral.%iel s=E>.As%loat G E t"en 1e4in '"o!Messa4e(@Limite e CrU ito o Cliente insuficiente para a compra@,3 7&eral.Close3 A1ort3 en 3 7&eral.Close3 en 3

Esse 1Ktodo in2re1e n t a o dK5ito do 2liente e 7eri+i2a se ele ultrap as s o u o li1ite4 !aso isso a2onte6 a u1a 1ens a g e 1 K 1ostrad a ao usuArio e u1a eB2e68o K le7ant a d a4 9 altera6 8 o de7e ser +eita pri1eiro para :ue o registro se 1ant e n h a tra7ado e outro usuArio n8o altere seus 7alores4 O e7ento de 5aiBa no esto:u e K 5e1 si1ilar e K 1ostra do a5aiBo4
proce ure T#M'istIen as.Up ateEstoQue(Pro uto0 inte4er3 7uant0 inte4er,3 1e4in 7&eral.close3 7&eral.'7L.Te?t09@up ate pro uto set pro)estoQue 9 pro)estoQue F 0p/ @ D @!"ere pro)c 9 0p5@3 7&eral.ParamB8Name(@p/@,.As%loat097uant3 7&eral.ParamB8Name(@p5@,.AsInte4er09Pro uto3 7&eral.E?ec'7L3 7&eral.'7L.Te?t09@select pro)estoQue from pro uto @ D @!"ere pro)c 9 0p/@3 7&eral.ParamB8Name(@p/@,.AsInte4er09Pro uto3 7&eral.Open3 if 7&eral.%iel s=E>.As%loat G E t"en 1e4in '"o!Messa4e(@EstoQue insuficiente o Pro uto0 @ D inttostr(Pro uto,,3 7&eral.Close3 A1ort3 en 3 7&eral.Close3 en 3

De7e 1o s ent8oI a2res2e n t a r e7entos de atuali@a68oM

as 2ha1a d a s

dess es

1Ktodos

nos

proce ure T#M'istIen as.7Pe i oUp ateRecor (#ata'et0 T#ata'et3 Up ateKin 0 TUp ateKin 3 var Up ateAction0 TUp ateAction,3 1e4in If Up ateKin 9 u-Insert t"en 1e4in If 7Pe i oPE#)TIPO.Ne!Ialue 9 @P@ t"en IerificaLimiteCre itoCliente(7Pe i oPE')C#)CLI.Ne!Ialue< 7Pe i oPE#)IALOR.Ne!Ialue,3 en 3 U'Pe i o.Appl8(Up ateKin ,3 tr8 7Item.Appl8Up ates3 finall8
Delphi Client/Server 1,5

7Item.CommitUp ates3 en 3 Up ateAction09uaApplie 3 en 3 proce ure T#M'istIen as.7ItemUp ateRecor (#ata'et0 T#ata'et3 Up ateKin 0 TUp ateKin 3 var Up ateAction0 TUp ateAction,3 1e4in If Up ateKin 9 u-Insert t"en 1e4in 7ItemPE#)C#.Ne!Ialue097Pe i oPE#)C#.Ne!Ialue3 Up ateEstoQue(7ItemPRO)C#.Ne!Ialue< 7ItemITE)7UANT.Ne!Ialue ,3 en 3 U'Item.Appl8(Up ateKin ,3 Up ateAction09ua'-ip3 en 3

Delphi Client/Server

1/7

Você também pode gostar