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 10/06/2005, 09h46   #1
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Par défaut [D7][IB6] déclaration des UDF invisibles pour l'application

Bonjour,

Je reprends une application sous Delphi connectée à une base sous Interbase 6. J'ai modifié une requête SQL existante pour invoquer des UDF (DAYSBETWEEN, MAXDATE et MINDATE). Depuis cette modification, l'exécution de cette requête SQL plante le programme.

Je pense que l'erreur vient de la localisation des UDF ; pourtant je les ai déclarées sous IBExpert et j'ai exécuté cette même requête sous IBConsole & IBExpert et... ça passe sans souci !

Ce qui m'étonne d'autant plus, c'est que les autres requêtes SQL de l'application (qui s'exécutent parfaitement) utilisent d'autres UDF (que je vois de la même manière sous IBConsole).

Voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    SQL.ADD('SELECT SUM(cde_nbpers*DAYSBETWEEN( EXTRACTDATE(MAXDATE(:DateDu, EXTRACTDATE(cde_datarriv))), '+
            '                                   EXTRACTDATE(MINDATE(:DateAu+1, EXTRACTDATE(cde_datdepar))) )) nbPersMois '+
            'FROM entetes_resa er1 '+
            'WHERE EXISTS (SELECT ''+'' '+
            '            FROM entetes_resa er2 '+
            '            WHERE er2.cde_codresa=er1.cde_codresa '+
            '            AND er2.cde_noenreg=er1.cde_noenreg '+
            '            AND er2.cde_nochb=er1.cde_nochb '+
            '            AND EXTRACTDATE(er2.cde_datarriv) <= :DateAu '+
            '            AND EXTRACTDATE(er2.cde_datdepar) >= :DateDu+1 '+
            '            AND er2.cde_actif=''O'' '+
            '            AND er2.cde_arrive=''O'' '+
            '            AND er2.cde_noenreg<>'+IntToStr(GROUP_LEADER_NOENREG)+' '+
            '            GROUP BY er2.cde_codresa, er2.cde_nochb)');
    DecodeDate(DateMC, Annee, Mois, Jour);
    ParamByName('DateDu').AsDate := EncodeDate(Annee, Mois, 1);
    ParamByName('DateAu').AsDate := DateMC;
    Open;
    try
      Nb_Pers_Mois:=FieldByName('nbPersMois').AsInteger;
    except
      Nb_Pers_Mois:=0;
    end; // try
Merci d'avance pour vos remarques.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2005, 11h37   #2
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
L'erreur ne venait pas des UDF mais des paramètres d'entrées car dans la requête SQL :
Code :
'...EXTRACTDATE(MINDATE(:DateAu+1, EXTRACTDATE...'
est incorrect.
Par conséquent , voici le code qui fonctionne :
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
    SQL.ADD('SELECT SUM(cde_nbpers*DAYSBETWEEN( EXTRACTDATE(MAXDATE(:DateDu, EXTRACTDATE(cde_datarriv))), '+
            '                                   EXTRACTDATE(MINDATE(:DateAuLendemain, EXTRACTDATE(cde_datdepar))) )) nbPersMois '+
            'FROM entetes_resa er1 '+
            'WHERE EXISTS (SELECT ''+'' '+
            '            FROM entetes_resa er2 '+
            '            WHERE er2.cde_codresa=er1.cde_codresa '+
            '            AND er2.cde_noenreg=er1.cde_noenreg '+
            '            AND er2.cde_nochb=er1.cde_nochb '+
            '            AND EXTRACTDATE(er2.cde_datarriv)<=:DateAu '+
            '            AND EXTRACTDATE(er2.cde_datdepar)>=:DateDuLendemain '+
            '            AND er2.cde_actif=''O'' '+
            '            AND er2.cde_arrive=''O'' '+
            '            AND er2.cde_noenreg<>'+IntToStr(GROUP_LEADER_NOENREG)+' '+
            '            GROUP BY er2.cde_codresa, er2.cde_nochb)');
    DecodeDate(DateMC, Annee, Mois, Jour);
    ParamByName('DateDu').AsDate := EncodeDate(Annee, Mois, 1);
    ParamByName('DateDuLendemain').AsDate := EncodeDate(Annee, Mois, 2);
    ParamByName('DateAu').AsDate := DateMC;
    ParamByName('DateAuLendemain').AsDate := DateMC+1;
    Open;
    try
      Nb_Pers_Mois:=FieldByName('nbPersMois').AsInteger;
    except
      Nb_Pers_Mois:=0;
    end; // try
Magnus 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 08h13.


 
 
 
 
Partenaires

Hébergement Web