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 Firebird Discussion :

Faire apparaître n fois le même enregistrement(firebird 2.5)


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut Faire apparaître n fois le même enregistrement(firebird 2.5)
    Bonjour,
    j'ai une table article avec comme champs code, nom_article, qte(type entier)
    ex
    code nom_article qte
    1 A1 2
    2 A2 3
    3 A3 1

    Es qu’il y a une requête sql (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select  qte fois  code nom_article from article
    ) qui pourra me donner en résultat
    code nom_article
    1 A1
    1 A1
    2 A2
    2 A2
    2 A2
    3 A3
    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Une requête "Select" peut-être pas, mais une requête du type Execute block sûrement.

    André

  3. #3
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par alanglet Voir le message

    Une requête "Select" peut-être pas

    André
    Donc il y a un peut-être oui ,j'en ai besoin pour faire un état (imprimer des étiquettes code à barre) donc se serai sympas de trouver une requête

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Bien sûr mais si cela doit se faire à l'intérieur d'un programme il vaut mieux écrire une procédure qu'un EXECUTE BLOCK , tout dépend s'il y a la possiblité de changer le "TERM"

    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
    SET TERM ^ ;
    EXECUTE BLOCK RETURNS (CODE INTEGER,NOM_ARTICLE VARCHAR(30))
    AS
    DECLARE VARIABLE B Integer;
    DECLARE VARIABLE Q Integer;
     
    BEGIN
    FOR SELECT CODE, NOM_ARTICLE,QTE
    FROM ARTICLE INTO :CODE,:NOM_ARTICLE,:Q 
    DO BEGIN 
      B=0;
      WHILE (B<Q) DO
        BEGIN 
         B=B+1;     
         SUSPEND;
        END 
      END  
    END^
    Procédure à créer une fois dans la base
    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
    CREATE PROCEDURE ETIQUETTES  RETURNS (CODE INTEGER,NOM_ARTICLE VARCHAR(30))
    AS
    DECLARE VARIABLE B Integer;
    DECLARE VARIABLE Q Integer;
     
    BEGIN
    FOR SELECT CODE, NOM_ARTICLE,QTE
    FROM ARTICLE INTO :CODE,:NOM_ARTICLE,:Q 
    DO BEGIN 
      B=0;
      WHILE (B<Q) DO
        BEGIN 
         B=B+1;     
         SUSPEND;
        END 
      END  
    END^
    utilisation SELECT * FROM ETIQUETTES
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Waw c'est magique Merci Mr Sergio, j'ai rajouter la procédure et ça me donne le résultat voulu .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,
    Citation Envoyé par SergioMaster Voir le message
    Bien sûr mais si cela doit se faire à l'intérieur d'un programme il vaut mieux écrire une procédure qu'un EXECUTE BLOCK , tout dépend s'il y a la possibilité de changer le "TERM"
    Ça dépend si les outils ou les composants utilisés si cette requête fait partie d'un programme, ont été effectivement mis à jour avec les évolutions de Firebird.
    La syntaxe EXECUTE BLOCK existait déjà dans Firebird en version 2.1 (avant 2010).
    Une version de IBExpert datant de 2008 fonctionne sans avoir besoin de changer la terminaison.
    Pour FlameRobin le changement de terminaison est nécessaire.
    En ce qui concerne les composants, les UIB sont à jour (pas de changement de terminaison), les autres c'est à voir...
    Les IBX de D7 sont partiellement utilisables: les IBSQL peuvent être utilisés sans changement de terminaison avec ParamCheck=false (ce qui est le cas dans l'exemple ci-dessus).
    Quand a écrire une procédure, tout dépend de l'application. J'évite la procédure "trop simple" qui n'apporte aucun gain de rapidité ou est peu utilisée. Il n'y a évidemment aucun empêchement s'il s'agit d'une nouvelle application, mais s'il s'agit d'une application diffusée, ne pas oublier que la création ou la mise à jour d'une procédure nécessite la mise à jour des bases de données déjà utilisées, opération qui nécessite des droits de propriétaire ou administrateur qui ne s'exécute pas sans risques pour les données enregistrées.

    André

  7. #7
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par alanglet Voir le message

    André
    Je ne voulais pas utiliser execute block car je ne sais pas (coté programmation )comment récupérer le résultat dans mon état,j'utilise delphi 7, zeoslib v 7.2.4 stable
    pour générer mes états j'utilise une requete(zreadonlyquery) pour l’affichage fastreport (tfrReport).

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Je viens de tester sous Lazarus et les Zeos 7.3.0-alpha, les résultats du ZReadOnlyQuery s'affichant dans un DBGrid, la requête EXECUTE BLOCK y fonctionne très bien sans avoir besoin de changer la terminaison par SET TERM ^
    Si la requête n'a besoin d'aucun paramètre d'entrée ParamCheck=False suffit pour résoudre le problème.
    S'il y a des paramètres d'entrée, ZEOS contourne le problème avec le paramètre ParamChar différent de ":" (je l'ai remplacé dans mon test par "#").

    André

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    un test D2010 +ZEOS 7.0 confirme également que, si la case paramcheck est décochée cela fonctionne, je n'ai pas vu de paramchar dans cette version mais bon, c'était un test rapide
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonsoir,

    ParamChar est un paramètre du ZReadOnlyQuery et du ZQuery.
    Un des problèmes que pose le type EXECUTE BLOCK c'est l'identification des paramètres par la fonction Parse.
    S'il n'y a pas de paramètres d'entrée, il n'est pas utile de rechercher ces paramètres, et le paramètre ParamCheck=False désactive cette fonction.
    S'il y a des paramètres d'entrée, il faut que la fonction Parse n'identifie que ces derniers. ZEOS résout le problème en identifiant les paramètres d'entrée par un caractère différent du ":". Mais je trouve la méthode utilisée dans les UIB plus élégante: il n'y a pas de Parse à l'intérieur d'un bloc begin..end.
    En reprenant l'exemple précédent avec les ZEOS, avec ParamChar=# et ParamCheck=True comme paramètres du ZReadOnlyQuery, le texte SQL permettant de filtrer les articles sur le début de NOM_ARTICLE pourrait être:
    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
    EXECUTE BLOCK (Filtre varchar(10)=#debut)
    RETURNS (CODE INTEGER,NOM_ARTICLE VARCHAR(30))
    AS
    DECLARE VARIABLE B Integer;
    DECLARE VARIABLE Q Integer;
     
    BEGIN
    FOR SELECT CODE, NOM_ARTICLE,QTE
    Where NOM_ARTICLE starting with :filtre
    FROM ARTICLE INTO :CODE,:NOM_ARTICLE,:Q 
    DO BEGIN 
      B=0;
      WHILE (B<Q) DO
        BEGIN 
         B=B+1;     
         SUSPEND;
        END 
      END  
    END
    André

    PS: la requête ci-dessus fonctionne aussi très bien avec IBExpert, mais pas avec FlameRobin. Pour ce dernier, le changement de terminaison n'est qu'un moyen pour ne pas "parser" le texte, en quelque sorte un ParamCheck=False.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2009, 23h22
  2. [MySQL] Éviter de faire 2 fois la même requête
    Par fey dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/06/2008, 15h40
  3. Réponses: 13
    Dernier message: 23/10/2007, 10h03
  4. Réponses: 4
    Dernier message: 19/04/2007, 15h36
  5. Sélectionner un même enregistrement deux fois...
    Par Manu0086 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/02/2004, 13h09

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