Вы находитесь на странице: 1из 26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

www.devmedia.com.br
[versoparaimpresso]
Linkoriginal:http://www.devmedia.com.br/articles/viewcomp.asp?
comp=12087

Artigo Clube Delphi Magazi


ne 104 - Usando dados do
BD para gerar Grcos
Nesse artigo veremos como desenvolver
facilmente grcos utilizando o componente
TChart que acompanha o Delphi desde os
primrdios.

EsseartigofazpartedarevistaClubeDelphiMagazine
edio104.Cliqueaquiparalertodososartigosdesta
edio

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

1/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

EasyDelphi
UsandodadosdoBDparagerarGrficos
Vejacomogerargrficosusandoinformaesdoseu
bancodedados

Nesteartigoveremos
Configuraodealgumasdasprincipaispropriedadesdocomponente
TChart
Rotinasparaobterosdadosdeumbancoegerarosgrficos
Impressodemaisdeumgrficoporpginasemousodeum
geradorderelatrios
Qualafinalidade?
Gerargrficosapartirdeinformaesobtidasemumbancode
dados
Quaissituaesutilizamessesrecursos?
Emaplicaescomerciaiscomumanecessidadedaapresentao
deresultadosdeumaformamaisamigveledefcilcompreenso.
Paraisso,emgeral,utilizamososgrficosparaaexibiode
informaesobtidasatravsdocruzamentodedadosarmazenados
nobanco

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

2/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

ResumodoDevMan
Podemosdizerquetodosistemadeinformaobaseadoem
informaesadvindasdobancodedadosdaempresa.Issofato.Sabemos
tambm,queboapartedeumsoftwareconstitudaderelatriosquepor
suavezenriquecemaaplicaoefazemcomqueelatenhaumsentido
dentrodacorporao.
Almosrelatrios,muitasempresassebaseiamemgrficos
comparativosparademonstrardiversossetoresdaempresa,taiscomo
vendas,compras,vendasempotencial,vendasantigas,estimativasetc.
Porissonesseartigoveremoscomodesenvolverfacilmentegrficos
utilizandoocomponenteTChartqueacompanhaoDelphidesdeos
primrdios.

Emquasetodososprojetosquetrabalheitivequeimplementaralgumtipode
grficoalmdainformaonoformatodetexto(ostradicionaisrelatrios).
Porm,lembroquenaprimeiravezqueumclientemepediuparagerarum
grficoeugelei,poisnotinhaamenoridiadecomoatenderaquelepedido.
Partiembuscadeinformaesnainternet,masencontreimuitopoucosobre
oassuntoeasoluofoicolocarumTChartemumform,estudarassuas
propriedadesefazerinmerostestesparaentenderofuncionamentodo
componente.Afimdequeoutrosprogramadoresnotenhamasmesmas
dificuldadesqueencontrei,resolviescreveroqueaprendisobreesse
componente.Nodecorrerdoartigoconstruiremosumpequenoexemploque
preparei,ondeveremosalgumasdasprincipaispropriedadesdoTChart,como
gerarumgrficoapartirdeinformaesobtidasemumabasededadose,
porltimo,comoimprimirumoumaisgrficosemumamesmapginasem
autilizaodeumgeradorderelatrioscomooQuickReport,porexemplo.O
aplicativoterdoisgrficos,oprimeirocomumasrieonderepresentaremos
asvendasdecadamseumsegundogrficoondeestarorepresentadasas
vendasdecadamsporFormadePagamentoqueircontertrssries.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

3/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

NesteexemploutilizaremosoDelphi7esernecessrioaindaacriaode
umapequenabasedadoscomapenasquatrotabelas.Paraacriaodobanco
utilizeioFirebird,pormnadaimpedequeumoutroSGDBsejausado.

ConfigurandoocomponenteTChart
AmaiordificuldadecomquemedepareiaoutilizarocomponenteTChartpela
primeiravezfoiagrandequantidadedepropriedadesqueocomponente
possuiparaseremconfiguradas.Porm,antesdeconfigurarqualquer
propriedade(eissovaleparaqualquercomponente),precisoentendero
querepresentaapropriedade.Assim,parafacilitaroentendimentodessas
propriedades,vamoscolocaramonamassaemontarumpequeno
aplicativo.AbraoDelphi7einicieumanovaaplicao.Salvetodosos
arquivosemumapastanomeandoaUnitdoformcomoufrmChart.paseo
projetocomoprjChart.dpr.AtribuapropriedadeNamedoformcriado
frmCharteChartsuapropriedadeCaption.Coloqueneleumcomponente
TChart(chtVendas)dapaletaAdditional.Deumduplocliquesobreo
componenteparacarregaroeditordepropriedadesdoTChart.atravs
desseeditorquepoderemoscriarassriesdogrficoetambmconfigurar
suaspropriedades.
ParaadicionarumasrieaogrficocliquenobotoAddlocalizadodireita
napginaChart>Sries.EscolhaaopoBarecliqueemOK.Aovoltarpara
oeditorteremosanossasriecriada.Paraentendermelhoroqueuma
srie,podemosimaginarqueelaservepararepresentarumadeterminada
informao,assim,seimaginarmosumsistemacomercialemquedesejamos
criarumgrficoqueexibaasomadasvendasdecadams,necessitamosde
apenasumasrie,poistemosumanicainformao,queovalordas
vendasdoms.Poroutrolado,seprecisamosdeumgrficoqueapresente
asvendasdecadamsseparadasporFormadePagamento,entoser
necessrioumasrieparacadaFormadePagamentopossvel.Portanto,se
tivermosumasituaoemqueasopesdeformasdepagamentoforem,
porexemplo,CARTO,CHEQUEeDINHEIRO,teremosquecriartrssries.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

4/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Nota:Noconfundaaquantidadedebarrasdeumgrfico
(considerandoumgrficodebarras)comaquantidadedesriesaserem
criadas.Porexemplo,emumgrficodevendasporms,ofatodetermos
umabarraparacadams,noquerdizerqueparacadaumdosmeses
temosquecriarumanovasrie.Umamesmasriepodereceberdiversos
valoressendoqueparacadavalorsergeradaumanovabarra.

Depoisdecriadaasrie,cliquenobotoTitleenomeieaparaVendas.
SelecioneapginaSeriesdoeditorenapginaFormatmarqueaopoColor
Each.Marcandoestaopoteremosumacordiferenciadaparacadabarrada
nossasrieVenda.PodemosdefiniraindanapginaFormatalargurade
cadabarraatribuindoumvalorapropriedade%BarWidth,pormvamos
deixarovalordefaultparaestaeaspropriedadesrestantesdestapgina.
NapginaGeneralpodemosdefinirsealegendaserounoatravsda
propriedadeShowInLegend,enquantoasopesdosgruposHorizontalAxis
eVerticalAxisdeterminamoposicionamentodosvaloresdaslinhasXeY,
respectivamente.Nestapginadeixeosvalorespadro.NapginaMarks
(Figura1)temosvriaspropriedadesqueirointerferirnoaspectovisualdo
nossogrficoetambmqueinformaesseroexibidas.
ComeamospelaopoVisible,quedefineseosvaloresseroouno
apresentadoslogoacimadecadabarra.Deixamosestaopomarcada,mas
paraefeitodeaprendizadoexperimentedesmarcar/marcarestaopoeveja
oefeito.DentrodogrupoFormat,temosaopoTransparentquese
marcadatornartransparenteofundodoretnguloqueenvolveosvaloresde
cadabarra.AoladodestaopotemosobotoBackColorquedefineacor
defundodosvalores.ParanossoexemplovamosdeixaraopoTransparent
marcada.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

5/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

NobotoFont,podemosdefinirafonteeacordosvalores.Clicandonoboto
Borderiraparecerumapequenajanela(Figura2)ondepoderemosdefinir
acor,estilo,larguraevisibilidadedabordaqueenvolveosvalores.Vamos
retirladeixandoaopoVisibledesmarcada.DentrodogrupoArrows,
temosobotoColorqueaoserclicadoexibeumapequenajanelaonde
podemosdefiniracor,larguraevisibilidadedalinhaexistenteentrecada
barradogrficoeoseurespectivovalorlogoacima.Paranossoexemplo,
retireestalinhadesmarcandoaoopoVisibledestajanela.Temosainda
nessegrupoapropriedadeLengthquedefineadistnciaentreovalorea
barra.Altereestapropriedadepara10.Porfim,temosnoladoesquerdoo
grupoStyle,ondedefinimosoqueserexibidoacimadecadabarrado
grfico.DentrodestegrupodestacamosasopesValue,queexibeos
valoresabsolutosdecadabarra,Percent,queexibeopercentualdecada
barra,Label,queirexibirortulo,LabelandValue,exibeortuloeoseu
respectivovaloreaopoLabel&PercentTotalqueexibirortuloeo
percentualdototal.
Paraonossoexemplo,vamosmarcaraopoValue,masparamelhor
entenderaltereasopesevejaasmudanasqueocorremnogrfico.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

6/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Figura1.DefinindoaspropriedadesdapginaMarks

Figura2.Editandoabordadosvalores

Dandoseqnciaaonossoexemplo,selecioneapginaCharteemseguida
cliqueemAxis(Figura3).Nestapginaencontramosumaquantidade
enormedeopesdeconfiguraodogrfico.ComeamospelaopoShow
Axisnapartesuperioresquerda,quedefineavisibilidadedosvaloresdos
eixosxeyassimcomotodasaslinhaspontilhadasnahorizontaleverticaldo
grfico.Desmarcandoestaopoteremosumgrficomaislimpo.Paranosso
exemplo,deixeestaopomarcada.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

7/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Figura3.ConfigurandoasopesdapginaAxis
LogoabaixodaopoShowAxis,temosogrupoAxisquepermite
configurarcadaumdosladosdogrficoseparadamente.Porexemplo,sea
opoLeftestiverselecionadaedesmarcarmosaopoVisible(localizada
abaixo),osvaloresaesquerdadogrfico(eixoy)soocultadas,enquanto
queseaopoBottomestiverselecionada,osvaloresdalinhainferior(eixo
x)queseroocultadas.VamosdeixaraopoVisiblemarcada.Dentroda
pginaAxistemosaocentroumoutroconjuntodepginas.Selecioneaopo
Titledesteconjunto,ecomaopoLeftdogrupoAxisesquerdamarcada,
digiteValoresnacaixadetextoaoladodeTitle.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

8/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Notequeirapareceresquerdadogrfico,navertical,otextodigitado.
AgoraselecioneaopoBottomdogrupoAxisedigiteMesesnamesma
caixadetexto.Teremosotextonaparteinferiordogrfico,logoabaixodos
valoresdoeixox.PorquestesdeespaovamosdeixarapropriedadeTitles
embranco.NapginaLabelspodemosregularongulodosvaloresdoseixos
xeyetambmalterarsuaspropriedadesdefont.SelecioneaopoBottom
(dogrupoAxis)ealtereapropriedadeanglepara325,assimteremosos
valoresnaparteinferior(eixox)emumaposiode325.Cliquenoboto
FontealtereacordafonteparaAzul.AgoravapginaTicksecoma
opoleftdogrupoAxisselecionada,cliquenobotoGridBorder.Abriruma
janelaondepodemosdefiniracor,espessura,estiloevisibilidadedaslinhas
pontilhadashorizontaisquecortamogrfico.
ParatermosumgrficomaislimpovamosdesmarcaraopoVisibledesta
janela.SelecioneaopoBottomnogrupoAxisecliquenovamentenoboto
GridBorderetambmdesmarqueaopoVisibleparaocultarmosaslinhas
pontilhadasverticaisdogrfico.AindanapginaTickspodemosocultar,
definiracorelarguradasbordasdogrfico,selecionandoumadasopes
dogrupoAxiseclicandonobotoAxisBorderparaconfiguraras
propriedades.
ParaatribuirumttuloaogrficocliquenapginaTitles(aoladodapgina
Axis).Nestapginapodemos,almdeatribuirottulo,configurarasua
fonte,cor,posicionamento,bordaesuavisibilidade.Ottulodogrficodeve
serdigitadonacaixadetextonaparteinferiordapgina.Destacamosnesta
pginaaindaosbotesFonteBorderquepermitemconfigurarafonteea
bordadottulo,respectivamenteeogrupoAlignmentquedefineo
posicionamentodottulo.TemosnapginaTitlesaindaumacaixadeseleo
napartesuperiorondepodermosalternarentreosvaloresTitleeFoot.
SelecionandoaopoFootpodemosconfigurarumtexto(damesmaforma
queconfiguramosottulodogrfico)queserexibidonorodap.Parao
nossoprimeirogrficoaltereottuloparaGrficodeVendascomafontena
corpretoeemnegrito.Asoutrasopesdeixecomovalordefault.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

9/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Configurandoalegenda
Alegendaumadasprincipaispartesdogrficoemostrainformaes
sobreassries.Semalegendapraticamenteimpossvelentender
perfeitamenteoqueogrficoquerdizer.Vamosagoraverealteraralgumas
daspropriedadesrelacionadasalegendadogrfico.Paraisso,selecionea
pginaLegend.Nessapginatemoslogoacima,nocantosuperioresquerdo,
aopoVisible,quedefineavisibilidadedalegenda.Paraesteprimeiro
grfico,deixeestaopodesmarcada.Temostambm,logoabaixodaopo
Visible,3botes:BackColor,queaoclicarmosabreumajanelapara
configurarmosacordefundodalegenda,Font,quepermitealteraras
propriedadesdefontedalegendaeobotoFramequedefineacor,estiloe
visibilidadedalinhaquecontornaalegenda.Deixaremosasopesdefault
paraestaspropriedades.
NogrupoPosition(abaixodobotoFrame),podemosdefiniro
posicionamentodalegenda:Left(esquerda),Right(direita)Top(acima)e
Bottom(embaixo).VamosselecionaraopoBottomparaessa
propriedade.DentrogrupoShadowtemosobotoColor,ondepodemos
definiracordosombreamentodalegenda,enquantoqueapropriedadeSize,
dentrodessemesmogrupo,definealarguradessesombreamento.Vamos
eliminaressasombraatribuindoovalor0propriedadeSize.
Podemostambmalterarotamanhodascoresdalegendaatravsda
propriedade%ColorWidth.Configureessapropriedadecomovalor20para
termosumamaiorvisibilidadedascoresdalegenda.NapginaPanel,
podemosdarumefeitogradienteparaopaineldefundodogrfico.Dentro
dogrupoGradient,temosaopoVisiblequeativa/desativaoefeitoe
habilitaosbotesStartColoreEndColorquedefinemascoresiniciaise
finais,respectivamente.Paraonossoexemploativeoefeitogradientee
altereacorfinal(BotoEndColor)paracinza25%.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

10/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

AgoraselecioneapginaWallsondepodemosconfiguraroefeitodemuroao
fundogrfico.AopoVisibledestapginadefineavisibilidadedoefeito
muro.Temosaocentroumconjuntode3pginasparaconfigurarcadaum
dosladosdomuro.Dentrodecadaumadessaspginastemos3botes:

Background:quedefineacordefundo
Border:paraconfigurarasbordas
Pattern:paradefiniroestilo.

TemosaindaaopoTransparentqueinutilizaasconfiguraesdefinidasem
cadaumdosbotesdeixandoasbordastransparentes.Vamosocultaromuro
aofundodesmarcandoaopoVisibledestapgina.Paraasoutrasopes
deixeovalorpadro.
Compodemosnotarataqui,nohgrandesdificuldadesemsemontar
grficosnoDelphi.Almdoquejvimos,temosapgina3D.Nestapgina
podemosretiraroefeitotridimensionaldasbarrasdesmarcandoaopo3D
Dimensions.Podemostambmalteraropercentualdoefeito3Dmodificando
ovalordapropriedade3D%.Deixeosvaloresdefaultnessapgina.Feita
todasasconfiguraesdeveremosterumgrficosemelhanteFigura4.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

11/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Figura4.Visodogrficoapsasconfiguraesrealizadas
Vamosagoraconfigurarnossosegundogrficoquesermuitosemelhanteao
primeiro,comalgumasdiferenasqueiremosdetalharaseguir.Primeiro
insiraumnovocomponenteTChartnoform(frmChart)eposicioneodireita
doprimeiro.Definasuaalturaelarguraigualaoprimeiroenomeieopara
chtVendasFormaPagto.Paraessesegundogrficovamospassaras
propriedadesquedevemserconfiguradasdiferentesdoprimeiro,portanto,
asconfiguraesnomencionadasdeveroseriguaisaogrficodevendas
(chtVendas).
Aprimeiradiferenadestesegundogrficoqueteremos3sriesaoinvs
deumacomonogrficodevendas.Assriesserocriadaspararepresentar
asformasdepagamentopossveisemnossoexemplo:Carto,Chequee
Dinheiro.Dumduplocliquesobreocomponenteparaabriroeditorde
propriedades.NapaginaChart>Seriesadicione3sriesclicandonoboto
AdddireitaeselecionandosempreogrficodotipoBar.
ApsadicionarassriesaltereottulodecadaumaclicandonobotoTitle.
AssriesdeveroterseusttulosalteradosparaCarto,ChequeeDinheiro.
Quandotrabalhamoscomgrficoscommaisdeumasrie,algumas
propriedadesprecisamserconfiguradasindividualmenteparacadaumadas
sriescriadas.VatapginaSeries(aoladodeChart)enotequehuma
caixadeseleoondetemostodassriesquecriamos.Emtodaselasa
opoColorEachdeverficardesmarcada,napginaMarks,retireaslinhas
queenvolvemosvaloresacimadecadabarradamesmamaneiracomofoi
feitoemnossoprimeirogrfico(chtVendas)eselecioneaopoValueno
grupoStyle.
Asalteraesaseguirnoprecisamserrealizadasparacadasrie.Na
pginaLegend,marqueaopoVisibleparaexibiralegendaeconfigureo
restantedaspropriedadesdestapginaigualaogrficodevendas
(chtVendas).Porfim,altereotitulodogrfico(napginaTitles)paraGrfico
deVendasPorFormadePagamento.Comofoiditoanteriormente,asoutras
configuraesdeveramserfeitasigualaonossoprimeirogrfico.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

12/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Agoraquejconfiguramososdoisgrficosdonossoexemplo,adicioneum
Panel(paletaStandard)aonossoform,configuresuapropriedadeAlignpara
alTopedeixesuapropriedadeCaptionembranco.Selecioneogrficode
vendas(chtVendas)ealteresuapropriedadeAlignparaalLeft.Parao
segundogrfico(chtVendasFormaPagto)altereapropriedadeAlignpara
alRight.AdicioneumcomponenteTGroupBox(paletaStandard)ealtereseu
CaptionparaPerododePesquisa.
DentrodoGroupboxcoloquedoiscomponentesTCombobox,renomeioos
paracmbMesIniecmbMesFim,adicionepropriedadeItemstodososmeses
doano,modifiqueapropriedadeStyleparacsDropDownListealtereo
ItemIndexpara0.IncluadoiscomponentesTEdit(paletaStandard)
nomeandoosparaedtAnoInieedtAnoFim.Coloque2componentesTLabele
posicioneoslogoacimadecadaumdoscomponentesTCombobox.Altereos
CaptionsdosLabelsparaMs/Ano(Incio)eMs/Ano(Fim).Adicioneainda
umTButton(btnGerarGrafico)dapaletaStandardealtereseuCaptionpara
GerarGrficos.
Concludaestapartedeconfiguraodosgrficosemontagemdatela,nosso
formdeverterumaaparnciasemelhanteFigura5.

Figura5.Aparnciadaaplicaoapsasconfiguraes.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

13/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

GerandogrficoscombaseemBD
Atomomentovimoscomocriargrficosmanualmenteecomvalorespr
definidos.Comooobjetivodonossoexemplogerarumgrficoapartirde
informaesobtidasemumabasededados,criamosumapequenaestrutura
emFirebird(Basedados.fdb).Noentrareiemdetalhesquantoacriaodo
bancopornofazerpartedoescopodesseartigo.Crieumbancodedados
seguindoastabelasdescritasnaFigura6,ousepreferirbaixeoBDdireto
dositedaDevMedianolinkdessaedio.

Figura6.Diagramadastabelasdabasedados

Nota:AbasededadospodersercriadaemqualquerSGBD.Parao
nossoexemplonecessrioapenasseguiraestruturadastabelas.

AdicioneaoformumcomponenteTSQLConnection(sqlConexao)dapaleta
dbExpresseconfigureumaconexocomanossabasededados.Na
seqnciaincluadoiscomponentesSQLQuerynomeandoosparaqryVendase
qryVendasFormaPagto,doiscomponentesDataSetProvider(dspVendase
dspVendasFormaPagto)emaistrscomponentesClientDataSet(cdsVendas,
cdsVendasFormaPagtoecdsAuxliar).Configureoscomponentesdaseguinte
forma:atribuasqlConexaoparaapropriedadeSQLConnectiondaqryVendase
qryVendasFormaPagto.ParaapropriedadeDataSetdodspVendascoloque
qryVendaseparaodspVendasFormaPagtocoloqueqryVendasFormaPagto.
ParaapropriedadeProviderNamedocdsVendasatribuadspVendaseparao

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

14/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

cdsVendasFormaPagtocoloquedspVendasFormaPagto.Dumduploclique
sobreocdsAuxiliarenoeditordecamposcliquecomobotodireitoe
selecioneNewFieldparacriarcinconovoscampos.Oscamposdeveroser:
MS(string),Ano(string),CARTAO(Float),CHEQUE(Float)eDINHEIRO
(Float).
Feitasasligaesentreoscomponentesdeacesso,vamosatribuiros
comandosSQLaoscomponentessqlVendasesqlVendasFormaPagto.Vamos
comearpelosqlVendasdigitandoemsuapropriedadeainstruoda
Listagem1.
Listagem1.InstruoSQLdesqlVendas
SELECT
SUM(IV.TOTAL_ITEM)SOMA,
EXTRACT(MONTHFROMV.DATA)MES,
EXTRACT(YEARFROMV.DATA)ANO
FROM
ITENS_VENDAIV
INNERJOINVENDASVON
IV.ID_VENDA=V.ID_VENDA
WHERE
EXTRACT(MONTHFROMV.DATA)>=:MES_INI
ANDEXTRACT(YEARFROMV.DATA)>=:ANO_INI
ANDEXTRACT(MONTHFROMV.DATA)<=:MES_FIM
ANDEXTRACT(YEARFROMV.DATA)<=:ANO_FIM
GROUPBY
EXTRACT(YEARFROMV.DATA),
EXTRACT(MONTHFROMV.DATA)

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

15/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

PercebaqueestamosselecionandoosdadosdastabelasItens_Vendae
VendasusandoumJoin.ApsadicionarocomandoSQLcliquenapropriedade
ParamsdaqryVendas,selecionetodososparmetrosqueforamcriadose
configureapropriedadeParamTypecomptInputeDataTypecomftInteger.
Emseguidacarreguetodososcamposdandoumduplocliquenocomponente
qryVendasedepoisselecionandoAddallFieldsaoclicarcomobotodireito
sobreoeditordecampos.Repitaosmesmospassosparacarregaroscampos
doClientDataSetcdsVendas.CliquecomobotodireitosobreocdsVendase
depoiscliqueemFetchParamsparacarregarosparmetrosparao
ClientDataSet.

Nota:NocomandoSQLdaqryVendasestamosselecionandoasoma
detodasasvendaseagrupandoasporAnoems.NaclusulaWhere
colocamosalgunsparmetrosparalimitaroperododapesquisa.
VamosagoraatribuirocomandoSQLqryvendasFormaPagto.Na
propriedadeSQLdocomponentedigiteaListagem2.
Listagem2.InstruoSQLdeqryvendasFormaPagto
SELECT
SUM(IV.TOTAL_ITEM)SOMA,
EXTRACT(MONTHFROMV.DATA)MES,
EXTRACT(YEARFROMV.DATA)ANO,
V.FORMA_PAGTO
FROM
ITENS_VENDAIV
INNERJOINVENDASVON
IV.ID_VENDA=V.ID_VENDA
WHERE
EXTRACT(MONTHFROMV.DATA)>=:MES_INI
ANDEXTRACT(YEARFROMV.DATA)>=:ANO_INI
ANDEXTRACT(MONTHFROMV.DATA)<=:MES_FIM
ANDEXTRACT(YEARFROMV.DATA)<=:ANO_FIM

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

16/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

GROUPBY
EXTRACT(YEARFROMV.DATA),
EXTRACT(MONTHFROMV.DATA),
V.FORMA_PAGTO

Agorapercebaqueainstruosemelhante,pormdessavezestamos
usandoocampoForms_Pagtoparaquepossamosselecionarosdados
agrupandoporformadepagamento.Naseqnciacarregueoscamposda
qryVendasFormaPagtoedocdsVendasFormaPagtoeconfigureosparmetros
damesmaformaqueconfiguramosaqryVendasecdsVendas.
Comnossoscomponentesdeacessoaosdadosconfigurados,vamos
implementarasrotinasparaageraodosgrficos.Nossoprimeiropasso
sercriarumarotinaparagerarogrficodeVendas.NaListagem3temos
ocdigocompletodoprocedimento.
Listagem3.CdigodarotinadegeraodogrficodeVendas
procedureTfrmChart.GerarGraficoVendas(pMesIni,pAnoIni,pMesFim,
pAnoFim:integer)
var
Valor:Double
Mes,
Ano:string
begin
ifcdsVendas.Activethen
cdsVendas.Close
cdsVendas.Params.ParamByName('MES_INI').AsInteger:=pMesIni
cdsVendas.Params.ParamByName('ANO_INI').AsInteger:=pAnoIni
cdsVendas.Params.ParamByName('MES_FIM').AsInteger:=pMesFim
cdsVendas.Params.ParamByName('ANO_FIM').AsInteger:=pAnoFim
cdsVendas.Open
chtVendas.Series[0].Clear
whilenotcdsVendas.Eofdo

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

17/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

begin
Valor:=cdsVendasSOMA.AsFloat
Mes:=NomeMes(cdsVendasMES.AsInteger)
Ano:=cdsVendasANO.AsString
chtVendas.Series[0].AddY(Valor,Mes+'/'+Ano)
cdsVendas.Next
end
end

Ocdigodoprocedimentobemsimples.Primeiroverificamosseo
cdsVendaestabertoe,casoesteja,ofechamos.Emseguidaatribumos
valoresaosparmetrosdocdsVendaeentooabrimoschamandoomtodo
Open.Limpamosassriesdogrficoparanaseqnciapercorreros
registrosdocdsVendaepassarosvaloresparaasriedochtVendaatravs
domtodoAddY.Temosaindadentrodolaoforumachamadafuno
NomeMesqueretornaonomeabreviadodomsconformeonmeroque
passadonoparmetro.VejanaListagem4ocdigodafunoNomeMes.

Listagem4.CdigodafunoNomeMes
functionTfrmChart.NomeMes(pNumMes:integer):string
var
aMes:array[1..12]ofstring
begin
aMes[1]:='Jan'
aMes[2]:='Fev'
aMes[3]:='Mar'
aMes[4]:='Abr'
aMes[5]:='Mai'
aMes[6]:='Jun'
aMes[7]:='Jul'

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

18/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

aMes[8]:='Ago'
aMes[9]:='Set'
aMes[10]:='Out'
aMes[11]:='Nov'
aMes[12]:='Dez'
Result:=aMes[pNumMes]
end
AfunoNomeMesformadaporarrayondecadaposioarmazenao
nomeabreviadodomscorrespondenteaonmerodaposionoarray.

Nota:perfeitamentepossvelpegaronomedomsabreviado
usandoomtodoFormatDateTime,pormemnossocasotemosapenaso
nmerodomseafunoFormatDateTimepedecomoprimeiroparmetro
umavarivelquecontenhaadatacompleta,ouseja,umDateTime.Alm
disso,afunoretornaonomedomsnalinguagemdosistema
operacional,resultandoemJan,Feb..Sep..Dec,casooWindowsesteja
ingls.

Parageraronossosegundogrfico,queexibirasomadasvendasdecada
msdivididasporFormadePagamento,deveremoscriarduasnovasrotinas:
MontarDataSeteGerarGraficoVendasFormaPagto.VejanasListagens5e6
ocdigocompletodosdoisprocedimentos.
Listagem5.CdigodoprocedimentoMontarDataSet
procedureTfrmChart.MontarDataSet
var
lFormaPagto:string
lMes,
lANo:integer
begin
lMes:=0
lANo:=0

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

19/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

cdsAuxiliar.Close
cdsAuxiliar.CreateDataSet
cdsVendasFormaPagto.Last
whilenotcdsVendasFormaPagto.Bofdo
begin
if(lMes<>cdsVendasFormaPagtoMES.AsInteger)or
(lANo<>cdsVendasFormaPagtoANO.AsInteger)then
begin
if(cdsAuxiliar.State=dsInsert)then
cdsAuxiliar.Post
lMes:=cdsVendasFormaPagtoMES.AsInteger
lANo:=cdsVendasFormaPagtoANO.AsInteger
cdsAuxiliar.Insert
cdsAuxiliarMES.AsString:=NomeMes(lMes)
cdsAuxiliarANO.AsString:=cdsVendasFormaPagtoANO.AsString
end
lFormaPagto:=cdsVendasFormaPagtoFORMA_PAGTO.AsString
if(lFormaPagto='CARTO')then
cdsAuxiliarCARTAO.AsFloat:=cdsVendasFormaPagtoSOMA.AsFloat
elseif(lFormaPagto='CHEQUE')then
cdsAuxiliarCHEQUE.AsFloat:=cdsVendasFormaPagtoSOMA.AsFloat
elseif(lFormaPagto='DINHEIRO')then
cdsAuxiliarDINHEIRO.AsFloat:=cdsVendasFormaPagtoSOMA.AsFloat
cdsVendasFormaPagto.Prior
end
if(cdsAuxiliar.State=dsInsert)then
cdsAuxiliar.Post
end
Listagem6.CdigodoprocedimentoGerarGraficoVendasFormaPagto
procedureTfrmChart.GerarGraficoVendasFormaPagto(pMesIni,pAnoIni,
pMesFim,

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

20/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

pAnoFim:integer)
var
Mes,
Ano:string
begin
ifcdsVendasFormaPagto.Activethen
cdsVendasFormaPagto.Close
cdsVendasFormaPagto.Params.ParamByName('MES_INI').AsInteger:=
pMesIni
cdsVendasFormaPagto.Params.ParamByName('ANO_INI').AsInteger:=
pAnoIni
cdsVendasFormaPagto.Params.ParamByName('MES_FIM').AsInteger:=
pMesFim
cdsVendasFormaPagto.Params.ParamByName('ANO_FIM').AsInteger:=
pAnoFim
cdsVendasFormaPagto.Open
MontarDataSet
chtVendasFormaPagto.Series[0].Clear
chtVendasFormaPagto.Series[1].Clear
chtVendasFormaPagto.Series[2].Clear
whilenotcdsAuxiliar.Eofdo
begin
Mes:=cdsAuxiliarMES.AsString
Ano:=cdsAuxiliarANO.AsString
chtVendasFormaPagto.Series[0].AddY(cdsAuxiliarCARTAO.AsFloat,
Mes+'/'+Ano)
chtVendasFormaPagto.Series[1].AddY(cdsAuxiliarCHEQUE.AsFloat,
Mes+'/'+Ano)
chtVendasFormaPagto.Series[2].AddY(cdsAuxiliarDINHEIRO.AsFloat,
Mes+'/'+Ano)
cdsAuxiliar.Next

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

21/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

end
end

NocdigodaListagem5nscriamosumDataSetfazendoumachamadaao
mtodoCreateDataSetdocdsAuxiliaredepoisinserimosregistrosnelecom
dadosobtidosdocdsVendasFormaPagto.OobjetivotermosnocdsAuxiliar
umDataSetondecadaregistroarmazeneoms,ano,somadasvendas
carto,chequeedinheiro.
Dentrodarotinafeitaumaverificaoparaqueacadamseanoseja
inseridoumnovoregistronoDataSet.ParaqueosregistrosnocdsAuxiliar
fossemgravadosemumaordemcronolgicacrescente,posicionamoso
cursornoltimoregistrodocdsVendasFormaPagtoedepoispercorremosos
registrosatoprimeiro.Entreaslinhasdecdigoforaminseridos
comentriosparafacilitaroentendimentodoprocedimento.
OcdigodaListagem6muitosemelhantearotinaGerarGraficoVendas
(Listagem3).Adiferenaquetemosumachamadarotina
MontarDataSeteaopercorrerosregistrosdocdsAuxliaratribumosos
valoresstrssriesdochtVendasFormaPagto.
Agoraquemontamososprocedimentosnecessriosparaageraodos
nossosgrficosvamosfazerachamadadessasrotinasnoeventoOnClickdo
botoGerarGrficos(btnGerarGraficos).Porm,antesdefazermosas
chamadasaosprocedimentos,armazenamosemvariveislocaisomseano
inicialefinalconformeosvaloresdoscomponentescmbMesIni,cmbMesFim,
edtAnoInieedtAnoFimedepoispassamosnosparmetrosdoprocedimento.
NaListagem7temosocdigocompletodobotoGerarGrfico.
Listagem7.CdigodoeventoOnClickdobtnGerarGrafico
procedureTfrmChart.btnGerarGraficoClick(Sender:TObject)
var
aMesI,
aMesF,
aAnoI,

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

22/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

aAnoF:integer
begin
aMesI:=cmbMesIni.ItemIndex+1
aMesF:=cmbMesFim.ItemIndex+1
aAnoI:=StrToIntDef(edtAnoIni.Text,2009)
aAnoF:=StrToIntDef(edtAnoFim.Text,2009)
GerarGraficoVendas(aMesI,aAnoI,aMesF,aAnoF)
GerarGraficoVendasFormaPagto(aMesI,aAnoI,aMesF,aAnoF)
end
Oquefazemosbemsimples,vejaquedeclaramosalgumasvariveispara
receberomseanoinicialefinalelogoemseguidachamamososgrficos
usandoosmtodosquecriamos,GerarGraficoVendase
GerarGraficoVendasFormaPagto.Executeoprogramaefaaumteste
clicandonobotoGerarGrficos.VejanaFigura7oaplicativoem
execuo.

Figura7.Aplicativoexemploemexecuo

Impressode2grficosnamesmapgina

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

23/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

Parafinalizaronossoexemplo,vamosconstruirumarotinaparaimpresso
dosdoisgrficosemumamesmapginasemousodeumgeradorde
relatrios.Issomesmo,usaremososmtodosdaUnitPrintersdoDelphi.
VejanaListagem8ocdigo.
Comomencionado,naListagem8fazemosusodogerenciadordeimpresso
Printersparaimprimirosgrficos.Declarenaprimeiraclusulausesdoform
aUnitPrinter.Primeiramentedefinimosaorientaodopapel(Horizontal),
emseguidadefinimosaspropriedadesdefontedottuloqueserimpresso
notopodapgina.NaseqnciafeitooclculodasmargensHorizontaise
Verticaisparaoposicionamentodosgrficos(umesquerdaeoutrodireita
napartesuperiordapgina).
Incluaumnovoboto(btnImprimir)noformenoeventoOnClickfaaa
chamadadoprocedimentoImprimircomoaseguir.Executeoprograma,gere
osgrficosefaaumtestedeimpresso.

Imprimir(chtVendas,chtVendasFormaPagto,'ExemploTChartDevMedia')

Listagem8.Rotinaparaimpressodosgrficos
procedureImprimir(pCht1,pCht2:TChartpTitulo:string)
var
tmpH:Longint
tmpW:Longint
tmpWMargin:Longint
tmpHMargin:Longint
OldOrientation:TPrinterOrientation
Tamanho:Longint
Inicio:Longint
begin
Screen.Cursor:=crHourGlass
OldOrientation:=Printer.Orientation
Printer.Orientation:=poLandscape

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

24/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

try
Printer.BeginDoc
try
Printer.Canvas.Font.Size:=11
Printer.Canvas.Font.Name:='Arial'
Printer.Canvas.Font.Color:=clNavy
Printer.Canvas.Font.Style:=[fsBold]
Tamanho:=Printer.PageWidth
Tamanho:=Round(Tamanho/2)
Inicio:=TamanhoRound(Printer.Canvas.TextWidth(pTitulo)/2)
Printer.Canvas.TextOut(Inicio,30,pTitulo)
pCht1.PrintResolution:=0
pCht2.PrintResolution:=0
tmpW:=Printer.PageWidth
tmpWMargin:=Round(5.0*tmpW/100.0)
tmpW:=tmpW2*tmpWMargin
tmpW:=tmpWdiv2
tmpH:=Printer.PageHeight
tmpHMargin:=Round(5.0*tmpH/100.0)
tmpH:=tmpH2*tmpHMargin
tmpH:=tmpHdiv2
pCht1.PrintPartial(Rect(tmpWMargin,tmpHMargin,
tmpWMargin+tmpW,tmpHMargin+tmpH))
pCht2.PrintPartial(Rect(tmpWMargin+tmpW,tmpHMargin,
tmpWMargin+2*tmpW,tmpHMargin+tmpH))
Printer.EndDoc
exceptonExceptiondo
begin
Printer.Abort
Printer.EndDoc
raise

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

25/26

20/07/2016

ArtigoClubeDelphiMagazine104UsandodadosdoBDparagerarGrficos

end
end
finally
Printer.Orientation:=OldOrientation
Screen.Cursor:=crDefault
end
end

Concluso
Vimosnesteartigocomopodemosapresentardeformaamigveledefcil
compreensoinformaesarmazenadasemumbancodedadosatravsda
geraodegrficos.Utilizandoamesmabasededadosdoexemplo,
poderamosaindageraroutrosgrficoscomo,porexemplo,umqueexibisse
asomadasvendasporformadepagamentodentrodeumperodosem
separlasporms.Umaalternativainteressanteseriaexibirumgrficocom
os10produtosmaisvendidosemumdadoperodo.Bom,ficaadicapara
quemquiserseaventurarnacriaodenovosgrficos.Abraoatodoseat
aprxima.

porRicardoScache
Delphinaveia(!)

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12087

26/26

Вам также может понравиться