IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage Delphi Discussion :

Colorer lignes DBGrid en fonction d'une colonne


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut Colorer lignes DBGrid en fonction d'une colonne
    Bonjour,

    Voilà j'ai un tableau (voir pièces jointes) et j'aimerai faire une différence de couleurs. A chaque commande différente je met change de couleurs.

    Sur mon exemple en pièce jointe cela ferait :
    1° ligne en blanc
    3 lignes suivantes en gris
    Lignes suivantes en blanc...

    Comment puis je faire ? Je sais qu'il faut que je le mette sur le OnDrawColumnCell ...

    Je parcours cet exemple également mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDBGrid(Sender).Canvas.Brush.Color := clWhite;
    C'est pour toute la ligne ou que la cellule ?

    Je désire colorer la ligne complète ...
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    De mémoire, il s'agit de la cellule mais la méthode est appellée pour chaque cellule de la grille. Donc au final cela devrait colorer toute la ligne.

    Montre déjà ce que tu as fait parce qu'il n'y a pas de raison que ça ne fonctionne pas

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    En fait je vois pas comment faire. En gros je voulais prendre mon 1Er numéro de commande je compare à celui de la ligne suivante je modifie la couleur et je fais pareil du coup je sais pas comment écrire mon code :

    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
      // On récupère le N° cmd
      x_cmd :='';
     
      If dbgrid_select.DataSource.DataSet.FieldByName('CDEXENT').Value <> x_cmd Then
      begin
        if dbgrid_select.Canvas.Brush.Color=clWindow then
          dbgrid_select.Canvas.Brush.Color:=clRed
        else
          dbgrid_select.Canvas.Brush.Color:=clWindow
      end
      Else
      begin
        if dbgrid_select.Canvas.Brush.Color=clWindow then
          dbgrid_select.Canvas.Brush.Color:=clWindow
        else
          dbgrid_select.Canvas.Brush.Color:=clRed
      end;
      x_cmd := dbgrid_select.DataSource.DataSet.FieldByName('CDEXENT').AsString;
    J'ai du mal à voir comment écrire le code en fait

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    bonjour ,

    tu y es presque ! déjà tu as une partie de la réponse en ayant utilisé x_cmd , c'est surtout l'affectation de la valeur par la suite qui est mal placée .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     // On récupère le N° cmd
      x_cmd :='';
     
      If dbgrid_select.DataSource.DataSet.FieldByName('CDEXENT').Value <> x_cmd Then
      begin
        if dbgrid_select.Canvas.Brush.Color=clWindow then
          dbgrid_select.Canvas.Brush.Color:=clRed
        else
          dbgrid_select.Canvas.Brush.Color:=clWindow;
        x_cmd := dbgrid_select.DataSource.DataSet.FieldByName('CDEXENT').AsString;
      end
    seulement ça risque de ne pas fonctionner dés que tu va faire un clic sur une cellule la grille va se rafraichir et tout va partir à vau l'eau ! sauf si tu n'a que ça dans le ondrawcolumncell et que tu désactive le ondrawcell juste après le remplissage de la grille .

    il faut donc trouver une piste plus facile et remonter à la source , cad à la query

    si elle n'a pas changée je la reprend ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          'SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL '#10+
          'WHERE CODXENT =:cod '#10+
          'and TOUXENT =:tou '#10+
          'and MARXENT =:mar '#10+
          'and (refxcol is not null) group by cdexent, colxcol, numxent';
    le hic c'est qu'il va falloir y rajouter une colonne "calculée" qui permettra de gérer la couleur là cela va dépendre du SGBD si ce dernier permet les Common Table Expression comme Firebird je ferais ainsi (sans avoir une description de fichier c'est un peu succint)
    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
     
    //j'utilise une table c1 qui va récupérer un numéro d'enregistrement grâce a une variable de contexte
    WITH C1 AS (SELECT CDEXENT,
     COALESCE(rdb$get_context('USER_TRANSACTION', 'row#'),0) as row_number,
    // ici j'incrémente ma variable de contexte
     rdb$set_context('USER_TRANSACTION', 'row#',
     Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) + 1)
     FROM ENTXRES GROUP BY CDEXENT,NUMXENT)
     
    SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER,
     ,MAX(c1.ROW_NUMBER) AS  COLCOULEUR 
    FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL
    JOIN C1 ON C1.CDEXENT=E.CDEXENT
      WHERE CODXENT =:cod
      and TOUXENT =:tou
      and MARXENT =:mar
      and (refxcol is not null) 
    group by cdexent, colxcol, numxent
    selon ton tableau cela me donnera quelque chose du style
    00667965 2 colcouleur 0
    00668926 2 colcouleur 1
    00668926 4 colcouleur 1
    00668926 5 colcouleur 1
    00667965 6 colcouleur 2
    00667965 14 colcouleur 2
    00667965 7 colcouleur 2
    il sera alors facile de tester cette colonne colcouleur pour obtenir la bascule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // j'utilise la parité de colcouleur pour faire la bascule
       if Odd(dbgrid_select.DataSource.DataSet.FieldByName('COLCOULEUR').asinteger)  then
          dbgrid_select.Canvas.Brush.Color:=clRed
        else
          dbgrid_select.Canvas.Brush.Color:=clWindow;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Wahooo je t'avoue que cette partie me fait un peu peur :

    Citation Envoyé par SergioMaster Voir le message
    le hic c'est qu'il va falloir y rajouter une colonne "calculée" qui permettra de gérer la couleur là cela va dépendre du SGBD si ce dernier permet les Common Table Expression comme Firebird je ferais ainsi (sans avoir une description de fichier c'est un peu succint)
    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
     
    //j'utilise une table c1 qui va récupérer un numéro d'enregistrement grâce a une variable de contexte
    WITH C1 AS (SELECT CDEXENT,
     COALESCE(rdb$get_context('USER_TRANSACTION', 'row#'),0) as row_number,
    // ici j'incrémente ma variable de contexte
     rdb$set_context('USER_TRANSACTION', 'row#',
     Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) + 1)
     FROM ENTXRES GROUP BY CDEXENT,NUMXENT)
     
    SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER,
     ,MAX(c1.ROW_NUMBER) AS  COLCOULEUR 
    FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL
    JOIN C1 ON C1.CDEXENT=E.CDEXENT
      WHERE CODXENT =:cod
      and TOUXENT =:tou
      and MARXENT =:mar
      and (refxcol is not null) 
    group by cdexent, colxcol, numxent
    Y'a pas moyen de faire plus simple ?

    Je suis sous un SGBD Oracle... et Delphi 7.

    Je vais essayer de le mettre en place pour voir ce que ça donne.

    Car effectivement dans mon OnDrawColumnCell j'ai aussi ma gestion de la case à cocher :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    procedure TFS42.DBGrid_SelectDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    var
      x_cmd : string;
     
    begin
      with Sender as TDBGrid do
      begin
        // On ne prend en compte que la colonne REGROUPER
        if sameText(Column.FieldName, 'REGROUPER') then
        begin
          { On efface la cellule }
          Canvas.FillRect(Rect);
          { Cochée ou Pas ?}
     
          dmImages.imgCheck.Draw(DBGrid_select.Canvas,
              Rect.Left + ((Rect.Right - Rect.Left - dmImages.imgCheck.Width) div 2),
              Rect.Top,
              Column.Field.AsInteger // 0 = non coché, 1 coché
     
            );
        end
        { si column ne correspond pas à une case à cocher, }
        { on ne s'occupe pas du dessin de la cellule, on }
        { transmet donc à DefaultDrawColumnCell }
        else
        begin
          DefaultDrawColumnCell(Rect, DataCol, Column, State);
        end;
      end;
    end;
    EDIT :

    C1 je le déclare comment ? C'est une TTable ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Wahooo je t'avoue que cette partie me fait un peu peur
    c'est juste un moyen d'avoir des numéros d'enregistrements

    Y'a pas moyen de faire plus simple ?
    Je suis sous un SGBD Oracle... et Delphi 7.
    sous Oracle , je connais pas , mais je pense que c'est possible
    1- je suis sur que les CTE existent
    2- RAWNUMBER ou Raw_num() remplaceront la partie set/get context variable
    c'est donc plus simple avec Oracle qu'avec Firebird ;-)
    Car effectivement dans mon OnDrawColumnCell j'ai aussi ma gestion de la case à cocher
    je m'en souvenais

    Nota : dans la ligne 13 du SQL je pense m'être trompé au niveau du JOIN il doit manquer une égalité supplémentaire
    cela doit donner (sous réserve) quelque chose comme ceci en SQL Oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH C1 AS (SELECT CDEXENT,NUMEXENT,
    rownum
     FROM ENTXRES GROUP BY CDEXENT,NUMXENT)
     
    SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER,
     ,MAX(c1.ROW_NUMBER) AS  COLCOULEUR 
    FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL
    JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMEXENT=E.NUMEXINT

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    J'ai un soucis avec les cotes là par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        WITH C1 AS ('SELECT CDEXENT, '#10+
       'COALESCE(rdb$get_context(''USER_TRANSACTION'', ''row#''),0) as row_number, '#10+
      // ici j'incrémente ma variable de contexte
       'rdb$set_context(''USER_TRANSACTION'', ''row#'', '#10+
       'Coalesce(rdb$get_context(''USER_TRANSACTION'',''row#''),0) + 1)'#10+
       'FROM ENTXRES GROUP BY CDEXENT,NUMXENT');
    Il me dit opérateur non applicable à ce type d'opérande... sur la dernière ligne

    J'ai mis ça pour la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.ROW_NUMBER) AS COLCOULEUR, NUMXCOL '#10+
          'FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMEXENT=E.NUMXENT'#10+
          'WHERE CODXENT =:cod '#10+
          'and TOUXENT =:tou '#10+
          'and MARXENT =:mar '#10+
          'and (refxcol is not null) '#10+
          'and (FLAXCOL =''7'') group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL order by CDEXENT, COLXCOL';

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    1- Il ne faut pas mettre de ; après le SELECT de la CTE

    2- Utilises Rownum en lieu et place la partie variables de contexte de firebird
    http://stackoverflow.com/questions/1...rows-in-oracle

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Lequel de ; ??? Si j'enlève celui à la fin du With C1 il me dit qu'il manque un ; ...

    Et pour le rownum ... ?
    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
    24
    25
    26
     
      //j'utilise une table c1 qui va récupérer un numéro d'enregistrement grâce a une variable de contexte
      WITH C1 AS ('SELECT CDEXENT, '#10+
       'COALESCE(rdb$get_context(''USER_TRANSACTION'', ''rownum#''),0) as row_number, '#10+
      // ici j'incrémente ma variable de contexte
       'rdb$set_context(''USER_TRANSACTION'', ''rownum#'', '#10+
       'Coalesce(rdb$get_context(''USER_TRANSACTION'',''rownum#''),0) + 1)'#10+
       'FROM ENTXRES GROUP BY CDEXENT,NUMXENT');
     
      with q_select do
      begin
        Close;
        SQL.Text :=
          'SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.ROW_NUMBER) AS COLCOULEUR, NUMXCOL '#10+
          'FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMEXENT=E.NUMXENT'#10+
          'WHERE CODXENT =:cod '#10+
          'and TOUXENT =:tou '#10+
          'and MARXENT =:mar '#10+
          'and (refxcol is not null) '#10+
          'and (FLAXCOL =''7'') group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL order by CDEXENT, COLXCOL';
     
        ParamByName('cod').AsString := zx_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        tryquery1(q_select,'open','Erreur affichage cmd regroupables (MS42 -008)',4);
     end;

    EDIT :

    Si je met la requête dans PL/SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CDEXENT,COALESCE(rdb$get_context('USER_TRANSACTION', 'rownum#'),0) as row_number,
       rdb$set_context('USER_TRANSACTION', 'rownum#',
       Coalesce(rdb$get_context('USER_TRANSACTION','rownum#'),0) + 1)
       FROM ENTXRES GROUP BY CDEXENT,NUMXENT;
    ça me dit "ORA-00904 : rdb$set_context : identificateur non valide"

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    Blonde ? non , je rigole
    c'est une seule et même requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    'WITH C1 AS (SELECT CDEXENT,NUMEXENT,
    rownum
     FROM ENTXRES GROUP BY CDEXENT,NUMXENT)
     
    SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER,
     ,MAX(c1.ROW_NUMBER) AS  COLCOULEUR 
    FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL
    JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMEXENT=E.NUMEXINT
    ...
    '
    quant à la partie rdb$context j'ai bien indiqué que c'était Firebird , pour oracle voir ROWNUM

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Ah oui d'accord désolée j'avais pas compris ...

    >Par contre au risque de faire ma blonde encore ça me dit "Opérateur ou point virgule manquant" et là je vois pas où ...

    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
      with q_select do
      begin
        Close;
        SQL.Text :=
          'WITH C1 AS (SELECT CDEXENT,NUMXENT,rownum FROM ENTXRES GROUP BY CDEXENT,NUMXENT)' #10+
          'SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.ROW_NUMBER) AS COLCOULEUR, NUMXCOL'#10+
          'FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMEXENT=E.NUMXENT'#10+
          'WHERE CODXENT =:cod '#10+
          'and TOUXENT =:tou '#10+
          'and MARXENT =:mar '#10+
          'and (refxcol is not null) '#10+
          'and (FLAXCOL =''7'') group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL order by CDEXENT, COLXCOL';
     
        ParamByName('cod').AsString := zx_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        tryquery1(q_select,'open','Erreur affichage cmd regroupables (MS42 -008)',4);
      end;
    Il me dit ça direct sur la première ligne

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    Bon , c'est pas très joli ce SQL.text :=
    à remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL.Clear;
    SQL.Add('WITH C1 AS (SELECT CDEXENT,NUMXENT,rownum AS RN FROM ENTXRES GROUP BY CDEXENT,NUMXENT)');
    SQL.Add('SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.RN) AS COLCOULEUR, NUMXCOL');
    SQL.Add('FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMEXENT=E.NUMXENT');
    SQL.Add('WHERE CODXENT =:cod ');
    SQL.Add('and TOUXENT =:tou ');
    SQL.Add('and MARXENT =:mar ');
    SQL.Add('and refxcol is not null');
    SQL.Add('and FLAXCOL ='+QuotedStr('7') );  // <-plus joli pour pas se planter avec les '' 
    SQL.Add('group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL');
    SQL.Add('order by CDEXENT, COLXCOL'); // <- je suis pas sur que ce soit nécessaire
    au moins on enlève les #10
    par contre , je vois pas comme cela l'histoire du ; manquant , il faudrait tester la query à part dans un GUI Oracle (si ça existe)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Alors avec ça du coup :

    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
      with q_select do
      begin
        Close;
        SQL.Clear;
        SQL.Add('WITH C1 AS (SELECT CDEXENT,NUMXENT,rownum AS RN FROM ENTXRES GROUP BY CDEXENT,NUMXENT)');
        SQL.Add('SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.RN) AS COLCOULEUR, NUMXCOL');
        SQL.Add('FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMXENT=E.NUMXENT');
        SQL.Add('WHERE CODXENT =:cod ');
        SQL.Add('and TOUXENT =:tou ');
        SQL.Add('and MARXENT =:mar ');
        SQL.Add('and refxcol is not null');
        SQL.Add('and FLAXCOL ='+QuotedStr('7') );  // <-plus joli pour pas se planter avec les ''
        SQL.Add('group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL');
        SQL.Add('order by CDEXENT, COLXCOL');
     
        ParamByName('cod').AsString := zx_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        tryquery1(q_select,'open','Erreur affichage cmd regroupables (MS42 -008)',4);
      end;
    ça me dit : ORA-00918: définition de colonne ambigu

    Et si je tape ma requête dans PL/SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH C1 AS (SELECT CDEXENT,NUMXENT,rownum AS RN FROM ENTXRES GROUP BY CDEXENT,NUMXENT)
    SELECT colxcol, e.cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.RN) AS COLCOULEUR, NUMXCOL
    FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMXENT=E.NUMXENT
    WHERE CODXENT ='code' 
    and TOUXENT ='tou' 
    and MARXENT ='mar' 
    and refxcol is not null
    and FLAXCOL ='7'
    group by E.CDEXENT, COLXCOL, E.NUMXENT, NUMXCOL
    order by CDEXENT, COLXCOL
    J'ai dû préfixer certains champs pour qu'ils soient bien pris en compte et ça me dit que rownum n'est pas une expression group by.

    Mais si je le rajoute même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH C1 AS (SELECT CDEXENT,NUMXENT,rownum AS RN FROM ENTXRES GROUP BY CDEXENT,NUMXENT)
    SELECT colxcol, e.cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.RN) AS COLCOULEUR, NUMXCOL
    FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMXENT=E.NUMXENT
    WHERE CODXENT ='004000' 
    and TOUXENT ='DUCFRA' 
    and MARXENT ='RO' 
    and refxcol is not null
    and FLAXCOL ='7'
    group by E.CDEXENT, COLXCOL, E.NUMXENT, rownum,NUMXCOL
    order by CDEXENT, COLXCOL

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    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
      with q_select do
      begin
        Close;
        SQL.Clear;
        SQL.Add('WITH C1 AS (SELECT CDEXENT,NUMXENT,MAX(rownum) AS RN FROM ENTXRES GROUP BY CDEXENT,NUMXENT)');
        SQL.Add('SELECT colxcol, E.cdexent,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.RN) AS COLCOULEUR, NUMXCOL');
        SQL.Add('FROM ENTXRES E JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMXENT=E.NUMXENT');
        SQL.Add('WHERE CODXENT =:cod ');
        SQL.Add('and TOUXENT =:tou ');
        SQL.Add('and MARXENT =:mar ');
        SQL.Add('and refxcol is not null');
        SQL.Add('and FLAXCOL ='+QuotedStr('7') );  // <-plus joli pour pas se planter avec les ''
        SQL.Add('group by E.CDEXENT, E.COLXCOL, E.NUMXENT, NUMXCOL');
        SQL.Add('order by E.CDEXENT, E.COLXCOL');
    
        ParamByName('cod').AsString := zx_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        tryquery1(q_select,'open','Erreur affichage cmd regroupables (MS42 -008)',4);
      end;
    Corrections en Rouge
    1 - dans la cte car il y a un group by
    2 - il faut a minima préfixer le join de NUMXENT car cette colonne est aussi définie dans la CTE C1 ou alors il faut faire des alias pour les colonnes de la CTE

    9 :group by E.CDEXENT, COLXCOL, E.NUMXENT, rownum,NUMXCOL
    c'est pas dans ce group là , mais dans le group by de la CTE

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Merci

    La requête telle que :

    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
    24
    25
    26
    27
      with q_select do
      begin
        Close;
       (* SQL.Clear;
        SQL.Add('SELECT colxcol, cdexent,CAST(0 AS SMALLINT) AS REGROUPER, NUMXCOL FROM ENTXRES E JOIN COLXRES C ON NUMXENT=NUMXCOL');
        SQL.Add('WHERE CODXENT =:cod ');
        SQL.Add('and TOUXENT =:tou ');
        SQL.Add('and MARXENT =:mar ');
        SQL.Add('and (REFXCOL is not null) group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL');  *)
     
        SQL.Clear;
        SQL.Add('WITH C1 AS (select CDEXENT,NUMXENT,MAX(ROWNUM) AS RN from ENTXRES GROUP BY CDEXENT,NUMXENT)');
        SQL.Add('select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c1.RN) AS COLCOULEUR, NUMXCOL');
        SQL.Add('from ENTXRES E JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMXENT=E.NUMXENT');
        SQL.Add('where CODXENT =:cod ');
        SQL.Add('and TOUXENT =:tou ');
        SQL.Add('and MARXENT =:mar ');
        SQL.Add('and refxcol is not null');
        SQL.Add('and FLAXCOL ='+QuotedStr('7') );  // <-plus joli pour pas se planter avec les ''
        SQL.Add('group by E.CDEXENT, C.COLXCOL, E.NUMXENT, NUMXCOL');
        SQL.Add('order by E.CDEXENT, C.COLXCOL');
     
        ParamByName('cod').AsString := zx_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        tryquery1(q_select,'open','Erreur affichage cmd regroupables (MS42 -008)',4);
      end;
    fonctionne.

    Par contre j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       if Odd(dbgrid_select.DataSource.DataSet.FieldByName('COLCOULEUR').asinteger)  then
          dbgrid_select.Canvas.Brush.Color:=clRed
        else
          dbgrid_select.Canvas.Brush.Color:=clWindow;
        x_cmd := dbgrid_select.DataSource.DataSet.FieldByName('CDEXENT').AsString;
    Dans le OnDrawColumnCell mais ça ne fait rien du tout...

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    Je ne connais pas oracle donc vérifies le résultat de la CTE
    en fait je doute du max(rownum) ceci dit cela doit être décomposable en 2 CTE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SQL.Add('WITH C1 AS (select CDEXENT,NUMXENT from ENTXRES GROUP BY CDEXENT,NUMXENT)');
     SQL.Add(', C2 AS (SELECT CDEXENT,NUMXENT,ROWNUM AS RN FROM C1')
    et donc la jointure sur C2

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        SQL.Clear;
        SQL.Add('WITH C1 AS (select CDEXENT,NUMXENT from ENTXRES GROUP BY CDEXENT,NUMXENT)');
        SQL.Add(', C2 AS (SELECT CDEXENT,NUMXENT,ROWNUM AS RN FROM C1)');
        SQL.Add('select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c2.RN) AS COLCOULEUR, NUMXCOL');
        SQL.Add('from ENTXRES E JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL JOIN C1 ON C1.CDEXENT=E.CDEXENT AND C1.NUMXENT=E.NUMXENT');
        SQL.Add('JOIN C2 ON C2.NUMXENT=C1.NUMXENT');
        SQL.Add('where CODXENT =:cod ');
        SQL.Add('and TOUXENT =:tou ');
        SQL.Add('and MARXENT =:mar ');
        SQL.Add('and refxcol is not null');
        SQL.Add('and FLAXCOL ='+QuotedStr('7') );  // <-plus joli pour pas se planter avec les ''
        SQL.Add('group by E.CDEXENT, C.COLXCOL, E.NUMXENT, NUMXCOL');
        SQL.Add('order by E.CDEXENT, C.COLXCOL');
    Même chose ne change rien...

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 105
    Points : 41 195
    Points
    41 195
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    déjà tu fais une bourde , il ne faut utiliser que C2 dans ta requête principale .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       SQL.Add('select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c2.RN) AS COLCOULEUR, NUMXCOL');
        SQL.Add('from ENTXRES E JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL JOIN C2 ON C2.CDEXENT=E.CDEXENT AND C2.NUMXENT=E.NUMXENT');
    Ensuite et avant vérifies en PL/SQL directement si les résultats des CTE est correct ! encore une fois , ne connaissant pas oracle , je ne peux que donner des pistes , regardes également la fonction ROW_NUMBER()

    voici un exemple trouvé sur le net , regardes la ligne 3
    SQL> --ROW_NUMBER(): return a number with each row in a group, starting at 1
    SQL>
    SQL> SELECT
    2 prd_type_id, SUM(amount),
    3 ROW_NUMBER() OVER (ORDER BY SUM(amount) DESC) AS row_number
    4 FROM all_sales
    5 GROUP BY prd_type_id
    6 ORDER BY prd_type_id;
    la bonne démarche serait de poser la question sur le forum Oracle

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Alors si je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH C1 AS (select CDEXENT,NUMXENT from ENTXRES GROUP BY CDEXENT,NUMXENT) 
    , C2 AS (SELECT CDEXENT,NUMXENT,ROWNUM AS RN FROM C1)
    select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c2.RN) AS COLCOULEUR, NUMXCOL
    from ENTXRES E JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL JOIN C2 ON C2.CDEXENT=E.CDEXENT AND C2.NUMXENT=E.NUMXENT
    JOIN C2 ON C2.NUMXENT=C1.NUMXENT
    where CODXENT ='cod' 
    and TOUXENT ='tou'
    and MARXENT ='mar' 
    and refxcol is not null
    and FLAXCOL ='7'
    group by E.CDEXENT, C.COLXCOL, E.NUMXENT, NUMXCOL
    order by E.CDEXENT, C.COLXCOL
    Me fait une erreur sur la ligne en gras... C1.NUMXENT identificateur non valide.

    Si je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WITH C1 AS (select CDEXENT,NUMXENT from ENTXRES GROUP BY CDEXENT,NUMXENT)
    Mot clé Select absent...

    Je l'ai tournée autrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WITH C1 AS (select CDEXENT,NUMXENT from ENTXRES GROUP BY CDEXENT,NUMXENT)
    La commande SQL ne se termine pas correctement.

    Si je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C2 AS (SELECT CDEXENT,NUMXENT,ROWNUM AS RN FROM C1)
    Instruction SQL non valide. Tout ça je l'ai testé dans PL/SQL.

    Je vais me renseigner sur le forum Oracle...

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Voici la requête proposée par un membre du forum Oracle :

    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
    WITH SR AS
    (
       SELECT DISTINCT 
              colxcol
            , cdexent
            , NUMXCOL
         FROM ENTXRES E
         JOIN COLXRES C
           ON NUMXENT = NUMXCOL
        WHERE CODXENT =:cod
          AND TOUXENT =:tou
          AND MARXENT =:mar
          AND FLAXCOL ='7'
          AND REFXCOL IS NOT NULL
    )
      SELECT colxcol
           , cdexent
           , CAST(0 AS SMALLINT) AS REGROUPER
           , NUMXCOL
           , rank() over(ORDER BY colxcol ASC)     AS rk
        FROM SR
    ORDER BY colxcol ASC;
    Je l'ai donc mise en place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        sql.Add('WITH SR AS (SELECT DISTINCT colxcol, cdexent, NUMXCOL FROM ENTXRES E JOIN COLXRES C ON NUMXENT = NUMXCOL');
        sql.Add('WHERE CODXENT =:cod AND TOUXENT =:tou AND MARXENT =:mar AND FLAXCOL =''7'' AND REFXCOL IS NOT NULL)');
        sql.Add('SELECT colxcol, cdexent, CAST(0 AS SMALLINT) AS REGROUPER, NUMXCOL, rank() over(ORDER BY colxcol ASC) AS rk FROM SR ORDER BY colxcol ASC');
     
        ParamByName('cod').AsString := zx_cli;
        ParamByName('tou').AsString := x_tournee;
        ParamByName('mar').AsString := x_transport;
        tryquery1(q_select,'open','Erreur affichage cmd regroupables (MS42 -008)',4);
    Mais mes lignes ne sont pas pour autant coloriées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if Odd(dbgrid_select.DataSource.DataSet.FieldByName('RK').asinteger)  then
          dbgrid_select.Canvas.Brush.Color:=clRed
        else
          dbgrid_select.Canvas.Brush.Color:=clWindow;
        x_cmd := dbgrid_select.DataSource.DataSet.FieldByName('CDEXENT').AsString;
    Est ce que le problème ne peut pas venir de ce code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      dbgrid_select.Canvas.Brush.Color:=clRed
    ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/03/2014, 23h31
  2. Réponses: 2
    Dernier message: 17/03/2011, 21h45
  3. Suppression de ligne en fonction d'une colonne
    Par PPLILH2008 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 23/06/2008, 10h43
  4. Supprimer lignes en fonction d'une colonne
    Par eillon dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/12/2007, 11h15
  5. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo