Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

QuickReport Discussion :

Detail dans quickrep


Sujet :

QuickReport

  1. #1
    Futur Membre du Club
    Detail dans quickrep
    Bonjour,
    J'ai une base de données conçue sous SQL Server et gérée par interface Delphi.
    Mon obstacle est survenu dans un état de sortie :
    j'ai une liste des clients, et chaque client a une quantité de 3 produits, c'est-a-dire :
    client N° 1 : qtt1 de produit 1
    qtt2 de produit 2
    qtt3 de produit 3
    etc.
    Je voudrais afficher la liste des clients en horizontal et leurs quantités de produits en vertical
    Je travaille avec ADOQuery et j'ai utilisé le group by même le distinct, mais rien à faire : il me répète le client 3 fois en vertical.

  2. #2
    Rédacteur/Modérateur

    Bonjour,
    c'est loin d'être précis comme énoncé, et l'on a des informations inutiles i.e.
    Je travaille avec ADOQuery et j'ai utilisé le group by même le distinct, mais rien à faire : il me répète le client 3 fois en vertical.
    sur ce que je comprend, plusieurs solutions sont possibles .


    En me basant sur un état détail , je rajouterais un QRGroupHeader de hauteur 0 , le groupage étant sur le n°Client
    J'utiliserai ensuite son évènement AfterPrint (ou BeforePrint aucune importance) pour mettre la propriété Enabled des DBText concernant le Client à True
    De même j'utiliserai l'évènement AfterPrint de la bande Détail pour désactiver ces propriétés

    Moins casse-tête, et toujours s'il s'agit d'un état détail, un QRGroupHeader avec groupage sur le n° client avec dans cette bande les informations clients
    et une bande détail avec uniquement les informations produits

    mais franchement
    Je voudrais afficher la liste des clients en horizontal et leurs quantités de produits en vertical

    c'est vraiment pas assez clair, un état de sortie dessiné en PJ serait apprécié
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Futur Membre du Club
    je veux afficher comme ça


    j'ai utiliser la bande détail et sous détail mais je n’obtient pas cette affichage il me répète le client trois fois même sous sql server

  4. #4
    Rédacteur/Modérateur

    Bonjour,

    à mon avis, il n'y a pas de bande sous-détail à utiliser les 2 premières lignes de l'état que vous voulez sont une seule et même ligne détail.
    Deux solutions possibles :
    - soit vous arrivez à créer un requête (ou un fichier de travail) qui passera toutes les informations :
    Client,nom,produit1,qt1,produit2,qt2,produit3,qt3
    et donc vous aurez alors à traiter un simple état

    -soit vous gérez le remplissage de la ligne détail (les 2 lignes de votre tableau) 'à la main'
    une Query pour avoir les Clients,nom servira de DataSet principal
    une requête paramétrée utilisée à l'intérieur de l'évènement BeforePrint de la bande détail permettra de remplir les QRLabels des couples Produit/Qte
    vous en profiterez alors pour cumuler dans des variables globales les 3 totaux

    à proprement parler, ni l'une ni l'autre de ces solutions ne me plaisent , que se passerait-il si un client n'avais que deux produits (c'est encore gérable) ou plus de trois (là tout fout le camp) . La bonne solution, toujours à mon avis, est de revoir complètement l'état de sortie mais, bon, si le client est roi objectez lui quand même ces 2 arguments
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Futur Membre du Club
    puisque on utilise ici les query est ce qu'il y a un moyen de jouer avec l'affichage dans la requête (mon affichage souhaiter)

    NB:
    une fois j'ai utiliser une table temporaire pour obtenir l'affichage souhaiter contien les champs (Tnom_cl,Tqtt1,Tqtt2,Tqtt3)
    la colonne Tqtt1 va prendre la valeur du champ Qtt_bl du produit 1
    et Tqtt1 va prendre la valeur du champ Qtt_bl du produit 2
    et Tqtt1 va prendre la valeur du champ Qtt_bl du produit 3 du même client
    quant je clic sur le boutton imprimer il fait une insertion de tout les clients vers la table temporaire pour basculé l'affichage
    mais ça c'est du bricolage, si on a une centaines ou plus de client on va pas attendre toute l'insertion pour voir cette état

  6. #6
    Rédacteur/Modérateur

    Re,

    Je n'ai pas trop compris le dernier post à propos des tables temporaires mais peu importe.
    Je ne connais pas trop SQL Server mais je sais qu'il supporte les CTE .
    Voilà comment je ferais avec Firebird


    Hélas vous ne fournissez pas la structure des tables impliquées.

    en admettant que vous ayez 2, voire 2 tables Impliquées
    CLIENTS avec CODE_CLIENT,NOM
    PRODUITS avec CODE_PRODUIT,LIBELLE
    PRODUITCLIENT AVEC CODE_CLIENT,CODE_PRODUIT,QTE


    Code SQL Firebird :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    WITH A AS (SELECT FIRST 1 V.CODE_CLIENT,V.CODE_PRODUIT,C.NOM,P.LIBELLE,QTE 
                     FROM PRODUITCLIENT V 
                          JOIN CLIENTS C ON V.CODE_CLIENT=C.CODE_CLIENT
                          JOIN PRODUITS P ON V.CODE_PRODUIT=P.CODE_PRODUIT
                     ORDER BY V.CODE_CLIENT,V.CODE_PRODUIT)
    
           B AS (SELECT FIRST 1 SKIP 1 V.CODE_CLIENT,V.CODE_PRODUIT,C.NOM,P.LIBELLE,QTE 
                     FROM SELECT PRODUITCLIENT V 
                          JOIN CLIENTS C ON V.CODE_CLIENT=C.CODE_CLIENT
                          JOIN PRODUITS P ON V.CODE_PRODUIT=P.CODE_PRODUIT
                    ORDER BY V.CODE_CLIENT,V.CODE_PRODUIT)
    
           C AS (SELECT FIRST 1 SKIP 2 V.CODE_CLIENT,V.CODE_PRODUIT,C.NOM,P.LIBELLE,QTE 
                     FROM SELECT PRODUITCLIENT V 
                          JOIN PRODUITS P ON V.CODE_PRODUIT=P.CODE_PRODUIT
                    ORDER BY V.CODE_CLIENT,V.CODE_PRODUIT)
    
    SELECT A.CODE_CLIENT,A.NOM,A.CODE_PRODUIT,A.LIBELLE,A.QTE,B.CODE_PRODUIT,B.LIBELLE,B.QTE
              ,C.CODE_PRODUIT,C.LIBELLE,C.QTE 
    FROM A JOIN B ON A.CODE_CLIENT=B.CODE_CLIENT
               JOIN C ON A.CODE_CLIENT=C.CODE_CLIENT


    mais encore une fois cela nécessite que tout client ait obligatoirement au maximum 3 produits

    je vous laisse chercher l'équivalent de FIRST (facile TOP ) et SKIP (là ça va être plus compliqué) pour SQL SERVER
    mais ça c'est du SQL, aucun rapport avec Quickreport
    et ma deuxième solution (n'impliquant pas de table temporaire faut-il le souligner) est certainement plus rapide
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Futur Membre du Club
    merci comme même, je vais fouiller un peu dans le forum sql espérons trouver quelque chose

  8. #8
    Rédacteur/Modérateur

    Bonjour,
    Mais pourquoi ne pas utiliser la méthode 2 ?

    Citation Envoyé par sergiomaster
    -soit vous gérez le remplissage de la ligne détail (les 2 lignes de votre tableau) 'à la main'
    une Query pour avoir les Clients,nom servira de DataSet principal
    une requête paramétrée utilisée à l'intérieur de l'évènement BeforePrint de la bande détail permettra de remplir les QRLabels des couples Produit/Qte
    vous en profiterez alors pour cumuler dans des variables globales les 3 totaux
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #9
    Futur Membre du Club
    bonjour,
    si je suis entrain de réaliser
    j'ai un retour

  10. #10
    Futur Membre du Club
    bonjour,
    j'ai utiliser une seul bande detail
    1 ADOQuery1 pour l'affichage de la liste des clients

    et trois ADOQuery pour les quantités
    ADOQuery2 pour m'afficher la quantité du produit qui porte le code N° 1:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ADOQuery2.SQL.Clear;
      ADOQuery2.SQL.Add('select v.qtt_bl from livrer v,bon_livraison b,client c');
      ADOQuery2.SQL.Add('where v.num_bl=b.num_bl');
      ADOQuery2.SQL.Add('and c.code_cl=b.code_cl');
      ADOQuery2.SQL.Add('and v.num_prod=1');
     ADOQuery2.open;

    ADOQuery3 pou m'afficher la quantité du produit qui porte le code N° 2:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ADOQuery3.SQL.Add('select v.qtt_bl from livrer v,bon_livraison b,client c');
      ADOQuery3.SQL.Add('where v.num_bl=b.num_bl');
      ADOQuery3.SQL.Add('and c.code_cl=b.code_cl');
      ADOQuery3.SQL.Add('and v.num_prod=2');
     ADOQuery3.open;


    ADOQuery4 pou m'afficher la quantité du produit qui porte le code N° 4:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ADOQuery4.SQL.Add('select v.qtt_bl from livrer v,bon_livraison b,client c');
      ADOQuery4.SQL.Add('where v.num_bl=b.num_bl');
      ADOQuery4.SQL.Add('and c.code_cl=b.code_cl');
      ADOQuery4.SQL.Add('and v.num_prod=3');
     ADOQuery4.open;


    ça marche ... seulement il répète la ligne 1 (qtt1,qtt2,qtt3) du premier client pour tout les clients
    qu'est ce qu'il me faudra pour lier chaque client avec son quota (qtt1,qtt2,qtt3).
    * la qtt dans ce contexte correspond au qtt_bl dans le code

  11. #11
    Rédacteur/Modérateur

    Bonjour,

    donc vous optez pour la solution 2, mais vous n'en avez pas saisi tous les principes.

    vous n'avez besoin que de deux querys :
    1 ADOQuery1 pour la liste des clients
    qui va servir comme datasource maitre au Quickreport
    et non pas 3 mais une seule query pour les produits

    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      select TOP 3 v.qtt_bl from livrer v JOIN bon_livraison b ON v.num_bl=b.num_bl
      where  b.code_cl =:C
      order by v.num_produit

    notez , l'utilisation de JOIN pour les jointures de tables (c'est une norme d'écriture), l'utilisation du paramètre pour le code client, le TOP 3 pour n'être sur d'avoir que les 3 premiers articles, bien sur il manque la liaison avec la table produit pour ainsi obtenir également le libelle

    Votre bande détail , devra contenir les QRDBText concernant le client , et des QRLabels pour les produits

    Sur la base de votre dessin d'état vous aurez donc dans votre bande détail (hormis le dessin des lignes) 2 QRDBText lié a AdoQuery1 et 6 QRLabels (3 couples labelproduit/qteproduit)

    dans le BeforePrint de la Ligne détail on aura :

    ceci n'est qu'une ébauche
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    ADOQuery2.Parameters.ParamByName('C').asString:=ADOQuery1.FieldByName('NUM_CLIENT').asString;
    ADOQuery2.Open;
    LabelProduit1.caption:=ADOQuery2.FieldByName('NOMPRODUIT').asString; // champ non défini dans la query , à faire
    QtProduit1.Caption:=ADOQuery2.FieldByName('QTT_BL').asString;  // a formater correctement
    // ajouter qqt a la variable globale totalcolonne1
    ADOQuery2.Next
    LabelProduit2.caption:=ADOQuery2.FieldByName('NOMPRODUIT').asString; // champ non défini dans la query , à faire
    QtProduit2.Caption:=ADOQuery2.FieldByName('QTT_BL').asString;  // a formater correctement
    // ajouter qtt_BL a la variable globale totalcolonne2
    ADOQuery2.Next
    LabelProduit3.caption:=ADOQuery2.FieldByName('NOMPRODUIT').asString; // champ non défini dans la query , à faire
    QtProduit3.Caption:=ADOQuery2.FieldByName('QTT_BL').asString;  // a formater correctement
    // ajouter qtt_BL a la variable globale totalcolonne3
    ADOQuery2.Close;

    vous ne devrez pas oublier
    - de gérer les nulls (enregistrement inexistant)
    - de récupérer les libellés produits
    - de faire en sorte qu'un client sans bl ne soit pas dans la liste des clients (il faut certainement revoir l'ADOQuery1)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  12. #12
    Futur Membre du Club
    bonjour,
    votre solution marche bien, maintenant chaque client est lier par son quota
    seulement pour
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    QtProduit1.Caption:=ADOQuery2.FieldByName('QTT_BL').asString;

    il accepte
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    QtProduit1.Caption:=ADOQuery2.FieldByName('QTT_BL').Value;

    comme tu a dit reste l’inconvénient si on a un autre produit en plus ?
    - pour les enregistrements nul,et les client sans BL sont préalablement pris en charge avec un filtre
    - il me reste un problème dans cette état concernant la somme
    dans ma première idée j'ai utiliser 3 query une pour produit 1 et la 2 eme pour le produit 2 et la 3 eme pour le produit 3 elle marche normal,
    j'ai essayer de l'appliquer pour cette solution avec un QRSubdétail rien apparaît

  13. #13
    Rédacteur/Modérateur

    Bonjour,

    pour ce qui est des totaux, j'ai dit qu'il fallait utiliser 3 variables générales , initialisée à zéro lors du BeforePrint de l'état, incrémentées lors du BeforePrint de la bande détail et enfin pour les imprimer il ne s'agit pas d'utiliser une bande QRSubDetail mais une bande résumé (QRBand type rbSummary) et , encore une fois des QRLabels pour chacun des totaux (donc utilisation de BeforePrint de la bande résumé).

    pour ce qui est de ADOQuery2.FieldByName('QTT_BL').asString; qui ne passe pas alors que ADOQuery2.FieldByName('QTT_BL').Value; passe c'est de mon point de vue anormal (c'est aussi pour cette raison que j'avais mis le commentaire ADOQuery2.FieldByName('QTT_BL').asString; // a formater correctement)

    maintenant cela dépend peut être aussi de ADO (qui est loin d'être ma tasse de thé) , du manque de gestion des nulls ou ...

    comme je n'ai pas le type de données pour les quantités c'est un peu délicat mais pour un entier je procéderai ainsi

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ADOQuery2.EOF then
     begin
       LabelProduit1.Caption:='';
       QtProduit1.Caption:='';
     end
     else  
       LabelProduit1.Caption:=ADOQuery2.FieldByName('NOMPRODUIT').asString;
       QtProduit1.Caption:=Format('%d',[ADOQuery2.FieldByName('QTT_BL').asInteger]);
       TotP1:=Totp1+ADOQuery2.FieldByName('QTT_BL').asInteger;
     end;
    //à répéter pour les 2 autres produits

    Cependant ce n'est pas très satisfaisant car cela implique que pour chaque client cela soit toujours identique cad :
    un client à le produit 1 et pas d'autre
    un client à les produits 1 et 2
    un client à le produit 1,2,3
    cela ne fonctionnerai pas si par exemple un client a les produits 2 et 3 mais pas le produit 1 , les totaux seraient faux de mon point de vue

    une autre solution pour éviter ce problème serait de modifier la Requête 2 en
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    select v.qtt_bl from livrer v JOIN bon_livraison b ON v.num_bl=b.num_bl
      where  b.code_cl =:C and v.num_Produit=:N

    et de faire ainsi pour chaque produit

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ADOQuery2.Parameters.ParamByName('C').asString:=ADOQuery1.FieldByName('NUM_CLIENT').asString;
    ADOQuery2.Parameters.ParamByName('N').asString:=1;
    ADOQuery2.Open;
    // code au dessus
    ADOQuery2.Close;
    ADOQuery2.Parameters.ParamByName('N').asString:=2;
    ADOQuery2.Open;
    // code au dessus mais pour couple 2
    ADOQuery2.Close;
    ADOQuery2.Parameters.ParamByName('N').asString:=3;
    ADOQuery2.Open;
    // code au dessus mais pour couple 3
    ADOQuery2.Close;

    mais, critique, cela devient de plus en plus moche en terme de performances (surtout dans un environnement réseau)

    une meilleure solution serait alors d'utiliser FindComponent , et un tableau pour les totaux (totQte array[1..3] of Integer)
    et modifier ADOQuery2.SQL

    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    select TOP 3 v.num_produit,v.qtt_bl from livrer v JOIN bon_livraison b ON v.num_bl=b.num_bl
      where  b.code_cl =:C
      order by v.num_produit

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var i : word;
    begin
    // Effacement des colonnes
    for i:=1 to 3 do 
    begin
      TQRLabel(FindComponent('LabelProduit'+Inttostr(i))).Caption:='';
      TQRLabel(FindComponent('QtProduit'+Inttostr(i))).Caption:='';
    end;
     
    ADOQuery2.Parameters.ParamByName('C').asString:=ADOQuery1.FieldByName('NUM_CLIENT').asString;
    ADOQuery2.Open;
    While not ADOQuery2.EOF do 
     begin
       TQRLabel(FindComponent('LabelProduit'+ADOQuery2.FieldByName('NUM_PRODUIT').asString)).caption:=ADOQuery2.FieldByName('NOMPRODUIT').asString;
       TQRLabel(FindComponent('QtProduit'+ADOQuery2.FieldByName('NUM_PRODUIT').asString)).caption:=Format('%d',[ADOQuery2.FieldByName('QTT_BL').asInteger]);
       TotQte[ADOQuery2.FieldByName('NUM_PRODUIT').asInteger]:=TotQte[ADOQuery2.FieldByName('NUM_PRODUIT').asInteger]+ADOQuery2.FieldByName('QTT_BL').asInteger;
      Adoquery2.Next;
     end;
    ADOQuery2.Close;


    ATTENTION : ceci ne fonctionnerai qu'avec 3 produits numérotés 1,2,3
    au risque de me répéter , cet état de sortie est plus que criticable
    on en revient aussi à ma proposition 1 , à savoir l'utilisation d'une seule Query nettement plus élaborée (utilisation d'une jonction de trois CTE abordée dans le Post #6) que j'ai même simplifié ainsi : (cela doit pouvoir passer avec SQL Server)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    WITH A AS (SELECT V.CODE_CLIENT,V.CODE_PRODUIT,C.NOM,P.LIBELLE,QTE 
                     FROM PRODUITCLIENT V 
                          JOIN CLIENTS C ON V.CODE_CLIENT=C.CODE_CLIENT
                          JOIN PRODUITS P ON V.CODE_PRODUIT=P.CODE_PRODUIT
                     WHERE CODE_PRODUIT=1 
                     ORDER BY V.CODE_CLIENT,V.CODE_PRODUIT)
     
           B AS (SELECT  V.CODE_CLIENT,V.CODE_PRODUIT,C.NOM,P.LIBELLE,QTE 
                     FROM SELECT PRODUITCLIENT V 
                          JOIN CLIENTS C ON V.CODE_CLIENT=C.CODE_CLIENT
                          JOIN PRODUITS P ON V.CODE_PRODUIT=P.CODE_PRODUIT
                     WHERE CODE_PRODUIT=2)
     
           C AS (SELECTV.CODE_CLIENT,V.CODE_PRODUIT,C.NOM,P.LIBELLE,QTE 
                     FROM SELECT PRODUITCLIENT V 
                          JOIN PRODUITS P ON V.CODE_PRODUIT=P.CODE_PRODUIT
                    WHERE CODE_PRODUIT=3)
     
    SELECT A.CODE_CLIENT,A.NOM,A.CODE_PRODUIT,A.LIBELLE,A.QTE,B.CODE_PRODUIT,B.LIBELLE,B.QTE
              ,C.CODE_PRODUIT,C.LIBELLE,C.QTE 
    FROM A FULL JOIN B ON A.CODE_CLIENT=B.CODE_CLIENT
               FULL JOIN C ON A.CODE_CLIENT=C.CODE_CLIENT
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  14. #14
    Futur Membre du Club
    bonjour je vous remercie,
    autre question pour le même état,est ce qu'il y a une possibilité de faire des bons de livraisons pour ces clients en petit format
    c'est-à-dire d'afficher six bons par page, si en peux jouer sur colonnes et lignes de la quickrep (vu au nombre important des clients)

  15. #15
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par fatnews Voir le message

    autre question pour le même état,est ce qu'il y a une possibilité de faire des bons de livraisons pour ces clients en petit format
    c'est-à-dire d'afficher six bons par page, si en peux jouer sur colonnes et lignes de la quickrep (vu au nombre important des clients)
    votre demande n'est vraiment pas claire !
    pour le même état
    ce n'est pas le même état ou alors il s'agit d'état que vous voulez liés
    six bons par page
    autrement dit 6 lignes par pages, il suffit de gérer la hauteur de la ligne

    ceci étant , je vous rappelle le principe du forum 1 question par sujet (pour moi il s'agit là d'un autre sujet)
    comme c'est un état, un schéma de l'état de sortie souhaité et mettre les descriptions des tables concernées (bref bien exposer le besoin, BABA d'un programmeur)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  16. #16
    Futur Membre du Club
    bonjour,
    pardon je suis très sincère dans mes questions, ce n'est qu'une seul état avec les même clients et les même produits (seul état) c'est-à-dire
    la première état est un dispatching global par client, et la deuxième est des bons de livraisons pour chaque clients sons distribuer avec les produits livrés (quotidiennement) c'est pour ce la j'ai attacher ma question au discussion
    l’essentiel si le forum oblige une question par discussion je retransmettre ma question

  17. #17
    Rédacteur/Modérateur

    Bonjour,

    C'est peut être le même programme, les mêmes données , mais ce n'est pas le même état . Le premier état est , si j'ai bien compris
    - un récapitulatif par clients ,avec un maximum de 3 produits par clients , les mêmes pour tous les clients
    (ce qui est de mon point de vue, selon mon expérience, extrêmement restrictif et difficilement applicable à la vie réelle d'une entreprise, une entreprise ne vendant que 3 produits c'est rare)
    le second, un état bons de livraisons (dont vous n'avez toujours pas fourni le dessin) où pour l'instant la seule difficulté réside dans la hauteur de la ligne détail

    si vous voulez par la suite réunir les 2 états afin de ne faire qu'une "seule impression" il suffit alors de les fusionner. une recherche dans le forum permet de trouver la solution pour cette fusion
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd