Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > Crystal Reports > Formules
Formules Forum sur l'utilisation des formules sous Crystal reports
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/08/2011, 18h58   #1
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
Par défaut Somme de composants

bonjour

je travail sur la mise en place d'un ERP, "Sage ERP X3", et je suis en train de paramétrer les états d'impressions et pour cela j'utilise Crystal Report XI.

l'état qui me pose problème, celui des devis clients.

Lorsqu’un article est composé d’autres articles, je souhaiterais faire la somme du montant des composants et l’afficher en face de l’article composé.

Exemple:

ARTICLE1 article n°1 999999 9999999 999999
ARTICLE2 article n°2
ARTICLE3 article n°3

ARTICLE4 article n°4 999999 9999999 999999
ARTICLE5 article n°5
ARTICLE6 article n°6
ARTICLE7 article n°7

j'ai donc essayé de faire trois formules:

- j'ai créé une formule, placée dans l'en-tête du rapport, avec déclaration de 3 tableaux : 1 pour le no devis (utile dans le cas ou on imprime plusieurs devis), 1 pour le numéro de ligne et 1 pour le cumul. Cette formule est évaluée lors de la lecture des enregistrements (« whilereadingrecords ; »)

- Créer une formule, placée dans le détail et toujours évaluée lors de la lecture des enregistrements, dans laquelle :

o je déclare de nouveau les 3 tableaux.

o si le type de ligne est un composé alors on crée un enregistrement dans chacun des trois tableaux avec le no de devis, la ligne courante et un cumul à 0.

o Si le type de ligne est un composant alors on effectue une MAJ du cumul de la ligne courante du tableau..

- Créer une formule, placée sur la ligne du composé, qui fait une recherche de la ligne correspondante à l’enregistrement courant dans la table des no de devis et des numéros de lignes… et affiche alors le cumul….


formule dans l'en-tête:

Code :
1
2
3
4
5
WhileReadingRecords;
global StringVar array TabSQHNUM; //tableau pour le n° du devis
global StringVar array TabSQDLIN; //tableau pour le n° de la ligne
global StringVar array TabTotal; //tableau pour le cumul
global StringVar i := 1; //pointeur des tableaux
formule dans le détail:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WhileReadingRecords;
global StringVar array TabSQHNUM; //tableau pour le n° du devis
global StringVar array TabSQDLIN; //tableau pour le n° de la ligne
global StringVar array TabTotal; //tableau pour le cumul
global StringVar i := 1; //pointeur des tableaux
 
// le premier article ne sera jamais un composant !!!
IF SQUOTED.LINTYP IN [1,2,6,10] then // si l'article est un composé.
(
     TabSQHNUM[i] := SQUOTED.SQHNUM;
     TabSQDLIN[I] := SQUOTED.SQDLIN;
     TabTotal[i] := 0; // mise à zéro du cumul.
     i := i +1;
)
else
(
     TabTotal[i-1] := TabTotal[i-1] + SQUOTED.NETPRI // cumul du prix
);
formule sur la ligne du composé:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
global StringVar array TabSQHNUM; //tableau pour le n° du devis
global StringVar array TabSQDLIN; //tableau pour le n° de la ligne
global StringVar array TabTotal; //tableau pour le cumul
global StringVar i := 1; //pointeur des tableaux
global StringVar c; //pointeur pour le parcourt
 
IF SQUOTED.LINTYP IN [1,2,6,10] then // si l'article est composé
(
     for c := 1 to i do // parcourt des tableaux
     (
          if TabSQHNUM[c] = SQUOTED.SQHNUM and
             TabSQDLIN[c] = SQUOTED.SQDLIN then
          (
               TabTotal[c]; // affiche le cumul
               c := 1; // le pointeur est remis en position 1
               exit for // quitter le parcourt
          );
     );
);
quand je veux imprimer, j'ai un message d'erreur qui me dit pour le formule dans le détail : un indice doit être compris entre 1 et la taille du tableau.

n'ayant pas beaucoup de connaissance dans la gestion variables tableau, je n'arrive pas a trouver de solution.

Merci de m'aider
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 14h19   #2
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
j'ai fait évoluer mes formules.

formule dans l'en-tête:

Code :
1
2
3
4
5
6
 
//déclaration des tableaux et du pointeur
shared StringVar array TabSQUHNUM;
shared NumberVar array TabSQDLIN;
shared NumberVar array TabTotal;
shared NumberVar i := 1;
Formule dans le détail:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
//déclaration des tableaux et du pointeur
shared StringVar array TabSQHNUM;
shared NumberVar array TabSQDLIN;
shared NumberVar array TabTotal;
shared NumberVar i;
 
//si l article est normale ou composé
IF {SQUOTED.LINTYP_0} IN [1,2,6,10] then
(
    //redimentionner les tableaux
    redim preserve TabSQHNUM[i];
    redim preserve TabSQDLIN[i];
    redim preserve TabTotal[i];
 
    //écrire une ligne dans chaque tableaux
    TabSQHNUM[i] := {SQUOTED.SQHNUM_0};
    TabSQDLIN[i] := {SQUOTED.SQDLIN_0};
    TabTotal[i] := 0;
    i := i +1
)
 
//sinon (l article est un composant)
else
(
    //cumul du prix
    TabTotal[i-1] := TabTotal[i-1] + {SQUOTED.NETPRI_0}
);
Sur la ligne du composé:

Code :
1
2
3
4
5
6
7
8
 
//déclaration des tableaux et des pointeurs
shared StringVar array TabSQHNUM;
shared NumberVar array TabSQDLIN;
shared NumberVar array TabTotal;
shared NumberVar i;
 
TabTotal[i];
Dans la dernière formule, si je fait afficher l'indice "i", je constate qu'il est bien incrémenté à chaque fois puis que face du première article composé, j'ai 1, en face du deuxième, j'ai 2 et ainsi de suite.
Mais quand je met "TabTotal[i]", pour afficher la valeur du tableau, j'ai un message d'erreur qui me dit "un indice doit être compris entre 1 et la taille du tableau" pour la dernière formule...

Je dois avoir un problème dans la gestion de mes tableaux mais... je n'arrive pas a savoir quoi ^^

Si quelqu'un s'y connais gestion de tableau dans les formules, merci^^
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 14h27   #3
Candidat au titre de Membre du Club
 
Inscription : juillet 2011
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 26
Points : 12
Points : 12
Bonjour,

Pourquoi tu te casse la tête avec des tableaux !!!

Tu déclare des groupes :
Si tu as une table du genre le composé se répète à chaque composant, tu mets le composé dans l'entête du groupe et tu liste les composants dans le détail puis tu faits la somme dans le pied du groupe (ça te feras un total par article)
puis un autre total global dans le pied du rapport (qui est celui de tous les articles du devis)

Tu as compris ?

Bien sûre à gauche du composé, tu mets le n° du devis et la ligne, ça dépendant de ta mise en page, si tu veux un avoir un devis par page, tu déclare le n° devis comme étant un groupe qui se place au dessus du groupe composant, puis dans l'expert section, tu coche "nouvelle page après" dans le pied du groupe devis. ça te permettras d'avoir le total HT et TTC du devis par ligne puis global.

PS: j'ai confondu composant et composé lol
Nour08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 15h56   #4
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
Citation:
Tu déclare des groupes :
Si tu as une table du genre le composant se répète à chaque composé, tu mets le composant dans l'entête du groupe et tu liste les composés dans le détail puis tu faits la somme dans le pied du groupe (ça te feras un total par article)
puis un autre total global dans le pied du rapport (qui est celui de tous les articles du devis)
j'ai déjà tester cette méthode. J'ai une table qui me permet de dire "cet article est composé de ces articles" mais j'avais plusieurs problèmes avec la sélection. Effectivement j'obtenais bien la liste des composants pour un composé mais, malheureusement, tous les composant ne sont pas choisi pour le devis (seulement certains) et donc je me retrouvais avec une liste beaucoup trop long par rapport à se que je devais obtenir.

mais dernièrement j'ai eu d'autres informations donc je vais tester cette méthode de nouveau... en espérant ce soit bon^^

Merci
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 13h36   #5
Candidat au titre de Membre du Club
 
Inscription : juillet 2011
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 26
Points : 12
Points : 12
ça veut dire que tu as un devis avec un nombre bien défini de composants qui peuvent ne pas être TOUS les composants d'un composé qui se trouve dans une autre table.

Tu raccorde la table Devis et la table Composé avec le lien Composant.Devis = Composant.Composé, et tu n'auras que la liste des composants(listés dans le devis) par composé.

Tu mets le composé de la table Composé en groupe, et tu liste dans le détail les composants du devis avec leurs montants.
Nour08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 14h09   #6
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
Citation:
Tu raccorde la table Devis et la table Composé avec le lien Composant.Devis = Composant.Composé, et tu n'auras que la liste des composants(listés dans le devis) par composé.
justement^^, je ne peu pas faire le lien^^

voici comment sont reliés mes tables:

Table Devis (détail) ------> Table Article (devis.référenceArticle = article.référence)

Table Article ------> Table Nomenclature (article.référence = Nomenclature.référenceArticleComposé)

Tables Nomenclature -------> Table Article2 (nomenclature.référenceComposant = article2.référence)

la table Article2 est la table Article mais rajouté une seconde fois.

sur la table Devis (détail) tous les articles sont gérés de la même façon, la table ne prend pas en compte la nomenclature (composé/composant). Donc c'est pour cela que j'ai ajouté les tables Nomenclature et Article2.
le lien entre les tables Article et Nomenclature est fait de sorte a sélectionner aussi les articles qui n'ont pas de nomenclature (puisqu'un article n'a pas forcément de composant, ni de composé).

c'est assez tordu ^^ moi-même je m'y perds à force...
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 14h41   #7
Candidat au titre de Membre du Club
 
Inscription : juillet 2011
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 26
Points : 12
Points : 12
Toute nomenclature qui se respecte devrait se présentait comme ceci

REF_Article(Composé1)<===> REF_Article2 (Composant1)
REF_Article(Composé1)<===> REF_Article2 (Composant2)
REF_Article(Composé1)<===> REF_Article2 (Composant3)
REF_Article(Composé1)<===> REF_Article2 (Composant4)
REF_Article(Composé1)<===> REF_Article2 (Composant5)

La table Article est le détail de tous les REF_Article qu'il soit composant ou composé.

La table Devis contient des REF_Article (de type composants)

Les liens sont les suivants :
1- Table devis (Ref_Article) = Table Nomenclature (REF_Article (Composants i )
2- Table Nomenclature (Ref_Article (Composé) ) = Table Article (REF_Article)

3- Table Nomenclature (Ref_Article (Composant) ) = Table Article 2 (REf_Article)


Tu devais relier la table devis à la nomenclature et non à la table Article .


NB : lorsque tu rajoute sous CR, les tables de ta base de données, à la deuxième table, un onglet lien apparait, ce qui te permettras de lier graphiquement tes champs de tables
Nour08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 15h43   #8
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
je vais essaye en liant les tables comme tu le propose... c'est une idée...

et t'inquiète, je sais comment fonctionne l'expert base de données^^

en tout cas merci beaucoup de te pencher sur mon problème, sa fait du bien d'avoir d'autres pistes^^
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 13h37   #9
Candidat au titre de Membre du Club
 
Inscription : juillet 2011
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 26
Points : 12
Points : 12
Bonjour,

Mais de rien,

J'ai pensé aussi à une formule de sélection du genre :

Code :
{@devis.ref_article} = {@nomenclature.ref_article_Composant}
J'espère que ça va t'aider, je ne peux même pas essayer chez moi car on n'a pas ce genre de DEVIS !

Bon courage
Nour08 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 14h08   #10
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
finalement j'ai craqué ... je fais faire l'état pas un partenaire...

comme j'en ai 8 autres comme celui-ci à faire, je préfère devoir payer pour un, faire les autres en copier/coller, démarrer dans les temps et m'occuper sur d'autres taches, plutôt que de perdre du temps (sa fait quand même 2 semaines que je bataille rien que pour se détail).

mais dès que je reçois la solution du partenaire, je l'expliquerai ici pour d'autre^^ et puis cela peu peut être t’intéresser^^

encore pour l'aide
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 17h36   #11
Invité régulier
 
Homme
Étudiant
Inscription : août 2011
Messages : 24
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 24
Points : 9
Points : 9
J'ai enfin la solution !!!!!!

le partenaire à quand même passé une journée entière^^ et il est en est arrivé à une solution.

j'y étais presque avec mes formules^^, la méthode était bonne^^ puisque c'est celle-ci que les développeurs ont appliqué (mais eux, ils s'y connaissent bien en formule crystal).

donc le principe est le même que ce que j'ai expliqué au début de mon problème.

Citation:
j'ai donc essayé de faire trois formules:

- j'ai créé une formule, placée dans l'en-tête du rapport, avec déclaration de 3 tableaux : 1 pour le no devis (utile dans le cas ou on imprime plusieurs devis), 1 pour le numéro de ligne et 1 pour le cumul. Cette formule est évaluée lors de la lecture des enregistrements (« whilereadingrecords ; »)

- Créer une formule, placée dans le détail et toujours évaluée lors de la lecture des enregistrements, dans laquelle :

o je déclare de nouveau les 3 tableaux.

o si le type de ligne est un composé alors on crée un enregistrement dans chacun des trois tableaux avec le no de devis, la ligne courante et un cumul à 0.

o Si le type de ligne est un composant alors on effectue une MAJ du cumul de la ligne courante du tableau..

- Créer une formule, placée sur la ligne du composé, qui fait une recherche de la ligne correspondante à l’enregistrement courant dans la table des no de devis et des numéros de lignes… et affiche alors le cumul….
Ainsi voici les différentes formules qu'ils m'ont pondu :

Placé dans l'en-tête du rapport, la déclaration des tableaux :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
global numbervar array TabPrixCompose;  // Prix
global numbervar array TabDevisLigne;   // Ligne devis
global stringvar array TabDevisCode;    // Code devis
global numbervar       NoLigneCur;      // No ligne du tableau en cours
 
// ON initialise les tableaux à 1000
redim TabPrixCompose[1000];
redim TabDevisLigne[1000];
redim TabDevisCode[1000];
 
NoLigneCur := 0;
 
// 1=1 obligatoire à priori...sinon l expert formule signal une erreur
1=1
Placé dans le détail, le remplissage des tableaux :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 
whilereadingrecords;
 
// Declaration des VARIABLES globales
 
global numbervar array TabPrixCompose;  // Prix
global numbervar array TabDevisLigne;   // Ligne devis
global stringvar array TabDevisCode;    // Code devis
global numbervar       NoLigneCur;      // No ligne du tableau en cours
 
// ==================================================================
// Gestion du calcul
// Si ON a un composant, alors ON met à jour la ligne courante
// Sinon ON avance d'un pas dans le tableau.
// On prend en compte les lignes de type composants (7),
// les options (8) et les variantes (9).
// On suppose que le prix d'un composé est à 0.
// ==================================================================
IF {SQUOTED.LINTYP_0} IN [7,8,9] then
(
    IF NoLigneCur > 0 then
    (
       TabPrixCompose[NoLigneCur] := TabPrixCompose[NoLigneCur] + ({SQUOTED.GROPRI_0}*{SQUOTED.QTY_0});
    );
)
else
(
    NoLigneCur := NoLigneCur + 1;
    TabDevisCode [NoLigneCur] := {SQUOTED.SQHNUM_0};
    TabDevisLigne [NoLigneCur] := {SQUOTED.SQDLIN_0};
    TabPrixCompose[NoLigneCur] := {SQUOTED.GROPRI_0};
);
et enfin à l'endroit où l'on souhaite afficher le résultat, la récupération des données :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
whileprintingrecords;
 
 
// Declaration des VARIABLES globales
 
global numbervar array TabPrixCompose;  // Prix
global numbervar array TabDevisLigne;   // Ligne devis
global stringvar array TabDevisCode;    // Code devis
 
// Declaration des VARIABLES locales
 
LOCAL numbervar j;
LOCAL numbervar resul;
 
resul := 0;
 
// =================================================================
// Si ON a un composant, alors ON ne renvoi rien
// sinon ON cherche dans le tableau la ligne de cumul.
// ON prend en compte les lignes de type composants (7),
// les options (8) et les variantes (9)
// ==================================================================
IF NOT ({SQUOTED.LINTYP_0} IN [7,8,9]) then
(
    FOR j:=1 TO 1000 do
    (
        IF TabDevisCode[j] = {SQUOTED.SQHNUM_0} AND TabDevisLigne[j] = {SQUOTED.SQDLIN_0} then
        (
            resul := (TabPrixCompose[j]/{SQUOTED.QTY_0});
            exit FOR;
        );
        IF TabDevisCode[j] = "" then  exit FOR;
    );
);
 
round(resul - resul * {SQUOTED.DISCRGVAL1_0}, {@decimald});
Voila^^ et sa marche^^ je pense que ses codes peuvent servir aux personnes qui cherchent comment utiliser les variables "tableau" (déclarer, remplir et récupérer des valeurs... ce qui me manqué^^), d'où la raison de ce long message^^
lagrue est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h42.


 
 
 
 
Partenaires

Hébergement Web