Sie sind auf Seite 1von 27

El editor de informes Report Manager (1)

PeseaquenoesungeneradordeinformesmuyconocidoenelmundoDelphi,esteeditordeinformes destacaporsusencillez(estenespaol)yquesobretodoesgratuito. SienalgoaventajaaQuickReportesenquepermitegenerarlosinformesenarchivosconextensinREP paraluegosercargadosdesdeDelphieinclusopodemosmodificarlosentiempodeejecuci n.Tampocoda lasexplosionesqueocasionaeleditorRavecuandoteequivocas,aunquehayquereconocerqueesun pocoraroenalgunascosas. DESCARGANDOELEDITOR Puededescargarsedeestapginaweb: http://reportman.sourceforge.net/indexes.html

DentrodelapartadoDescarganosllevaraotrapginadeSourceForgedondeseencuentralaversin2.9a

Loqueocurreesquesolonosbajamoseleditorytambinnecesitamosloscomponentes.Paraello pulsamosenlamismapginawebelbotnViewallfilesydescargamosestearchivo repporman_delphi_builder_2_9.zip:

INSTALANDOELEDITOR LaventanadeinstalacinpermiteelegirelidiomaespaolysolohayqueirpulsandoelbotnSiguiente:

INSTALANDOLOSCOMPONENTES CreamosunacarpetallamadaReportManagerdentrodelacarpeta: \CodeGear\RADStudio\5.0\Componentes\ Ydescomprimimosdentrodelamismaelarchivoquehemosdescargado: Repporman_delphi_builder_2_9.zip NosvamosaDelphiyabrimoselarchivorppack2007.groupproj:

VeremosestospaquetesenlapartederechadeDelphi:

Pulsamoselpaqueterppack_del2007.bplconelbotnderechodelratnyseleccionamosInstall:

Consolohacerestoseinstalartodo.Sitodohaidocorrectamenteveremosestoenlapaletade componentes:

Pasemosaverelentornodetrabajodeesteeditor.

ELASPECTODELEDITOR Alejecutarporprimeravezeleditordeinformesvemosqueaparececompletamentepelado:

PulsamoselbotnNuevoymostraresteaspecto:

Lomejordetodoesqueseencuentraennuestroidioma.Dentrodeleditorpodemosdistinguirestaspartes: Barradeherramientassuperior

Contienelastpicasopcionesdeabriroguardararchivos,mostrarlavistaprevia,etc.Yabajotenemoslos iconosparainsertarcomponentes:etiquetas,camposvinculadosatablas,formasgeom tricas,dibujosy cdigosdebarras.Yairemosviendodetenidamentecadaunodeellosseg nlosnecesitemos. Estructuradelinforme

Aquvemoslasbandasdelasquesecomponeelinforme.Siseleccionamosporejemploel Detalle mostrarabajoelinspectordeobjetosconsuspropiedades.Asuladotenemoslapesta aDatosdonde veremoslasvariablesglobalesquepodemosutilizar:

Lazonadetrabajo

Aquesdondeiremoscolocandocomponentesparacrearelinforme.Noosdejisengaarporlasimpleza deesteeditor,yaquecomoveremosmsadelantesepuedencrearinformesavanzadosporprogramacin interceptandoentiemporealloscomponentesaligualquehacemosconQuickReport. CREANDOUNINFORME Paraprobarquetodohaidobien,vamosacrearunpequeoinformeapartirdeunabasededatosde InterbasequecontieneunatabladeCONTACTOS.Loprimeroquetenemosquehaceresestablecerla fuentededondevanavenirlosdatos.Lavinculacinconelorigendedatosesotracaractersticaalgorara queconfundeporsusmltiplespantallas. SeleccionamosenelmensuperiorlasopcionesInformeConfiguracindedatos:

Yaparecerestaventana:

SeleccionamosInterbaseExpressqueequivalerealmenteaunaconexinDBExpressalpulsarelbotn Configurar:

AqutraecomoejemplolaconfiguracinaunabasededatosInterbasecuyaconexinDBExpressest configuradadentrodeDelphi7,peroloquevamosahacerescrearunanuevaconexi npulsandoeste botn:

EnelnombredelaconexinleponemosAGENDA:

Entoncesvolveralapantallaanterioryconfiguramosdondeseencuentralabasededatos:

NohayqueolvidarponerlapropiedadSQLDialecta3.Probamoslaconexinpulsandoelbotn:

Acontinuacinnospediridentificarnos:

Ysitodohaidobiennosdiresto:

Volvemosalaprimerapantallayseleccionamoslaconexinquehemoscreado:

Loaadiralalistadeconexionesdisponibles:

AhoranosvamosalapestaaConjuntodedatosdelinformeparaelegirlastablasdelaquequeremos sacarlainformacin:

PulsamoselbotnNuevoconjuntodedatosylollamamosCONTACTOS:

Laventanacambiaraestaotra:

EscribimoslasentenciaSQLdelosdatosquenosvamosatraer:

PulsamosAceptaryalvolveraleditorveremosenlapestaaDatoslatablaquehemosvinculado:

ParanoperderlaconfiguracinguardamoselinformeconArchivoGuardarcomoContactos.rep. Comoloquequierodisearesunlistado,tenemoselproblemadequesolotenemoslabandadedetalle. Parainsertarlabandadelacabeceraseleccionamos InformeAadirCabeceradepgina.Yatenemos lasdosbandas:

Vamosapulsaresteiconoparaaadirunaetiquetaalinforme:

Unaveztenemoslaetiquetaseleccionadanosvamosalaizquierdaalinspectordeobjetosyenla propiedadtextoescribimosLISTADODECONTACTOS:

Unadelascosasrarasquehaceesteeditoresquealinsertarunaetiquetaledaunanchurayalturamuy pequea.Tenemosqueestirarlasiempre.Ascreamoselrestodeetiquetas:

ParacopiaretiquetasnopodemosutilizarlacombinacindeteclasCTRL+CyCTRL+V,hayquehacerlo conALT+CyALT+V.Estaestambinunacaractersticaalgorara. Ahorainsertamosloscamposarrastrndolosdesdelapestaadedatosalabandadeldetalle:

Asquedaradespusdeinsertarlos:

Pulsamoselbotndevistapreviaparaverelinforme:

Aquencontramoselprimerinconveniente:

ParaqueselistentodoslosregistrostenemosquevincularlatablaCONTACTOSalinforme.Paraellonos vamosalapestaaEstructurayenlapropiedadCon.D.PrincipalseleccionamosCONTACTOS:

Ahorasisalebien:

EnelprximoartculoveremoscomocargaresteinformedesdenuestroproyectodeDelphias como exportarloaPDFyotrosformatos.Tambinveremosotrosformatosmsavanzadoscomounafactura.

El editor de informes Report Manager (2)


Continuandoconestediscretodiseadordeinformes,vamosavercomoabrirelinformedesdenuestro proyectoenDelphi,haciendoquemuestrelavistapreviaoexportndoloaotrosformatoscomoPDF,TXTo HTML.Tambinveremoscomocrearunafacturaquerecogedatosdevariastablas. ABRIENDOELINFORMEDESDEDELPHI Continuandoconellistadodecontactosquecreamosenelart culoanterior,vamosacrearunnuevo proyectoenDelphiconesteformulario:

Parapoderrealizarlaspruebasnecesitamosaadirlos componentesVCLReportyPDFReportqueseencuentranenelapartadoReportmandelapaletade componentes. AlpulsarelbotnImprimirpodemosrealizarunavistapreviasiestactivadoelcheckboxobienlanzarlo directamentealaimpresora: procedure TFContactos.BImprimirClick(Sender: TObject); begin VCLReport.Title := 'Listado de contactos'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'contactos.rep'; VCLReport.Preview := VistaPrevia.Checked; VCLReport.Execute; end;

Seasumequelarutadelinformecontactos.repseencuentraenlamismacarpetaqueelejecutable.Sino esas,modificarlapropiedadFilenamecomocorresponda(lomejoresconfiguraloenunarchivoINI). ParaexportareldocumentoaPDFpodemoshacerlodedosformas.Obienutilizamoselcomponente PDFReport(recomendado): procedure TFContactos.BExportarPDFClick(Sender: TObject); begin // Mtodo 1 PDFReport.Title := 'Listado de contactos'; PDFReport.Filename := ExtractFilePath(Application.ExeName) + 'contactos.rep'; PDFReport.PDFFilename := ExtractFilePath(Application.ExeName) + 'contactos.pdf'; PDFReport.Execute; Application.MessageBox(PChar('Listado exportado correctamente:' + #13 + #13 + PDFReport.PDFFilename), 'Exportando', MB_ICONINFORMATION); end;

ObienelcomponenteVCLReport: procedure TFContactos.BExportarPDFClick(Sender: TObject); begin // Mtodo 2 VCLReport.Title := 'Listado de contactos'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'contactos.rep'; VCLReport.SaveToPDF(ExtractFilePath(Application.ExeName) + 'contactos.pdf'); Application.MessageBox(PChar('Listado exportado correctamente:' + #13 + #13 + ExtractFilePath(Application.ExeName) + 'contactos.pdf'), 'Exportando', MB_ICONINFORMATION); end;

SielautorhacreadoelcomponentePDFReportsusrazonestendr.Tambinpodemosexportarloauna pginawebHTMLdeestemodo: procedure TFContactos.BExportarHTMLClick(Sender: TObject); begin VCLReport.Title := 'Listado de contactos'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'contactos.rep'; VCLReport.SaveToHTML(ExtractFilePath(Application.ExeName) + 'contactos.html'); Application.MessageBox(PChar('Listado exportado correctamente.' + #13 + #13 + ExtractFilePath(Application.ExeName) + 'contactos.html'), 'Exportando', MB_ICONINFORMATION); end;

Laexportacinquehaceesbastantedecente:

AunqueEurekaLogmehadetectadoun falloenunprocedimientodeReportManagerquenoliberamemoria:

Habrquehaceralgoms? Exportarelarchivoatextoesalgosimilar:

Porlovistonoliberaelobjetopdfdriver.

procedure TFContactos.BExportarTXTClick(Sender: TObject); begin VCLReport.Title := 'Listado de contactos'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'contactos.rep'; VCLReport.SaveToText(ExtractFilePath(Application.ExeName) + 'contactos.txt'); Application.MessageBox(PChar('Listado exportado correctamente.' + #13 + #13 + ExtractFilePath(Application.ExeName) + 'contactos.txt'), 'Exportando', MB_ICONINFORMATION); end;

Hayquereconocerqueaqunopuedehacermaravillas:

Tambinleocurrequenoliberaeste objeto:

Aunas,ambasexportacionesfuncionan bastantebien.Vamosconalgomsdifcil.

CREANDOELINFORMEDEUNAFACTURA SupongamosquetenemosunabasededatosdeInterbasellamada facturacin.gdbquetienelatablade CLIENTES(clicparaampliar):

Tambintenemoslatablade ARTICULOS:

Yparalacabeceradelafacturaestala tablaFACTURAS:

YluegoestalatablaDETALLEparasu contenido:

NosvamosaleditorReportManager, creamosunnuevoinformeyloguardamosconelnombrefactura.rep.Comosolotenemoslabandade detalle,tenemosqueseleccionarInformeAadirCabeceradepginaeInformeAadirPiede pgina. Vamosacomenzarporlacabecera.Enlaparteizquierdadelamismavamosmetiendoetiquetas( Insertar textoesttico)paraponerlosdatosdenuestraempresa:

Parapoderescribireltextoenunaetiquetatenemosquerellenarlapropiedad Textodelinspectorde objetos:

Yparaseleccionareltamaodelafuenteyelestilo(negrita,cursiva, subrayado)utilizamoslaspropiedadesqueseencuentranenlapesta aTexto:

Alfinalteacostumbras,peronohubiesevenidomalunabarradeestilosde fuentealestiloMicrosoft.Ahoravamosainsertarellogotipodelaempresautilizandoelbot n:

Esconvenientequeellogotiposeencuentrelamismacarpetaqueelarchivo factura.rep.Parainsertar ellogotipoledamosaesebotnyabrimosunrectnguloenelinforme:

Teniendolaimagenseleccionada,nosvamosalinspector deobjetosyhacemosclicsobrelapropiedadImagen:

Elegimoslaimagenyluegolaajustamosunpoco:

CONFIGURANDOELORIGENDEDATOS Ahoravamosacomenzaraenlazardatosdetablas.Loquenecesitamosesseleccionarlabasededatosy crearlasconsultasdecabeceraydetalledelafactura. Lospasosparatraernoslainformacinsonlossiguientes: 1.SeleccionamosInformeConfiguracindedatos. 2.SeleccionamosInterbaseExpress. 3.PulsamoselbotnConfigurar. 4.AhorapulsamoselbotnAadeunaconexin 5.Nombredelaconexin:FACTURACION. 6.Configuramoslabasededatoscomohicimosenelart culoanterior:

7.PulsamoselbotnActivarlaconexin seleccionadaycomprobamossiconectacorrectamente. 8.Unavezestablecidalaconexin,cerramosestaventanayaadimoslaconexinreciencreadaenla ventanadondeestamos:

9.NosvamosalapestaaConfiguracinde datosdelinformeypulsamoselbotnNuevoconjuntodedatos. 10.Nombredelalias:FACTURAS. 11.LeponemosdeSQL: SELECT FACTURAS.*,CLIENTES.NOMBRE AS NOMBRE, CLIENTES.DIRECCION AS DIRECCION, CLIENTES.POBLACION AS POBLACION, CLIENTES.PROVINCIA AS PROVINCIA, CLIENTES.CP,CLIENTES.CIF FROM FACTURAS LEFT JOIN CLIENTES ON FACTURAS.IDCLIENTE=CLIENTES.ID WHERE ID=1

SipulsamoselbotnMostrardatosnosmostrarlaprimerafactura(soloparaverquelaSQLescorrecta):

Despusdeterminarlaspruebashay quequitarlelacondicinWHERE. 12.IgualmentevamosaaadirlatablaDETALLE: SELECT DETALLE.*,ARTICULOS.NUMERO, ARTICULOS.NOMBRE FROM DETALLE LEFT JOIN ARTICULOS ON ARTICULOS.ID=DETALLE.IDARTICULO

LastablasdeclientesydeartculosnonecesitamostraerlasyaquelashemosvinculadoconLEFTJOINa lasconsultasdeFACTURASyDETALLE. 13.PulsamoselbotnAceptaryyapodemosvolveralinformeparaaadircampos.

MOSTRANDOLOSDATOSDELCLIENTE Paraenmarcarlosdatosdelclienteaadimosundibujosimpleconelbotn:

Locolocamosmsomenosas:

clientearrastrandoelcampoNOMBREdesdelapestaaDatos:

Ahoravamosatraernoselnombredel

Asnostraemoselrestodedatos:

Siencualquiermomentoosequivocisdecampo ocomponenteyqueriseliminarlo,hayqueseleccionarelcampoypulsarCTRL+SUPR. Utilizandounaetiquetayuncampo,vamosaponerdebajodellogoelndefacturaylascabecerasdel detalle:

Osrecuerdoqueparacopiarcampos hayqueutilizarlacombinacindeteclasALT+CyALT+V. CREANDOELDETALLEYELPIEDELAFACTURA EldetalledelafacturayatienetodossuscamposenlatablaDETALLEporquehemosvinculadoconLEFT JOINelnmeroynombredelartculoquenoshacafalta:

Paraqueaparezcantodaslaslneasde detalledebemosvinculartodoelinformealatabladedetalle.Estosehac aseleccionandolatabla DETALLEalinforme:

Elpieestodavamssencillo.Solohayquetraerselabaseimponible,el importedelIVAyeltotaldelafactura:

Antesdeterminar,necesitamosfiltrareldetalleparaquenosalgaeldetalledetodaslasfacturas,s lodebe salireldetalledelafacturaqueestamosimprimiendo.Paraelloseleccionamoslabandadeldetalleyensu propiedadCondic.Impresinescribimos: DETALLE.IDFACTURA=FACTURAS.ID Simostramoslavistapreviadelafacturadebesaliresto:

Perocomotodossabemos,siemprenos obliganaaadircosasrarasenlafacturacomoimgenesentiemporeal,mostrardatosdecamposqueno existenocolorearlafuentesegnciertascondiciones.Esoloveremosenelsiguienteart culo. PruebasrealizadasenRADStudio2007.

18 junio 2010
El editor de informes Report Manager (3)
Continuandoconlafacturadelartculoanterior,vamosadarleformatoalosnmerosrealesyamodificarsu comportamientoentiemporealdesdeDelphi.TambinveremoscomoenviarparmetrosSQLdesdeDelphi alinforme. AJUSTARLOSDECIMALES AntesdecargarelinformeennuestroproyectodeDelphivamosatratardeadecentarlounpoco comenzandoporeldetalledeldocumento.Loprimeroqueapreciamosesqueeln merodedecimalessale comoledalagana:

Paradarformatoadosdecimalesseleccionamoslos camposPRECIO,PORIVA,IVAyTOTALLINEAyensupropiedad Formatoleponemos###,##0.00:

Ahorasisalecomonosotrosqueremos:

Lomismotenemosquehacerconlostotalesdel documento. MODIFICARELINFORMEENTIEMPOREAL UnadelascosasquesiempremehagustadodeQuickReportestenerlaposibilidaddemodificarentiempo realloscomponentesdelinformejustoantesdeenviarloalaimpresora. VamosaverloconunnuevoproyectoenDelphiconelformularioquevaaimprimirlafactura:

Aligualqueelejemplodeloscontactostenemosel componenteVCLReportqueconfiguramosalpulsarelbotnImprimir: procedure TFImprimirFactura.BImprimirClick(Sender: TObject); begin VCLReport.Title := 'Factura'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'factura.rep'; VCLReport.Report.Copies := StrToInt(NumCopias.Text); VCLReport.Preview := VistaPrevia.Checked; VCLReport.Execute; end;

Tambincontrolamoselnmerodecopiasdequeseimprimensegnloquetenemospuestoenelcampo NumCopias.Unamodificacinquelevamosahaceresqueimprimaenrojoyennegritaaquellosprecios superioresa1.000.EstolohacemoseneleventoBeforePrint(antesdeimprimir)delcomponente VCLReport: procedure TFImprimirFactura.VCLReportBeforePrint(Sender: TObject); var i: Integer; begin with VCLReport.Report do begin if FindComponent('TRpExpression9') is TRpExpression then begin if (FindComponent('TRpExpression9') as TRpExpression).IdenExpression.Value > 1000 then begin (FindComponent('TRpExpression9') as TRpExpression).FontColor := clRed; (FindComponent('TRpExpression9') as TRpExpression).FontStyle := 1; end; end; end; end;

ParapoderaccederalaclaseTRpExpressiondebemosaadirlaunidadrplabelitemalformulariodonde vamosaimprimir.Elnombrequebusco(TRpExpression9)noslodiceelmismoeditor:

Loquehacemosesinterceptarlojusto antesdeimprimirloysegnelvalorquevaaimprimirtomamoslaaccinquequeramos:

LoscomponentesdeReportManagertienenla propiedadVisibleperoaunquelaactivemosnohacennicaso.Asquesiquiereshacerdesaparecerun componenteeligeelcolorblanco: (FindComponent('TRpExpression9') as TRpExpression).FontColor := clWhite;

Estopuedesermuyinteresanteparamostraruocultarciertasetiquetasseg nlaspropiedadesdelafactura. Porejemplo,segnlaformadepagoalomejormeinteresamostrarlaetiquetadequesehapagadoal contado:

Comoantesdeimprimirlafacturayasabemossidebemosimprimir estaetiquetaono,podemoshacerlainvisiblesinutilizareleventoBeforePrint: procedure TFImprimirFactura.BImprimirClick(Sender: TObject); begin VCLReport.Title := 'Factura'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'factura.rep'; VCLReport.Report.Copies := StrToInt(NumCopias.Text); VCLReport.Preview := VistaPrevia.Checked; if not Contado.Checked then with VCLReport.Report do if FindComponent('TRpLabel14') is TRpLabel then (FindComponent('TRpLabel14') as TRpLabel).FontColor := clWhite; VCLReport.Execute; end;

SinoestactivadoenlafacturaelCheckBoxdeContadoentonceslohacemosinvisible.Parahacerla invisibletambinlepodemosquitarleeltexto: if not Contado.Checked then with VCLReport.Report do if FindComponent('TRpLabel14') is TRpLabel then (FindComponent('TRpLabel14') as TRpLabel).Text := '';

Deestemodopodemoscontrolarsiseimprimenonolascuentasbancarias,losdistintostiposdeIVA,los recargosdeequivalenciaolasretenciones.AunqueReportManagertienebuenasfuncionesparaevaluar expresiones,nohaynadacomoDelphiparameterlemanoalosdocumentos. ENVIARPARMETROSALINFORME

Tambinpodemosenviarparmetrosformalmentealinformecreandoparmetrosenelmismo.Estosehace seleccionandolasopcionesInformeConfiguracindedatosyenelformularioqueaparecepulsamosel botnParmetros:

Seabrirestaventana:

PulsamoselbotnAadirunnuevo parmetroycomoqueremosenviarlelacuentabancarialeponemosdenombre CCC:

PulsamosAceptaryotravezAceptar enlaventanaanterior.Ahoravamosacrearunaexpresinalpiedelafacturaquerecojaelvalordeeste parmetro:

Paramandarleelparmetroalimprimir desdeDelphihacemosesto:

procedure TFImprimirFactura.BImprimirClick(Sender: TObject); begin VCLReport.Title := 'Factura'; VCLReport.Filename := ExtractFilePath(Application.ExeName) + 'factura.rep'; VCLReport.Report.Copies := StrToInt(NumCopias.Text); VCLReport.Preview := VistaPrevia.Checked; VCLReport.Report.Params.ParamByName('CCC').AsString := '1234-5678-441234567890'; VCLReport.Report.PrepareParamsBeforeOpen; VCLReport.Execute; end;

DebemosllamaralmtodoPrepareParamsBeforeOpenparaqueelinformesechupelosparmetrosque lemandamos:

Peroesqueademspodemosutilizar losparmetrosparacambiarlascondicionesdelaSQLdelatabla.Vamosacrearunpar metroparael detalledelafacturallamadoPRECIOMINIMOparaquemuestresloaquellaslneasdedetallecuyoprecio rebaseelquelepasamoscomoparmetro:

AhoramodificamoslaSQLdeldetalledeeste modo: SELECT DETALLE.*,ARTICULOS.NUMERO, ARTICULOS.NOMBRE FROM DETALLE LEFT JOIN ARTICULOS ON ARTICULOS.ID=DETALLE.IDARTICULO WHERE PRECIO >= :PRECIOMINIMO

Siintentamoshacerlavistapreviaenelinformenosdiresto:

Paraprobarquevayabien,entramosde nuevoalparmetro,loponemosdetipomonedayconelvalor20:

Alhacerlavistapreviasolomostrarlaslneasde detallecuyoprecioesmayorde20:

EnDelphilepasamoselparmetrocomohemos vistoantes: VCLReport.Report.Params.ParamByName('CCC').AsString := '1234-5678-441234567890'; VCLReport.Report.Params.ParamByName('PRECIOMINIMO').Value := 20; VCLReport.Report.PrepareParamsBeforeOpen; VCLReport.Execute;

AunqueReportManagerpuedapareceruneditordeinformesalgosimplealprincipio,conformevamos profundizandoensusdetallesvemosquepodemoshacercosasbastantepotentes.Elpr ximoartculo veremoscomorealizarinformesavariasbandasycomosumarelcontenidodevariasdeellas.

Das könnte Ihnen auch gefallen