OpenERP: Reportes

Bien aqui una de las cosas mas buscadas en el mundo de OpenERP y es que es algo complicado hacerlos por lo menos a mi me ha costado sudor y lagrimas conseguir información sobre este tema, la verdad he usado el Wizard que viene para trabajar con OpenOffice pero no me gusta, un Wizard debe de trabajar perfectamente o simplemente no usarse y en el caso del que viene para hacer reportes literalmente no me gusta y lo he desechado por completo, en su lugar me voy con mi Notepad++ y a editar el rml en texto plano pues lo primero a leerse la documentacion de rlm asi que a la madre de todos ReportLab y alli dos documentos muy bien explicados y documentados: RML for IdiotsRML User Guide con esos dos como base arranque a prender como funcionan los rml, y gracias a la lista de OpenERP Ecuador que colocaron este enlace al blog Experiencias con Software Libre he logrado hacer que  OpenERP imprimiera la factura en un formato preimpreso.

Vamos por lo inicial que reporte quiero modificar de OpenERP pues en mi caso eran las facturas y sabia que estaban en modulo Account, asi que me fui a la carpeta y saque una copia (siempre hago eso cuando voy a cambiar algo en OpenERP, la ubicacion del archivo fisico esta en “<Carpeta donde instalastes OpenERP>\Server\server\openerp\addons\account\report\account_print_invoice.rml” ), lo siguiente pues me puse a modificar el rml y como ya tengo alguna experiencia migrando modulos, se que los archivos como los rml’s y los xml’s no necesitan reiniciar el server para actualizarse, asi que como pureba tome uno de los ejemplos del documento (ese que se titula para idiotas) copie y pegue el codigo, mas cuando quise ver los resultados al imprimir la factura nada, seguia mostrando la que yo torpemente modifique con OpenOffice y reinicie el servidor y casi me pongo verde por que nada le hacia efecto, lo que pasa es que si usastes el Wizard de OpenOffice guarda el reporte en la base de datos y ni de vainas lo cambia, asi que quedan dos caminos lo primero que hice fui irme a la BD y borrar el contenido del campo (claro con una herramienta de terceros) la tabla es ir_act_report_xml y el campo report_rml_content_data pero luego encontre que se podia hacer desde la interface web de OpenERP y eso se hace desde Configuracion->Tecnico->Acciones->informes y alli le puse a buscar “invoice” alli me salio la factura y al editar pude ver que estaba marcada la casilla “Recargar como adjunto” la desmarque y me fui probar “Contabilidad-> facturas del cliente” abri una y le di “imprimir factura” FELICIDAD ahora si podia ver mis cambios ya con esto comence en serio a trabajar.

Ahora toca explicar un poco el archivo RML bien esto no son mas que archivos de tipo XML este archivo podemos dividirlo en tres partes la plantila, el diseño y el contenido la plantilla se define con la etiqueta <template></template>,  el diseño con la etiqueta <stylesheet> </stylesheet> y el cuerpo con la etiqueta <story></story>

La plantilla:

Lo primero el tamaño de la hoja se pone en la misma etiqueta que da inicio a la plantilla de esta manera <template title=”Invoices” pageSize=”(20.5cm,29.5cm)”> como ven lo maravilloso es que puede definirlo en centimetros.

Despue viene una subetiqueta que define la plantilla para la(s) pagina(s) y se define con <pageTemplate id=”first”> dentro de ella se debe definir al menos un frame, los frames son los contenedores del texto asi que si se quiere poner un texto en algun lugar del reporte se tiene que definir un frame, asi siempre y como minimo debe de existir un frame definido, pero en mi caso yo queria poner textos en diferentes posiciones y no dejar que fluya el contenido sino que lo queria poner exactamente en una posicion para que se imprimieran sobre el formato impreso asi que defini varios frames, uno por cada elemento de la factura preimpresa y uno mas para la tabla que mostraria el detalle de factura, asi el contenido de la etiqueta <template> quedo de esta forma:

<template title=”Invoices” pageSize=”(20.5cm,29.5cm)”>
<pageTemplate id=”first”>
<frame id=”cliente” x1=”1.5cm” y1=”23.5cm” width=”9cm” height=”1cm”/>
<frame id=”direccion” x1=”1.5cm” y1=”22.7cm” width=”9cm” height=”1cm”/>
<frame id=”ruc” x1=”1.5cm” y1=”22.2cm” width=”9cm” height=”1cm”/>
<frame id=”cod_vendedor” x1=”3.5cm” y1=”21.3cm” width=”9cm” height=”1cm”/>
<frame id=”fecha_dia” x1=”13cm” y1=”23.0cm” width=”0.7cm” height=”1cm”/>
<frame id=”fecha_mes” x1=”14.5cm” y1=”23.0cm” width=”4cm” height=”1cm”/>
<frame id=”fecha_anio” x1=”19cm” y1=”23.0cm” width=”1cm” height=”1cm”/>
<frame id=”num_guia” x1=”14.5cm” y1=”22.2cm” width=”5.5cm” height=”1cm”/>
<frame id=”con_vta” x1=”15cm” y1=”21.3cm” width=”5cm” height=”1cm”/>
<frame id=”tabla” x1=”-0.2cm” y1=”4.5cm” width=”19.3cm” height=”17cm”/>
<frame id=”subtotal” x1=”15.3cm” y1=”2cm” width=”3cm” height=”1cm”/>
<frame id=”igv” x1=”15.3cm” y1=”1.5cm” width=”3cm” height=”1cm”/>
<frame id=”total” x1=”15.3cm” y1=”1cm” width=”3cm” height=”1cm”/>
</pageTemplate>
</template>

Les puse un id relevante a loq ue van a mostar asi no me confundia, pero en este caso el orden es importante si no quieres llamrlos por su nombre como recomiendan en el post de la lista que mecione anteriormente, sino con nextFrame, pero eso ya es decision de cada uno, tambien pueden ver que se le da las cordenadas X y Y, el alto y ancho del frame, pero fijense bien, mi pagina media 29cm de largo y el frame etiquetado como “cliente” que es donde se debe mostrar el nombre del cliente o su razon social esta en posciosion Y=23.5 pues si en los RML se tiene que definir midiendo desde abajo pero eso no es todo sino que se tiene que tener en cuenta el alto que le pusiste en el height y restarlo para que asi se pueda mostrar donde se quiere, para prueba miren el que dice “tabla” tiene un alto de 17cm y una posicion en Y de 4.5cm asi que si lo sumamos nos da algo como 21.5cm y esa es la posicion contando desde abajo de la hoja donde se tiene que iniciar a mostrar el detalle de la factura.

La etiqueta de estilos

En esta etiqueta definimos el estilode nuestros parrafos y tablas, supongo que se pueden definir muchas cosas mas pero no las he tocado asi que no se como usarlas para las tablas se usa esta etiqueta

<blockTableStyle id=”Table7″>
<blockAlignment value=”LEFT”/>
<blockValign value=”TOP”/>
</blockTableStyle>

Como ven he definido un estilo llamado “Table7″ eso fue todo lo que defini, solo los alineamientos de la tabla, pero se pueden definir los bordes, los colores y muchas cosas mas en los dos documentos que nombre al inicio del posts esta muy bien explicadas y tampoco se como usarlas perfectamente tengo una idea pero hasta que no las ponga en practica mejor no dio nada, luego viene las definciones de los parrafos

<paraStyle name=”parrafo” rightIndent=”0.0″ leftIndent=”0.0″ fontSize=”8″ leading=”0″ alignment=”LEFT” spaceBefore=”0.0″ spaceAfter=”0.0″ fontName=”Helvetica” />

Esa es una definicion del estilod e un parrafo le doy un nombre y los demas valores se explican pos si solos salvo el de leading y es importante ya es como el padding del css osea le debes de poner un valor si quieres que tenga espacios arriba y abajo y en el caso de los textos colocados en posiciones fijas no lo necesitaba pero lo utilice en el detalle de la factura en fin el contenido de esta seccion quedo de esta forma:

<stylesheet>
<blockTableStyle id=”Table7″>
<blockAlignment value=”LEFT”/>
<blockValign value=”TOP”/>
</blockTableStyle>
<paraStyle name=”parrafo” rightIndent=”0.0″ leftIndent=”0.0″ fontSize=”8″ leading=”0″ alignment=”LEFT” spaceBefore=”0.0″ spaceAfter=”0.0″ fontName=”Helvetica” />
<paraStyle name=”parrafoR” rightIndent=”0.0″ leftIndent=”0.0″ fontSize=”8″ leading=”0″ alignment=”RIGHT” spaceBefore=”0.0″ spaceAfter=”0.0″ fontName=”Helvetica”/>
<paraStyle name=”parrafoT” rightIndent=”0.0″ leftIndent=”0.0″ fontSize=”8″ leading=”10″ alignment=”LEFT” spaceBefore=”0.0″ spaceAfter=”0.0″ fontName=”Helvetica”/>
<paraStyle name=”parrafoRT” rightIndent=”0.0″ leftIndent=”0.0″ fontSize=”8″ leading=”10″ alignment=”RIGHT” spaceBefore=”0.0″ spaceAfter=”0.0″ fontName=”Helvetica”/>
</stylesheet>

El contenido del reporte

Bien ya toca definir los datos, lo primero definir nuestro objeto para ello y siempre las primeras lineas deben de ser estas:

<para >[[ repeatIn(objects,’o’) ]]</para>
<para >[[ setLang(o.partner_id.lang) ]]</para>

Si estan definidas dentro de parrafos que en cristiano no son  otra cosa que lineas de texto en el reporte, todo texto o campo que quieras que salga en el reporte debe de ir entre ellos, esto dos primeros no tiene estilo por que se van a mostrar solo es para la referencia del objeto, asi se dice que vas a repetir esta seccion y vaz a crear un objeto llamado “o” y luego vaz con el idioma se fija que llama a una funcion setLang y como parametro le pone “o.partner_id.lang” pues alli esta asi se usa el objeto “o” el hace referencia los campos de nuestra clase en OpenErp en este caso es el de la factura y comienzo con los campos recuerden que les hable que queria hacer que los frames sigueran el orden en que los declare y ahora veran por que el orden es importante, caro nuevamente pueden llamar a los frames por su nombre en el momento que deseen pero si quieren seguir el orden en que se declararon lo hacen asi:

<para style=”parrafo”>[[ (o.partner_id and o.partner_id.title and o.partner_id.title.name) or ” ]] [[ (o.partner_id and o.partner_id.name) or ” ]]</para>
<nextFrame/>
<para style=”parrafo”>[[ display_address(o.partner_id) ]]</para>
<nextFrame/>

Destripemos eso un poco si ven la etiqueta <para> pues es la que define el incio de un parrafo o el incio de un texto, luego viene el estilo alli hago referencia a un estilo que defini en la seccion stylesheet y luego la madre del cordero nuevamente como poner un campo en el reporte pues lo primero siempre inicias con “[[” y terminas con “]]” luego podrias poner directamente el campo invocado desde el objeto “o” pero tambien puedes poner varios campos como en el nombre que si se fijan tiene la etiqueta “and” y la etiqueta “or” asi que puedes hacer compraciones loq ue ven le dice al reporteador que muestre el campo a y el campo b y sino pues no muestre nada ” or ” “, ahora a lo que me refira con lo del orden en la defincion de los frames la etiqueta <nextFrame> eso hace que el contenido (el siguiente para) salga en el frame siguiente, por que decidi usarlo pues si me equivoco en el orden solo muevo la cabera y no estoy metiendo la mano a la defincion de los campos que son mas delicados que el template y ya esta puedo definir todos mis valroes, no miento falta algo mas el detalle de la factura o el detalle de cualquier reporte como definirlo pues de esta forma:

<currentFrame name=”tabla”/>
<section>
<blockTable colWidths=”2.3cm,2cm,9.5cm,2.5cm,2.7cm” style=”Table7″>
<tr>[[ repeatIn(o.invoice_line,’l’) ]]
<td><para style=”parrafoRT”>[[ formatLang(l.quantity)]]</para></td>
<td><para style=”parrafoT”>[[ (l.uos_id and l.uos_id.name) or ” ]]</para></td>
<td><para style=”parrafoT”>[[ format(l.name) ]]</para></td>
<td><para style=”parrafoRT”>[[ formatLang(l.price_unit) ]]</para></td>
<td><para style=”parrafoRT”>[[ formatLang(l.price_subtotal, dp=’Account’) ]]</para></td>
</tr>
</blockTable>
</section>
<frameEnd/>

Fijense en esto he suado la mencionada etiqueta para llamar a un frame por su nombre e inicia con <currentFrame name=”tabla”/> y termina con <frameEnd/>, bien pero como en este caso era justo el frame que seguia en la defincion pero cuidado con mesclarlo con nextFrame en ordenes aleatorios pueden tener resultados muy desordenados, bien para que algo se repita en los reportes defines una seccion eso hace que el contenido sea independiente del contenido padre, ahora la defincion de la tabla recuerden que solo definimos cosas basicas y aun que se quiera definir los bordes y colores no se pueden definir en el estilo la cantidad de columnas, ni sus tamaños, asi que aqui lo hacemos y nuevamente podemos usar centimetros como medida base que es una verdadera maravilla imaginense definirlas en pixceles no acabos nunca pero ese es otro cantar ya con la cabecera de la tabla definida la estructura de la misma es como unatabla en HTML <TR>, <TD> bueno eso es sabido, pero con calma fijense en la defincion del TR al lado de el hay una etiqueta para poner campos de OpenERP pero no es un campo lo que nombro sino un nuevo objeto, el objeto para el detalle [[ repeatIn(o.invoice_line,’l’) ]] y lo que esta etiqueta de dice al reporteador es que se va a repetir esto y loq ue va a repetir son los objetos “invoice_line” del objeto “o” que era la cebecera de la factura y le ha llamado “l” por eso en todas las etiquetas internas de la tabla ya no se hace referencia al objeto “o” sino al objeto “l”.

Venga ya con esto termiando, vamos a meterlo en OpenERP pues sencillamente lo copiamos y sobreescribimos el original y a probar nuestra nueva factura, si todo ha salido bien generara el pdf como debe de ser.

Les dejo hasta aqui regresare como hacer que despues de generar un nuevo rml este se instale y se pueda imprimir desde openerp, en otras palabras crear reportes desde cero.

Acerca de

Antes que nada voy a dejar en claro algo, en este blog escribo como se me place, asi que no busquen errores de ortografia o de redaccion que los van a encontrar a montones y tampoco me critiquen o me digan nada sobre ellos pues no tengo intencion alguna de cambiarlos, lo que escribo lo dejo asi y no lo corrijo,claro esta a menos que sean lineas de codigo. Jorge Prado Anci, profesional en desarrollo de aplicaciones, en especial las dirigidas a bases de datos. He trabajado con VFP en casi todas sus versiones, se algo de Java (que no me gusta, es eso solo no me gusta, es bueno pero no me gusta), lo suficiente de PHP como para tener mi propio CMS(es que sigue sin gustarme por la capacidad de desorden que te permite este “lenguaje”), VB lo conoci y lo deteste tanto que lo olvide al punto de no querer adoptar ni por obligacion a su reemplazante VB .NET (por lo mismo de Java) y si C# este si me encanta y aun que conozco bastante bien el lenguaje, la verdad es que me falta mucho del Framework (del 100% estare en un 65%). Soy un apasionado por el orden (en los proyectos de desarrollo), de la programacion en capas (de MVC conozco pero no he aplicado mucho), los estandares y las condenadas pruebas unitaria. Venga creo que ya con esto fue suficiente.

Tagged with: , , , , ,
Publicado en OpenERP
18 comments on “OpenERP: Reportes
  1. […] del 2013: Con un post sobre como hacer reportes en OpenERP (una de las cosas mas buscadas y menos documetadas) inicié el mes y luego solo escribí otro post […]

  2. Capriatto dice:

    Esto me ha sido de mucha ayuda, muchas gracias y sigue escribiendo. Saludos desde Colombia.

  3. Joaquin dice:

    Buenas tardes excelente post.
    Una pregunta si quiero agregar por ejemplo la dirección de envío en la factura, ¿se puede hacer modificando el rml?
    Gracas

  4. xmeele dice:

    CLaro que se puede si el campo está contenido en el objeto principal piedes agregarlo [[ display_address(o.campodondestatudireccion) ]] en cualquier parte del informe.

  5. Joaquin dice:

    Gracias por la respuesta. El campo no esta en el objeto principal de la factura por defecto. Por eso no pude agregarlo. Existe otra solución ?

  6. Porque al hacer todo específicamente como lo hiciste me sale el siguiente error, me puedes ayudar? que hice mal o que mas tengo que hacer
    Uncaught SyntaxError: Unexpected end of input
    http://localhost:8069/?db=autotec&ts=1401233657024#id=4&view_type=form&model=account.invoice&menu_id=225&action=246:0

  7. Angel dice:

    Buenos dias,

    Me sirvió de mucho aun que tengo un problema.
    Yo instalé el base_report_designer y veo que no puedo llegar al punto de modificar todo a mi antojo.
    Entonces he intentado hacer algo con rml y siempre se me ve la plantilla antigua que hice con el openoffice…
    Tenéis alguna idea de como solucionarlo para que vuelva a coger siempre el archivo rml?

    Gracias

    • Heiderbp dice:

      Al editar pude ver que estaba marcada la casilla “Recargar como adjunto” la desmarque y me fui probar “Contabilidad-> facturas del cliente” abri una y le di “imprimir factura” FELICIDAD ahora si podia ver mis cambios,

      Eso esta en la explicacion. Probaste.

  8. MVL dice:

    Buen Post…Desde luego no hay prácticamente nada con respecto a los informes, lo poco es de la versión 6.
    Parto de que estoy “muy verde” en estos temas…y necesito mucha ayuda.
    Me descargué el modulo de base_report_designer.
    He creado un informe y lo tengo en el OpenERP pero ¿Como puedo hacer para que desde OpenERP pueda abrir un informe generado que no forma parte de las plantillas estandar (pedido, factura..) ? ¿Es solo viable la opción de OpenOffice para reports existentes propios de OpenERP??

    Que me recomiendas para generar nuevos informes y consultarlos desde OpenERP??

    Gracias de antemano

  9. Hernan dice:

    Como cambiaría el formato al guardar el pdf. Por ejemplo para que salga así: Presupuesto_SO020.pdf

  10. Maelcoc dice:

    Hernan en el rml en el encabezado debes tener un campo llamado , es aquí donde le das el nombre al archivo.

  11. Maelcoc dice:

    el campo es document filename=”Presupuesto_SO020.pdf”, no se porque no se ve en el comentario anterior.

  12. claudia dice:

    xmeele oye como creo una plantilla en odoo (openERP). contesta porfa

  13. Benjamin Acevedo dice:

    HOLA , ANTES QUE NADA GRACIAS POR EL APORTE,, ESTA BIEN ESTRUUCTURADO,, UNA COSA,, AL MOMENTO DE MODIFICAR UN LAYOUT DE COTIZACION(OPENOFFICE) QUIERO QUE SALGA EN MI IMPRESION LOS CONTACTOS DE LA EMPRESA, SON DE TIPO child_ids,, no logro que aparescan en mi impresion,, un dato o sugerencia ,,, saludos

  14. Hernan dice:

    Gracias Maelcoc, ya ubiqué donde cambiarle el nombre, pero como hago para jalar el número de la factura que eestoy generando algo así: Presupuesto_SO%N.pdf donde %N es el número de la factura.

  15. HErnan dice:

    Hola! Otra consulta, necesito colocar el día, mes y año por separado, como puedo hacer? me sale siempre junto.

  16. Yaser dice:

    Hola, me pudieran decir como ponerle el numero a las paginas de un reporte en pdf, lenguaje RML para Odoo (OpenERP 8.0).
    Gracias de antemano. Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 441 seguidores

Blog Stats
  • 304,137 hits
A %d blogueros les gusta esto: