WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Elaboration d'une application de la méthode Activity Based Costing utilisant les technologies XML

( Télécharger le fichier original )
par Jean Mairesse
ULB - Master Informatique et sciences humaines 2009
  

Disponible en mode multipage

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

UNIVERSITÉ LIBRE DE BRUXELLES

 
 
 

FACULTÉ DES SCIENCES SOCIALES,
POLITIQUES ET ÉCONOMIQUES

 
 
 
 
 
 
 

SECTION INFORMATIQUE ET SCIENCES HUMAINES

 
 
 
 
 
 
 
 

Elaboration d'une application de la méthode Activity Based Costing
utilisant les technologies XML.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Jean Mairesse

Année académique 2008-2009

Mémoire présenté en vue de l'obtention du grade de Licencié en Informatique et Sciences humaines, sous la direction de:

 

Monsieur Luc Bernard

Table des matières

 
 

Objectifs du mémoire

1

Chapitre1. La méthode Activity Based Costing

2

Contexte comptable

2

Méthodes de comptabilité

2

La comptabilité générale

3

La comptabilité analytique

3

La méthode des coûts complets

4

Les sections homogènes

4

Le Direct Costing

4

La méthode Activity Based Costing

5

Mise en oeuvre de la méthode ABC

5

Application pratique.

6

Charges indirectes et familles de coût

6

Processus et activités

9

La valeur des activités.

10

Proportion d'intervention des familles au sein des activités.

12

Les unités d'oeuvre.

12

L'application ABC XML.

13

Exemple chiffré.

14

 
 

Chapitre2. Extensible Markup Language (XML)

16

Le World Wide Web Consortium (W3C).

16

Extensible Markup Language (XML).

16

Définir un document XML.

17

Structure hiérarchique: l'arbre XML.

17

Eléments et attributs.

18

Validation d'un document XML.

20

Data Type Definition.

20

Définir Elément et Attributs.

21

Activity Based Costing et Extensible Markup Language.

22

 
 

Chapitre 3. Les logiciels libres

23

Définir les besoins.

23

Recherche logicielle.

23

L'installation des logiciels sous Linux.

25

Saxon.

25

Les licences de Saxon.

25

Solution payante.

27

<oXygen/> XML.

28

MxQuery et XQDT.

29

XQuery low-level.

30

Echec de la solution libre.

30

 
 

Chapitre 4. Modélisation ERD et hiérarchique

31

Modèle Entity Relationship Diagram.

31

Les tables de relation.

32

Modélisation hiérarchique.

35

Eléments à parents multiples.

36

 
 

Chapitre 5. Le fichier ABC/XML et la DTD

38

La DTD.

38

Les relations entre éléments.

38

L'imbrication des éléments.

39

Les pointeurs.

39

Organisation de l'ordre des éléments.

40

La DTD en pratique.

41

Le document XML.

47

Les données du document XML.

48

Les données d'analyse ABC.

48

Les données d'exercice de l'entreprise.

51

 
 

Chapitre 6. XQuery, outil de requête

63

Historique.

63

L'influence de Xpath.

64

L'influence de XML Schema.

64

Autres sources.

64

XQuery recommandation W3C.

64

Fonctionnement de XQuery.

65

Traitement « externe ».

65

Traitement « interne ».

66

Le processeur XQuery.

66

Le datamodel.

66

Les Expressions XQuery.

67

Expression Path.

67

Les requêtes FLWOR.

68

 
 

Chapitre 7. Requêtes XQuery

69

Produire une liste de clients.

69

Les liens.

70

Effectuer des opérations arithmétiques.

73

Sommer les charges.

73

Calculer le coût d'une unité d'oeuvre (d'activité).

75

Calculer le coût indirect d'une commande déterminée.

78

Calculer le coût indirect de la commande « com003 ».

80

IF THEN ELSE.

82

Les « function ».

85

Vérification du résultat.

89

Requête « cout_direct ».

91

XQuery est Low level.

92

Appliquer une requête à une requête.

92

Présenter le résultat sous forme de ratio.

96

Lourdeur des requêtes successives.

98

Requête produisant le coût des unités d'oeuvre.

99

 
 

Chapitre 8. Présentation des résultats

103

XSL.

103

XSLT et Stylesheet.

103

Transformation et Templates.

103

Principe de transformation.

103

Le formatting.

104

XSL-FO.

105

Principe de transformation XSL-FO.

105

XSL-FO stylesheet.

106

Application pratique.

108

Détail de la stylesheet.

108

Traitement « formatter ».

114

 
 

Chapitre 9. Suite du mémoire et conclusions

115

Terminer ce mémoire.

115

Recommandations pour la suite de ce travail.

115

Recherche sur les logiciels libres.

115

Repenser le document XML.

115

Travailler l'ergonomie.

116

Organisation de l'interface graphique.

116

Autres fonctions des interfaces.

117

Technologie pour les interfaces.

117

Les requêtes XQuery.

117

Conclusions.

118

Objectifs du mémoire.

L'objectif de base de ce mémoire est de mettre au point une application de comptabilité analytique se basant sur la méthode Activity Based Costing.

Cet outil analytique est destiné à être utilisé par des TPE (Très Petite Entreprise) et PME (Petite et Moyenne Entreprise) qui sont bien souvent démunie en matière de comptabilité analytique et de tableau de bord de gestion.

Le second objectif est de concevoir cette application Activity Based Costing en faisant usage du métalangage eXtensible Markup Langage (XML).

Cela implique que nous devrons concevoir une représentation des données comptables et
analytiques en respect avec les règles émises par le World Wide Web Consortium (W3C).

Les résultats analytiques relèvent de transformations et calculs sur les données de base (en XML). Nous souhaitons produire ces résultats et les présenter à l'aide d'outils de recherche et transformation issus monde XML (XQuery), et non pas en développant une solution logicielle dédiée.

Notre démarche sera illustrée par un exemple de comptabilité TPE.

Un troisième objectif, tant pour la partie rédactionnelle de ce mémoire, que pour le développement XML, est d'utiliser des logiciels disposant d'une licence libre.

Une recherche et évaluation de solutions logicielles XML sous licence libre sera entreprise.

Nous nous proposons d'organiser notre travail de la façon suivante.

Chapitre 1: nous détaillons la méthode Activity Based Costing. Chapitre 2: nous présentons eXtensible Markup Language (XML). Chapitre 3: les logiciels libres sont traités.

Chapitre 4: modélisations ERD et hiérarchique.

Chapitre 5: nous créons le fichier ABC/XML et la DTD. Chapitre 6: nous présentons XQuery.

Chapitre 7: les requêtes XQuery sont développées.

Chapitre 8: présentation des résultats.

Chapitre 9: suite du mémoire et conclusions.

Chapitre 1. La méthode Activity Based Costing.

Dans ce chapitre, nous présentons le contexte comptable qui est celui des TPE et PME, distinguons la comptabilité générale de la comptabilité analytique, et en décrivons brièvement quelques méthodes avant de détailler la méthode de comptabilité analytique Activity Based Costing (ABC). Ensuite, sur base d'un exemple inspiré d'une entreprise réelle, nous élaborons la mise au point d'une application de la méthode ABC qui servira de base au travail informatique que nous présenterons dans les prochains chapitres.

Contexte comptable.

Toute entreprise se doit de répondre aux obligations légales en matière de comptabilité.

Dans le plus classique des cas, la démarche comptable suivie par les TPE et PME - nous considérons le cas des structures de petite taille, qui ne sont pas dotées d'un service de comptabilité interne - en matière de gestion comptable, consiste à remettre les pièces comptables (factures de ventes et factures d'achats) à un comptable externe, qui est chargé de tenir une comptabilité.

Le comptable externe, outre la tenue de la comptabilité, établi mensuellement ou bien trimestriellement, une « déclaration à la TVA », qui est un résumé des « opérations à la sortie » (opérations de vente - TVA due à l'administration) et des « opérations à l'entrée » (opérations d'achat - TVA due et déductible); le but de cette déclaration est de déterminer la différence entre TVA due et TVA déductible.

Une « déclaration à l'impôt » est établie une fois par an.

Nous mentionnons ces deux déclarations car elles sont l'occasion pour l'entreprise d'avoir accès à ses résultats comptables.

Outre le fait de pouvoir évaluer l'ampleur du bénéfice (ou la perte), ces résultats permettent de prendre conscience du poids des postes de charge dans le résultat.

Ils ne permettent par contre pas d'appréhender la rentabilité effective des produits ou services de l'entreprise.

Il est cependant tout à fait possible, à partir de ces mêmes pièces comptables, de déterminer la rentabilité de chacun de ces produits ou services.

C'est ce que nous tenterons de réaliser au fil de ce mémoire.

Méthodes de comptabilité.

Il existe différentes formes de comptabilité.

Nous distinguerons la comptabilité générale qui est encadrée par la loi, de la comptabilité analytique.

Nous les présentons ci-dessous.

La comptabilité générale.

La comptabilité générale est un classement par nature des pièces comptables, qui offre une vue sur les mouvements financiers, permet de comparer les situations comptables entre périodes et entreprises, et l'élaboration de statistiques économiques.

La comptabilité générale est encadrée par la loi, qui impose depuis le 17 juillet 1975 à toute entreprise de tenir une comptabilité conforme aux dispositions en matière de comptes annuels et de présentation.

Les comptes annuels: à partir de pièces comptables probantes, les factures d'achat et de vente, sont établis les bilans, comptes de résultats et annexes.

Pour ce qui concerne la présentation, la législation défini un plan comptable, le « Plan Comptable Minimum Normalisé » (PCMN).

Signalons que sous réserve d'être considérée comme une PME ( occuper moins de 250 employés, et soit moins de 40 millions d'Euro de chiffre d'affaire ou soit moins de 27 millions d'Euro au total du bilan et respecter le critère d'indépendance), une entreprise peut utiliser un schéma comptable abrégé.

Les commerçants et personnes physiques peuvent tenir une comptabilité simplifiée si leur chiffre d'affaire annuel ne dépasse pas 500.000 Euro (hors TVA).

Pour le développement ultérieur de ce mémoire, nous retiendrons de la comptabilité générale la notion de « Plan Comptable Minimum Normalisé » (PCMN).

La comptabilité analytique.

La comptabilité analytique peut contribuer à déterminer le prix de revient d'un produit, un service ou une commande.

Elle utilise la notion de charges directes et indirectes.

Les charges directes sont celles qui peuvent imputées directement au prix de revient du produit ou service de l'entreprise.

Ce sont les matières premières ou fournitures que l'on retrouve dans le produit final de l'entreprise ainsi que des coûts salariaux de production.

Les charges indirectes sont les frais n'intervenant pas directement dans le produit final. Nous y trouvons les frais relatifs à l'immeuble où opère l'entreprise, les coûts de son outil de production, les frais publicitaires,etc...

Les charges indirectes sont liées à l'ensemble de l'exercice de l'entreprise, et doivent donc être transformées pour intégrer le prix de revient du produit final.

La comptabilité analytique propose un classement par destination.

Exemple: en première destination, nous avons l'entretien d'un ascenseur, qui en seconde destination sert dans le cadre de la production..

La comptabilité analytique qui est un outil interne à l'organisation, n'est pas encadrée légalement.

La comptabilité analytique revêt diverses formes ou méthodes.

Nous présentons quelques méthodes de détermination de prix de revient.

La méthode des coûts complets.

Elle prend en compte toutes les charges affectables à un produit/service, de sa production à sa commercialisation, tant les charges directes que les charges indirectes, qu'une analyse de l'entreprise juge opportune d'y incorporer.

Cette méthode est lourde à mettre en oeuvre, et la répartition des charges indirectes entre unités de production par des clés de répartition est arbitraire et peu précise, voire peu objective.

Principe de fonctionnement de la méthode des coûts complets: les charges directes sont réparties parmi les produits de l'entreprise (produire le meuble « a » a consommé une quantité « x » de charges directes, le meuble « f » une quantité « y »).

Les charges indirectes sont ensuite réparties selon des clés de répartition comme la proportion de matière première consommée.

C'est une méthode très ancienne qui répondait à des formes d'entreprises (manufactures) qui deviennent plus rares de nos jours, et n'avaient pas de contraintes de marchés...

Les sections homogènes.

Les charges directes sont imputées aux produits de l'entreprise.

Pour répartir les charges indirectes au sein de ces produits, l'entreprise est divisée en sections (ateliers, magasins,...)

A chaque section correspondent des coûts (des charges indirectes); ces charges indirectes sont réparties dans toutes les sections proportionnellement à l'effort qu'elles (les sections) ont consacré aux produits de l'entreprise (exemple: l'atelier représente 48% des charges indirectes des produits de l'entreprise, le magasin 17%, etc..).

Une distinction est opérée entre sections principales (atelier, service commercial,..) et sections auxiliaires (gestion, entretien,..).

Les sections auxiliaires sont réparties au sein des sections principales selon des clés de répartition (la section auxiliaire entretien se réparti dans les sections principales atelier et service commercial).

Le coût de chaque section est connu, il reste à le diviser par la quantité de produits ayant été traités. Ce sera l'unité d'oeuvre de la section considérée, et son coût.

La somme des unités d'oeuvre de chacune des sections donnera le prix de revient indirect du produit.

Homogène car chaque section est bien délimitée et ne peut être confondue avec une autre. La section homogène est une forme de coût de revient complet.

Le Direct Costing.

Direct Costing utilise les notions de coûts variables et coûts fixes.

Les coûts fixes sont ceux qui ne dépendent pas du volume fabriqué; typiquement, l'outil de production qu'il faut payer, qu'on l'utilise ou pas.

Les charges variables sont celles qui varient quand varie le volume de l'activité; une charge variable

peut être une charge directe ou une charge indirecte.

Le Direct Costing permet de connaître combien coûte de produire une unité supplémentaire (marginale).

Le Direct Costing impute aux produits les seuls coûts variables.

Dans cette optique, l'entreprise doit couvrir ses frais fixes, qui sont connus, par la marge réalisée sur ses produits: prix de vente - coût variable.

Cela permet de connaître le volume de vente à réaliser pour couvrir ces coûts fixes.

La méthode Activity Based Costing.

La méthode Activity Based Costing propose de répartir les charges au sein des produits, services d'une entreprise, proportionnellement à ce qu'ils en ont réellement consommé.

La méthode Activity Based Costing fait intervenir les concepts d'« activités » et de « processus ».

Activity Based Costing découpe une entreprise en entités consommatrices de ressources (services, départements,...).

Ces entités effectuent diverses tâches, qui lorsqu'elles sont complémentaires, sont regroupées au sein d'« activités ».

Une « activité » peut donc être définie comme étant un ensemble de tâches complémentaires.

Enfin, un processus est un ensemble d' « activités » complémentaires menant l'entreprise à atteindre son objectif final, qui est généralement de produire et vendre des biens et/ou services.

Plusieurs processus peuvent intervenir simultanément ou successivement.

Lorsqu'ont été définies les activités, les charges de l'entreprise y sont distribuées.

Les activités ont alors un coût.

Il convient de répartir ce coût au sein des produits ou services de l'entreprise au prorata de ce qu'ils en ont consommé.

Pour cette répartition, des fractions d'« activités » sont créées.

Par exemple, une heure de production, une heure de travail administratif, etc... Ces fractions sont des « unités d'oeuvre », qui ont un coût.

Il suffit alors de procéder à des mesurages au fil du(es) processus d'élaboration suivi par tel produit ou commande jusqu'à son aboutissement, afin de comptabiliser le nombre d'unités d'oeuvre des différentes « activités » qui ont été utilisées.

La somme de la multiplication des quantités consommées d'« unités d'oeuvre » par leur coût respectif permet de connaître la part de coût indirect à attribuer à la commande ou au produit.

Mise en oeuvre de la méthode Activity Based Costing .

A titre d'exemple, nous prenons le cas d'une TPE active dans le secteur des énergies renouvelables, plus précisément la vente et placement d'installations solaires thermiques.

Il s'agit d'un secteur ayant probablement de l'avenir, mais dont le démarrage est lent. Le mode de fonctionnement en est la réalisation à la commande.

C'est à dire qu'un prix est fixé par avant pour réaliser tel type de commande, il ne variera pas quels que soient les aléas de production.

Notre choix porte sur la méthode Activity Based Costing pour son côté dynamique.

Les méthodes que nous décrivions précédemment sont plus adaptées à des entreprises qui, dans le passé, pouvaient planifier à moyen voire long terme.

Alors que le domaine de l'entreprise en exemple permet de planifier à quelques mois.

La notion de processus au fil duquel sont réparties les charges, comme le propose Activity Based Costing, permet d'envisager une modification de ce processus sans devoir repenser intégralement la méthode d'analyse de coûts en place.

Application pratique.

Les ouvrages que nous avons consulté pour cette partie ABC prenaient des exemples de type

« General Electric », « Renault », « La Poste », et d'autres entreprises de taille moindre, mais qui ne sont pas des PME.

Nous devons donc simplifier la méthode en ce que nous qualifierons d'application de la méthode Activity Based Costing.

En matière de processus, nous sommes tentés de définir l'entièreté de l'entreprise comme un seul processus. Il n'y a pas de département, ni division, l'entreprise est une seule entité.

Il y a par contre bel et bien des activités.

Notre application consistera donc en un processus qui comporte des activités.

Notre démarche sera la suivante:

- En une première étape, nous déterminons quelles sont les charges indirectes.

Nous regroupons ensuite ces charges indirectes par destination en « famille de coûts ».

- En seconde étape, le fonctionnement de l'entreprise est examiné afin d'en cerner le processus.

- Du processus sont déduites les activités au sein desquelles devront être réparties les familles de

coût.

Charges indirectes et familles de coût.

Afin de créer les familles de coût, nous nous appuyons sur la classification de la comptabilité générale, classification correspondant au plan comptable minimum normalisé (pcmn).

L'entreprise en exemple utilise les postes pcmn suivants pour l'imputation des charges indirectes.

601300: outillage

606140: frais transport

611130: location outillage

611150: location véhicule

611300: entretien locaux

611350: entretien véhicule

612000: énergie immeuble

612160: carburant|

612300: documentation

612400: imprimés fournitures bureau

612500: petit mat. bureau 613250: honoraire comptable 613530: assurance véhicule 613540: assurance RC

613550: assurance immeuble 615100: frais représentation 615200: publicité annonces 615220: foires expositions 616100: frais postaux

616200: téléphone

616300: gsm

616400: internet

630210: dotation amortissement immeuble

630220: dotation amortissement outil

630231: dotation amortissement mobilier

630232: dotation amortissement mat. roulant

640100: taxe vehicule

640200: précompte immobilier

Nous pouvons distinguer des charges indirectes relatives au véhicule/transport, à un immeuble, à de la télécommunication, à de la publicité, à l'outil de production, des assurances.

Nous créons des familles de coût en regroupant les charges indirectes par destination.

Sauf exception, il n'est pas cohérent de regrouper des amortissement de véhicule et des factures ayant trait à l'immeuble.

Il est par contre logique de rassembler les frais relatifs à l'amortissement de véhicules avec des frais de maintenance véhicule, carburant véhicule et assurances véhicules.

Famille1: publicité

615100: frais représentation 615200: publicité annonces 615220: foires expositions

Famille2: bureau

612400: imprimés fournitures bureau 612500: petit mat. bureau

616100: frais postaux

630231: dotation amortissement mobilier

Famille3: immeuble

611300: entretien locaux

612000: énergie immeuble

613550: assurance immeuble

630210: dotation amortissement immeuble 640200: précompte immobilier

Famille4: formation documentation

612300: documentation

Famille5: honoraires

613250: honoraire comptable Famille6: transport.

606140: frais transport

611150: location véhicule

611350: entretien véhicule

612160: carburant|

613530: assurance véhicule

630232: dotation amortissement mat. roulant 640100: taxe véhicule

Famille7: outil et production.

601300: outillage

611130: location outillage

613540: assurance RC

630220: dotation amortissement outil

Famille8: telecommunication.

616200: téléphone 616300: gsm

616400: internet

Ces regroupements effectués, nous constatons avoir des frais d'immeuble et de bureau.

Bureau et immeuble sont liés, dès lors que ce qui a trait à un bureau se pratique dans un immeuble. Nous somme tentés de relier ces frais, et créons un regroupement charges indirectes bureau + charges indirectes de l'immeuble.

L'immeuble a toutefois un second utilisateur: il tient également lieu de stockage.

Nous créons un second regroupement: charges indirectes stockage + charges indirectes de l'immeuble.

Les charges indirectes de l'immeuble étant divisées, nous choisissons une proportion de répartition qui sera : 40% pour le bureau et 60% pour le stockage, soit la proportion des superficies d'utilisation respectives.

Notons que nous avons choisi de ne pas intégrer les coûts de téléphonie parmi les frais relatifs au bureau.

Ce choix est guidé par le fait que ce poste (téléphonie) est relativement important, et que son utilisation ne se confine pas au domaine du « bureau ».

Nous créons la « famille stock », et supprimons la famille3 immeuble; les charges indirectes relatives à l'immeuble sont intégrées dans la famille2 bureau et identiquement dans la « famille stock » qui devient famille3 stock.

Les familles de coût 2 et 3 deviennent:

Famille2: bureau

611300: entretien locaux

612000: énergie immeuble

612400: imprimés fournitures bureau 612500: petit mat. bureau

613550: assurance immeuble

616100: frais postaux

630210: dotation amortissement immeuble 630231: dotation amortissement mobilier 640200: précompte immobilier

Famille3: stock

611300: entretien locaux

612000: énergie immeuble

613550: assurance immeuble

630210: dotation amortissement immeuble 630231: dotation amortissement mobilier 640200: précompte immobilier

Le poste pcmn 630231 « dotation amortissement mobilier » se réparti entre les Famille2: bureau, et Famille3: stock.

Nous choisissons un taux de répartition de 80% en Famille2: bureau, et 20% en Famille3: stock.

Processus et activités.

Nous devons identifier les activités que nous utiliserons pour l'analyse ABC.

Ces activités comme décrit plus haut, ressortent de l'examen du processus de l'entreprise. Nous examinons ce processus ci-après.

Activité1 communication

Un mix publicitaire est le préambule à ce secteur d'activité , comme la présence lors d'événements commerciaux, une présence internet, l'établissement contacts commerciaux, etc.

Il en ressort des contacts avec des clients potentiels.

Activité2 démarchage

La demande du contact est étudiée: visite sur place, étude de faisabilité technique, rédaction de une ou plusieurs offre(s), et ensuite si passation de commande il y a, des réunions ont lieu.

Activité3 logistique

Une commande est passée à l'entreprise.

Une sélection du matériel nécessaire est établie, suivie de passation de commande chez divers fournisseurs.

Une partie du matériel est stockée dans les locaux de l'entreprise, d'autres composants sont livrés sur les lieux d'exécution de la commande.

Activité4 transport

Le transport de personnes et matériel est une composante non négligeable dans l'exercice de ce type d'entreprise.

Activité5 production

La production qui assure la réalisation de la commande est l'activité principale de l'entreprise.

Ces cinq activités sont une interprétation du processus de l'entreprise.

Cependant, pour être complet, nous choisissons d'y ajouter deux autres activités qui n'apparaissent pas dans le processus décrit ci-dessus.

Activité6 comptabilité / ABC

Une Activité comptabilité / ABC qui sera l'utilisation de la solution que nous tentons de développer, et qui additionnée au coût du comptable externe, nous permettra d'appréhender le budget d'une démarche comptable de qualité.

Répercussion ou pas dans les commandes passées à l'entreprise?

Nous choisissons d'imputer ce coût dans les commandes, par le biais des factures de vente émises qui relèvent de la comptabilité.

Activité7 télécommunication

Nous évoquions plus haut le coût important de ce poste télécommunication. Nous en faisons une activité à part entière.

Remarques.

Nous appliquerons un coût horaire à l'activité production.

Par contre, nous choisissons de ne pas répercuter de coût horaire aux autres activités. Ce choix est motivé par les raisons suivantes.

D'une part, durant un exercice fiscal, la majorité des heures prestées le sont dans le cadre de l'activité5 production. Le coût horaire est alors une charge salariale, et donc une charge directe au même titre que les matières premières.

D'autre part, en ce qui concerne les autres activités, comme la plupart des TPE, l'entreprise dont exemple n'utilise pas de personnel administratif ou marketing; ces taches sont souvent réalisées en dehors des heures de production par les administrateurs / gérants, et sont très souvent non rémunérées.

Nous ne les rémunérerons pas et n'en tiendrons pas compte dans les mesurages.

La valeur des activités.

Pour déterminer la valeur des activités, nous devons y incorporer les familles de coûts (dans

lesquelles nous avons incorporé les charges indirectes).

Seule la connaissance de l'entreprise permet d'en fixer les règles.

Plusieurs familles de coûts peuvent entrer dans une activité, la même famille de coût peut faire partie de plusieurs activités.

Plusieurs solutions sont possibles, nous retenons la suivante.

L' activité1 communication est composée de la Famille1: publicité, d'une partie de la Famille2: bureau, et d'une partie de la Famille4: formation documentation.

L'activité2 démarchage est composée d'une partie des coûts de la Famille4: formation documentation, d'une partie de la Famille2: bureau.

L'activité3 logistique est composée des coûts de la Famille3: stock. L'activité4 transport est composée des coûts de la Famille6: transport.

L'activité5 production est composée coûts de la Famille7: outil et production, et d'une partie de la Famille4: formation documentation.

L'activité6 comptabilité / abc est composée d'une partie de la Famille4: formation documentation, de laFamille5: honoraires.

L'activité7 télécommunication est composée de la Famille8: télécommunication.

 
 

Activ. communication

? publicité

 

? immeuble

?

? transport

? outil produc

? bureau

? stock

docu/formation

Activ. démarchage

Activ. logistique

Activ. transport

Activ. compta. ABC

 
 
 

? telecom

 

Activ. production

 
 

? honoraires

 

Activ. telecom

 
 

Proportion d'intervention des familles au sein des activités.

Nous devons choisir dans quelle proportion interviendront les familles de coût partagées entre plusieurs activités dans leurs activités respectives.

La famille regroupant les frais relatifs au bureau est partagée entre les activités « communication », « démarchage » et « comptabilité/ABC ».

Par connaissance de l'entreprise, nous choisissons une proportion de 30% en activité

« communication », 35% en activité « démarchage » et 25% en activité « comptabilité /ABC ».

La famille regroupant les frais « formation et documentation » se réparti entre les activités « démarchage », « comptabilité /ABC » et « production » .

Nous choisissons une proportion de 42% en activité « démarchage », 34% en activité « production », et 24% en activité « comptabilité /ABC ».

La famille regroupant les coûts « d'outil de production » se réparti entre les activités « production » et « logistique ».

Nous choisissons une proportion de 27% en activité « logistique » et 73% en activité « production »

Le tableau ci-dessous reprend les proportions de répartition des différentes familles de coût au sein des activités.

 

Act1

Act2

Act3

Act4

Act5

Act6

Act7

Fam1

1

 
 
 
 
 
 

Fam2

0,3

0,4

 
 
 

0,3

 

Fam3

 
 

1

 
 
 
 

Fam4

 

0,42

 
 

0,34

0,24

 

Fam5

 
 
 
 
 

1

 

Fam6

 
 
 

1

 
 
 

Fam7

 
 

0,27

 

0,73

 
 

Fam8

 
 
 
 
 
 

1

Exception.

La famille « honoraires » n'est destinée qu'à ABC. Nous supposons de façon simplifiée que seul un comptable présente ses honoraires.

Si un avocat devait présenter ses honoraires pour un litige lié à la production, une solution serait de répartir cet honoraire au sein de l' activité5 production.

ABC est une démarche souple et dynamique...

Les unités d'oeuvre.

Nous devons choisir quelles seront les unités d'oeuvre utilisées pour chaque activité.

ACTIVITE

Unité d'oeuvre

Activité1 communication

Heure de communication

Activité2 démarchage

Heure de démarchage

Activité3 logistique

Article unitaire

Activité4 transport

Kilomètre

Activité5 production

Heure de production

Activité6 comptabilité / abc

Heure de comptabilité ABC

Activité7 télécommunication

Minute de télécommunication

L'unité revenant le plus régulièrement sera le temps, l'heure ou la minute.

L'heure de production, l'heure de démarchage, l'heure de communication, l'heure de comptabilité ABC.

Pour l'activité télécommunication, nous utiliserons la minute.

Pour l'activité logistique, la quantité d'articles utilisés.

En ce qui concerne cette activité, un choix a dû être déterminé.

Les articles volumineux ou chers sont livrés sur le lieux d'exécution de la commande en mode « just in time ».

D'autres articles sont livrés anticipativement au siège de l'entreprise et font l'objet d'un stockage. Enfin, une troisième catégorie d'articles provient d'un achat immédiat de dépannage chez un fournisseur local.

La première catégorie « just in time » ne coûte rien si ce n'est l'envoi d'un mail de confirmation. La seconde catégorie coûte l'utilisation du stockage.

La troisième catégorie est consommatrice de temps et de kilomètres.

A notre sens, nous avons le choix entre les unités d'oeuvre suivantes: la note d'envoi correspondant à un acte d'achat, ou l'article unitaire.

Il faut trancher: nous avons choisi l'article unitaire. Si l'expérience montre que ce n'est pas optimal, on peut en changer dans le temps.

L'application ABC XML.

Nous avons présenté en détail une application de la méthode ABC à un cas d'entreprise précis.

Pour la suite de ce travail qui traite de l'implémentation de la méthode ABC en utilisant des données comptables au format XML, nous devons retenir de la description ci-dessus les composants suivant.

- Les postes pcmn qui désigneront les charges directes et indirectes. - Les regroupement pcmn en familles de coûts.

- Les activités.

- Les unités d'oeuvre.

Nous devrons également procéder à différents calculs qui devront livrer le résultat de la commande. Ce résultat devra nous indiquer la marge brute et la marge nette avant impôts.

- Marge brute: Chiffre d'affaire de la commande - charges directes.

- Marge nette (avant impôts): Marge brute - charges indirectes.

Le chiffre d'affaire est connu, les charges directes facilement identifiables.

Nous devons donc calculer la part de charges directes imputable à cette commande, que nous appellerons « coût indirect ».

Notre application effectuera les transformations suivantes:

- Coût d'une famille: somme des montants « pcmn » imputés * proportion d'intervention du poste

pcmn dans la famille.

- Coût d'une activité: somme des familles qui la composent * proportion d'intervention de la

famille dans l'activité.

- Valeur de l'unité d'oeuvre d'une activité: coût total de l'activité divisé par la quantité totale

d'unités d'oeuvres se rapportant à cette activité.

- Coût indirect d'une commande: somme de (pour chaque activité utilisée, quantité d'unités d'oeuvre * valeur d'unité d'oeuvre)

- Calcul des marges brutes et nettes

Exemple chiffré.

Notre objectif n'est pas de produire un résultat portant sur l'encodage d'une année ou bien d'un trimestre de pièces comptables.

Nous créerons quelques commandes client, encoderons quelques charges directes et indirectes.

Les commandes.

1. Commande1 CA: 12000 Charges Directes: 4756 + 322

2. Commande3 CA: 1852 Charges Directes: 640

3. Commande2 CA: 2310 Charges Directes: 801

4. Commande4 CA: 6400 Charges Directes: 604

Nous utiliserons un tarif de 25€ par heure de production.

Ce montant est déterminé par les coûts d'assurance sociale, assurance vie et accidents, salaire,...

Nous imputerons les charges indirectes suivantes.

PCMN: 601300 montant: 850

PCMN: 611300 montant: 1150

PCMN: 615200 montant: 1600

PCMN: 615100 montant: 710.2

PCMN: 612400 montant: 466

PCMN: 612300 montant: 157.85

PCMN: 612160 montant: 310

PCMN: 630232 montant: 760

PCMN: 630220 montant: 350

PCMN: 630210 montant: 423

PCMN: 613250 montant: 600

PCMN: 612000 montant: 240

PCMN: 612160 montant: 211

PCMN: 616200 montant: 118.7

PCMN: 612300 montant: 560

PCMN: 611130 montant: 422

PCMN: 616300 montant: 58

PCMN: 616300 montant: 74.6

Les postes de dotation aux amortissements (630231, 630210, 630232, 630220): nous imputons des montants correspondant à 2/12 du total annuel.

La raison en est que nous prendrons en exemple des commandes dont la durée porte sur une période de deux mois.

Notons que nous travaillerons avec des montants sans TVA. Nous parlerons donc de montant hors TVA (htva).

Sources.

- Professeur D.Helbois, Fucam: Syllabus « Comptabilité analytique d'exploitation » et « Techniques de calcul et de répartition ».

- F. Guerra E. DeHaan: « Comptabilité les procédures comptables et comptes annuels » ISBN 2- 8041-0954-2

- H.Bouquin: « Comptabilité de gestion » ISBN 2-7178-4026-5

Chapitre2. Extensible Markup Language ( XML) .

Le langage XML que nous utiliserons pour la suite du développement de ce mémoire, est issu des travaux du World Wide Web Consortium.

Dans ce chapitre, nous décrivons au moyen d'un exemple ce qu'est XML et quelques principes qui nous seront utiles.

Le World Wide Web Consortium (W3C).

Le World Wide Web Consortium a été fondé par Tim Berners-Lee (inventeur du World Wide Web) en octobre 1994 au Massachusetts Institute of Technology.

W3C est un groupe de normalisation et standardisation dédié aux technologies du Web.

Cette standardisation vise à permettre le développement du Web en rendant compatibles les technologies dédiées, et aux différentes solutions logicielles y accédant de travailler ensemble. L'interopérabilité Web étant une des missions du W3C.

Les standards de langages et protocoles Web publiés par le W3C le sont en Open source afin d'éviter la fragmentation du marché et par conséquence du Web.

Recommandation W3C: au terme d'un processus de plusieurs phases (brouillon de travail, dernier appel, candidat à la recommandation, recommandation proposée) , un document devient une Recommandation W3C.

Citons quelques recommandations:

- 1996 Portable Network Graphics (PNG) 1.0

- 1996 Separating content from structure, CSS Level 1 is published cascading styled sheets - 1998 XML 1.0

- 2001 XML Schema

...

Source: W3C ( www.w3.org).

Extensible Markup Language ( XML).

Extensible Markup Language ou XML est un langage permettant le balisage de documents.

A l'origine est le SGML (Standard Generalized Markup Language) qui a été développé par IBM dans les années 70 et est devenu un standard ISO.

Le principe de base du SGML est de dissocier la structure d'un document de sa présentation. SGML est efficace, mais complexe, son utilisation a surtout été industrielle et militaire.

Le W3C souhaitait qu'il soit possible de transmettre et traiter du SGML générique sur le Web. Cette forme simplifiée du SGML est le Extensible Markup Language, qui est devenu une recommandation du World Wide Web Consortium le 10 février 1998.

Dès le début, l'engouement était au rendez-vous, et depuis une dizaine d'années, des milliers de

Chapitre 2. Extensible Markup Language - XML documents et applications ont été portés en XML.

L'application la plus populaire de XML est le XHTML fortement utilisé sur le Web.

Le principe de XML est d'être un métalangage permettant de baliser un contenu, et donc de décrire ce contenu.

XML se veut souple d'utilisation: chacun peut créer son propre balisage relatif à des données fort différentes, des images, du texte, des bases de données, des catalogues, des formules mathématiques, des données chiffrées,..

Par contre, XML est plus rigoureux que HTML quant au respect des règles syntaxiques; un document XML doit être bien formé: il contient un ou plusieurs éléments, la balise de chaque élément est fermée correctement, les éléments sont case sensitive, les attributs ne sont pas vides et sont entre guillemets.

XML permet le découplage des données et de la présentation, XML n'enferme pas les données dans un format propriétaire qui les rend peu utilisables sous d'autres formats.

En aucun cas XML n'est à même de transformer les données qu'il contient.

XML ne propose pas de traitement, et il n'est pas possible de créer d'algorithme en XML pour produire un résultat.

Définir un document XML.

Nous définirons un document XML comme un ensemble d'informations balisées ou « encapsulées » dans des tags décrivant leur contenu.

Ces informations peuvent être un texte, un catalogue, des images, des données comptables dans ce cas précis,...

Le terme de document XML est utilisé pour décrire une telle structure.

Un exemple pour illustrer notre propos, serait celui d' un mémoire qui comporte des chapitres. Des balises peuvent être créées pour décrire ces différentes parties.

Nous définissons « mémoire » et « chapitre » au moyen des balises <memoire> </memoire> et <chapitre> </chapitre>

Les balises sont doubles car la première ouvre <memoire> , la seconde referme sur le contenu </memoire>: en XML, toute balise ouverte doit être refermée.

Structure hiérarchique: l'arbre XML.

Nous voyons apparaître une structure hiérarchique.

Très logiquement, « mémoire » se trouve hiérarchiquement au-dessus de « chapitre ». Un élément « mémoire » comporte un ou plusieurs élément(s) « chapitre(s) ».

Nous obtenons une notion parent-enfant(s): un élément « chapitre » est enfant d'un élément « mémoire ».

De cette représentation hiérarchique de XML provient la notion d'arbre XML. Un document XML est un arbre XML.

Memoire
« ABC et XML »

Chapitre
« XML »

Eléments et attributs.

Pour être plus précis, nous indiquons que « ABC et XML » est le titre du mémoire, que « Explication de XML » est le titre du chapitre.

En XML, nous utiliserons la notion d'« élément » et d'« attribut ».

Les éléments sont:

<memoire> et <chapitre>.

Les attributs sont:

<titre_memoire> qui est attribut de l'élément <memoire> <titre_chapitre> qui est attribut de l'élément <chapitre>

Notre exemple peut se représenter sous cette forme dans un document XML.

<memoire>

<titre_memoire>ABC et XML</titre_mémoire> </memoire>

<chapitre> <titre_chapitre>XML</titre_chapitre>

</chapitre>

Nous devons alors intégrer la notion de hiérarchie. Pour ce, nous déplaçons la balise de fermeture </memoire> en fin de ce document XML.

<memoire>

<titre_memoire>ABC et XML</titre_memoire>

<chapitre> <titre_chapitre>XML</titre_chapitre>

</chapitre> </memoire>

La recommandation XML impose qu'un arbre XML soit « encadré » par un élément racine, parfois appelé « élément bidon » ou « root ».

L'élément racine est l'élément parent de tous les autres éléments du document XML. Il est vide, et dépourvu d'attribut.

Nous créons donc l'élément « exemple » qui remplira ce rôle.

Nous obtenons alors la représentation XML suivante.

En examinant sa structure, nous constatons que les balises <chapitre> et </chapitre> contiennent les balises <titre_mémoire/>, et sont elles même contenues au sein des balises <memoire></memoire>

C'est de cette façon que se représente la hiérarchie au sein d'un document XML: l'élément parent inclus les éléments enfants.

<exemple> <memoire> <titre_memoire>ABC et XML</titre_memoire>

<chapitre> <titre_chapitre>XML</titre_chapitre>

</chapitre> </memoire> </exemple>

Exemple

Memoire
« ABC et XML »

Chapitre
« XML »

L'utilité de cet élément racine est de pouvoir d'une part accéder l'arbre XML , et d'autre part de pouvoir créer d'autres éléments de même niveau hiérarchique (que « memoire » dans ce cas). Si nous n'avons que l'élément « memoire », « memoire » est la racine de l'arbre XML.

Nous avons créé la racine <exemple> souhaitant créer d'autres éléments de même niveau hiérarchique que celui de « memoire », qui sont : « these » et « etudiant ».

Nous obtenons alors l'arbre XML ci-dessous, où nous voyons que les éléments « memoire » « these » et « etudiant » sont de niveau hiérarchique équivalent.

Exemple

Memoire

These

Etudiant

Chapitre

Le niveau hiérarchique identique de ces trois éléments apparaît dans le document XML. </memoire, </these> et </etudiant> sont intégrés de façon identique au sein de </exemple>.

<exemple> <memoire> <titre_memoire>ABC et XML</titre_memoire>

<chapitre> <titre_chapitre>XML</titre_chapitre>

</chapitre> </memoire> <these>

<titre_these>thèse1</titre_these>

</these>

<etudiant>

<nom_etudiant> Dupondt</nom_etudiant>

</etudiant> </exemple>

Validation d'un document XML.

Afin de déterminer le rôle de chaque composant et son niveau hiérarchique au sein d'un document XML, une validation est nécessaire.

Un document XML peut être validé par une DTD ou bien par un schéma XML.

Nous présenterons brièvement la DTD ayant choisi cette alternative pour la suite du développement de ce travail.

Data Type Definition.

Une Data Type Definition (DTD) est un document qui peut être externe au document XML, ou bien en faire partie intégrante.

Une DTD est rédigée dans un formalisme et une syntaxe précise, définie par le W3C.

Elle défini le vocabulaire du document XML, et décrit quels en sont les éléments, quels sont les attributs de chaque élément.

La validation du document XML est assurée par un parseur ou via le site du W3C.

Durant cette opération, le document XML est comparé à sa DTD, afin de vérifier la présence et concordance des éléments et attributs.

Un document XML validé par une DTD est un document instance de la DTD.

Reprenant notre exemple, nous créons une DTD externe que nous appelons memoire.dtd . Pour cette alternative que nous utiliserons plus loin, le document XML doit explicitement faire appel à la DTD via la ligne suivante qui se trouve en entête du document XML :

<!DOCTYPE exemple SYSTEM "/home/jean/Memoireulb/XML/memoire.dtd">

Définir Elément et Attributs.

Elément est décrit dans une DTD par: </ELEMENT (le nom de l'élément) (contenu)>

Pour créer un élément « chapitre », donc le jeu de balise <chapitre> </chapitre>, nous rédigeons en en termes de DTD: </ELEMENT chapitre (contenu)>.

Le contenu peut être de type vide , contenir des sous-éléments ou éléments enfants (une séquence de sous-éléments), proposer un choix de sous-éléments, du texte, du contenu mixte.

Nous utiliserons par la suite les éléments vides, les éléments comportant des sous-éléments et les éléments comprenant une description.

Un élément comportant une description se défini: </ELEMENT (nom_élément) (#CDATA)> L'élément « chapitre » contenant une description de type CDATA :

</ELEMENT chapitre (#CDATA)>.

Un élément vide se défini par : </ELEMENT nom_élément ( EMPTY)>.

L'élément chapitre qui serait vide est défini par: </ELEMENT chapitre ( EMPTY)>. Un élément contenant un sous-élément se défini par :

</ELEMENT exemple (nom_élément) (enfant ou sous-élément+)>. L'élément « chapitre » qui contient un élément enfant « paragraphe »: </ELEMENT exemple (chapitre) (paragraphe+)>.

« + » signifiant que l'élément chapitre peut contenir un ou plusieurs sous-éléments « paragraphe ».

Les attributs.

Une déclaration d'attribut commence par une balise <!ATTLIST (élément) (nom(s) d'attribut(s)>. Les attributs peuvent être de différents types.

- ID, IDREF: identificateurs uniques, qui peuvent être mis en relation par référence (IDREF). - LIST (ou ENUMERATION): choix d'attributs imposé.

- ENTITY, ENTITIES: entité(s) déclarée(s) et non analysée de la DTD.

- NMTOKEN, NMTOKENS: unité(s) lexicale nominale XML.

- CDATA: une chaîne de caractères.

Sources:

W3C: Extensible Markup Language (XML) 1.0 The XML 1.1 Bible ISBN: 0-7645-4986-3

Activity Based Costing et Extensible Markup Language.

Nous avons au fil du chapitre précédent décrit l'application de la méthode Activity Based Costing que nous souhaitons développer dans ce mémoire; dans ce chapitre, nous avons brièvement présenté XML.

Nous relierons ces deux matières au sein de ce travail, en développant notre application ABC en utilisant les technologies XML du W3C.

Ce choix est motivé par le souhait de ne pas enfermer nos données en un format propriétaire, et être ensuite tributaire des possibilités techniques offertes par ce format.

Un autre risque lié au format propriétaire et de plus pouvoir réutiliser les données dans le temps, par exemple à cause d'un changement de format lors d'une évolution logicielle.

D'autre part, le monde XML offre une palette de possibilités technologiques qui sont complémentaires .

Il doit dès lors être possible de les utiliser pour transformer des données comptables saisies en XML afin de mener une démarche analytique.

C'est ce que nous tentons au fil des chapitres suivants.

Chapitre 3. Les logiciels libres.

Un des objectifs de ce travail est d'utiliser des solutions logicielles issues du monde du libre. Nous devons examiner les logiciels libres disponibles en matière de XML et les évaluer.

Défini sommairement: un logiciel libre est livré en Open Source, c'est à dire avec son code source, la plupart du temps gratuitement, sans pour autant signifier qu'un logiciel gratuit est libre.

Il est soumis à un droit d'auteur, qui stipule les droits octroyés à l'utilisateur: la licence libre. Toutefois, l'auteur conserve ses droits d'auteur, bien qu'il renonce à une grande partie de ceux-ci. Un logiciel commercial est au contraire soumis au droit d'auteur, son code source n'est pas fourni, il ne peut être rediffusé, et est accompagné d'un contrat de licence payant.

Définir les besoins.

L'intégralité de ce mémoire, de la recherche d'information à la rédaction sans oublier le traitement XML, sera réalisée sous l' Operating System Linux en version Mandriva 2008.

En partie rédactionnelle, nous utiliserons OpenOffice.org Writer, pour la réalisations de schémas: OpenOffice.org Draw, les saisies d'écran proviennent de Ksnapshot, sans oublier Mozilla Firefox comme navigateur Web, et des utilitaires anonymes.

En ce qui concerne XML, des logiciels de traitement et transformation de données sont nécessaires. Nous devons disposer d'outils permettant de réaliser les opérations ci-dessous.

- Créer la DTD

- Créer le fichier XML

- Valider XML et DTD

- Opérer des recherches au sein de notre document XML afin d'en extraire les données nécessaires au calcul des résultats ABC.

Nous utiliserons pour ces recherches XQuery.

Nous souhaitons une application XQuery disposant d'un environnement visuel semblable à celui d'un compilateur dédié à un langage de programmation , permettant de saisir les requêtes, mettant en évidence les erreurs de syntaxe, et muni d'une fonction de déboguage donc, analysant la requête et affichant un résultat.

- Présenter les résultats; nous utiliserons XSL-FO.

Recherche logicielle.

La création de la DTD et du fichier XML peut être réalisée avec un simple éditeur. Nous avons utilisé Kate, éditeur disponible sous Mandriva Linux.

La validation de la syntaxe XML1.0 et de la conformité à la DTD est possible en ligne via une page de la Brown University.

Nous voyons déjà apparaître une division des solutions qui n'est pas très pratique; DTD et document XML avec un éditeur, par contre, XQuery nécessite un logiciel et non pas un éditeur.

Nous en serions donc à deux logiciels et au recours à un site externe. L'idéal serait une suite pouvant assurer l'ensemble des taches.

La démarche pour trouver un processeur XQuery ou bien une suite logicielle XML a été de mener une recherche en ligne qui ponctuellement menait au W3C ( http://www.w3.org/XML/Query/ )

Le W3C répertorie sur son site une cinquantaine de possibilités.

Licence

Database

XQuery

Conversion

Payant (30jours)

9

3

 

Libre

8

8

2

Site indisponible

2

6

 

Apple

2

1

 

MicroSoft

1

1

 

Autres

2

4

 

Nous les avons examinées, le tableau non exhaustif ci-dessus en propose un simple aperçu, certaines solutions pouvant figurer dans plusieurs cases.

Les implémentations répertoriées proposent des Database managées par XQuery, ou bien des outils purement XQuery, ou enfin des outils de conversion.

Parmi les conversions, citons XQ2XML permettant de convertir XQuery en XML ou en XSLT

Les Licences étaient soit libres , soit payantes, le plus souvent proposées en période d'essai de 30 à 90 jours.

Certains sites étaient indisponibles, par exemple Rainbowcore, ou Relational XQuery. D'autres solutions sont conçues exclusivement pour Microsoft ou bien MacOS X (Sherlock).

Sous la rubrique « autres », nous reprenons des consultant sans logiciel, ou une solution en ligne comme XQuery demo.

Parmi les XQuery payants, nous trouvons Saxon, StylusStudio, Xquantum, ...

Les XQuery en licence libre: Saxon à nouveau, open xquery, Xqilla, Berkeley Lab's NUX, Zorba, MXQuery.

Des projets, dont un probablement oublié car datant de 2002: php xml classes, ou en cours comme XQP.

AltovaXML peut remplir plusieurs cases: il est payant ou libre, mais sous Windows.

En Database libres, notons XML Global, eXist, Qizx/db.

Enfin, notons que certaines solutions intègrent XBRL (Saxon, StylusStudio).

L'installation des logiciels sous Linux.

L'installation sous Linux de logiciels peu répandus révèle une caractéristique des Linux du début: la technique de « l'essai-erreur » est de mise, on travaille en ligne de commande dans une console, il manque toujours une librairie que l'on doit trouver en ligne, et qui quand elle est partiellement installée, réclame une autre librairie, etc.

Pour parfois ne pas fonctionner au final.

Le double-clic sur une icône du monde Windows n'est pas de mise.

La procédure consiste à télécharger sur le site de l'éditeur un fichier archivé en .tar.gz ou .tgz ou .zip puis à le décompresser dans un répertoire , parfois au moyen de la console, parfois par un outil permettant de désarchiver sans ligne de commande (il faut essayer si cela fonctionne), ensuite, lecture de la notice au format .txt si elle existe, ou opérer des tentatives sur des fichiers .jar, .sh, ou qui semblent par expérience être exécutables.

Saxon.

Une première tentative a été menée avec un des logiciels de base du monde XQuery et XML: Saxon.

Saxon développé par Michael Kay, est une suite comprenant un processeur XSLT2.0, un processeur Xpath2.0, un processeur XQuery 1.0, un processeur XmlSchema1.0 .

Saxon est multi-plateformes, java, .NET .

Saxon utilise des parseurs DOM et SAX qui sont deux approches de traitement de document XML.

Les licences de Saxon.

En 2004, Michael Kay après avoir quitté Software AG qui contribuait au développement de Saxon, a fondé la société Saxonica où il continue de développer Saxon.

A partir de 2004 et Saxonica, Saxon 8 a été décliné en deux versions: SaxonB et Saxon SA. SaxonB est en « Mozilla Public Licence » qui est une variante de licence libre, Saxon SA est un produit commercial, payant et au code non ouvert.

Nous avons tenté la version Saxon9.0 B (donc libre).

Au lancement, Saxon9 a proposé ceci: « ./saxon9.jar: Permission denied »

La documentation de Saxon disponible en ligne ne permet pas de résoudre ce qui n'était pas un problème de configuration de permissions.

Des recherches en ligne sur « Permission denied saxon9.jar » ne proposaient que 75 résultats sur Google, et laissaient supposer une configuration Linux/ Java à modifier.

La plate-forme Java disponible pour Linux n'est probablement pas tant « up-to-date » que celle dédiée à Windows.

Diverses tentatives Linux n'ayant pas amélioré le résultat, Saxon6 a été testé. Saxon6 s'ouvre, et propose une interface ... en ligne de commande.

Souhaitant une solution ergonomique, ce qui n'est pas le cas avec une fenêtre monochrome de saisie de ligne de commande, nous poursuivons les essais de logiciels.

La recherche a ensuite porté sur une éventuelle interface graphique.

Le choix s'est révélé être relativement restreint.

Kernow pour Saxon9 est une interface graphique, que nous avons utilisée au début du travail d'ébauche XML. Pour l'abandonner ensuite, car de l'aveu du concepteur, Kernow n'est pas encore très développé pour sa partie XQuery.

D'autres tentatives ont été menées, retenons essentiellement NUX qui présente le même type d'interface (ci-dessus), et MxQuery dont nous reparlerons ci-après.

Solution payante.

Face à ces déconvenues, les ressources temps étant limitées et trop de temps ayant été consacré à cette recherche partiellement vaine, la décision a été prise de renoncer à une solution libre, pour une suite commerciale afin de pouvoir continuer à aller de l'avant.

Plusieurs solutions existent, celle qui paraissait être la plus attrayante « Stylus Studio » du fait d'un outil graphique permettant de créer les requêtes XQuery, était disponible uniquement sous Windows.

Il y avait également Saxon SA, et d'autres.

L'essentiel étant de prendre une décision, nous avons opté pour Oxygen, « <oXygen/>XML » pour être précis.

« <oXygen/>XML » : pour sa convivialité d'installation inespérée sous Linux, son ergonomie, la somme modique de la licence.

<oXygen/> XML.

<oXygen/>XML est un éditeur complet dédié à XML. L'auteur en est la société roumaine SyncRO Soft.

Outre un éditeur XML DTD, nous y trouvons des outils Xpath et XQuery avec fonction débogueur (<oXygen/> XML intègre SaxonSA) XSLT, XSL-FO et d'autres possibilités dont nous ne ferons pas usage comme XML Schema, Relax NG, SOAP; <oXygen/>XML peut également traiter des databases relationelles XML.

<oXygen/>XML est un programme écrit en java, ce qui lui permet une indépendance quant à la plate-forme utilisée: Windows, Linux, MacOS. Son fonctionnement est lié à la présence d'une Machine Virtuelle Java adéquate à la plate-forme.

<oXygen/>XML existe sous forme d'une suite autonome, ou bien en plug-in de la plate-forme Eclipse.

Enfin, <oXygen/>XML est documenté, il existe une communauté permettant de solutionner les problèmes liés à l'apprentissage.

Le lancement s'effectue au moyen d'une console qui cette fois n'affiche pas de message d'erreur...

Quant à l'aspect de <oXygen/>XML , convivial et ergonomique.

MxQuery et XQDT.

Sans vouloir transformer ce chapitre en saga, nous revenons sur MxQuery.

MxQuery est un outil XQuery issu d'un projet de l'ETH Zurich.

Ce projet consiste à créer un « XQuery engine » nécessitant une faible mémoire afin de le porter sur des supports mobiles.

Les participants de ce projet sont actifs dans le monde W3C.

Suite à un résultat peu ergonomique comme ceux détaillés ci-dessus, et un manque de documentation, la question quant à une utilisation graphique a été posée à Monsieur Peter Fischer, co-auteur du projet.

Il a très gentillement conseillé de se tourner vers Eclipse, un projet de plate-forme patronné par IBM, pour lequel un plugin XQDT a été développé, et qui intègre Mxquery.

Nous retranscrivons ci-dessous pour plus de lisibilité.

Dear Mr. Mairesse

thanks for your feedback and your questions regarding MXQuery.

I hope I can answer some of them and give a better understanding of what MXQuery is and what can be achieved with it.

MXQuery is a implementation of the W3C XQuery 1,0 XML Query/expression language, written in java and thus runnable on most client platforms.

Please look into http://www.w3org/XML/Query/ for more information on XQuery.

To drawn an analogy to java, you coud it see MXQuery as the « JVM » implementing the language expressions.

If you are looking for graphical tools to write XQuery, let me point you towards the XQDT Eclipse plugin ( http://www.xqdt.org/) which gives you IDE support for developing XQuery (and bundles MXQuery).

I have to admit that I do not know much about analytic accounting, so I can only make a guess about your requirements. It seems that MXQuery is probably a fairly low-level solution to your problems.

I hope I could clarify some of the questions. Please let me know if and how I could give you more specific answers.

Best Regards, Peter Fischer

Au moment de rédiger ces lignes, la licence Oxygen était acquise et une bonne partie du travail réalisée.

Nous avons toutefois tenté XQDT qui s'installe sous Linux de façon automatique et simple. Toutefois, XQDT s'appuie sur le logiciel XQuery Zorba (existant en .rpm) dont l'installation nécessitait l'installation de plusieurs dizaines de librairies qui à leur tour allaient en requérir d'autres.

La tentative s'est soldée par un échec pour le déploiement de Zorba, la question reste donc ouverte.

XQuery low-level.

Nous notons la remarque de Monsieur Fischer: « It seems that MXQuery is probably a fairly low-level solution to your problems ».

N'étant pas à même de mesurer la portée de la remarque, nous en prenons note et poursuivons notre démarche.

Echec de la solution libre.

Pour conclure cette partie logicielle, nous avons dû renoncer à utiliser des logiciels libres par manque de connaissance probablement, par manque de documentation.

Linux n'a pas simplifié la démarche, il est possible qu'un Operating System plus répandu aurait ouvert d'autres possibilités en matière d'installation logicielle.

Nous utiliserons donc une solution commerciale: Oxygen.

Chapitre 4. Modélisation ERD et hiérarchique.

En cette partie consacrée à la modélisation, nous devons transposer la description technique de la méthode Activity Based Costing en concepts XML, servant de base à la création du document XML reprenant les informations ABC.

Nous l'avons déjà évoqué: XML a une structure hiérarchique.

La modélisation des données se fera à l'aide d'un Entity Relationship Diagram (ERD), que nous transformerons ensuite en modèle hiérarchique.

Modèle E ntity Relationship Diagram.

Nous représentons les données et les relations qui les lient au moyen d'un modèle Entity Relationship Diagram (ERD).

Nous créerons des tables et attributs nécessaires; un attribut ayant un rôle index et noté « id_ ... » sera créé pour chaque table.

Nous prenons comme convention de ne pas utiliser, tant pour nommer les tables que les attributs , ni de majuscules, ni d'accent, qui sont sources de confusions et erreurs dans le développement informatique de ce travail.

L'application ABC que nous avons proposée met en oeuvre des charges directes, des charges indirectes, des regroupements en familles de coûts, et des activités.

Nous pouvons créer les tables correspondantes, soit: « charge_directe », « charge_indirecte », « famille_cout » et « activite ».

Les quatre tables que nous venons de définir peuvent prendre les attributs suivants:

table « charge_directe »: « id_charge_d », « montant_dir_htva_impute », « quantite » table « charge_indirecte »: « id_chargeindirecte », « montant_htva_impute »

table « famille_cout » : « id_famille », « nom_famille »

table « activite » : « id_activité », « nom_activite », « unite_oeuvre »

Nb. « htva » que nous trouvons pour les attributs « montant_dir_htva_impute » et « montant_htva_impute » signifie « hors TVA ».

La relation comptable entre charge indirecte et famille de coût étant articulée autour des postes du pcmn, nous créons également une table « pcmn » dont les attributs seront le code pcmn (6 chiffres) et l'intitulé correspondant.

table « pcmn » : « id_pcmn », « intitule »

Ces quatre tables, nous permettent d'inscrire et regrouper les données comptables.

D'autres tables seront dédiées à l'utilisation de ces données comptables de départ, que nous devons répartir au sein de commandes passées par des clients à l'entreprise.

Pour ce, comme évoqué plus haut, nous devons effectuer des mesurages au fil du déroulement du processus de l'entreprise afin de répartir nos coûts d'activités.

Il convient donc de créer une table « commande », une table « mesurage », et une table « client ».

table « commande » : « id_commande », « descriptif », « chiffre_affaire » table « client » : « id_client », « nom » et « adresse »

Les tables de relation.

Nous devons établir des relations entre ces tables de base du système.

C'est-à-dire une relation entre « pcmn » et « charge_indirecte », entre « charge_indirecte » et

« famille_cout », entre « famille_cout » et « activite », entre « activite » et « commande », entre « client » et « commande », entre « charge_directe » et « commande », entre « charge_directe » et « pcmn ».

Relation des tables « chargeindirecte » et « pcmn ».

Ces deux tables ont une relation de N à M ou plusieurs à plusieurs.

Nous désignons par le terme « charge indirecte » une pièce comptable contenant une charge indirecte.

Plusieurs destinations d'imputation sont possibles pour une même pièce: un même fournisseur peut reprendre au sein de la même facture des articles que nous destinons à des imputations différentes.

Nous créons la table de relation « imputation » .

La table « imputation » comprendra les attributs suivants:

table « imputation »: « id_imputation », « id_charge_indirecte », « id_pcmn_imputation », « montant_htva_impute ».

« id_imputation » est l'identificateur propre de la table « imputation », deux attributs sont les identificateurs des deux tables que nous mettons en relation: « id_charge_indirecte » et

« id_pcmn_imputation », le dernier attribut est le montant hors TVA imputé.

Relation des tables « pcmn » et « famillecout ».

La relation entre ces deux tables est également de N à M.

Une Famille de coûts est constituée de un ou plusieurs postes pcmn intervenant en proportions différentes dans le calcul de sa valeur finale.

Un poste pcmn peut être intégré dans une ou plusieurs familles.

La table « composition_famille » sera la relation entre les tables « pcmn » et « famille_cout ».

Elle aura pour attributs:

table « composition_famille »: « id_compofam », « id_famille », « id_pcmn_fam », « proportion_cf »

Nous avons utilisé des abréviations: « id_compofam » pour id_composition_famille ,

« id_pcmn_fam » pour id pcmn (dans famille_cout), et « proportion_cf » pour proportion cout famille.

L'attribut « proportion_cf » contiendra la valeur de répartition d'un poste pcmn intervenant dans

plusieurs familles.

Si un poste pcmn est repris intégralement dans le calcul du coût d'une famille, l'attribut sera 1. Si il intervient pour 67%, l'attribut sera de 0.67 .

1-N

charge_directe id_commande id_charge_d mont_dir_htva_impute id_pcmn_directe

pcmn
id_pcmn
intitule

imputation id_imputation id_charge_indirecte id_pcmn_imputation montant_htva_impute

charge_indirecte id_chargeindirecte id_pcmn

montant_htva_impute quantite

1-M

1-N

1-N

1-N

composition_famille id_compofam id_famille

id_pcmn_fam proportion_cf

client id_client nom_client adresse

commande id_commande descriptif id_client chiffre_affaire

1-N

1-M

1-M

composition_activite id_compoact id_activite

id_famille_kout proportion_famille

activite id_activite nom_activite unite_oeuvre

mesurage id_mesurage id_activite id_commande date

quantite unite_oeuvre

famille_cout
id_famille_cout
nom_famille

1-M

1-N

1-N

Relation des tables « famillecout » et « activite ».

La relation entre ces deux tables est de N à M.

Une famille de coûts peut être composante de une ou plusieurs activités , qui elle peut inclure une ou plusieurs familles de coûts.

Exemple: l'activité production inclus la famille7: outil et production et la famille4: formation documentation.

La table « composition_activite » sera la relation entre les tables « famille_cout » et « activite ». Les attributs en seront:

table « composition_activite »:« id_compoact », « id_activite ». « id_famille_kout », « proportion ».

L'abréviation « id_compoact » est pour id_composition_activite.

Comme précédemment, cet attribut « proportion » permet de fixer la proportion d'intervention

d'une famille de coûts au sein d'une activité. Relation des tables « activite » et « commande ».

Une commande peut mettre en oeuvre une ou plusieurs activités, une activité est utilisée par une ou plusieurs commande, ce qui implique une relation de N à M.

La table de relation que nous utiliserons sera utilisée pour effectuer les mesurages d'unités d'oeuvre des différentes activités nécessaires à l'analyse ABC.

Ce sera la table « mesurage », comportant les attributs:

table « mesurage »: « id_commande », « id_activite », « id_mesurage », « date », « unite_oeuvre », « quantite ».

Les champs « id_commande », « id_activite » sont des champs de relation. Relation des tables « client » et « commande ».

Ces deux tables ont une relation de 1 à N.

Un client peut passer une ou plusieurs commandes, une commande correspond à un seul client. La relation s'établira en incluant l'identificateur de client au sein de commande.

La table « commande » devient:

table « commande »: « id_commande », « descriptif », « id_client », « chiffre_affaire »

Relation des tables « chargedirecte » et « commande ».

Ces deux tables ont une relation de 1 à N.

Une commande peut se voir imputer plusieurs charges directes, une charge directe est imputée à une seule commande.

La relation est établie en incluant l'identificateur de la commande dans la table charge_directe.

Relation des tables « chargedirecte » et « pcmn ».

Ces deux tables ont une relation de 1 à N.

Un poste pcmn correspond à une seule charge directe; une charge directe peut recevoir plusieurs attributions pcmn.

Nous incluons l'identificateur du poste pcmn que nous appelons « id_pcmn_directe » La table « charge_directe » devient:

table « charge_directe »: « id_charge_d », « id_commande », « id_pcmn _directe », « montant_dir_htva_impute », « quantite »

Nb. Dans quelques cas, nous avons choisi de modifier le nom de l'attribut comme par exemple « id_pcmn_directe » qui est dans la table « pcmn » id_pcmn et dans la table

« composition_famille »: « id_pcmn_fam.

Cela ne modifie en rien la valeur de l'attribut, et nous permettra dans la suite de ce travail de pouvoir distinguer les trois attributs.

Modélisation hiérarchique.

Comme nous l'avons évoqué plus haut, XML propose une représentation hiérarchique des données, qui forme un arbre XML.

Un élément racine est le point de départ obligatoire d'une modélisation hiérarchique. Nous ne disposons pas parmi les tables du modèle ERD que nous venons de développer, d'élément racine (ou parent) de tous les autres éléments (tables).

Nous créons cet élément: « ABC » (en majuscules exception faite pour l'élément racine) qui sera un élément vide.

charge_indirecte id_chargeindirecte montant_htva_impute id_pcmn

famille_cout id_famille_cout nom_famille

ABC

client

id_client

nom_client
adresse

commande id_commande descriptif

id_client chiffre_affaire

activite

id_activite nom_activite unite_oeuvre

imputation id_imputation id_chargeindirecte id_pcmn_imputation montant_htva_impute

pcmn
id_pcmn
intitule

composition activite id_compoact id_activite

id_famille_kout proportion_famille

charge directe id_commande id_charge_d id_pcmn_imput mont_dir_htva.. quantite

mesurage id_mesurage id_activite id_commande date

quantite uniteoeuvre

composition famille id_compofam id_famille id_pcmn_fam proportion_cf

Le premier élément hiérarchiquement sous la racine « ABC » est la table « client ».

Au niveau hiérarchique suivant se trouvent les quatre tables principales de notre travail, « charge_indirecte », « commande », « famille_cout » et « activite ».

Elles sont descendantes de « ABC », sauf la table « commande » qui est enfant de « client ». Elles se positionnent comme élément parent des tables de relation que nous avons créées dans le modèle ERD.

« charge_indirecte » est parent de « imputation »: à une « chargeindirecte » correspond 1 où N instances d' « imputation ».

« commande » est parent de « mesurage »: à une « commande » correspond 1 où N instances de « mesurage ».

« commande » est également parent de « charge_directe »: à une « commande » correspond 1 où N instances de « charge_directe ».

« famille_cout » est parent de « composition_famille »: à une « famille_cout » correspond 1 où N instances de « composition_famille ».

« activite » est parent de « composition_activite »: à une « activite » correspond 1 où N instances de « composition_activite ».

Eléments à parents multiples.

Notre représentation hiérarchique ne serait pas complète sans les éléments ayant des parents multiples.

ABC

client

id_client

nom_client adresse

charge_indirecte id_chargeindirecte montant_htva_impute id_pcmn

commande id_commande descriptif id_client chiffre_affaire

famille_cout id_famille_cout nom_famille

activite

id_activite nom_activite unite_oeuvre

imputation id_imputation id_chargeindirecte id_pcmn_imputation montant_htva_impute

charge_directe id_commande id_charge_d id_pcmn_imput mont_dir_htva.. quantite

mesurage id_mesurage id_activite id_commande date

quantite uniteoeuvre

composition_famille id_compofam id_famille id_pcmn_fam proportion_cf

composition_activite id_compoact id_activite id_famille_kout proportion_famille

pcmn
id_pcmn
intitule

Il s'agit des trois tables descendantes de plus de une table.

Nous voyons que « composition_activite » a pour parent « activite » comme nous venons de le voir, mais également « famille_cout »: à une « famille_cout » correspond 1 où N instances de

« composition_activite ».

La table de relation « mesurage » est descendante de « commande » et « activite ».

Enfin, au dernier rang hiérarchique, la table « pcmn » est une table enfant à la fois d'« imputation » « charge_directe » et de « composition_famille ».

Chapitre 5. Le fichier ABC/XML et la DTD.

Ayant modélisé hiérarchiquement l'application ABC, nous devons la transposer sous forme de document XML.

Lors d'une première étape, nous créerons la DTD qui comme nous l'avons vu plus avant, validera notre document XML.

Ensuite, la seconde étape consistera à élaborer le document XML correspondant, et à y saisir de l'information.

La DTD.

Dans la DTD, nous devons traduire les tables issues des modélisations ERD et Hiérarchiques. XML retient la notion d'élément, nos tables deviendront des éléments.

Le terme d'attribut restera, un élément comportant des attributs, tout comme une table comporte des attributs.

Hormis le fait de créer des éléments et leurs attributs, nous devons également définir dans la DTD la structure des relations entre éléments et leur ordonnancement.

Les relations entre éléments.

ABC

 
 
 
 
 
 
 
 

charge_indirecte

 
 

client

 

famille _ coût

 
 

activite

 

imputation

 
 
 

commande

 
 
 

composition

 
 
 

composition

 
 
 
 
 
 
 
 
 

_famille

 
 
 

_activite

mesurage

 
 
 
 
 
 
 
 

charge-
directe

 
 
 
 
 
 
 
 
 
 
 
 
 
 

PCMN

 
 
 
 

PCMN

 
 
 
 

PCMN

 
 
 
 
 
 
 
 
 
 
 
 

compofam/Activite

 
 
 
 
 
 
 
 
 
 
 
 

Mesurage/Activite

En examinant le modèle hiérarchique, nous distinguons que les tables se répartissent en quatre « colonnes » distinctes, qui sont quatre relations parent/enfants d'éléments.

Ces quatre relations sont reliées entre elles par les trois éléments ayant deux parents, « mesurage », « composition_activite » et « pcmn » comme nous l'avons vu dans la modélisation hiérarchique.

XML autorise deux types de liens entre éléments: l'imbrication des éléments ou les pointeurs.

L'imbrication des éléments.

L'imbrication d'éléments consiste à inclure l'(es) élément(s) enfant(s) dans l'élément parent.

Le défaut de cette méthode est une lourdeur du document due à la redondance de l'information. XML est par nature verbeux, ce n'est donc pas anormal.

Nous imbriquerons les quatre « colonnes » du modèle hiérarchique.

- L'élément racine (vide) « ABC » inclut les éléments « client », « activite », « famille_cout », « charge indirecte » et « pcmn ».

- L'élément « client » inclut « commande » qui inclut « mesurage » et « charge_directe ». - L'élément « Activite » inclut « composition_activite ».

- L'élément « Famille_cout » inclut « composition_famille ».

- L'élément « charge indirecte » inclut « imputation ».

Les pointeurs.

Les pointeurs utilisent généralement les types ID IDREF(S) pour mettre des éléments en relation. Pour établir la relation entre les éléments pointés par les attributs ID IDREF(S) situé dans des éléments distincts, l'outil de requête compare la valeur de ces attributs.

Exemple: si l'attribut IDREF d'un élément « livre » prend pour valeur « memoire1 » et l'attribut ID d' un élément « bibliothèque » prend pour valeur « roman10 », l'évaluation comparative ne permettra pas de liaison.

Si par contre l'attribut ID devient « memoire1 », la liaison entre les éléments par le pointeur sera établie.

Comme nous le verrons plus bas, la notion de pointeur peut relever de la comparaison d'attributs identifiant sans recourir à ID IDREF.

Si les pointeurs permettent un découplage des éléments, il génèrent un inconvénient: la lenteur de traitement.

Le parseur ne navigue pas facilement entre les ID IDREF, la relation ID IDREF est unidirectionnelle: de IDREF vers ID s'opère facilement, mais l'inverse est plus laborieux.

Cela implique que le parseur doit parfois effectuer plusieurs passages au sein du document si l'élément comportant le ID est positionné avant celui contenant IDREF.

Ce processus peut devenir laborieux pour les fichiers XML de grande taille.

Nous aurons recours à cette méthode, notre fichier ABC_XML ayant peu de chances d'atteindre une taille critique.

(source: XML et bases de données. ISBN: 2-212-09282-2 page 34-35).

Nous utiliserons des pointeurs pour relier les quatre groupes d'éléments de relation définis ci-dessus

Chapitre 5. Le fichier ABC/XML et la DTD

- « mesurage » pointe vers « activite »

- « composition_activite » pointe vers « famille_cout »

- « imputation » pointe vers « pcmn »; « composition_famille » pointe vers « pcmn »; « charge _directe » pointe vers « pcmn ».

Nous remarquons que les pointeurs portent sur trois les éléments « multi-parents » évoqués en modélisation hiérarchique.

Organisation de l'ordre des éléments.

Nous devons choisir l'ordre dans lequel apparaîtront ces éléments imbriqués.

Nous optons une représentation lisible.

ABC

client

commande

mesurage

charge-
directe

activite

composition
_activite

famille_ coût

composition
_famille

charge_indirecte

imputation

A savoir: partir de client et de sa commande qui fait l'objet de mesurages ayant trait à des activités constituées de familles de coûts elles mêmes composées de charges indirectes.

La DTD en pratique. Elément racine.

La première ligne de la DTD déclare l'élément racine qui est « ABC » ainsi que les éléments imbriqués dans ABC

<!ELEMENT ABC (client+, activite+, famille_cout+, charge_indirecte+, pcmn+)>

Plusieurs instances de ces éléments sont autorisées dans le document XML du fait de la présence du signe + suivant chacun des éléments déclarés (client+,..etc..)

Elément « client ».

<!ELEMENT client (commande+)>

L'élément « client » est déclaré, il inclut un élément « commande » qui peut faire l'objet de plusieurs instantiations.

<!ATTLIST client

id_client (jaeger01| cairelli02| panerai03) #REQUIRED nom (jaeger| cairelli| panerai) #REQUIRED

adresse CDATA #REQUIRED>

Pour chaque élément (sauf « ABC » qui est vide), nous déclarons la liste des attributs correspondant.

La liste des attributs de l'entité « client », soit <!ATTLIST client> :

- id_client, dont le type est une liste de choix entre les différentes valeurs possibles pour cet attribut, soit « jaeger01 » ou « cairelli02 » ou bien « panerai03 ». Il n'est pas possible d'encoder dans le futur document XML une valeur autre que ces trois, autorisées par la DTD.

- nom, où nous saisirons le nom du client avec logiquement trois possibilités, soit « jaeger » ou « cairelli » ou bien « panerai ».

- adresse, où figurera l'adresse du client, de type CDATA.

Elément « commande ».

<!ELEMENT client (commande+)>

<!ELEMENT commande (mesurage+, charge_directe+)> <!ATTLIST commande

id_commande CDATA #REQUIRED

descriptif CDATA #REQUIRED

chiffre_affaire CDATA #REQUIRED>

La déclaration de l'élément commande intervient au sein de « client », lui-même comportant les éléments mesurage et charge_directe (plusieurs instantiations de mesurage et de charge_directe sont possibles) , l'élément commande étant un élément imbriqué dans l'élément client.

Les attributs de l'élément « commande »: « id_commande », « descriptif » et « chiffre_affaire »,

tous trois en format CDATA.

Notons que nous n'avons pas utilisé un attribut « id_client » dans l'élément « commande », contrairement à ce qu'indiquent les schémas de modélisation ERD et hiérarchique, où il avait un rôle de pointeur qui n'est plus nécessaire, les entités « client » et « commande » étant imbriquées.

Elément « mesurage ».

<!ELEMENT client (commande+)>

<!ELEMENT commande (mesurage+)>

<!ELEMENT mesurage EMPTY>

<!ATTLIST mesurage

id-mesurage CDATA #REQUIRED

id_aktivite IDREF #REQUIRED

date CDATA #REQUIRED

quantite CDATA #REQUIRED

unite_oeuvre (heure_communication| heure_demarchage| article_unitaire| kilometre| heure_production| heure_comptabilite_abc| minute_telecom) #REQUIRED >

Nous déclarons ensuite l'élément « mesurage » qui ne comporte pas d'élément imbriqué, et est donc « EMPTY ».

Les attributs de cette élément: « id_mesurage », « id_aktivite », « date » (du relevé), « quantite » (d'unités d'oeuvre) et « unite_oeuvre » avec une liste de choix imposés.

Nb. Il a été choisi d'orthographier « id_aktivite » avec un « k » pour être en mesure de la distinguer d'un second attribut « id_activite ».

Notons que l'attribut « id_activite » est de type IDREF: il s'agit du pointeur reliant l'élément « mesurage » à l'élément « activite ».

Ici aussi, du fait de l'imbrication, l'attribut « id_commande » des modélisations précédentes n'a pas été créé.

Elément « chargedirecte ».

<!ELEMENT charge_directe EMPTY>

<!ATTLIST charge_directe

id_charge_d CDATA #REQUIRED

id_pcmn (601000| 620000) #REQUIRED montant_dir_htva_impute CDATA #REQUIRED quantite CDATA #REQUIRED>

Nous déclarons enfin l'élément « charge_directe ».

Ses attributs sont: « id_charge_d », « id_pcmn » qui a une liste de choix de postes pcmn autorisés, « montant_dir_htva_impute » et « quantite ».

Sauf « id_pcmn », les attributs sont de type CDATA.

Comme pour l'élément « mesurage », l'attribut « id_commande » n'est plus repris. Elément « activite ».

<!ELEMENT activite (composition_activite+)>

<!ATTLIST activite

id_activite ID #REQUIRED

nom_activite (act1_communication| act2_demarchage| act3_logistique| act4_transport| act5_production| act6_comptabilite_abc| act7_telecom ) #REQUIRED>

L'élément « activite » qui inclut un élément « composition_activite » peut être instancié une ou plusieurs fois. Les attributs en sont « id_activite » et « nom_activite », avec une liste de choix; « id_activite » est de type ID.

Il assure le lien avec l'attribut IDREF que nous décrivons quelques lignes plus haut. Le lien est effectué par comparaison de la valeur prise par ces deux attributs.

Element « compositionactivite ».

<!ELEMENT activite (composition_activite+)>

<!ELEMENT composition_activite EMPTY>

<!ATTLIST composition_activite id_compoact CDATA #REQUIRED id_famille_kout IDREF #REQUIRED proportion CDATA #REQUIRED>

L'élément « composition_activite » n'inclut pas d'autre élément (EMPTY).

Ses attributs: « id_compoact » de type CDATA; chaque instanciation de l'élément « composition _activite » aura une valeur unique pour cet attribut; id_famille_kout de type IDREF est un pointeur vers l'élément « famille_cout »; proportion est de type CDATA.

Elément « famillecout ».

<!ELEMENT famille_cout (composition_famille+)>

<!ATTLIST famille_cout

id_famille_cout ID #REQUIRED

nom_famille (fam1_publicite| fam2_bureau| fam3_stock| fam4_formation_ documentation| fam5_honoraires| fam6_transport| fam7_outil_production| fam8_telecom ) #REQUIRED>

Définissons l'élément « famille_cout » qui inclut l'élément « composition_famille ». Ses attributs: « id_famille_cout », de type ID qui assure la relation avec l'élément

« composition_activite » (ci-dessus) et recevra une valeur unique à chaque instantiation; « nom_famille » imposant une liste de choix.

Elément « compositionfamille ».

<!ELEMENT famille_cout (composition_famille+)>

<!ELEMENT composition_famille EMPTY>

<!ATTLIST composition_famille

id_compofam CDATA #REQUIRED

id_pcmn_fam (601300| 606140| 611130| 611150| 611300| 611350| 612000| 612160|

612300|

612400|

612500| 613250| 613530|

613540|

615100|

615200|

615220|

616100|

616200| 616300| 616400|

630210|

630220|

630231|

630232|

640100|

640200) #REQUIRED

 
 
 

proportion_cf CDATA #REQUIRED>

« composition_famille » est l'élément imbriqué dans « composition_famille ». L'attribut

« id_pcmn_fam » liste les postes pcmn autorisés par leur code en 6 chiffres, « proportion_cf » de type CDATA reprendra la part d'intervention de tel poste pcmn dans la composition de famille.

Elément « chargeindirecte ».

<!ELEMENT charge_indirecte (imputation+)> <!ATTLIST charge_indirecte

id_chargeindirecte CDATA #REQUIRED montant_htva_total CDATA #REQUIRED>

Nous déclarons l'élément « charge_indirecte » incluant l'élément « imputation » dont une ou plusieurs instances sont possibles.

Ses attributs: « id_chargeindirecte » et « montant_htva_total » tous deux au format CDATA.

Elément « imputation ».

<!ELEMENT charge_indirecte (imputation+)>

<!ELEMENT imputation EMPTY>

<!ATTLIST imputation

id_imputation CDATA #REQUIRED

id_pcmn_imputation (601300| 606140| 611130| 611150| 611300| 611350| 612000|

612160|

612300|

612400|

612500|

613250|

613530|

613540|

615100|

615200|

615220|

616100|

616200|

616300|

616400|

630210|

630220|

630231|

630232|

640100|

640200) #REQUIRED

montant_htva_impute CDATA #REQUIRED>

L'élément « imputation » incorporé à « charge_indirecte » a pour attributs « id_imputation » de type CDATA, pour lequel chaque instanciation recevra une valeur unique et une liste de choix portant sur les codes pcmn comme précédemment (la liste est identique) pour l'attribut

« id_pcmn_imputation ».

Elément « pcmn ».

<!ELEMENT pcmn EMPTY>

<!ATTLIST pcmn

id_pcmn (601300| 606140| 611130| 611150| 611300| 611350| 612000| 612160| 612300|

612400|

612500|

613250|

613530|

613540|

615100|

615200|

615220|

616100|

616200|

616300|

616400|

630210|

630220|

630231|

630232|

640100|

640200)

#REQUIRED

intitule (601300_outillage|606140_frais_transport|611130_location_outillage| 611150_location_vehicule| 611300_entretien_locaux | 611350_entretien_ vehicule| 612000_energie_immeuble| 612160_carburant| 612300_documentation| 612400_imprimes_fourn_bureau| 612500_petit_mat_bureau| 613250_honoraire_comptable| 613530 _assurance_vehicule | 613540_assurance_RC| 615000_frais_deplacement| 615100_frais_representation| 615200_publicite_annonces| 615220 _foires_expositions| 616100_frais_postaux| 616200_telephone| 616300_gsm| 616400_internet| 630210_dot_amort_immeuble| 630220_dot_amort_outil| 630231_dot_amort_mobilier| 630232_dot_amort_matroulant| 640100_dot_taxe_vehicule| 640200_precompte_immobilier) #REQUIRED>

Nous présentons ci-dessous la DTD.

<!ELEMENT ABC (commande+, activite+, famille_cout+, charge_indirecte+, client+, pcmn+ )>

<!ELEMENT commande (mesurage+)>

<!ATTLIST commande

id_commande CDATA #REQUIRED

id_client (jaeger| cairelli| panerai) #REQUIRED descriptif CDATA #REQUIRED

chiffre_affaire CDATA #REQUIRED>

<!ELEMENT mesurage EMPTY> <!ATTLIST mesurage

id-mesurage CDATA #REQUIRED

id_activite IDREF #REQUIRED date CDATA #REQUIRED quantite CDATA #REQUIRED

unite_oeuvre (heure_communication| heure_demarchage| heure_logistique| kilometre|

heure_production| heure_comptabilite_abc| minute_telecom) #REQUIRED >

<!ELEMENT charge_directe EMPTY>

<!ATTLIST charge_directe

id_charge_d CDATA #REQUIRED

id_pcmn (601000| 620000) #REQUIRED montant_dir_htva_impute CDATA #REQUIRED quantite CDATA #REQUIRED>

<!ELEMENT activite (composition_activite+)>

<!ATTLIST activite

id_activite ID #REQUIRED

nom_activite ( act_communication| act_demarchage| act_logistique| act_transport| act_production | act_comptabilite_abc| act_telecom ) #REQUIRED>

<!ELEMENT composition_activite EMPTY>

<!ATTLIST composition_activite id_compoact CDATA #REQUIRED id_famille_cout IDREF #REQUIRED proportion CDATA #REQUIRED>

<!ELEMENT famille_cout (composition_famille+)>

<!ATTLIST famille_cout

id_famille_cout ID #REQUIRED

nom_famille (fam_publicite| fam_bureau| fam_stock| fam_formation_documentation|
fam_honoraires| fam_transport| fam_outil_production| fam_telecom ) #REQUIRED>

<!ELEMENT composition_famille EMPTY>

<!ATTLIST composition_famille

id_fam CDATA #REQUIRED

id_pcmn_fam (601300| 611150| 612000| 612300| 612400| 612500| 613250| 613530| 615200| 616200| 616300) #REQUIRED

proportion_cf CDATA #REQUIRED>

<!ELEMENT charge_indirecte (imputation+)> <!ATTLIST charge_indirecte

id_chargeindirecte CDATA #REQUIRED montant_htva_total CDATA #REQUIRED>

<!ELEMENT imputation EMPTY>

<!ATTLIST imputation

id_imputation CDATA #REQUIRED

id_pcmn_imputation (601300| 611150| 612000| 612300| 612400| 612500| 613250| 613530| 615200| 616200| 616300) #REQUIRED

montant_htva_impute CDATA #REQUIRED>

<!ELEMENT client EMPTY>

<!ATTLIST client

id_klient (jaeger| cairelli| panerai) #REQUIRED

adresse CDATA #REQUIRED>

<!ELEMENT pcmn EMPTY>

<!ATTLIST pcmn

id_pcmn (601300| 611150| 612000| 612300| 612400| 612500| 613250| 613530| 615200| 616200| 616300) #REQUIRED

intitule (601300_outillage| 611150_location_vehicule| 612000_energie_immeuble| 6 12300_documentation| 612400_imprimes_fourn_bureau| 612500_petit_mat_bureau| 613250_honoraire_comptable| 613530_assurance_vehicule| 615000_frais_deplacement| 615200_frais_representation| 615200_publicite_annonces| 616200_telephone| 616300_gsm) #REQUIRED

Le document XML.

Nous rédigeons le document XML.

Comme nous l'avons déjà évoqué plus haut, la DTD doit être respectée scrupuleusement.

Si au lieu de saisir « pcmn », nous saisissons « pmcn », le parseur décèlera l'erreur qui sera une erreur bloquante, c'est à dire qu'aucune opération n'est possible tant qu'il n'y a pas correction.

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE ABC SYSTEM "/home/jean/Memoireulb/XQ27avril/abc_avril27_id01.dtd">

Des deux premières lignes du document XML , la première est la déclaration XML qui spécifie quelle est la version XML utilisée (1.0) et le type d'encodage du document (ISO-8859-1).

La seconde ligne indique que l'élément racine est « ABC », et précise où se trouve la DTD dans le système de fichiers de l'ordinateur.

<ABC>

<client id_client="" nom="" adresse="">

L'ensemble des éléments sont inclus dans l'élément racine <ABC> qui est la première balise ouverte.

Nous avons ensuite l'élément <client> qui inclut l'élément <commande> qui inclut les éléments <mesurage> et <charge_directe>.

La balise </commande> est refermée après l'élément <charge_directe>, la balise </client> est refermée après l'élément </commande>.

<ABC>

<client id_client="" nom="" adresse="">

<commande id_commande="" descriptif="" chiffre_affaire="">

<mesurage id_mesurage="" id_aktivite="" date="" quantite="" unite_oeuvre=""/>

<charge_directe id_charge_d="" id_pcmn="" montant_dir_htva_impute="" quantite=""/> </commande>

</client>

Au même niveau hiérarchique que l'élément <client>, l'élément <activité> qui inclut l'élément <composition_activite>.

La balise </activite> est refermée après l'élément </composition_activite>.

<activite id_activite="" nom_activite="" unite_oeuvre="">

<composition_activite id_compoact="" id_famille_kout="" proportion=""/> </activite>

L'élément <famille_cout> inclut l'élément <composition_famille>; la balise </famille_cout> est refermée après l'élément </composition_famille>.

<famille_cout id_famille_cout="" nom_famille="">

<composition_famille id_compofam="" id_pcmn_fam="" proportion_cf=""/> </famille_cout>

L'élément <charge_indirecte> inclut l'élément <imputation>, la balise </charge_indirecte> est

refermée après l'élément </imputation>.

<charge_indirecte id_chargeindirecte="" montant_htva_total="">

<imputation id_imputation="" id_pcmn_imputation="" montant_htva_impute=""/> </charge_indirecte>

Enfin, le dernier élément <pcmn> qui est lui aussi au même niveau hiérarchique que les éléments <client>, <activité>, <famille_cout> et <charge_indirecte>.

La balise de l'élément racine </ABC> est refermée.

<pcmn id_pcmn="" intitule=""/> </ABC>

Les données du document XML.

Disposant de la structure du document XML, nous devons y saisir les données comptables que nous déclarions au premier chapitre, ainsi que quelques mesurages et autres données client.

Nous distinguons deux types de données au sein du document XML: - les données relevant de la pratique de l'entreprise

- les données nécessaires à l'analyse ABC.

La seconde catégorie consistera en une information servant de base aux calculs ABC. Elle sera accèdée plus rarement en écriture, et cet accès devrait être idéalement restreint.

Il est nécessaire de bien comprendre les conséquences sur les résultats de l'application ABC avant de procéder à une modification de ces données.

Les données d'analyse ABC.

Ce sont les données des éléments <activite> et <composition_activite>, <famille_cout> et <composition_famille>.

Les activités.

Nous y transcrivons activité par activité quelles familles de coût les composent, et dans quelle proportion.

Cela a été défini dans le chapitre consacré à la méthode ABC, et synthétisé par un tableau que nous reproduisons.

 

Act1

Act2

Act3

Act4

Act5

Act6

Act7

Fam1

1

 
 
 
 
 
 

Fam2

0,3

0,4

 
 
 

0,3

 

Fam3

 
 

1

 
 
 
 

Fam4

 

0,42

 
 

0,34

0,24

 

Fam5

 
 
 
 
 

1

 

Fam6

 
 
 

1

 
 
 

Fam7 0,27 0,73

Fam8

1

Pour le premier élément traitant de l'activité « communication », les valeurs d'attributs sont:

id_activite: « act1 »

nom_activite: « act1_communication » (conformément à la liste de choix de la DTD) unité_oeuvre: « heure_communication » (conformément à la liste de choix de la DTD)

Les valeurs d'attribut des deux éléments <composition_activite> inclut dans l'élément <activite> sont:

id_compoact: « compoact001 » id_famille_kout: « fam1 »

proportion: « 1 »

et

id_compoact: « compoact002 » id_famille_kout: « fam2 »

proportion: « .3 »

Ce qui se lit: l'activité1 est composée de la famille de coûts « fam1 » qui intervient à 100%, et de la famille de coûts « fam2 » qui intervient à 30% dans le calcul de sa valeur.

<activite id_activite="act1" nom_activite="act1_communication" unite_oeuvre="heure_communication">

<composition_activite id_compoact="compoact001" id_famille_kout="fam1" proportion="1"/>

<composition_activite id_compoact="compoact002" id_famille_kout="fam2" proportion=".3"/> </activite>

Le même raisonnement est valable pour les sept activités décrites dans le chapitre ABC. Nous reproduisons la partie du document XML relative aux activités ci-dessous.

<activite id_activite="act1" nom_activite="act1_communication" unite_oeuvre="heure_communication">

<composition_activite id_compoact="compoact001" id_famille_kout="fam1" proportion="1"/>

<composition_activite id_compoact="compoact002" id_famille_kout="fam2" proportion=".3"/> </activite>

<activite id_activite="act2" nom_activite="act2_demarchage" unite_oeuvre="heure_demarchage">

<composition_activite id_compoact="compoact003" id_famille_kout="fam2" proportion=".4"/>

<composition_activite id_compoact="compoact004" id_famille_kout="fam4" proportion=".42"/> </activite>

<activite id_activite="act3" nom_activite="act3_logistique" unite_oeuvre="article_unitaire"> <composition_activite id_compoact="compoact005" id_famille_kout="fam3" proportion="1"/> <composition_activite id_compoact="compoact006" id_famille_kout="fam7" proportion=".27"/>

</activite>

<activite id_activite="act4" nom_activite="act4_transport" unite_oeuvre="kilometre">

<composition_activite id_compoact="compoact008" id_famille_kout="fam6" proportion="1"/> </activite>

<activite id_activite="act5" nom_activite="act5_production" unite_oeuvre="heure_production">

<composition_activite id_compoact="compoact009" id_famille_kout="fam4" proportion=".34"/>

<composition_activite id_compoact="compoact010" id_famille_kout="fam7" proportion=".73"/> </activite>

<activite id_activite="act6" nom_activite="act6_comptabilite_abc"

unite_oeuvre="heure_comptabilite_abc">

<composition_activite id_compoact="compoact011" id_famille_kout="fam5" proportion="1"/> <composition_activite id_compoact="compoact012" id_famille_kout="fam2" proportion=".3"/> <composition_activite id_compoact="compoact013" id_famille_kout="fam4" proportion=".24"/>

</activite>

<activite id_activite="act7" nom_activite="act7_telecom" unite_oeuvre="minute_telecom"> <composition_activite id_compoact="compoact002" id_famille_kout="fam8" proportion="1"/> </activite>

Les familles de coût.

Les familles de coût sont également décrites dans le chapitre1 dédié à ABC.

Chacune de ces huit familles sont constituées de postes pcmn qui interviennent dans des proportion parfois différentes.

Le fragment du document XML relatif aux familles de coût se lit de la même façon que celui cidessus traitant des activités.

La famille1 est constituée des postes pcmn « 615100 », « 615200 » et « 615220 » qui interviennent chacun à 100%.

Dans la famille2, nous trouvons le poste pcmn « 611300 » pour 40%, etc..

<famille_cout id_famille_cout="fam1" nom_famille="fam1_publicite">

<composition_famille id_compofam="compofam01" id_pcmn_fam="615100" proportion_cf="1"/>
<composition_famille id_compofam="compofam02" id_pcmn_fam="615200" proportion_cf="1"/>
<composition_famille id_compofam="compofam03" id_pcmn_fam="615220" proportion_cf="1"/>

</famille_cout>

<famille_cout id_famille_cout="fam2" nom_famille="fam2_bureau">

<composition_famille id_compofam="compofam04" id_pcmn_fam="611300" proportion_cf=".4"/> <composition_famille id_compofam="compofam05" id_pcmn_fam="612000" proportion_cf=".4"/> <composition_famille id_compofam="compofam06" id_pcmn_fam="612400" proportion_cf="1"/> <composition_famille id_compofam="compofam07" id_pcmn_fam="612500" proportion_cf="1"/> <composition_famille id_compofam="compofam08" id_pcmn_fam="616100" proportion_cf="1"/> <composition_famille id_compofam="compofam09" id_pcmn_fam="630210" proportion_cf=".4"/> <composition_famille id_compofam="compofam10" id_pcmn_fam="630231" proportion_cf=".8"/> <composition_famille id_compofam="compofam30" id_pcmn_fam="640200" proportion_cf=".4"/>

</famille_cout>

<famille_cout id_famille_cout="fam3" nom_famille="fam3_stock">

<composition_famille id_compofam="compofam11" id_pcmn_fam="611300" proportion_cf=".6"/>
<composition_famille id_compofam="compofam12" id_pcmn_fam="612000" proportion_cf=".6"/>
<composition_famille id_compofam="compofam13" id_pcmn_fam="630210" proportion_cf=".6"/>

<composition_famille id_compofam="compofam14" id_pcmn_fam="630220" proportion_cf=".2"/>
<composition_famille id_compofam="compofam15" id_pcmn_fam="630231" proportion_cf=".2"/>
<composition_famille id_compofam="compofam31" id_pcmn_fam="640200" proportion_cf=".6"/>

</famille_cout>

<famille_cout id_famille_cout="fam4" nom_famille="fam4_formation_documentation"> <composition_famille id_compofam="compofam16" id_pcmn_fam="612300" proportion_cf="1"/> </famille_cout>

<famille_cout id_famille_cout="fam5" nom_famille="fam5_honoraires">

<composition_famille id_compofam="compofam17" id_pcmn_fam="613250" proportion_cf="1"/> </famille_cout>

<famille_cout id_famille_cout="fam6" nom_famille="fam6_transport">

<composition_famille id_compofam="compofam18" id_pcmn_fam="606140" proportion_cf="1"/> <composition_famille id_compofam="compofam19" id_pcmn_fam="611150" proportion_cf="1"/> <composition_famille id_compofam="compofam20" id_pcmn_fam="611350" proportion_cf="1"/> <composition_famille id_compofam="compofam21" id_pcmn_fam="612160" proportion_cf="1"/> <composition_famille id_compofam="compofam22" id_pcmn_fam="613530" proportion_cf="1"/> <composition_famille id_compofam="compofam23" id_pcmn_fam="630232" proportion_cf="1"/> <composition_famille id_compofam="compofam24" id_pcmn_fam="640100" proportion_cf="1"/>

</famille_cout>

<famille_cout id_famille_cout="fam7" nom_famille="fam7_outil_production">

<composition_famille id_compofam="compofam25" id_pcmn_fam="601300" proportion_cf="1"/> <composition_famille id_compofam="compofam26" id_pcmn_fam="611130" proportion_cf="1"/> <composition_famille id_compofam="compofam27" id_pcmn_fam="613540" proportion_cf="1"/> <composition_famille id_compofam="compofam28" id_pcmn_fam="630220"proportion_cf=".8"/>

</famille_cout>

<famille_cout id_famille_cout="fam8" nom_famille="fam8_telecom">

<composition_famille id_compofam="compofam29" id_pcmn_fam="616200" proportion_cf="1"/>
<composition_famille id_compofam="compofam32" id_pcmn_fam="616300" proportion_cf="1"/>
<composition_famille id_compofam="compofam33" id_pcmn_fam="616400" proportion_cf="1"/>

</famille_cout>

Les données d'exercice de l'entreprise.

Ces données concernent les clients, commandes, mesurages et charges directes et indirectes que nous imputons.

Les clients et commandes.

Nous avons ouvert trois éléments <client>. Le premier élément <client> a pour attributs:

id_client: « jaeger01 » (conformément à la liste de choix de la DTD) nom: « jaeger » (conformément à la liste de choix de la DTD) adresse: « rue du bois 36 1000 bruxelles »

Ce client a passé une commande, que nous lisons dans l'élément <commande> qui est inclu (dans

l'élément <client> que nous venons de décrire).

<commande

id_commande: « com001 » descriptif: « systeme solaire » chiffre_affaire= « 12000 »>

La lecture est identique pour chaque élément <client>.

Le id de cette commande est « com001 », son objet consistera à vendre et placer un systeme solaire, le chiffre d'affaire en est de 12000 (Euro)

<client id_client="jaeger01" nom="jaeger" adresse="rue du bois 36 à 1000 bruxelles">

<commande id_commande="com001" descriptif="systeme solaire" chiffre_affaire="12000">

<client id_client="cairelli02" nom="cairelli" adresse="grand-place 1 à 1200 Bruxelles">

<commande id_commande="com002" descriptif="extension système" chiffre_affaire="2310">

<client id_client="panerai03" nom="panerai" adresse="av. des Arts 2 1200 Bruxelles">

<commande id_commande="com004" descriptif="système solaire" chiffre_affaire="6400">

Les mesurages et charges directes.

Revenons au premier élément <client>.

Nous lui avons attribué deux commandes (deux éléments <commande> inclus dans les tags <client>).

Il a ensuite été procédé à des mesurages d'unités d'oeuvre des activités utilisées.

Dans le document XML, nous avons incorporé à l'élément <commande> dont l'attribut id_commande est « com001 », seize éléments <mesurage> pour seize mesurages réalisés pour cette commande.

La lecture du premier mesurage:

id_mesurage="mes001"

id_aktivite="act2"

date="01 feb 2009"

quantite="4"

unite_oeuvre="heure_demarchage"/>

Le mesurage1 se rapportant à l'activité2 a été réalisé le 01 février 2009; 4 unités d'oeuvre de type « heure_demarchage » ont été consommées.

<client id_client="jaeger01" nom="jaeger" adresse="rue du bois 36 à 1000 bruxelles"> <commande id_commande="com001" descriptif="rediger exemple" chiffre_affaire="12000"> <mesurage id_mesurage="mes001" id_aktivite="act2" date="01 feb 2009" quantite="4" unite_oeuvre="heure_demarchage"/>

<mesurage id_mesurage="mes002" id_aktivite="act7" date="01 feb 2009" quantite="23" unite_oeuvre="minute_telecom"/>

<mesurage id_mesurage="mes003" id_aktivite="act4" date="01 feb 2009" quantite="42" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes004" id_aktivite="act5" date="15 feb 2009" quantite="8" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes005" id_aktivite="act4" date="01 feb 2009" quantite="40" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes006" id_aktivite="act3" date="13 feb 2009" quantite="24" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes007" id_aktivite="act4" date="01 feb 2009" quantite="22" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes008" id_aktivite="act5" date="16 feb 2009" quantite="8.5" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes009" id_aktivite="act4" date="01 feb 2009" quantite="38" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes010" id_aktivite="act5" date="15 feb 2009" quantite="6" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes011" id_aktivite="act4" date="01 feb 2009" quantite="40" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes012" id_aktivite="act5" date="15 feb 2009" quantite="10" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes013" id_aktivite="act3" date="13 feb 2009" quantite="11" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes014" id_aktivite="act2" date="01 feb 2009" quantite="1.5" unite_oeuvre="heure_demarchage"/>

<mesurage id_mesurage="mes015" id_aktivite="act6" date="01 feb 2009" quantite="1.5" unite_oeuvre="heure_comptabilite_abc"/>

<mesurage id_mesurage="mes016" id_aktivite="act7" date="01 feb 2009" quantite="51" unite_oeuvre="minute_telecom"/>

<charge_directe id_charge_d="fact0020" id_pcmn="601000" montant_dir_htva_impute="4756"

quantite="1"/>

<charge_directe id_charge_d="fact0023" id_pcmn="601000" montant_dir_htva_impute="322"

quantite="1"/>

<charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25"

quantite="32.5"/>

</commande>

<commande id_commande="com003" descriptif="seconde commande" chiffre_affaire="1852"> <mesurage id_mesurage="mes022" id_aktivite="act4" date="12 avril 2009" quantite="42" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes023" id_aktivite="act5" date="12 avril 2009" quantite="2" unite_oeuvre="heure_production"/>

<charge_directe id_charge_d="fact0041" id_pcmn="601000" montant_dir_htva_impute="640" quantite="1"/>

<charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="2"/> </commande>

</client>

<client id_client="cairelli02" nom="cairelli" adresse="grand-place 1 à 1200 Bruxelles"> <commande id_commande="com002" descriptif="production exemple" chiffre_affaire="2310"> <mesurage id_mesurage="mes017" id_aktivite="act4" date="25 mars 2009" quantite="12" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes018" id_aktivite="act5" date="25 mars 2009" quantite="8" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes019" id_aktivite="act4" date="28 mars 2009" quantite="20" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes020" id_aktivite="act5" date="28 mars 2009" quantite="7.25" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes021" id_aktivite="act6" date="02 avril 2009" quantite=".5" unite_oeuvre="heure_comptabilite_abc"/>

<charge_directe id_charge_d="fact0005" id_pcmn="601000" montant_dir_htva_impute="801" quantite="1"/>

<charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="15.25"/>

</commande>

</client>

<client id_client="panerai03" nom="panerai" adresse="av. des Arts 2 1200 Bruxelles"> <commande id_commande="com004" descriptif="système solaire" chiffre_affaire="6400"> <mesurage id_mesurage="mes024" id_aktivite="act2" date="06 mars 2009" quantite="2.5"

unite_oeuvre="heure_communication"/>

<mesurage id_mesurage="mes025" id_aktivite="act4" date="06 mars 2009" quantite="61" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes026" id_aktivite="act5" date="28 mars 2009" quantite="10" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes027" id_aktivite="act3" date="13 feb 2009" quantite="14" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes028" id_aktivite="act4" date="06 mars 2009" quantite="17" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes029" id_aktivite="act3" date="13 feb 2009" quantite="04" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes030" id_aktivite="act4" date="06 mars 2009" quantite="85" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes031" id_aktivite="act5" date="28 mars 2009" quantite="7" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes032" id_aktivite="act4" date="06 mars 2009" quantite="64" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes033" id_aktivite="act5" date="28 mars 2009" quantite="9" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes034" id_aktivite="act7" date="26 mars 2009" quantite="41" unite_oeuvre="minute_telecom"/>

<mesurage id_mesurage="mes035" id_aktivite="act6" date="26 mars 2009" quantite="1" unite_oeuvre="heure_comptabilite_abc"/>

<charge_directe id_charge_d="fact0018" id_pcmn="601000" montant_dir_htva_impute="3406" quantite="1"/>

<charge_directe id_charge_d="fact0030" id_pcmn="601000" montant_dir_htva_impute="604" quantite="1"/>

<charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="26"/>

</commande>

</client>

Toujours dans le cadre de notre premier élément <client>, à la suite des éléments <mesurage>, nous créons trois éléments <charge_directe>

<client id_client="jaeger01" nom="jaeger" adresse="rue du bois 36 à 1000 bruxelles"> <commande id_commande="com001" descriptif="rediger exemple">

<mesurage id_mesurage="mes001" id_aktivite="act2" date="01 feb 2009" quantite="4"

<mesurage id_mesurage="mes013" id_aktivite="act3" date="13 feb 2009" quantite="11"

unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes014" id_aktivite="act2" date="01 feb 2009" quantite="1.5" unite_oeuvre="heure_demarchage"/>

<mesurage id_mesurage="mes015" id_aktivite="act6" date="01 feb 2009" quantite="1.5" unite_oeuvre="heure_comptabilite_abc"/>

<mesurage id_mesurage="mes016" id_aktivite="act7" date="01 feb 2009" quantite="51" unite_oeuvre="minute_telecom"/>

<charge_directe id_charge_d="fact0020" id_pcmn="601000" montant_dir_htva_impute="4756" quantite="1"/>

<charge_directe id_charge_d="fact0023" id_pcmn="601000" montant_dir_htva_impute="322" quantite="1"/>

<charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="32.5"/>

</commande>

La lecture du dernier élément « charge_directe » est: la charge directe dont le id est « fact9999 » a été imputée sous le numéro pcmn 620000; le montant imputé est de 25 (Euro), la quantité 32,5 (unités).

Trois charges directes sont imputées à cette commande

- des achats de fournitures pour un montant de 4756 (Euro), et 322 (Euro).

- des heures de production, dont la quantité de 32,5 heures correspond aux mesurages de

« production » de la commande. Le montant de 25 (Euro) par heure est une valeur fournie par l'utilisateur.

Les charges indirectes.

Cette partie du document XML concerne les charges indirectes et la méthode selon laquelle nous les imputons.

Précisions.

Une même pièce comptable peut contenir des charges directes et indirectes, et les charges indirectes d'une même pièce comptable peuvent être incorporées dans différents postes pcmn.

L'attribut « id_chargeindirecte » prendra la même valeur que dans la comptabilité générale. Autrement dit, si la pièce comptable porte dans la comptabilité générale le numéro 001, la même valeur sera appliquée pour l'attribut « id_chargeindirecte » : « fact001 ».

Nous ouvrons un élément <charge_indirecte> pour chaque pièce comptable comportant une charge indirecte.

Pour chaque imputation de cette pièce comptable, nous ouvrons un élément <imputation>, inclu dans l'élément <charge_indirecte>.

<charge_indirecte id_chargeindirecte="fact001" montant_htva_total="2000">

<imputation id_imputation="imp0001" id_pcmn_imputation="601300" montant_htva_impute="850"/> <imputation id_imputation="imp0002" id_pcmn_imputation="611300" montant_htva_impute="1150"/> </charge_indirecte>

Examinons le premier élément <charge_indirecte> de ce fragment du document XML:

id_chargeindirecte="fact001" montant_htva_total="2000"

y sont inclus deux éléments <imputation>:

id_imputation="imp0001" id_pcmn_imputation="601300" montant_htva_impute="850 »

et

imputation id_imputation="imp0002" id_pcmn_imputation="611300" montant_htva_impute="1150"

La lecture en est: la facture fact001 dont le montant total hors TVA est de 2000 (Euro), est imputée en deux fois, dans le poste pcmn 601300 pour un montant hors TVA de 850 (Euro), et dans le poste pcmn 611300 pour un montant hors TVA de 1150 (Euro).

<charge_indirecte id_chargeindirecte="fact005" montant_htva_total="2401">

<imputation id_imputation="imp0003" id_pcmn_imputation="615200" montant_htva_impute="1600"/> </charge_indirecte>

La lecture de ce second élément: la facture fact005 dont le montant total hors TVA est de 2401(Euro) est imputée dans le poste pcmn 615200 pour un montant hors TVA de 1600 (Euro). Cette facture comportait une charge directe pour un montant hors TVA de 801 (Euro), que nous avons imputé dans la commande « com002 » en charge_directe.

La lecture de tous les éléments <charge_indirecte> dans le fragment de document XML ci-dessous est identique.

<charge_indirecte id_chargeindirecte="fact001" montant_htva_total="2000">

<imputation id_imputation="imp0001" id_pcmn_imputation="601300" montant_htva_impute="850"/> <imputation id_imputation="imp0002" id_pcmn_imputation="611300" montant_htva_impute="1150"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact005" montant_htva_total="2401">

<imputation id_imputation="imp0003" id_pcmn_imputation="615200" montant_htva_impute="1600"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact011" montant_htva_total="710">

<imputation id_imputation="imp0004" id_pcmn_imputation="615100"montant_htva_impute="710.2"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact015" montant_htva_total="623.85">

<imputation id_imputation="imp0005" id_pcmn_imputation="612400" montant_htva_impute="466"/> <imputation id_imputation="imp0006" id_pcmn_imputation="612300"

montant_htva_impute="157.85"/>

</charge_indirecte>

<charge_indirecte id_chargeindirecte="fact016" montant_htva_total="310">

<imputation id_imputation="imp0007" id_pcmn_imputation="612160" montant_htva_impute="310"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact028" montant_htva_total="4562">

<imputation id_imputation="imp0008" id_pcmn_imputation="630232" montant_htva_impute="4562"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact031" montant_htva_total="2100">

<imputation id_imputation="imp0009" id_pcmn_imputation="630220" montant_htva_impute="2100"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact032" montant_htva_total="2542">

<imputation id_imputation="imp0010" id_pcmn_imputation="630210" montant_htva_impute="2542"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact054" montant_htva_total="600">

<imputation id_imputation="imp0011" id_pcmn_imputation="613250" montant_htva_impute="600"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact055" montant_htva_total="240">

<imputation id_imputation="imp0012" id_pcmn_imputation="612000" montant_htva_impute="240"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact056" montant_htva_total="211">

<imputation id_imputation="imp0013" id_pcmn_imputation="612160" montant_htva_impute="211"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact062" montant_htva_total="118.7">

<imputation id_imputation="imp0014" id_pcmn_imputation="616200"

montant_htva_impute="118.7"/>

</charge_indirecte>

<charge_indirecte id_chargeindirecte="fact071" montant_htva_total="560">

<imputation id_imputation="imp0015" id_pcmn_imputation="612300" montant_htva_impute="560"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact072" montant_htva_total="422">

<imputation id_imputation="imp0016" id_pcmn_imputation="611130" montant_htva_impute="422"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact075" montant_htva_total="58">

<imputation id_imputation="imp0017" id_pcmn_imputation="616300" montant_htva_impute="58"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact100" montant_htva_total="74.6">

<imputation id_imputation="imp0018" id_pcmn_imputation="616300" montant_htva_impute="74.6"/> </charge_indirecte>

La dernière partie du document XML concerne l'élément <pcmn> Nous avons créé ceux qui sont autorisés par la DTD.

<pcmn id_pcmn="601300" intitule="601300_outillage"/>

<pcmn id_pcmn="611350" intitule="611350_entretien_vehicule"/> <pcmn id_pcmn="612160" intitule="612160_carburant"/>

<pcmn id_pcmn="612300" intitule="612300_documentation"/>

<pcmn id_pcmn="612400" intitule="612400_imprimes_fourn_bureau"/> <pcmn id_pcmn="613250" intitule="613250_honoraire_comptable"/> <pcmn id_pcmn="611130" intitule="611130_location_outillage"/> <pcmn id_pcmn="611150" intitule="611150_location_vehicule"/> <pcmn id_pcmn="611300" intitule="611300_entretien_locaux"/>

<pcmn id_pcmn="612500" intitule="612500_petit_mat_bureau"/> <pcmn id_pcmn="613530" intitule="613530_assurance_vehicule"/> <pcmn id_pcmn="613540" intitule="613540_assurance_RC"/> <pcmn id_pcmn="615000" intitule="615000_frais_deplacement"/> <pcmn id_pcmn="615100" intitule="615100_frais_representation"/> <pcmn id_pcmn="615200" intitule="615200_publicite_annonces"/> <pcmn id_pcmn="615220" intitule="615220_foires_expositions"/> <pcmn id_pcmn="616100" intitule="616100_frais_postaux"/> <pcmn id_pcmn="616200" intitule="616200_telephone"/>

<pcmn id_pcmn="616300" intitule="616300_gsm"/>

<pcmn id_pcmn="616400" intitule="616400_internet"/>

<pcmn id_pcmn="630210" intitule="630210_dot_amort_immeuble"/> <pcmn id_pcmn="630220" intitule="630220_dot_amort_outil"/>

<pcmn id_pcmn="630231" intitule="630231_dot_amort_mobilier"/> <pcmn id_pcmn="612000" intitule="612000_eau_gaz_elec"/>

<pcmn id_pcmn="630232" intitule="630232_dot_amort_matroulant"/> <pcmn id_pcmn="640100" intitule="640100_dot_taxe_vehicule"/> <pcmn id_pcmn="640200" intitule="640200_precompte_immobilier"/> </ABC>

La lecture du dernier élément « pcmn » est: le poste dont le id_pcmn est 640200 est intitulé 640200 precompte immobilier. La lecture est identique pour les éléments précédents.

Enfin, le document XML est fermé par la balise clôturant l'élément racine: </ABC>

Le document ABC/XML entier.

Nous reproduisons ci-dessous l'entièreté du document XML.

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE ABC SYSTEM "/home/jean/Memoireulb/XQ27avril/abc_avril27_id01.dtd">

<ABC>

<client id_client="jaeger01" nom="jaeger" adresse="rue du bois 36 à 1000 bruxelles">

<commande id_commande="com001" descriptif="systeme solaire" chiffre_affaire="12000">

<mesurage id_mesurage="mes001" id_aktivite="act2" date="01 feb 2009" quantite="4" unite_oeuvre="heure_demarchage"/>

<mesurage id_mesurage="mes002" id_aktivite="act7" date="01 feb 2009" quantite="23" unite_oeuvre="minute_telecom"/>

<mesurage id_mesurage="mes003" id_aktivite="act4" date="01 feb 2009" quantite="42" unite_oeuvre="kilometre"/> <mesurage id_mesurage="mes004" id_aktivite="act5" date="15 feb 2009" quantite="8" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes005" id_aktivite="act4" date="01 feb 2009" quantite="40" unite_oeuvre="kilometre"/> <mesurage id_mesurage="mes006" id_aktivite="act3" date="13 feb 2009" quantite="24" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes007" id_aktivite="act4" date="01 feb 2009" quantite="22" unite_oeuvre="kilometre"/> <mesurage id_mesurage="mes008" id_aktivite="act5" date="16 feb 2009" quantite="8.5" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes009" id_aktivite="act4" date="01 feb 2009" quantite="38" unite_oeuvre="kilometre"/> <mesurage id_mesurage="mes010" id_aktivite="act5" date="15 feb 2009" quantite="6" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes011" id_aktivite="act4" date="01 feb 2009" quantite="40" unite_oeuvre="kilometre"/> <mesurage id_mesurage="mes012" id_aktivite="act5" date="15 feb 2009" quantite="10" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes013" id_aktivite="act3" date="13 feb 2009" quantite="11" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes014" id_aktivite="act2" date="01 feb 2009" quantite="1.5" unite_oeuvre="heure_demarchage"/>

<mesurage id_mesurage="mes015" id_aktivite="act6" date="01 feb 2009" quantite="1.5" unite_oeuvre="heure_comptabilite_abc"/>

<mesurage id_mesurage="mes016" id_aktivite="act7" date="01 feb 2009" quantite="51" unite_oeuvre="minute_telecom"/>

<charge_directe id_charge_d="fact0020" id_pcmn="601000" montant_dir_htva_impute="4756" quantite="1"/> <charge_directe id_charge_d="fact0023" id_pcmn="601000" montant_dir_htva_impute="322" quantite="1"/> <charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="32.5"/> </commande>

<commande id_commande="com003" descriptif="seconde commande" chiffre_affaire="1852"> <mesurage id_mesurage="mes022" id_aktivite="act4" date="12 avril 2009" quantite="42" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes023" id_aktivite="act5" date="12 avril 2009" quantite="2" unite_oeuvre="heure_production"/>

<charge_directe id_charge_d="fact0041" id_pcmn="601000" montant_dir_htva_impute="640" quantite="1"/> <charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="2"/> </commande>

</client>

<client id_client="cairelli02" nom="cairelli" adresse="grand-place 1 à 1200 Bruxelles"> <commande id_commande="com002" descriptif="extension système" chiffre_affaire="2310"> <mesurage id_mesurage="mes017" id_aktivite="act4" date="25 mars 2009" quantite="12"

unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes018" id_aktivite="act5" date="25 mars 2009" quantite="8" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes019" id_aktivite="act4" date="28 mars 2009" quantite="20" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes020" id_aktivite="act5" date="28 mars 2009" quantite="7.25" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes021" id_aktivite="act6" date="02 avril 2009" quantite=".5" unite_oeuvre="heure_comptabilite_abc"/>

<charge_directe id_charge_d="fact0005" id_pcmn="601000" montant_dir_htva_impute="801" quantite="1"/> <charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="15.25"/> </commande>

</client>

<client id_client="panerai03" nom="panerai" adresse="av. des Arts 2 1200 Bruxelles"> <commande id_commande="com004" descriptif="système solaire" chiffre_affaire="6400"> <mesurage id_mesurage="mes024" id_aktivite="act2" date="06 mars 2009" quantite="2.5"

unite_oeuvre="heure_communication"/>

<mesurage id_mesurage="mes025" id_aktivite="act4" date="06 mars 2009" quantite="61" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes026" id_aktivite="act5" date="28 mars 2009" quantite="10" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes027" id_aktivite="act3" date="13 feb 2009" quantite="14" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes028" id_aktivite="act4" date="06 mars 2009" quantite="17" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes029" id_aktivite="act3" date="13 feb 2009" quantite="04" unite_oeuvre="article_unitaire"/>

<mesurage id_mesurage="mes030" id_aktivite="act4" date="06 mars 2009" quantite="85" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes031" id_aktivite="act5" date="28 mars 2009" quantite="7" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes032" id_aktivite="act4" date="06 mars 2009" quantite="64" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes033" id_aktivite="act5" date="28 mars 2009" quantite="9" unite_oeuvre="heure_production"/>

<mesurage id_mesurage="mes034" id_aktivite="act7" date="26 mars 2009" quantite="41" unite_oeuvre="minute_telecom"/>

<mesurage id_mesurage="mes035" id_aktivite="act6" date="26 mars 2009" quantite="1" unite_oeuvre="heure_comptabilite_abc"/>

<charge_directe id_charge_d="fact0018" id_pcmn="601000" montant_dir_htva_impute="3406" quantite="1"/> <charge_directe id_charge_d="fact0030" id_pcmn="601000" montant_dir_htva_impute="604" quantite="1"/> <charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25" quantite="26"/> </commande>

</client>

</client>

<activite id_activite="act1" nom_activite="act1_communication" unite_oeuvre="heure_communication"> <composition_activite id_compoact="compoact001" id_famille_kout="fam1" proportion="1"/>

<composition_activite id_compoact="compoact002" id_famille_kout="fam2" proportion=".3"/> </activite>

<activite id_activite="act2" nom_activite="act2_demarchage" unite_oeuvre="heure_demarchage">

<composition_activite id_compoact="compoact003" id_famille_kout="fam2" proportion=".4"/>

<composition_activite id_compoact="compoact004" id_famille_kout="fam4" proportion=".42"/> </activite>

<activite id_activite="act3" nom_activite="act3_logistique" unite_oeuvre="article_unitaire">

<composition_activite id_compoact="compoact005" id_famille_kout="fam3" proportion="1"/>

<composition_activite id_compoact="compoact006" id_famille_kout="fam7" proportion=".27"/> </activite>

<activite id_activite="act4" nom_activite="act4_transport" unite_oeuvre="kilometre"> <composition_activite id_compoact="compoact008" id_famille_kout="fam6" proportion="1"/> </activite>

<activite id_activite="act5" nom_activite="act5_production" unite_oeuvre="heure_production">

<composition_activite id_compoact="compoact009" id_famille_kout="fam4" proportion=".34"/>

<composition_activite id_compoact="compoact010" id_famille_kout="fam7" proportion=".73"/> </activite>

<activite id_activite="act6" nom_activite="act6_comptabilite_abc" unite_oeuvre="heure_comptabilite_abc"> <composition_activite id_compoact="compoact011" id_famille_kout="fam5" proportion="1"/> <composition_activite id_compoact="compoact012" id_famille_kout="fam2" proportion=".3"/> <composition_activite id_compoact="compoact013" id_famille_kout="fam4" proportion=".24"/>

</activite>

<activite id_activite="act7" nom_activite="act7_telecom" unite_oeuvre="minute_telecom"> <composition_activite id_compoact="compoact002" id_famille_kout="fam8" proportion="1"/> </activite>

<famille_cout id_famille_cout="fam1" nom_famille="fam1_publicite">

<composition_famille id_compofam="compofam01" id_pcmn_fam="615100" proportion_cf="1"/>
<composition_famille id_compofam="compofam02" id_pcmn_fam="615200" proportion_cf="1"/>
<composition_famille id_compofam="compofam03" id_pcmn_fam="615220" proportion_cf="1"/>

</famille_cout>

<famille_cout id_famille_cout="fam2" nom_famille="fam2_bureau">

<composition_famille id_compofam="compofam04" id_pcmn_fam="611300" proportion_cf=".4"/> <composition_famille id_compofam="compofam05" id_pcmn_fam="612000" proportion_cf=".4"/> <composition_famille id_compofam="compofam06" id_pcmn_fam="612400" proportion_cf="1"/> <composition_famille id_compofam="compofam07" id_pcmn_fam="612500" proportion_cf="1"/> <composition_famille id_compofam="compofam08" id_pcmn_fam="616100" proportion_cf="1"/> <composition_famille id_compofam="compofam09" id_pcmn_fam="630210" proportion_cf=".4"/> <composition_famille id_compofam="compofam10" id_pcmn_fam="630231" proportion_cf=".8"/> <composition_famille id_compofam="compofam30" id_pcmn_fam="640200" proportion_cf=".4"/>

</famille_cout>

<famille_cout id_famille_cout="fam3" nom_famille="fam3_stock">

<composition_famille id_compofam="compofam11" id_pcmn_fam="611300" proportion_cf=".6"/> <composition_famille id_compofam="compofam12" id_pcmn_fam="612000" proportion_cf=".6"/> <composition_famille id_compofam="compofam13" id_pcmn_fam="630210" proportion_cf=".6"/> <composition_famille id_compofam="compofam14" id_pcmn_fam="630220" proportion_cf=".2"/> <composition_famille id_compofam="compofam15" id_pcmn_fam="630231" proportion_cf=".2"/> <composition_famille id_compofam="compofam31" id_pcmn_fam="640200" proportion_cf=".6"/>

</famille_cout>

<famille_cout id_famille_cout="fam4" nom_famille="fam4_formation_documentation"> <composition_famille id_compofam="compofam16" id_pcmn_fam="612300" proportion_cf="1"/>

</famille_cout>

<famille_cout id_famille_cout="fam5" nom_famille="fam5_honoraires">

<composition_famille id_compofam="compofam17" id_pcmn_fam="613250" proportion_cf="1"/> </famille_cout>

<famille_cout id_famille_cout="fam6" nom_famille="fam6_transport">

<composition_famille id_compofam="compofam18" id_pcmn_fam="606140" proportion_cf="1"/> <composition_famille id_compofam="compofam19" id_pcmn_fam="611150" proportion_cf="1"/> <composition_famille id_compofam="compofam20" id_pcmn_fam="611350" proportion_cf="1"/> <composition_famille id_compofam="compofam21" id_pcmn_fam="612160" proportion_cf="1"/> <composition_famille id_compofam="compofam22" id_pcmn_fam="613530" proportion_cf="1"/> <composition_famille id_compofam="compofam23" id_pcmn_fam="630232" proportion_cf="1"/> <composition_famille id_compofam="compofam24" id_pcmn_fam="640100" proportion_cf="1"/>

</famille_cout>

<famille_cout id_famille_cout="fam7" nom_famille="fam7_outil_production">

<composition_famille id_compofam="compofam25" id_pcmn_fam="601300" proportion_cf="1"/> <composition_famille id_compofam="compofam26" id_pcmn_fam="611130" proportion_cf="1"/> <composition_famille id_compofam="compofam27" id_pcmn_fam="613540" proportion_cf="1"/> <composition_famille id_compofam="compofam28" id_pcmn_fam="630220" proportion_cf=".8"/>

</famille_cout>

<famille_cout id_famille_cout="fam8" nom_famille="fam8_telecom">

<composition_famille id_compofam="compofam29" id_pcmn_fam="616200" proportion_cf="1"/>
<composition_famille id_compofam="compofam32" id_pcmn_fam="616300" proportion_cf="1"/>
<composition_famille id_compofam="compofam33" id_pcmn_fam="616400" proportion_cf="1"/>

</famille_cout>

<charge_indirecte id_chargeindirecte="fact001" montant_htva_total="2000">

<imputation id_imputation="imp0001" id_pcmn_imputation="601300" montant_htva_impute="850"/>

<imputation id_imputation="imp0002" id_pcmn_imputation="611300" montant_htva_impute="1150"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact005" montant_htva_total="2401">

<imputation id_imputation="imp0003" id_pcmn_imputation="615200" montant_htva_impute="1600"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact011" montant_htva_total="710">

<imputation id_imputation="imp0004" id_pcmn_imputation="615100" montant_htva_impute="710.2"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact015" montant_htva_total="623.85">

<imputation id_imputation="imp0005" id_pcmn_imputation="612400" montant_htva_impute="466"/>

<imputation id_imputation="imp0006" id_pcmn_imputation="612300" montant_htva_impute="157.85"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact016" montant_htva_total="310">

<imputation id_imputation="imp0007" id_pcmn_imputation="612160" montant_htva_impute="310"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact028" montant_htva_total="4562">

<imputation id_imputation="imp0008" id_pcmn_imputation="630232" montant_htva_impute="4562"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact031" montant_htva_total="2100">

<imputation id_imputation="imp0009" id_pcmn_imputation="630220" montant_htva_impute="2100"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact032" montant_htva_total="2542">

<imputation id_imputation="imp0010" id_pcmn_imputation="630210" montant_htva_impute="2542"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact054" montant_htva_total="600">

<imputation id_imputation="imp0011" id_pcmn_imputation="613250" montant_htva_impute="600"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact055" montant_htva_total="240">

<imputation id_imputation="imp0012" id_pcmn_imputation="612000" montant_htva_impute="240"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact056" montant_htva_total="211">

<imputation id_imputation="imp0013" id_pcmn_imputation="612160" montant_htva_impute="211"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact062" montant_htva_total="118.7">

<imputation id_imputation="imp0014" id_pcmn_imputation="616200" montant_htva_impute="118.7"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact071" montant_htva_total="560">

<imputation id_imputation="imp0015" id_pcmn_imputation="612300" montant_htva_impute="560"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact072" montant_htva_total="422">

<imputation id_imputation="imp0016" id_pcmn_imputation="611130" montant_htva_impute="422"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact075" montant_htva_total="58">

<imputation id_imputation="imp0017" id_pcmn_imputation="616300" montant_htva_impute="58"/> </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact100" montant_htva_total="74.6">

<imputation id_imputation="imp0018" id_pcmn_imputation="616300" montant_htva_impute="74.6"/> </charge_indirecte>

<pcmn id_pcmn="601000" intitule="601000_achat_fournitures"/>

<pcmn id_pcmn="601300" intitule="601300_outillage"/>

<pcmn id_pcmn="611350" intitule="611350_entretien_vehicule"/>

<pcmn id_pcmn="612160" intitule="612160_carburant"/>

<pcmn id_pcmn="612300" intitule="612300_documentation"/>

<pcmn id_pcmn="612400" intitule="612400_imprimes_fourn_bureau"/>

<pcmn id_pcmn="613250" intitule="613250_honoraire_comptable"/>

<pcmn id_pcmn="611130" intitule="611130_location_outillage"/>

<pcmn id_pcmn="611150" intitule="611150_location_vehicule"/>

<pcmn id_pcmn="611300" intitule="611300_entretien_locaux"/>

<pcmn id_pcmn="612500" intitule="612500_petit_mat_bureau"/>

<pcmn id_pcmn="613530" intitule="613530_assurance_vehicule"/>

<pcmn id_pcmn="613540" intitule="613540_assurance_RC"/>

<pcmn id_pcmn="615000" intitule="615000_frais_deplacement"/>

<pcmn id_pcmn="615100" intitule="615100_frais_representation"/>

<pcmn id_pcmn="615200" intitule="615200_publicite_annonces"/>

<pcmn id_pcmn="615220" intitule="615220_foires_expositions"/>

<pcmn id_pcmn="616100" intitule="616100_frais_postaux"/>

<pcmn id_pcmn="616200" intitule="616200_telephone"/>

<pcmn id_pcmn="616300" intitule="616300_gsm"/>

<pcmn id_pcmn="616400" intitule="616400_internet"/>

<pcmn id_pcmn="620000" intitule="620000_remuneration"/>

<pcmn id_pcmn="630210" intitule="630210_dot_amort_immeuble"/>

<pcmn id_pcmn="630220" intitule="630220_dot_amort_outil"/>

<pcmn id_pcmn="630231" intitule="630231_dot_amort_mobilier"/>

<pcmn id_pcmn="612000" intitule="612000_eau_gaz_elec"/>

<pcmn id_pcmn="630232" intitule="630232_dot_amort_matroulant"/>

<pcmn id_pcmn="640100" intitule="640100_dot_taxe_vehicule"/>

<pcmn id_pcmn="640200" intitule="640200_precompte_immobilier"/>

</ABC>

Chapitre 6. XQuery, outil de requête.

Avant de passer en la partie du mémoire consacrée aux requêtes portant sur le document XML, nous présentons ici XQuery, outil de requête qui sera utilisé.

Nous en brossons un bref historique et tentons d'en décrire le fonctionnement, une compréhension du modèle interne pouvant aider à son utilisation.

Nb.: nous utiliserons des termes techniques en langue anglaise, les ouvrages lus à propos de XQuery étant rédigés en langue anglaise, nous préférons utiliser le vocabulaire existant que de tenter une traduction maladroite.

Historique.

Le format XML ayant été largement adopté, une profusion de documents XML, bases de données XML sont apparus. Il est devenu nécessaire de disposer d'un outil permettant d'extraire des données de ces fichiers XML, présenter des résultats, effectuer des recherches au sein de bases de données XML, etc.

Le W3C est à l'origine de cette démarche qui allait devenir XQuery, lorsqu'en décembre 1998, un groupe de travail fut créé, pour devenir officiel en septembre 1999 où il prit l'appellation de

« working group for XML Query », généralement raccourci par « query working group ».

Une des premières tâches du « query working group » fut de déterminer si les moteurs de recherche existants, comme SQL parvenu à maturité et devenu un standard largement utilisé dans le monde des données relationnelles, ne pouvait être utilisé moyennant des extensions pour des données au format XML.

Des différences sont apparues au fil de cette étude.

Citons les différences entre la structure des données: deux dimensions pour les données relationnelles (tableau lignes colonnes), quand les données XML « taguées » ont une profondeur non prévisible.

Ou bien la différence entre l'homogénéité des données relationnelles qui permet les metadata pour les décrire, opposées à l'hétérogénéité des données XML dont les metadata se retrouvent dans tout le document.

Ou encore, la notion d'ordre des données qu'il est nécessaire de respecter en XML, ce qui n'est pas le cas en base de données relationnelles.

Il en est d'autres, notre liste n'est pas exhaustive.

Cela a mené le « query working group » à la décision de définir un design propre pour XQuery. Quelques lignes conductrices de cette tâche ont été:

- XQuery sera une transformation du Query Data Model - Compatibilité avec Xpath

- Conformité au schéma XML

- Souplesse d'application, tant à des documents validés par un XML Schema, que par une DTD ou bien non validés.

...

L'influence de Xpath.

Xpath, une recommandation du W3C datant de novembre 1999, était déjà largement utilisé par la communauté XML.

Xpath est un outil de recherche simple pour documents XML, permettant la navigation dans le document.

L'influence de Xpath se trouve dans l'intégration des « path » au sein de XQuery, un parcours de l'arbre qui retourne les « nodes », leur position et position relative, leur type et contenu.

Une expression Xpath assure la sélection de « nodes » au sein du document et est à même de les filtrer par le biais de prédicats.

La notion d'expression et prédicat a également été retenue.

L'influence de XML Schema.

XML SCHEMA est un langage qui crée des schémas de validation pour documents XML. Il comporte de nombreux types (de données), permet d'en créer d'autres.

Les données d'un document XML et les types issus du schéma qui leur sont appliqués sont le « Post-Schema Validation Infoset » ou « PSVI ».

Le design de XQuery a été conçu pour une compatibilité avec le typage défini dans XML Schema.

Autres sources.

Plusieurs « query languages » existants ont influencé XQuery, des membres du « query work group » ayant auparavant contribué au développement de ces langages.

Le plus proche parent de XQuery est QUILT , une proposition de membres du « query work group ».

La proposition du langage QUILT comportait un des composants essentiels de XQuery: FLWOR (pour For-Let-Where-Order-Return), un équivalent du (select-from-where) du monde SQL.

QUILT retenait également de XML-QL la notion de « constructor » , où « where » génère un ensemble de tuples et variables liées; « construct » s'exécute pour chacun de ces tuples , ce qui génère des éléments de sortie.

XQuery recommandation W3C.

Le 23 janvier 2007, soit après neuf années, XQuery est devenu une recommandation du W3C .

Fonctionnement de XQuery.

Notre décrivons de façon très simplifiée le processus de traitement de XQuery.

Le W3C divise le processus que nous résumons en deux parties:

- l'une assimilée à une démarche « externe » à XQuery, traitant le document XML - la seconde « interne » et coeur de XQuery traitant la requête XQuery.

Notons que ces deux « parties » se produisent au sein du même processus XQuery, et ne sont pas perceptibles pour l'utilisateur.

XML document

Requête_XQuery

Analyse statique

Parser

Parser XQuery

XML_information_ set

Validation: DTD
XML Schema

Document_order

Evaluation dynamique

XQuery Data Model

Serialisation
Output

1. Traitement « externe ».

Un input, le document XML sur lequel porte la requête XQuery, est traité par un parser.

Lors du parsing est créé le « XML Information Set » modélisant le document sous forme d'une hiérarchie de « nodes ».

Les « nodes » sont identifiés et notés dans un « document order » complété à chaque « node » rencontré.

La finalité du « document order » est de retenir l'ordre du document XML afin que les requêtes puissent s'y référer, et de restituer cet ordre en sortie de traitement.

Le document est ensuite validé par comparaison à sa DTD ou son Schema XML. Le « XML Information Set » est alors transformé en « XQuery Data Model ».

2. Traitement « interne ».

XQuery procède ensuite à deux phases.

Un input qui est la requête XQUERY, est parsé durant la « phase d'analyse statique ».

Si l' « analyse statique » valide la requête, intervient la « phase d'évaluation dynamique », au cours de laquelle les valeurs des expressions sont traitées .

Enfin intervient la sérialisation (la seconde phase), qui est la transformation du data model en flux d'octets, autrement exprimé, le résultat de la requête en XML.

Le processeur XQuery.

XQuery a un processeur, solution logicielle qui effectue l' « analyse syntaxique », l' « évaluation dynamique » et l'exécution de la requête.

Ce processeur se charge également de « parser » le document XML, en créer le « XML Infoset » et le « XQuery data model ».

Le processeur retourne un résultat soit au format XML (la sérialisation) qui peut être soit affiché, ou bien passé à une autre application pour un traitement ultérieur.

Le datamodel.

Le data model est une représentation formelle des données d'un document XML qui fera l'objet d'un traitement XQuery.

XQuery est défini comme une transformation d'une instance du query data model en une autre instance du data model.

Cette représentation défini chaque donnée, tant en position au sein du document qu'en termes de type.

Cette définition est utilisée en input de la requête, en output (le résultat de la requête) ainsi qu'en résultat intermédiaire.

Le data model de XQuery est « XQuery 1.0 et Xpath 2.0 » ou « XDM ».

Il est partiellement issu du data model de Xpath qui a été enrichi par des informations issues du Post-Schema Validation Infoset (PSVI de XML SCHEMA).

« XDM » est utilisé simultanément par XQuery 1.0 et Xpath 2.0 .

Le « XDM » organise et représente les données au travers de: « Sequence », « Item », « Atomic Value » et « Nodes ».

Sequence

Item

Node
(7 nodes XPath)

 

Atomic Value

- Une « sequence » est un ensemble ordonnancé de zéro, un ou plusieurs items.

- Un « Item » est un « node » ou bien une « Atomic value ».

- Une « Atomic value » est une valeur simple, non marquée, ne contenant pas d'autre valeur, elle

correspond à un type provenant des « atomic types » définis par le XML Schema.

- Un « node » est issu d'un des 7 « nodes » de Xpath (Element nodes, Attributes, Documents, Text,

Comments nodes, Namespace, Processing Instruction nodes).

Dans ce mémoire, nous considérons essentiellement Les « Element nodes » et « Attributes nodes ».

Une « sequence » sera par exemple constituée de trois « item » qui sont des « nodes » de type « element ».

XQuery est un langage fort typé.

Dès lors, chaque « item » et/ou « node » doit correspondre à des types définis par le XDM ou XML Schema.

En admettant une certaine souplesse toutefois: des « items » non typés (par exemple lorsqu'il n'existe pas de document de validation) sont convertis automatiquement dans le type nécessaire à l'opération souhaitée.

« XDM » représentera le document XML hiérarchiquement.

Son élément racine est « Document node », qui sera suivi hiérarchiquement par, ou bien sera parent de, l'élément « node » racine du document XML, lui-même parent des éléments du document traité.

Les Expressions XQuery.

L'outil essentiel de XQuery pour l'évaluation est l' expression. Plusieurs catégories d'expressions existent.

Nous ne les citons pas toutes, simplement celles qui seront utilisées pour la suite de ce travail.

- Path: une expression path permet de naviguer dans le document sur lequel porte la requête.

- Comparaisons: =,<,>, !, etc permet de comparer les valeurs, nodes. - Conditions: if, then, else

- « Constructor »: permet d'exprimer le résultat de la requête sous forme de document XML ou
XHtml, donc de baliser le résultat au moyen de tags < >, de créer des éléments et attributs.

Le « Constructor » permet également de construire des valeurs atomiques. - Arithmetic: qui permet d'additionner, soustraire, diviser, multiplier.

- FLWOR: qui est l'équivalent du SQL select-from-where, For-Let-Where-Order-Return.

Nous revenons plus en détail sur deux des expressions que nous utilisons: Path et FLWOR.

Expression Path.

Une « expression path » permet de naviguer dans le document sur lequel porte la requête.

La fonction d'appel « doc » retourne le « document node » du document XML à transformer.

doc ("/home/Memoireulb/abc.xml") //ABC/client/commande

Le « document node » de abc.xml est retourné à l'appel de la fonction « doc », « premier path » de « doc ».

La suite du « path » est évaluée par rapport à ce premier « document node » qui est un « context

node ».

Le « second step » vers « ABC »: « ABC » devient le « context node » par rapport auquel est évaluée la séquence « client ».

Le « troisième step » vers « client »: « client » devient le « context node » par rapport auquel est évaluée la séquence « commande ».

XQuery fait usage de « predicat ».

Les « predicats ». sont intégrés dans les « path expressions » afin de filtrer les « nodes » utiles.

Par exemple [@nom_activite="act3_logistique"] sélectionnera les « nodes activite » dont l'attribut « nom_activite » sera égal à « act3_logistique ».

Les requêtes FLWOR.

XQuery utilise des variables, qui sont précédées du signe $. Ex: $var. Une variable reçoit une valeur précise lors de l'évaluation XQuery.

FOR: associe une valeur à une variable de façon itérative. FOR suivi d'un PATH comme dans l'exemple suivant:

for $in in doc ("/home/Memoireulb/abc.xml")//ABC/activite

associe à la variable $in de façon itérative une « activite » de la sequence. La requête FLWOR est exécutée pour chaque itération de la séquence.

LET: associe la séquence entière à une variable plutôt que chacun de ses item un à un comme FOR.

Dans l'exemple let $in in doc ("/home/Memoireulb/abc.xml")//ABC/activite $in sera associé à la valeur de la séquence activité totale.

WHERE: on y défini les filtres, prédicats, conditions et jointures entre entités.

WHERE sélectionnera dans les items ceux qui correspondront au(x) prédicat(s) qu'il décrit.

ORDER BY: permet d'ordonnancer la valeur des résultats attendus (ordre croissant, décroissant, alphabétique).

RETURN suivi de l'expression qui est le résultat attendu retourne ce résultat.

Un item est retourné à chaque itération de la boucle FOR, ce qui créée une séquence d'items.

RETURN n'interrompt pas le déroulement de la boucle FOR.

Il est également tout à fait possible d'incorporer dans les sorties RETURN de nouvelles boucles conditionnelles.

Sources.

- W3C : http://www.w3.org/TR/2006/PR-xquery-20061121/

- XQuery from the Experts: A Guide to the W3C XML Query Language ISBN: 0-321-18060-7 - XQuery de Priscilia Walmsley ISBN: 0-596-00634-9

Chapitre 7. Requêtes XQuery.

Dans cette partie consacrée aux requêtes XQuery, qui devront fournir des résultats ABC, nous nous proposons de présenter notre travail de façon graduelle.

Nous débuterons par une requête élémentaire et tenterons de terminer en fin de chapitre par une requête fournissant un résultat ABC.

Nous utiliserons des requêtes de type FLWOR.

Produire une liste de clients.

Une première requête simple consiste à produire la liste des clients.

for $client in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC/client return

<p>{($client/@nom)}</p>

Dans la première ligne, nous déclarons la variable « client » en la faisant précéder par le signe $, soit « $client ».

La variable « $client » est précédée de la clause FOR.

FOR lance une itération qui permet à la requête FLWOR de multiples évaluations (récursives). La fonction « doc » ouvre le document sur lequel portera la requête.

("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC/client

Pour accéder au document, il est fait usage d'une « path expression ».

Une « path expression » permet de sélectionner les éléments ou attributs nécessaires.

Le point de départ en est l'élément root du file system « / », puis le répertoire « home », puis le répertoire « jean », puis le répertoire « Mémoire_ulb_2009 », puis le répertoire « group_21juin » et enfin le fichier « abc_avril27jn_id01.xml », puis la racine « / ABC » du fichier, puis la séquence « client ».

Nous lions la variable $client au premier élément de la séquence « client » dont le « context node » est « ABC ».

La boucle induite par FOR évaluera chacune des valeurs prises par chacun des éléments de la séquence « client ».

La clause « return » envoie un élément d'information à chaque itération de la requête. Le résultat demandé est la valeur prise par l'attribut « nom » de l'élément « client ». A chaque évaluation, « return » enverra le nom d'un client.

Les évaluations itératives de « for » cesseront lorsqu'aura été évalué le dernier élément « client ».

<p>{($client/@nom)}</p>

Nous utilisons un « constructor » XML, afin de créer un élément <p/>, et donc un résultat de requête sous forme XML.

Le résultat en est le suivant:

<?xml version="1.0" encoding="UTF-8"?> <p nom="jaeger"/>

<p nom="cairelli"/>

<p nom="communication"/>

Chaque instanciation du résultat est un élément <p/>.

Nous pouvons modifier cette requête de façon à obtenir un arbre XML, comportant donc un élément racine, et des éléments <p> ne contenant que la valeur de l'attribut « nom ».

Nous choisissons de nommer l'élément racine <requete/>.

L'entièreté de la requête est incorporée dans les balises <requete> </requete>

<requete>

{

for $client in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC/client return

<p>{data($client/@nom)}</p>

} </requete>

Afin de ne conserver que la valeur atomique de l'attribut, nous faisons appel à la fonction « data » qui permet d'extraire les valeurs atomiques d'éléments et attributs.

<p>{data($client/@nom)}</p>

Le résultat est un arbre XML comportant l'élément racine « requête » parent de trois éléments <p/>. Notons que seuls les noms des trois clients apparaissent.

<?xml version="1.0" encoding="UTF-8"?> <requete>

<p>jaeger</p>

<p>cairelli</p>

<p>communication</p>

</requete>

Nous utiliserons les « constructors » XML pour toutes les requêtes suivantes.

Les liens.

Nous devons pouvoir établir des liens entre éléments du document XML, liens équivalents à ceux définis dans les représentations par modèle hiérarchique ou ERD.

But de la requête: afficher pour chaque « activite » les « familles_cout » qui la composent.

<requete_lien>

{

for $in in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC

for $akty in $in/activite

return

<activite>

<nom_activite>{data($akty/@nom_activite)}</nom_activite>

{

for $famy in $in/famille_cout[@id_famille_cout=$akty/composition_activite/@id_famille_kout]

return

<famille_cout> {data($famy/@nom_famille)}</famille_cout>

} </activite>

} </requete_lien>

Un lien est à établir entre les « éléments » « activite » et « famille », par comparaison des attributs communs à « activite » et « famille ».

Pour l'élément « activite », il s'agit de l'attribut « id_famille_kout » (dans le « path » « ABC/ activite/composition _activite »).

Pour l'élément « famille cout », il s'agit de l'attribut « id_famille_cout » (dans le « path » « ABC/ famille_cout ».

Les valeurs que prennent ces attributs sont: « fam »1, « fam2 », « fam3 », « fam4 », « fam5 », « fam6 », « fam7 » et « fam8 ».

L'évaluation s'opérera en comparant un attribut « fam1 » trouvé dans un élément « activite » aux attributs « fam... » des éléments « famille_cout »; lorsque l'attribut « fam1 » sera trouvé en

« famille_cout », la valeur de l'attribut « nom_famille » de cet élément « famille_cout » sera affichée.

Pour l'élément « activite » dont l'attribut « id_activite » = "act1", les familles de coût figurant dans l'élément « composition_activite » correspondant aux valeurs prises par l'attribut « id_famille _kout » sont: « fam1 » et « fam2 ».

Le résultat affiché pour cet élément devrait être « fam1_publicite » et « fam2_bureau ». D'autres résultats seront affichés: nous ne filtrons pas

Que fait la requête?

La première boucle FOR évalue à partir du « context node » ABC le premier élément de la séquence « activite » et le lie à la variable « $akty ».

La clause « return » en restitue la valeur de l'attribut « nom_activite ».

Puis, la boucle FOR contenue dans « return » sélectionne à partir du « context node » « ABC », le premier élément de la séquence « famille_cout » et le lie à la variable « $famy » si la condition suivante est respectée.

La valeur de l'attribut « id_famille_cout » (de l'élément « famille_cout » traîté) est comparée à celle prise par l'attribut « id_famille_kout » du premier élément « composition_activite » de l'élément

« activite » lié à la variable « $akty ».

Lorsque la comparaison est positive, la valeur de l'attribut « nom_famille » de l'élément « famille_cout » est affichée.

La même itération se reproduit pour la « composition_activite » suivante de la variable « $akty », et ce jusqu'à la dernière « composition_activite» de l' « activite » traitée.

Ensuite, retour à la première boucle FOR, qui reproduit les mêmes itérations pour le second élément de la séquence « activite », et ce jusqu'à ce qu'il n'y ait plus d'élément non traité dans la séquence

« activite ».

Le résultat figure ci-dessous.

<?xml version="1.0" encoding="UTF-8"?>

<requete_lien>

<activite> <nom_activite>act1_communication</nom_activite> <famille_cout>fam1_publicite</famille_cout> <famille_cout>fam2_bureau</famille_cout>

</activite>

<activite> <nom_activite>act2_demarchage</nom_activite> <famille_cout>fam2_bureau</famille_cout>

<famille_cout>fam4_formation_documentation</famille_cout>

</activite>

<activite> <nom_activite>act3_logistique</nom_activite> <famille_cout>fam3_stock</famille_cout> <famille_cout>fam7_outil_production</famille_cout>

</activite> <activite>

<nom_activite>act4_transport</nom_activite>

<famille_cout>fam6_transport</famille_cout>

</activite>

<activite> <nom_activite>act5_production</nom_activite>

<famille_cout>fam4_formation_documentation</famille_cout> <famille_cout>fam7_outil_production</famille_cout>

</activite>

<activite> <nom_activite>act6_comptabilite_abc</nom_activite> <famille_cout>fam2_bureau</famille_cout>

<famille_cout>fam4_formation_documentation</famille_cout> <famille_cout>fam5_honoraires</famille_cout>

</activite> <activite>

<nom_activite>act7_telecom</nom_activite>

<famille_cout>fam8_telecom</famille_cout>

</activite>
</requete_lien>

Notons que nous obtenons un arbre XML ayant pour élément racine </requete_lien>, qui a pour éléments enfants les éléments </activite> lesquels contiennent les éléments </nom_activite> et </famille_cout>.

Effectuer des opérations arithmétiques.

Nous devons effectuer, pour obtenir des résultats ABC, des opérations de calcul. Ce sont des opérations élémentaires, sommer, multiplier et diviser.

- Sommer fait usage de la fonction « SUM », qui est une fonction d'agrégation portant sur une séquence de résultats.

- La multiplication est liée à l'opérateur « * »

- La division a pour opérateurs « div » et « idiv ». Nous utiliserons « div ».

Sommer les charges .

Cette requête devrait nous retourner la somme des « montant_htva_total ». Nous reproduisons le fragment de document XML ci-dessous.

<charge_indirecte id_chargeindirecte="fact001" montant_htva_total="2000">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact005" montant_htva_total="2401">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact011" montant_htva_total="710">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact015" montant_htva_total="623.85">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact016" montant_htva_total="310">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact028" montant_htva_total="4562">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact031" montant_htva_total="2100">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact032" montant_htva_total="2542">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact054" montant_htva_total="600">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact055" montant_htva_total="240">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact056" montant_htva_total="211">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact062" montant_htva_total="118.7">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact071" montant_htva_total="560">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact072" montant_htva_total="422">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact075" montant_htva_total="58">

... </charge_indirecte>

<charge_indirecte id_chargeindirecte="fact100" montant_htva_total="74.6">

... </charge_indirecte>

La requête:

<requete_somme>

{

for $chargeind in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml") //charge_indirecte

return

<Eur> {sum($chargeind/@montant_htva_total)} </Eur>

} </requete_somme>

Cette requête comporte une erreur.

Nous la présentons car le résultat, qui n'est pas celui attendu, illustre très bien la notion de séquence de résultats.

Fonctionnement de la requête.

La variable « $chargeind » est liée à la séquence « charge_indirecte ».

Une boucle FOR parcourt une à une les instantiations de la séquence et les passe à « $chargeind » . Return affiche à chaque itération l'attribut « charge_indirecte/@montant_htva_total » de la variable « $chargeind ».

Le résultat retourné.

<?xml version="1.0" encoding="UTF-8"?>

<requete_somme> <Eur>2000</Eur> <Eur>2401</Eur> <Eur>710</Eur> <Eur>623.85</Eur> <Eur>310</Eur> <Eur>4562</Eur> <Eur>2100</Eur> <Eur>2542</Eur> <Eur>600</Eur> <Eur>240</Eur> <Eur>211</Eur> <Eur>118.7</Eur> <Eur>560</Eur> <Eur>422</Eur> <Eur>58</Eur> <Eur>74.6</Eur>

</requete_somme>

Nous constatons que le résultat n'est pas un total, mais une séquence des nombres qui auraient du être sommés.

La cause en est que nous avons intégré la fonction « SUM » dans la séquence de génération de nombres, alors que la séquence aurait dû se produire dans « SUM », « SUM » étant une fonction d'agrégation.

Si nous avions appelé la fonction « data » au lieu de la fonction « SUM », le résultat aurait été identique.

La requête doit être modifiée de façon à ce que les itérations FOR se produisent au sein de « SUM ».

Nous invoquons dès lors « SUM » au début de la requête

<requete_somme>

{ sum(

for $chargeind in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml") //charge_indirecte

return

<Eur> {data($chargeind/@montant_htva_total)} </Eur>

) } </requete_somme>

Nous obtenons le résultat attendu: la somme est de 17533,15 (Euro).

<?xml version="1.0" encoding="UTF-8"?> <requete_somme>17533.15</requete_somme>

Calculer le coût d'une unité d'oeuvre (d'activité).

Dans cette nouvelle requête, nous voulons calculer le coût d'une unité d'oeuvre pour une activité déterminée.

Nous choisissons l'activité5, « act5_production ».

La démarche suivie.

1) Calculer le coût total de l'activité choisie.

- Filtrer les éléments « activite ».

- Les lier aux éléments « famille_cout ».

- Lier les éléments « famille_cout » aux éléments « charge_indirecte/imputation ».

2) Sommer la quantité de mesurages correspondant à l'activité choisie.

3) Calculer et sommer.

Le calcul de notre requête peut se résumer par:

SUM « montant_htva_impute » * « proportion_cf » * « proportion » div SUM « quantite » (de mesurages).

La requête se présente comme suit:

<requete_calcul_unite_oeuvre>

{

sum(

for $in in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC, $akty in $in/activite[@id_activite="act5"],

$compoakt in $akty/composition_activite,

$famy in $in/famille_cout[@id_famille_cout=$compoakt/@id_famille_kout]/composition_famille, $pcmn in $in/charge_indirecte/imputation[@id_pcmn_imputation=$famy/@id_pcmn_fam]

return <activite>{data($pcmn/@montant_htva_impute

*$famy/@proportion_cf

*$compoakt/@proportion

div

sum(

for $mesur in $in/client/commande/mesurage[@id_aktivite="act5"]

return <div>{data($mesur/@quantite)}</div>)

)}

</activite>

)}

</requete_calcul_unite_oeuvre>

Fonctionnement de la requête.

Nous utilisons des boucles FOR; notre point de départ sera le « context node » ABC.

La variable « $akty » est liée au premier élément de la séquence « activite » qui est sélectionné si le prédicat « id_activite » = « act5 » est respecté.

Si le prédicat n'est pas respecté, par itération le second élément est examiné, le troisième, jusqu'au dernier si nécessaire.

La variable « $compoact » est liée au premier élément de la séquence « composition_activite » dont le « context node » est $akty (qui respecte « act5 »).

La variable « $famy » est liée au premier élément de la séquence « famille_cout » si un lien est établi.

Nous établissons un lien avec l'élément « activite » par comparaison des valeurs des attributs « famille_cout/@id_famille_cout » et « activite/composition_activite/@id_famille_kout ».

Le lien est établi si il y a concordance, sinon, il y a itération vers le second élément de la séquence « famille_cout », évaluation pour lien, et ce jusqu'au dernier si nécessaire.

La variable « $pcmn » accède au premier élément « imputation » du « context node » « charge _indirecte » .

Comme ci-dessus, un lien est établi avec la variable « $famy » par comparaison des valeurs des attributs « id_pcmn_imputation » à « id_pcmn_fam ».

Une itération se produit pour le second élément « imputation » , etc, tant qu'un lien n'a pas été établi.

Return reçoit la valeur de l'attribut « montant_htva_impute » lorsqu'un lien est établi ($pcmn) et traite le premier résultat en le multipliant par la valeur de l'attribut « $famy/@proportion_cf » multiplié par la valeur de l'attribut « $compoakt/@proportion ».

<activite>{data($pcmn/@montant_htva_impute *$famy/@proportion_cf

*$compoakt/@proportion

Nous devons diviser ce résultat par la somme des quantités de mesurages correspondant. Return comprend une boucle FOR.

La variable « $mesur » est liée aux éléments de la séquence « mesurage » du « context node »

« commande », dont la valeur de l'attribut « id_aktivite » respecte le prédicat « id_aktivite » = « act5 ».

Cette boucle se produit à l'intérieur d'un « SUM » qui somme les valeurs prises par l'attribut « quantite » qui sont retournées.

div

sum(

for $mesur in $in/cient/commande/mesurage[@id_aktivite="act5"] return

<div>{data($mesur/@quantite)}</div>)

Le premier résultat « montant_htva_impute » * « proportion_cf » * « proportion » est ainsi divisé par la somme des « quantite ».

Après cette opération, la boucle retourne parcourir et comparer les éléments « imputation », puis retourne vers les éléments « composition_famille », et enfin retourne vers les éléments

« composition_activite » jusqu'à l'épuisement des éléments « activite ».

Après le dernier « return », la séquence de résultats est sommée. Le résultat de la requête:

<?xml version="1.0" encoding="UTF-8"?> <requete_calcul_unite_oeuvre>18.17860066006601</requete_calcul_unite_oeuvre>

Soit 18,178 (Euro) le coût d'une unité d'oeuvre de l'activité « act5_production ».

Nous avons voulu vérifier au moyen d'un tableur (sous Linux).

Nous y avons rapporté les données rencontrées par la requête qui parcours le fichier XML.

mes004

8

fam4

0,34

612300

1

157,85

53,67

0,71

mes008

8,5

fam4

0,34

612300

1

560

190,4

2,51

mes010

6

fam7

0,73

601300

1

850

620,5

8,19

mes012

10

fam7

0,73

611130

1

422

308,06

4,07

mes023

2

fam7

0,73

613540

1

 

0

0

mes018

8

fam7

0,73

630220

0,8

350

204,4

2,7

mes020

7,25

 
 
 
 
 
 
 

mes026

10

 
 
 
 
 
 
 

mes031

7

 
 
 
 
 
 
 

mes033

9

 
 
 
 
 
 
 
 
 
 
 

Valeur de 1 unité d'oeuvre de l'activité5 18,18

 

75,75

 
 
 
 
 
 
 

Les mesurages portant sur l'activité5 sont au total de 75,75 unités.

L'activité 5 est composée des familles fam4 qui intervient à 34% et fam5 qui intervient à 73%. La famille4 est constituée du poste pcmn 612300 qui intervient à 100% dans la famille4.

Nous trouvons dans charge_indirecte/imputation deux « montants_htva_impute », soit 157,85 (Euro) et 560 (Euro).

157,85 * 1 * 0,34 = 53,67 (Euro) 560 * 1 * 0,34 = 190,4 (Euro)

Le même raisonnement est à appliquer à la famille7.

Détaillons la dernière ligne: le poste pcmn 630220 qui constitue la famille7: le montant de 350 (Euro) est imputé; il est multiplié par 80% (intervention dans la famille) et est à nouveau multiplié par 73%, intervention de la famille dans l'activité5, soit 350 * 0,73 * 0,8 = 204,4 (Euro)

Chacun de ces produits sont divisés un à un par le total des unités mesurées, soit 75,75 .

Pour la première ligne: 53,67 / 75,75 = 0,71 (Euro)

...

La dernière ligne: 204,4 /75,75 = 2,7 (Euro)

La somme de ces quotients est bel et bien de 18,18 (Euro) , résultat fourni par la requête.

Ayant pu vérifier la justesse du résultat de la requête, nous calculons encore le coût d'une unité d'oeuvre de l'activité « act4_transport », et en retenons la valeur pour la suite: 2,652 (Euro).

<?xml version="1.0" encoding="UTF-8"?> <requete_calcul_unite_oeuvre>2.6521739130434785</requete_calcul_unite_oeuvre>

Calculer le coût indirect d'une commande déterminée.

Nous souhaitons obtenir le coût indirect pour une commande précise.

La démarche suivie.

Nous réutilisons la démarche précédente, mais le point de départ est une commande choisie.

1) Sélectionner une commande et calculer le coût total des activités utilisées. - Filtrer les éléments « commande ».

- Sélectionner les éléments « activite » utilisés par la commande choisie. - Les lier aux éléments « famille_cout ».

- Lier les éléments « famille_cout » aux éléments « charge_indirecte/imputation ».

2) Sommer la quantité de mesurages correspondant aux activités traitées.

3) Calculer et sommer.

En cours d'élaboration de cette requête, est apparue une erreur du fait de la nature différente des activités, erreur que nous détaillons.

Prenons comme exemple la commande ayant le « id_commande » com003.

Cette commande comporte deux mesurages, l'un concernant l'activité « id_aktivite » = « act4 »,

l'autre, l'activité « id_aktivite » = « act5 ».

Les unités d'oeuvre utilisées pour ces deux activités sont fondamentalement différentes. l'activité4 transport a pour unité de mesure le kilomètre parcouru.

L'activité5 se mesure elle en heure de production.

Ce tableau synthétise l'information telle qu'elle sera traitée par la requête.

Nous imaginons qu'activité4 (act4) et activité5 (act5) ont respectivement un coût de 600 (Euro) et 1000 (Euro).

La colonne « produit » doit son appellation au fait qu'il s'agit du résultat de l'opération: « montant_htva _impute » * « proportion_cf » * « proportion ».

Du fait de la nature différente des unités d'oeuvre, nous aurons beaucoup plus de kilomètres que d'heures prestées.

Nous avons 107 kilomètres (45 + 62) parcourus pour 13 heures de travail (6 + 7).

La requête sommera 120 unités mesurées, sans distinction quant à leur différence de nature.

Le calcul qui sera effectué pour calculer le coût d'une unité d'oeuvre sera: 600 (Euro) / 120 et 1000 (Euro) / 120, soit 5 (Euro) et 8,33 (Euro).

Ce qui est évidement faux.

L'opération à effectuer est de diviser l'activité4 par la somme d'unités s'y rapportant, et pratiquer de même pour l'activité5.

Pour l'activité4, 600 (Euro) / 107 = 5,61 (Euro) par unité d'oeuvre

Pour l'activité5, 1000 (Euro) / 13 = 76,92 (Euro) par unité d'oeuvre

La requête devra donc intégrer la possibilité de distinguer les différents types d'unité d'oeuvre possibles.

Calculer le coût indirect de la commande « com003 ».

Nous traiterons l'exemple qui consiste à afficher le coût indirect de la commande dont la valeur de « id_commande » est « com003 ».

Nous reproduisons le fragment du document XML ci-dessous.

<commande id_commande="com003" descriptif="seconde commande" chiffre_affaire="1852">

<mesurage id_mesurage="mes022" id_aktivite="act4" date="12 avril 2009" quantite="42" unite_oeuvre="kilometre"/>

<mesurage id_mesurage="mes023" id_aktivite="act5" date="12 avril 2009" quantite="2" unite_oeuvre="heure_production"/>

<charge_directe id_charge_d="fact0041" id_pcmn="601000" montant_dir_htva_impute="640" quantite="1"/>

<charge_directe id_charge_d="fact9999" id_pcmn="620000" montant_dir_htva_impute="25"

quantite="2"/>

</commande>

Nous utilisons comme base la requête précédente de calcul d'une unité d'oeuvre pour une activité donnée.

Nous y avons ajouté le prédicat nécessaire à parcourir le document XML à partir de la commande « com003 » .

La requête se présente comme suit.

<cout_indirect_commande>

{

sum(

for $in in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")//ABC, $commande in $in/client/commande[@id_commande="com003"],

$akty in $in/activite[@id_activite=$commande/mesurage/@id_aktivite],

$compoakt in $akty/composition_activite,

$famy in $in/famille_cout[@id_famille_cout=$compoakt/@id_famille_kout]/composition_famille, $pcmn in $in/charge_indirecte/imputation[@id_pcmn_imputation=$famy/@id_pcmn_fam]

return <activite>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

for $uo in $in /client/commande/mesurage/@quantite

return

<uoeuvre>{data ($uo)}</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage/@quantite

return

<uo_total>{data ($uototal)}</uo_total>) )}</activite>

} </cout_indirect_commande>

Fonctionnement de la requête.

En boucle FOR, nous déclarons les variables.

La variable « $commande » est liée au premier élément de la séquence « commande » du « context node » ABC respectant le prédicat « id_commande » = « com003 ».

La variable « $akty » est liée au premier élément de la séquence « activite » qui est sélectionné si un lien peut être établi avec l'élément de la séquence « commande ».

Le lien est effectif si la comparaison des attributs « id_activite » de l'élément activité et de « id_aktivite » du premier élément de la séquence mesurage ayant pour « context node »

« $commande » abouti.

Si le lien n'est pas établi, une itération examine le second élément de la séquence « activite », etc...

La variable « $compoact » est liée au premier élément de la séquence « composition_activite » dont le « context node » est $akty (qui est liée à « $commande » ).

La variable « $famy » est liée au premier élément de la séquence « composition_famille » de la séquence « famille_cout » si un lien est établi.

Nous établissons un lien avec l'élément « activite » par comparaison des valeurs des attributs « famille_cout/@id_famille_cout » et « $compoakt/@id_famille_kout ».

Le lien est établi si il y a concordance, sinon, il y a itération vers le second élément de la séquence « famille_cout », pour une nouvelle évaluation.

La variable « $pcmn » accède au premier élément « imputation » du « context node » « charge_indirecte » .

Un lien est établi avec la variable « $famy » par comparaison des valeurs des attributs « imputation/@id_pcmn_imputation » à « $famy/@id_pcmn_fam ».

Une itération se produit pour le second élément « imputation » , etc..., tant qu'un lien n'a pas été établi.

Return fourni une séquence de résultats: « montant_htva_impute » multiplié par « proportion_cf » multiplié par « proportion » divisé par la somme de la valeur des attributs « mesurage/@quantite » sélectionnés.

Nous devons enfin multiplier ce résultat par la somme de mesurages « mesurage/@quantite » se rapportant à cette commande « com003 ».

Cette requête traitera les mesurages de la commande « com003 » identiquement, et générera l'erreur que nous évoquions ci-dessus.

Le résultat de la requête annonce un coût indirect de 446,234 (Euro) pour cette commande.

<?xml version="1.0" encoding="UTF-8"?> <cout_indirect_commande>446.2341931548628</cout_indirect_commande>

IF THEN ELSE.

Lorsque nous examinons les mesurages de « com003 », nous voyons qu'ils sont deux. Le premier 42 unités (kilomètres) pour l'activité4 (transport).

Le second 2 unités (heure_production) pour l'activité5 (production).

Afin que ces deux activités soient traitées individuellement, nous avons utilisé IF THEN ELSE.

Nous avons 7 activités qui doivent être traitées individuellement, et devons proposer 7 traitements individuels.

Nous avons retenu la solution suivante.

Return sera suivi d'une expression IF posant comme condition que l'activité à traiter soit l'activité1. Si il s'agit bien de l'activité1, l'expression THEN autorise le calcul de la requête.

La différence du traitement appliqué par « Return » comparativement aux deux requêtes précédentes est que nous ne considérons plus les quantités de mesurage dans leur globalité, mais individuellement pour chaque activité.

Nous ajoutons donc un prédicat: « @id_aktivite="act1" » .

for « $uo » in « $in » /client/commande/mesurage/@quantite

devient

for « $uo » in « $in » /client/commande/mesurage[@id_aktivite="act1"]/@quantite

return

if ($akty/@id_activite="act1")

then

<activite_1>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion

div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act1"]/@quantite

return

<uoeuvre>{data ($uo)}</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act1"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>) )}</activite_1>

Si il ne s'agit pas de l'activité1, l'expression ELSE évalue s'il s'agit de l'activité2 au quel cas l'expression THEN autorise le traitement.

L'évaluation se fera sur base du prédicat « @id_aktivite="act2" »

else

if ($akty/@id_activite="act2") then

<activite_2>{data($ ... etc...

Et ce répétitivement jusqu'à l'activité6 au terme de laquelle il ne reste plus comme dernière alternative que de traiter l'activité7.

else

<activite_7>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

etc

<uo_total>{data ($uototal)}</uo_total>)

)}</activite_7>

) } </cout_abc_commande>

L'entièreté de cette requête est imbriquée dans SUM( ), afin de sommer la séquence de résultats. Nous reproduisons la requête complète ci-dessous.

<cout_indirect_commande>

{

sum(

for $in in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC, $commande in $in/client/commande[@id_commande="com003"],

$akty in $in/activite[@id_activite=$commande/mesurage/@id_aktivite],

$compoakt in $akty/composition_activite,

$famy in $in/famille_cout[@id_famille_cout=$compoakt/@id_famille_kout]/composition_famille, $pcmn in $in/charge_indirecte/imputation[@id_pcmn_imputation=$famy/@id_pcmn_fam]

return

if ($akty/@id_activite="act1")

then <activite_1>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act1"]/@quantite

return

<uoeuvre>{data ($uo)}</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act1"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>) )}</activite_1>

else

if ($akty/@id_activite="act2")

then <activite_2>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act2"]/@quantite

return<uoeuvre>{data ($uo)}

</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act2"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>) )}</activite_2>

else

if ($akty/@id_activite="act3")

then <activite_3>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act3"]/@quantite

return<uoeuvre>{data ($uo)}

</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act3"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>)

)}</activite_3>

else

if ($akty/@id_activite="act4")

then <activite_4>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act4"]/@quantite

return<uoeuvre>{data ($uo)}

</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act4"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>)

)}</activite_4>

else

if ($akty/@id_activite="act5")

then <activite_5>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act5"]/@quantite

return<uoeuvre>{data ($uo)}

</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act5"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>)

)}</activite_5>

else

if ($akty/@id_activite="act6")

then <activite_6>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act6"]/@quantite

return<uoeuvre>{data ($uo)}

</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act6"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>)

)}</activite_6>

else

<activite_7>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion

div

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act7"]/@quantite

return<uoeuvre>{data ($uo)}

</uoeuvre>)

*

sum(

for $uototal in $commande/mesurage[@id_aktivite="act7"]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>)

)}</activite_7>

)

}

</cout_indirect_commande>

Le résultat généré est cette fois de 147,748 (Euro).

<?xml version="1.0" encoding="UTF-8"?> <cout_indirect_commande>147.7485056679581</cout_indirect_commande>

Les « function » .

En procédant de la sorte, nous obtenons un résultat différent, mais au prix d'une requête longue (121 lignes) et complexe à lire.

Nous utiliserons les « functions » ou fonctions proposées par XQuery afin d'alléger le code. Le bloc suivant calculant la somme des mesurages pour une activité se répète à sept reprises.

sum(

for $uo in $in /client/commande/mesurage[@id_aktivite="act1"]/@quantite return

<uoeuvre>{data ($uo)}</uoeuvre>)

Nous le transformons en « function ».

Une « function » comporte les parties suivantes:

- la déclaration de « function » suivie de son nom « declare function local: ici le nom ».

- les paramètres de la « function » et le type retourné par la « function » (entre parenthèses). - le corps de la « function » contenant les instructions de traitement.

Nous déclarons la « function » que nous nommons : « activite »:

declare function local:activite

Nous avons un seul paramètre qui est « act1 » ou « act2 », ..., ou « act7 ».

La variable « $ak » que nous déclarons prendra comme argument un des sept « act... »

Ce paramètre est de type « atomic », et le résultat de la « function » sera également une valeur « atomic » (un nombre).

La déclaration de « function » complète est:

declare function local:activite($ak as xs:anyAtomicType?)as xs:anyAtomicType?

Le corps de la « function » est la partie de imbriquée dans SUM.

{ sum(

for $uo in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml") //client/commande/mesurage[@id_aktivite=$ak]/@quantite

return

<uoeuvre>{data ($uo)}</uoeuvre>)

}

La « function » complète ci-dessous:

declare function local:activite($ak as xs:anyAtomicType?)as xs:anyAtomicType? {

sum(

for $uo in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml") //client/commande/mesurage[@id_aktivite=$ak]/@quantite

return

<uoeuvre>{data ($uo)}</uoeuvre>)

};

Nous pouvons créer une seconde « function » calculant la somme des mesurage par activité pour une commande précise.

sum(

for $uototal in $commande/mesurage[@id_aktivite="act7"]/@quantite return

<uo_total>{data ($uototal)}</uo_total>)

Nous nommons cette « function » « activite2 ».

declare function local:activite2($ak2 as xs:anyAtomicType?)as xs:anyAtomicType? {

sum(

for $uototal in doc("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")// client/commande[@id_commande="com003"]/mesurage[@id_aktivite=$ak2]/@quantite return

<uo_total>{data ($uototal)}</uo_total>)

};

XQuery permet qu'une « function » se trouve au sein d'un espace mémoire dédié ou bien dans la requête elle même; nous retenons cette seconde possibilité.

Les deux « functions » se trouvent en préambule de la requête.

Au sein de la requête, pour le calcul relatif à l'activité1, nous appelons la « function » « activite » par:

local:activite("act1")

et lui passons le paramètre « act1 »

et la seconde « function » qui reçoit le meme paramètre par:

local:activite2("act1")

La requête complète devient:

declare function local:activite($ak as xs:anyAtomicType?)as xs:anyAtomicType? {

sum(

for $uo in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml") //client/commande/mesurage[@id_aktivite=$ak]/@quantite

return

<uoeuvre>{data ($uo)}</uoeuvre>)

};

declare function local:activite2($ak2 as xs:anyAtomicType?)as xs:anyAtomicType?

{

sum(

for $uototal in doc("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")// client/commande[@id_commande="com003"]/mesurage[@id_aktivite=$ak2]/@quantite

return

<uo_total>{data ($uototal)}</uo_total>)

};

<cout_indirect_commande>

{

sum(

for $in in doc ("/home/jean/Mémoire_ulb_2009/group_21juin/abc_avril27jn_id01.xml")/ABC, $commande in $in/client/commande[@id_commande="com003"],

$akty in $in/activite[@id_activite=$commande/mesurage/@id_aktivite],

$compoakt in $akty/composition_activite,

$famy in $in/famille_cout[@id_famille_cout=$compoakt/@id_famille_kout]/composition_famille, $pcmn in $in/charge_indirecte/imputation[@id_pcmn_imputation=$famy/@id_pcmn_fam]

return

if ($akty/@id_activite="act1")

then <activite_1>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act1")

*

local:activite2("act1")

)}</activite_1>

else

if ($akty/@id_activite="act2")

then <activite_2>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act2")*local:activite2("act2")

)}</activite_2>

else

if ($akty/@id_activite="act3")

then <activite_3>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act3")*local:activite2("act3")

)}</activite_3>

else

if ($akty/@id_activite="act4")

then <activite_4>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act4")*local:activite2("act4")

)}</activite_4>

else

if ($akty/@id_activite="act5")

then <activite_5>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act5")*local:activite2("act5")

)}</activite_5>

else

if ($akty/@id_activite="act6")

then <activite_6>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act6")*local:activite2("act6")

)}</activite_6>

else <activite_7>{data($pcmn/@montant_htva_impute*$famy/@proportion_cf*$compoakt/@proportion div

local:activite("act7")*local:activite2("act7")

)}</activite_7>

)}

</cout_indirect_commande>

La requête est simplifiée, 85 lignes; si nous souhaitons modifier la méthode de calcul des quantités de mesurage, une seule modification de « function » sera nécessaire, alors qu'il aurait fallu modifier à sept reprises sans l'usage de « functions ».

Le résultat de cette requête est identique:

<?xml version="1.0" encoding="UTF-8"?> <cout_indirect_commande>147.7485056679581</cout_indirect_commande>

Vérification du résultat.

Nous avons à nouveau souhaité vérifier le résultat.

Ayant déjà vérifié le coût d'une unité d'oeuvre pour l'activité5, nous vérifions celle de l'activité 4. Commande « com003 » utilise 42 unités d'oeuvre de l'activité4 (mesurage « mes022 »).

La somme de tous les mesurages se rapportant à l'activité4 est de 483 unités d'oeuvre.

Nous obtenions précédement pour l'activité5 un coût d'unité d'oeuvre de 18,178 (Euro)

<?xml version="1.0" encoding="UTF-8"?> <requete_calcul_unite_oeuvre>18.17860066006601</requete_calcul_unite_oeuvre>

et de 2,652 (Euro) pour l'activité4.

<?xml version="1.0" encoding="UTF-8"?> <requete_calcul_unite_oeuvre>2.6521739130434785</requete_calcul_unite_oeuvre>

Pour la commande « com003 », 42 unités de l'activité4 sont utilisées: 2,652 * 42 = 111,384 (Euro). Pour l'activité5, où 2 unités d'oeuvre sont mesurées: 18,18 * 2 = 36,36 (Euro).

Sommons ces deux valeurs: 111,384 + 36,36 = 147,744 (Euro) soit le résultat fourni par la requête XQuery.

Chapitre 8. Présentation des résultats.

Parvenant au terme de ce travail, nous nous attacherons en cette dernière partie à la présentation des résultats obtenus.

Au départ d'un fichier au format XML, nous avons au travers des diverses requêtes XQuery produit des résultats sous forme d'arbres XML, qui sont lisibles, mais dont la présentation peut être améliorée.

Pour ce, nous utiliserons les solutions XSL du W3C, et plus particulièrement XSL-FO.

Comme pour la partie dédiée à XQuery, nous utiliserons le vocabulaire technique en anglais, la recommandation source du W3C étant rédigée en anglais.

XSL.

Extensible Stylesheet Language est un langage de transformation de documents XML.

XSL, devenu une recommandation du W3C le 16 décembre 1998 en version1.0 , a évolué pour être scindé en trois domaines: Xpath, XSLT et XSL-FO.

XSLT et Stylesheet.

Une transformation XSL s'opère par le recours à une « stylesheet » ou feuille de style.

XSLT est le langage utilisé pour produire les « stylesheet », ce qui revient à ce qu'une stylesheet est un document de transformation XSLT.

Une « stylesheet » permet de décrire les règles de transformation des données (éléments et attributs) d'un arbre XML afin d'aboutir en fin de traitement à leur présentation (police, taille, couleur, fond de page,..).

Une « stylesheet » est un document XML bien formé utilisant des expressions issues de l'espace de nom XML.

Transformation et Templates.

Une « stylesheet » consiste en un ensemble de « template rules ».

Un « template rule » utilise deux composants:

1) Des pattern qui recourent à Xpath et sélectionnent les éléments de l'arbre XML de base.

2) Des template qui appliqués aux éléments sélectionnés, construisent chacun une partie de l'arbre de résultat.

Principe de transformation.

Nous décrivons brièvement le principe de transformation d'un arbre XML en un autre afin de mieux appréhender les mécanismes mis en oeuvre.

Un processeur XSL reçoit en entrée un document XML (à traiter) et une « stylesheet ».

L'arbre XML initial est transformé par le processeur XSL en un autre arbre XML selon les indications fournies par la « stylesheet ».

Cette transformation est réalisée en deux étapes:

1) La construction de l'arbre de résultat (« tree transformation »).

2) Traitement de l'arbre de résultat selon la feuille de style (« formatting »).

Le formatting.

L'étape de « Formatting » inclus de la sémantique dans l'arbre de résultat dont les « nodes » sont des « formatting objects ».

Les « formatting objects » font partie de classes qui décrivent paragraphes, texte, tables.

« Formatting » consiste à créer un arbre « formatting object tree », dont les éléments sont des « formatting object ».

Le modèle du « formatting object tree » est celui du « area tree ».

« Formatting » revient à créer un arbre « area tree » constitué de « geometric area » .

Les « geometric area » consistent en une séquence de pages, où chaque « area » a sa position précise dans la page.

Cet « area tree » décrit la structure géométrique de la sortie.

Simplement exprimé, la transformation crée une séquence de zones géométriques ayant un contenu et une position précise au sein de séquence.

Nous retenons que les « formatting objects » peuvent être de type « block-level » ou « inlinelevel », ceci selon le type d' « areas » qu'ils génèrent.

XSL-FO.

XST-FO fait partie de la recommandation Extensible Stylesheet Language version 1.0 du 15 octobre 2001, modifiée en version 1.1 le 05 décembre 2006.

XSL-FO a pour finalité de produire un document imprimable, alors qu'une transformation XSLT comme nous venons de décrire, génère soit du XML, soit du HTML ou du texte.

Plutôt que de devoir utiliser une multitude de spécifications correspondant chacune à un type d'imprimante existant, il a été choisi de produire un document au format PS ou PDF, ce qui le rend imprimable presque universellement.

Principe de transformation XSL-FO.

Une transformation XSL-FO est similaire à une transformation XSLT: à un document XML de base est appliquée une feuille de style XSLT qui sélectionne les éléments XML de base et leur applique les règles de transformation qui créent le document XSL-FO.

Ce document XSL-FO est alors traité par un « formatter » qui produit le document PDF imprimable.

Apache propose un outil: Formatting Objects Processor - FOP - permettant la transformation en PDF d'un document XSL-FO.

XSL-FO stylesheet.

La construction d'une « stylesheet » XSL-FO repose sur l'utilisation de différents « formatting objects ».

La recommandation W3C propose le modèle ci-après.

La forme d'un document XSL-FO est celle d'un arbre XML, à la base duquel se trouve un élément racine qui est le « fo:root » « formatting object ».

« fo-root » a pour éléments descendants:

- « fo:layout-master-set » qui défini la géométrie et la séquence des pages utilisées dans le document final.

- « fo:declarations » (qui est optionnel).

- une ou plusieurs « fo:page-sequences », dont les descendants sont des « flows », génèrent le contenu de ces pages.

« fo:layout-master-set » a pour enfants:

- simple-page-masters qui décrit les subdivisions des pages et leur géométrie; il faut au minimum un simple-page-master. Un simple-page-master a un attribut « master-name ».

- page-sequence-masters qui décrit la séquence de « page-masters » que le formatting du

« fo:page-sequence » devra respecter. Il détermine l'ordre d'apparition des « page-masters ». Un page-sequence-master » a un attribut « master-reference ».

Représentation d'un simple-page-master model. (source: W3C)

Le « simple-page-master » permet de déterminer différentes régions (« region before », « region start », « region after », « region end », « body ») et la taille d'une page (« margin »).

D'autres propriétés ayant trait à la pagination peuvent être décrites, comme la direction d'écriture au travers des différentes pages d'un document « writing mode » et « relative direction » .

Application pratique.

Nous créons une présentation pour l'arbre XML synthétisant les résultats d'une commande, que nous développions au cours du chapitre précédent.

Nous le reproduisons ci-dessous.

<?xml version="1.0" encoding="UTF-8"?>

<presentation2> <commande>

<id_commande>com001</id_commande>

<descriptif>systeme solaire</descriptif>

<nom>jaeger</nom>

<adresse>rue du bois 36 à 1000 bruxelles</adresse>

</commande> <charges>

<cout_direct>5103</cout_direct> <cout_indirect_commande>3376.1968</cout_indirect_commande>

</charges>

<resultats>

<chiffre_affaire>12000</chiffre_affaire>

<marge_brute>6897</marge_brute>

<marge_nette>3520.8032</marge_nette>

</resultats>

<ratios>

<a>42.525</a>

<b>57.475</b>

<c>28.134974</c>

<d>29.340027</d>

<e>70.65997</e>

</ratios>

</presentation2>

Détail de la stylesheet.

Nous détaillons la « Stylesheet » de façon fragmentaire; le document est présenté dans son entièreté plus bas.

<?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0"

xmlns:xsl=" http://www.w3.org/1999/XSL/Transform">

Nous déclarons le document XSL qui est conforme à la version XSL 1.0 et est lui même un document XML.

La mention de xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" indique au processeur XSLT qu'il devra utiliser le « namespace » correspondant (Transform).

<xsl:template match="presentation">

<fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format">

Nous sélectionnons l'élément « presentation » qui est l'élément racine du fichier XML que nous voulons transformer.

L'élément racine du fichier XSL-FO est déclaré, avec une précision pour le processeur (xmlns:fo=" http://www.w3.org/1999/XSL/Format"), qui devra utiliser le « Namespace » « Format » pour la transformation FO.

<fo:layout-master-set>

<fo:simple-page-master master-name="expdf" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">

<fo:region-body/>

</fo:simple-page-master>

</fo:layout-master-set>

Nous déclarons le « fo:layout-master-set » contenant le « simple-page-master » dont le « master-name » est « expdf » . Nous y décrivons le format de page qui sera utilisé : une feuille A4 (21 * 29,5 cm).

Les marges seront de 2cm.

<fo:page-sequence master-reference="expdf"> <fo:flow flow-name="xsl-region-body">

Le « page-sequence-master-reference » est déclaré, il fait référence à « expdf ». Le flow (qui génère le contenu des pages) écrira dans la région « body ».

<fo:block border="2 px solid black" padding="4mm" space-after="18mm" > <fo:block font-weight="bold" font-family= "Helvetica"

font-size="24pt" text-align="center"

border="3px outset olive" space-before = "8mm" space-after="18mm" padding="2mm"> Résultats financiers de la commande

</fo:block>

Ici commence la sélection de ce qui devra être affiché en sortie de traitement.

La notion de « block-level » que nous évoquions plus haut est utilisée.

Dans la première ligne, nous déclarons que l'ensemble du contenu devra être encadré d'une bordure noire épaisse de 2px.

Cette première balise sera refermée après la déclaration de tous les blocs suivants.

Puis en seconde ligne nous déclarons le premier « block » qui sera le titre « Résultats financiers de la commande ».

La police, sa taille, son épaisseur, le mode d'alignement du texte sont déclarés; ce titre devra être encadré en couleur « olive ».

<fo:block font-weight="bold" font-family= "Helvetica"

font-size="18pt" text-align="center" border="2px double darkolivegreen"

space-after="10mm" padding="2mm">

Commande
</fo:block>

<fo:block border="2 px solid black" padding="2mm" space-after="28mm" >

<fo:block font-size="16pt" space-before="14pt" space-after="2mm" line-height="20pt" text-align="left" start-indent="2mm" >

- Référence Commande: <xsl:value-of select="commande/id_commande"/>

</fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"> - Client: <xsl:value-of select="commande/nom"/>

</fo:block>

<fo:block font-size="16pt" start-indent="2mm" space-after="2mm" line-height="20pt"> - Détail de la commande: <xsl:value-of select="commande/descriptif"/>

</fo:block>

</fo:block>

Puis vient une zone portant le titre « Commande », suivi d'une zone reprenant les informations de l'arbre XML de départ: "commande/id_commande", "commande/nom", et "commande/descriptif". Nous sélectionnons ces éléments via l'instruction « xsl:value-of select » suivi d'une expression Xpath

« commande/id_commande ».

Chaque élément sélectionné est précédé d'un commentaire: « - Référence Commande: », « - Client: », « - Détail de la commande: » dont le but est de faciliter la compréhension et d'enrichir la présentation des éléments XML de départ.

<fo:block font-weight="bold" font-family= "Helvetica"

font-size="18pt" text-align="center" border="3px ridge darkolivegreen" space-after="10mm" padding="2mm">

Calcul de rentabilité

</fo:block>

<fo:block border="2 px solid black" padding="2mm" space-after="8mm">

<fo:block font-size="16pt" space-before= "4mm" start-indent="2mm" space-after="2mm" line- height="20pt">

Chiffre d'affaire de la commande: <xsl:value-of select="resultats/chiffre_affaire"/> Euro </fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"> ( - ) Charge Directe: <xsl:value-of select="charges/cout_direct"/> Euro

</fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"> ( = ) Marge Brute: <xsl:value-of select="resultats/marge_brute"/> Euro

</fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt">

( - ) Charge indirecte (ou coût ABC): <xsl:value-of select="charges/cout_indirect_commande"/> Euro </fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"

padding="1mm" border="2px solid red">

( = ) Marge Nette: <xsl:value-of select="resultats/marge_nette"/> Euro

</fo:block> </fo:block> </fo:block>

<fo:block font-weight="bold" font-family= "Helvetica"

font-size="18pt" text-align="center" border="3px ridge darkolivegreen" space-after="4mm" padding="2mm"> Présentation sous forme de ratios

</fo:block>

<fo:block border="2 px solid black" padding="2mm" space-after="8mm">

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Charges Directes dans le chiffre d'affaire: <xsl:value-of select="ratios/a"/> % </fo:block>

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Marge Brute dans le chiffre d'affaire: <xsl:value-of select="ratios/b"/> % </fo:block>

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Charges Indirectes dans le chiffre d'affaire: <xsl:value-of select="ratios/c"/> % </fo:block>

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt">

Proportion Marge Nette dans le chiffre d'affaire: <xsl:value-of select="ratios/d"/> %

</fo:block>
</fo:block>

</fo:flow>

</fo:page-sequence> </fo:root>

</xsl:template>

</xsl:stylesheet>

Nous créons une zone similaire à la précédente selon exactement les mêmes principes.

Le titre encadré devient « Calcul de rentabilité », les données sélectionnées dans l'arbre XML de résultat sont "resultats/chiffre_affaire", "charges/cout_direct", "resultats/marge_brute", "charges/cout_abc_ commande", "resultats/marge_nette".

Les commentaires sont : « Chiffre d'affaire de la commande: », « ( - ) Charge Directe: », « ( = ) Marge Brute: », « ( - ) Charge indirecte (ou coût ABC): » et « ( = ) Marge Nette: ».

La ligne dédiée à l'élément « resultats/marge_nette » est encadrée de rouge.

Enfin, un commentaire est placé à la suite de chaque élément sélectionné afin de préciser l'unité monétaire: « Euro ».

Enfin, en une troisième zone, identique, nous présentons les données issues du calcul de ratios. Le titre: « Présentation sous forme de ratios ».

Nous présentons également les éléments: « ratios/a », « ratios/b », « ratios/c », et « ratios/d ». Nous commentons chacun des éléments: « Proportion Charges Directes dans le chiffre d'affaire: »,

« Proportion Marge Brute dans le chiffre d'affaire: », « Proportion Charges Indirectes dans le chiffre d'affaire: », et « Proportion Marge Nette dans le chiffre d'affaire: ».

Chaque élément est suivi du signe « % ».

Ci-dessous, la « stylesheet » complète.

<?xml version="1.0" encoding="ISO-8859-1" ?>

<xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" xmlns:fo=" http://www.w3.org/1999/XSL/Format">

<xsl:template match="presentation">

<fo:root xmlns:fo=" http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set>

<fo:simple-page-master master-name="expdf" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">

<fo:region-body/>

</fo:simple-page-master>

</fo:layout-master-set>

<fo:page-sequence master-reference="expdf"> <fo:flow flow-name="xsl-region-body">

<fo:block border="2 px solid black" padding="4mm" space-after="18mm" > <fo:block font-weight="bold" font-family= "Helvetica"

font-size="24pt" text-align="center"

border="3px outset olive" space-before = "8mm" space-after="18mm" padding="2mm"> Résultats financiers de la commande

</fo:block>

<fo:block font-weight="bold" font-family= "Helvetica"

font-size="18pt" text-align="center" border="2px double darkolivegreen" space-after="10mm" padding="2mm">

Commande
</fo:block>

<fo:block border="2 px solid black" padding="2mm" space-after="28mm" >

<fo:block font-size="16pt" space-before="14pt" space-after="2mm" line-height="20pt" text-align="left" start-indent="2mm" >

- Référence Commande: <xsl:value-of select="commande/id_commande"/> </fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"> - Client: <xsl:value-of select="commande/nom"/>

</fo:block>

<fo:block font-size="16pt" start-indent="2mm" space-after="2mm" line-height="20pt"> - Détail de la commande: <xsl:value-of select="commande/descriptif"/>

</fo:block>

</fo:block>

<fo:block font-weight="bold" font-family= "Helvetica"

font-size="18pt" text-align="center" border="3px ridge darkolivegreen" space-after="10mm" padding="2mm">

Calcul de rentabilité

</fo:block>

<fo:block border="2 px solid black" padding="2mm" space-after="8mm">

<fo:block font-size="16pt" space-before= "4mm" start-indent="2mm" space-after="2mm" line- height="20pt">

Chiffre d'affaire de la commande: <xsl:value-of select="resultats/chiffre_affaire"/> Euro </fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"> ( - ) Charge Directe: <xsl:value-of select="charges/cout_direct"/> Euro

</fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt"> ( = ) Marge Brute: <xsl:value-of select="resultats/marge_brute"/> Euro

</fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt">

( - ) Charge indirecte (ou coût ABC): <xsl:value-of select="charges/cout_indirect_commande"/> Euro </fo:block>

<fo:block font-size="16pt" space-after="2mm" start-indent="2mm" line-height="20pt" padding="1mm" border="2px solid red">

( = ) Marge Nette: <xsl:value-of select="resultats/marge_nette"/> Euro </fo:block>

</fo:block>

</fo:block>

<fo:block font-weight="bold" font-family= "Helvetica"

font-size="18pt" text-align="center" border="3px ridge darkolivegreen" space-after="4mm" padding="2mm"> Présentation sous forme de ratios </fo:block>

<fo:block border="2 px solid black" padding="2mm" space-after="8mm">

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Charges Directes dans le chiffre d'affaire: <xsl:value-of select="ratios/a"/> % </fo:block>

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Marge Brute dans le chiffre d'affaire: <xsl:value-of select="ratios/b"/> % </fo:block>

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Charges Indirectes dans le chiffre d'affaire: <xsl:value-of select="ratios/c"/> % </fo:block>

<fo:block font-size="14pt" space-after="2mm" start-indent="2mm" line-height="20pt"> Proportion Marge Nette dans le chiffre d'affaire: <xsl:value-of select="ratios/d"/> % </fo:block>

</fo:block> </fo:flow> </fo:page-sequence>

</fo:root>

</xsl:template>

</xsl:stylesheet>

Traitement « formatter ».

La suite logicielle <oXygen/> intègre un « formatter ». Nous avons eu recours à cette solution, qui a généré le document .PDF suivant.

Nous y retrouvons les éléments du document XML de base, comme le nom du client, le chiffre d'affaire de la commande, la marge nette, etc.. enrichis des commentaires que nous souhaitions.

Sources.

W3C XSL Transformations (XSLT) Version 1.0

Illustrations: W3C XSL Transformations (XSLT) Version 1.0 W3C Extensible Stylesheet Language (XSL) Version 1.1 XSL-FO de Dave Pawson; ISBN : 0-596-00355-2

Chapitre 9. Suite du mémoire et conclusions. Terminer ce mémoire.

Nous terminons ce mémoire, en ayant suivi les objectifs, excepté notre semi-échec concernant les logiciels libres.

Cependant, au fil de la réalisation de ce travail, d'autres objectifs potentiels sont apparus, ce qui nous fait dire que si ce travail est terminé par rapport aux objectifs de base, il ne l'est pas tout à fait.

Il s'agit de points qui pourraient être améliorés, ou encore de points auxquels nous n'avions pas pensé au moment de l'établissement des objectifs initiaux.

Ils pourraient faire l'objet de développement ultérieurs.

Recommandations pour la suite de ce travail.

Ce travail pourrait être poursuivi en développant les aspects que nous décrivons ci-après.

Recherche sur les logiciels libres.

Nous avons failli quant à l'objectif de n'utiliser que des logiciels libres, ayant dû acquérir une licence d'utilisation de la suite logicielle <oXygen/>XML.

Il est probable qu'en se concentrant sur ce point uniquement, une solution libre aboutisse.

Nos recherches (que nous avons dû limiter faute de temps) ont montré qu'il existe diverses solutions libres, mais non regroupées au sein d'une même suite, et surtout pas très ergonomiques et encore moins documentées.

Par regroupement, nous entendons un éditeur XML doté d'un parser , un logiciel Xquery, voire un traitement XSL et encore mieux, un formatter, le tout accessible via une plate-forme unique. Idéalement dotée d'une interface graphique.

Simplement exprimé, la même chose que <oXygen/>XML, mais en licence libre et s'installant sous Linux.

A notre sens, XQDT (pour XQuery) sous la plate-forme Eclipse est une très bonne base moyennant un minimum de documentation.

Repenser le document XML.

La méthode que nous avons utilisée pour représenter l'ensemble des données comptables, relatives aux commandes, etc... au sein d'un même document XML pourrait être revue si le volume d'information devenait important.

Pour quelques milliers de saisies, et relativement peu d'éléments, cela convient.

La redondance de l'information (par exemple pour les postes pcmn) rend sa maintenance laborieuse et comporte un risque d'erreur.

Plus d'information et plus d'éléments augmenterait cette redondance.

Il serait alors intéressant de développer un support pour ces informations XML ayant recours à un ensemble tables plutôt qu'un document XML unique.

Travailler l'ergonomie.

Un travail portant sur l'ergonomie doit être réalisé.

L'utilisateur final ciblé, c'est à dire les gérants de TPE et PME sont très peu friands, voire réticents à toute forme de travail administratif, pour utiliser un terme global.

Cela relève très souvent de la corvée, et est sans cesse reporté au lendemain.

Si il doit être utilisé, il importe donc que ce projet ABC soit très bien présenté, et de façon la plus simple possible à manipuler.

Saisir les informations XML « manuellement » dans le document XML est impensable. Nous l'avons pratiqué dans le cadre de ce travail, c'est très fastidieux, et générateur d'erreurs.

A notre sens, le recours à un système de fenêtres de saisie, donc une interface graphique est nécessaire.

Organisation de l'interface graphique.

Une interface graphique pourrait être organisée selon différents thèmes. Interface orientée vers les données de fonctionnement de l'entreprise.

L'interface concernerait la saisie, lecture et correction/suppression des données relatives aux mesurages, imputations des pièces comptables, et données relatives aux commandes.

Interface orientée vers les d onnées système.

Une autre interface pourrait donner accès aux données qui régissent le fonctionnement de l'application.

Il s'agit essentiellement des proportions de répartition des charges indirectes et des familles de coût, mais aussi de la gestion des comptes pcmn autorisés, clients autorisés.

L'action porte ici sur la DTD et fichier XML.

Interface orientée vers la structure du système.

Cette interface permettrait de modifier ou de créer des activités, familles de coût, mais aussi d'ajouter des éléments inexistants dans la forme actuelle.

L'action porte ici sur la DTD et fichier XML.

Interface orientée consultation / requêtes.

Une interface graphique accédant les requêtes XQuery est nécessaire également.

L'apprentissage de XQuery est long, et nécessite une parfaite connaissance de l'arbre XML de base. A nouveau, ce n'est pas là tâche pour l'utilisateur final.

Il serait possible de proposer une série de requêtes par thèmes.

- Recherches par commande: des détails quant aux mesurages relatifs à telle commande, la part de

charges indirectes pour telle commande,..

- Requêtes de calcul: le coût d'une unité d'oeuvre, la valeur de toutes les charges indirectes sur une période, le coût d'une famille,...

Une alternative serait un canevas de requêtes « préfabriquées » qui seraient composables via des objets graphiques (cf. Stylus Studio).

D'autres solutions sont bien entendu possibles.

L'utilisateur final devrait idéalement voir de la requête:

- une fenêtre où saisir la(es) condition(s) de sélection imposée à la requête; un choix pourrait lui être proposé; par exemple un choix entre les identificateurs de commande.

- une icône « start » lançant la requête.

En retour, un affichage du résultat à l'écran ou l'impression d'un document de synthèse semblable à celui que nous créons dans le dernier chapitre sont proposés.

Autres fonctions des interfaces.

Ces différentes vues pourraient proposer un filtrage par utilisateur, par exemple pour éviter des modifications des règles de calcul par un utilisateur non-initié, ou ne pas autoriser l'accès aux requêtes de résultats à tous.

L'interface devrait avoir également quelques fonctions propres, comme la création automatique d'identificateurs uniques à chaque saisie (sans intervention de l'utilisateur).

Ou encore lorsque le choix des valeurs pour un attribut est défini dans la DTD, ces différentes possibilités pourrait être proposé à l'utilisateur par menu déroulant.

Technologie pour les interfaces.

Au terme d'une très brève recherche, il semble que Xul ou Xforms pourraient être des solutions pour les interfaces, dans l'esprit XML.

- Xul (XML-based User interface Language) créé pour le projet Mozilla, utilise un langage ayant une structure XML pour créer des interfaces graphiques.

- Xforms, une recommandation du W3C depuis 2003, qui est en constante évolution.

Les requêtes XQuery.

Nous restons avec une interrogation à propos de l'aspect « low level » de XQDT évoqué précédemment, que nous avons généralisé à XQuery , à tort ou à raison, partant du principe que XQDT est un outil de recherche XQuery.

Nous n'avons pas approfondi, la question reste ouverte.

Si comme nous le suggérions, l'aspect low level peut se traduire par la nécessité de devoir appliquer une série de requêtes successives sur un arbre XML pour obtenir un résultat plus raffiné que les données du document XML de base, il serait intéressant d'automatiser ces enchaînements de requêtes.

L'utilisateur ne devrait voir qu'une seule requête, la première, et lui demander de fournir les résultats raffinés ... de la dernière requête.

Conclusions.

Au terme de ce travail, force est de constater qu'il est possible de mener une démarche de comptabilité analytique en utilisant les technologies XML.

En dressant la liste des objectifs, nous avions un doute quant à la possibilité de transformer les données chiffrées sans avoir recours à un langage de programmation classique.

Parmi les solutions de sélection et transformation de données XML, nous avons retenu XQuery, qui s'est révélé suffisant pour mener à bien les opérations que nous souhaitions effectuer sur ces données chiffrées, et ainsi produire les résultats attendus.

Pour produire des ratios, donc raffiner l'information de base, nous avons dû créer une succession de requêtes FLWOR, peut-être est-ce là la limite de XQuery: ne pas pouvoir effectuer cette transformation en un seul traitement.

La méthode que nous avons tenté de développer permet grâce aux technologies XML un très intéressant découplage entre les données de base (le document XML) et le traitement (XQuery) des informations contenues.

Par rapport à une expérience précédente organisée autour d'un tableur , le risque de perte ou de modification accidentelle des informations de base est très réduit.

Et nos données ont l'énorme avantage de ne pas être tributaires d'un format propriétaire.

Par contre, notre objectif de réaliser ce mémoire en n'utilisant que des logiciels libres a failli dans une certaine mesure.

Pour une suite de logiciels assurant les différents traitements XML, nous avons dû opter pour le choix d'une solution payante.

Les solutions XML libres que nous avons pu trouver étaient soit trop complexes à installer sous Linux, soit très difficiles d'usage, du moins pour notre niveau de connaissance, ou encore trop peu documentées.

Ce point pourrait être retravaillé.

Ce travail n'est à notre sens pas entièrement terminé. Plusieurs points peuvent être approfondis. Citons l'ergonomie, qui devrait être améliorée par une interface graphique, ou la méthode de stockage des informations qui pourrait être plus efficiente sous forme de tables plutôt que sous forme d'un document XML unique.






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Il faut répondre au mal par la rectitude, au bien par le bien."   Confucius