Sei sulla pagina 1di 137

DELPHI

Delphi

Wendel Wagner Martins Nogueira Rua General Osrio n 255 !EP " #$%2&'(&( Dourados ' M) *ele+one ,(-#. &2 ' 5/2 0 ,(-#. &22'5 22 ra1al 2/% In+or1ati2a32pao4e15rapa45r

6ndi2e 7nal8ti2o
INTRODUO AO MODELO CLIENTE/SERVIDOR................................................................1 Mudanas de Paradigmas ....................................................................................................................1 Paradigma Computacional...............................................................................................................1 Paradigma do Negcio.....................................................................................................................3 Evoluo da Arquitetura.......................................................................................................................4 Arquitetura Time-Sharing.................................................................................................................4 Arquitetura Resource-Sharing.......................................................................................................... Arquitetura Cliente!Ser"idor............................................................................................................# Primeira Gerao Cliente/Servidor......................................................................................................8 Segunda Gerao Cliente/Servidor.......................................................................................................8 SGDB - SISTEMAS GERENCIADORES DE BANCO DE DADOS............................................9 Modelos de Ban o de !ados...............................................................................................................1" Sistema de $erenciamento de Arqui"os.........................................................................................11 %anco de &ados 'ier(rquico.........................................................................................................11 %anco de &ados de Rede................................................................................................................1) %anco de &ados Relacional............................................................................................................13 BANCOS DE DADOS RELACIONAIS..........................................................................................15 Classi#i ao.......................................................................................................................................1$ Corporati"os....................................................................................................................................1# &epartamentais...............................................................................................................................1# *ocais ou +"eis.............................................................................................................................1# Modelagem de !ados..........................................................................................................................1% Normali,a-.o..................................................................................................................................1/ Propaga-.o de cha"es prim(rias...................................................................................................)) 0erramentas....................................................................................................................................)4 Cria-.o da %ase de &ados ............................................................................................................)4 1tili,ando 2nter3ase 4indo5s 2S6*...............................................................................................)4 &inguagem S'&..................................................................................................................................() Categorias da *inguagem S6*.......................................................................................................)/ 1tili,ando o 4indo5s 2S6* para de7inir o %anco de &ados........................................................)/ 1tili,ando o 4indo5s 2S6* para acessar o %anco de &ados.......................................................)8 Consist*n ia e +ntegridade dos !ados................................................................................................(, 2ntegridade Re7erencial..................................................................................................................)9 &om:nio dos dados..........................................................................................................................3; Regras de Negcio..........................................................................................................................31 1tili,ando o 4indo5s 2S6* para de7inir integridades e consist<ncias.........................................31 1tili,ando o 4indo5s 2S6* para testar as consist<ncias..............................................................3) &istri3ui-.o da Consist<ncia e 2ntegridade dos &ados ..............................................................33 SQL EXPLORER..............................................................................................................................34 Criao de Alias..................................................................................................................................-4 .isuali/ao e Edio de !ados.........................................................................................................-) !e#inio de novos elementos............................................................................................................-8 !e#inio de !i ion0rios de dados.....................................................................................................-8 Cria-.o de um no"o &icion(rio.....................................................................................................39

2mporta-.o das de7ini-=es do %anco de &ados.............................................................................39 &e7ini-.o das propriedades dos Attri3ute Sets..............................................................................39 1tili,a-.o do &icion(rio no &elphi ..............................................................................................4; TRABALHANDO COM BANCOS DE DADOS RELACIONAIS..............................................4 Com1onentes da Arquitetura Cliente/Servidor2dls#...........................................................................4( Cone34es e Conte3tos.........................................................................................................................4Cone>=es e Conte>tos no &elphi....................................................................................................44 Cursores e 5esult Sets ........................................................................................................................4) Cursores e Result Sets no &elphi....................................................................................................4/ 6ransa4es...........................................................................................................................................48 Transa-=es no &elphi.....................................................................................................................49 Con orr*n ia 2 !&S7..........................................................................................................................$( Tipos de tra"amentos ?loc@sA.......................................................................................................... ) N:"eis de isolamento....................................................................................................................... 3 Bptimistic *oc@............................................................................................................................... 4 Concorr<ncia no &elphi................................................................................................................. # PRO!ETANDO APLICA"ES CLIENTE/SERVIDOR.............................................................# Estrutura de uma A1li ao...............................................................................................................)( Apresenta-.o...................................................................................................................................#) *gica do Negcio..........................................................................................................................#) $erenciamento de &ados................................................................................................................#4 .antagens da 8rgani/ao da A1li ao em Camadas.....................................................................)4 Estrutura de uma A1li ao !el19i...................................................................................................)$ Componentes "isuais ......................................................................................................................# Componentes de Acesso C 3ase de dados ......................................................................................## Componente de liga-.o...................................................................................................................## CONSTRUINDO APLICA"ES CLIENTE/SERVIDOR...........................................................#$ :tili/ando !ata Modules....................................................................................................................)% Com1onente 6!ata;ase......................................................................................................................)8 Es ol9endo entre 66a;le e 6'uer<....................................................................................................), A3ertura...........................................................................................................................................#9 0iltros .............................................................................................................................................#9 Transa-=es ....................................................................................................................................../; NDmero de Ta3elas Acessadas......................................................................................................../1 6ra;al9ando om o 6'uer<................................................................................................................%1 :tili/ando Ca 9ed :1dates................................................................................................................%:tili/ando o Com1onente 6:1dateS'&............................................................................................%$ Gravao &in9a a &in9a ou em Bat 9................................................................................................%% 6ra;al9ando om o 66a;le.................................................................................................................81 %ILTRANDO REGISTROS.............................................................................................................&4 'BE na mesma 6ela de Manuteno.................................................................................................8$ Controlando os Estados da 6ela.........................................................................................................88 6ela de Consulta Es1e =#i a................................................................................................................,$ Tela de Consulta.............................................................................................................................9 Tela de +anuten-.o......................................................................................................................1;1 Recursos de *oo@1p.....................................................................................................................1; %uscando Registros de outras Ta3Sheets.....................................................................................1;8 Controlando Transa-=es...............................................................................................................1;9 +antendo o Result Set da Consulta..............................................................................................11) CONTROLANDO TRANSA"ES MASTER/DETAIL............................................................115 6ela de Consulta...............................................................................................................................11$ 6ela de Manuteno..........................................................................................................................1(" *gica "isual.................................................................................................................................1)3 Controle "isual da Transa-.o.......................................................................................................1)/ Transa-.o - *gica de negcio....................................................................................................1)8 Calculando o Ealor Total do Pedido............................................................................................1)9

Regras de Negcio........................................................................................................................131

Introdu9:o ao Modelo !liente;)er<idor


Esse captulo mostra a evoluo na arquitetura de computadores e a tendncia a ambientes de aplicaes cada vez mais distribudos.

!ap8tulo

ter1o !liente;)er<idor +oi ini2ial1ente apli2ado para a ar=uitetura de so+t>are =ue des2re<ia o pro2essa1ento entre dois progra1as4 Nesse 2onte?to@ a apli2a9:o 2liente re=uisita<a u1 ser<i9o =ue era ent:o e?e2utado pelo progra1a ser<idor4 Entretanto@ esse ter1o ainda n:o distinguia se o progra1a 2liente e o progra1a ser<idor esta<a1 sendo e?e2utados e1 u1a 1es1a 1A=uina ou e1 1A=uinas di+erentes4 HoBe@ =uando se +ala e1 2liente;ser<idor@ estA se re+erindo a u1 pro2essa1ento 2ooperati<o distri5u8do@ onde o rela2iona1ento entre 2lientes e ser<idores s:o rela2iona1entos entre 2o1ponentes tanto de so+t>are =uanto de hard>are4 Portanto@ estare1os interessados na ar=uitetura 2liente;ser<idor en<ol<endo duas ou 1ais 1A=uinas e1 u1 pro2esso 2ooperati<o para e?e2utar a apli2a9:o4

Mudan9as de Paradig1as
Paradig1a !o1puta2ional 7 <is:o tradi2ional da 2o1puta9:o era 2entraliCada na +igura do 2o1putador4 =ue 2on2entra<a todos os ser<i9os e re2ursos +orne2idos aos usuArios4 O a2esso a esses 2o1putadores era +eito direta1ente pelo usuArio atra<Ds de te2lados e 1onitores4 E1 alguns 2asos@ essa 1A=uina era u1 e=uipa1ento poderoso 2apaC de atender <Arios usuArios si1ultanea1ente ,Main+ra1e.4 Ou ent:o@ era1 pe=uenos 2o1putadores isolados 2apaCes de atender u1 Eni2o usuArio de 2ada <eC4

Delphi Client/Server

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

Fig4 4 G 7r=uitetura de Main+ra1e H es=uerda e u1 2o1putador P! isolado H direita4 715os si15oliCa1 a <is:o 2o1puta2ional tradi2ional@ onde o +o2o D o 2o1putador4

Para =ue essas 1A=uinas pudesse1 a2o1panhar a 2res2ente de1anda de no<os re2ursos e ser<i9os seria ne2essArio e?pandir seus re2ursos de 1e1ria e pro2essa1ento4 No 2aso de se utiliCar apenas u1a 1A=uina ser<indo <Arios usuArios ,Main+ra1e.@ seria di+82il e?pandir ainda 1ais seus re2ursos para suportar as no<as de1andas te2nolgi2as@ prin2ipal1ente a inter+a2e grA+i2a4 Por outro lado@ atra<Ds de <Arias 1A=uinas isoladas@ os ser<i9os teria1 =ue ser repli2ados e 2ada 1A=uina in2re1entada para suportar tal pro2essa1ento4 7lD1 disso@ essa alternati<a n:o pro<I u1a 1aneira de 2o1uni2a9:o entre os usuArios4 Para atender a ne2essidade 2res2ente do usuArio de no<os ser<i9os e re2ursos@ surgiu'se a ne2essidade de interligar essas 1A=uinas@ para =ue Buntas pudesse1 +orne2er u1 nE1ero 1aior de 5ene+82ios4 7ssi1 2o1e9ara1 a apare2er a15ientes de redes =ue per1itia1 a distri5ui9:o de re2ursos e ser<i9os e1 lo2ais di+erentes@ au1entando a 2apa2idade do usuArio +inal4 !o1 isso as 1A=uinas =ue tinha1 =ue ser e=uipa1entos 2aros e poderosos podia1 ser aos pou2os su5stitu8das por <Arias 1A=uinas 1enores e de 2usto 1ais 5ai?o@ 1as =ue atra<Ds de u1 pro2esso 2ooperati<o 2onseguia1 pro<er +un2ionalidade 1aior4 !o1 o nE1ero 2ada <eC 1aior de 2o1putadores interligados@ esses dei?ara1 de ser o +o2o do a15iente 2o1puta2ional e toda a aten9:o e i1portJn2ia +ora1 destinadas Hs redes@ ele1entos responsA<eis e1 reunir os re2ursos e ser<i9os de <Arias 1A=uinas e disponi5iliCA'los aos usuArios de +or1a transparente e e+i2aC4

Delphi Client/Server

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

>e; +n#ormao

5ede
!ata >are?ousing

!ados

Fig 42G 7s redes interliga1 os 2o1putadores +orne2endo ser<i9os e re2ursos de +or1a es2alar e transparente para os usuArios +inais4

7s redes per1ite1 o 2res2i1ento do a15iente 2o1puta2ional de +or1a +le?8<el e es2alar@ possi5ilitando a disponi5ilidade de no<os re2ursos e ser<i9os ao usuArio +inal 2o1 u1a 2erta transparIn2ia4 HoBe@ ser<i9os no<os 2o1o We5@ DataWareHousing e outros pode1 ser 1ais +a2il1ente agregados ao par=ue 2o1puta2ional e disponi5iliCados a <Arios usuArios BA perten2entes a rede4 Nesse 1odelo@ o 2o1putador se torna apenas u1 1eio de a2esso a in+inidade de ser<i9os e re2ursos o+ere2idos por toda a rede4 Paradig1a do Neg2io Do ponto de <ista do neg2io@ as organiCa9Kes est:o sendo a+etadas por grandes 1udan9as no 1er2ado4 7s e1presas pre2isa1 se preparar para a glo5aliCa9:o da e2ono1ia e sere1 1ais rApidas na to1ada de de2is:o tornando'se 1ais 2o1petiti<as4

Fig 4/G Glo5aliCa9:o da e2ono1ia4 7 e1presas atua1 1undial1ente@ n:o ha<endo 1ais li1ites geogrA+i2os para a 2o1petiti<idade4

L1a aten9:o espe2ial de<e ser dada aos 2lientes =ue e?ige1 produtos 2ada <eC 1ais espe28+i2os e personaliCados4 Para suportar essa press:o 2o1petiti<a do 1er2ado@ os gerentes de neg2io de<e1 estar 1unidos de in+or1a9Kes e +erra1entas =ue os per1ita1 to1ar de2isKes de +or1a rApida e pre2isa4 In+or1a9Kes espe28+i2as e +unda1entais de<e1 ser e?tra8das da 5ase de dados 2orporati<a para dare1 suporte a essas de2isKes4 Portanto@ a <elo2idade
Delphi Client/Server 3

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

=ue a in+or1a9:o tra+ega pela e1presa D 1uito i1portante e u1 a15iente 2apaC de pro<er essa +un2ionalidade se torna real1ente ne2essArio4

+n#ormao

FigG 4&G Des2entraliCa9:o da in+or1a9:o4

!o1 o o5Beti<o de se tornare1 1ais 2o1petiti<as@ as e1presas tI1 pro2urado u1a +or1a de se organiCar 1elhor pro1o<endo u1 2onBunto de 1udan9as organiCa2ionais e estruturais e1 toda a 2orpora9:o4 *D2ni2as 2o1o MReengenhariaN s:o nor1al1ente apli2adas@ 2o1 o o5Beti<o de reorganiCar a e1presa e seus pro2essos de neg2io4 Essas organiCa9Kes do neg2io s:o 1uitas <eCes a2o1panhadas de u1a restrutura9:o dos siste1as de in+or1Ati2a e de todo o a15iente 2o1puta2ional4 O pre2iso estruturar u1 no<o a15iente des2entraliCado e e+i2iente =ue propor2ione a +un2ionalidade e a <elo2idade deseBada para <ia5iliCar a 2orpora9:o e1 u1 1er2ado 2ada <eC 1ais a5rangente e 2o1petiti<o4

E<olu9:o da 7r=uitetura
O o5Beti<o da ar=uitetura 2liente;ser<idor D propor2ionar u1 a15iente 2apaC de 2o1partilhar os re2ursos e ser<i9os de <Arias 1A=uinas interligadas e pro<er u1a 1aneira 2ooperati<a de e?e2utar as apli2a9Kes dos usuArios +inais4 7 seguir ser:o 1ostradas algu1as ar=uiteturas para e?pli2ar a +orte tendIn2ia a a15ientes distri5u8dos 2ooperati<os4 7r=uitetura *i1e')haring Essa ar=uitetura D 5aseada e1 u1 pro2essa1ento 2entraliCado4 L1a 1A=uina@ 2ha1ada de hospedeiro@ D responsA<el por rodar todos os progra1as e geren2iar todos os re2ursos4 O te1po de pro2essa1ento D 2o1partilhado pelos progra1as@ si1ulando u1a e?e2u9:o e1 paralelo4 Os usuArios tI1 a2esso a esses ser<i9os e re2ursos atra<Ds de ter1inais 2one2tados lo2al1ente ou re1ota1ente4 Esse ter1inais n:o possue1 nenhu1a 2apa2idade de pro2essa1ento e 2onsiste1 5asi2a1ente de u1a tela@ u1 te2lado e do hard>are ne2essArio para se 2o1uni2ar 2o1 o hospedeiro4 Essa ar=uitetura per1ite o 2o1partilha1ento da 5ase de dados da apli2a9:o tornando a in+or1a9:o dispon8<el de =ual=uer ter1inal4 Entretanto@ 2o1 o surgi1ento de no<as ne2essidades@ 2o1o a inter+a2e grA+i2a e outros ser<i9os =ue ne2essita1 2ada <eC 1ais de pro2essa1ento@ esse 1odelo 2o1e9ou'se a tornar e2ono1i2a1ente e +isi2a1ente in<iA<el BA =ue todo o pro2essa1ento D
Delphi Client/Server 4

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

realiCado e1 u1a Eni2a 1A=uina4 Os e?e1plos 1ais 2onhe2idos dessa ar=uitetura s:o os siste1as e1 Main+ra1es e alguns siste1as e1 LNIP4

Processamento

Fig 454 7r=uitetura *i1e')haring

7r=uitetura Resour2e')haring Essa ar=uitetura 2onsiste de <Arios 2o1putadores ,esta9Kes de tra5alho. interligados@ sendo 2ada u1 2apaC de realiCar seu prprio pro2essa1ento4 7lguns desses 2o1putadores s:o responsA<eis e1 2o1partilhar e geren2iar re2ursos tais 2o1o i1pressora@ dis2o@ et2 ,ser<idores de rede.4 Entretanto@ a rede n:o D utiliCada para propor2ionar u1 pro2essa1ento 2ooperati<o entre as 1A=uinas4 *odo o pro2essa1ento da apli2a9:o D ainda +eito por u1a Eni2a 1A=uina@ ha<endo apenas o 2o1partilha1ento de re2ursos4 7tra<Ds dessa ar=uitetura D poss8<el 2o1partilhar a 5ase de dados da apli2a9:o@ per1itindo o a2esso por <Arias pessoas si1ultanea1ente4 Mas 2o1o todo o pro2essa1ento dos dados D realiCado e1 2ada 1A=uina@ a ne2essidade de u1 <olu1e 1aior de in+or1a9Kes torna in<iA<el o trA+ego de in+or1a9Kes pela rede4 Para resol<er esse pro5le1a seria ne2essArio =ue a 1A=uina responsA<el e1 ar1aCenar os dados +iCesse u1 pro2essa1ento lo2al 2apaC de en<iar u1a =uantidade 1enor de dados para a 1A=uina =ue estA pro2essando a apli2a9:o4

Delphi Client/Server

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

Servidor de 5ede

A1li a4es

Processamento Processamento
Fig4 4-G 7r=uitetura Resour2e')haring4

7r=uitetura !liente;)er<idor Essa ar=uitetura ta15D1 2onsiste de <Arios 2o1putadores@ 2ada u1 2o1 seu prprio pro2essa1ento@ interligados e1 rede4 7 di+eren9a 5Asi2a para a ar=uitetura Resour2e')haring D =ue a=ui BA 2o1e9a a ha<er u1 pro2essa1ento distri5u8do 2ooperati<o4 Parte do pro2essa1ento@ =ue era +eito pela 1A=uina da apli2a9:o@ D +eito agora pela prpria 1A=uina responsA<el pelo ar1aCena1ento e distri5ui9:o da in+or1a9:o@ di1inuindo assi1 o trA+ego de in+or1a9Kes na rede4 Portanto@ pode'se e de<e'se sele2ionar os dados =ue ser:o en<iados para o usuArio para u1a 1elhor e+i2iIn2ia do a15iente4 Esse 1odelo BA 2o1e9a a retirar partes espe28+i2as de pro2essa1ento das apli2a9Kes =ue era1 e?e2utadas pelas 1A=uinas 2lientes@ 2entraliCando'as nas 1A=uinas de lo2aliCa9:o +8si2a 1ais ade=uada@ garantindo assi1 u1a 1elhor distri5ui9:o do pro2essa1ento e utiliCa9:o do a15iente4 7tra<Ds dessas espe2ialiCa9Kes garante'se ta15D1 u1 1elhor geren2ia1ento e +a2ilidade de 1anuten9:o dos ser<i9os de<ido a sua 2on2entra9:o e1 u1 ou pou2os lo2ais +8si2os4

Delphi Client/Server

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

Servidor de Ban o de !ados @!BMSA

Servidor de 5ede

Processamento Processamento

Processamento

A1li a4es
Processamento
Fig4 4# 7r=uitetura !liente;)er<idor4

Pode1os 2itar alguns 5ene+82ios =ue esta no<a ar=uitetura traC para o a15iente 2o1puta2ional das e1presasG Per1ite Hs 2orpora9Kes ala<a2are1 a te2nologia de 2o1putadores MdesQtopsN4 HoBe@ as esta9Kes de tra5alho BA possue1 u1 poder 2o1puta2ional 2onsiderA<el@ por u1 2usto 1uito 1ais 5ai?o@ antes s dispon8<el e1 MMain+ra1esN4 Per1ite =ue o pro2essa1ento seBa +eito 1ais pr?i1o da orige1 dos dados reduCindo o trA+ego na rede4 Fa2ilita a utiliCa9:o de apli2a9Kes grA+i2as e 1ulti18dias4 Isto per1ite a 2onstru9:o de apli2a9Kes =ue e?2ede1 as e?pe2tati<as dos usuArios propor2ionando'lhes u1 real au1ento de produti<idade4 Per1ite e en2oraBa a utiliCa9:o de siste1as a5ertos@ BA =ue 2lientes e ser<idores pode1 rodar e1 di+erentes hard>ares e so+t>ares@ li<rando as 2orpora9Kes de ar=uiteturas proprietArias4 Entretanto@ essa ar=uitetura ainda n:o D per+eita4 7lgu1as 2ara2ter8sti2as ne2essArias para u1 2o1pleto pro2esso distri5u8do ainda n:o +ora1 o5ser<adas nesse 1odelo =ue ainda apresenta algu1as de+i2iIn2iasG )e u1a por9:o signi+i2ante da lgi2a da apli2a9:o +or 1o<ida para o ser<idor@ esse se torna u1 MgargaloN assi1 2o1o na ar=uitetura de MMain+ra1eN4 Para resol<er esse pro5le1a seria ne2essArio u1a 1elhor
Delphi Client/Server "

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

distri5ui9:o e geren2ia1ento do pro2essa1ento da lgi2a da apli2a9:o4 Isto dA orige1 a u1a no<a ar=uitetura 2ha1ada M)egunda Gera9:o !liente;)er<idorN4 O pro2esso de 2onstru9:o de apli2a9Kes distri5u8das D 5e1 1ais 2o1ple?o =ue o desen<ol<i1ento de apli2a9Kes n:o distri5u8das de<ido ao 1aior nE1ero de parJ1etros a sere1 de+inidos@ ao des2onhe2i1ento da te2nologia e a +alta de padrKes e +erra1entas =ue au?ilie1 essa a15ienta9:o4 Portanto@ 1uito te1po pode ser 2onsu1ido no pro2esso de de+ini9:o e 2onstru9:o do a15iente de desen<ol<i1ento4 Esse te1po D 1uitas <eCes su5esti1ado pelas e1presas de<ido ao des2onhe2i1ento e as +alsas propagandas dos <endedores de +erra1entas4

Pri1eira Gera9:o !liente;)er<idor


Pode1os de+inir 2liente;ser<idor 2o1o u1a ar=uitetura 2o1puta2ional =ue <isa distri5uir os re2ursos e o pro2essa1ento de +or1a inteligente 2o1 o o5Beti<o de oti1iCar o dese1penho da rede e dos siste1as@ 1a?i1iCando a utiliCa9:o dos re2ursos de 2ada 1A=uina e +orne2endo u1a 5ase slida e +le?8<el para a i1planta9:o de u1 nE1ero 2res2ente de ser<i9os4 7lgu1as i1ple1enta9Kes desse tipo BA <I1 sendo utiliCadas e1 <Arias e1presas e s:o 2onhe2idas 2o1o a pri1eira gera9:o 2liente;ser<idor4 Para 2o1partilhar re2ursos@ 2o1o dis2o e i1pressora@ s:o utiliCados )er<idores de 7r=ui<os na rede4 Estes s:o siste1as 2o1 a +un9:o de pro2essar as re=uisi9Kes aos ar=ui<os e i1pressoras e geren2iar seu a2esso e distri5ui9:o4 7lD1 disso@ parte do pro2essa1ento das apli2a9Kes ta15D1 +oi distri5u8do4 7lguns ser<i9os de 1anipula9:o e geren2ia1ento de dados +ora1 retirados das apli2a9Kes e 2olo2ados e1 pontos 2entraliCados 2onhe2idos 2o1o M)er<idores de Ran2o de DadosN@ tornando o pro2essa1ento dos dados 1ais pr?i1o do seu lo2al de ar1aCena1ento4 Os siste1as =ue +orne2e1 tais ser<i9os +ora1 2ha1ados de M)iste1as Geren2iadores de Ran2o de DadosN ' )GDR4 Rasi2a1ente@ a pri1eira gera9:o de 2liente;ser<idor se 2ara2teriCa por essa distri5ui9:o do pro2essa1ento da apli2a9:o entre dois 2o1ponentesG a esta9:o de tra5alho do usuArio e o ser<idor de 5an2o de dados4 S 1edida =ue a ar=uitetura 2liente;ser<idor e<olui@ no<as partes da apli2a9:o <:o sendo distri5u8das e no<os ele1entos <:o apare2endo no a15iente4

)egunda Gera9:o !liente;)er<idor


HoBe@ a te2nologia 2liente;ser<idor BA 2a1inha para sua segunda gera9:o4 Essa gera9:o e?plora 1ais o a15iente de rede e suas 1A=uinas4 )urge1 no<os ser<idores 2o1a +inalidade de retirar das esta9Kes de tra5alho grande parte do pro2essa1ento =ue elas realiCa14 Os prin2ipais ele1entos dessa no<a ar=uitetura s:o os ser<idores de apli2a9:o e os ser<idores MWe5N4

Delphi Client/Server

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

Os ser<idores de apli2a9:o s:o responsA<eis por retirar o restante da 2a1ada de 1anipula9:o de dados =ue ainda ha<ia na esta9:o 2liente4 7lD1 disso@ te1 o o5Beti<o de 2on2entrar a lgi2a de neg2io@ antes distri5u8da entre a esta9:o

!ap8tulo

2liente e o ser<idor de 5an2o4 Nor1al1ente@ esse tra5alho n:o D +eito por u1 Eni2o ser<idor de apli2a9:o e si1 por u1 2onBunto de ser<idores onde o pro2essa1ento D 5alan2eado atra<Ds de ele1entos 2ha1ados MMidlle>areN4 Desta +or1a resta para a esta9:o 2liente@ o pro2essa1ento da inter+a2e <isual 2o1 o usuArio@ dei?ando'a 1ais le<e@ e?igindo u1a 1enor 2on+igura9:o e 1elhorando seu dese1penho4 Os ser<idores MWe5N tenta1 ir 1ais longe ainda@ per1itindo retirar das esta9Kes de tra5alho atD parte da lgi2a da inter+a2e <isual@ dei?ando'as responsA<eis apenas por interpretar o 2digo MH*MLN en<iado pelos ser<idores4 Entretanto@ 2o1 a utiliCa9:o de 2o1ponentes 2o1o Ta<a e 72ti<eP@ parte do pro2essa1ento pode retornar H esta9:o de tra5alho4 Essas no<as te2nologias traCe1 1ais re2ursos@ 1as torna1 o a15iente 1ais 2o1ple?o e di+82il de ser i1ple1entado4 O pre2iso estar 5e1 2erto do =ue se pretende e n:o +aCer uso de u1a te2nologia 1ais no<a se1 a 2onhe2I'la direito ou se1 a real ne2essidade de utiliCA'la4

)GDR ' )iste1as Geren2iadores de Ran2o de Dados


Esse captulo apresenta os sistemas gerenciadores de banco de dados, seus servios, recursos e modelos.

s )GRDs s:o siste1as responsA<eis e1 ar1aCenar os dados e +orne2er ser<i9os 2apaCes de 1anipulA'los4 Para ar1aCenar os dados e1 u1 dis2o@ os )GRDs possue1 u1a +or1a estruturada padr:o de representar os registros e 2a1pos@ +orne2endo ser<i9os =ue per1ite1 a 2ria9:o e altera9:o dessas de+ini9Kes de dados4 Forne2e1 ainda@ u1 1e2anis1o interno para 1anter os dados no dis2o e para sa5er onde estA 2ada ele1ento e1 parti2ular4 *a15D1 s:o responsa5ilidades do )GDRs disponi5iliCar ser<i9os para in2luir@ 2lassi+i2ar@ atualiCar e eli1inar os dados ar1aCenados4
Delphi Client/Server $

I N T R O D U O

A O

M O D E L O

C L I E N T E / S E R V I D O R

Pela +or1a 2o1 =ue os dados s:o ar1aCenados e de 2o1o eles se rela2iona1 pode1os 2lassi+i2ar os )GRDs atra<Ds de <Arios 1odelos atD 2hegar1os aos 5an2os de dados rela2ionais4

Modelos de Ran2o de Dados


7nalisando os di<ersos 1odelos de 5an2o de dados@ pode'se notar u1a e<olu9:o no rela2iona1ento entre os dados@ eli1inando 2ada <eC 1ais a redundJn2ia e propor2ionando 1ais +le?i5ilidade e portanto u1a 1aior +a2ilidade de 1anuten9:o das de+ini9Kes de dados4 Para 1elhor entender1os os 1odelos <a1os utiliCar os dados das trIs guias de pedidos da +ig4 24 4

Delphi Client/Server

1%

Fig4 24 G Guia de Pedido4

)iste1a de Geren2ia1ento de 7r=ui<os Esse D o Eni2o siste1a =ue des2re<e 2o1o os dados s:o ar1aCenados4 Nesse 1odelo 2ada 2a1po ou ite1 de dado D ar1aCenado se=Uen2ial1ente no dis2o e1 u1 Eni2o e grande ar=ui<o4 Para en2ontrar u1 ite1 de dado D ne2essArio <eri+i2ar 2ada ele1ento desde o in82io do ar=ui<o4 7 Eni2a <antage1 desse 1Dtodo D sua si1pli2idade@ BA =ue seu +or1ato 1uito se pare2e 2o1 o de u1 ar=ui<o te?to onde as pala<ras se en2ontra1 es2ritas e1 u1a deter1inada se=UIn2ia4 Entretanto@ por 2ausa dessa si1pli2idade@ 1uitos dados tI1 =ue ser es2ritos repetida1ente gerando u1a enor1e redundJn2ia =ue di+i2ulta a 1anuten9:o e a integridade dos dados4 N:o hA ta15D1 nenhu1a indi2a9:o de rela2iona1ento entre os dados@ e o progra1ador pre2isa sa5er e?ata1ente 2o1o os dados est:o ar1aCenados para poder a2essA'los de +or1a 2onsistente4 7lD1 disso@ sua estrutura +8si2a D r8gida@ o =ue di+i2ulta altera9Kes na de+ini9Kes dos dados@ gerando a ne2essidade de re2onstruir todo o ar=ui<o4

1 B ("/1"/,) B Ana Maria &ima B ,,,.8%).$$$2(( B Caneta B 1" B1"C"" B &01is B $ B $C"" B 1$C"" B ( B (1/1"/,) B Maria DosE B 111.1112(( B Caneta B 1$ B 1$C"" B Caderno B ... 111.
Fig4 242G )iste1a de Geren2ia1ento de 7r=ui<os4

Ran2o de Dados HierAr=ui2o Nesse 1odelo@ os dados s:o organiCados e1 u1a estrutura de Ar<ore =ue se origina a partir de u1a raiC4 Essa estrutura identi+i2a as rela9Kes Mpai'+ilhoN entre
Delphi Client/Server 11

os <Arios itens do 5an2o de dados@ 1ostrando assi1 suas <antagens so5re o 1odelo de geren2ia1ento de ar=ui<os4 No 1odelo hierAr=ui2o D poss8<el de+inir rela9Kes Mde'u1'para'1uitosN =ue +a2ilita e a2elera o pro2esso de pes=uisa dos dados4 Para en2ontrar u1a in+or1a9:o@ n:o D 1ais ne2essArio per2orrer o ar=ui<o inteiro4 Rasta e?a1inar o ite1 pedido@ de2o1pV'lo e1 2o1ponentes e des2er pelos ra1os ne2essArios atD en2ontrA'lo4 Esse 1Dtodo@ ta15D1 +a2ilita a inser9:o de no<os dados@ de<ido aos rela2iona1entos entre os 2a1pos sere1 +eitos atra<Ds de ponteiros4 Para inserir u1 no<o ele1ento 5asta alterar os ponteiros dos rela2iona1entos entre pais e +ilhos4

5ai/ 1
("/1"/,) 1$C""
,,,.8%).$$$2((

(
(1/1"/,) )$C""
111.111.1112((

Maria DosE 1$ Caneta 1$C"" Caderno $ $"C""

Ana Maria 1"

Caneta 1"C"" $

&01is $C""

Fig4 24/G Ran2o de Dados HierAr=ui2o4

Entretanto@ esse 1Dtodo ainda possui alguns pro5le1as4 !ada n8<el da Ar<ore D ini2ial1ente de+inido e =ual=uer altera9:o na estrutura desses n8<eis D u1a tare+a di+82il4 7lD1 disso@ o pro5le1a da redundJn2ia de dados ainda n:o +oi resol<ido@ BA =ue esse 1odelo n:o i1ple1enta rela9Kes de M1uitos'para' 1uitosN4 No e?e1plo@ pode1os notar a repeti9:o de algu1as in+or1a9Kes@ o =ue di+i2ulta a integridade e 1anuten9:o dos dados4 Ran2o de Dados de Rede O 1odelo de rede des2re<e@ 2on2eitual1ente@ os 5an2o de dados nos =uais per1ite1 rela9Kes de M1uitos'para'1uitosN entre os ele1entos de dados4 Desta +or1a 2ada ite1 possui u1 ponteiro para os itens 2o1 os =uais se rela2iona@ eli1inando assi1 a ne2essidade de =ual=uer tipo de redundJn2ia de dados4 O grande pro5le1a desse 1odelo D a sua 2o1ple?idade de<ido a +le?i5ilidade e?istente e1 suas rela9Kes4 Wuando o <olu1e de dados 2o1e9a a 2res2er@ os rela2iona1entos entre os itens de dados +i2a1 2ada <eC 1ais 2o1ple?os@ tornando sua <isualiCa9:o e entendi1ento 2ada <eC 1ais di+82eis4

Delphi Client/Server

12

5ai/ 1 ( -

Ana Maria
,,,.8%).$$$2((

&01is

Caneta

Caderno

Maria DosE
111.111.1112((

Fig4 24&G Ran2o de Dados de Rede4

Ran2o de Dados Rela2ional E1 $-$@ +oi pu5li2ado pelo Dr4 E4 F4 !odd@ o pri1eiro artigo =ue de+inia u1 1odelo 2o1 5ase no 2on2eito 1ate1Ati2o dos 2onBuntos rela2ionais4 7 partir desse artigo@ o 1odelo rela2ional te1 sido re+inado@ atD =ue $%5 o prprio Dr4 !odd lan9ou as M 2 regrasN =ue de+inia1 u1 5an2o de dados rela2ional4 E1 $$(@ +ora1 pu5li2adas as /// regras =ue s:o su52onBuntos e e?pansKes das 2 regras originais4 O 1odelo rela2ional a5andona o 2on2eito de rela9Kes Mpai'+ilhoN +eitas direta1ente entre os dados e os organiCa e1 2onBuntos 1ate1Ati2os lgi2os de estrutura ta5ular4 Nesse 1odelo@ 2ada ite1 de dado perten2e a u1a 2oluna da ta5ela e u1a linha da ta5ela D 2o1posta por <Arios ele1entos direta1ente rela2ionados4 7s ta5elas ta15D1 se rela2iona1 atra<Ds de +un9Kes 1ate1Ati2as 2o1o TOINs e LNIONs4 Para +aCer esse rela2iona1ento parte dos dados@ =ue identi+i2a1 uni2a1ente o registro da ta5ela@ s:o repetidos dentro da outra ta5ela4 7s <antagens desse 1Dtodo s:o sua si1pli2idade e +le?i5ilidade nas de+ini9Kes das rela9Kes entre os <Arios itens de dados@ BA =ue n:o s:o +eitos direta1ente entre os dados e si1 entre as ta5elas4 Entretanto@ esse 1Dtodo n:o eli1ina por 2o1pleto a redundJn2ia de dados@ BA =ue no 18ni1o os rela2iona1entos entre as ta5ela s:o +eitos atra<Ds da repeti9:o de parte dos dados4 7lD1 dessa redudJn2ia@ +i2a a 2argo do proBetista do 5an2o de dados se 1ais repeti9Kes de dados ir:o ou n:o +aCer parte do 1odelo4 O pro2esso de +rag1enta9:o dos dados@ a +i1 de sere1 organiCados e1 su52onBuntos ,ta5elas.@ D 2onhe2ido 2o1o nor1aliCa9:o4

Delphi Client/Server

13

Pedido
FumPed 1 ( !ata ("/1"/,) (1/1"/,) ((/1"/,) .alor 1$C"" )$C"" ($C"" Cliente 1 ( (

+tens
FumPed 1 1 ( ( Produto Caneta &01is Caneta Caderno &01is Caderno 'uantid. .alor 1" $ 1$ $ 1$ 1 1"C"" $C"" 1$C"" $"C"" 1$C"" 1"C""

Cliente
Codigo 1 ( Fome CP7 Ana Maria &ima ,,,.8%).$$$2(( Maria DosE 111.111.1112((

Fig4 245G Ran2o de Dados Rela2ional4

Delphi Client/Server

14

Ran2os de Dados Rela2ionais


Esse captulo apresenta algumas caractersticas dos bancos de dados relacionais.

!ap8tulo

s 5an2os de dados rela2ionais <I1 se tornando u1 padr:o no 1er2ado@ ser<indo 2o1o 5ase de dados para a 1aioria dos siste1as das e1presas4 7 2ada dia@ 1ais +erra1entas s:o 2onstru8das para tirar pro<eito dessa te2nologia@ +aCendo surgir u1 nE1ero 2res2ente de re2ursos e produtos a sere1 o+ere2idos para os usuArios4 Pode'se diCer ent:o@ =ue esta D u1a te2nologia slida e 2onsistente e =ue irA a2o1panhar o 1er2ado por u1 longo per8odo de te1po4 No entanto@ D u1a te2nologia =ue 2ontinua e<oluindo 2o1 o o5Beti<o de disponi5iliCar as in+or1a9Kes para os usuArios de 1aneira e+i2iente@ <ia5iliCando o neg2io da 2orpora9:o e des2entraliCando as to1adas de de2is:o4

!lassi+i2a9:o
Wuanto a 2apa2idade@ re2ursos e +a2ilidade de uso@ os 5an2o de dados rela2ionais pode1 ser di<ididos e1 trIs 2ategoriasG 2orporati<os@ departa1entais e lo2ais4 E1 u1a 1es1a e1presa todas as 2ategorias pode1 2oe?istir e 2ooperar entre si para Buntas +or1are1 u1a poderosa 5ase de dados distri5u8da4

Delphi Client/Server

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Cor1orativo

!e1artamentais

&o ais

Fig /4 G !lassi+i2a9:o dos 5an2os de dados4

!orporati<os )iste1a de 5an2o de dados para atender toda a 2orpora9:o4 Os prin2ipais siste1as dessa 2ategoria s:oG DR2@ Ora2le@ )X5ase@ In+or1i? e Ingres4 Estes 5an2os de<e1 ser 2apaCes de ar1aCenar e 1anipular de 1aneira e+i2iente grandes <olu1es de dados e per1itir a2esso rApido a u1 nE1ero ele<ado de usuArios 2one2tados ao 1es1o te1po4 De<ido a sua enor1e 2apa2idade@ os pre9os desses 5an2os s:o ta15D1 1ais ele<ados e nor1al1ente ne2essita1 de pro+issionais espe2ialiCados para 2on+igurA'los e 1onitorA'los no dia a dia4 Departa1entais )iste1as de 5an2o de dados 2apaCes de atender as re=uisi9Kes de dados a n8<el de u1 departa1ento4 Nesse pata1ar@ e?iste1 5an2os de dados 1ais 5aratos e 1ais +A2eis de 2on+igurar@ entre eles est:oG Inter5ase@ )WL)er<er@ )WLRase4 7 1aioria dos +orne2edores de 5an2os de dados da 2ategoria 2orporati<a est:o ta15D1 disponi5iliCando <ersKes departa1entais para disputar esse 1er2ado@ traCendo 2o1o <antage1 a possi5ilidade de per1ane2er 2o1 o 1es1o +orne2edor e1 todos os n8<eis@ tornando o a15iente 1ais integrado4 Por outro lado@ as prin2ipais <antagens dos 5an2os desen<ol<idos espe2ial1ente para essa plata+or1a s:oG a +a2ilidade de 2on+igura9:o@ o pre9o dos produtos e a 1enor re=uisi9:o de re2ursos de hard>are4 Lo2ais ou M<eis )iste1as de 5an2o de dados 2apaCes de rodar na 1es1a 1A=uina =ue a apli2a9:o4 Nessa 2ategoria os prin2ipais re=uisitos s:oG ser u1 5an2o de dados 5astante le<e =ue gaste pou2os re2ursos do siste1a opera2ional e da
Delphi Client/Server 1!

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

1A=uina,1e1ria@ pro2essa1ento@ et2. e =ue n:o ne2essite de geren2ia1ento podendo rodar 5asi2a1ente 2o1 sua 2on+igura9:o original4 Nessa 2ategoria pode1os 2itar os 5an2os Inter5ase@ )WLRase e )WL7nX>here4 Os +orne2edores 2orporati<os ta15D1 est:o des2endo para esse n8<el4 PorD1@ para 1anter os 5an2os de dados 2o1 os 1es1os re2ursos te1 sido di+82il tornA'los le<es e +A2eis su+i2iente1ente4 7lguns +orne2edores possue1 atD siste1as de 5an2o de dados di+erentes para 2ada plata+or1a4 !o1o esses 5an2os s:o instalados na 1es1a 1A=uina D poss8<el sua utiliCa9:o e1 Mnote5ooQsN4 Isso per1ite as e1presas 1antere1 a 1es1a te2nologia de 5an2o de dados rela2ional e1 apli2a9Kes 1<eis@ +a2ilitando a integra9:o 2o1 a 5ase 2orporati<a da e1presa4 De<e'se notar entretanto@ =ue n:o estA se +aCendo uso da ar=uitetura 2liente;ser<idor nesse 2aso@ BA =ue a 1es1a 1A=uina D utiliCada para rodar o apli2ati<o e o siste1a geren2iador de 5an2o de dados4 7 prin2ipal <antage1 dessa utiliCa9:o so5re a utiliCa9:o de 5ase de dados de ar=ui<os@ D =ue a Elti1a n:o possui re2ursos su+i2ientes para 1anter a integridade dos dados e das transa9Kes4 Os siste1as geren2iadores de 5an2o de dados s:o ta15D1 1enos +a2t8<eis a 2orrup9:o de dados e +alhas do =ue os siste1as 5aseados e1 ar=ui<os onde o geren2ia1ento D +eito por 2ada apli2a9:o4 Outra <antage1 D pro<er 1ais +a2ilidade de integra9:o 2o1 as 5ases departa1entais e 2orporati<as@ por utiliCare1 a 1es1a te2nologia4 Entretanto@ os )GDRs possue1 u1 2usto adi2ional e e?ige1 u1a 2on+igura9:o de 1A=uina 1elhor de<ido a u1 nE1ero 1aior de 2a1adas =ue ter:o =ue ser per2orridas para se 2hegar ao dado4

Modelage1 de Dados
Modelage1 de dados D o pro2esso utiliCado para de+inir a estrutura do 5an2o de dados atra<Ds da distri5ui9:o dos dados nas ta5elas4 E?iste1 1aneiras di+erentes de se de+inir o 1es1o 2onBunto de dados@ e u1a 5oa 1odelage1 de dados pode +a2ilitar 5astante o desen<ol<i1ento das apli2a9Kes4 Ya1os ressaltar a=ui@ dois pontos =ue de<e1 ser o5ser<ados na 2onstru9:o do 1odeloG o pro2esso de nor1aliCa9:o e a propaga9:o de 2ha<es pri1Arias4 Nor1aliCa9:o *D2ni2a de anAlise e organiCa9:o de dados =ue <isa deter1inar a 1elhor 2o1posi9:o para u1a estrutura de dados4 Os prin2ipais o5Beti<os dessa tD2ni2a s:oG Eli1inar ano1alias =ue di+i2ulta1 as opera9Kes so5re os dadosZ Mini1iCar as redundJn2ias e os 2onse=Uentes ris2os de in2onsistIn2iasZ ReduCir e +a2ilitar as 1anuten9Kes4 !o1o e?e1plo@ <a1os utiliCar u1 1odelo@ no =ual todos os dados +ora1 2olo2ados e1 u1a Eni2a ta5ela atra<Ds dos seguintes 2a1posG
Delphi Client/Server 1"

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Nu1Ped@ DataPed@ YalorPed@ No1e!liente@ !PF!liente@ No1eProduto @ Pre9oProduto @ Wuantidade @ YalorIte1 @ No1eProduto2@ Pre9oProduto2@ Wuantidade2@ YalorIte12@444@ No1eProduto5@ Pre9oProduto5@ Wuantidade5@ YalorIte15
Pri1eira For1a Nor1al

L1a ta5ela estA na pri1eira +or1a nor1al se n:o possuir grupos de atri5utos repetiti<os4

C C C

D D D

Chave

Grupo Repetitivo
Fig4 /42G Presen9a de grupos repetiti<os e1 u1a ta5ela rela2ional4

Para resol<er esse pro5le1a@ de<e'se re1o<er os grupos repetiti<os para u1a outra ta5ela 7 2ha<e pri1Aria dessa no<a ta5ela pode ser +or1ada atra<Ds da 2ha<e pri1Aria da ta5ela original 1ais u1 2onBunto de no<os atri5utos4

* *

Estrutura Original Nova Estrutura

Obs. Chave prim!ria "a nova estrutura # atributo$chave "a estrutura original % atributo i"enti&ica"or "o grupo repetitivo.
Fig4 /4/G Eli1ina9:o de grupos repetiti<os e1 u1a ta5ela4

Delphi Client/Server

1#

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Desta +or1a@ eli1ina'se a de+i2iIn2ia do pri1eiro 1odelo =ue li1ita<a o nE1ero de itens de produto =ue u1 pedido podia ter4 Nessa no<a estrutura n:o hA li1ite para os itens@ 1as 2ontinua'se 1antendo a rela9:o =ue e?istia entre os itens e o pedido atra<Ds da in2lus:o do nE1ero do pedido na no<a ta5ela4

GFumPed GFumPed !ataPed GFomeProduto .alorPed PreoProduto FomeCliente 'uantidade CP7Cliente .alor+tem
Fig4 /&G E?e1plo na pri1eira +or1a nor1al4

)egunda For1a Nor1al

L1a ta5ela estA na segunda +or1a nor1al =uando sua 2ha<e pri1Aria n:o +or 2o1posta ou =uando todos os atri5utos Mn:o 2ha<esN +ore1 +un2ional1ente dependentes da 2ha<e inteira e esta esti<er na pri1eira +or1a nor1al4 L1 atri5uto M5N D dependente +un2ional1ente de MaN se dado o <alor de MaN@ o <alor de M5N puder ser deter1inado4

Chave Composta

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


Fig4 /45G Modelo na FN 1as n:o e1 2FN4 Presen9a de atri5utos dependentes +un2ional1ente de apenas parte da 2ha<e pri1Aria4

Para resol<er esse pro5le1a@ 5asta re1o<er os atri5utos =ue depende1 apenas de parte da 2ha<e pri1Aria para u1a no<a ta5ela4 7 2ha<e pri1Aria da no<a ta5ela passa a ser ent:o essa parte da 2ha<e pri1Aria da ta5ela original da =ual o atri5uto dependia4
Delphi Client/Server 1$

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

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*.
Fig /4-G Restrutura9:o do 1odelo na segunda +or1a nor1al

No e?e1plo de pedido@ isso o2orre 2o1 a 2oluna PRE!OPRODL*O@ =ue depende apenas do NOMEPRODL*O e n:o depende de NLMPED4 Dado o no1e do produto D poss8<el sa5er seu pre9o n:o i1portando o pedido =ue o produto perten9a4 7ssi1 o pre9o do produto seria repetido e1 <Arios registros da estrutura desne2essaria1ente e di+i2ultando a 1anuten9:o e 2onsistIn2ia dos dados4 Para e<itar essa redundJn2ia@ de<e'se 2riar u1a no<a estrutura e a 2ha<e pri1Aria dessa no<a ta5ela seria o NOMEPRODL*O@ porD1 por =uestKes de e+i2iIn2ia pode'se 2riar u1a no<a 2oluna !ODPRODL*O de ta1anho 1enor para +aCer a liga9:o entre as ta5elas4 7lD1 da e+i2iIn2ia@ esse pro2edi1ento possi5ilita altera9Kes +uturas nos no1es dos produtos@ BA =ue esses n:o s:o 1ais usados 2o1o 2ha<e pri1Aria4

GFumPed GFumPed !ataPed GCodProduto .alorPed 'uantidade FomeCliente .alor+tem CP7Cliente


Fig4 /4#4 E?e1plo na segunda +or1a nor1al4

GCodProduto FomeProduto PreoProduto

*er2eira For1a Nor1al

L1a ta5ela estA na ter2eira +or1a nor1al =uando estA na segunda +or1a nor1al e n:o possui nenhu1 atri5uto Mn:o 2ha<eN dependendo +un2ional1ente de outro atri5uto Mn:o 2ha<eN4

Delphi Client/Server

2%

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

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


Fig4 /4%G Presen9a de atri5utos dependentes +un2ional1ente de outros atri5utos n:o'2ha<e4

Para resol<er esse pro5le1a@ 5asta re1o<er os atri5utos =ue depende1 de outros atri5utos n:o 2ha<e para u1a no<a ta5ela4 7 2ha<e pri1Aria da no<a ta5ela passa a ser ent:o o atri5uto n:o 2ha<e =ue possui dependentes4

* *

Estrutura Original

Nova Estrutura

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

No e?e1plo apresentado@ hA u1a dependIn2ia +un2ional do !PF!LIEN*E 2o1 o NOME!LIEN*E@ ou <i2e'<ersa BA =ue a15os s:o 2andidatos a de+inir uni2a1ente u1 2liente4 Dado o <alor de NOME!LIEN*E D poss8<el deter1inar o <alor de !PF!LIEN*E portanto esse n:o depende da 2ha<e pri1Aria NLMPED4 Para eli1inar tal redundJn2ia@ de<e'se 2riar u1a outra estrutura e 2olo2ar o 1odelo na ter2eira +or1a nor1al4

Delphi Client/Server

21

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Pedido GFumPed !ataPed .alorPed CodCliente +temPedido GFumPed GCodProduto 'uantidade .alor+tem
Fig4 /4 (G E?e1plo na ter2eira +or1a nor1al4

Cliente GCodCliente FomeCliente CP7Cliente Produto GCodProduto FomeProduto PreoProduto

E?iste1 outras +or1as nor1ais@ entretanto@ 2olo2ando'se o 1odelo na ter2eira +or1a nor1al BA D poss8<el tratar os dados de +or1a 2onsistente e segura pro<endo u1a 2erta +a2ilidade no desen<ol<i1ento4 Propaga9:o de 2ha<es pri1Arias Outro pro2esso =ue de<e ser 5e1 de+inido D =uanto a +or1a de propaga9:o de 2ha<es entre as ta5elas4 No e?e1plo anterior pode'se o5ser<ar =ue a 2ha<e pri1Aria da ta5ela Ite1 +oi +or1ada pela propaga9:o da 2ha<e pri1Aria das ta5elas Pedido e Produto4

+temPedido GFumPed GCodProduto 'uantidade .alor+tem


Fig4 /4 G *a5ela de Itens4 !ha<e pri1Aria 2o1posta pela propaga9:o das 2ha<es pri1Arias de outras ta5elas4

Essa tD2ni2a de propagar as 2ha<es pri1Arias tornando'as ta15D1 2ha<es pri1Arias na ta5ela destino pode +a2ilitar 2onsultas di1inuindo o nE1ero de ta5elas utiliCadas no 2o1ando4 I1agine u1a ta5ela de histri2os de itens =ue ar1aCenasse 2ada atualiCa9:o =ue o2orresse e1 2ada ite14 )eria +A2il ent:o 2onsultar os histri2os de u1 deter1inado pedido ou produto@ se1 a
Delphi Client/Server 22

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

ne2essidade de utiliCar u1a outra ta5ela@ BA =ue essa ta5ela possui os 2a1pos NLMPED e !ODPRODL*O4

?ist +tens GFumPed GCodProduto G!ata


Fig /4 2G *a5ela de Hist4 Itens

Entretanto@ esse 1Dtodo pode tornar 1ais di+82il a 2onstru9:o das apli2a9Kes de in2lus:o e 1anuten9:o dos dados4 L1a outra alternati<a para 1ontar a 2ha<e pri1Aria da ta5ela de itens D 2riar u1a outra 2oluna 2o1 u1 nE1ero se=Uen2ial do siste1a e su5stituir a 2oluna !ODPRODL*O4 Desta +or1a o 2a1po !ODPRODL*O seria utiliCado apenas para se +aCer o rela2iona1ento entre as ta5elas4

+temPedido GFumPed GFumSeq CodProduto 'uantidade .alor+tem


Fig /4 / *a5ela de Itens 2o1 2ha<e pri1Aria alternati<a4

7ssi1@ de+inindo no<a1ente a ta5ela de histri2o de itens +i2aria da seguinte +or1aG

?ist +tens GFumPed GFumSeq G!ata


Fig /4 & *a5ela de Hist4 De Itens4

Delphi Client/Server

23

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Per2e5e'se@ agora@ =ue n:o hA in+or1a9:o na ta5ela de histri2o de itens so5re o produto4 Para 2onsultar os registros de u1 deter1inado produto D ne2essArio +aCer u1 MBoin 2o1 a ta5ela de Itens@ di+i2ultando a 2onsulta 1as +a2ilitando a 2onstru9:o das telas de 1anuten9:o4 7lD1 disso@ esta alternati<a per1ite =ue o usuArio altere o produto de u1 ite1 BA =ue esse n:o D 1ais parte da 2ha<e pri1Aria4 !on2luindo@ n:o e?iste u1a 1elhor +or1a de se de+inir as 2ha<es pri1Arias4 E?iste a 1elhor alternati<a para u1 deter1inado 2aso4 Ferra1entas Para 1odelar e de+inir a 5ase de dados@ <Arias +erra1entas !7)E +orne2e1 u1 diagra1a de MEntidade'Rela2iona1entoN =ue per1ite de+inir as entidades =ue ir:o originar as ta5elas do 5an2o de dados e seus rela2iona1entos4 !ria'se gra+i2a1ente todos os ele1entos ne2essArios@ gerando u1a do2u1enta9:o do 1odelo atra<Ds de u1 di2ionArio de dados4 Essas in+or1a9Kes pode1 ser utiliCadas para 2ontinuar o pro2esso de de+ini9:o do siste1a4 E1 alguns 2asos@ per1itindo a gera9:o da 5ase de dados e atD 1es1o a gera9:o da apli2a9:o4 !ria9:o da Rase de Dados 7lgu1as +erra1entas !7)E per1ite1 a gera9:o do Ms2riptN da 5ase de dados4 Esse Ms2riptN D u1 ar=ui<o te?to 2o1 as de+ini9Kes das ta5elas@ 2olunas e outros ele1entos es2ritos na linguage1 )WL suportada pela 5ase de dados a ser utiliCada4 7tra<Ds de +erra1entas do siste1a de 5an2o de dados D poss8<el 2riar a 5ase de dados si1ples1ente a5rindo esse ar=ui<o Ms2riptN e e?e2utando'o4 LtiliCando Inter5ase Windo>s I)WL Para o Inter5ase da Rorland pode'se utiliCar a +erra1enta Windo>s I)WL para lI o ar=ui<o Ms2riptN e 2riar o 5an2o de dados4 O Windo>s I)WL D u1a +erra1enta =ue per1ite geren2iar@ de+inir e 1anipular o 5an2o de dados interati<a1ente atra<Ds de 2o1andos )WL ou atra<Ds de op9Kes 2ontidas no Menu4

Delphi Client/Server

24

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Fig4 /4 5G Intera2ti<e )WL progra14

Pode'se 2riar u1 no<o 5an2o de dados atra<Ds da op9:o File-Create Database do Menu4 Lse .ocal Engine para de+inir u1 5an2o de dados lo2al e Remote /erver 2aso o 5an2o de dados esteBa e1 u1 ser<idor re1oto na rede4 Na op9:o Database entre o no1e do 5an2o de dados 2o1 seu respe2ti<o diretrio4 7 seguir entre 2o1 u1 usuArio;senha =ue tenha per1iss:o para 2riar u1 no<o 5an2o de dados4

Delphi Client/Server

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Fig4 /4 -4 !ria9:o de u1 no<o 5an2o de dados4

7 seguir de<e'se e?e2utar o ar=ui<o Ms2riptN <endas4s=l atra<Ds da op9:o do Menu File-Run an 0/1. /cript 4 7ssi1 o progra1a irA 2riar as ta5elas@ 2olunas e outras de+ini9Kes presentes no ar=ui<o4 7 estrutura 2riada D representada pelo 1odelo de dados da +igura /4 24
:7 G:7HSG :7HFM PESS8A GPESHC! PESHFM PESH6P PESHCGCCP7 PESH&8G5A!8:58 PESHF:ME58 PESHC8MP&EMEF68 PESHBA+558 C+!HC! :7HSG .EF!E!85 GPESHC! .EFH.EF!AS .EFHPE5CC8M+SSA8 .EFHC8M+SSA8 P58!:68 GP58HC! P58HFM P58HP5EC8 P58HES68':E

C+!A!E GC+!HC! G:7HSG C+!HFM C+!HF:M?AB+6AF6ES

C&+EF6E GPESHC! C&+H&+M+6EC5E!+68 C&+H!EB+68

PE!+!8 GPE!HC! PE!H!6 PE!H.A&85 PE!H6+P8 PESHC!HC&+ PESHC!H.EF

+6EM GPE!HC! GP58HC! +6EH.A&85 +6EH':AF6

Fig4 /4 #G Modelo de Dados E?e1plo4

Linguage1 )WL
Para a2essar os 5an2os de dados rela2ionais +oi desen<ol<ida u1a linguage1 2ha1ada )WL4 O O5Beti<o dessa linguage1 D +orne2er u1a +or1a padr:o de
Delphi Client/Server 2!

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

a2esso aos 5an2os de dados@ n:o i1portando a linguage1 2o1 =ue esses tenha1 sido desen<ol<idos4 7pesar da tentati<a de se tornar u1 padr:o ,7N)I.@ 2ada +orne2edor hoBe possui u1a sDrie de e?tensKes =ue torna1 as <Arias <ersKes in2o1pat8<eis entre si4 Por isso@ n:o pense =ue u1a apli2a9:o 2onstru8da para a2essar u1 deter1inado 5an2o de dados de u1 +orne2edor@ irA a2essar ta15D1@ se1 =ual=uer 1odi+i2a9:o@ o 5an2o de dados de u1 outro +orne2edor4 Isto s D poss8<el se a apli2a9:o utiliCar so1ente a parte 2o1u1 ,7N)I. da linguage1 )WL@ 1as isto +aC 2o1 =ue ela per2a <Arios re2ursos i1portantes dispon8<eis e1 2ada <ers:o )WL de +orne2edores di+erentes4 7lguns 5an2os de dados BA suporta1 o padr:o )WL 7N)I'$2 =ue BA D 1ais a5rangente nu1a tentati<a de +a2ilitar o pro2esso de dei?ar transparente a 5ase de dados utiliCada pela apli2a9:o4 Entretanto@ alguns +orne2edores ainda n:o +orne2e1 suporte ao )WL 7N)I'$2 de +or1a 2o1pleta por=ue teria1 =ue alterar partes estruturais de seus siste1as geren2iadores4 !ategorias da Linguage1 )WL 7 linguage1 )WL se di<ide e1 trIs 2ategoriasG DDL , Linguage1 de De+ini9:o de Dados.4 Parte da linguage1 2o1 2o1andos para 2ria9:o das estruturas de dados 2o1o as ta5elas@ 2olunas@ et24 E?G !RE7*E *7RLE4 DML , Linguage1 de Manipula9:o de Dados.4 Parte da linguage1 2o1 2o1andos para a2essar e alterar os dados ar1aCenados no 5an2o de dados4 Os prin2ipais 2o1andos dessa 2ategoria s:oG )ELE!*@ LPD7*E@ IN)ER*@ DELE*E4 D!L , Linguage1 de !ontrole de Dados.4 Parte da linguage1 2o1 2o1andos para de+inir usuArios e 2ontrolar seus a2essos aos dados4 E?G GR7N*4 LtiliCando o Windo>s I)WL para de+inir o Ran2o de Dados O ar=ui<o Ms2riptN utiliCado para 2ria9:o do 5an2o de dados possui u1a sDrie de 2o1andos )WL do tipo DDL4 Esses 2o1andos pode1 ser utiliCados direta1ente na linha de 2o1ando do I)WL4 L1 e?e1plo de )WL'DDL D o 2o1ando para 2ria9:o de ta5elas e 2olunasG
CREA2E 2AB.E PEDIDO ,PED[!D !ODIGO NO2 N3..@ PED[D* D7*E NO2 N3..@ PED[Y7LOR Y7LOR@ PED[*IPO *IPO NO2 N3..@ PE)[!D[!LI !ODIGO NO2 N3..@ PE)[!D[YEN !ODIGO NO2 N3..@ *IME)*7MP D7*E@ PR04AR5 6E5 ,PED[!D..Z

Esse 2o1ando 2ria a ta5ela pedido e suas 2olunas BA identi+i2ando sua 2ha<e pri1Aria atra<Ds da 2lAusula primar7 8e7.
Delphi Client/Server 2"

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

LtiliCando o Windo>s I)WL para a2essar o Ran2o de Dados Para se 2one2tar ao 5an2o de dados@ pode'se utiliCar a op9:o File-Connect to Database4 De<e'se sele2ionar o 5an2o de dados e entrar 2o1 o usuArio e senha de a2esso4

Fig4 /4 %G !one?:o 2o1 o Ran2o de Dados4

Para e?e2utar u1 2o1ando )WL@ 5asta es2re<I'lo na se9:o /1. /tatement4 O 2o1ando seguinte insere u1 registro na ta5ela de produto4 Para e?e2utar o 2o1ando@ pode'se utiliCar o 5ot:o Run4
insert into PRODL*O,PRO[!D@PRO[NM@PRO[E)*OWLE@PRO[PRE!O. values , @\I1pressora\@5@2((4((.

Para <eri+i2ar a inser9:o@ pode'se sele2ionar o registro atra<Ds do 2o1ando seguinte e pressionar no<a1ente o 5ot:o RunG
select ] &rom PRODL*O

ou
select PRO[!D@PRO[NM@PRO[E)*OWLE@PRO[PRE!O &rom PRODL*O

Para alterar os dados de u1 registro e?istente@ pode'se utiliCar o 2o1ando 3p"ate


up"ate PRODL*O set PRO[PRE!O ^ 25(4((@PRO[E)*OWLE ^ - 9here PRO[!D^

Para <eri+i2ar os dados no<a1ente@ pode'se pressionar o 5ot:o Previous atD en2ontrA'lo e a seguir pressionar o 5ot:o Run4 Final1ente@ para e?2luir u1 registro@ pode'se utiliCar o 2o1ando DeleteG
Delphi Client/Server 2#

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

"elete &rom PRODL*O 9here PRO[!D ^

Para 2on2luir as opera9Kes +eitas e registrA'las no 5an2o@ de 1odo =ue outros usuArios seBa1 2apaCes de <I'las@ utiliCa'se o 2o1andoG
commit

!onsistIn2ia e Integridade dos Dados


7 1aioria dos 5an2os de dados rela2ionais possue1 re2ursos para 2onsistir e tornar 8ntegro os dados ar1aCenados e1 suas ta5elas4 Desta +or1a@ =ual=uer +erra1enta =ue o usuArio utiliCar para a2essA'lo D o5rigada a respeitar as regras@ 1antendo a integridade dos dados4 Os re2ursos de 2onsistIn2ia <aria1 de 5an2o para 5an2o@ 1as pode'se de+inir 2on2eitual1ente algu1as 2ategorias de integridade 2o1oG integridade re+eren2ial@ do18nios e regras do neg2io4 Integridade Re+eren2ial Integridade re+eren2ial D u1 2onBunto de regras e de 2onsistIn2ias entre os registros de duas ta5elas =ue se rela2iona14 !o1o +oi <isto no 1odelo rela2ional@ =uando duas ta5elas se rela2iona1@ a 2ha<e pri1Aria de u1a D 2opiada para a outra e se esses dados +ore1 alterados ou e?2lu8dos da ta5ela original D ne2essArio <eri+i2ar o =ue serA +eito 2o1 os dados e registros dupli2ados na outra ta5ela4 Wuando se de+ine u1a integridade re+eren2ial@ estA se de+inindo o pro2edi1ento =ue serA to1ado =uando esses pro2essos o2orrere14 )eBa1 duas ta5elas M7N e MRN =ue se rela2iona1 atra<Ds de u1a 2oluna M2N =ue D a 2ha<e pri1Aria de M7N e portanto +oi repetida e1 MRN para se +aCer o rela2iona1ento4 Wuando se de+ine u1a integridade re+eren2ial para esse rela2iona1ento@ estA se de+inindo =ue a 2oluna M2N da ta5ela MRN s pode 2onter <alores BA 2adastrados na 2oluna M2N da ta5ela M7N4

6a;ela A G d e . .
Fig /4 $G Integridade Re+eren2ial4

6a;ela B Ga ;

Delphi Client/Server

2$

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

E?iste1 trIs +or1as de se 1anter essa regra =uando registros da ta5ela M7N s:o e?2lu8dosG RestrictG De+ine =ue se o <alor da 2oluna M2N de M7N e?istir e1 algu1 registro de MRN@ o registro n:o poderA ser e?2lu8do e u1a 1ensage1 de erro retornarA para a apli2a9:oZ Casca"eG De+ine =ue se o <alor da 2oluna M2N de M7N e?istir e1 algu1 registro de MRN@ todos os registros =ue possu8re1 esse <alor ser:o ta15D1 e?2lu8dosZ /et NullG De+ine =ue se o <alor da 2oluna M2N de M7N e?istir e1 algu1 registro de MRN@ os <alores de M2N e1 todos os registros ser:o trans+or1ados para MNullNZ E1 todos os 2asos@ se o usuArio tentar inserir u1 registro e1 MRN 2o1 u1 <alor de M2N =ue n:o e?ista na ta5ela M7N@ u1 erro serA reportado H apli2a9:o4 7lguns 5an2os@ ta15D1 per1ite1 +aCer o 1es1o trata1ento =uando a 2ha<e da ta5ela +or alterada@ ao in<Ds de e?2lu8da4 Entretanto@ essa altera9:o de 2ha<es n:o de<e ser u1 pro2esso 2o1u1 nas apli2a9Kes@ sendo nor1al1ente proi5idas4 Os 5an2os de dados possue1 +or1as di+erentes de disponi5iliCar esses ser<i9os4 7lguns possue1 atD 1ais de u1a +or1a de +aCer o 1es1o pro2esso4 Mas de 1aneira geral e?iste1 duas possi5ilidades de i1ple1enta9:oG
Integridade Re+eren2ial De2larati<a

Essa D u1a +or1a 1ais +A2il@ porD1 1enos +le?8<el4 !o1 apenas u1 2o1ando se de+ine a integridade4 PorD1@ alguns 5an2os n:o suporta1 essa sinta?e ou a +orne2e1 de 1aneira li1itada so1ente para regras do tipo MRestri2tN4 7 1aior <antage1 dessa alternati<a D sua si1pli2idade e por isso 1enos suBeita a erros de i1ple1enta9:o4
*riggers

Os triggers s:o peda9os de 2digo es2ritos e1 u1a e?tens:o da linguage1 )WL +orne2ida por 2ada +orne2edor@ sendo portanto u1a linguage1 proprietAria4 Essa e?tens:o possui instru9Kes para i1ple1entar MloopsN e <eri+i2ar 2ondi9Kes per1itindo +aCer pe=uenos progra1as estruturados4 Os triggers s:o disparados auto1ati2a1ente pelo 5an2o =uando e<entos de in2lus:o@ altera9:o ou e?2lus:o o2orre1 e1 u1a deter1inada ta5ela4 Portanto@ atra<Ds dos triggers pode'se desen<ol<er a lgi2a ne2essAria para se 1anter a integridade re+eren2ial entre as ta5elas4 Do18nio dos dados Outro tipo de 2onsistIn2ia D 2o1 rela9:o ao do18nio dos dados4 Para u1 deter1inado 2a1po de dado pode e?istir u1 2onBunto de <alores per1itidos e o 5an2o de dados de<e reportar u1 erro H apli2a9:o se u1 <alor in<Alido +or in+or1ado4 L1 tipo de 2onsistIn2ia de do18nio =ue D nor1al1ente +orne2ido pelos 5an2os D a possi5ilidade do 2a1po ser nulo ou n:o4 7lguns 5an2os possue1 ta15D1 2o1andos para de+inir u1 2onBunto de <alores <Alidos para u1 deter1inado 2a1po4 E?G Yalores ,_T\@\F\. para u1 2a1po =ue ar1aCena se a
Delphi Client/Server 3%

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

pessoa D +8si2a ou Bur8di2a4 Outros possue1 u1a sinta?e para de+inir <alores 18ni1os e 1A?i1os4 Pode'se@ ainda@ utiliCar o re2urso de triggers para esse propsito4 Regras de Neg2io Pode'se de+inir 2o1o regras de neg2io a integridade =ue de<e e?istir entre os <alores de 1ais de u1 2a1po de u1a ou 1ais ta5elas4 Pode'se 2onsiderar 2o1o regra do neg2io as 2onsistIn2ias e atualiCa9Kes =ue de<e1 ser +eitas e1 <Arias ta5elas@ =uando u1 registro D inserido@ alterado ou e?2lu8do de u1a ta5ela4 Ou u1 pro2esso de 2Al2ulo disparado so5re os dados do 5an2o =ue ta15D1 +aCe1 atualiCa9Kes e1 di+erentes lo2ais@ 1as de +or1a a 1anter os <alores dos dados se1pre 8ntegros e 2onsistentes4 L1 e?e1plo seria a atualiCa9:o de esto=ue =ue nor1al1ente en<ol<e outras tare+as e1 u1 siste1a de 2ontrole de esto=ue4 Para i1ple1entar essas regras de neg2io no 5an2o de dados s:o utiliCados os re2ursos de triggers e stored pro2edures4 )tored pro2edures s:o 5lo2os de 2digo assi1 2o1o os triggers4 7 di+eren9a entre eles D =ue os triggers s:o disparados auto1ati2a1ente por inser9Kes@ altera9Kes e e?2lusKes +eitas nas ta5elas@ en=uanto as stored pro2edure s:o 2ha1adas e?pli2ita1ente pela apli2a9:o4 LtiliCando o Windo>s I)WL para de+inir integridades e 2onsistIn2ias O ar=ui<o Ms2riptN utiliCado na 2ria9:o do 5an2o de dados e?e1plo ta15D1 possui 2o1andos =ue de+ine1 regras de integridade e do18nios =ue ser:o seguidas pela 5ase de dadosG
CREA2E 2AB.E PEDIDO ,PED[!D !ODIGO NO2 N3..@ PED[D* D7*E NO2 N3..@ PED[Y7LOR Y7LOR@ PED[*IPO *IPO NO2 N3..@ PE)[!D[!LI !ODIGO NO2 N3..@ PE)[!D[YEN !ODIGO NO2 N3..@ *IME)*7MP D7*E@ PR04AR5 6E5 ,PED[!D..Z

Na prpria de+ini9:o da ta5ela BA D atri5u8da a <eri+i2a9:o de nulidade para alguns 2a1pos atra<Ds da sinta?e Not Null. O pr?i1o 2o1ando de+ine u1 2onBunto de <alores poss8<eis para o 2a1po PE)[*P da ta5ela PE))O74
A.2ER 2AB.E PE))O7 ADD C:EC6, ,PE)[*P^`T`. OR ,PE)[*P^`F`..

Para de+inir a integridade re+eren2ial entre duas ta5elas +oi usada a +or1a de2larati<a atra<Ds do 2o1andoG
Delphi Client/Server 31

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

A.2ER 2AB.E I*EM ADD FORE0GN 6E5 ,PED[!D. REFERENCE/ PEDIDO,PED[!D.Z

Esse 2o1ando de+ine =ue u1 ite1 s pode ser in2lu8do se o <alor da 2oluna PED[!D da ta5ela de I*EM BA e?istir na ta5ela PEDIDO4 7lD1 disso@ s D poss8<el e?2luir u1 PEDIDO =ue n:o possua I*EN) asso2iados4 7 sinta?e do Inter5ase para de+ini9:o de integridade re+eren2ial de2larati<a so1ente per1ite a +or1a Mrestri2tN4 7s de1ais +or1as teria1 =ue ser de+inidas atra<Ds de triggers4 LtiliCando o Windo>s I)WL para testar as 2onsistIn2ias4 O 1odelo e?e1plo de pedido possui de+ini9Kes para +aCer a integridade re+eren2ial entre suas ta5elas4 L1a delas D na rela9:o =ue e?iste entre as ta5elas LF e !ID7DE 2o1o 1ostrada na +igura /4 /4 Esta integridade n:o per1ite ent:o inserir u1 registro na ta5ela !ID7DE se o <alor atri5u8do a LF[)G n:o e?istir na ta5ela LF4 7lD1 disso@ se tentar1os e?2luir u1 registro da ta5ela LF =ue esteBa sendo re+eren2iado pela ta5ela !ID7DE irA retornar u1a 1ensage1 de erro@ BA =ue o tipo da integridade D Mrestri2tN4
:7 G:7HSG :7HFM

R'()*+,)
C+!A!E GC+!HC! G:7HSG C+!HFM C+!HF:M?AB+6AF6ES
Fig /42(G Integridade Re+eren2ial

E?e2utando o seguinte 2o1ando no Windo>s I)WL444


insert into !ID7DE,!ID[!D@LF[)G@!ID[NM@!ID[NLMH7RI*7N*E). values , @NMGN@NRelo HoriConteN@ 5(((((.

u1a 1ensage1 de erro irA retornar BA =ue n:o e?iste u1 registro 2o1 LF[)G ^ _MG\ na ta5ela LF@ portanto de<e'se pri1eiro inserir o registroG
insert into LF,LF[)G@LF[NM. values ,MMGN@ NMinas GeraisN.

7 seguir pode'se inserir no<a1ente o registro na ta5ela !ID7DE


insert into !ID7DE,!ID[!D@LF[)G@!ID[NM@!ID[NLMH7RI*7N*E). values , @NMGN@NRelo HoriConteN@ 5(((((.

7ssi1@ os dois registros +ora1 inseridos 2o1 su2esso@ e de<e'se portanto e+eti<ar as inser9Kes utiliCando o 2o1ando commit4 Pode'se tentar e?2luir o registro da ta5ela LF atra<Ds do 2o1andoG
"elete &rom LF 9here LF[)G ^ MMGN
Delphi Client/Server 32

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Pelo 1es1o 1oti<o <isto anterior1ente@ o registro ta15D1 n:o pode ser e?2lu8do4 De<e'se ent:o e?2luir pri1eiro o registro de !ID7DE para depois poder e?2luir o de LF4 O 1odelo e?e1plo ta15D1 possui algu1as 2onsistIn2ias de do18nio@ prin2ipal1ente e1 rela9:o a nulidade4 Pode'se tentar inserir na ta5ela LF utiliCando o seguinte 2o1andoG
insert into LF,LF[)G@LF[NM. values , Null@ Null.

Esse 2o1ando de<e retornar erro in+or1ando =ue LF[)G n:o pode ser nulo4 )e o 2o1ando +or alterado paraG
insert into LF,LF[)G@LF[NM. values , M)PN@ Null.

irA 2ontinuar apresentando erro@ agora na 2oluna LF[NM =ue ta15D1 n:o pode 2onter nula4

Distri5ui9:o da !onsistIn2ia e Integridade dos Dados !o1o +oi <isto@ D poss8<el i1ple1entar <Arias regras de 2onsistIn2ia dos dados no prprio 5an2o de dados4 Entretanto@ D poss8<el i1ple1entA'las ta15D1 na apli2a9:o e portanto +i2a u1a dE<ida de =ual seria o 1elhor lugar para i1ple1entA'las4 715as as alternati<as possue1 <antagens e des<antagens =ue de<e1 ser o5ser<adas no in82io do pro2esso de desen<ol<i1ento4 7 prin2ipal <antage1 e1 se 2olo2ar todas as regras no 5an2o de dados D =ue esse 1antD1 a 2onsistIn2ia e integridade dos dados independente da +erra1enta de a2esso utiliCada pelo usuArio4 7lD1 disso@ as 1anuten9Kes dessas regras +i2a1 lo2aliCadas e1 u1 Eni2o lo2al@ ao in<Ds de +i2are1 espalhadas por toda a apli2a9:o ou por di<ersas apli2a9Kes4 Entretanto@ o desen<ol<i1ento utiliCando essa linha de tra5alho D 1uito 1ais Arduo e de1orado4 7s +erra1entas dispon8<eis nesse a15iente n:o apresenta1 ainda 1uitos re2ursos =ue dIe1 produti<idade na 2onstru9:o das regras4 7s linguagens utiliCadas para es2re<er as Mstored pro2eduresN e MtriggersN s:o proprietArias dos +orne2edores@ tornando a e1presa dependente de Eni2o +orne2edor@ di+i2ultando a distri5ui9:o dos dados e1 5an2os de +orne2edores di+erentes4 7lD1 disso D ne2essArio di<idir o desen<ol<i1ento e1 duas linguagens4 7 linguage1 da +erra1enta para se 1ontar a inter+a2e e a 2ha1ada dos pro2essos e a linguage1 para 2onstru9:o das Mstored pro2eduresN4 7tual1ente@ o 1er2ado se en2ontra di<idido 2o1 2ada e1presa to1ando u1 2a1inho di+erente para distri5uir essas regras entre o 2liente e o ser<idor4 Mas n:o pode'se diCer =ue u1 2a1inho BA seguido por u1a e1presa =ue o5te<e su2esso D o 1ais indi2ado para u1a outra e1presa4 Muitas outras <ariA<eis pre2isa1 ser 2onsideradas e di+i2il1ente ser:o iguais entre duas e1presas4 7lD1 disso@ as +erra1entas e a te2nologia e<olue1 +aCendo 2o1o =ue u1 1es1o 2a1inho possa o5ter resultados di+erentes@ 2onsiderando'se a te2nologia atual1ente dispon8<el4
Delphi Client/Server 33

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

De u1a 1aneira geral@ as duas pri1eiras 2ategorias de 2onsistIn2ia ,integridade re+eren2ial e do18nios. s:o nor1al1ente i1ple1entadas no 5an2o de dados@ sendo =ue os do18nios s:o i1ple1entados repetida1ente na

!ap8tulo

apli2a9:o para e<itar =ue os 2o1andos seBa1 en<iados ao 5an2o4 7 grande dE<ida 1es1o@ D 2o1 rela9:o Hs regras de neg2io =ue algu1as e1presas i1ple1enta1 total1ente no 5an2o de dados@ outras total1ente na apli2a9:o e algu1as distri5ue1 entre esses dois 2o1ponentes4 7tual1ente@ e?iste 1ais u1 alternati<a na no<a gera9:o da ar=uitetura !liente;)er<idorG a i1ple1enta9:o das regras de neg2io e1 u1 no<o 2o1ponente 2ha1ado M)er<idor de 7pli2a9KesN4

&

)WL E?plorer
Esse captulo apresenta a ferramenta de definio e manipulao de dados S ! E"plorer da #orland.

ode'se utiliCar a +erra1enta )WL E?plorer para 2riar a estrutura do 5an2o de dados de 1aneira grA+i2a e interati<a4 7lD1 disso@ essa +erra1enta per1ite de+inir no<os aliases para os 5ases de dados@ 1anipular os dados ,inserir@ alterar@ e?2luir.@ e 2onstruir u1 di2ionArio de dados 2o1 de+ini9Kes =ue pode1 ser utiliCadas para +a2ilitar a 2onstru9:o de apli2a9Kes e1 Delphi4

!ria9:o de 7lias
L1a das possi5ilidades do )WL E?plorer D a de+ini9:o de MaliasesN4 7o a5rir o )WL E?plorer D e?i5ido na lista Databases todos os MaliasesN de+inidos no RDE4

Delphi Client/Server

34

S & D '

S I S T E M A S

& E R E N C I A D O R E S

D E

' A N C O

D E

D A D O S

Fig &4 G Lista de aliases no )WL E?plorer

Delphi Client/Server

Para 2riar u1 no<o alias@ de<e'se pressionar o 5ot:o direito do M1ouseN e1 =ual=uer regi:o do )WL E?plorer para e?i5ir u1 Mpopup 1enuN e sele2ionar a op9:o Ne9...4 L1a tela serA e?i5ida para =ue seBa in+or1ado o tipo de Mdri<erN do no<o alias4

Fig4 &42G De+ini9:o de u1 no<o alias4

YisualiCa9:o e Edi9:o de Dados


Para <isualiCar e editar os dados de u1 5an2o de dados@ de<e'se e?pandir sua lista de op9Kes e?i5indo seus 2o1ponentes4 !ada tipo de Mdri<erN de 5an2o de dados pode possuir op9Kes di+erentes na lista@ entretanto u1a op9:o 2o1u1 a todos DG 2ables4 7o e?pandir ta15D1 essa op9:o@ serA listada todas as ta5elas 2ontidas nesse 5an2o de dados4 Pode'se@ ent:o@ sele2ionar u1a das ta5elas e e?i5ir seus dados atra<Ds da +i2ha Data do lado direito da tela4 Na 5arra de +erra1entas e?iste1 5otKes =ue per1ite1 a na<ega9:o entre os registros@ in2lus:o@ edi9:o e e?2lus:o dos dados4

Fig &4/G YisualiCa9:o e edi9:o dos dados4 Delphi Client/Server 3!

Pode'se ta15D1 utiliCar 2o1andos )WL par <isualiCar e editar os dados atra<Ds da +i2ha Enter /1.4

Fig &4&G YisualiCa9:o de dados atra<Ds de )WL

Pode'se ta15D1 1anipular os dados atra<Ds de 2o1andos )WLs4

Fig4 &45 Edi9:o de dados atra<Ds de )Wl4

Delphi Client/Server

3"

De+ini9:o de no<os ele1entos


7tra<Ds do )WL E?plorer pode'se ta15D1 de+inir no<os ele1entos na estrutura do 5an2o de dados4 Para 2riar u1a no<a ta5ela no 5an2o de dados@ de<e'se pressionar o 5ot:o direito so5re o ite1 2ables e sele2ionar a op9:o Ne9...4 no Mpopup 1enuN4 L1a no<a ta5ela D 2riada 2o1 u1 no1e de+ault4 Pode'se ent:o alterar seu no1e e de+inir os de1ais ele1entos =ue a 2o1pKe14

Fig &4-G De+ini9:o de u1a no<a ta5ela4

Pode'se de+inir as 2olunas@ 2ha<e pri1Aria@ integridade re+eren2ial@ MtriggersN@ 8ndi2es e outros ele1entos para as ta5elas atra<Ds do )WL E?plorer para os <Arios tipos de 5an2o de dados4

De+ini9:o de Di2ionArios de dados


7tra<Ds do )WL E?plorer pode'se de+inir u1 di2ionArio de dados4 Esse di2ionArio D u1 5an2o de dados espe2ial usado para ar1aCenar u1 2onBunto de de+ini9Kes dos itens de dado e?istente nas ta5elas do 5an2o de dados da apli2a9:o4 Esse 2onBunto de de+ini9Kes des2re<e as propriedades do 2o1ponente $ield de u1 %ataSet no Delphi@ o tipo do 2a1po e o tipo de 2ontrole <isual a ser 2riado =uando o 2o1ponente $ield D arrastado para a tela4 Desta +or1a@ 2onsegue'se de+inir u1a Eni2a <eC as propriedades de u1 do18nio de dado =ue pode estar sendo utiliCado por di<ersos itens e1 <Arios lo2ais da apli2a9:o4

Delphi Client/Server

3#

!ria9:o de u1 no<o Di2ionArio Para 2riar u1 no<o di2ionArio de dados@ de<e'se sele2ionar a +i2ha Dictionar7 do lado es=uerdo da tela@ pressionar o 5ot:o direito e es2olher a op9:o Ne9 do Menu4 7 seguir serA e?i5ida u1a tela para se de+inir o no1e do di2ionArio@ o alias do 5an2o aonde a ta5ela do di2ionArio serA 2riada e o no1e da ta5ela4

Fig &4#G !ria9:o do Di2ionArio de Dados

I1porta9:o das de+ini9Kes do Ran2o de Dados Para i1portar os atri5utos e de+ini9Kes do 5an2o de dados da apli2a9:o de<e' se sele2ionar a op9:o Dictionar7-0mport From Database.

Fig &4%G I1porta9:o das de+ini9Kes do Ran2o de Dados4

De+ini9:o das propriedades dos &ttribute Sets 7 seguir s:o e?i5idas as de+ini9Kes i1portadas e os M &ttribute Sets en2ontrados pelos M2onstraintsN de+inidos no 5an2o de dados para 2ada ele1ento4

Delphi Client/Server

3$

Fig &4%G De+ini9:o de propriedades dos &ttribute Sets4

LtiliCa9:o do Di2ionArio no Delphi Para utiliCar as de+ini9Kes esta5ele2idas no di2ionArio e1 u1a apli2a9:o Delphi@ pode'se arrastar os 2a1pos deseBA<eis do )WL E?plorer para a tela da apli2a9:o4 7uto1ati2a1ente@ ser:o 2riados u1 %ataSet e u1 %atasource para 2ada ta5ela do 5an2o de dados4

Delphi Client/Server

4%

Fig &4$G !ria9:o da tela atra<Ds do Di2ionArio do )WL E?plorer4

7lD1 disso@ pode'se ta15D1 asso2iar u1 2o1ponente $ield atra<Ds da op9:o Associate attributes... do Mpopup 1enuN4

Fig &4 (G 7sso2ia9:o de $ields 2o1 o di2ionArio4

Delphi Client/Server

41

*ra5alhando 2o1 Ran2os de Dados Rela2ionais


Esse captulo apresenta a forma de trabal'o dos bancos de dados relacionais.

!ap8tulo

s 5an2os de dados rela2ionais +orne2e1 u1 2onBunto de ser<i9os para =ue as apli2a9Kes possa1 a2essA'los e 1anipulA'los4 Portanto@ D i1portante entender 5e1 sua +un2ionalidade para 1elhor apro<eitar seus re2ursos nas apli2a9Kes4 E?iste1 algu1as di+eren9as na +or1a de tra5alhar entre os +orne2edores@ 1as grande parte dos 2on2eitos pode1 ser apli2ados a todos os 5an2os de dados rela2ionais4

!o1ponentes da 7r=uitetura !liente;)er<idor'dls+


!o1o +oi <isto@ a ar=uitetura !liente;)er<idor D 2o1posta de dois 2o1ponentes +8si2os =ue se 2o1uni2a1 atra<Ds da redeG a esta9:o de tra5alho do usuArio e o ser<idor de 5an2o de dados4 Para se esta5ele2er a 2o1uni2a9:o entre esses dois 2o1ponentes s:o utiliCadas <Arias 2a1adas de so+t>are =ue s:o instaladas e1 2ada 2o1ponente +8si2o4 7 esta9:o de tra5alho 2liente de<e ter@ alD1 da apli2a9:o +inal@ <Arios outros ele1entos para a2essar a 5ase de dados e1 u1 )GRD atra<Ds de rede4 Database EngineG 5i5liote2a +orne2ida pelo +orne2edor da +erra1enta de desen<ol<i1ento 2o1 o o5Beti<o de +orne2er u1a +or1a Eni2a e transparente da apli2a9:o a2essar di+erentes 5ases de dados4 E?G RDE ,Rorland Data5ase Engine.Z /1. .in8sG Mdri<erN +orne2ido ta15D1 pelo +orne2edor da +erra1enta de desen<ol<i1ento responsA<el pela 2o1uni2a9:o do Data5ase Enginer 2o1 u1a 5ase de dados espe28+i2a4 )ua prin2ipal 2ara2ter8sti2a D traduCir os 2o1andos utiliCados pelo Data5ase Enginer para 2o1andos 2onhe2idos pela 5ase de dados utiliCada4 E?G )WL linQs para a2essar Ora2le@ )X5ase@ In+or1i?@ M) )WL )er<er@ Inter5ase@ et24 7 apli2a9:o pode optar por utiliCar o padr:o ODR! para a2essar a 5ase de dados@ ao in<Ds de utiliCar )WL LinQs ,a2esso nati<o.4 Entretanto@ o a2esso +eito pelos )WL LinQs ainda possui u1 dese1penho superior e1 rela9:o ao a2esso +eito <ia Mdri<erN ODR!4

Delphi Client/Server

42

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Client "o Banco "e Da"os G 7PI +orne2ida pelo +orne2edor do )GDR e instalada na esta9:o 2liente para esta5ele2er a 2o1uni2a9:o 2o1 o 5an2o de dados4 Nessa 7PI se en2ontra1 as +un9Kes de a2esso a 5ase de dados4 O ta15D1@ responsA<el por utiliCar u1 deter1inado proto2olo de rede para en2ontrar o ser<idor de 5an2o para =ue a apli2a9:o possa a2essA'lo en<iando 2o1andos e 5us2ando os dados4 Protocolo "e Re"eG so+t>ares responsA<eis pela trans1iss:o dos dados pela rede entre a 1A=uina 2liente e o ser<idor4

CLIENTE CLIENTE
A/2+,.6;'( %'**.-'1).( D'('17027+-'1)0 D.).=.(' D.).=.('E14+1'* E14+1'*

MIDDLE3ARE
S'*7+60( E(/',9:+,0(
SQL/API SQL/API

SERVIDOR SERVIDOR
B.1,0 B.1,0<' <'D.<0( D.<0(

T*.1(/0*)'
N')B+0( N')B+0( TCP/IP TCP/IP IPX/SPX IPX/SPX SNA SNA

SOR
S'*7. S'*7.D+*')8*+0 D+*')8*+0
S+()'-. O/'*.,+01.2

S'*7. S'*7.D+*')8*+0 D+*')8*+0 S'45*.16. S'45*.16.


S+()'-. O/'*.,+01.2

RPC RPC

M'1(.4'1( M'1(.4'1(

Fig 54 G !o1ponentes da 2o1uni2a9:o entre o !liente e o )er<idor4

!one?Kes e !onte?tos
Pode'se de+inir 2o1o 2one?:o u1 2a1inho esta5ele2ido entre a apli2a9:o e o 5an2o de dados atra<Ds de u1 usuArio e sua senha4 Para 2ada 2one?:o D 2riada u1a estrutura na 1e1ria do ser<idor de 5an2o preparada para re2e5er os 2o1andos )WL en<iados pela apli2a9:o4 !ada 2one?:o pode ter u1 ou 1ais 2onte?tos4 Para e?e2utar u1 2o1ando )WL na apli2a9:o D ne2essAria a 2ria9:o de pelo 1enos u1 2onte?to dentro da 2one?:o4 Os 2o1andos )WLs en<iados por u1 2onte?to passa1 por pelo 1enos duas +asesG prepara9:o e e?e2u9:o4 Na pri1eira +ase D <eri+i2ada a sinta?e do 2o1ando e D de+inido o 2a1inho de a2esso =ue serA utiliCado pela e?e2u9:o do 2o1ando ,oti1iCa9:o.4 Na segunda +ase o 2o1ando D +inal1ente e?e2utado4 Depois =ue a pri1eira +ase +or 2o1pletada@ pode'se repetir <Arias <eCes a e?e2u9:o da segunda +ase@ oti1iCando o pro2esso@ BA =ue o te1po gasto para 2o1pilar e oti1iCar o 2o1ando n:o serA gasto no<a1ente4 Entretanto@ u1 1es1o 2onte?to pode ser usado para a e?e2u9:o de 1ais de u1 2o1ando )WL4 Wuando u1 outro 2o1ando )WL D en<iado pelo 1es1o 2onte?to@ o 2o1ando anterior dei?a de e?istir e u1a no<a ne2essidade de e?e2u9:o desse 2o1ando terA =ue passar no<a1ente pelas duas +ases4 Portanto u1 2onte?to
Delphi Client/Server 43

' A N C O S

D E

D A D O S

R E L A C I O N A I S

s per1ite 2ontrolar e 1anter preparado u1 Eni2o 2o1ando )WL4 !o1andos anteriores n:o s:o 1ais <istos pelo 2onte?to4

Conte3tos A1li ao Cone3o Ban o

Fig 542G !one?Kes e !onte?tos

Para resol<er esse pro5le1a@ alguns 5an2os per1ite1 a utiliCa9:o de 1Eltiplos 2onte?tos dentro de u1a 1es1a 2one?:o@ possi5ilitando o 2ontrole de 1ais de u1 2o1ando )WL ao 1es1o te1po4 Para os 5an2os =ue n:o possue1 1Eltiplos 2onte?tos@ D ne2essArio 2riar <Arias 2one?Kes para se ter o 1es1o re2urso4 PorD1 e?iste1 algu1as di+eren9as entre essas duas +or1as de utiliCa9:o4 L1a 2one?:o D total1ente independente de u1a outra 2one?:o@ 2o1o se +osse1 dois usuArios di+erentes a2essando o 5an2o de dados4 TA <Arios 2onte?tos dentro de u1a 2one?:o s:o interligados e 2oopera1 para a e?e2u9:o de u1 1es1o pro2esso4 !one?Kes e !onte?tos no Delphi Para a2essar a 5ase de dados@ de<e'se pri1eira1ente 2riar u1 MaliasN no RDE para o 5an2o de dados e?e1plo no inter5ase4 Pode'se atri5uir o no1e M<endasN para o MaliasN@ de+inir o parJ1etro server name para o no1e do 5an2o de dados e seu diretrio@ user name para )a)DR74

Delphi Client/Server

44

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Fig 54/G !on+igura9:o do alias no RDE4

*Data5ase e *Data)et

O 2o1ponente do Delphi =ue representa u1a 2one?:o 2o1 o 5an2o de dados D o (%atabase4 De<e'se utiliCar u1 2o1ponente (%atabase para 2ada 2one?:o =ue se deseBe +aCer 2o1 o 5an2o4 7lguns 5an2os 2ontrola1 o nE1ero de li2en9as de usuArios atra<Ds do nE1ero de 2one?Kes4 Portanto@ o nE1ero de 2one?Kes de<e ser 5e1 reduCido4

Fig 54&G !o1ponente *Data5ase do Delphi4

Os 2o1ponentes ( uer) e ((able s:o utiliCados para +orne2er 2onte?tos dentro de u1a 2one?:o do 5an2o de dados4 7tra<Ds da propriedade DatabaseName D poss8<el ligA'los a u1 2o1ponente (%atabase4

Delphi Client/Server

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Fig 545G Os 2o1ponentes ( uer) e ((able do Delphi4

!ursores e Result )ets


Wuando o )WL e?e2utado D u1 2o1ando select e retorna 1ais de u1 registro@ D ne2essArio =ue a apli2a9:o a5ra u1 2ursor para poder per2orrer e traCer todos os registros do 5an2o de dados para a apli2a9:o4 Desta +or1a D 2riado u1 Mresult setN@ =ue D u1a estrutura te1porAria 2o1 a indi2a9:o dos registros =ue +ora1 sele2ionados4 O 2ursor D ini2ial1ente posi2ionado na pri1eira linha e a apli2a9:o pode re=uisitar =ue o 2ursor a<an2e linha a linha no Mresult setN atD =ue seu +inal seBa al2an9ado4 Os 2ursores e Mresult setsN pode1 ser 2riados no 5an2o de dados se estes suportare1 ou na prpria esta9:o de tra5alho4 7 prin2ipal utilidade dos 2ursores e Mresult setsN D per1itir per2orrer os dados e1 =ual=uer sentido e poder +aCer atualiCa9Kes de registro atra<Ds do posi2iona1ento do 2ursor4 )e nenhu1 2ursor +or de2larado e?pli2ita1ente no 5an2o de dados@ o 5an2o de dados 2ria u1 2ursor interna1ente apenas para en<iar se=Uen2ial1ente os dados para a apli2a9:o =uando estes +ore1 re=uisitados4 7ssi1@ n:o D ne2essArio =ue o ser<idor en<ie todos os dados sele2ionados de u1a s <eC para apli2a9:o4 !a5e a apli2a9:o diCer =uando 2ada registro de dados de<e ser traCidos para a 1A=uina 2liente4 Nor1al1ente@ D utiliCado M5u++ersN =ue pode 2onter 1ais de u1 registro para en<iar os dados para apli2a9:o4 O ta1anho desses M5u++ersN pode ser rede+inido para oti1iCar os pa2otes de dados en<iados pela rede4

Delphi Client/Server

4!

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Conte3tos A1li ao Cone3o


Comando +nsert Comando :1date Cursor 5esult Set . . . .

Ban o

Comando Sele t

Fig 54-G !ursores e Result )ets

O 2o1ando select@ 2o1o =ual=uer outro 2o1ando D e?e2utado e1 u1 deter1inado 2onte?to de u1a 2one?:o4 Ent:o@ se outro 2o1ando )WL utiliCar o 1es1o 2onte?to antes =ue todas as linhas do 2o1ando select anterior tenha1 sido traCidas para apli2a9:o o 2ursor e seu Mresult setN ser:o destru8dos e o restante das linhas D perdido4 Portanto@ para se 1anter o Mresult setN de u1 2o1ando select atD =ue todas as linhas seBa1 traCidas@ D pre2iso a5rir u1 2onte?to de 1aneira e?2lusi<a para esse 2o1ando4 7 1edida =ue as linhas s:o traCidas para apli2a9:o@ nor1al1ente s:o 2riados 2a2hes na 1e1ria ou e1 dis2o para ar1aCenar os dados per1itindo a na<ega9:o entre registros ,in2lusi<e registros anteriores.4 Esse re2urso D nor1al1ente 2onhe2ido 2o1o MFront End Result )etN por estar lo2aliCado na 1A=uina 2liente4 !ursores e Result )ets no Delphi Os 2o1ponentes ((able e ( uer) do Delphi utiliCa1 esses re2ursos para a2essar o 5an2o de dados4 Wuando se a5re u1a MWuerXN ou u1a M*a5leN no Delphi@ u1 2ursor apontando para u1 Mresult setN D 2riado e as linhas s:o traCidas e ar1aCenadas na apli2a9:o a 1edida =ue o usuArio per2orre os registros atD o +inal da 2onsulta4 Portanto@ se o usuArio sele2ionar u1 nE1ero grande de registros , 4(((4(((.@ ele irA esperar apenas o te1po ne2essArio para 2o1pilar e e?e2utar a 2onsulta e traCer alguns pou2os registros su+i2ientes para popular a parte <is8<el dos dados na tela4 Os de1ais registros ser:o traCidos a 1edida =ue o usuArio na<egue e1 dire9:o ao +inal da 2onsulta4 )e o usuArio e?e2utar u1 2o1ando para ir para o +inal da 2onsulta@ poderA ter =ue esperar o te1po ne2essArio para se traCer todos os 4(((4((( de registros para a esta9:o 2liente4

Delphi Client/Server

4"

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Fig 54#G !ursores e MResult )etsN no Delphi4

*ransa9Kes
L1 dos re2ursos 1ais i1portantes +orne2idos pelos 5an2os de dados D o 2ontrole de transa9:o4 O 2ontrole de transa9:o per1ite as apli2a9Kes 1antere1 a integridade lgi2a dos dados e1 u1 deter1inado pro2esso4 L1a transa9:o D u1 2onBunto de 2o1andos e?e2utados no 5an2o de dados =ue de<e1 ser apli2ados integral1ente4 )e u1 dos 2o1andos +alhar@ todos os outros tI1 =ue ser des+eitos para 1anter a integridade e a uni2idade do pro2esso e1 e?e2u9:o4 Desta +or1a pode'se garantir a 2on+ia5ilidade dos dados ar1aCenados no 5an2o4 !onsidere o seguinte e?e1ploG u1 pro2esso de trans+erIn2ia entre 2ontas 2orrentes =ue de<e de5itar u1 <alor e1 u1a das 2ontas e 2reditar e?ata1ente o 1es1o <alor e1 u1a outra 2onta4 )e o pro2esso +alhar no 1eio e esse re2urso de 2ontrole de transa9:o n:o esti<er sendo utiliCado@ o dinheiro pode ser retirado da pri1eira 2onta@ 1as n:o ser 2reditado na segunda@ assi1 o <alor =ue de<eria ser trans+erido@ si1ples1ente desapare2e da 5ase de dados4 Para +aCer o 2ontrole de transa9:o@ s:o +orne2idos nor1al1ente pelos 5an2os de dados trIs 2o1andosG u1 para ini2iar a transa9:o , begin transaction.@ u1 para +inaliCar e apli2ar as 1odi+i2a9Kes e?e2utadas , commit. e outro para +inaliCar 2an2elando e des+aCendo toda a opera9:o ,rollbac8.4 Portanto@ =uando u1a transa9:o D ini2iada@ todos os 2o1andos seguintes +aCe1 parte de u1a Eni2a transa9:o atD ser en2ontrado u1 2o1ando =ue a +inaliCe , commit ou rollbac8.4 )e todos os 2o1andos +ora1 e?e2utados 2o1 I?ito@ pode'se ent:o disparar o 2o1ando commit para =ue estes seBa1 apli2ados e se torne1 <is8<eis para os de1ais usuArios4 !aso 2ontrArio@ se u1 erro +oi en2ontrado e1 algu1 dos 2o1andos@ pode'se disparar u1 rollbac8 des2artando todas as altera9Kes desde o 2o1e9o da transa9:o4 !ada 2one?:o@ nor1al1ente suporta apenas u1 2ontrole de transa9:o e todos os seus 2onte?tos +aCe1 parte dessa 1es1a transa9:o4 Wuando u1a
Delphi Client/Server 4#

' A N C O S

D E

D A D O S

R E L A C I O N A I S

transa9:o D ini2iada@ =ual=uer 2o1ando disparado e1 =ual=uer u1 dos 2onte?tos +aC parte da transa9:o4 E =uando a transa9:o D +e2hada os 2o1andos e?e2utados por todos os 2onte?tos s:o apli2ados e os 2onte?tos s:o destru8dos4 )endo assi1@ 2o1andos =ue era1 1antidos preparados e1 algu1 2onte?to ne2essita1 ser no<a1ente 2o1pilados e 2onte?tos =ue possu8a1 2ursores e Mresult setsN =ue n:o ha<ia1 sido traCidos total1ente para a apli2a9:o s:o +e2hados e portanto seus dados perdidos4 7lgu1as +erra1entas@ 2o1o o Delphi@ ao <eri+i2are1 =ue os 2onte?tos ser:o destru8dos 5us2a1 todos os registros de Mresult setsN pendentes para a apli2a9:o antes =ue estes seBa1 destru8dos4 7lguns 5an2os de dados per1ite1 =ue seBa1 1antidos os 2onte?tos =uando a transa9:o D +inaliCada4 Entretanto@ D ne2essArio =ue a +erra1enta de desen<ol<i1ento ta15D1 +a9a uso desse re2urso4 Pode'se ta15D1 2riar 1ais de u1a 2one?:o@ para 2onseguir 1anter a5ertos os 2onte?tos@ dei?ando'os e1 u1a 2one?:o separada da 2one?:o =ue a transa9:o estA sendo e?e2utada@ BA =ue o 2ontrole de transa9:o s D <Alido para u1a Eni2a 2one?:o4 PorD1@ de<e' se to1ar 5astante 2uidado 2o1 essa Elti1a alternati<a4 !o1o serA <isto adiante@ o 2ontrole de tra<a1ento de registros ta15D1 D +eito para 2ada transa9:o e portanto u1a 2one?:o pode tra<ar 2o1andos da outra 2one?:o dei?ando a apli2a9:o e1 MDeadLo2QN@ se os 2uidados ne2essArios n:o +ore1 to1ados4 7lguns ser<idores de 5an2o de dados ta15D1 suporta1 o 2ontrole de transa9:o entre dois 5an2os di+erentes atra<Ds do re2urso 2ha1ado Mt>o'phase 2o11itN4 Esse re2urso per1ite =ue a +inaliCa9:o da transa9:o seBa +eita e1 dois passos@ possi5ilitando =ue u1 5an2o de dados noti+i=ue ao outro o su2esso da transa9:o para =ue ela possa ser +inaliCada 2o1o u1 todo4 *ransa9Kes no Delphi Para se +aCer esse 2ontrole de transa9:o no Delphi de<e'se utiliCar u1 2onBunto de 1Dtodos e?istentes no 2o1ponente (%atabase4 /tart2ransaction Commit Rollbac8
ProBeto E?e1plo

' Ini2ia a transa9:o4 ' E+eti<a as altera9Kes +eitas desde o in82io da transa9:o ' !an2ela as altera9Kes +eitas desde o in82io da transa9:o

O proBeto a seguir 1ostra 2o1o as transa9Kes s:o tratadas nas opera9Kes +eitas pelo prprio Delphi e 2o1o se 2o1porta1 os 2ursores e 2onte?tos BA a5ertos4 Wuando n:o se usa e?pli2ita1ente os 2o1andos <istos a2i1a@ o Delphi a5re i1pli2ita1ente u1a transa9:o a 2ada 2o1ando de atualiCa9:o disparado no 5an2o e logo a seguir +e2ha a transa9:o 2o1 u1 2o1ando commit4 O o5Beti<o do proBeto D o5ser<ar o =ue o2orre 2o1 o MResult )etN a5erto@ =uando u1 2o1ando =ue +inaliCa a transa9:o D e?e2utado4 Para 2onstruir a apli2a9:o de<e'se desenhar o M+or1N 2o1o 1ostrado na +igura e de+inir as propriedades listadas na ta5ela4

Delphi Client/Server

4$

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Fig 54%G For1 do proBeto de transa9Kes4

Componente For1 *a5le Data)our2e Grid WuerX

Data)our2e2 Grid2

Proprie"a"e Na1e Data5aseNa1e *a5leNa1e 72ti<e Data)et Data)our2e Data5aseNa1e )WL Re=uest Li<e Data)et Data)our2e

;alor +r1*ransa2ao Yendas Produto *rue *a5le Data)our2e Yendas )ele2t ] +ro1 Produto *rue WuerX Data)our2e2

*a5ela de PropriedadesG ProBeto de transa9Kes4

7ps ter 2onstru8do o M+or1N@ de<e'se a5rir o )WLMonitor atra<Ds da op9:o do Menu Database-/1. 4onitor para =ue se possa o5ser<ar os 2o1andos en<iados pelo Delphi ao ser<idor de 5an2o de dados4 /1. 4onitor ' Ferra1enta 2apaC de 1onitorar as 2ha1adas +eitas pelas apli2a9Kes Delphi aos ser<idores de 5an2o de dados4 Per1ite <er as instru9Kes en<iadas para o 5an2o 2o1o os 2o1andos )WLs , select@ up"ate@ insert@ "elete.4 7lD1 disso per1ite <er os <alores de parJ1etros en<iados para os 2o1andos e os dados =ue s:o retornados pelo ser<idor4 !on2luindo@ essa D u1a i1portante +erra1enta =ue au?ilia o desen<ol<edor a des2o5rir o 2o1porta1ento da apli2a9:o e1 rela9:o ao 5an2o de dados@ tornando poss8<el o aper+ei9oa1ento da apli2a9:o para se o5ter u1a 1elhor per+or1an2e no a15iente 2liente;ser<idor4

Delphi Client/Server

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Fig 54$G )WL Monitor4

Pode'se es2olher o =ue serA 1onitorado pelo )WL Monitor atra<Ds da op9:o 2race Option4

Fig 54 (G *ra2e Options do )WLMonitor

7ps a5rir o )WL Monitor de<e'se e?e2utar a apli2a9:o e o5ser<ar =ue so1ente s:o traCidos para a apli2a9:o u1a =uantidade de dados su+i2iente para preen2her a parte <is8<el do MGridN4 Wuando o usuArio na<ega pelo MGridN@ no<as linhas s:o traCidas@ atD =ue o usuArio atinBa o +i1 do Mresult setN4

Delphi Client/Server

' A N C O S

D E

D A D O S

R E L A C I O N A I S

7lD1 disso@ de<e'se o5ser<ar =ue se +or +eita u1a atualiCa9:o e1 algu1 registro@ serA disparado u1 2o1ando close +e2hando o Mresult setN e =uando o usuArio na<ega para u1a linha =ue ainda n:o +oi traCida para a apli2a9:o@ u1 no<o 2o1ando select serA +eito 5us2ando as linhas =ue ainda n:o +ora1 traCidas atra<Ds de u1 +iltro 2olo2ado na 2lAusula 9here do 2o1ando4
)ELE!* PRO[!D @PRO[NM @PRO[PRE!O @PRO[E)*OWLE @*IME)*7MP FROM PRODL*O WHERE )PRO<CD= >* ORDER Ra PRO[!D 7)!

7tra<Ds desse e?e1plo@ pode'se o5ser<ar =ue =uando u1a transa9:o D +inaliCada todos os Mresult setsN a5ertos s:o +e2hados e no 2aso do 2o1ponente ((able u1 no<o select D +eito =uando o usuArio na<ega por registros ainda n:o en<iados a esta9:o4 E?iste@ no entanto@ u1a di+eren9a =uando se utiliCa o 2o1ponente ( uer)4 Nesse 2o1ponente@ =uando a transa9:o D +inaliCada@ o Delphi lI todas as linhas pendentes atD o +inal do Mresult setN antes de e?e2utar o 2o1ando commit4 Para <eri+i2ar esse 2o1porta1ento@ de<e'se alterar a propriedade Active do (able* para MFalseN e a propriedade Active do uer)* para M*rueN e +aCer os 1es1os pro2edi1entos do e?e1plo anterior4 PorD1 alguns 5an2os suporta1 =ue os 2ursores per1ane9a1 a5ertos =uando a transa9:o D +inaliCada4 O Inter5ase D u1 dos 5an2os =ue possue1 essa 2ara2ter8sti2a e para utiliCA'la D ne2essArio alterar a propriedade DRIYER FL7G) no RDE4 Entretanto essa alternati<a s D <Alida para transa9Kes 2ontroladas i1pli2ita1ente pelo Delphi4
DR0;ER F.AG/ ( 5 2 &($&(-% 0solation level an" commit t7pe Read 2o11itted@ hard 2o11it Repeata5le read@ hard 2o11it Read 2o11itted@ so+t 2o11it Repeata5le read@ so+t 2o11it

Para 2ada ser<idor de 5an2o de dados e?iste u1a 2on+igura9:o di+erente4 Para o Ora2le@ por e?e1plo@ nada pre2isa ser +eito por=ue este D o 2o1porta1ento padr:o4

!on2orrIn2ia ' DL)F


Pode'se de+inir 2o1o 2on2orrIn2ia o pro2esso de disponi5iliCar a 1es1a 5ase de dados H <Arios usuArios 2one2tados si1ultanea1ente4 Para 1anter a uni2idade de u1a transa9:o e a 2on+ia5ilidade no <alor do dado apresentado ao usuArio@ D ne2essArio a utiliCa9:o de alguns 2ontroles so5re os registros do 5an2o de dados4 *ipos de tra<a1entos ,lo2Qs. Para disponi5iliCar tal +un2ionalidade@ o 5an2o de dados pro<I ser<i9os para 5lo=uear u1 registro@ de +or1a =ue outros usuArios n:o possa1 a2essA'lo4 7lguns 5an2os per1ite1 o tra<a1ento de u1 Eni2o registro@ en=uanto outros tra5alha1 2o1 unidades 2o1pat8<eis 2o1 o dispositi<o +8si2o@ per1itindo o
Delphi Client/Server 2

' A N C O S

D E

D A D O S

R E L A C I O N A I S

tra<a1ento atra<Ds de pAginas4 Dependendo do 5an2o@ o ta1anho dessas pAginas pode <ariar ,2b@ b.@ podendo essas sere1 +or1adas por 1ais de u1 registro4 Portanto@ =uando u1a pAgina D tra<ada@ todos os registros =ue ela possui ser:o tra<ados4 Esse 2ontrole de atri5uir e re1o<er as tra<as D realiCado para 2ada transa9:o e1 2ada 2one?:o4 Mes1o se duas 2one?Kes s:o +eitas pelo 1es1o usuArio@ o 2ontrole de tra<a1ento D distinto@ podendo assi1 u1a das 2one?Kes 5lo=uear registros para a outra 2one?:o4 De<e'se ter 2uidado ao se tra5alhar e1 1ais de u1a 2one?:o para n:o a2onte2er os 2ha1ados MDeadlo2QsN@ =ue s:o tra<a1entos 2ausados por 1ais de u1a 2one?:o e =ue 2ada u1a delas estA a espera da li5era9:o de u1 registro da outra para 2ontinuar sua e?e2u9:o4 Pode'se diCer =ue os 5an2os de dados tra5alha1 2o1 dois tipos de tra<asG Me?2lusi<e lo2QN e Mshared lo2QN4
E?2lusi<e Lo2Q

):o tra<as atri5u8das aos registros ou pAginas =uando o usuArio e?e2uta 2o1andos de atualiCa9:o so5re elas ,up"ate@ insert@ "elete.4 !o1o seu no1e indi2a@ nenhu1a outra tra<a pode ser 2olo2ada na 1es1a pAgina ou registro@ proi5indo =ual=uer tipo de a2esso ao registro ou pAgina por outra 2one?:o ,transa9:o.4 *odas as tra<as Me?2lusi<e lo2QsN s:o retiradas auto1ati2a1ente =uando a transa9:o +or +inaliCada por u1 commit ou rollbac84
)hared Lo2Q

):o tra<as =ue pode1 ser 2olo2adas nos registros ou pAginas =uando o usuArio sele2iona o registro4 L1a tra<a Mshared lo2QN per1ite =ue outras tra<as do 1es1o tipo seBa1 atri5u8das ao 1es1o registro ou pAgina@ entretanto pro85e a atri5ui9:o de u1a tra<a Me?2lusi<e lo2QN4 Portanto@ =uando se atri5ui a u1 registro ou pAgina u1a tra<a Mshared lo2QN@ 5lo=ueia'se =ual=uer atualiCa9:o por outra transa9:o ,2one?:o.@ per1itindo assi1 a apli2a9:o ter a2esso ao dado 2o1 a 2erteCa =ue este n:o serA alterado por 1ais ninguD14 Entretanto@ D poss8<el =ue o 1es1o usuArio na 1es1a 2one?:o possa alterar o registro ou pAgina 1ar2ado por ele 2o1o Mshared lo2QN trans+or1ando'o para Me?2lusi<e lo2QN@ desde =ue nenhu1a outra 2one?:o possua ta15D1 u1a tra<a Mshared lo2QN para o 1es1o registro ou pAgina4 *odas as tra<as Mshared lo2QN ta15D1 s:o retiradas =uando se +inaliCa a transa9:o4
P!g. ou Regist.?2ransa@Aes B C D E F B E?2lusi<e )hared C )hared )hared D E F

)hared

)hared E?2lusi<e

*a5ela de *ransa9KesG L1 Me?2lusi<e lo2QN e1 u1a linha@ e?2lui a possi5ilidade de e?istir outro Me?2lusi<e lo2QN ou Mshared lo2QN e1 u1a outra 2oluna na 1es1a linha4

N8<eis de isola1ento Pode1os de+inir alguns n8<eis de isola1ento@ de a2ordo 2o1 a +or1a =ue os Mshared lo2QsN s:o atri5u8dos aos registros ou pAginas4 7 seguir ser:o 1ostradas as <Arias +or1as de se tra5alhar 2o1 Mlo2QsN no 5an2o de dados@ independente dos no1es utiliCados pelos <Arios +orne2edores4 )endo poss8<el
Delphi Client/Server 3

' A N C O S

D E

D A D O S

R E L A C I O N A I S

=ue alguns 5an2os de dados n:o apresente1 todas as possi5ilidades des2ritas a5ai?o4
*ra<a1ento de todos os registros

Nessa 1odalidade D atri5u8da u1a tra<a Mshared lo2QN para todos os registros da sele9:o +eita atra<Ds de u1 2o1ando select4 Este D o n8<el de isola1ento =ue 1ais tra<a os registros e de<e ser utiliCado 2o1 2autela para n:o in<ia5iliCar a 2on2orrIn2ia dos dados e o +un2iona1ento da apli2a9:o4
*ra<a1ento de u1 registro ou pAgina

Nesse tipo de tra<a1ento@ s:o 2olo2adas tra<as Mshared lo2QsN so1ente para o registro ou pAgina onde o 2ursor se en2ontra posi2ionado4 Wuando a apli2a9:o 1o<i1enta o 2ursor para u1 pr?i1o registro@ D retirada a tra<a do registro anterior e 2olo2ada no registro atual 4 Portanto@ so1ente u1 registro ou pAgina +i2a tra<ado e1 u1 deter1inado 1o1ento4
)e1 tra<a1ento

Nessa 1odalidade D atri5u8da u1a tra<a Mshared lo2QN no 1o1ento de a2esso a 2ada registro4 Entretanto@ essa tra<a D retirada logo a seguir e o registro ou pAgina n:o per1ane2e tra<ado4 Essa pe=uena atri5ui9:o da tra<a D si1ples1ente para <eri+i2ar se n:o e?iste nenhu1a outra tra<a do tipo Me?2lusi<e lo2QN so5re o registro@ =ue n:o per1itiria a sua leitura4 Portanto@ 1es1o nessa 2ategoria n:o D poss8<el a2essar registros alterados no 1eio de u1a transa9:o =ue est:o 1ar2ados 2o1o Me?2lusi<e lo2QN4
)ele9:o de registros tra<ados 2o1 u1 e?2lusi<e lo2Q4

7lguns 5an2os per1ite1 =ue u1a 2one?:o a2esse os dados de u1 registro ou pAgina 1es1o se estes esteBa1 1ar2ados 2o1o Me?2lusi<e lo2QN4 Para tal@ o registro D a2essado se1 a atri5ui9:o de nenhu1a tra<a@ BA =ue u1a tra<a M)LN n:o pode 2oe?istir 2o1 u1a tra<a MELN e1 u1 1es1o registro ou pAgina4 !o1o os registros a2essados possue1 dados =ue n:o +ora1 e+eti<ados atra<Ds de u1 commit@ s:o nor1al1ente disponi5iliCadas 2pias antigas do 1es1o registro ar1aCenadas pelo 5an2o de dados4 7pesar de per1itir esse tipo de a2esso@ 1uitos 5an2os de dados pro85e1 a altera9:o dos dados =uando a2essados desta +or1a4 Opti1isti2 Lo2Q Para se 1a?i1iCar a 2on2orrIn2ia entre os dados nas apli2a9Kes@ pode1 ser utiliCadas outras +or1as de 2ontrole =ue di1inue1 os tra<a1entos 2ausados na 5ase de dados4 Para isso pode'se utiliCar o n8<el de isola1ento M)e1 tra<a1entosN e +aCer u1 2ontrole adi2ional para ter 2erteCa =ue os dados 1ostrados para o usuArio n:o +ora1 alterados =uando esse ini2ia o pro2esso de altera9:o do registro4 E?iste1 algu1as alternati<as =ue pode1 ser seguidas para se i1ple1entar esse pro2esso4 O pro2esso nor1al de u1 2o1ando de up"ate ou "elete D 2onter na 2lAusula 9here a <eri+i2a9:o da 2ha<e pri1Aria para possi5ilitar a identi+i2a9:o do registro na ta5ela4 Entretanto@ e?plorando u1 pou2o 1ais esse re2urso de identi+i2a9:o do registro@ pode'se i1ple1entar u1 5o1 2ontrole de 2on2orrIn2ia4

Delphi Client/Server

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Where 7ll

!onsiste e1 <eri+i2ar na 2lAusula 9here n:o s a 2ha<e pri1Aria@ 1as todos os registros4 7ssi1@ se =ual=uer u1 dos registros +or alterado ou e?2lu8do por outro usuArio@ esse n:o serA en2ontrado =uando o 2o1ando up"ate ou "elete +or disparado@ sendo poss8<el a apli2a9:o noti+i2ar o usuArio tal a2onte2i1ento4 7 apli2a9:o pode ent:o per1itir o usuArio 5us2ar no<a1ente os dados para <eri+i2ar as altera9Kes +eitas e reini2iar o pro2esso de altera9:o4 Entretanto@ 2a1pos de di+82il 2o1para9:o@ 2o1o 2a1pos 2ontendo i1agens e te?tos grandes@ nor1al1ente n:o pode1 ou n:o de<e1 ser utiliCados desta +or1a4
Where !hanged;beX

!onsiste e1 <eri+i2ar na 2lAusula 9here a 2ha<e pri1Aria 1ais os 2a1pos =ue so+rera1 altera9:o pelo usuArio4 Desta +or1a garante'se =ue os 1es1os 2a1pos n:o +ora1 alterados por outro usuArio4 Mas@ per1ite atualiCar u1 registro alterado por outro usuArio desde =ue n:o seBa1 os 1es1os 2a1pos4
Where beX

Nesse 1Dtodo a 2on2orrIn2ia D li<re@ pois per1ite =ue o registro seBa alterado se1 <eri+i2ar se este +oi alterado por outro usuArio4 Na 2lAusula 9here de altera9:o@ D so1ente utiliCada a 2ha<e pri1Aria da ta5ela para lo2aliCar o registro4
Where *i1esta1p;Ro>id

!onsiste e1 <eri+i2ar na !lAusula 9here a 2ha<e pri1Aria 1ais u1a 2oluna de+inida e?2lusi<a1ente para +aCer o 2ontrole de 2on2orrIn2ia4 Essa 2oluna D atualiCada para u1 no<o <alor toda <eC =ue o registro +or inserido ou alterado4 Portanto@ se o registro +or alterado por u1 outro usuArio@ o registro n:o serA en2ontrado para atualiCa9:o4 7lguns tipos de 5an2os de dados BA possue1 algu1 suporte para esse tipo de 2ontrole4 O )WL)er<er e o )X5ase possue1 u1 tipo de dado 2ha1ado timestamp@ para o =ual pode se 2riar u1a 2oluna =ue serA atualiCada auto1ati2a1ente 2o1 a hora@ 1inuto@ segundo e dD2i1os de segundo do 1o1ento e1 =ue o2orrer u1a opera9:o de inser9:o ou altera9:o4 O )WLRase D u1 outro 5an2o =ue per1ite esse 2ontrole atra<Ds de u1a 2oluna 2ha1ada ro9i" =ue BA D de+inida auto1ati2a1ente para todas as ta5elas e D atualiCada para u1 <alor Eni2o =uando o2orre as opera9Kes insert e up"ate4 Para os 5an2os =ue n:o possue1 auto1ati2a1ente esses re2ursos@ de<e'se 2riar u1a no<a 2oluna =ue pode ar1aCenar a Data;hora 2o1o no 2aso do timestamp@ desde =ue o tipo per1ita a atri5ui9:o de dD2i1os de segundo@ por=ue a unidade segundo n:o possui pre2is:o su+i2iente para essa opera9:o4 Ou pode'se 2riar u1a 2oluna nu1Dri2a@ 2uBo o <alor serA in2re1entado atra<Ds de u1 2ontador Eni2o a 2ada atualiCa9:o realiCada so5re o registro4 7lD1 de 2riar a 2oluna@ D pre2iso +aCer ta15D1 o pro2esso de atualiCa9:o dos dados =uando u1a opera9:o de insert ou up"ate o2orrer4 Pode'se +aCer isso atra<Ds da apli2a9:o ou atra<Ds do re2urso de MtriggersN dos 5an2os de dados4 7 utiliCa9:o de MtriggersN possi5ilita =ue a atualiCa9:o possa ser +eita atra<Ds de

Delphi Client/Server

' A N C O S

D E

D A D O S

R E L A C I O N A I S

outras +erra1entas =ue n:o seBa1 a prpria apli2a9:o e D portanto 1ais re2o1endado4 !on2orrIn2ia no Delphi Para se 2on+igurar os n8<eis de isola1ento utiliCados pelo Delphi de<e'se utiliCar a propriedade 2rans0solation do 2o1ponente (%atabase4 tiDirtXRead ' Per1ite ler altera9Kes +eitas por outro usuArio ,ou transa9:o. ainda n:o M2o1itadasN ,e+eti<adas.@ ou seBa n:o respeitando os Me?2lusi<es lo2QsN4 Essa op9:o nor1al1ente n:o estA dispon8<el nos 5an2o de dados4 tiRead!o11itted ' Esse D o tipo 1ais nor1al de se tra5alhar4 )o1ente as altera9Kes +eitas por outro usuArio ,ou transa9:o. BA M2o1itadasN s:o <istas pelo usuArio4 )e a altera9:o ainda n:o +oi e+eti<ada o registro +i2a tra<ado e a leitura +i2a esperando o +i1 da transa9:o4 tiRepeata5leRead ' Esse 1Dtodo D utiliCado para =ue o dado <isto pelo usuArio seBa se1pre o 1es1o durante a transa9:o se este +or lido no<a1ente4 7lguns 5an2os i1ple1enta1 este re2urso per1itindo <er u1a 2pia 1ais antiga de u1 registro alterado por outra transa9:o e ainda n:o M2o1itadoN4 Desta +or1a a apli2a9:o n:o +i2a tra<ada esperando a li5era9:o do registro pela transa9:o4 Esta alternati<a di1inui a possi5ilidade de tra<a1entos entre as transa9Kes@ porD1 2onso1e u1 nE1ero 1aior de re2ursos do 5an2o para +aCer as 2pias ,<ersKes. dos registros4 Outros 5an2os@ i1ple1enta1 este re2urso tra<ando 2o1 u1 Mshared lo2QN todos os registros lidos@ n:o per1itindo assi1 =ue outro usuArio altere o registro@ desta +or1a se os dados +ore1 relidos seus <alores per1ane2e1 o 1es1o4 7o 2ontrArio da i1ple1enta9:o anterior@ essa alternati<a au1enta a possi5ilidade de tra<a1entos entre as transa9Kes e de<e ser utiliCada 2o1 5astante 2uidado4

Delphi Client/Server

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Fig 54 G *Data5ase4*ransIsolation4

Para se 2on+igurar o pro2esso de MOpti1isti2 Lo2QN no Delphi@ de<e'se utiliCar a propriedade 3p"ate4o"e dos 2o1ponentes %ataSets+ ( uer) e ((able4

Fig 54 2G *WuerX4LpdateMode4 Delphi Client/Server "

' A N C O S

D E

D A D O S

R E L A C I O N A I S

ProBeto E?e1plo

O proBeto a seguir 1ostra 2o1o esses re2ursos s:o utiliCados no Delphi4 O +or1ulArio apresentado na +igura de+ine 2o1o a apli2a9:o de<e ser 2onstru8da4 De<e'se utiliCar duas instJn2ias da apli2a9:o para si1ular o a2esso de dois usuArios si1ultanea1ente4 O e?e1plo 1ostra o pro2esso de tra<a1ento do registro =uando u1a atualiCa9:o D +eita por u1 usuArio antes do 2o1ando commit ser e?e2utado4

Fig 54 /G ProBeto E?e1plo

Componente For1 Data5ase WuerX

Data)our2e Grid Rutton Rutton2 Rutton/


*a5ela de Propriedades4

Proprie"a"e Na1e 7lias Data5aseNa1e !onne2ted Data5aseNa1e )WL Re=uest Li<e Data)et Data)our2e !aption !aption !aption

;alor +r1Lo2Q YEND7) DRYEND7) *rue DRYEND7) )ele2t ] +ro1 !idade *rue WuerX Data)our2e )tart *rans !o11it Open

O 5ot:o M)tart *ransN serA utiliCado para ini2iar a transa9:o e portanto D i1ple1entado da seguinte 1aneiraG
proce"ure 2&rm.oc8.ButtonBClic8)/en"er 2ObGect*H begin DatabaseB./tart2ransactionH en"H

O 5ot:o M!o11itN ao ser pressionado +e2harA a transa9:o e?e2utando o 1Dtodo commit do (%atabaseG
Delphi Client/Server #

' A N C O S

D E

D A D O S

R E L A C I O N A I S

proce"ure 2&rm.oc8.ButtonCClic8)/en"er 2ObGect*H begin DatabaseB.CommitH en"H

E o 5ot:o MOpenN de<e alternar entre a5rir e +e2har o %ataset


proce"ure 2&rm.oc8.ButtonDClic8)/en"er 2ObGect*H begin 1uer7B.Active # Not 1uer7B.ActiveH en"H

uer)*4

Depois de 1ontada a apli2a9:o de<e'se 2o1pilA'la@ e?e2utA'la e a5rir 1ais u1a instJn2ia e?e2utando o EPE atra<Ds do >indo>s e?plorer4

Fig 54 &G Duas instJn2ias do proBeto e?e1plo e1 e?e2u9:o4

De<e'se e?e2utar agora os seguintes passosG 4 Pressionar o 5ot:o MOpenN da pri1eira instJn2ia para a5rir o %ataSetZ 24 Pressionar o 5ot:o M)tart *ransN da 1es1a instJn2ia para ini2iar a transa9:oZ /4 7lterar o 2a1po !ID[NLMH7RI*7N*E) do pri1eiro registro para &((4(((Z &4 Na<egar para o segundo registro para =ue a gra<a9:o seBa +eita no 5an2oZ 54 *entar a5rir a M=uerXN na segunda instJn2ia da apli2a9:o atra<Ds do 5ot:o MOpenN4 O Mresult setN <irA <aCio@ trata1ento +eito pelo Delphi =uando en2ontra o registro 5lo=ueadoZ
Delphi Client/Server $

' A N C O S

D E

D A D O S

R E L A C I O N A I S

-4 Pressionar o 5ot:o M2o11itN da pri1eira instJn2ia para e+eti<ar a gra<a9:o e li5erar os Mlo2QsNZ #4 Fe2har e a5rir no<a1ente a M=uerXN da segunda instJn2ia atra<Ds do 5ot:o MOpenN4 7gora@ os registros s:o traCidos para a telaZ %4 O 1es1o a2onte2e se o usuArio da segunda instJn2ia tentar alterar os dados =ue ainda n:o +ora1 e+eti<ados4 Pressionar no<a1ente o 5ot:o M)tart *ransN da pri1eira instJn2ia e alterar o 2a1po !ID[NLMH7RI*7N*E) para /((4(((Z $4 *entar@ agora@ alterar o 1es1o registro na segunda instJn2ia4 L1a 1ensage1 de MDeadLo2QN D retornada in+or1ando =ue o registro se en2ontra tra<ado4 Isso a2onte2e@ por=ue =uando se tenta alterar o registro da segunda instJn2ia o Delphi tenta atualiCar o registro@ 1as esse se en2ontra 5lo=ueado e n:o pode ser lidoZ

Fig 54 5G DeadLo2Q4

Nesse e?e1plo +oi utiliCado o n8<el de isola1ento MRead!o11itedN@ =ue so1ente per1ite o usuArio lI registros =ue BA +ora1 e+eti<ados por outro usuArio4 Pode'se +aCer o 1es1o e?e1plo anterior alterando antes o n8<el de isola1ento no 2o1ponente %atabase* para MRepeata5leReadNZ

Fig4 54 -G Propriedade *ransIsolation do 2o1ponente Data5ase

Delphi Client/Server

!%

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Entretanto@ esse n8<el s D atri5u8do =uando se ini2ia a transa9:o4 Portanto@ antes de e?e2utar o passo 5@ =ue a5re a M=uerXN@ de<e'se a5rir a transa9:o na segunda instJn2ia da apli2a9:o para de+inir o no<o n8<el de isola1ento4 7ssi1@ os dados s:o lidos 1es1o antes do pri1eiro usuArio e+etuar o commit@ 1as 2o1 os <alores anteriores a altera9:o +eita por ele4 Pode1os utiliCar esse e?e1plo para <eri+i2ar ta15D1 o 2o1porta1ento da propriedade 3p"ate4o"e do 2o1ponente uer)*4

Fig4 54 #G Propriedade 3p"ate4o"e do 2o1ponente uer)*4

O o5Beti<o desse e?e1plo +oi 1onitorar o a2esso ao 5an2o de dados atra<Ds da alternJn2ia de <Arias propriedades dos 2o1ponentes de u1a apli2a9:o Delphi@ de +or1a a <eri+i2ar as di<ersas possi5ilidades =ue o desen<ol<edor pode optar durante a 2onstru9:o da apli2a9:o4 E1 u1a apli2a9:o real@ n:o se separa dessa +or1a os 2o1andos de a5rir u1a transa9:o@ e?e2utar a opera9:o e +e2har a transa9:o4 Essas opera9Kes de<e1 ser e?e2utadas se=Uen2ial1ente e1 u1a Eni2a intera9:o 2o1 o usuArio e1 u1 per8odo de te1po 5e1 pe=ueno4 N:o 2a5e ao usuArio to1ar a de2is:o de a5rir e +e2har a transa9:o@ por=ue ele poderia dei?ar tra<ado durante 1uito te1po u1 registro =ue <Arios outros usuArios pre2isa1 utiliCar4

Delphi Client/Server

!1

' A N C O S

D E

D A D O S

R E L A C I O N A I S

!ap8tulo

ProBetando 7pli2a9Kes !liente;)er<idor


Esse captulo mostra algumas t,cnicas de construo de aplicaes voltadas para o ambiente -liente.Servidor.

2onstru9:o de apli2a9Kes !liente;)er<idor de<e o5ede2er algu1as regras de organiCa9:o para =ue os siste1as possa1 ter u1 te1po de <ida 1ais longo e a2o1panhar a e<olu9:o do neg2io da e1presa e a e<olu9:o te2nolgi2a da ar=uitetura4

Estrutura de u1a 7pli2a9:o


!o1o +oi <isto@ o a15iente 2liente ser<idor per1ite =ue a apli2a9:o seBa distri5u8da entre dois 2o1ponentes +8si2osG a esta9:o 2liente e o ser<idor de 5an2o de dados4 Entretanto@ logi2a1ente pode1os identi+i2ar trIs 2a1adas distintas dentro de u1a apli2a9:o4 7presenta9:o !o1posta por 2o1ponentes responsA<eis pela intera9:o da apli2a9:o 2o1 o usuArio +inal4 O responsa5ilidade dessa 2a1ada re2e5er os dados e 2o1andos do usuArio e de<ol<er'lhe in+or1a9Kes atra<Ds de ele1entos <isuais 2o1o 2onsultas@ grA+i2os@ relatrios e et2Z Lgi2a do Neg2io Parte da apli2a9:o responsA<el por 1anter as regras de neg2io da e1presa4 Essa 2a1ada re2e5e os dados da 2a1ada de inter+a2e e e?e2uta as opera9Kes e <alida9Kes ne2essArias para en<iA'los ao 5an2o de dados4 Da 1es1a +or1a@ e?trai os dados do 5an2o de dados de a2ordo 2o1 as regras de neg2io da apli2a9:o e os en<ia para ele1entos da inter+a2e para =ue seBa1 e?i5idos4
Delphi Client/Server !2

' A N C O S

D E

D A D O S

R E L A C I O N A I S

Portanto@ essa 2a1ada D responsA<el e1 interligar a inter+a2e <isual 2o1 o 5an2o de dados atra<Ds da e?e2u9:o de transa9Kes@ 2onsistIn2ia dos dados e regras de neg2io@ ou seBa@ a parte +un2ional da apli2a9:o4

Delphi Client/Server

!3

Geren2ia1ento de Dados Parte da apli2a9:o responsA<el pelo a2esso e a 1anipula9:o dos dados no ser<idor4 !o1o BA +oi <isto anterior1ente@ grande parte dessa 2a1ada D i1ple1entada pelo prprio ser<idor de 5an2o de dados4 Nor1al1ente o a2esso aos ser<i9os D +eito atra<Ds da linguage1 )WL4 PorD1@ D ta15D1 ne2essArio u1 2onBunto de 2o1andos para en<iar as senten9as )WLs e geren2iar a 2o1uni2a9:o entre a apli2a9:o e o ser<idor4 Esses 2o1andos se en2ontra1 e1 5i5liote2as disponi5iliCadas pelos prprios +orne2edores de 5an2o de dados =ue s:o instaladas e1 2ada esta9:o de tra5alho4 7lD1 disso 2ada +a5ri2ante de +erra1entas de desen<ol<i1ento +orne2e ta15D1 1Dtodos e 2o1ponentes 2apaCes de si1pli+i2ar e tornar 1ais transparente o a2esso aos di<ersos )GDRs4

C.0EN2E APRE/EN2AJKO FL/0CO .IG0CA "o NEGIC0O GERENC0A4EN2O "e DADO/ /ER;0DOR
Fig -4 G !a1adas F8si2as e Lgi2as de u1a 7pli2a9:o4

.IG0CO

Yantagens da OrganiCa9:o da 7pli2a9:o e1 !a1adas


7 di<is:o da apli2a9:o nessas trIs 2a1adas lgi2as possi5ilita a organiCa9:o e padroniCa9:o da 2odi+i2a9:o e 2onstru9:o da apli2a9:o@ alD1 de propor2ionar u1a 1aior +a2ilidade de 1anuten9:o e e<olu9:o para no<as +ases da ar=uitetura !liente;)er<idor4 !o1o BA +oi <isto@ a tendIn2ia da ar=uitetura !liente;)er<idor D retirar 2ada <eC 1ais parte do pro2essa1ento da apli2a9:o realiCado pelas esta9Kes de tra5alho 2lientes e 2entraliCA'lo e1 ser<idores@ pro<endo u1 1elhor geren2ia1ento do pro2esso e +a2ilitando a e<olu9:o da +un2ionalidade =ue +oi distri5u8da4 7 distri5ui9:o da apli2a9:o e1 2a1adas lgi2as possi5ilita ta15D1 =ue 2ada 2a1ada possa e<oluir independente das outras desde =ue se 1antenha a inter+a2e entre elas4 Por e?e1plo@ pode'se alterar as regras de neg2io para atender as ne2essidades do 1er2ado se1 ne2essaria1ente ter =ue 1odi+i2ar a 2a1ada de inter+a2e ou a 2a1ada de geren2ia1ento de dados4 Por outro lado@ pode'se e<oluir a apresenta9:o para no<as te2nologias 2o1o 1ulti18dia@ se1 pre2isar alterar as regras de neg2io4 E<olu9Kes te2nolgi2as@ 2o1o a
Delphi Client/Server !4

distri5ui9:o da 5ase de dados na 2a1ada de geren2ia1ento de dados pode ser +eita de +or1a transparente das de1ais 2a1adas4 Portanto@ esses tipos de distri5ui9:o torna1 as apli2a9Kes 1ais es2alA<eis para suportar +uturas i1ple1enta9Kes possi5ilitando u1 te1po de <ida 1uito 1ais longo4

Estrutura de u1a 7pli2a9:o Delphi


7 +erra1enta de desen<ol<i1ento Delphi@ desde sua pri1eira <ers:o BA se 1ostrou preo2upada e1 distri5uir a apli2a9:o nas trIs 2a1adas lgi2as4 Esse es+or9o ini2ial te1 5ene+i2iado a Rorland a e<oluir a +erra1enta para as no<as gera9Kes da ar=uitetura !liente;)er<idor4 Muitas outras +erra1entas =ue n:o possu8a1 essa +iloso+ia de tra5alho est:o en+rentando sDrios pro5le1as para sensi5iliCar seus 2lientes a ne2essidade de tra5alhar dessa +or1a para 2onseguire1 1igrar e re2e5er os 5ene+82ios da no<a gera9:o !liente;)er<idor4 Para i1ple1entar essa +iloso+ia de tra5alho no Delphi@ a Rorland esta5ele2eu trIs 2ategorias de 2o1ponentesG 2o1ponentes <isuais@ 2o1ponentes de a2esso H 5ase de dados e 2o1ponentes de liga9:o4

Fig -42G !ategorias de 2o1ponentes do Delphi para a2esso a 5ase de dados4

Essa +or1a de tra5alho organiCada e1 2a1adas distintas per1ite ta15D1 u1a 1aior reutiliCa9:o de 2digo e portanto u1 au1ento de produti<idade na 2onstru9:o de apli2a9Kes atra<Ds dos re2ursos do Delphi de 2ria9:o de 2o1ponentes e Mte1platesN de telas4 !o1ponentes <isuais !o1ponentes responsA<eis pela inter+a2e 2o1 o usuArio4 !orresponde1 H 2a1ada de 7presenta9:o dis2utida anterior1ente4 Esses 2o1ponentes est:o lo2aliCados na pAgina Data Controls da paleta de 2o1ponentes do Delphi4

Delphi Client/Server

!o1ponentes de 72esso H 5ase de dados !o1ponentes responsA<eis e1 2riar toda a estrutura ne2essAria para a2essar e 1anipular o 5an2o de dados4 ):o os 2o1ponentes en2arregados e1 inter+a2ear 2o1 os ser<i9os de geren2ia1ento e 1anipula9:o +orne2idos pela 5ase de dados4 Esses 2o1ponentes ta15D1 possue1 propriedades e e<entos destinados a i1ple1enta9:o da lgi2a de neg2io na apli2a9:o4 Esses 2o1ponentes est:o lo2aliCados na pAgina Data Access da paleta de 2o1ponentes4

!o1ponente de liga9:o !o1ponente responsA<el pela inter+a2e entre as duas 2a1adas a2i1a4 )ua prin2ipal 2ara2ter8sti2a D tornar os 2o1ponentes <isuais independentes dos 2o1ponentes de a2esso@ ou seBa@ a 2a1ada de 7presenta9:o da Lgi2a do Neg2io4 Esse 2o1ponente D o (%ataSource =ue +i2a lo2aliCado ta15D1 na pAgina Data Access da paleta de 2o1ponentes4

Delphi Client/Server

!!

!onstruindo 7pli2a9Kes !liente;)er<idor


Esse captulo mostra a construo de uma tela de manuteno utilizando/se os componentes do %elp'i e como configur0/los para trabal'ar com banco de dados.

!ap8tulo

?iste1 <Arias 1aneiras de se utiliCar os 2o1ponentes do Delphi para tra5alhar 2o1 5an2o de dados4 O pre2iso sa5er es2olher as +or1as 1ais ade=uadas para 2ada tipo de i1ple1enta9:o4 7tra<Ds desse 2ap8tulo ser:o 1ostrada <Arias dessas op9Kes e o =ue 2ada u1a di+ere no 2o1porta1ento da apli2a9:o 2o1 o 5an2o de dados4

LtiliCando Data Modules


E1 u1a apli2a9:o !liente;)er<idor D interessante utiliCar o re2urso de Data Module +orne2ido pelo Delphi4 Data Module D u1 2o1ponente =ue +orne2e u1a lo2aliCa9:o 2entraliCada para 2o1ponentes n:o'<is8<eis do Delphi4 Pode'se ent:o utiliCar o Data Module para 2onter os 2o1ponentes da 2ategoria Data 722ess@ responsA<eis pela lgi2a de neg2io da apli2a9:o e inter+a2e 2o1 o 5an2o de dados4 7ssi1@ toda a lgi2a de neg2io +i2a 2on2entrada e1 u1 Eni2o ponto da apli2a9:o +a2ilitando a 1anuten9:o e e<olu9:o4 Para apli2a9Kes 1aiores D nor1al =ue se utiliCe 1ais de u1 Data Module su5di<idindo a lgi2a de neg2io4 Para e?e1pli+i2ar1os esse re2urso@ ire1os 2onstruir a tela de 2adastro de produtos44 Para se 2onstruir essa tela@ de<e'se ini2ial1ente 2riar u1 %ata1odule e 2olo2ar nele u1 2o1ponente %atabase.

Fig #4 G !o1ponente (%atabase4

Componente DataModule
*a5ela de Propriedades4

Proprie"a"e Na1e

;alor DM)istYendas

Delphi Client/Server

!"

!o1ponente *Data5ase
!o1o +oi <isto o 2o1ponente (%atabase D responsA<el pela 2one?:o 2o1 o 5an2o de dados4 Esse 2o1ponente possui algu1as propriedades =ue per1ite1 a 2on+igura9:o dessa 2one?:o4 Pode'se utiliCar a op9:o Database E"itor do popup 1enu =ue D e?i5ido ao se pressionar o 5ot:o direito do 1ouse so5re o 2o1ponente %atabase*4

Fig #42G Data5ase Editor

7tra<Ds do Data5ase Editor pode'se atri5uir os <alores para <Arias propriedades 2o1o +oi 1ostrado na +igura4 7lD1 disso@ so5repor <alores do M7liasN de+inidos no RDE atra<Ds do 5ot:o De&aults4 3/ER NA4E Esse parJ1etro pode ser utiliCado para dei?ar +i?o o usuArio =ue irA a2essar o 5an2o de dados4 7lgu1as e1presas adota1 essa +or1a de tra5alho ao in<Ds de 2riar <Arios usuArios no 5an2o de dados4 E1 nosso e?e1plo@ ire1os atri5uir o <alor )a)DR7 para o parJ1etro4 PA//MORD )e +or +i?ado o <alor de L)ER N7ME@ pode'se ta15D1 BA dei?ar espe2i+i2ada a senha do usuArio4 P7))WORD^1asterQeX /1.PA//2:R3 4ODE Esse parJ1etro possui trIs <alores poss8<eisG )H7RED 7L*O!OMMI*@ )H7RED NO7L*O!OMMI* e NO* )H7RED4 De<e'se espe2i+i2ar )H7RED@ =uando deseBa'se =ue todos as atualiCa9Kes +eitas auto1ati2a1ente pelo Delphi@ as atualiCa9Kes +eitas 1anual1ente e o 2ontrole de transa9:o use1 a 1es1a 2one?:o4 Wuando a op9:o NO* )H7RED D utiliCada@ u1a no<a 2one?:o es2ondida D esta5ele2ida 2o1 o 5an2o de dados4 7ssi1@ todas as atualiCa9Kes +eitas 1anual1ente atra<Ds do 1Dtodo ENec/(l de u1a uer) e o 2ontrole de transa9:o +eito atra<Ds dos 1Dtodos do 2o1ponente (%atabase utiliCa1 essa no<a 2one?:o4 7lD1 disso@ se espe2i+i2ada a op9:o )H7RED@ pode'se ainda es2olher entre as op9Kes 7L*O!OMMI* e NO7L*O!OMMI*4 7 pri1eira e+eti<a
Delphi Client/Server !#

auto1ati2a1ente =ual=uer 2o1ando )WL en<iado ao ser<idor@ a 1enos =ue u1a transa9:o seBa a5erta e?pli2ita1ente atra<Ds do 2o1ando start transaction4 Na segunda op9:o@ os 2o1andos espera1 pela e?e2u9:o e?pl82ita do 2o1ando commit para sere1 e+eti<ados4 E1 nosso e?e1plo@ ire1os atri5uir o <alor )H7RED 7L*O!OMMI* para o parJ1etro4

Es2olhendo entre **a5le e *WuerX


O Delphi possui dois 2o1ponentes =ue per1ite1 o a2esso e 1anipula9:o dos dados do ser<idorG ((able e ( uer)4 O pri1eiro D 5aseado no a2esso a u1a deter1inada ta5ela do 5an2o de dados e o segundo D 5aseado e1 u1a senten9a )WL ,2o1ando select.4 Por ser 5aseado e1 u1a senten9a )WL@ o 2o1ponente ( uer) per1ite tra5alhar 2o1 1ais de u1a ta5ela do 5an2o de dados ao 1es1o te1po4 715os os 2o1ponentes utiliCa1 a linguage1 )WL para a2essar a 5ase de dados4 Wuando se tra5alha 2o1 ((able@ o Delphi gera auto1ati2a1ente u1a senten9a )WL de a2ordo 2o1 os parJ1etros de+inidos para o 2o1ponente4 7lD1 dessa di+eren9a 5Asi2a entre os dois 2o1ponentes@ outros +atores de<e1 ser o5ser<ados na es2olha4 75ertura Opera9:o +eita =uando D e?e2utado o 1Dtodo Open do 2o1ponente ((able ou ( uer)@ =ue produC a 2o1pila9:o e e?e2u9:o do 2o1ando select4 Wuando esse 1Dtodo D e?e2utado atra<Ds do 2o1ponente ((able@ o Delphi realiCa u1a sDrie de outros 2o1andos )WLs para 5us2ar in+or1a9Kes do 2atAlogo da ta5ela ne2essArias para as opera9Kes de sele9:o e atualiCa9:o4 Essa 5us2a pode ser oti1iCada atra<Ds da op9:o EN7RLE )!HEM7 !7!HE do RDE@ +aCendo 2o1 =ue essas in+or1a9Kes seBa1 lidas apenas u1a <eC durante a e?e2u9:o da apli2a9:o4 Wuando o pri1eiro a2esso D +eito@ o RDE ar1aCena as in+or1a9Kes e1 u1 ar=ui<o e =ual=uer no<a ne2essidade de a5ertura da 1es1a ta5ela n:o ne2essita 5us2ar no<a1ente os ele1entos do 2atAlogo4 Por outro lado@ utiliCando'se o 2o1ponente ( uer)@ pode'se des<iar dessa 5us2a desde =ue n:o se utiliCe a propriedade Re(uest .ive =ue torna o Mresult setN da M=uerXN atualiCA<el auto1ati2a1ente pelo Delphi4 )e o <alor da propriedade Re(uest .ive +or *RLE e o )ELE!* utiliCado o5ede2er as restri9Kes para =ue o Delphi 2onsiga atualiCar o Mresult setN@ as 1es1as 5us2as utiliCadas para o 2o1ponente ((able ter:o =ue ser +eitas4 !on2luindo@ para =ue a 5us2a de ele1entos do 2atAlogo n:o seBa +eita D ne2essArio utiliCar o 2o1ponente ( uer) e 2ontrolar as atualiCa9Kes 1anual1ente ou atra<Ds de 2o1ponentes do tipo (2pdateS !4 Filtros L1a das grandes <antagens de se utiliCar )GRDs D poder +aCer o +iltro no prprio ser<idor e portanto tra+egar u1 nE1ero 1enor de linhas pela rede4 Para se +aCer isso@ D ne2essArio utiliCar a 2lAusula 9here do 2o1ando select4 Wuando se en<ia u1a 2lAusula 9here no 2o1ando )WL@ o prprio ser<idor se en2arrega de sele2ionar os registros =ue 2o1pKe1 a pes=uisa realiCada@ BA o5ser<ando as 1elhores alternati<as de a2esso tentando utiliCar o 1A?i1o dos 8ndi2es esta5ele2idos no 5an2o de dados4
Delphi Client/Server !$

!o1 o 2o1ponente ( uer) isso D +eito direta1ente no 2o1ando )WL suportando a sinta?e +orne2ida pela linguage1 )WL do 5an2o de dados utiliCado4 Entretanto@ se +or utiliCada a propriedade &ilter do ( uer) para +iltrar o Mresult setN@ o Delphi n:o utiliCarA os re2ursos do )GRD para sele2ionar os registros e irA traCer todas as linhas resultantes da WuerX para a esta9:o4 )o1ente =uando essas linhas +ore1 traCidas para 1A=uina 2liente@ D =ue o +iltro serA apli2ado lo2al1ente@ tornando 2ada linha <is8<el ou n:o na tela4 Entretanto@ 2o1 o 2o1ponente ((able a propriedade &ilter e as +un9Kes de sele9:o 2o1o /etRange age1 de +or1a di+erente4 O Delphi tenta traduCir as espe2i+i2a9Kes +eitas atra<Ds desses dois 1Dtodos e 2olo2A'las direta1ente na 2lAusula 9here do select realiCado4 Desta +or1a@ 2onsegue'se o 1es1o dese1penho do 2o1ponente ( uer)@ BA =ue o +iltro D +eito na prpria 2lAusula 9here4 Entretanto@ 2o1o o Delphi D =ue realiCa a tradu9:o das espe2i+i2a9Kes para a 2lAusula 9here@ e?iste u1a 2erta li1ita9:o dessas espe2i+i2a9Kes e se essas n:o 2onseguire1 ser traduCidas@ o +iltro serA +eito na prpria 1A=uina 2liente4 Portanto@ o 2o1ponente ( uer) D 1ais a5rangente no =ue se diC respeito a +iltros@ suportando de +or1a 1ais 2o1pleta a sinta?e +orne2ida pelo 5an2o de dados4 !o1 rela9:o ao e<ento OnFilterRecor"@ e1 a15os os 2o1ponentes o +iltro D apli2ado lo2al1ente e portanto todas as linhas =ue 2o1pKe1 o Mresult setN pre2isa1 ser traCidas para a esta9:o 2liente@ n:o utiliCando os re2ursos do ser<idor4 *ransa9Kes !o1o BA +oi <isto o 2o1ponente ((able possui u1a +or1a 1ais inteligente de se 2o1portar do =ue o 2o1ponente ( uer) =uando o Mresult setN estA prestes a ser destru8do atra<Ds da realiCa9:o de u1 2o1ando commit para +inaliCar a transa9:o4 O 2o1ponente ( uer) ne2essita =ue todas as linhas atD o +inal da sele9:o seBa1 traCidas para a esta9:o 2liente antes =ue o commit seBa e?e2utado no 5an2o para =ue o usuArio n:o per2a as linhas =ue ainda n:o +ora1 traCidas para apli2a9:o4 TA o 2o1ponente ((able si1ples1ente +e2ha o Mresult setN se1 nenhu1 e+eito =ue di1inua o dese1penho da atualiCa9:o e se hou<er a ne2essidade de 5us2ar as linhas restantes da ta5ela u1 no<o select D +eito a partir da Elti1a linha traCida4 Entretanto@ alguns 5an2os de dados per1ite1 =ue o commit n:o destrua os Mresult setN ou pode'se ta15D1 utiliCar 2one?Kes separadas para a atualiCa9:o e para o Mresult setN4 Desta +or1a n:o hA ne2essidade do 2o1ponente ( uer) realiCar as 5us2as antes da real ne2essidade do usuArio4 Por outro lado@ o 2o1ponente ((able@ dei?a a5erta u1a transa9:o =ue pode@ dependendo do 5an2o de dados@ estar tra<ando algu1a pAgina da ta5ela4

Delphi Client/Server

"%

NE1ero de *a5elas 72essadas L1 outro +ator rele<ante na es2olha do 2o1ponente@ D o nE1ero de ta5elas =ue de<e1 ser a2essadas para 5us2ar as in+or1a9Kes ne2essArias para o usuArio e1 u1a 1es1a tela4 7tD u1 2erto nE1ero de ta5elas D 1ais interessante utiliCar o re2urso de MBoinsN dos 5an2os para traCer e1 u1 Eni2o 2o1ando )WL@ todo o 2onBunto de in+or1a9Kes4 Nesse 2aso u1 2o1ponente ( uer) de<eria ser utiliCado4 Wuando isso D +eito atra<Ds de <Arios 2o1ponentes ((able@ D as <eCes ne2essArio traCer os dados de todas as ta5elas para a 1A=uina 2liente para =ue a rela9:o entre elas possa ser +eita4 No 1elhor 2aso@ se +iltrar1os 2ada ta5ela pelo registro sele2ionado na outra@ ter8a1os =ue e?e2utar <Arios 2o1andos )ELE!*s 1ais si1ples no ser<idor 2ontra u1 Eni2o 2o1ando u1 pou2o 1ais 2o1ple?o do 2o1ponente ( uer)4

*ra5alhando 2o1 o *WuerX


O 2o1ponente ( uer) pode ser ent:o utiliCado para a2essar e 1anipular os dados4 !o1o +oi <isto@ a utiliCa9:o desse 2o1ponente dei?a 1ais +le?8<el o a2esso ao 5an2o@ BA =ue tra5alha direta1ente 2o1 a linguage1 )WL4 Portanto@ 1anuten9Kes e<oluti<as 2o1o a2essar 1ais de u1a ta5ela atra<Ds do 1es1o 2o1ponente pode1 ser i1ple1entadas 2o1 1ais +a2ilidade4 7+i1 de 2ontinuar1os nossa apli2a9:o@ de<e1os 2olo2ar u1 2o1ponente ( uer) no %ata1odule %1Sist3endas.

Fig #4/G !o1ponente ( uer)

Componente WuerX

Proprie"a"e Na1e Data5aseNa1e )WL Re=uest Li<e 72ti<e

;alor WProduto DRYEND7) )ele2t ] +ro1 produto order 5X produto4prod[2d *RLE *RLE

*a5ela de Propriedades4

7 propriedade Re(uest .ive ligada@ +aC 2o1 =ue o Delphi tente atualiCar auto1ati2a1ente o Mresult setN traCido pela M=uerXN4 Desta +or1a@ o 2o1ponente ( uer) se 2o1porta de +or1a se1elhante ao 2o1ponente ((able4 Entretanto@ para =ue isso seBa poss8<el@ o 2o1ando )WL te1 =ue o5ede2er algu1as restri9Kes 2o1o por e?e1ploG

Delphi Client/Server

"1

!onter apenas u1a ta5ela na 2lAusula FromZ N:o possuir agrega9Kes atra<Ds de group b7 e +un9Kes 2o1o sum@ maN@ et2Z 7ps ter1os preen2hido o %ata1odule 2o1 os 2o1ponentes responsA<eis pelo a2esso ao 5an2o de dados@ pode1os 2onstruir o M+or1N de 1anuten9:o da ta5ela de produto 2o1o a +igura a seguirG

Fig #4&G For1 de Produto4

Componente For1 Panel Panel2 Data)our2e DRNa<igator DREdit 44DREdit&


*a5ela de Propriedades4

Proprie"a"e Na1e !aption 7lign !aption 7lign !aption Na1e Data)et Data)our2e Data)our2e DataField

;alor +r1Produto Produtos al*op al!lient D)Main DM)istYendas4Wproduto D)Main D)Main pro[2d44pro[esto=ue

Pode1os ent:o e?e2utar a apli2a9:o e <eri+i2ar =ue atra<Ds da propriedade Result .ive do produto@ +oi poss8<el atualiCar os dados e a2res2entar no<as linhas H ta5ela4 Entretanto@ pode1os notar =ue as linhas inseridas desapare2e1 do MResult )etN ao na<ergar1os para outro registro4 Esta D u1a restri9:o =ue e?iste no 2o1ponente ( uer) =uando se utiliCa a propriedade Result .ive para tornA'lo atualiCA<el auto1ati2a1ente pelo Delphi4 7lD1 disso@ +oi <isto =ue para ser poss8<el tornar o Mresult setN atualiCA<el@ e?iste1 algu1as restri9Kes =uanto ao 2o1ando )WL de+inido4 Por 2ausa desses 1oti<os@ tal<eC seBa ent:o ne2essArio tra5alhar 2o1 a propriedade Result .ive igual a MFalseN e utiliCar u1 outro arti+82io para tornar o
Delphi Client/Server "2

Mresult li<eN atualiCA<el se1 restri9Kes no 2o1ando )WL e se1 perder as linhas inseridas4

LtiliCando !a2hed Lpdates


7 outra +or1a de tornar o Mresult setN de u1 2o1ponente ( uer) atualiCA<el D utiliCando o re2urso de M2a2hed updatesN do Delphi4 Wuando a propriedade Cache"3p"ates estA ligada@ todas as inser9Kes@ altera9Kes e e?2lusKes realiCadas so5re o %ataset n:o s:o en<iadas direta1ente para o 5an2o4 7o in<Ds disso@ s:o ar1aCenadas e1 u1 M2a2heN lo2al na 1e1ria atD =ue se dispare u1 2o1ando do %ataset para apli2ar todas as atualiCa9Kes atra<Ds de Eni2o pro2esso no 5an2o de dados4 !o1 isso@ toda <eC =ue +or realiCado u1 2o1ando post@ as altera9Kes ser:o en<iadas para o M2a2heN ao in<Ds de ire1 direta1ente para o 5an2o@ seBa atra<Ds do %#4avigator@ auto1ati2a1ente =uando se dei?a a linha ou atra<Ds da 2ha1ada e?pl82ita do 2o1ando4 Mes1o se =uiser1os en<iar linha a linha os registros para o 5an2o de dados@ tal<eC seBa ne2essAria a utiliCa9:o do re2urso de M2a2hed updatesN si1ples1ente para tornar o Mresult setN atualiCA<el@ 2aso n:o seBa poss8<el utiliCar a propriedade Result .ive do ( uer)4 Para utiliCar o re2urso de M2a2hed updatesN@ de<e'se ligar a propriedade de 1es1o no1e do 2o1ponente ( uer)4 Ya1os +aCer isso para o 5roduto@ 1as 1antendo por en=uanto a propriedade Result .ive ^ M*rueN4 Ya1os retirar do %#4avigator alguns 5otKes dei?ando so1ente os 5otKes de na<ega9:o4 7 seguir@ <a1os 2olo2ar =uatro no<os 5otKes do tipo Speed#utton para i1ple1entar1os as opera9Kes de inser9:o@ e?2lus:o@ sal<a1ento e 2an2ela1ento4

Fig #45G O +or1 de Produto4

Delphi Client/Server

"3

Componente )ppedRutton )ppedRutton2 )ppedRutton/ )ppedRutton&


*a5ela de Propriedades

Proprie"a"e Na1e Na1e Na1e Na1e

;alor 5tn7ppend 5tnDelete 5tn)a<e 5tnDis2ard

De<e1os agora@ i1ple1entar o 2digo para os e<entos OnClic8 dos 5otKes4 O pri1eiro 5ot:o M5tn7ppendN de<e apenas 2riar u1a no<a linha no Mresult setN atra<Ds do 1Dtodo appen" do 2o1ponente 5roduto4 Entretanto <a1os tentar ser u1 pou2o 1ais genDri2o no 2digo para depois poder1os reutiliCar o 2digo es2rito atra<Ds de Mte1platesN4
proce"ure 2&rmPro"uto.btnAppen"Clic8)/en"er 2ObGect*H begin D/4ain.Data/et.Appen"H en"H

Para o segundo 5ot:o@ ta15D1 n:o hA nenhu1a no<idade4


proce"ure 2&rmPro"uto.btnDeleteClic8)/en"er 2ObGect*H begin D/4ain.Data/et.DeleteH en"H

Lsare1os o ter2eiro 5ot:o M5tn)a<eN para apli2ar no 5an2o de dados todas as altera9Kes +eitas nos di<ersos registros e =ue est:o por en=uanto ar1aCenadas no M2a2hed updatesN4
proce"ure 2&rmPro"uto.btn/aveClic8)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH en"H

Nesse 2aso@ +oi ne2essArio +aCer u1 MtXpe2astN na propriedade Data/et para =ue ela possa identi+i2ar os 1Dtodos Appl73p"ates e Commit3p"ates4 Esses dois 1Dtodos s:o responsA<eis e1 apli2ar as altera9Kes pendentes no M2a2heN no 5an2o de dados4 7lD1 disso@ D ne2essArio utiliCar a MunitN =ue 2ontD1 a 2lasse (#%E%ataSet4 Pode1os +aCer isso na 2lAusula use da se9:o implementation4 Appl73p"atesG esse 1Dtodo apli2a no 5an2o de dados todas as altera9Kes pendentes no M2a2hed updateN4 Commit3p"atesG esse 1Dtodo li1pa do M5u++erN do M2a2hed updateN os registros =ue +ora1 apli2ados no 5an2o@ aps u1a atualiCa9:o realiCada 2o1 su2esso4

Delphi Client/Server

"4

Para o Elti1o 5ot:o ,M5tnDis2ardN.@ pode1os utiliCar o 1Dtodo Cancel3p"ates =ue ta15D1 li1pa o M5u++erN@ 1as des2artando todas as altera9Kes atual1ente 2ontidas no M2a2hed updateN4
proce"ure 2&rmPro"uto.btnDiscar"Clic8)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.Cancel3p"atesH en"H

Desta +or1a@ te1os a tela de produtos +un2ionando atra<Ds do re2urso M2a2hed updatesN@ ou seBa@ as altera9Kes sendo en<iadas e1 2onBunto para o 5an2o de dados4 7lD1 disso@ essa D u1a alternati<a para 2riar Mresult setsN atualiCA<eis se1 utiliCar a propriedade Re(uest .ive@ 2o1o <erer1os a seguir4

LtiliCando o !o1ponente *Lpdate)WL


E?iste1 duas 1aneiras de se tornar o Mresult setN de u1a M=uerXN atualiCA<el@ se1 as li1ita9Kes i1postas pela de+ini9:o da propriedade Re(uest .ive4 7 pri1eira D utiliCando o 2o1ponente (2pdateS !4 7tra<Ds desse 2o1ponente D poss8<el de+inir os 2o1andos =ue ser:o utiliCados para e+etuar as opera9Kes de inser9:o@ altera9:o e e?2lus:o4 7 segunda +or1a D atra<Ds do e<ento On3p"ateRecor" e serA <ista 1ais adiante nos pr?i1os 2ap8tulos4 Ya1os ent:o 2olo2ar u1 2o1ponente (2pdateS ! no %ata1odule da apli2a9:o@ 2o1o 1ostrado na +igura@ e de+inir algu1as propriedades atra<Ds da ta5ela a seguir4

Fig #4-G !o1ponente 2S5roduto.

Componente Lpdate)WL WProduto


*a5ela de Propriedades

Proprie"a"e Na1e Re=uest Li<e LpdateO5Be2t

;alor L)Produto False L)Produto

Pressionando o 5ot:o direito do 1ouse so5re o 2o1ponente@ pode'se sele2ionar a op9:o 3p"ate /1. E"itor... para a5rir u1a tela =ue irA per1itir a gera9:o dos 2o1andos )WLs de atualiCa9:o si1ples1ente de+inindo alguns parJ1etros4

Delphi Client/Server

"

Fig #4#G Lpdate )WL Editor4

Na lista 2able Name ir:o apare2er as ta5elas =ue +aCe1 parte da 2lAusula From do 2o1ando )WL4 De<e'se es2olher na lista a ta5ela =ue irA so+rer as atualiCa9Kes4 7ps sele2ionada a ta5ela@ pode'se pressionar o 5ot:o Get 2able Fiel"s para traCer os 2a1pos dessa ta5ela para as listas H direita da tela4 )e e?istir so1ente u1a ta5ela@ toda esse pro2edi1ento n:o serA ne2essArio@ BA =ue a ta5ela e seus 2a1pos ser:o traCidos auto1ati2a1ente4 7s duas listas da direita apresenta1 todos os 2a1pos 2ontidos na ta5ela4 De<e' se sele2ionar na pri1eira lista MbeX Fields O@ os 2a1pos =ue ser:o utiliCados na 2lAusula 9here dos 2o1andos up"ate e "elete4 Pode'se optar so1ente pela 2ha<e@ 2aso se =ueira dei?ar a 2on2orrIn2ia 1ais li<re@ ou es2olher todos os 2a1pos para <eri+i2ar se o registro BA +oi alterado por outro usuArio4 Desta +or1a@ 2onsegue'se si1ular os <alores MupWherebeXOnlXN e MupWhere7llN respe2ti<a1ente da propriedade 3p"ate4o"e do %ataSet@ BA =ue essa propriedade s D <Alida =uando se utiliCa a propriedade Re(uest .ive igual a M*rueN4 Para sele2ionar apenas a 2ha<e pri1Aria@ pode'se utiliCar o 5ot:o /elect Primar7 6e7s4 E1 nosso e?e1plo@ <a1os utiliCar esse 5ot:o para sele2ionar apenas a 2ha<e pri1Aria4 De<e'se sele2ionar na lista 3p"ateFiel"s@ os 2a1pos =ue ser:o alterados e inseridos pelos 2o1andos up"ate e insert4 FinaliCando@ o Elti1o 5ot:o ser<e para gerar os 2o1andos )WLs@ seguindo o =ue BA +oi de+inido4 Depois de gerado@ os 2o1andos pode1 ainda so+rer 1odi+i2a9Kes4 Pode'se por e?e1plo retirar a 2oluna PRO[!D da 2lAusula set do 2o1ando up"ate@ BA =ue n:o de<e1os dei?ar o usuArio alterar a 2ha<e pri1Aria4 Isso pode atD 2ausar u1 erro e1 alguns 5an2os de dados4
Delphi Client/Server "!

Pode'se notar =ue e1 alguns lugares +ora1 utiliCados pre+i?os MOLDN antes do no1e das 2olunas4 Isso +oi +eito para =ue seBa testado o <alor anterior a 1odi+i2a9:o realiCada ao in<Ds do <alor atual4 Esse pro2esso D ne2essArio =uando utiliCa'se todos os 2a1pos na 2lAusula 9here@ para per1itir =ue os 2a1pos seBa1 alterados e a <eri+i2a9:o seBa +eita a partir de seus <alores anteriores4

Gra<a9:o Linha a Linha ou e1 Rat2h


No in82io do e?e1plo@ as gra<a9Kes era1 +eitas linha a linha4 7o sair de u1 registro para o outro@ as altera9Kes era1 auto1ati2a1ente gra<adas no 5an2o de dados4 Entretanto@ este 2o1porta1ento +oi alterado =uando se optou e1 tra5alhar 2o1 M2a2hed updateN4 7pesar do re2urso M2a2hed updateN apresentar tais 2ara2ter8sti2as@ n:o +oi por esse 1oti<o =ue ns o utiliCa1os e1 nosso e?e1plo4 O 1oti<o prin2ipal de ter1os utiliCado o re2urso de M2a2hed updatesN +oi para per1itir =ue u1 2o1ando =ual=uer )WL@ se1 li1ita9Kes@ pudesse gerar u1 Mresult setN atualiCA<el4 Wual serA ent:o a 1elhor +or1a de tra5alhar c FaCer as gra<a9Kes linha a linha ou ar1aCenA'las e1 u1 M2a2heN e depois en<iA'las todas de u1a <eC para o ser<idor4 !ada u1a das alternati<as possue1 <antagens e des<antagens =ue de<e1 ser o5ser<adas antes de se es2olher o pro2esso =ue serA utiliCado4 Pode'se 2itar 2o1o <antagens de se tra5alhar 2o1 atualiCa9Kes e1 M5at2hN@ ou seBa@ ar1aCenando no M2a2heN e en<iando o 2onBunto de atualiCa9Kes de u1a Eni2a <eC para o 5an2oG Os pa2otes da rede ser:o 1elhor di1ensionados@ alD1 de di1inuir o nE1ero de 2o1andos =ue ser:o en<iados pela rede@ tendo no total u1 trA+ego 5e1 1enor na rede4 )e u1 2ontrole de transa9:o esti<er sendo utiliCado@ per1ite =ue a atualiCa9:o seBa u1a opera9:o Eni2a4 )e u1 dos 2o1andos +alhar@ nenhu1 2o1ando D e+eti<ado e o 5an2o de dados <olta para o estado original antes do in82io da transa9:o4 PorD1 este 1Dtodo ta15D1 possui algu1as des<antagensG Esse 1Dtodo pode 2on+undir o usuArio4 O usuArio pode perder o 2ontrole do =ue ele BA atualiCou4 7lD1 disso@ se u1 erro o2orrer na gra<a9:o@ a 2orre9:o do registro ou dos registros pelo usuArio D u1 pro2esso di+82il de ser i1ple1entado4 !o1o o usuArio pode le<ar 1uito te1po para alterar os registros@ e?iste u1a pro5a5ilidade 1aior de u1 outro usuArio ter alterado o 1es1o registro e portanto 5lo=uear a gra<a9:o4 Outro +ator i1portante a ser 2onsiderado D o te1po de espera do usuArio4 E1 u1 siste1a@ o usuArio nun2a gosta de esperar 1uito te1po por u1 deter1inado pro2esso4 7 gra<a9:o linha a linha distri5ui o pro2esso total de
Delphi Client/Server ""

atualiCa9:o e1 pe=uenos inter<alos de te1po =ue s:o 1uitas <eCes 2onsu1idos pelo prprio te1po de digita9:o do usuArio tornando'os i1per2ept8<eis4 TA a gra<a9:o e1 M5at2hN@ dependendo da 2o1ple?idade do pro2esso =ue estA sendo realiCado@ pode de1orar 1uito@ BA =ue toda a atualiCa9:o D +eita de u1a Eni2a <eC4 O te1po total da atualiCa9:o e1 M5at2hN D atD 1enor do =ue os +eitos linha a linha@ BA =ue u1 nE1ero 1enor de 2o1andos s:o en<iados ao 5an2o4 Entretanto o usuArio poderA a2har a per+or1an2e da gra<a9:o linha a linha 5e1 1elhor do =ue a outra@ por=ue o te1po total D dilu8do e1 di<ersas opera9Kes de te1po 5e1 1enores4 7tra<Ds da dis2uss:o a2i1a@ pode'se 2on2luir =ue as gra<a9Kes linha a linha pare2e1 ser u1 1Dtodo 1ais interessante de se utiliCar@ a 1enos =ue haBa a ne2essidade da gra<a9:o ser realiCada dentro de u1a Eni2a transa9:o@ 2o1o por e?e1plo@ o 2adastro de u1 pedido e de seus itens4 Para +aCer isso no Delphi@ pode1os 2ontinuar utiliCando o re2urso M2a2hed updatesN@ 1as =uestionando ao usuArio o sal<ando ou 2an2ela1ento das altera9Kes antes =ue ele dei?e o registro4 7ntes de +aCer isso@ <a1os organiCar u1 pou2o 1ais nossa apli2a9:o4 7o in<Ds de i1ple1entar1os a lgi2a direta1ente nos e<entos dos 5otKes@ <a1os 2riar proce"ures separadas para 2ada e<ento para =ue estes possa1 depois sere1 reutiliCados 1ais +a2il1ente4
. . public P Public "eclarations Q proce"ure /aveH proce"ure Ne9For0nsertH proce"ure DeleteH proce"ure Discar"H en"H . .

Depois de 2riar as pro2edures@ <a1os trans+erir o 2digo 2ontido nos e<entos dos 5otKes para as no<as pro2eduresG
proce"ure 2&rmPro"uto.btnAppen"Clic8)/en"er 2ObGect*H begin Ne9For0nsertH en"H proce"ure 2&rmPro"uto.btnDeleteClic8)/en"er 2ObGect*H begin DeleteH en"H proce"ure 2&rmPro"uto.btn/aveClic8)/en"er 2ObGect*H begin /aveH en"H proce"ure 2&rmPro"uto.btnDiscar"Clic8)/en"er 2ObGect*H begin Discar"H en"H
Delphi Client/Server "#

proce"ure 2&rmPro"uto.Ne9For0nsertH begin D/4ain.Data/et.Appen"H en"H proce"ure 2&rmPro"uto.DeleteH begin D/4ain.Data/et.DeleteH en"H proce"ure 2&rmPro"uto./aveH begin 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH en"H proce"ure 2&rmPro"uto.Discar"H begin 2BDEData/et)D/4ain.Data/et*.Cancel3p"ates en"H

Para +a2ilitar o geren2ia1ento dos e<entos D interessante 2riar u1a <ariA<el =ue indi=ue se u1 deter1inado e<ento estA sendo e?e2utado4 7tra<Ds desse 1Dtodo@ pode'se <eri+i2ar dentro de e<ento@ se ele estA sendo e?e2utado por u1 outro e<ento e assi1 5lo=uear 2ha1adas 1Eltiplas de u1 1es1o e<ento4 Ya1os 2riar o seguinte tipo de dado na se9:o t7pe da inter&aceG
2Oper/tate#)opNoneRopNe9For0nsertRopDeleteRop/aveRopDiscar"*H

Na se9:o public da 2lasse 2&rmPro"uto@ pode1os 2riar u1a <ariA<el desse tipoG
. . public P Public "eclarations Q Oper/tate 2Oper/tateH proce"ure /aveH proce"ure Ne9For0nsertH proce"ure DeleteH proce"ure Discar"H en"H .

Pode1os ini2ialiCA'la no e<ento OnCreate da $ormG


proce"ure 2&rmPro"uto.FormCreate)/en"er 2ObGect*H begin Oper/tate #opNoneH en"H

7gora@ para 2ada e<ento de<e1os 2ontrolar o <alor da <ariA<el atri5uindo a ela a opera9:o =ue estA sendo e?e2utada e retornando ao <alor original no +inal do e<ento4
proce"ure 2&rmPro"uto.Ne9For0nsertH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #Oper/tateH
Delphi Client/Server "$

Oper/tate #opNe9For0nsertH tr7 D/4ain.Data/et.Appen"H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H

!o1 isso@ BA te1os o 2digo 1ais organiCado e 2o1 1ais poder de geren2ia1ento4 Ya1os agora i1ple1entar o sal<a1ento linha a linha4 Para isso <a1os utiliCar o e<ento On3p"ateData do %ataSource =ue D disparado se1pre =ue se tentar en<iar u1a linha alterada para o M2a2heN@ ou seBa@ se1pre =ue D e?e2utado u1 2o1ando post4 Nesse e<ento ire1os perguntar ao usuArio se ele deseBa gra<ar o registro@ des2artar as altera9Kes ou 2an2elar a tentati<a de sair do registro4
proce"ure 2&rmPro"uto.D/4ain3p"ateData)/en"er 2ObGect*H var ret integerH begin 0& Oper/tate in SopNoneRopNe9For0nsertT then begin ret #Application.4essageBoN)UDeseGa salvar as altera@AesUR UCon&irma@+oUR 4B<5E/NOCANCE. % 4B<0CON13E/20ON *H case ret o& i"5es /aveH i"No Discar"H i"Cancel AbortH en"H en"H en"H

7 pri1eira 2oisa =ue serA +eita no e<ento D 2he2ar se nenhu1a opera9:o 2onhe2ida estA sendo e?e2utada4 N:o =uere1os@ por e?e1plo@ =ue a pergunta seBa +eita se o usuArio apertar o 5ot:o de sal<ar4 Depois serA +eita a pergunta para o usuArio e 2o1 a resposta +oi 1ontado u1 2o1ando case4 )e o usuArio =uiser sal<ar@ si1ples1ente 2ha1a1os o 2o1ando /ave. )e ele n:o =uiser@ des2arta1os a altera9:o antes de sair do registro4 E se ele =uiser 2an2elar@ e?e2uta1os o 2o1ando Abort4 Pode1os 1elhorar o e<ento Discar" para des2artar e li1par o M2a2heN apenas se ele 2onter algu1 registro4 !aso 2ontrArio pode1os apenas des2artar as altera9Kes antes 1es1o delas ire1 para o M2a2heN4
proce"ure 2&rmPro"uto.Discar"H var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opDiscar"H tr7 0& 2BDEData/et)D/4ain.Data/et*.3p"atesPen"ing then 2BDEData/et)D/4ain.Data/et*.Cancel3p"ates else 2BDEData/et)D/4ain.Data/et*.CancelH &inall7 Oper/tate #Ol"Oper/tateH en"H
Delphi Client/Server #%

en"H

O 1Dtodo cancel do %ataSet des2arta as altera9Kes =ue ainda n:o +ora1 para o M2a2hed updatesN4 7tra<Ds da propriedade 3p"atesPen"ing@ pode'se <eri+i2ar se e?iste1 registros pendentes no M2a2heN =ue ainda n:o +ora1 en<iados para o 5an2o4 Para +inaliCar@ de<e1os a2res2entar os 2o1andos =ue e+eti<a1 o M2a2hed updatesN no 5an2o aps o e?2lus:o de u1 registro no e<ento Delete4
proce"ure 2&rmPro"uto.DeleteH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opDeleteH tr7 D/4ain.Data/et.DeleteH 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH &inall7 Oper/tate #Ol"Oper/tateH en"H en"H

*ra5alhando 2o1 o **a5le


!o1o +oi <isto@ +aCer u1a si1ples tela de 2adastro 2o1 o 2o1ponente ( uer) +oi u1 pou2o tra5alhoso4 O 1es1o n:o a2onte2e 2o1 o 2o1ponente ((able@ =ue poderia +orne2er a 1es1a +un2ionalidade atra<Ds de u1 pro2esso 1uito 1ais si1ples4 Ya1os i1ple1entar ent:o u1a outra tela de 2adastro@ 1as agora utiliCando o 2o1ponente ((able4 Para isso <a1os 2olo2ar u1 2o1ponente ((able no %ata1odule DM)istYendas4

Fig #4%G !o1ponente ((able4

Componente *a5le

Proprie"a"e Na1e Data5aseNa1e *a5leNa1e 72ti<e

;alor *LF DRYEND7) LF *RLE

*a5ela de Propriedades4

Delphi Client/Server

#1

LtiliCare1os este 2o1ponente ((able para a2essar a ta5ela de LF no 5an2o de dados4 Ya1os 1ontar a tela de 1aneira pare2ida 2o1 a =ue 1onta1os para a tela de Produto4

Fig #4$G *ela de LF4

Componente +or1 Panel Panel2 Data)our2e DRNa<igator )ppedRutton )ppedRutton2 )ppedRutton/ )ppedRutton& DREdit 44DREdit2
*a5ela de Propriedades4

Proprie"a"e Na1e !aption !aption !aption Na1e Data)et Data)our2e Na1e Na1e Na1e Na1e Data)our2e DataField

;alor +r1LF LF

D)Main DM)istYendas4*LF D)Main 5tn7ppend 5tnDelete 5tn)a<e 5tnDis2ard D)Main LF[)G44LF[NM

Pode1os i1ple1entar os e<entos OnClic8 dos 5otKes si1ples1ente e?e2utando os respe2ti<os 1Dtodos do %ataSet asso2iado ao %ataSource %S1ain4
proce"ure 2&rm3F.btnAppen"Clic8)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.Appen"H en"H proce"ure 2&rm3F.btnDeleteClic8)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.DeleteH en"H proce"ure 2&rm3F.btn/aveClic8)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.PostH en"H proce"ure 2&rm3F.btnDiscar"Clic8)/en"er 2ObGect*H
Delphi Client/Server #2

begin 2BDEData/et)D/4ain.Data/et*.CancelH en"H

Pode1os agora alterar a tela prin2ipal do proBeto para +r1LF e e?e2utar a apli2a9:o4 Ire1os notar =ue a tela +un2iona de u1a +or1a 5e1 se1elhante H tela de Produto4 Por=ue ent:o i1ple1entar telas 2o1 ( uer)@ se atra<Ds do 2o1ponente ((able D 1uito 1ais si1ples e rApida a 2onstru9:o c 7lD1 da +a2ilidade@ a i1ple1enta9:o atra<Ds do 2o1ponente ((able D 1ais e+i2iente =uando a transa9:o D +inaliCada BA =ue n:o 5us2a todos os registros no 5an2o4 Entretanto@ tere1os =ue optar pela i1ple1enta9:o atra<Ds do ( uer) =uando e?istir u1 nE1ero 1aior de ta5elas en<ol<idas e1 u1a Eni2a tela4 !ada ((able irA e?e2utar u1 2o1ando select@ =ue poderia tal<eC@ ser e?e2utado por u1 Eni2o 2o1ando atra<Ds do 2o1ponente ( uer) 2o1 u1a per+or1an2e 5e1 1elhor4 Outra pe=uena des<antage1 do 2o1ponente ((able D =ue ele ne2essita 5us2ar as in+or1a9Kes de 2atAlogo o =ue +aC de1orar 1ais na pri1eira a5ertura de 2ada ta5ela4 PorD1 2o1 a op9:o EN7RLED )!HEM7 !7!HE do RDE ligada@ esse pro5le1a pode ser 1ini1iCado4

Delphi Client/Server

#3

Filtrando Registros
Esse captulo mostra algumas possibilidades de seleo que podem ser apresentadas ao usu0rio

!ap8tulo

1 apli2a9Kes !liente;)er<idor D 1uito 2o1u1 ha<er ta5elas 2o1 1ilhares e atD 1ilhKes de registros4 )endo assi1@ D pre2iso i1ple1entar 2onsultas de +or1a a n:o traCer todos esses registros desne2essaria1ente para a apli2a9:o4 E1 u1a apli2a9:o e prin2ipal1ente e1 u1a apli2a9:o !liente;)er<idor onde a in+or1a9:o estA lo2aliCada e1 u1 lo2al +8si2o di+erente do apli2ati<o e esse lo2al 2onsegue pro<er u1a inteligIn2ia 2apaC de 1anipular os dados@ de<e'se ter 2o1o regra traCer para apli2a9:o so1ente as in+or1a9Kes real1ente ne2essArias para o usuArio 4 Wual=uer outra in+or1a9:o@ alD1 de poluir a tela@ gera u1 trA+ego adi2ional e desne2essArio na rede4 Muitas <eCes tenta1os adi<inhar a in+or1a9:o =ue o usuArio deseBa ao in<Ds de dei?ar =ue ele 1es1o a pe9a4 7s 1elhores apli2a9Kes !liente;)er<idor s:o a=uelas =ue 2onduCe1 os usuArios atra<Ds das in+or1a9Kes real1ente ne2essArias detalhando'as a 1edida do ne2essArio4 7s duas telas =ue ns 2onstru81os BA 2o1e9a1 ati<as@ ou seBa@ 1ostrando as pri1eiras linhas da ta5ela4 Foi en<iado u1 select para o 5an2o de dados@ algu1as linhas +ora1 traCidas para apli2a9:o atra<Ds da rede e ne1 se=uer sa5e1os se o usuArio as deseBa<a <er4 I1agine =ue a ta5ela de produto possua 2er2a de 4(((4((( de registros traCidos ordenada1ente por no1e4 Na nossa tela de produto@ o pri1eiro registro BA iria apare2er =uando o usuArio a5risse a tela4 Mas se o usuArio deseBasse <er u1 produto =ue 2o1e9asse 2o1 _M\@ serA =ue ele iria =uerer na<egar pelos 5otKes de na<ega9:o atD en2ontrA'loc 7lD1 disso@ de<e'se le15rar =ue =uando se utiliCa o 2o1ponente ( uer) para 2riar o Mresult setN e u1 2o1ando commit D e?e2utado@ todas as linhas restantes do Mresult setN s:o traCidas para apli2a9:o4 I1agine isso 2o1 4(((4((( de registros4 Portanto@ e1 apli2a9Kes !liente;)er<idor@ prin2ipal1ente e1 Mresult setsN =ue retorna1 u1a grande =uantidade de registro@ D 2o1u1 induCir o usuArio a +iltrar seu 2onBunto de registros antes de traCI'los para a apli2a9:o4 E?iste1 <Arias +or1as de se i1ple1entar esse 1e2anis1o na apli2a9:o e a seguir <a1os apresentar alguns deles4

Delphi Client/Server

#4

S ) L

E * + L O R E R

WRE na 1es1a *ela de Manuten9:o


L1a +or1a de i1ple1enta9:o D per1itir o usuArio realiCar u1a pes=uisa atra<Ds dos prprios 2a1pos utiliCados para 1anuten9:o4 !ria'se u1a no<a linha e1 5ran2o e o usuArio atri5ui <alores para os 2a1pos =ue ser:o utiliCados na pes=uisa4 Esse re2urso D 2onhe2ido 2o1o WRE ,WuerX 5X E?e1plo.@ =ue D o pro2esso de 2riar u1 2o1ando )WL dina1i2a1ente atra<Ds de <alores atri5u8dos aos 2a1pos da ta5ela4 )o1ente os 2a1pos =ue possue1 <alores entra1 no +iltro4 Portanto o 2o1ando )WL select te1 =ue ser 1ontado dina1i2a1ente durante a e?e2u9:o da apli2a9:o4 Esse re2urso +orne2e u1a 5oa +le?i5ilidade nas 2onsultas per1itindo o usuArio 2hegar 5e1 pr?i1o do dado antes de utiliCar os re2ursos de na<ega9:o4 Pode1os i1ple1entar esse re2urso na tela de produto4 Para isso <a1os a2res2entar dois 5otKes para per1itir a pes=uisa4 O pri1eiro para 2riar u1a no<a linha e1 5ran2o =ue per1ita o usuArio atri5uir <alores aos 2a1pos4 O segundo para disparar a pes=uisa4 Ya1os ta15D1 desligar a propriedade Active do %ataSet ini2ial1ente nenhu1 registro seBa traCido4 5roduto para =ue

Fig %4 G *ela de Produto4

Componente )ppedRutton )ppedRutton2


*a5ela de Propriedades

Proprie"a"e Na1e Na1e

;alor 5tnNe>For)ear2h 5tn)ear2h

De<e1os ent:o i1ple1entar o e<ento OnClic8 dos 5otKes e as pro2edures da seguinte 1aneiraG
proce"ure 2&rmPro"uto.btnNe9For/earchClic8)/en"er 2ObGect*H begin Ne9For/earchH en"H

Delphi Client/Server

S ) L

E * + L O R E R

proce"ure 2&rmPro"uto.btn/earchClic8)/en"er 2ObGect*H begin /earchH en"H proce"ure 2&rmPro"uto.Ne9For/earchH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opNe9For/earchH tr7 0& Not 2BDEData/et)D/4ain.Data/et*.Active then begin 21uer7)D/4ain.Data/et*./1..2eNt #Cm"/elect % Cm"/electNullH 2BDEData/et)D/4ain.Data/et*.OpenH en"H 2BDEData/et)D/4ain.Data/et*.Appen"H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto./earchClic8H var Ol"Oper/tate 2OPer/tateH s1BE /tringH begin ActiveControl #NilH Ol"Oper/tate #OPer/tateH Oper/tate #op/earchH tr7 s1BE #Buil"1BEH 2BDEData/et)D/4ain.Data/et*.closeH 21uer7)D/4ain.Data/et*./1..2eNt #Cm"/elect% U 9here U % s1BE % Cm"Or"erB7H 2BDEData/et)D/4ain.Data/et*.OpenH &inall7 Oper/tate #Ol"Oper/tateH en"H en"H

7 pro2edure Ne9For0nsert de<e ser alterada para suportar a in2lus:o da linha se o %ataSet esti<er +e2hado4
proce"ure 2&rmPro"uto.Ne9For0nsertH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opNe9For0nsertH tr7 0& Not 2BDEData/et)D/4ain.Data/et*.Active then begin 21uer7)D/4ain.Data/et*./1..2eNt # Cm"/elect % Cm"/electNullH 2BDEData/et)D/4ain.Data/et*.OpenH en"H D/4ain.Data/et.Appen"H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H

De<e1os 2uidar de 1ais alguns detalhes antes de e?e2utar a apli2a9:oG Ya1os a2res2entar duas no<as opera9Kes ao tipo 2Oper/tateG
2OPer/tate#)opNoneRopNe9For0nsertRopDeleteRop/aveRopDiscar"RopNe9For/earchRop/earch*H
Delphi Client/Server #!

S ) L

E * + L O R E R

De<e1os 2riar 1ais trIs <ariA<eis na se9:o private do form para 2ontrolar o 2o1ando selectG
. . private P Private "eclarations Q Cm"/elect /tringH Cm"Or"erB7 /tringH Cm"/electNull /tringH public P Public "eclarations Q . .

Ya1os ta15D1 alterar a propriedade /1. do or"er b7G


Componente WProduto
*a5ela de Propriedades

5roduto tirando a 2lAusula

Proprie"a"e 72ti<e )WL

;alor False sele2t ] +ro1 Produto

Ya1os a2res2entar a ini2ialiCa9:o das <ariA<eis no e<ento OnCreate do $orm e retornar o <alor da propriedade /1. do 5roduto para o <alor original no e<ento OnDestro74
proce"ure 2&rmPro"uto.FormCreate)/en"er 2ObGect*H begin Oper/tate #opNoneH Cm"/elect #21uer7)D/4ain.Data/et*./1..2eNtH Cm"Or"erB7 #U or"er b7 pro<c"UH Cm"/electNull #U 9here pro<c" is null UH en"H

proce"ure 2&rmPro"uto.FormDestro7)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.closeH 21uer7)D/4ain.Data/et*./1..2eNt #Cm"/electH en"H

Final1ente@ te1os =ue i1ple1entar a +un9:o Buil"1BE4 Futura1ente@ de<e'se tra5alhar 1elhor essa +un9:o para suportar 2a1pos MdatasN e tratar os 2a1pos 2al2ulados e MlooQupsN do %ataSet4
&unction 2&rmPro"uto.Buil"1BE /tringH var sep stringH G integerH begin /ep #UUH For G #V to D/4ain.Data/et.Fiel"Count$B "o 0& )D/4ain.Data/et.Fiel"sSGT.As/tring W= UU* then begin 0& D/4ain.Data/et.Fiel"sSGT.Data27pe # &t/tring then Result # Format)UXs Xs )Xs li8e UUXsXsUU*UR SResultR /epR D/4ain.Data/et.Fiel"sSGT.Fiel"NameR
Delphi Client/Server #"

S ) L

E * + L O R E R

D/4ain.Data/et.Fiel"sSGT.As/tringRUXUT* else Result # Format)UXs Xs )Xs # Xs*UR SResultR/epR D/4ain.Data/et.Fiel"sSGT.Fiel"NameR D/4ain.Data/et.Fiel"sSGT.As/tringT*H /ep #UAn"UH en"H en"H

7ntes ainda de e?e2utar@ <a1os aBustar a a5ertura dos forms no ProGect-Options4 De<e'se alterar o 4ain Form no<a1ente para _+r1Produto\ e arrastar o _DMsistYendas\ para o topo da lista dos 7uto'!reate para =ue ele seBa o pri1eiro a ser 2riado4

Fig %42G ProBe2t;Options4

!ontrolando os Estados da *ela


Para +inaliCar a tela de produtos@ de<e'se utiliCar os estados da tela para 2ontrolar a ha5ilita9:o dos 5otKes de edi9:o4 O 2o1ponente uer) do Delphi BA possui interna1ente u1a 1A=uina de estado 2ontrolada atra<Ds do atri5uto state@ onde os prin2ipais estados s:oG dsIna2ti<e@ dsRro>se@ dsEdit e dsInsert4

Delphi Client/Server

##

S ) L

E * + L O R E R

ds+na tive

ds+nsert

dsBroIse

dsEdit
FigG %4/G Estados do Data)et4

Entretanto esses estados n:o s:o su+i2ientes para representar a tela de produto4 O ne2essAria a in2lus:o de u1 no<o estado na 1A=uina de estados@ +i2ando da seguinte +or1aG

ds+na tive

dsFeI7or +nsert

dsBroIse

dsFeI7or Sear 9

dsEdit
Fig %4&G No<a 1A=uina de estados4

E1 nosso e?e1plo@ pode1os 2riar a 1A=uina de estado no prprio form atra<Ds da de2lara9:o de u1 tipo e u1a <ariA<el4
2Recor"/tate#)r"0nactiveRr"Ne9For/earchRr"Ne9For0nsertRr"Bro9seRr"E"it*H public P Public "eclarations Q Oper/tate 2Oper/tateH Recor"/tate 2Recor"/tateH &unction Buil"1BE /tringH proce"ure /aveH proce"ure Ne9For0nsertH proce"ure DeleteH proce"ure Discar"H proce"ure Ne9For/earchH
Delphi Client/Server #$

S ) L

E * + L O R E R

proce"ure /earchH proce"ure /etRecor"/tate);alue 2Recor"/tate*H en"H

7lD1 disso@ u1a sDrie de 1odi+i2a9Kes nos e<entos de<e1 ser +eitas e o 2digo 2o1pleto e +inal da tela de produto D apresentado a5ai?o4 Pode'se +a2il1ente trans+or1ar a tela de Produtos e1 u1 M*e1plateN e adi2ionar no repositrio de o5Betos do Delphi4 Pode'se +aCer 2o1o e?er282io@ a tela de 2idades utiliCando'se o Mte1plateN 2onstru8do4 7s Eni2as dependIn2ias da tela 2o1 a ta5ela de PRODL*O s:o as <ariA<eisG Cm"Or"erB7 e Cm"/electNull4 Essas <ariA<eis pre2isa1 ent:o ser rede+inidas no e<ento OnCreate do $orm =ue herdar do Mte1plateN original4
unit pro"utoH inter&ace uses Min"o9sR 4essagesR /7s3tilsR ClassesR GraphicsR ControlsR FormsR DialogsR DbR ENtCtrlsR /t"CtrlsR 4as8R DBCtrlsR ButtonsH t7pe 2Oper/tate#)opNoneRopNe9For0nsertRopDeleteRop/aveRopDiscar"RopNe9For/earchRop/earch*H 2Recor"/tate#)r"0nactiveRr"Ne9For/earchRr"Ne9For0nsertRr"Bro9seRr"E"it*H 2&rmPro"uto # class)2Form* PanelB 2PanelH PanelC 2PanelH D/4ain 2Data/ourceH DBNavigatorB 2DBNavigatorH .abelB 2.abelH DBE"itB 2DBE"itH .abelC 2.abelH DBE"itC 2DBE"itH .abelD 2.abelH DBE"itD 2DBE"itH .abelE 2.abelH DBE"itE 2DBE"itH btnAppen" 2/pee"ButtonH btnDelete 2/pee"ButtonH btn/ave 2/pee"ButtonH btnDiscar" 2/pee"ButtonH btnNe9For/earch 2/pee"ButtonH btn/earch 2/pee"ButtonH proce"ure btnAppen"Clic8)/en"er 2ObGect*H proce"ure btnDeleteClic8)/en"er 2ObGect*H proce"ure btn/aveClic8)/en"er 2ObGect*H proce"ure btnDiscar"Clic8)/en"er 2ObGect*H proce"ure D/4ain3p"ateData)/en"er 2ObGect*H proce"ure FormCreate)/en"er 2ObGect*H proce"ure btnNe9For/earchClic8)/en"er 2ObGect*H proce"ure FormDestro7)/en"er 2ObGect*H proce"ure btn/earchClic8)/en"er 2ObGect*H proce"ure D/4ain/tateChange)/en"er 2ObGect*H private P Private "eclarations Q Cm"/elect /tringH public P Public "eclarations Q Cm"Or"erB7 /tringH Cm"/electNull /tringH Oper/tate 2Oper/tateH Recor"/tate 2Recor"/tateH
Delphi Client/Server $%

S ) L

E * + L O R E R

&unction Buil"1BE /tringH proce"ure /aveH proce"ure Ne9For0nsertH proce"ure DeleteH proce"ure Discar"H proce"ure Ne9For/earchH proce"ure /earchH proce"ure /etRecor"/tate);alue 2Recor"/tate*H en"H var &rmPro"uto 2&rmPro"utoH implementation uses DmVBR "btablesH PYR *.DF4Q proce"ure 2&rmPro"uto.FormCreate)/en"er 2ObGect*H begin Oper/tate #opNoneH /etRecor"/tate)r"0nactive*H Cm"/elect #21uer7)D/4ain.Data/et*./1..2eNtH Cm"Or"erB7 #U or"er b7 pro<c"UH Cm"/electNull #U 9here pro<c" is nullUH en"H proce"ure 2&rmPro"uto.btnAppen"Clic8)/en"er 2ObGect*H begin Ne9For0nsertH en"H proce"ure 2&rmPro"uto.btnDeleteClic8)/en"er 2ObGect*H begin DeleteH en"H proce"ure 2&rmPro"uto.btn/aveClic8)/en"er 2ObGect*H begin /aveH en"H proce"ure 2&rmPro"uto.btnDiscar"Clic8)/en"er 2ObGect*H begin Discar"H en"H proce"ure 2&rmPro"uto.btnNe9For/earchClic8)/en"er 2ObGect*H begin Ne9For/earchH en"H proce"ure 2&rmPro"uto.btn/earchClic8)/en"er 2ObGect*H begin /earchH en"H proce"ure 2&rmPro"uto.Ne9For0nsertH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opNe9For0nsertH tr7 0& Not 2BDEData/et)D/4ain.Data/et*.Active then begin 21uer7)D/4ain.Data/et*./1..2eNt # Cm"/elect % Cm"/electNullH 2BDEData/et)D/4ain.Data/et*.OpenH en"H
Delphi Client/Server $1

S ) L

E * + L O R E R

D/4ain.Data/et.Appen"H /etRecor"/tate)r"Ne9For0nsert*H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto.DeleteH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opDeleteH tr7 D/4ain.Data/et.DeleteH 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH 0& 2BDEData/et)D/4ain.Data/et*.0sEmpt7 then begin 2BDEData/et)D/4ain.Data/et*.closeH /etRecor"/tate)r"0nactive*H en" else /etRecor"/tate)r"Bro9se*H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto./aveH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #op/aveH tr7 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH /etRecor"/tate)r"Bro9se*H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto.Discar"H var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opDiscar"H tr7 0& 2BDEData/et)D/4ain.Data/et*.3p"atesPen"ing then 2BDEData/et)D/4ain.Data/et*.Cancel3p"ates else 2BDEData/et)D/4ain.Data/et*.CancelH 0& 2BDEData/et)D/4ain.Data/et*.0sEmpt7 then begin 2BDEData/et)D/4ain.Data/et*.closeH /etRecor"/tate)r"0nactive*H en" else /etRecor"/tate)r"Bro9se*H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto.Ne9For/earchH var Ol"Oper/tate 2OPer/tateH begin Ol"Oper/tate #OPer/tateH Oper/tate #opNe9For/earchH tr7 0& Not 2BDEData/et)D/4ain.Data/et*.Active then begin 21uer7)D/4ain.Data/et*./1..2eNt # Cm"/elect % Cm"/electNullH
Delphi Client/Server $2

S ) L

E * + L O R E R

2BDEData/et)D/4ain.Data/et*.OpenH en"H 2BDEData/et)D/4ain.Data/et*.Appen"H /etRecor"/tate)r"Ne9For/earch*H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto.FormDestro7)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.closeH 21uer7)D/4ain.Data/et*./1..2eNt #Cm"/electH en"H proce"ure 2&rmPro"uto./earchH var Ol"Oper/tate 2OPer/tateH s1BE /tringH begin ActiveControl #NilH Ol"Oper/tate #OPer/tateH Oper/tate #op/earchH tr7 s1BE #Buil"1BEH 2BDEData/et)D/4ain.Data/et*.closeH 21uer7)D/4ain.Data/et*./1..2eNt # Cm"/electH 0& s1BE W= UU then 21uer7)D/4ain.Data/et*./1..2eNt # 21uer7)D/4ain.Data/et*./1..2eNt %U 9here U % s1BEH 21uer7)D/4ain.Data/et*./1..2eNt #21uer7)D/4ain.Data/et*./1..2eNt % Cm"Or"erB7H 2BDEData/et)D/4ain.Data/et*.OpenH 0& 2BDEData/et)D/4ain.Data/et*.0sEmpt7 then /etRecor"/tate)r"Ne9For/earch* else /etRecor"/tate)r"Bro9se*H &inall7 Oper/tate #Ol"Oper/tateH en"H en"H proce"ure 2&rmPro"uto.D/4ain3p"ateData)/en"er 2ObGect*H var ret integerH begin 0& Oper/tate # opNone then begin 0& Recor"/tate # r"Ne9For/earch then Discar" else begin ret #Application.4essageBoN)UDeseGa salvar as altera@AesUR UCon&irma@+oUR 4B<5E/NOCANCE. % 4B<0CON13E/20ON *H case ret o& i"5es /aveH i"No Discar"H i"Cancel AbortH en"H en"H en"H en"H proce"ure 2&rmPro"uto.D/4ain/tateChange)/en"er 2ObGect*H begin 0& D/4ain./tate#"sE"it then /etRecor"/tate)r"E"it*H en"H &unction 2&rmPro"uto.Buil"1BE /tringH var sep stringH G integerH
Delphi Client/Server $3

S ) L

E * + L O R E R

begin /ep #UUH For G #V to D/4ain.Data/et.Fiel"Count$B "o 0& )D/4ain.Data/et.Fiel"sSGT.As/tring W= UU* then begin 0& D/4ain.Data/et.Fiel"sSGT.Data27pe # &t/tring then Result # Format)UXs Xs )Xs li8e UUXsXsUU*UR SResultR/epRD/4ain.Data/et.Fiel"sSGT.Fiel"NameR D/4ain.Data/et.Fiel"sSGT.As/tringRUXUT* else Result # Format)UXs Xs )Xs # Xs*UR SResultR/epRD/4ain.Data/et.Fiel"sSGT.Fiel"NameR D/4ain.Data/et.Fiel"sSGT.As/tringT*H /ep #UAn"UH en"H en"H proce"ure 2&rmPro"uto./etRecor"/tate);alue 2Recor"/tate*H begin Recor"/tate #;alueH Case Recor"/tate o& r"0nactive begin btnNe9For/earch.Enable" #2R3EH btnAppen".Enable" #2R3EH btn/earch.Enable" #FA./EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btnDelete.Enable" #FA./EH en"H r"Ne9For/earch begin btnNe9For/earch.Enable" #FA./EH btnAppen".Enable" #FA./EH btn/earch.Enable" #2R3EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #2R3EH btnDelete.Enable" #FA./EH en"H r"Ne9For0nsert begin btnNe9For/earch.Enable" #FA./EH btnAppen".Enable" #FA./EH btn/earch.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btnDelete.Enable" #FA./EH en"H r"Bro9se begin btnNe9For/earch.Enable" #2R3EH btnAppen".Enable" #2R3EH btn/earch.Enable" #FA./EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btnDelete.Enable" #2R3EH en"H r"E"it begin btnNe9For/earch.Enable" #FA./EH btnAppen".Enable" #FA./EH btn/earch.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btnDelete.Enable" #FA./EH en"H en"H en"H
Delphi Client/Server $4

S ) L

E * + L O R E R

en".

*ela de !onsulta Espe28+i2a


L1a outra +or1a de +iltrar a pes=uisa =ue serA +eita no 5an2o de dados para 5us2ar o registro =ue o usuArio deseBa@ D 2riar u1a tela de 2onsulta separada da tela de 1anuten9:o4 !o1 isso a tela de 1anuten9:o n:o pre2isa 2onter ele1entos de na<ega9:o@ BA =ue pode tra5alhar 2o1 apenas u1 registro de 2ada <eC4 O usuArio utiliCa a tela de 2onsulta para +iltrar@ pes=uisar e sele2ionar o registro deseBado =ue D trans+erido para a tela de 1anuten9:o@ onde nor1al1ente in+or1a9Kes 1ais detalhadas s:o apresentadas@ per1itindo ao usuArio realiCar as 1anuten9Kes ne2essArias so5re esse registro4 !o1 esse tipo de padr:o de 2adastro D poss8<el ta15D1@ +aCer u1 1elhor 5alan2ea1ento entre os dados ne2essArios para 2onsulta e os dados ne2essArios para a 1anuten9:o@ BA =ue estes est:o e1 telas di+erentes4 Para dis2utir esses 2on2eitos@ <a1os i1ple1entar a tela de 2liente na apli2a9:o e?e1plo4 *ela de !onsulta Na tela de 2onsulta e?plora'se a ta5ela ou as ta5elas en<ol<idas@ no sentido <erti2al@ ou seBa@ u1 nE1ero 1aior de registros de<e1 ser traCidos para apli2a9:o para per1itir =ue o usuArio +a9a a es2olha na<egando entre eles4 Entretanto@ a sele9:o pode ser reduCida horiContal1ente@ BA =ue a es2olha do usuArio pode ser +eita e?i5indo'se u1 nE1ero pe=ueno de 2olunas@ e 2onse=Uente1ente de ta5elas@ =ue o au?ilie1 na sele9:o4 Para isso D pre2iso apli2ar o seguinte 2on2eitoG in+or1a9Kes de ta5elas rela2ionadas H ta5ela prin2ipal n:o de<e1 parti2ipar da sele9:o e si1 dos +iltros4 Por e?e1plo@ se o usuArio ne2essitar es2olher 2lientes de u1a deter1inada 2idade@ ao in<Ds de 1ostrar na 2onsulta as 2idades =ue o 2liente perten2e@ +a9a'o in+or1ar antes da 2onsulta a 2idade da =ual os 2lientes ele deseBa4 7tra<Ds dessa tD2ni2a@ eli1ina' se o nE1ero de ta5elas ne2essArias na 2lAusula &rom@ tornando o 2o1ando select 5e1 1ais e+i2iente 2o1 o 1es1o resultado para o usuArio =ue deseBa<a sele2ionar u1 2liente de u1a deter1inada 2idade4 Ire1os e1 nosso e?e1plo 2onstruir u1a tela de 2onsulta espe28+i2a para sele2ionar1os o 2liente4 7ntes porD1@ ire1os 2riar alguns 2o1ponentes %ataSets no %ata1odule4

Fig %45G DataModule DM)istYendas

Delphi Client/Server

S ) L

E * + L O R E R

Componente WuerX

Proprie"a"e Na1e Data5aseNa1e )WL

;alor W!ons!liente DRYEND7)


)ELE!* PE))O74PE)[!D @ PE))O74PE)[NM @ PE))O74PE)[*P @ PE))O74PE)[!G!!PF FROM !LIEN*E !LIEN*E @ PE))O7 PE))O7 WHERE , !LIEN*E4PE)[!D ^ PE))O74PE)[!D . ORDER Ra PE))O74PE)[NM

*a5le

WuerX2

Na1e Data5aseNa1e *a5leNa1e Na1e Data5aseNa1e )WL Para1s

*!ons!liLF DRYEND7) LF W!ons!li!idade DRYEND7)


)ELE!* ] FROM !ID7DE WHERE LF[)G ^ GLF[)G

LF[)G d )tring

*a5ela de Propriedades

7 +igura a seguir 1ostra a tela de 2onsulta de 2lientes4 Note =ue s:o 2olo2ados na parte de 2i1a da tela 2o1ponentes (Edit para =ue o usuArio possa +aCer a pes=uisa antes de traCer os dados para tela4 Nessa sele9:o@ en2ontra1'se os 2a1pos LF e !ID7DE =ue representa1 o rela2iona1ento da ta5ela prin2ipal PE))O7 2o1 as ta5elas LF e !ID7DE4 Portanto estas ta5elas ser:o utiliCadas para per1itir o usuArio +aCer o +iltro@ 1as n:o entra1 no select prin2ipal da tela4

Fig %4-G *ela de !onsulta de !lientes4

Componente +or1 Panel La5el


Delphi Client/Server

Proprie"a"e Na1e !aption 7lign !aption


$!

;alor +r1!ons!liente !lientes al*op !digo

S ) L

E * + L O R E R

La5el2 La5el/ La5el& Edit Edit2 Edit/ Edit& Rutton 5utton2 Data)our2e Data)our2e2 Data)our2e/ Panel2 D5Grid Panel/ Rit5tn Rit5tn2
*a5ela de Propriedades

!aption !aption !aption Na1e Na1e Na1e Na1e Na1e !aption Na1e !aption Na1e Data)et Na1e Data)et Na1e Data)et 7lign Data)our2e 7lign bind bind

No1e LF !idade edt!odigo edtNo1e edtLF edt!idade 5tnPes=uisa Pes=uisa 5tnNo<o No<o D)Main DM)istYendas4W!ons!liente D)LF DM)istYendas4*!ons!liLF D)!idade DM)istYendas4W!ons!li!idade al!lient D)Main alRotto1 5QOQ 5Q!an2el

Para o usuArio poder sele2ionar u1a 2idade e ou u1a LF utiliCare1os u1 Grid =ue serA e?i5ido =uando ele posi2ionar no 2a1po de LF ou de !idade4

Fig %4-G Grid para per1itir a sele9:o de u1 LF pelo usuArio4

Para +aCer1os essa 2onsulta@ ire1os 2riar u1a tela 2o1 u1 Grid dentro 2o1o 1ostrado na +igura seguinteG

Delphi Client/Server

$"

S ) L

E * + L O R E R

Fig %4#G Grid para 2onsulta4

Componente For1 DRGrid


*a5ela de Propriedades

Proprie"a"e Na1e Rorder)Xle 7lign Options

;alor +r1Grid 5sNone al!lient edg*itles@ dg!olu1nResiCe@ dg!olLines@ dg*a5s@ dgRo>)ele2t@ dg!on+ir1Delete@ dg!an2elOnE?itf

De<e1os i1ple1entar ta15D1 os seguintes e<entosG


proce"ure 2&rmGri".DBGri"B6e7Press)/en"er 2ObGectH var 6e7 Char*H begin 0& 6e7 # ZBD then begin 4o"alResult #mrO8H en" else i& 8e7 # ZC[ then begin 4o"alResult #mrCancelH en"H en"H proce"ure 2&rmGri".FormClose)/en"er 2ObGectH var Action 2CloseAction*H begin Action #caFreeH en"H proce"ure 2&rmGri".DBGri"BDblClic8)/en"er 2ObGect*H begin 4o"alResult #mrO8H en"H proce"ure 2&rmGri".Form/ho9)/en"er 2ObGect*H var pB 2PointH begin PB.N #2Form)O9ner*.ActiveControl..e&tH PB.7 #)2Form)O9ner*.ActiveControl.2op % 2Form)O9ner*.ActiveControl.:eight*H PB #2Control)2Form)O9ner*.ActiveControl.Parent*.Client2o/creen)PB*H 0& )PB.7 % BFV* = /creen.:eight then PB.7 #PB.7 $ BFV $ 2Form)O9ner*.ActiveControl.:eightH /etBoun"s)PB.NRPB.7RCFVRBFV*H en"H

7 i1ple1enta9:o do e<ento Form/ho9 +aC 2o1 =ue a $orm seBa a5erta e?ata1ente e15ai?o dos 2o1ponentes edits da tela de 2onsulta4 O 2digo da tela de 2onsulta +i2a ent:o da seguinte +or1aG
unit consclienteH
Delphi Client/Server $#

S ) L

E * + L O R E R

inter&ace uses Min"o9sR 4essagesR /7s3tilsR ClassesR GraphicsR ControlsR FormsR DialogsR DbR ButtonsR /t"CtrlsR Gri"sR DBGri"sR ENtCtrlsR DBCtrlsH t7pe 2&rmConsCliente # class)2Form* PanelB 2PanelH PanelC 2PanelH DBGri"B 2DBGri"H e"tCo"igo 2E"itH .abelB 2.abelH .abelC 2.abelH e"tNome 2E"itH btnPes(uisa 2ButtonH PanelD 2PanelH BitBtnB 2BitBtnH BitBtnC 2BitBtnH D/4ain 2Data/ourceH btnNovo 2ButtonH D/3F 2Data/ourceH D/Ci"a"e 2Data/ourceH e"t3F 2E"itH e"tCi"a"e 2E"itH .abelD 2.abelH .abelE 2.abelH proce"ure btnNovoClic8)/en"er 2ObGect*H proce"ure btnPes(uisaClic8)/en"er 2ObGect*H proce"ure FormCreate)/en"er 2ObGect*H proce"ure FormDestro7)/en"er 2ObGect*H proce"ure e"t3FEnter)/en"er 2ObGect*H proce"ure e"tCi"a"eEnter)/en"er 2ObGect*H private P Private "eclarations Q Cm"/elect /tringH public P Public "eclarations Q sCo"Ci"a"e /tringH en"H var &rmConsCliente 2&rmConsClienteH implementation uses DmVBR "btablesR ConsGri"H PYR *.DF4Q proce"ure 2&rmConsCliente.btnNovoClic8)/en"er 2ObGect*H begin e"tCo"igo.ClearH e"tNome.ClearH e"t3F.ClearH e"tCi"a"e.ClearH en"H proce"ure 2&rmConsCliente.btnPes(uisaClic8)/en"er 2ObGect*H var sMhereRs/electRsep stringH nPosOr"erB7 integerH begin 21uer7)D/4ain.Data/et*.CloseH /ep #UUH sMhere #U An" UH
Delphi Client/Server $$

S ) L

E * + L O R E R

s/elect #Cm"/electH 0& )e"tCo"igo.2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs # Xs*URSsMhereR/epRUPE/<CDURe"tCo"igo.2eNtT*H /ep #UAn"UH en"H 0& )e"tNome.2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs li8e UUXsXsUU* UR SsMhereR/epRUPE/<N4URe"tNome.2eNtRUXUT*H /ep #UAn"UH en"H 0& )e"t3F.2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs # UUXsUU* URSsMhereR/epRU3F</GURe"t3F.2eNtT*H /ep #UAn"UH en"H 0& )e"tCi"a"e.2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs # Xs* URSsMhereR/epRUC0D<CDURsCo"Ci"a"eT*H /ep #UAn"UH en"H 0& /ep W= UU then begin nPosOr"erB7 #Pos)UORDER B5UR 3pperCase)s/elect**H i& nPosOr"erB7 # V then s/elect #s/elect % sMhere else 0nsert)sMhereRs/electRnPosOr"erB7*H en"H 21uer7)D/4ain.Data/et*./1..2eNt #s/electH 21uer7)D/4ain.Data/et*.OpenH en"H proce"ure 2&rmConsCliente.FormCreate)/en"er 2ObGect*H begin Cm"/elect #21uer7)D/4ain.Data/et*./1..2ENtH D/3F.Data/et.OpenH en"H proce"ure 2&rmConsCliente.FormDestro7)/en"er 2ObGect*H begin D/3F.Data/et.CloseH D/Ci"a"e.Data/et.closeH 21uer7)D/4ain.Data/et*./1..2ENt #Cm"/electH en"H proce"ure 2&rmConsCliente.e"t3FEnter)/en"er 2ObGect*H begin &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/3FH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/3F.Data/et.0sEmpt7* then begin 2E"it)/en"er*.2eNt #D/3F.Data/etSU3F</GUTH e"tCi"a"e.ClearH en"H en"H proce"ure 2&rmConsCliente.e"tCi"a"eEnter)/en"er 2ObGect*H begin D/Ci"a"e.Data/et.CloseH 21uer7)D/Ci"a"e.Data/et*.ParamsSVT.value #e"t3F.2eNtH D/Ci"a"e.Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/Ci"a"eH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/Ci"a"e.Data/et.0sEmpt7* then begin
Delphi Client/Server 1%%

S ) L

E * + L O R E R

2E"it)/en"er*.2eNt #D/Ci"a"e.Data/etSUC0D<N4UTH sCo"Ci"a"e #D/Ci"a"e.Data/et.Fiel"B7Name)UC0D<CDU*.As/tringH en"H en"H en".

*ela de Manuten9:o !o1o so1ente u1 registro D traCido na tela de 1anuten9:o@ pode'se e?plorar 1ais o sentido horiContal@ traCendo in+or1a9Kes 1ais detalhadas4 PorD1@ respeitando ainda a regra de n:o traCer in+or1a9Kes ainda n:o re=uisitadas pelo usuArio4 Por e?e1plo@ pode ser =ue a tela da 1anuten9:o apresente'se di<idida e1 M+i2hasN ou MpAginaN4 )e a in+or1a9:o de u1a pAgina te1 =ue a2essar u1a outra ta5ela =ue n:o seBa a ta5ela prin2ipal@ pode'se esperar o usuArio sele2ionar a pAgina para ent:o 5us2ar essas in+or1a9Kes no 5an2o de dados4 Para i1ple1entar1os a tela de 1anuten9:o de 2lientes@ de<e1os pri1eiro 2riar o %ataSet responsA<el pela 5us2a dos dados no 5an2o4 LtiliCare1os u1 2o1ponente ( uer) 2o1 u1 2o1ando )WL sele2ionando dados de =uatro ta5elas do 5an2o de dadosG PE))O7@ !LIEN*E@ !ID7DE@ LF4 7lD1 disso serA +eito u1 +iltro pelo 2digo da pessoa para =ue seBa sele2ionado apenas u1 registro no 5an2o de dados4 Desta +or1a reduCire1os o nE1ero de linhas e au1entare1os a =uantidade de in+or1a9Kes so5re u1 deter1inado 2liente4

Fig %4%G Data Module4

Componente WuerX

Proprie"a"e Na1e Data5aseNa1e !a2hedLpdate LpdateO5Be2t )WL

;alor W2liente DRYEND7) *RLE L)Pessoa


)ELE!* PE))O74PE)[!D@ PE))O74PE)[NM@ PE))O74PE)[*P @ PE))O74PE)[!G!!PF @ PE))O74PE)[LOGR7DOLRO @ PE))O74PE)[NLMERO @ PE))O74PE)[!OMPLEMEN*O @ PE))O74PE)[R7IRRO @ PE))O74!ID[!D @ PE))O74LF[)G @ PE))O74PE)[D*[N7)! @ PE))O74!ID[!D[N7)! @ PE))O74LF[)G[N7)! @ !LIEN*E4!LI[LIMI*E!REDI*O @ 1%1

Delphi Client/Server

S ) L

E * + L O R E R

!LIEN*E4!LI[DERI*O @ !ID7DE4!ID[NM @ LF4LF[NM FROM PE))O7 PE))O7@ !LIEN*E !LIEN*E@ !ID7DE !ID7DE@ LF LF WHERE PE))O74PE)[!D ^ !LIEN*E4PE)[!D 7ND PE))O74!ID[!D ^ !ID7DE4!ID[!D 7ND PE))O74LF[)G ^ !ID7DE4LF[)G 7ND !ID7DE4LF[)G ^ LF4LF[)G 7ND PE))O74PE)[!D^ GPE)[!D ORDER Ra PE))O74PE)[NM

Lpdate)WL
*a5ela de Propriedades

Para1s Na1e *a5leNa1e

PE)[!D d Integer L)Pessoa PE))O7

Pode1os agora@ 2onstruir a tela de 1anuten9:o 2o1o 1ostra as +iguras seguintesG

Fig %4$G *ela de Manuten9:o de !lientes ,PAg .4

Delphi Client/Server

1%2

S ) L

E * + L O R E R

Fig %4 (G *ela de Manuten9:o de !lientes ,PAg 2.4

Fig %4 G *ela de Manuten9:o de !lientes ,PAg /.4

Componente For1 Panel )peedRutton )peedRutton2 )peedRutton/ )peedRutton& )peedRutton5 Page!ontrol


Delphi Client/Server

Proprie"a"e Na1e !aption 7lign Na1e Na1e Na1e Na1e Na1e 7lign
1%3

;alor +r1!liente !lientes al*op 5tn7ppend 5tnDelete 5tn)a<e 5tnDis2ard 5tn)ear2h al!lient

S ) L

E * + L O R E R

*a5)heet *a5)heet2 *a5)heet/ Data)our2e DR!ontrols


*a5ela de Propriedades

!aption !aption !aption Na1e Data)et 44444

In+or1a9Kes Gerais Pessoa F8si2a !rDditos D)Main DM)istYendas4W2liente 44444

Os e<entos dos 5otKes de edi9:o ser:o de+inidos de 1aneira si1ilar ao padr:o utiliCado pela tela de produto@ +i2ando 2ada u1 da seguinte +or1aG
proce"ure 2&rmCliente.btnAppen"Clic8)/en"er 2ObGect*H begin 0& Not D/4ain.Data/et.Active then begin D/4ain.Data/et.OpenH en"H D/4ain.Data/et.Appen"H en"H proce"ure 2&rmCliente.btnDeleteClic8)/en"er 2ObGect*H begin D/4ain.Data/et.DeleteH 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH D/4ain.Data/et.closeH en"H proce"ure 2&rmCliente.btn/aveClic8)/en"er 2ObGect*H begin 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH en"H proce"ure 2&rmCliente.btnDiscar"Clic8)/en"er 2ObGect*H begin 0& 2BDEData/et)D/4ain.Data/et*.3p"atesPen"ing then 2BDEData/et)D/4ain.Data/et*.Cancel3p"ates else 2BDEData/et)D/4ain.Data/et*.CancelH 0& 2BDEData/et)D/4ain.Data/et*.0sEmpt7 then begin 2BDEData/et)D/4ain.Data/et*.closeH en"H en"H

O 5ot:o de MPes=uisaN irA 2ha1ar a tela de 2onsulta de 2lientes para =ue o usuArio possa es2olher u1 deter1inado 2liente para tra5alhar4 Depois de es2olhido@ in+or1a9Kes 1ais detalhadas desse 2liente s:o traCidas para a tela de 1anuten9:o para =ue possa1 ser <isualiCadas e editadas pelo usuArio4
proce"ure 2&rmCliente.btn/earchClic8)/en"er 2ObGect*H begin D/4ain.Data/et.CloseH &rmConsCliente #2&rmConsCliente.Create)/el&*H 0& )&rmConsCliente./ho94o"al#mrO8* an" )Not )&rmConsCliente.D/4ain.Data/etSUPE/<CDUT # Null** then begin 21uer7)D/4ain.Data/et*.ParamsSVT.value # &rmConsCliente.D/4ain.Data/etSUPE/<CDUTH D/4ain.Data/et.OpenH en"H &rmConsCliente.&reeH en"H
Delphi Client/Server 1%4

S ) L

E * + L O R E R

Pode1os utiliCar a prpria 1A=uina de estado do %ataSource +orne2ida pelo Delphi para 2ontrolar a ha5ilita9:o dos 5otKesG
proce"ure 2&rmCliente.D/4ain/tateChange)/en"er 2ObGect*H begin Case D/4ain./tate o& "s0nactive begin btnAppen".Enable" #2R3EH btnDelete.Enable" #FA./EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btn/earch.Enable" #2R3EH en"H "s0nsert begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en"H "sE"it begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en"H "sBro9se begin btnAppen".Enable" #2R3EH btnDelete.Enable" #2R3EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btn/earch.Enable" #2R3EH en"H en"H en"H

Para +inaliCar de<e1os +e2har o %ataSet antes de sair1os da tela de 1anuten9:o@ i1ple1entando o e<ento OnClose da seguinte +or1aG
proce"ure 2&rmCliente.FormClose)/en"er 2ObGectH var Action 2CloseAction*H begin D/4ain.Data/et.CloseH en"H

Re2ursos de LooQLp E?iste1 <Arias +or1as de +orne2er para o usuArio u1a pes=uisa e1 registros de ta5elas se2undArias rela2ionadas 2o1 a ta5ela prin2ipal4 Esse re2urso@ 1uitas <eCes 2ha1ado de MlooQupN de<e pro<er i1ple1enta9Kes para as trIs +ases seguintesG Preen2her e e?i5ir u1a lista ou ta5ela de registros para per1itir a es2olha do usuArioZ
Delphi Client/Server 1%

S ) L

E * + L O R E R

7o se es2olher u1 registro@ de<e'se atualiCar o 2digo rela2ionado na ta5ela prin2ipalZ Wuando +or sele2ionado u1 registro na ta5ela prin2ipal@ de<e'se sele2ionar o registro 2orrespondente na ta5ela se2undAria@ per1itindo a e?i5i9:o de alguns 2a1pos 2o1o a des2ri9:o4
!a1po LooQLp do Delphi

O Delphi per1ite a 2ria9:o de 2a1pos MlooQup\sN dentro de u1 dataset para apresentar u1a lista 2o1 os registros de u1a outra ta5ela rela2ionada4 Esse re2urso i1ple1enta as trIs +ases dis2utidas a2i1a da seguinte +or1aG Fase 4 7 lista D preen2hida atra<Ds de u1 %ataSet =ue sele2iona os registros da ta5ela rela2ionada4 O utiliCado 2o1ponentes combo bo" ou list bo" para apresentar a lista4 Wuando utiliCado combo bo"@ a parte edit n:o D ha5ilitada para edi9:o@ +or9ando o usuArio a real1ente es2olher u1 ele1ento <Alido da lista4 !o1o D utiliCado u1 2o1ponente %ataSet para pro<er a sele9:o@ D poss8<el atri5uir +iltros ao Mresult setN@ desde =ue n:o in<ia5iliCe a +ase /4 Wuando o re2urso D i1ple1entado direta1ente atra<Ds dos 2o1ponentes ,2o15o 5o? e list 5o?. per1ite =ue o usuArio <isualiCe 1ais de u1 2a1po ao 1es1o te1po para sele9:o4 Para se a5rir a lista de op9Kes D ne2essArio o5<ia1ente =ue o %ataSet esteBa a5erto4 Fase 24 Wuando D sele2ionado u1 registro da lista@ auto1ati2a1ente D +eita a atualiCa9:o do 2a1po da ta5ela prin2ipal rela2ionado 2o1 a 2ha<e pri1Aria da ta5ela utiliCada para sele9:o4 Fase /4 N:o D ne2essAria a parti2ipa9:o da des2ri9:o ou de =ual=uer outro 2a1po =ue se deseBe <isualiCar da ta5ela se2undAria no 2o1ando select da ta5ela prin2ipal4 Wuando o 2a1po ,2ha<e estrangeira. da ta5ela prin2ipal =ue se rela2iona 2o1 a ta5ela se2undAria D traCido para a tela@ auto1ati2a1ente o Delphi pro2ura no %ataSet se2undArio o registro e 1ostra os 2a1pos des2riti<os da ta5ela se2undAria4 Portanto@ todas as linhas da ta5ela se2undAria de<e1 estar dispon8<eis na esta9:o 2liente para =ue =ual=uer 2digo seBa en2ontrado4 Por isso D pre2iso to1ar 5astante 2uidado na atri5ui9:o de +iltros para per1itir =ue os registros ne2essArios seBa1 en2ontrados pelo Delphi4 7 prin2ipal <antage1 desse 1Dtodo D a +a2ilidade de i1ple1entA'lo no Delphi4 7lD1 disso ele si1pli+i2a o 2o1ando )WL utiliCado para a ta5ela prin2ipal@ BA =ue n:o ne2essita da parti2ipa9:o de outras ta5elas no select4 Mas de<e'se to1ar 2uidado 2o1 sua utiliCa9:o =uando as ta5elas rela2ionadas possue1 1uitos registros por=ue 5asi2a1ente todos os registros ter:o =ue ser traCidos para a 1A=uina do usuArio pela rede4 I1agine sele2ionar atra<Ds desse re2urso u1a ta5ela de 2lientes 2o1 2er2a de 4(((4((( de registros4 7pesar da possi5ilidade de se atri5uir +iltros ao %ataSet responsA<el e1 popular a lista@ isto D di+82il de<ido a ne2essidade da +ase trIs de en2ontrar o registro atra<Ds do 2digo4 )e +iltros +ore1 2olo2ados@ pode ser =ue esse registro n:o seBa en2ontrado4
Delphi Client/Server 1%!

S ) L

E * + L O R E R

Outro +ator =ue de<e ser o5ser<ado D a =uantidade de ta5elas rela2ionadas 2o1 a ta5ela prin2ipal4 )e a ta5ela prin2ipal possuir 1uitas ta5elas rela2ionadas@ para a5rir a ta5ela prin2ipal D ne2essArio a5rir ta15D1 todas as ta5elas se2undArias o =ue pode preBudi2ar 1uito a per+or1an2e nesse ponto4
Outros MDtodos

7pesar do nosso e?e1plo da tela de 2liente tratar ta5elas pe=uenas 2o1o LF e 2idade@ tentare1os 1ostrar a utiliCa9:o de re2ursos alternati<os =uando o 1Dtodo MlooQupN do Delphi n:o +or satis+atrio4 Fase 4 LtiliCare1os o 1es1o re2urso utiliCado na tela de 2onsulta de 2lientes para propi2iar a sele9:o de u1 registro se2undArio na tela de 1anuten9:o de 2lientes4 Wuando o usuArio posi2ionar nos 2a1pos da ta5ela prin2ipal =ue se rela2iona1 2o1 as ta5elas se2undArias@ u1 MgridN serA e?i5ido para per1itir a es2olha4 Fase 24 7 atualiCa9:o dos 2a1pos da ta5ela prin2ipal D +eita =uando o usuArio +e2ha a tela de pes=uisa es2olhendo u1a das op9Kes4 Fase /4 Para e<itar =ue os %ataSets responsA<eis pelas ta5elas se2undArios ne2essite1 ser a5ertos para a sele9:o de u1 registro da ta5ela prin2ipal@ in2lu81os os 2a1pos de des2ri9:o no prprio 2o1ando select4 Mais adiante@ nos pr?i1os 2ap8tulos@ tentare1os 1elhorar ainda 1ais esse re2urso@ per1itindo ao usuArio a atri5ui9:o de +iltros4 Portanto os e<entos OnEnter dos 2a1pos rela2ionados LF[)G e !ID[!D +i2a1 da seguinte +or1aG
proce"ure 2&rmCliente.DBE"it\Enter)/en"er 2ObGect*H begin 0& D/4ain./tate W= "s0nactive then begin 0& Not D/3F.Data/et.Active then D/3F.Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/3FH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/3F.Data/et.0sEmpt7* then begin 0& D/4ain./tate # "sBro9se then D/4ain.Data/et.E"itH D/4ain.Data/etSU3F</GUT #D/3F.Data/etSU3F</GUTH D/4ain.Data/etSU3F<N4UT #D/3F.Data/etSU3F<N4UTH D/4ain.Data/etSUC0D<N4UT #UUH D/4ain.Data/etSUC0D<CDUT #NullH en"H en"H en"H proce"ure 2&rmCliente.DBE"it]Enter)/en"er 2ObGect*H begin 0& D/4ain./tate W= "s0nactive then begin D/Ci"a"e.Data/et.CloseH 21uer7)D/Ci"a"e.Data/et*.ParamsSVT.As/tring # D/4ain.Data/et.Fiel"B7Name)U3F</GU*.As/tringH D/Ci"a"e.Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/Ci"a"eH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/Ci"a"e.Data/et.0sEmpt7* then begin 0& D/4ain./tate # "sBro9se then D/4ain.Data/et.E"itH D/4ain.Data/etSUC0D<N4UT #D/Ci"a"e.Data/etSUC0D<N4UTH D/4ain.Data/etSUC0D<CDUT #D/Ci"a"e.Data/etSUC0D<CDUTH
Delphi Client/Server 1%"

S ) L

E * + L O R E R

en"H en"H en"H

Rus2ando Registros de outras *a5)heets Para n:o se MpesarN 1uito o 2o1ando select da ta5ela prin2ipal@ n:o +oi in2lu8da a 5us2a da des2ri9:o da LF e !ID7DE de nas2i1ento =ue est:o lo2aliCados e1 u1a outra (abS'eet4 N:o <ale a pena a2res2entar 1ais duas ta5elas na 2lAusula &rom do 2o1ando@ sendo =ue o usuArio pode ne1 se =uer entrar na pAgina onde se en2ontra1 os dados4 De<e'se se1pre seguir o le1a de n:o traCer para a apli2a9:o in+or1a9Kes =ue o usuArio ainda n:o pediu para <er ou editar4 )e dados de u1a ta5ela se2undAria s ser:o <istos se o usuArio sele2ionar deter1inada (abS'eet@ pode'se postergar sua 5us2a para =uando a (abS'eet +or sele2ionada4 Entretanto@ =uando as in+or1a9Kes est:o e1 u1a 1es1a ta5ela BA utiliCada no 2o1ando select para traCer os dados da (abS'eet ini2ial@ n:o <ale a pena en<iar outro select para 5us2ar o restante das in+or1a9Kes de u1a 1es1a ta5ela4 7 i1ple1enta9:o do 2digo +i2a ent:o 2o1o a seguirG
proce"ure 2&rmCliente.PageControlBChange)/en"er 2ObGect*H begin 0& )PageControlB.ActivePage # 2ab/heetC* an" )D/4ain./tate # "sBro9se* then begin 0& D/4ain.Data/etSU3F</G<NA/CUT W= Null then begin D4/ist;en"as.1Geral./1..2eNt # Uselect 3F<N4 &rom 3F 9here 3F</G # UUU % D/4ain.Data/etSU3F</G<NA/CUT % UUUUH D4/ist;en"as.1Geral.OpenH E"t3FNmNasc.2eNt #D4/ist;en"as.1GeralSU3F<N4UTH D4/ist;en"as.1Geral.closeH en" else begin E"t3FNmNasc.2eNt #UUH en"H 0& D/4ain.Data/etSUC0D<CD<NA/CUT W= Null then begin D4/ist;en"as.1Geral./1..2eNt # Uselect C0D<N4 &rom Ci"a"e 9here C0D<CD # U % D/4ain.Data/et.Fiel"B7Name)UC0D<CD<NA/CU*.As/tring % U an" 3F</G # U % D/4ain.Data/et.Fiel"B7Name)U3F</G<NA/CU*.As/tringH D4/ist;en"as.1Geral.OpenH E"tCi"NmNasc.2eNt #D4/ist;en"as.1GeralSUC0D<N4UTH D4/ist;en"as.1Geral.closeH en" else begin E"tCi"NmNasc.2eNt #UUH en"H en"H en"H proce"ure 2&rmCliente.DBE"itBEEnter)/en"er 2ObGect*H begin 0& D/4ain./tate W= "s0nactive then begin 0& Not D/3F.Data/et.Active then D/3F.Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/3FH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/3F.Data/et.0sEmpt7* then begin 0& D/4ain./tate # "sBro9se then D/4ain.Data/et.E"itH D/4ain.Data/etSU3F</G<NA/CUT #D/3F.Data/etSU3F</GUTH D/4ain.Data/etSUC0D<CD<NA/CUT #NullH e"t3FNmNasc.2eNt #D/3F.Data/etSU3F<N4UTH
Delphi Client/Server 1%#

S ) L

E * + L O R E R

e"tCi"NmNasc.2eNt #UUH en"H en"H en"H proce"ure 2&rmCliente.DBE"itBDEnter)/en"er 2ObGect*H begin 0& D/4ain./tate W= "s0nactive then begin D/Ci"a"e.Data/et.CloseH 21uer7)D/Ci"a"e.Data/et*.ParamsSVT.As/tring # D/4ain.Data/et.Fiel"B7Name)U3F</G<NA/CU*.As/tringH D/Ci"a"e.Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/Ci"a"eH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/Ci"a"e.Data/et.0sEmpt7* then begin i& D/4ain./tate # "sBro9se then D/4ain.Data/et.E"itH e"tCi"NmNasc.2eNt #D/Ci"a"e.Data/etSUC0D<N4UTH D/4ain.Data/etSUC0D<CD<NA/CUT #D/Ci"a"e.Data/etSUC0D<CDUTH en"H en"H en"H

!ontrolando *ransa9Kes Wuando se tra5alha 2o1 5an2o de dados rela2ionais@ pode'se utiliCar o re2urso de transa9:o para e+eti<ar o pro2esso 2o1o u1 todo ou <oltar todas as atualiCa9Kes desde o in82io do pro2esso 2aso algu1 erro o2orra4 E1 nosso e?e1plo@ por en=uanto@ a 1anuten9:o de 2lientes estA sendo +eita so1ente na ta5ela de PE))O74 Para =ue ele +i=ue 2orreto de a2ordo 2o1 a lgi2a de neg2io da apli2a9:o@ de<e1os atualiCar ta15D1 a ta5ela de !LIEN*E nas 1anuten9Kes +eitas pelo usuArio4 Portanto@ =uando inseri1os u1 registro de<e1os inser8'lo na ta5ela de PE))O7 e ta15D1 na ta5ela de !LIEN*E4 E essa inser9:o de<e estar dentro de u1a transa9:o@ para =ue esse pro2esso seBa +eito 2o1o u1 todo4 Ou inseri1os nas duas ta5elas ou e1 nenhu1a@ 1antendo assi1 a integridade dos dados no 5an2o4 7 1es1a 2oisa de<e ser +eita para as altera9Kes e e?2lusKes4 Para e?e2utar1os as opera9Kes de inser9:o@ altera9:o e e?2lus:o nas duas ta5elas pode1os utiliCar dois 2o1ponentes 2pdateS !4 7ssi1@ n:o serA 1ais poss8<el utiliCar a propriedade 3p"ateObGect do 2o1ponente ( uer) para de+inir =ual dos dois 2o1ponentes serA utiliCado@ BA =ue =uere1os utiliCar os dois4 De<e1os ent:o utiliCar@ ao in<Ds dessa propriedade@ u1 e<ento do 2o1ponente ( uer) 2ha1ado On3p"ateRecor"4 7tra<Ds desse e<ento@ pode1os 2ha1ar 2ada u1 dos 2o1andos +orne2idos pelos 2o1ponentes 2pdateS ! e +aCer todas as atualiCa9Kes ne2essArias nas ta5elas4

Delphi Client/Server

1%$

S ) L

E * + L O R E R

Fig %4 2G Data Module4

proce"ure 2D4/ist;en"as.1Cliente3p"ateRecor")Data/et 2Data/etH 3p"ate6in" 23p"ate6in"H var 3p"ateAction 23p"ateAction*H begin 0& Not Assigne")3/Pessoa.Data/et* then begin 3/Pessoa.Data/et #2BDEData/et)Data/et*H 3/Cliente.Data/et #2BDEData/et)Data/et*H en"H i& 3p"ate6in" # u8Delete then begin 3/Cliente.Appl7)3p"ate6in"*H 3/Pessoa.Appl7)3p"ate6in"*H en" else begin 3/Pessoa.Appl7)3p"ate6in"*H 3/Cliente.Appl7)3p"ate6in"*H en"H 3p"ateAction #uaApplie"H en"H

Na i1ple1enta9:o@ de<e1os pri1eira1ente ini2ialiCar a propriedade Data/et dos 2o1ponentes 2pdateS ! 2aso seBa a pri1eira <eC =ue o 2digo esteBa sendo e?e2utado4 7 seguir D utiliCado o 1Dtodo Appl7 dos 2o1ponentes 2pdateS ! para e?e2utar o 2o1ando )WL de a2ordo 2o1 a in+or1a9:o passada pelo RDE de =ual opera9:o estA sendo realiCada4 )e a opera9:o +or de e?2lus:o@ ire1os e?2luir pri1eiro na ta5ela de !LIEN*E e depois na ta5ela de PE))O7 para 1anter a integridade4 E o 2ontrArio D +eito no 2aso de inser9Kes e altera9Kes de registros4 )e a opera9:o +or realiCada 2o1o su2esso@ ire1os de+inir o parJ1etro 3p"ateAction 2o1o sendo Mua7ppliedN =ue per1ite =ue 1ais tarde o registro seBa retirado do M2a2hed updateN atra<Ds do 2o1ando Commit3p"ates4 )e algu1 erro o2orrer de+ine o parJ1etro 2o1o MusFailN e 2ontinua a propaga9:o do erro para =ue o 2ontrole de transa9:o +eito na tela de 2liente possa +aCer o Mroll5a2QN no 5an2o de dados4 De<e1os agora +aCer algu1as 1odi+i2a9Kes na tela de 1anuten9:o de 2lientes para i1ple1entar o 2ontrole de transa9:o4 Pri1eiro <a1os 2riar u1a pro2edure no<a para 2uidar da ha5ilita9:o dos 5otKes4 Retira'se o 2digo =ue esta<a no e<ento On/tateChange do %ataSource e o 2olo2a nessa no<a pro2edure 2o1 algu1as 1odi+i2a9Kes4
Delphi Client/Server 11%

S ) L

E * + L O R E R

proce"ure 2&rmCliente.EnableBtnControlsH begin Case D/4ain./tate o& "s0nactive begin btnAppen".Enable" #2R3EH btnDelete.Enable" #FA./EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btn/earch.Enable" #2R3EH en"H "s0nsert begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en"H "sE"it begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en"H "sBro9se 0& 21uer7)D/4ain.Data/et*.3p"atesPen"ing then begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en" else begin btnAppen".Enable" #2R3EH btnDelete.Enable" #2R3EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btn/earch.Enable" #2R3EH en"H en"H en"H

7gora pode1os 1odi+i2ar os e<entos de gra<a9:o e e?2lus:oG


proce"ure 2&rmCliente.btnDeleteClic8)/en"er 2ObGect*H begin D4/ist;en"as.DatabaseB./tart2ransactionH tr7 D/4ain.Data/et.DeleteH 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH D4/ist;en"as.DatabaseB.CommitH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH D/4ain.Data/et.closeH eNcept D4/ist;en"as.DatabaseB.Rollbac8H 2BDEData/et)D/4ain.Data/et*.Cancel3p"atesH en"H en"H proce"ure 2&rmCliente.btn/aveClic8)/en"er 2ObGect*H begin D4/ist;en"as.DatabaseB./tart2ransactionH tr7
Delphi Client/Server 111

S ) L

E * + L O R E R

2BDEData/et)D/4ain.Data/et*.Appl73p"atesH D4/ist;en"as.DatabaseB.CommitH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH EnableBtnControlsH eNcept D4/ist;en"as.DatabaseB.Rollbac8H en"H en"H

Mantendo o Result )et da !onsulta *oda <eC =ue a tela de 2onsulta de 2lientes D a5erta o %ataSet estA +e2hado para per1itir u1a no<a pes=uisa do usuArio4 No entanto@ pode'se optar e1 1anter o Elti1o Mresult setN +eito =uando se a5rir a tela no<a1ente@ supondo =ue o usuArio tenha u1a grande 2han2e de en2ontrar o pr?i1o registro para 1anuten9:o no prprio 2onBunto de linhas retornado pela pes=uisa anterior4 Para +aCer isso de<e1os alterar o 2digo da tela de 2onsulta para =ue ela n:o +e2he o %ataSet =uando o +or1 +or destru8do4 7lD1 disso algu1as outras altera9Kes de<e1 ser +eitas4 De<e1os alterar os seguintes e<entos do +or1G
proce"ure 2&rmConsCliente.FormCreate)/en"er 2ObGect*H begin -- Cm"/elect #21uer7)D/4ain.Data/et*./1..2ENtH Cm"/elect #D4/ist;en"as.Cm"/elect1ClienteH 0& Not D/3F.Data/et.Active then D/3F.Data/et.OpenH en"H proce"ure 2&rmConsCliente.FormDestro7)/en"er 2ObGect*H begin --D/Ci"a"e.Data/et.closeH --21uer7)D/4ain.Data/et*./1..2ENt #Cm"/electH en"H

De<e1os ta15D1 de2larar e ini2ialiCar a <ariA<el Cm"/elect1Cliente no %ata1odule para ar1aCenar o 2o1ando original da M=uerXN4
private P Private "eclarations Q public P Public "eclarations Q Cm"/elect1Cliente /tringH en"H

proce"ure 2D4/ist;en"as.D4/ist;en"asCreate)/en"er 2ObGect*H begin Cm"/elect1Cliente #1ConsCliente./1..2eNtH en"H

FaCendo essas altera9Kes@ =uando se a5re no<a1ente a tela a Elti1a 2onsulta +eita pelo usuArio per1ane2e ati<a4 Entretanto@ de<e'se ter 2uidado 2o1 essa a5ordage14 )e o Mresult setN per1ane2er a5erto e esse possuir 1uitas linhas =ue ainda n:o +ora1 traCidas para apli2a9:o@ essas pode1 ser traCidas =uando
Delphi Client/Server 112

S ) L

E * + L O R E R

o usuArio realiCar u1a 1anuten9:o no registro e sal<ar as altera9Kes4 !o1o +oi <isto@ para alguns 5an2os de dados o Delphi realiCa a 5us2a pre1atura dos registro de u1 Mresult setN pendente antes de realiCar o commit4 Portanto@ de<e'se optar pelo 1elhor dese1penho e +un2ionalidade para o usuArio de a2ordo 2o1 o 5an2o de dados4 7s op9Kes para os 5an2os =ue n:o suporta1 1anter u1 2ursor a5erto aps o +e2ha1ento da transa9:o seria1G *entar 1ini1iCar o nE1ero de registros =ue ser:o traCidos na 2onsulta +or9ando o usuArio a atri5uir algu1 tipo de +iltro4 LtiliCar u1a outra 2one?:o@ atra<Ds de u1 outro 2o1ponente %atabase para se +aCer a 2onsulta@ desta +or1a a +inaliCa9:o da transa9:o de u1a 2one?:o n:o inter+ere na outra4 Entretanto@ essa op9:o 2ostu1a 2onsu1ir u1 nE1ero 1aior de li2en9as de usuArios do 5an2o de dados4 Nor1al1ente@ 2ada 2one?:o 2orresponde ao uso de u1a li2en9a4 *entar utiliCar na tela de 2onsulta u1 2o1ponente ((able ao in<Ds do 2o1ponente ( uer)4 !o1o +oi <isto o 2o1ponente ((able possui u1 2o1porta1ento 1ais inteligente no 2aso do +e2ha1ento da transa9:o@ BA =ue per1ite =ue o 2ursor seBa +e2hado e =uando hou<er a ne2essidade de 2a1inhar por linhas ainda n:o traCidas dispara u1 no<o 2o1ando select4 Entretanto@ esse 2o1ponente 2ostu1a a5rir u1a transa9:o e pode estar 1antendo algu1 registro tra<ado@ dependendo do 5an2o de dados utiliCado4

Delphi Client/Server

113

S ) L

E * + L O R E R

Delphi Client/Server

114

S ) L

E * + L O R E R

!ontrolando *ransa9Kes Master;Detail


Esse captulo mostra como implementar telas que e"igem um controle de transao do tipo 1aster.%etail.

!ap8tulo

tra<Ds do re2urso de 2ontrole de transa9Kes dispon8<eis nos ser<idores de 5an2o de dados@ D poss8<el 2onstruir apli2a9Kes =ue 1antenha1 a uni2idade lgi2a de u1 2onBunto de opera9Kes4 Muitas <eCes D ne2essArio =ue as atualiCa9Kes e1 <Arias ta5elas seBa1 +eitas e1 2onBunto para =ue a integridade dos dados seBa preser<ada4 )e =ual=uer pro5le1a +or en2ontrado durante a transa9:o@ os dados de<e1 retornar aos seus <alores originais antes do in82io da transa9:o4

E1 algu1as apli2a9Kes@ para 1anter a integridade dos dados atra<Ds do 2ontrole de transa9:o D ne2essArio inserir u1 registro de u1a ta5ela prin2ipal Bunta1ente 2o1 <Arios outros registros rela2ionados de u1a segunda ta5ela4 O o 2aso por e?e1plo de u1a tela de entrada de pedidos4 E1 u1 2adastro de pedido D inserido dados do 2a5e9alho ,nE1ero@ 2liente@ <endedor@ data. e dados de 2ada ite1 =ue estA sendo <endido4 O 2o1u1 =ue as regras de neg2io =ue a apli2a9:o de<a seguir@ i1ponha =ue o pedido de<a ser inserido 2o1o u1 todo ,2a5e9alho e seus itens.@ ou seBa@ e1 u1 Eni2a transa9:o4 7 esse tipo de tela D dado o no1e de Master;Detail@ ou seBa@ a ta5ela 1estre e seus detalhes4 No e?e1plo de pedido@ a entidade 1aster D representada pela ta5ela de PEDIDO e a entidade detalhe D representada pela ta5ela de I*EM4

*ela de !onsulta
Pode1os 2o1e9ar de+inindo nossa tela de 2onsulta@ =ue o usuArio irA utiliCar para pes=uisar u1 pedido@ assi1 2o1o +oi +eito para a tela de 2lientes4 LtiliCare1os 1ais trIs 2o1ponentes ( uer) =ue ser:o 2olo2ados no %ata 1odule4

Delphi Client/Server

11

FigG $4 G Data Module4

Componente WuerX

Proprie"a"e Na1e Data5aseNa1e )WL

;alor W!onsPed DRYEND7)


)ELE!* PEDIDO4PED[!D @ PEDIDO4PED[D* @ PEDIDO4PED[Y7LOR @ PEDIDO4PED[*IPO FROM PEDIDO PEDIDO ORDER Ra PEDIDO4PED[!D

WuerX2

Na1e Data5aseNa1e )WL

W!onsPed!liente DRYEND7)
)ELE!* PE))O74PE)[!D @ PE))O74PE)[NM FROM !LIEN*E !LIEN*E @ PE))O7 PE))O7 WHERE , !LIEN*E4PE)[!D ^ PE))O74PE)[!D . ORDER Ra PE))O74PE)[NM ]O5sG Dei?e a =uarta linha e1 5ran2o

WuerX/

Na1e Data5aseNa1e )WL

W!onsPedYend DRYEND7)
)ELE!* PE))O74PE)[!D @ PE))O74PE)[NM FROM YENDEDOR YENDEDOR @ PE))O7 PE))O7 WHERE , YENDEDOR4PE)[!D ^ PE))O74PE)[!D . ORDER Ra PE))O74PE)[NM

*a5ela de Propriedades

De<e1os@ agora@ 1ontar a tela 2o1o a +igura a seguirG

Delphi Client/Server

11!

Fig $42G *ela de !onsulta de Pedidos4

Componente +or1 Data)our2e Data)our2e2 Data)our2e/ Panel Edit444 5utton 5utton2 Panel2 DRGrid Panel/ 5it5tn 5i5tn2
*a5ela de Propriedades

Proprie"a"e Na1e !aption Na1e Data)et Na1e Data)et Na1e Data)et 7lign Na1e Na1e !aption Na1e !aption 7lign 7lign Data)our2e 7lign bind bind

;alor +r1!onsPedido Pedidos D)Main DM)istYendas4W!onsPed D)!liente DM)istYendas4W!onsPed!liente D)Yend DM)istYendas4W!onsPedYend al*op edtNu1ero@ edt!od!liente@ edtNo1e!liente@ edt!odYend@ edtNo1eYend 5tnPes=uisa Pes=uisa 5tnNo<o No<o al!lient al!lient D)Main alRotto1 5QOQ 5Q!an2el

Ire1os propor a=ui u1a 2onsulta u1 pou2o di+erente da apresentada na tela de 2onsulta de 2lientes e <endedores4 Para es2olher u1 2liente@ o usuArio poderA digitar as pri1eiras letras do no1e@ antes de a5rir o Grid para 2onsulta@ tornando a pes=uisa 1ais seleti<a4 Desta +or1a e<itare1os traCer todos os registros da ta5ela de 2liente a esta9:o de tra5alho@ alD1 de per1itir u1a lo2aliCa9:o 1ais rApida e pre2isa do registro pelo usuArio4 !o1 isso o usuArio utiliCa 1elhor e se 5ene+i2ia dos re2ursos +orne2idos pelos ser<idores de 5an2o de dados4

Delphi Client/Server

11"

Fig $4/G Pes=uisa de 2liente +iltrada pelas letras digitadas pelo usuArio4

7 seguir apresenta1os o 2digo da MunitN da tela de 2onsulta de pedidosG


unit conspe"i"oH inter&ace uses Min"o9sR 4essagesR /7s3tilsR ClassesR GraphicsR ControlsR FormsR DialogsR /t"CtrlsR Gri"sR DBGri"sR ENtCtrlsR DbR ButtonsH t7pe 2&rmConsPe"i"o # class)2Form* PanelB 2PanelH PanelC 2PanelH e"tNumero 2E"itH .abelB 2.abelH .abelE 2.abelH e"tCo"Cliente 2E"itH e"tNomeCliente 2E"itH .abelF 2.abelH e"tNome;en" 2E"itH DBGri"B 2DBGri"H btnPes(uisa 2ButtonH btnNovo 2ButtonH e"tCo";en" 2E"itH PanelD 2PanelH BitBtnB 2BitBtnH BitBtnC 2BitBtnH D/4ain 2Data/ourceH D/Cliente 2Data/ourceH D/;en" 2Data/ourceH proce"ure btnNovoClic8)/en"er 2ObGect*H proce"ure btnPes(uisaClic8)/en"er 2ObGect*H proce"ure FormCreate)/en"er 2ObGect*H proce"ure FormDestro7)/en"er 2ObGect*H proce"ure e"tNomeCliente6e73p)/en"er 2ObGectH var 6e7 Mor"H /hi&t 2/hi&t/tate*H proce"ure e"tNome;en"6e73p)/en"er 2ObGectH var 6e7 Mor"H /hi&t 2/hi&t/tate*H
Delphi Client/Server 11#

private P Private "eclarations Q public P Public "eclarations Q Cm"/elect /tringH en"H var &rmConsPe"i"o 2&rmConsPe"i"oH implementation uses DmVBR"btablesR ConsGri"H PYR *.DF4Q proce"ure 2&rmConsPe"i"o.btnNovoClic8)/en"er 2ObGect*H var i integerH begin For i #V to PanelB.ControlCount $ B "o 0& PanelB.ControlsSiT is 2E"it then )PanelB.ControlsSiT as 2E"it*.ClearH en"H proce"ure 2&rmConsPe"i"o.btnPes(uisaClic8)/en"er 2ObGect*H var sMhereRs/electRsep stringH nPosOr"erB7 integerH begin 21uer7)D/4ain.Data/et*.CloseH /ep #UUH sMhere #U 9here UH s/elect #Cm"/electH 0& )e"tNumero.2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs # Xs* URSsMhereR/epRUPED<CDURe"tNumero.2eNtT*H /ep #UAn"UH en"H 0& )e"tCo"Cliente.2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs # Xs*UR SsMhereR/epRUPE/<CD<C.0URe"tCo"Cliente.2eNtT*H /ep #UAn"UH en"H 0& )e"tCo";en".2eNt W= UU* then begin sMhere #Format)UXs Xs )Xs # Xs*UR SsMhereR/epRUPE/<CD<;ENURe"tCo";en".2eNtT*H /ep #UAn"UH en"H 0& /ep W= UU then begin nPosOr"erB7 #Pos)UORDER B5UR 3pperCase)s/elect**H i& nPosOr"erB7 # V then s/elect #s/elect % sMhere else 0nsert)sMhereRs/electRnPosOr"erB7*H en"H 21uer7)D/4ain.Data/et*./1..2eNt #s/electH 21uer7)D/4ain.Data/et*.OpenH en"H proce"ure 2&rmConsPe"i"o.FormCreate)/en"er 2ObGect*H begin Cm"/elect #21uer7)D/4ain.Data/et*./1..2ENtH en"H proce"ure 2&rmConsPe"i"o.FormDestro7)/en"er 2ObGect*H begin D/4ain.Data/et.CloseH 21uer7)D/4ain.Data/et*./1..2ENt #Cm"/electH en"H
Delphi Client/Server 11$

proce"ure 2&rmConsPe"i"o.e"tNomeCliente6e73p)/en"er 2ObGectH var 6e7 Mor"H /hi&t 2/hi&t/tate*H begin 0& 6e7 # BBD then begin D/Cliente.Data/et.CloseH 0& e"tNomeCliente.2eNt W= UU then 21uer7)D/Cliente.Data/et*./1.SDT #U AND PE//OA.PE/<N4 .06E UUU % e"tNomeCliente.2ENt % UXUUU Else 21uer7)D/Cliente.Data/et*./1.SDT #UUH D/Cliente.Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/ClienteH 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/Cliente.Data/et.0sEmpt7* then begin 2E"it)/en"er*.2eNt #D/Cliente.Data/etSUPE/<N4UTH e"tCo"Cliente.2eNt #D/Cliente.Data/et.Fiel"B7Name)UPE/<CDU*.As/tringH en"H en"H en"H proce"ure 2&rmConsPe"i"o.e"tNome;en"6e73p)/en"er 2ObGectH var 6e7 Mor"H /hi&t 2/hi&t/tate*H begin 0& 6e7 # BBD then begin 0& Not D/;en".Data/et.Active then D/;en".Data/et.OpenH &rmGri" #2FrmGri".Create)/el&*H &rmGri".DBGri"B.Data/ource #D/;en"H 0& )&rmGri"./ho94o"al#mrO8* an" )Not D/;en".Data/et.0sEmpt7* then begin 2E"it)/en"er*.2eNt #D/;en".Data/etSUPE/<N4UTH e"tCo";en".2eNt #D/;en".Data/et.Fiel"B7Name)UPE/<CDU*.As/tringH en"H en"H en"H en".

*ela de Manuten9:o
Para +aCer a 1anuten9:o do pedido@ <a1os a2res2entar no %ata 1odule os seguintes 2o1ponentesG

Delphi Client/Server

12%

Fig4 $4&G Data Module

Componente WuerX

Proprie"a"e Na1e Data5aseNa1e )WL

;alor Wpedido DRYEND7)


)ELE!* PEDIDO4PED[!D @ PEDIDO4PED[D* @ PEDIDO4PED[Y7LOR @ PEDIDO4PED[*IPO @ PEDIDO4PE)[!D[!LI @ PEDIDO4PE)[!D[YEN @ PE))O74PE)[NM FROM PEDIDO PEDIDO @ !LIEN*E !LIEN*E @ PE))O7 PE))O7 WHERE , !LIEN*E4PE)[!D ^ PE))O74PE)[!D . 7ND , PEDIDO4PE)[!D[!LI ^ !LIEN*E4PE)[!D . 7ND ,PEDIDO4PED[!D ^ GPED[!D. ORDER Ra PEDIDO4PED[!D

WuerX2

LpdateO5Be2t !a2hedLpdate Na1e Data5aseNa1e )WL

L)Pedido *RLE Wite1 DRYEND7)


)ELE!* I*EM4PED[!D @ I*EM4PRO[!D @ I*EM4I*E[Y7LOR @ I*EM4I*E[WL7N* @ PRODL*O4PRO[NM FROM I*EM I*EM @ PRODL*O PRODL*O WHERE , I*EM4PRO[!D ^ PRODL*O4PRO[!D . and , I*EM4PED[!D ^ GPED[!D. ORDER Ra I*EM4PRO[!D

Lpdate)WL Lpdate)WL2 WuerX/

LpdateO5Be2t !a2hedLpdate Na1e Na1e Na1e Data5aseNa1e )WL

L)Ite1 *RLE L)Pedido L)Ite1 W!onsPedProd DRYEND7)


)ELE!* ] FROM PRODL*O ORDER Ra PRO[NM O5sG Dei?ar a segunda linha e1 5ran2o4

*a5ela de Propriedades

De<e'se 2riar ta15D1@ u1 no<o 2a1po do tipo MlooQupN e1 5edido para per1itir a es2olha do <endedor atra<Ds de seu no1e4 Ire1os nessa tela@ utiliCar o prprio re2urso de MlooQupN do Delphi para a sele9:o do <endedor4
Delphi Client/Server 121

7 tela de 1anuten9:o de pedidos de<erA ser 2onstru8da 2o1o a +igura a5ai?o4 Pode'se notar =ue ser:o apresentadas na 1es1a tela os dados das ta5elas PEDIDO e I*EM para per1itir a 1anuten9:o integral dos dados do pedido4

Fig $45G *ela de Manuten9:o de Pedido4

Componente +or1 Data)our2e Data)our2e2 Data)our2e/ Panel )peedRutton )peedRutton2 )peedRutton/ )ppedRutton& )peedRutton5 DREdit444@ DRRadioGroup DRGrid )peedRutton)peedRutton# )peedRutton%
*a5ela de Propriedades

Proprie"a"e Na1e !aption Na1e Data)et Na1e Data)et Na1e Data)et 7lign Na1e Na1e Na1e Na1e Na1e Data)our2e Data)our2e Na1e Na1e Na1e

;alor +r1Pedido Pedidos D)Main DM)istYendas4Wpedido D)Detail DM)istYendas4WIte1 D)!liente DM)istYendas4W!onsPed!liente al*op 5tn7ppend 5tnDelete 5tn)a<e 5tnDis2ard 5tn)ear2h D)Main D)Detail 5tnDetail7ppend 5tnDetailDelete 5tnDetailDis2ard

Delphi Client/Server

122

Lgi2a <isual 7ntes de 2o1e9ar a de+inir os e<entos dos 5otKes@ ire1os 2riar u1 pro2edi1ento para 2ontrolar a ha5ilita9:o desses 5otKes4
proce"ure 2&rmPe"i"o.EnableBtnControlsH begin Case D/4ain./tate o& "s0nactive begin btnAppen".Enable" #2R3EH btnDelete.Enable" #FA./EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btn/earch.Enable" #2R3EH en"H "s0nsert begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en"H "sE"it begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en"H "sBro9se 0& 21uer7)D/4ain.Data/et*.3p"atesPen"ing then begin btnAppen".Enable" #FA./EH btnDelete.Enable" #FA./EH btn/ave.Enable" #2R3EH btnDiscar".Enable" #2R3EH btn/earch.Enable" #FA./EH en" else begin btnAppen".Enable" #2R3EH btnDelete.Enable" #2R3EH btn/ave.Enable" #FA./EH btnDiscar".Enable" #FA./EH btn/earch.Enable" #2R3EH en"H en"H en"H

Pode1os ta15D1 de+inir alguns e<entos de 2o1porta1ento geralG


proce"ure 2&rmPe"i"o.FormClose)/en"er 2ObGectH var Action 2CloseAction*H begin D/Detail.Data/et.CloseH D/4ain.Data/et.CloseH D/Cliente.Data/et.closeH en"H

O e<ento OnClose do $orm pode ser utiliCado para +e2har os %ataSets =ue ser:o a5ertos durante o uso da tela4

Delphi Client/Server

123

7tra<Ds do e<ento On/tateChange@ pode1os 2ha1ar EnableBtnControls para 2ontrolar a ha5ilita9:o dos 5otKes4
proce"ure 2&rmPe"i"o.D/4ain/tateChange)/en"er 2ObGect*H begin EnableBtnControlsH en"H

procedure

7gora <a1os i1ple1entar os e<entos de 2ada 5ot:o da tela@ a 2o1e9ar pelos da Detail ,ta5ela de itens.4 No e<ento OnClic8 do 5ot:o btn%etail&ppend da Detail@ pode1os i1ple1entar a a5ertura de u1a no<a linha no 6rid atra<Ds do 2o1ando Appen"4
proce"ure 2&rmPe"i"o.btnDetailAppen"Clic8)/en"er 2ObGect*H begin D/Detail.Data/et.Appen"H en"H

7lD1 disso@ de<e1os i1ple1entar o e<ento On/tateChange do DataSource Detail para poder1os noti+i2ar a Master de =ual=uer altera9:o +eita na DetailG
proce"ure 2&rmPe"i"o.D/Detail/tateChange)/en"er 2ObGect*H begin 0& D/Detail./tate in S"s0nsertR"sE"itT then D/4ain.Data/et.E"itH en"H

O 5ot:o de MDeleteN pode ser i1ple1entado da seguinte +or1aG


proce"ure 2&rmPe"i"o.btnDetailDeleteClic8)/en"er 2ObGect*H begin 0& 2BDEData/et)D/Detail.Data/et*.3p"ate/tatus W= usDelete" then begin D/4ain.Data/et.E"itH D/Detail.Data/et.DeleteH en"H en"H

7 inten9:o do 5ot:o btn%etail%elete D si1ples1ente 1ar2ar a linha para e?2lus:o4 7 e?2lus:o no 5an2o de dados s serA +eita =uando o usuArio 1andar sal<ar todas as altera9Kes4 7 propriedade 3p"ate/tatus indi2a o estado da linha no M2a2hed updatesN4 Os estados pode1 serG n:o 1odi+i2ada@ 1odi+i2ada@ inserida ou alterada4 No e<ento a2i1a esta1os <eri+i2ando se a linha BA n:o estA 1ar2ada para e?2lus:o@ para e<itar1os de tentar e?2luir a linha no<a1ente4 Para sensi5iliCar a Master da altera9:o +eita na Detail@ pode1os 2ha1ar o 1Dtodo E"it do %ataSet4 Desta +or1a os 5otKes de sal<a1ento e 2an2ela1ento asso2iados a Master ser:o ha5ilitados4 E por Elti1o de<e1os 2ha1ar o 1Dtodo Delete do %ataSet para 1ar2ar a linha para e?2lus:o 1andando'a para o M2a2hed updatesN4
Delphi Client/Server 124

O 5ot:o btn%etail%iscard ser<e para des2artar as altera9Kes +eitas e1 u1a deter1inada linha4 )e as altera9Kes ainda n:o +ora1 en<iadas para o M2a2hed updatesN@ a opera9:o de Dis2ard si1ples1ente 2an2ela as altera9Kes atra<Ds do 1Dtodo Cancel4 Mas@ se a linha BA +oi en<iada@ esta de<erA ser re<ertida a seu estado original atra<Ds do 1Dtodo RevertRecor"@ sendo portanto retirada do M2a2hed updatesN4
proce"ure 2&rmPe"i"o.btnDetailDiscar"Clic8)/en"er 2ObGect*H begin 0& D/Detail./tate in S"sE"itR"s0nsertT then begin D/Detail.Data/et.Cancel en" else begin 2BDEData/et)D/Detail.Data/et*.RevertRecor"H en"H en"H

Pode1os +orne2er u1 e+eito <isual para possi5ilitar o usuArio identi+i2ar as linhas alteradas@ e?2lu8das e inseridas4 Para +aCer isso@ pode1os i1ple1entar o e<ento OnDra9ColumnCell do 6rid e alterar as 2ores do +onte de 2ada u1a dessas situa9Kes4 Para isso pode1os utiliCar a propriedade 3p"ate/tatus do %ataSet.
proce"ure 2&rmPe"i"o.DBGri"BDra9ColumnCell)/en"er 2ObGectH const Rect 2RectH DataCol 0ntegerH Column 2ColumnH /tate 2Gri"Dra9/tate*H var Ol"Color 2colorH begin 9ith 2DBGri")/en"er* "o --Atribui cores "i&erentes para ca"a linha "a tabela "e acor"o com seu status case 21uer7)D/Detail.Data/et*.3p"ate/tatus o& usDelete" begin Ol"Color #Canvas.Font.ColorH Canvas.Font.Color #clre"H Canvas.Font./t7le #Canvas.Font./t7le % S&s/tri8eOutTH De&aultDra9ColumnCell)RectRDataColRColumnR/tate*H Canvas.Font.Color #Ol"ColorH Canvas.Font./t7le #Canvas.Font./t7le $ S&s/tri8eOutTH en"H us4o"i&ie" begin Ol"Color #Canvas.Font.ColorH Canvas.Font.Color #clBlueH De&aultDra9ColumnCell)RectRDataColRColumnR/tate*H Canvas.Font.Color #Ol"ColorH en"H us0nserte" begin Ol"Color #Canvas.Font.ColorH Canvas.Font.Color #clGreenH De&aultDra9ColumnCell)RectRDataColRColumnR/tate*H Canvas.Font.Color #Ol"ColorH en"H en"H en"H

Delphi Client/Server

12

7ntes de i1ple1entar1os os e<entos da Master@ <a1os 2riar u1 pro2edi1ento =ue nos per1ita pes=uisar os registro da Detail de a2ordo 2o1 o registro sele2ionado na Master4
proce"ure 2&rmPe"i"o.Detail/earchH begin D/Detail.Data/et.closeH 0& D/4ain.Data/et.Fiel"B7Name)UPED<CDU*.0sNull then 21uer7)D/Detail.Data/et*.ParamsSVT.clear else 21uer7)D/Detail.Data/et*.ParamsSVT.value # D/4ain.Data/etSUPED<CDUTH D/Detail.Data/et.OpenH 2BDEData/et)D/Detail.Data/et*.3p"ateRecor"27pes # 2BDEData/et)D/Detail.Data/et*.3p"ateRecor"27pes % SrtDelete"TH en"H

7 Elti1a linha do 2digo per1ite =ue os registros e?2lu8dos 2ontinue1 <is8<eis no %ataSet para =ue possa1 ser re<ertidos 2on+or1e a ne2essidade do usuArio4 Pode1os 2o1e9ar a i1ple1enta9:o dos e<entos da Master atra<Ds do 5ot:o btn&ppend4
proce"ure 2&rmPe"i"o.btnAppen"Clic8)/en"er 2ObGect*H begin 0& Not D/4ain.Data/et.Active then begin D/4ain.Data/et.OpenH en"H D/4ain.Data/et.Appen"H Detail/earchH en"H

Esse e<ento <eri+i2a se o %ataSet Master estA a5erto e a seguir insere u1a no<a linha atra<Ds do 2o1ando Appen"4 Depois D +eita u1a pes=uisa na ta5ela Detail 2o1 o parJ1etro nulo para =ue nenhu1 registro seBa en2ontrado e per1ita assi1 a inser9:o de no<os registros no Grid de Itens4 7 pes=uisa da Master realiCada pelo 5ot:o btnSearc' pode ser i1ple1entada da seguinte +or1a
proce"ure 2&rmPe"i"o.btn/earchClic8)/en"er 2ObGect*H begin D/4ain.Data/et.CloseH &rmConsPe"i"o #2&rmConsPe"i"o.Create)/el&*H 0& )&rmConsPe"i"o./ho94o"al#mrO8* an" )Not )&rmConsPe"i"o.D/4ain.Data/etSUPED<CDUT # Null** then begin 21uer7)D/4ain.Data/et*.ParamsSVT.value # &rmConsPe"i"o.D/4ain.Data/etSUPED<CDUTH D/4ain.Data/et.OpenH Detail/earchH en"H &rmConsPe"i"o.&reeH en"H

Delphi Client/Server

12!

O 5ot:o btn%iscard D responsA<el pelo 2an2ela1ento das altera9Kes da Master4 7pesar da Master estar tratando u1a Eni2a linha de 2ada <eC@ n:o D su+i2iente <eri+i2ar1os o estado do %ataSource para sa5er1os se a linha possui altera9Kes4 Wuando u1a tentati<a n:o 5e1 su2edida de sal<ar o registro a2onte2e@ o registro +oi 2olo2ado no M2a2hed updatesN@ portanto seu estado serA MdsRro>seN4 Por isso D ne2essArio <eri+i2ar1os a propriedade 3p"ate/tatus para sa5er1os 2o1o des2artar as altera9Kes4
proce"ure 2&rmPe"i"o.btnDiscar"Clic8)/en"er 2ObGect*H begin 0& 2BDEData/et)D/4ain.Data/et*.3p"ate/tatus in Sus4o"i&ie"R us0nserte"R usDelete"T then 2BDEData/et)D/4ain.Data/et*.RevertRecor" else 2BDEData/et)D/4ain.Data/et*.CancelH 0& 2BDEData/et)D/4ain.Data/et*.0sEmpt7 then begin D/4ain.Data/et.closeH D/Detail.Data/et.CloseH en" else begin Detail/earchH en"H EnableBtnControlsH en"H

!ontrole <isual da *ransa9:o O e<ento de sal<a1ento +eito pelo 5ot:o btnSave pode ser i1ple1entado da seguinte +or1a para 1anter e1 u1a Eni2a transa9:o a inser9:o do pedido e de seus itens4
proce"ure 2&rmPe"i"o.btn/aveClic8)/en"er 2ObGect*H begin 0& D/Detail.Data/et./tate in S"s0nsertR"sE"itT then D/Detail.Data/et.PostH 0& D/4ain.Data/et./tate in S"s0nsertR"sE"itT then D/4ain.Data/et.PostH D4/ist;en"as.DatabaseB./tart2ransactionH tr7 2BDEData/et)D/4ain.Data/et*.Appl73p"atesH 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH D4/ist;en"as.DatabaseB.CommitH EnableBtnControlsH Detail/earchH eNcept On E ENception "o begin 2BDEData/et)D/4ain.Data/et*.Commit3p"atesH D4/ist;en"as.DatabaseB.Rollbac8H D/4ain.Data/et.E"itH i& Not ))E is EDBEngineError* an" )EDBEngineError)E*.ErrorsSVT.NativeError # V** then raiseH en"H en"H en"H

Desta +or1a se algu1 pro5le1a o2orrer na inser9:o do pedido ou de seus itens D e?e2utado u1 rollbac8 no 5an2o de dados para des+aCer toda a transa9:o e a tela +i2a inta2ta para =ue o usuArio possa 2orrigir o pro5le1a e re+aCer a gra<a9:o4
Delphi Client/Server 12"

7 pri1eira parte do 2digo 2uida de en<iar para o M2a2hed updateN =ual=uer linha =ue esteBa pendente na Detail ou na Master4 7 linha da Detail D en<iada pri1eiro@ por=ue ela pode 2ausar 1odi+i2a9Kes no registro 2orrente da Master4
0& D/Detail.Data/et./tate in S"s0nsertR"sE"itT then D/Detail.Data/et.PostH 0& D/4ain.Data/et./tate in S"s0nsertR"sE"itT then D/4ain.Data/et.PostH

7 seguir 2o1e9a a transa9:o e toda a opera9:o de sal<a1ento D +eita dentro do 2o1ando tr7..eNcept para =ue a +inaliCa9:o da transa9:o possa ser 2ontrolada@ tanto no 2aso de su2esso 2o1o no 2aso de o2orrer algu1a +alha4 O sal<a1ento D +eito atra<Ds do 2o1ando Appl73p"ates@ responsA<el por en<iar as pendIn2ias do M2a2hed updateN para o 5an2o4 7ps o en<io 2o1 su2esso@ D ne2essArio e?e2utar o 2o1ando Commit3p"ates@ responsA<el e1 retirar do M2a2hed updateN as linhas sal<as 2o1 su2esso4 Entretanto@ para =ue o Delphi atualiCe alguns +lags@ esse 2o1ando D ne2essArio 1es1o se a atualiCa9:o +alhar4 )e essas opera9Kes o2orrere1 2o1 su2esso@ D e?e2utado o 2o1ando commit no 5an2o de dados e todo o 2onBunto de atualiCa9Kes D +inal1ente apli2ado no 5an2o@ 2aso 2ontrArio toda a transa9:o D des+eita atra<Ds do 2o1ando rollbac84 O 2digo ainda apresenta alguns detalhes 2o1oG 2ha1ar o 2ontrole de ha5ilita9:o dos 5otKes e +aCer a 5us2a no<a1ente dos dados da Detail para =ue os registros possa1 ser atualiCados na tela4 *ransa9:o ' Lgi2a de neg2io 7lguns e<entos de<e1 ser i1ple1entados no %ata1odule para =ue o 2ontrole da transa9:o Master;Detail seBa +eito por 2o1pleto4 Ya1os 2o1e9ar pelo e<ento =ue de<e ser utiliCado para +orne2er <alores Mde+aultN para os 2a1pos@ =uando o usuArio 2riar u1 no<o registroG
proce"ure 2D4/ist;en"as.1Pe"i"oNe9Recor")Data/et 2Data/et*H begin Data/etSUPED<;A.ORUT #VH Data/etSUPED<20POUT #U;UH en"H

7gora <a1os i1ple1entar o e<ento 3p"ateRecor" do %ataSet


proce"ure 2D4/ist;en"as.1Pe"i"o3p"ateRecor")Data/et 2Data/etH 3p"ate6in" 23p"ate6in"H var 3p"ateAction 23p"ateAction*H begin 3/Pe"i"o.Appl7)3p"ate6in"*H tr7 10tem.Appl73p"atesH &inall7 10tem.Commit3p"atesH en"H 3p"ateAction #uaApplie"H en"H

5edido4

Delphi Client/Server

12#

Esse e<ento si1ples1ente 2uida de e?e2utar o 2o1ando de atualiCa9:o atra<Ds do 2o1ponente 2pdateS ! e +aCer a 2ha1ada para a e+eti<a9:o do M2a2hed updateN da Detail4 Desta +or1a se algu1 erro a2onte2er na Master ou na Detail@ o <alor do +lag retornado atra<Ds do parJ1etro 3p"ateAction D Mua75ortN@ o =ue +aC a linha da Master 2ontinuar no 2a2he para no<as tentati<as de atualiCa9:o pelo usuArio4 Wuando se retorna o <alor Mua7ppliedN no parJ1etro 3p"ateAction@ o Delphi re<erte o status da linha para n:o 1odi+i2ada 2o1o se ela ti<esse sido apli2ada no 5an2o4 Isso s pode ser +eito se toda a transa9:o +oi realiCada 2o1 su2esso e ti<er1os 2erteCa =ue o 2o1ando commit serA e?e2utado4 De<e1os ta15D1 i1ple1entar o e<ento da Detail4
proce"ure 2D4/ist;en"as.10tem3p"ateRecor")Data/et 2Data/etH 3p"ate6in" 23p"ate6in"H var 3p"ateAction 23p"ateAction*H begin 3/0tem.Appl7)3p"ate6in"*H 3p"ateAction #ua/8ipH en"H

Para e<itar1os =ue os +lags dos registros seBa1 re<ertidos para n:o 1odi+i2ado@ +oi retornado atra<Ds do parJ1etro 3p"ateAction o <alor Mua)QipN =ue n:o produC nenhu1a e?2e9:o e n:o 1odi+i2a o +lag dos registros4 Wuando a transa9:o D +inaliCada 2o1 su2esso@ D +eita u1a no<a pes=uisa no prprio e<ento do 5ot:o btnSave para =ue todos os +lags seBa1 atualiCados4 Desta +or1a 2onsegui1os 1anter a integridade da transa9:o e per1itir a 2orre9:o dos registros pelo usuArio para =ue possa1 ser reen<iados para o 5an2o de dados4 !al2ulando o Yalor *otal do Pedido Yoltando a tela de pedido@ pode1os 2al2ular o <alor do pedido se1pre =ue hou<er u1a atualiCa9:o no <alor do ite14 O <alor do ite1 D ta15D1 +un9:o de dois outros <aloresG o pre9o do produto e a =uantidade do ite14 Ya1os utiliCar o e<ento OnDataChange do %ataSource Detail para +aCer1os os 2Al2ulos4
proce"ure 2&rmPe"i"o.D/DetailDataChange)/en"er 2ObGectH Fiel" 2Fiel"*H begin 0& )Fiel" # D/Detail.Data/et.Fiel"B7Name)UPRO<CDU** or )Fiel" # D/Detail.Data/et.Fiel"B7Name)U02E<13AN2U** then begin 0& D/4ain./tate # "sBro9se then D/4ain.Data/et.E"itH D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat$ D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH D/Detail.Data/etSU02E<;A.ORUT # D/Detail.Data/etSUPRO<PRECOUT * D/Detail.Data/etSU02E<13AN2UTH D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat % D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH en"H en"H

Delphi Client/Server

12$

7lD1 disso de<e1os re2al2ular o <alor total e1 <Arias situa9Kes de altera9:o =ue pode1 a2onte2er na Detail4 Por isso@ ire1os adi2ionar algu1as linhas de 2digo e1 alguns dos e<entos BA i1ple1entados anterior1ente4 O pri1eiro D o e<ento do 5ot:o btn%etail%elete =ue de<e su5trair o <alor do ite1 do total do pedido4
proce"ure 2&rmPe"i"o.btnDetailDeleteClic8)/en"er 2ObGect*H begin 0& 2BDEData/et)D/Detail.Data/et*.3p"ate/tatus W= usDelete" then begin D/4ain.Data/et.E"itH D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat $ D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH D/Detail.Data/et.DeleteH en"H en"H

7lD1 disso@ de<e1os ta15D1 re2al2ular o <alor do pedido no e<ento do 5ot:o btn%etail%iscard4
proce"ure 2&rmPe"i"o.btnDetailDiscar"Clic8)/en"er 2ObGect*H begin 0& D/Detail./tate in S"sE"itR"s0nsertT then begin 0& D/Detail./tate # "s0nsert then begin D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat $ D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH D/Detail.Data/et.CancelH en" else begin D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat $ D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH D/Detail.Data/et.CancelH D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat % D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH en"H en" else begin i& 2BDEData/et)D/Detail.Data/et*.3p"ate/tatus # us0nserte" then begin D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat $ D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH 2BDEData/et)D/Detail.Data/et*.RevertRecor"H en" else i& 2BDEData/et)D/Detail.Data/et*.3p"ate/tatus # usDelete" then begin D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat % D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH 2BDEData/et)D/Detail.Data/et*.RevertRecor"H en" else i& 2BDEData/et)D/Detail.Data/et*.3p"ate/tatus # us4o"i&ie" then begin D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat $ D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH 2BDEData/et)D/Detail.Data/et*.RevertRecor"H D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.AsFloat # D/4ain.Data/et.Fiel"B7Name)UPED<;A.ORU*.as&loat % D/Detail.Data/et.Fiel"B7Name)U02E<;A.ORU*.as&loatH en"H en"H en"H

Delphi Client/Server

13%

Regras de Neg2io 7lD1 de inserir os registros do pedido e de seus itens@ de<e1os i1ple1entar algu1as regras de neg2io e1 torno dessas inser9Kes4 !o1o e?e1plo ire1os i1ple1entar duas regras de neg2ioG a <eri+i2a9:o do li1ite de 2rDdito do 2liente e1 2o1pras a praCo e a 5ai?a do esto=ue do produto4 Essas regras de neg2io de<e1 ser i1ple1entadas dentro da transa9:o para =ue seBa1 e+eti<adas Bunta1ente 2o1 a inser9:o dos registros4 Para si1pli+i2ar o pro2esso ire1os +aCer os e<entos apenas para inser9:o do pedido e dos itens4 N:o ire1os tratar portanto a atualiCa9:o e e?2lus:o de itens ou do pedido4 Ya1os i1ple1entar duas pro2edures dentro do %ata1oduleG
public P Public "eclarations Q proce"ure ;eri&ica.imiteCre"itoCliente)Cliente integerH ;alor "ouble*H proce"ure 3p"ateEsto(ue)Pro"uto integerH 1uant integer*H en"H

proce"ure 2D4/ist;en"as.;eri&ica.imiteCre"itoCliente)Cliente integerH ;alor "ouble*H begin 1Geral.closeH 1Geral./1..2eNt #Uup"ate cliente set cli<"ebito # cli<"ebito % pB U % U9here pes<c" # pCUH 1Geral.ParamB7Name)UpBU*.AsFloat #;alorH 1Geral.ParamB7Name)UpCU*.As0nteger #ClienteH 1Geral.ENec/1.H 1Geral./1..2eNt #Uselect cli<limitecre"ito $ cli<"ebito &rom cliente U % U9here pes<c" # pBUH 1Geral.ParamB7Name)UpBU*.As0nteger #ClienteH 1Geral.OpenH i& 1Geral.Fiel"sSVT.AsFloat W V then begin /ho94essage)U.imite "e Cr,"ito "o Cliente insu&iciente para a compraU*H 1Geral.CloseH AbortH en"H 1Geral.CloseH en"H

Esse 1Dtodo in2re1enta o dD5ito do 2liente e <eri+i2a se ele ultrapassou o li1ite4 !aso isso a2onte9a u1a 1ensage1 D 1ostrada ao usuArio e u1a e?2e9:o D le<antada4 7 altera9:o de<e ser +eita pri1eiro para =ue o registro se 1antenha tra<ado e outro usuArio n:o altere seus <alores4 O e<ento de 5ai?a no esto=ue D 5e1 si1ilar e D 1ostrado a5ai?o4
proce"ure 2D4/ist;en"as.3p"ateEsto(ue)Pro"uto integerH 1uant integer*H begin 1Geral.closeH 1Geral./1..2eNt #Uup"ate pro"uto set pro<esto(ue # pro<esto(ue $ pB U % U9here pro<c" # pCUH 1Geral.ParamB7Name)UpBU*.AsFloat #1uantH 1Geral.ParamB7Name)UpCU*.As0nteger #Pro"utoH 1Geral.ENec/1.H 1Geral./1..2eNt #Uselect pro<esto(ue &rom pro"uto U % U9here pro<c" # pBUH 1Geral.ParamB7Name)UpBU*.As0nteger #Pro"utoH
Delphi Client/Server 131

1Geral.OpenH i& 1Geral.Fiel"sSVT.AsFloat W V then begin /ho94essage)UEsto(ue insu&iciente "o Pro"uto U % inttostr)Pro"uto**H 1Geral.CloseH AbortH en"H 1Geral.CloseH en"H

De<e1os ent:o@ a2res2entar as 2ha1adas desses 1Dtodos nos e<entos de atualiCa9:oG


proce"ure 2D4/ist;en"as.1Pe"i"o3p"ateRecor")Data/et 2Data/etH 3p"ate6in" 23p"ate6in"H var 3p"ateAction 23p"ateAction*H begin 0& 3p"ate6in" # u80nsert then begin 0& 1Pe"i"oPED<20PO.Ne9;alue # UPU then ;eri&ica.imiteCre"itoCliente)1Pe"i"oPE/<CD<C.0.Ne9;alueR 1Pe"i"oPED<;A.OR.Ne9;alue*H en"H 3/Pe"i"o.Appl7)3p"ate6in"*H tr7 10tem.Appl73p"atesH &inall7 10tem.Commit3p"atesH en"H 3p"ateAction #uaApplie"H en"H proce"ure 2D4/ist;en"as.10tem3p"ateRecor")Data/et 2Data/etH 3p"ate6in" 23p"ate6in"H var 3p"ateAction 23p"ateAction*H begin 0& 3p"ate6in" # u80nsert then begin 10temPED<CD.Ne9;alue #1Pe"i"oPED<CD.Ne9;alueH 3p"ateEsto(ue)10temPRO<CD.Ne9;alueR 10tem02E<13AN2.Ne9;alue *H en"H 3/0tem.Appl7)3p"ate6in"*H 3p"ateAction #ua/8ipH en"H

Delphi Client/Server

132