martes, 9 de junio de 2009

Usando OpenOffice para hacer listados (I)

5 comentarios
 
KMKey dispone de un sistema de fabricación de listados poco habitual, pero muy útil. Se trata de confeccionar los listados o documentos generables usando OpenOffice, e incorporar dentro del documento, con el mismo OpenOffice, sentencias XML/python que permiten su dinamización y combinación con los datos de la aplicación. El resultado final puede obtenerse en el mismo formato OpenOffice, en PDF o en formato MS/Office (doc / xls), gracias a las capacidades que OpenOffice nos ofrece.

La forma de combinar datos puede variar en función de la configuración de schemas que tengamos en ZODB o en SQL (hay una entrada sobre este tema en este mismo blog). En general, los documentos generables afectan datos de un sólo expediente, por lo que pueden abordarse sin problemas usando datos via ZODB, lo que los hace más genéricos y reusables. En cambio, los listados que se obtienen sobre un filtro de expedientes pueden manejar volúmenes importantes de datos, y suele valer la pena tener los schemas implicados en SQL y usar sentencias SQL para la recuperación de datos.

En este primer capítulo, vamos a dar un breve repaso a las sentencias XML disponibles, y en capítulos posteriores abordaremos cómo realizar la instalación de los listados, o las expresiones python de uso más frecuente.
  • <define nombre_variable expresion_python /> Sirve para definir variables que vamos a usar posteriormente. La expresión python puede ser una llamada a un método, una llamada a una setencia SQL a través de un conector, o simplemente un tratamiento de datos python. Por ejemplo, para obtener el proyecto dentro de un documento generable, podemos usar <define proyecto self.getContent().getKMProject() />
  • <content expresion_python />Escribe texto en el documento. El texto escrito, óbviamente, es el resultado de evaluar la expresión python. Puede ser un nombre de variable, un método, un atributo de un objeto, etc. Siguiendo con el ejemplo anterior, para escribir el título del proyecto usaríamos <content proyecto['Title']() />
  • <date expresion_python /> Igual que content, pero se espera que el resultado de la expresión python se corresponda con una fecha del tipo DateTime. Sólo es necesario usarla si estamos generando hojas de cáculo y queremos que el tipo de datos resultante sea una fecha, si nos vale con que sea string se puede usar content perfectamente.
  • <float expresion_python /> Exactamente lo mismo que el caso de las fechas, pero con los tipos de datos numéricos. Del mismo modo, sólo tiene sentido para generar hojas de cálculo
  • <image expresion_path_imagen /> Si la expresión python devuelve un path de imagen, ésta se incorpora en el documento generado
  • <repeat nombre_variable expresion_python > ... </repeat>. Realiza un bucle sobre la expresión python, asignando nombre_variable en cada iteración. Para que funcione adecuadamente, debe situarse en una hoja de cálculo, o en una tabla si estamos en el procesador de textos, de otra forma el sistema no es capaz de llevar a cabo el bucle de construcción del documento
  • <if expresion_python > ... </if>. Sólo ejecuta el interior del condiciona si la expresion python devuelve un valor True. Igual que en el caso del repeat, debe usarse en una hoja de cálculo o en una tabla
  • checkboxs. Para generar checkbox activos o inactivos, se puede activar el modo formulario de OpenOffice y definir como nombre de campo del chekbox una variable. Si esa variable se encuentra definida y vale True, entonces el checkbox aparecerá marcado. En caso contrario, aparecerá desmarcado.

5 Responses so far.

  1. Que bueno... estaría aún mejor si pudieras colgar algun ejemplo. Cuando puedas, cuelga uno como para verlo

  2. +1 Un ejemplo estaria magnifico

  3. Explicamos como generar un Informe de este tipo, un ejemplo muy sencillo y práctico, vamos a generar un documento que recupera datos de consulta contra la ZODB.

    En primer lugar generaremos una plantilla .sxc, en el contenido de la misma insertamos las sentencias descritas más abajo, posteriormente analizaremos para qué sirve cada una de ellas:



    Listados de Descargas de Documentos



    Fecha del informe:

    Título / Usuario / Versión / Fecha





    1) En la parte superior de nuestra plantilla incluimos el logo de nuestra aplicación, para ello:


    La sentencia muestra en pantalla el gif asociado en nuestro portal_skins

    2) Esta sentencia es la más importante de la plantilla, ya que define la variable rows que contendrá el conjunto de registros consultados de la tabla contra la que estemos consultando los datos, mediante una consulta a nuestra ZODB.



    "
    Utilizamos un método definido en nuestra View que formatea y printa la fecha actual

    4) Incluimos la sección de cabecera de nuestra tabla de resultados:

    Título / Versión / Fecha

    5) Y finalmente insertamos la sentencia para mostrar resultados (contenido de row), que es la selección de registros recuperada por nuestra sql.





    Con estamos printando el campo Título del registro actual

    Como veis es muy fácil crear un Informe que muestre resultados en KMKey

  4. Este comentario ha sido eliminado por el autor.
  5. Un ejemplo muy sencillo y práctico, vamos a generar un documento que recupera datos de consulta contra la ZODB.

    En primer lugar generaremos una plantilla .sxc, en el contenido de la misma insertamos las sentencias descritas más abajo
    , posteriormente analizaremos para qué sirve cada una de ellas:


    <image object="here.portal_skins.custom['logo.gif']" />
    Listados de Descargas de Documentos

    <define rows here.listado_documentos(view,request)/>

    Fecha del informe: <content view.getFechaActualFormato()/>

    Título / Usuario / Versión / Fecha Descarga
    <repeat row rows>
    <content row['tit']/> <content row['member']/> <content row['version']/> <content row['dat'].strftime('%d/%m/%Y %H:%M:%S')/>
    </repeat>


    1) En la parte superior de nuestra plantilla incluimos el logo de nuestra aplicación, para ello:
    <image object="here.portal_skins.custom['logo.gif']" />

    La sentencia muestra en pantalla el gif asociado en nuestro portal_skins

    2) Esta sentencia es la más importante de la plantilla, ya que define la variable rows que contendrá el conjunto de registros
    consultados de la tabla contra la que estemos consultando los datos, mediante una consulta a nuestra ZODB.

    <define rows here.listado_documentos(view,request)/>

    "<define rows" es la sentencia utilizada para declara la variable rows
    "here." hace referencia al objecto actual, en Page templates utilizamos esta instrucción para acceder a los métodos definidos en el objeto.
    "listado_documentos()" sería el método definido en nuestra View o clase, que básicamente se encargaría de extraer los datos que necesitemos de nuestra BBDD. Pasamos como parámetro a dicha función los view y request asociados.

    Podría contener algo así, podríamos definir un Python Script en nuestro portal_skins o incluir la función en nuestra View

    def listado_documentos(xx,xx):

    # Filtramos proyectos actuales
    brains=view.getBrainsProyectosFiltrados()
    # recuperamos sus identificadores
    ids = [x.getDocid for x in brains]
    # formateamos resultado
    ids = ','.join(["'%s'"%x for x in ids])
    # definimos la sentencia sql que extraería la información de nuestra tabla/s
    sql = """
    SELECT *
    FROM "kmkey_xxxx" kd
    WHERE internal_docid in(%s) and kd.docid='%s'""" % (ids)


    db = view.getDB()
    # Ejecutamos consulta en el servidor
    rows = view.executeSQL(sql=sql)

    result = []
    # Construimos la lista con el resultado
    for row in rows:
    result.append(row)

    return result

    3) Fecha del informe: <content view.getFechaActualFormato()/>
    Utilizamos un método definido en nuestra View que formatea y printa la fecha actual

    4) Incluimos la sección de cabecera de nuestra tabla de resultados:

    Título / Versión / Fecha

    5) Y finalmente insertamos la sentencia para mostrar resultados (contenido de row), que es la selección de registros recuperada por nuestra sql.

    <repeat row rows>
    <content row['titulo']/><content row['version']/> <content row['dat'].strftime('%d/%m/%Y %H:%M:%S')/>
    </repeat>

    Con <repeat obligamos a recorrer el contenido de los registros de rows,
    Con <content row['titulo']/> estamos printando el campo Título del registro actual

    Como veis es muy fácil crear un Informe que muestre resultados en KMKey

Leave a Reply