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 :

Selection des X derniers enregistrements d'une table


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Selection des X derniers enregistrements d'une table
    J'ai déjà posé cette question Dans le forum Delphi et BDd mais j'ai pas de réponse. Donc je le repost ici :

    J'ai une Table dans une BDD Interbase, j'aimerais récupérer disons les 100 derniers enregistrement de cette table si la table à plus de 100 enregistrement et le tout sinon via une requête.

    Quelle instruction doit utilise en complement avec cette instructions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select HS_DT, HS_TM, HS_US_ID from T_HISTORICS
    Merci

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Ce n'est pas possible simplement avec Interbase 6. La version 7 le permet il me semble grace à la notions de Rows qui y a été introduit.

    Donc pour en revenir à ton probleme, une solution consisterait à créer une procédure stockée qui se chargerait d'envoyer maximum 100 enregistrements.

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    J'avoue que j'ai pas assez de connaissance sur les procedures stocké.
    Tu peux m'avancer un bout de code Barbibule.

    merci

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Donne moi le create table de ta table T_HISTORICS

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    SET SQL DIALECT 3;
    CREATE GENERATOR GEN_HISTORICS_NO;
    SET NAMES NONE;
    /******************************************************************************/
     
    /****                                Tables                                ****/
    /******************************************************************************/
     
     
    CREATE TABLE T_HISTORICS (
        HS_DT     DATE,
        HS_NO     D_LCLE,
        HS_TM     TIME,
        HS_DS_NO  D_LCLE,
        HS_US_NO  D_SCLE
    );
     
    /******************************************************************************/
     
    /****                             Primary Keys                             ****/
    /******************************************************************************/
     
     
    ALTER TABLE T_RHISTORICS ADD CONSTRAINT PK_RHISTORICS PRIMARY KEY (RH_NO);
     
     
    /******************************************************************************/
     
    /****                             Foreign Keys                             ****/
    /******************************************************************************/
     
     
    ALTER TABLE T_HISTORICS ADD CONSTRAINT FK_HISTORICS_DS FOREIGN KEY (HS_DS_NO) REFERENCES T_DOSSIERS (DS_NO) ON DELETE CASCADE;
    ALTER TABLE T_HISTORICS ADD CONSTRAINT FK_HISTORICS_US FOREIGN KEY (HS_US_NO) REFERENCES T_USERS (US_NO) ON DELETE CASCADE;
     
     
    /******************************************************************************/
     
    /****                               Triggers                               ****/
    /******************************************************************************/
     
     
    SET TERM ^ ;
     
    /* Trigger: SET_HISTORICS_NO */
    CREATE TRIGGER SET_HISTORICS_NO FOR T_HISTORICS
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
      IF (NEW.HS_NO IS NULL) THEN
        NEW.HS_NO = GEN_ID(GEN_HISTORICS_NO,1);
    END
    ^
    SET TERM ; ^
    Voilà le créate de la table et tous ces trucs rattachés à elle

    Merci Barbibulle

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Il ne me falait que le create table... mais j'ai oublié de te demander de me donner les domaines. Car hélas on ne peux utiliser les domaines dans les procédures stockées...

    Domaines :
    D_LCLE,
    D_LCLE,
    D_SCLE

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Oky Barbibulle voici les code des domaines

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE DOMAIN D_LCLE AS INTEGER NOT NULL
    CREATE DOMAIN D_SCLE AS SMALLINT NOT NULL
    Merci

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Voici à quoi pourrait ressembler la procédure...
    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
     
    SET TERM !!;
    CREATE PROCEDURE T_HISTORICS_S 
    RETURNS ( HS_DT DATE, HS_NO INTEGER, HS_TM TIME, HS_DS_NO INTEGER, HS_US_NO SMALLINT)
    AS
    DECLARE VARIABLE NBR_LIGNE INTEGER;
    BEGIN
      NBR_LIGNE = 100;
      FOR SELECT HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO
          FROM T_HISTORICS
          ORDER BY HS_NO desc
          INTO :HS_DT, :HS_NO, :HS_TM, :HS_DS_NO, :HS_US_NO
      DO
      BEGIN
        NBR_LIGNE = NBR_LIGNE-1;    
        SUSPEND;
        if (NBR_LIGNE = 0) then
          EXIT;
      END
    END!!
    SET TERM ;!!
    Pour l'utiliser c'est comme si tu avais une table T_HISTORICS_S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO FROM T_HISTORICS_S;
    Je te conseille peut etre de mettre un index descendant sur HS_NO. Si c'est bien les derniers enregistrement que tu veux. Si c'est par rapport à HS_DT que te les veux alors l'index descendant doit etre sur HS_DT et dans la procédure stockée tu changes également l'order by par HS_DT DESC.

  9. #9
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par Barbibulle
    Voici à quoi pourrait ressembler la procédure...
    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
     
    SET TERM !!;
    CREATE PROCEDURE T_HISTORICS_S 
    RETURNS ( HS_DT DATE, HS_NO INTEGER, HS_TM TIME, HS_DS_NO INTEGER, HS_US_NO SMALLINT)
    AS
    DECLARE VARIABLE NBR_LIGNE INTEGER;
    BEGIN
      NBR_LIGNE = 100;
      FOR SELECT HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO
          FROM T_HISTORICS
          ORDER BY HS_NO desc
          INTO :HS_DT, :HS_NO, :HS_TM, :HS_DS_NO, :HS_US_NO
      DO
      BEGIN
        NBR_LIGNE = NBR_LIGNE-1;    
        SUSPEND;
        if (NBR_LIGNE = 0) then
          EXIT;
      END
    END!!
    SET TERM ;!!
    Merci du fond du coeur Barbibulle, j'ai encore 2 questions :
    1° Est ce que je peux mettre NBR_LIGNE en paramètre ?

    Pour l'utiliser c'est comme si tu avais une table T_HISTORICS_S :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO FROM T_HISTORICS_S;
    Je te conseille peut etre de mettre un index descendant sur HS_NO. Si c'est bien les derniers enregistrement que tu veux. Si c'est par rapport à HS_DT que te les veux alors l'index descendant doit etre sur HS_DT et dans la procédure stockée tu changes également l'order by par HS_DT DESC.
    2° comment utiliser ce procedure sous Delphi maintenant.
    J'ai l'habitude de travailler avec des Procedure qui me renvoi qu'une seule valeur mais pas plusieurs
    Comme tu l'a remarqué, je voulais avoir les resultats de ce procedure et le mettre dans un Memo pour consultation d'historique

    Merci encore[/quote]

  10. #10
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Andry
    Merci du fond du coeur Barbibulle, j'ai encore 2 questions :
    1° Est ce que je peux mettre NBR_LIGNE en paramètre ?
    oui bien sur :
    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
     
    SET TERM !!;
    CREATE PROCEDURE T_HISTORICS_S (NBR_LIGNE INTEGER)
    RETURNS (
        HS_DT DATE,
        HS_NO INTEGER,
        HS_TM TIME,
        HS_DS_NO INTEGER,
        HS_US_NO SMALLINT)
    AS
    BEGIN
      FOR SELECT HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO
          FROM T_HISTORICS
          ORDER BY HS_NO desc
          INTO :HS_DT, :HS_NO, :HS_TM, :HS_DS_NO, :HS_US_NO
      DO
      BEGIN
        NBR_LIGNE = NBR_LIGNE-1;
        SUSPEND;
        if (NBR_LIGNE = 0) then
          EXIT;
      END
    END!!
    SET TERM ;!!
    Citation Envoyé par Andry
    2° comment utiliser ce procedure sous Delphi maintenant.
    J'ai l'habitude de travailler avec des Procedure qui me renvoi qu'une seule valeur mais pas plusieurs
    Comme tu l'a remarqué, je voulais avoir les resultats de ce procedure et le mettre dans un Memo pour consultation d'historique
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO FROM T_HISTORICS_S(100);
    et si tu veux toutes les valeurs de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO FROM T_HISTORICS_S(null);
    Dans Delphi :
    mettre l'ordre suivant dans un TIBDataSet ou TIBQuery ou TIBSQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select HS_DT, HS_NO, HS_TM, HS_DS_NO, HS_US_NO FROM T_HISTORICS_S(:NBR);
    puis initaliser le parametre :NBR comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IBxxxx.Close;
    IBxxxx.ParamByName('NBR').AsInteger := 100;
    IBxxxx.Open;
    Tu peux également utiliser le TIBStoredProc dans ce cas tu n'as pas besoin de donner un ordre SQL mais juste le nom de la procédure stockée et de renseigner le paramètre de la même manière.

    Pour ce qui est de l'exploitation du résultat je te suggère de regarder dans l'aide en ligne ou les bouquins de Delphi. et si tu n'y arrives pas vas poser tes questions dans le forum Delphi Sgbd qui est plus adapté.

    Pour te mettre sur la piste : une fois que ta requete est lancée (ou procédure stockée exécutée) tu vas devoir boucler tant qu'il y a des lignes (test sur IBxxxx.EOF et lire les valeurs des colonnes dans ta boucle avec IBxxxx.Fields[0] par exemple oubien avec FieldByName('HS_DT').AsString qui te convertira le tout en string... tu concatènes tes colonnes et ajoute le résultat à ton mémo. Et ne pas oublier de mettre dans ta boucle IBxxxx.next pour lire l'enregistrement suivant...

    Voilà de quoi t'exercer...

  11. #11
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Merci Barbibulles
    Pour l'aajout dans le memo, il n'y a pas de problème. C'etais la manière d'utiliser la procedure stocké de la BDD qui m'avait posé de problème.

    Encore merci

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

Discussions similaires

  1. Export/Import des derniers enregistrements d'une table
    Par essayeencore dans le forum Développement
    Réponses: 2
    Dernier message: 04/03/2010, 11h33
  2. Liste des 50 dernier enregistrement d'une table
    Par nicolash94 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/06/2007, 15h09
  3. Réponses: 4
    Dernier message: 16/03/2004, 14h16
  4. Récupérer dernier enregistrement d'une table?
    Par Invité dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 19/01/2004, 11h38
  5. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 14h54

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