Monday, December 21, 2009

La gestion des rapports

Introduction:

* Il existe 3 méthodes pour gérer des rapports dans OpenERP:

● Les rapports OpenOffice .
● Les rapports XML et XLS:RML .
● Les rapports colonnes créés directement dans le client OpenERP .
Nous nous intéresserons à la première méthode qui est à la fois la plus
simple et la plus fléxible .

* Le processus de création d'un nouveau :

OpenERP propose une intégration des rapports avec OpenOffice.Il est ainsi possible de faire la mise en page d'un rapport dans OpenOffice puis de l'importer dans OpenERP.
OpenERP utilise un 'dialecte' XML pour définir les rapports, le "RML". Les fichiers RML décrivent la structure du document ainsi que les expressions et les champs à inclure.
Il est bien sûr possible de modifier directement un rapport au travers de l'édition de son fichier RML, mais alors la possibilité de mise en page ultérieure avec OpenOffice est perdue .

* Exemple Création du report PDF de commande :

OpenERP possède une structure complètement modulaire, chaque module se trouve dans un
répertoire /addons/ qui contient le code source de définition des classes, des écrans et des rapports .
Le report de commande doit faire partie du module 'mon_module', il se trouvera donc dans bin/addons/mon_module/report/ .
Dans ce répertoire, le fichier rml génère le formulaire pdf tandis que le fichier sxw est capable de regénérer le fichier rml. Ce fichier sxw est éditable par Open Office (version 2.x ou 3.x), vous pouvez le télécharger à partir de ce lien OpenOffice .

* Etapes de création du fichier .RML :

1. Editer le fichier commande avec Open Office (enregistrez le au format .swx) .

2. Uploader le fichier commande.swx créé dans votre compte sur le serveur .

3. Déplacer vous dans le répertoire ou se trouve le script tiny_sxw2rml.py .

4. Lancer la conversion d'un rapport en rml avec la commande suivante:
tiny_sxw2rml.py file.sxw >file.rml .
tiny_sxw2rml.py commande.sxw >commande.rml .

* Construction d'un rapport :

Chaque rapport est construit sur la base d'un objet [[o]] et des attributs de cet objet. Par exemple, la description de la commande achat (order) est représentée par l'expression suivante: [[ o.name ]] .L'objet 'order' est relié à l'objet
'res.partner' par le champ many2one 'partner_id'. Il est donc possible d'afficher le
nom du partenaire en utilisant le code suivant: [[o.partner_id.name]] . L'objet 'order' possède un objet 'line', c'est à dire qu'un order est composé d'une ou de plusieurs lignes de commande .
Il est possible d'accéder à ces lignes de commandes par la fonction:
"[[ repeatIn(o.line_ids,'line') ]]" qui nous fournit un nouvel objet
'line' contenant les attributs de chaque ligne de commande. Par exemple "[[line.quantity]]" affiche la quantité commandée .
Order line possède un attribut 'product_id' qui est une relation many2one avec l'objet 'product' . L'objet product possède un attribut 'name'.
Nous pouvons donc écrire [[ line.product_id and line.product_id.name]] . Après avoir éditer le fichier commande.sxw, on procéde à sa converssion du sxw en rml via le
programme : tiny_sxw2rml.py Le fichier commande.rml ainsi converti doit se trouvé dans le dossier: addons\mon_module\report .
Dans le fichier __init__.py qui va appeller les fonctions nécessaires ajouter la fonction suivante: import report .
Puis ajouter le dossier report qui contiendra le fichier commande.rml .
Ensuite dans le fichier __terp__.py qui va permettre de déclarer le report, modifier la ligne update_xml :
"update_xml" : ["tiny_purchase_view.xml”,"tiny_purchase_report.xml”] .
La définition du report se trouvera dans le fichier : (mon_module_report.xml).

Editer un fichier xml correspondant au report: mon_module_report.xml .


< ?xml version="1.0"? >
<>
<>
< id="report.order" string="Order" model="mon_module.order" name="commande" rml="mon_module/report/commande.rml">
< /data >
< /openerp >


name="commande", "commande" : est un nom interne donné au report
rml="tiny_purchase/report/commande.rml" .
L'exécution est très simple : faites une mise à jour du module et c'est tout :) !

Dans le cas où le report contient un champs ne se trouvant pas dans l'objet en
question, alors il faut définir une classe spécifique à ce report contenant la
définition du champs en question, Par exemple le total de la commande ne
se trouve nul part dans l'objet order.
Dans ce cas, nous devons définir la classe commande de la façon suivante :


from report import report_sxw
class commande(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(commande, self).__init__(cr, uid, name, context)
self.localcontext.update({
'time': time,
'total': self.total,
})
def total(self, lines):
res=0
for i in lines:
res += i.price
return res
report_sxw.report_sxw('report.commande','tiny_purchase.order','addons/tiny_purc
hase/report/commande.rml', parser=commande)


Dans le fichier mon_module_report.xml on doit ajouter le paramètre auto:
auto=”False” si le report utilise des champs définis par un code.
auto=”True” si le report n'utilise que les champs définis dans la base de donnée (valeur par défaut=True) .
Enrégistrer cette déclaration dans le fichier : commande.py
puis ajouter un fichier init.py dans le dossier addons\mon_module\report
qui appellera commande.py : import commande .

1 comment:

  1. hi,
    I am a beginner in openerp and I want to implement a module that returns a PDF report containing the list of projects as date1 <start time <date2.

    date1 and date2 recover from the form

    I'm blocked for a long time

    ReplyDelete