Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/07/2003, 17h29   #1
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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 :
1
2
 
SELECT HS_DT, HS_TM, HS_US_ID FROM T_HISTORICS
Merci
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2003, 17h41   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2003, 17h47   #3
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
J'avoue que j'ai pas assez de connaissance sur les procedures stocké.
Tu peux m'avancer un bout de code Barbibule.

merci
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2003, 18h45   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Donne moi le create table de ta table T_HISTORICS
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 07h53   #5
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Code :
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
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 09h16   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 11h34   #7
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Oky Barbibulle voici les code des domaines

Code :
1
2
3
 
CREATE DOMAIN D_LCLE AS INTEGER NOT NULL
CREATE DOMAIN D_SCLE AS SMALLINT NOT NULL
Merci
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 12h01   #8
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Voici à quoi pourrait ressembler la procédure...
Code :
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 :
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 12h29   #9
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Citation:
Envoyé par Barbibulle
Voici à quoi pourrait ressembler la procédure...
Code :
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 ?

Citation:
Pour l'utiliser c'est comme si tu avais une table T_HISTORICS_S :
Code :
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]
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 13h07   #10
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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 :
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 :
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 :
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 :
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 :
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...
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2003, 13h45   #11
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h15.


 
 
 
 
Partenaires

Hébergement Web