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

SQL Oracle Discussion :

RowNum SQL et Delphi


Sujet :

SQL Oracle

  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 RowNum SQL et Delphi
    Bonjour à tous,

    Voilà je bosse sous Delphi 7 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

    Voici ma requête me permettant d'afficher mon tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        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 FLAXCOL ='+QuotedStr('7') );
        SQL.Add('and (REFXCOL is not null) group by CDEXENT, COLXCOL, NUMXENT, NUMXCOL');
    Sergio Master m'a aidé dans cette discussion

    A utiliser ma requête pour gérer une colonne couleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        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 C2 ON C2.CDEXENT=E.CDEXENT AND C2.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');

    POur qu'en fonction de cette colonne couleur je modifie les couleurs de mes lignes :

    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;
    Cependant cela ne fonctionne pour le moment pas. Mais nous ne sommes pas sûr de l'utilisation de RowNum sous Oracle...

    Avez vous des idées pour ma requête ?
    Images attachées Images attachées  
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez quelque chose comme ça :
    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;
    Sur un autre sujet, ne construisez pas votre requête dans votre code applicatif. C'est mauvais pour les performances, la sécurité et la maintenabilité. Utilisez des procédures et/ou des vues.

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Si tu veux numéroter les lignes selon l'ordre de sortie qui est defini par l'order by, utilise plutôt row_number :

    select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c2.RN) row_number() over(order by E.CDEXENT, C.COLXCOL) AS COLCOULEUR, NUMXCOL
    ...

    De plus, il vaut mieux que ton order by soit déterministe, pour être sûr que le row_number retourne la même chose que l'order by (même si ça a de grandes chances d'être le cas). Le meux serait d'inclure toutes les colonnes du GROUP BY partout.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  4. #4
    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
    Citation Envoyé par Waldar Voir le message
    Essayez quelque chose comme ça :
    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;
    Sur un autre sujet, ne construisez pas votre requête dans votre code applicatif. C'est mauvais pour les performances, la sécurité et la maintenabilité. Utilisez des procédures et/ou des vues.
    Si je copie la requête en PL/SQl (avant de la mettre dans mon code) ça me dit "Toutes les variables ne sont pas liées" sur la ligne du rank. A quoi correspond t-il ?
    Windows XP
    Delphi 7

    WinDev Mobile 17

  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
    Citation Envoyé par pacmann Voir le message
    Salut,

    Si tu veux numéroter les lignes selon l'ordre de sortie qui est defini par l'order by, utilise plutôt row_number :

    select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,MAX(c2.RN) row_number() over(order by E.CDEXENT, C.COLXCOL) AS COLCOULEUR, NUMXCOL
    ...

    De plus, il vaut mieux que ton order by soit déterministe, pour être sûr que le row_number retourne la même chose que l'order by (même si ça a de grandes chances d'être le cas). Le meux serait d'inclure toutes les colonnes du GROUP BY partout.
    Quelque chose comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select COLXCOL, E.CDEXENT,CAST(0 AS SMALLINT) AS REGROUPER ,row_number() over(order by E.CDEXENT, C.COLXCOL) AS COLCOULEUR, NUMXCOL
    from ENTXRES E JOIN COLXRES C ON E.NUMXENT=C.NUMXCOL 
     
    where CODXENT ='00400' 
    and TOUXENT ='DUCFRA' 
    and MARXENT ='RO' 
    and refxcol is not null
    and FLAXCOL ='7'
    group by COLXCOL, E.CDEXENT,REGROUPER ,COLCOULEUR, NUMXCOL
    order by COLXCOL, E.CDEXENT,REGROUPER ,COLCOULEUR, NUMXCOL
    je l'ai mis dans PL/SQ (pour tester avant de mettre dans mon code) mais ça me dit COLCOULEUR identificateur non valide...
    Il me reconnait pas la couleur..
    Windows XP
    Delphi 7

    WinDev Mobile 17

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Si je copie la requête en PL/SQl (avant de la mettre dans mon code) ça me dit "Toutes les variables ne sont pas liées" sur la ligne du rank. A quoi correspond t-il ?
    À ces trois variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        WHERE CODXENT =:cod
          AND TOUXENT =:tou
          AND MARXENT =:mar
    Il suffit de les remplacer par l'autre bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        WHERE CODXENT = '00400'
          AND TOUXENT = 'DUCFRA'
          AND MARXENT = 'RO'

  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
    OK ça fonctionne au niveau de la requête.

    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 au niveau de mon test :

    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;
    ça ne fonctionne pas ...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pour la partie delphi, ne connaissant pas ce langage je ne peux pas vous aider.
    La colonne RK renvoie simplement un numéro différent pour chaque colxcol.
    Si vous voulez que les id soit continus, vous pouvez utiliser la fonction dense_rank() au lieu de rank().

  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
    Merci de votre aide. La requête fonctionne mais mon affichage non... je vais voir ce que je peux faire merci en tout cas
    Windows XP
    Delphi 7

    WinDev Mobile 17

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. function extract du sql et delphi
    Par guy kadima dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/06/2005, 10h08
  2. SQL avec Delphi 4
    Par jackrabbit dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/10/2004, 11h05
  3. sql avec delphi
    Par k_boy dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/07/2004, 22h39
  4. Pbl sql et delphi
    Par rippoz dans le forum Bases de données
    Réponses: 5
    Dernier message: 29/04/2004, 17h02
  5. probleme sql avec delphi
    Par lil_jam63 dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/02/2004, 04h32

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