[WD16] Probleme OUTER JOIN
Le
Pascal F

Bonjour,
Avec les versions précédentes, j'utilisais des HExecuteRequeteSQL avec
des OUTER JOIN afin de récupérer les enregistrements meme si le fichier
relié ne comportait pas d'enregistrement et le résultat correspondait à
ce que j'attendais. Depuis le passage à la version 16, tout se passe
comme si les OUTER JOIN fonctionnaient comme les INNER JOIN, à savoir
si pas d'enregistrement correspondant dans le fichier relié, meme si un
enregistrement existe dans le fichier de base, aucun résultat n'est
retourné. exemple de requete ne fonctionnant plus:
// Création de la requete
cRequete="SELECT DISTINCT BILRES_005.IDBILRES_005 AS IDBILRES_005,"+
"BILRES_DETAIL.Montant_N AS Montant_N, "+
"BILRES_DETAIL.Montant_NMoins1 AS Montant_NMoins1, "+
"BILRES_DETAIL.IDVERSION_PREVISIONNEL AS IDVERSION_PREVISIONNEL,
"+
"BILRES_DETAIL.Montant_N_AMO AS Montant_N_AMO, "+
"BILRES_DETAIL.Montant_NMoins1_AMO AS Montant_NMoins1_AMO, "+
"BILRES_005.Designation AS Designation, "+
"BILRES_005.Code_Liasse_Brut AS Code_Liasse_Brut, "+
"BILRES_005.Formule_Liasse_Brut AS Formule_Liasse_Brut, "+
"BILRES_005.Code_liasse_Amo AS Code_liasse_Amo, "+
"BILRES_005.Formule_Liasse_Amo AS Formule_Liasse_Amo, "+
"BILRES_005.Formule_Liasse_Net AS Formule_Liasse_Net, "+
"BILRES_005.Type_Donnee AS Type_Donnee, "+
"BILRES_005.Est_Total AS Est_Total "+
"FROM BILRES_DETAIL RIGHT OUTER JOIN BILRES_005 ON
BILRES_005.IDBILRES_005=BILRES_DETAIL.IDBILRES_005 "+
"WHERE BILRES_005.Type_Donnee=1 AND
BILRES_DETAIL.IDVERSION_PREVISIONNEL="+IDVERSION_PREVI+" ORDER BY
IDBILRES_005"
// IDVERSION_PREVI est une variable globale à la fenetre qui contient
l'id de la version du prévisionnel sur laquelle on travaille
// Il faut l'initialiser avec la plus grande valeur de l'exercice sur
lequel on travaille, ou bien si on est dans le prévisionnel
// avec la version à partir de laquelle on veut repartir (les suivantes
étant supprimées lors de la validation du prévisionnel.
// Initialise la requête
SI PAS HExécuteRequêteSQL(ReqActifBilan,hRequêteDéfaut,cRequete) ALORS
Erreur ( "Erreur d' initialisation de la requête" + RC + HErreurInfo
())
RETOUR
FIN
Lors de la 1ère utilisation de la requete, le fichier BILRES_DETAIL est
vide. Le fichier BILRES_005 contient des enregistrements définissant
chaque ligne du BILAN ACTIF devant être affichée. les valeurs des
bilans N et N-1 seront stockées dans les enregistrements de
BILRES_DETAIL.
Mais comme plus d'enregistrements retournés par la requete, je ne peux
plus saisir :-@
Avez-vous le même comportement ou bien est-ce que je construit mal mes
requetes?
Merci.
--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre
Avec les versions précédentes, j'utilisais des HExecuteRequeteSQL avec
des OUTER JOIN afin de récupérer les enregistrements meme si le fichier
relié ne comportait pas d'enregistrement et le résultat correspondait à
ce que j'attendais. Depuis le passage à la version 16, tout se passe
comme si les OUTER JOIN fonctionnaient comme les INNER JOIN, à savoir
si pas d'enregistrement correspondant dans le fichier relié, meme si un
enregistrement existe dans le fichier de base, aucun résultat n'est
retourné. exemple de requete ne fonctionnant plus:
// Création de la requete
cRequete="SELECT DISTINCT BILRES_005.IDBILRES_005 AS IDBILRES_005,"+
"BILRES_DETAIL.Montant_N AS Montant_N, "+
"BILRES_DETAIL.Montant_NMoins1 AS Montant_NMoins1, "+
"BILRES_DETAIL.IDVERSION_PREVISIONNEL AS IDVERSION_PREVISIONNEL,
"+
"BILRES_DETAIL.Montant_N_AMO AS Montant_N_AMO, "+
"BILRES_DETAIL.Montant_NMoins1_AMO AS Montant_NMoins1_AMO, "+
"BILRES_005.Designation AS Designation, "+
"BILRES_005.Code_Liasse_Brut AS Code_Liasse_Brut, "+
"BILRES_005.Formule_Liasse_Brut AS Formule_Liasse_Brut, "+
"BILRES_005.Code_liasse_Amo AS Code_liasse_Amo, "+
"BILRES_005.Formule_Liasse_Amo AS Formule_Liasse_Amo, "+
"BILRES_005.Formule_Liasse_Net AS Formule_Liasse_Net, "+
"BILRES_005.Type_Donnee AS Type_Donnee, "+
"BILRES_005.Est_Total AS Est_Total "+
"FROM BILRES_DETAIL RIGHT OUTER JOIN BILRES_005 ON
BILRES_005.IDBILRES_005=BILRES_DETAIL.IDBILRES_005 "+
"WHERE BILRES_005.Type_Donnee=1 AND
BILRES_DETAIL.IDVERSION_PREVISIONNEL="+IDVERSION_PREVI+" ORDER BY
IDBILRES_005"
// IDVERSION_PREVI est une variable globale à la fenetre qui contient
l'id de la version du prévisionnel sur laquelle on travaille
// Il faut l'initialiser avec la plus grande valeur de l'exercice sur
lequel on travaille, ou bien si on est dans le prévisionnel
// avec la version à partir de laquelle on veut repartir (les suivantes
étant supprimées lors de la validation du prévisionnel.
// Initialise la requête
SI PAS HExécuteRequêteSQL(ReqActifBilan,hRequêteDéfaut,cRequete) ALORS
Erreur ( "Erreur d' initialisation de la requête" + RC + HErreurInfo
())
RETOUR
FIN
Lors de la 1ère utilisation de la requete, le fichier BILRES_DETAIL est
vide. Le fichier BILRES_005 contient des enregistrements définissant
chaque ligne du BILAN ACTIF devant être affichée. les valeurs des
bilans N et N-1 seront stockées dans les enregistrements de
BILRES_DETAIL.
Mais comme plus d'enregistrements retournés par la requete, je ne peux
plus saisir :-@
Avez-vous le même comportement ou bien est-ce que je construit mal mes
requetes?
Merci.
--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre
Il faut passer par une sous requete pour que cela fonctionne à nouveau.
/ Création de la requete
cRequete=[
SELECT DISTINCT BILRES_005.IDBILRES_005 AS IDBILRES_005,
BD.Montant_N AS Montant_N,
BD.Montant_NMoins1 AS Montant_NMoins1,
BD.IDVERSION_PREVISIONNEL AS IDVERSION_PREVISIONNEL,
BD.Montant_N_AMO AS Montant_N_AMO,
BD.Montant_NMoins1_AMO AS Montant_NMoins1_AMO,
BILRES_005.Designation AS Designation,
BILRES_005.Code_Liasse_Brut AS Code_Liasse_Brut,
BILRES_005.Formule_Liasse_Brut AS Formule_Liasse_Brut,
BILRES_005.Code_liasse_Amo AS Code_liasse_Amo,
BILRES_005.Formule_Liasse_Amo AS Formule_Liasse_Amo,
BILRES_005.Formule_Liasse_Net AS Formule_Liasse_Net,
BILRES_005.Type_Donnee AS Type_Donnee,
BILRES_005.Est_Total AS Est_Total
FROM BILRES_005 LEFT OUTER JOIN (SELECT
BILRES_DETAIL.Montant_N AS Montant_N,
BILRES_DETAIL.Montant_NMoins1 AS Montant_NMoins1,
BILRES_DETAIL.IDVERSION_PREVISIONNEL AS IDVERSION_PREVISIONNEL,
BILRES_DETAIL.Montant_N_AMO AS Montant_N_AMO,
BILRES_DETAIL.Montant_NMoins1_AMO AS Montant_NMoins1_AMO,
BILRES_DETAIL.IDBILRES_005
FROM BILRES_DETAIL WHERE BILRES_DETAIL.IDVERSION_PREVISIONNEL=%1
)BD ON BILRES_005.IDBILRES_005½.IDBILRES_005
WHERE BILRES_005.Type_Donnee=1
ORDER BY IDBILRES_005
]
// IDVERSION_PREVI est une variable globale à la fenetre qui contient
l'id de la version du prévisionnel sur laquelle on travaille
// Il faut l'initialiser avec la plus grande valeur de l'exercice sur
lequel on travaille, ou bien si on est dans le prévisionnel
// avec la version à partir de laquelle on veut repartir (les suivantes
étant supprimées lors de la validation du prévisionnel.
// Initialise la requête
SI PAS
HExécuteRequêteSQL(ReqActifBilan,hRequêteDéfaut,chaineconstruit(cRequete,IDVERSION_PREVI))
ALORS
Erreur ( "Erreur d' initialisation de la requête" + RC + HErreurInfo
())
RETOUR
FIN
--
Pascal
Ne garder que le prénom pour me joindre