Requête SELECT entre une table et une requête existante

Résolu
BiankaBo Messages postés 68 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 24 septembre 2024 - 23 sept. 2024 à 21:43
BiankaBo Messages postés 68 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 24 septembre 2024 - 24 sept. 2024 à 15:33

Bonjour à vous!!
C'est encore moi!

J'ai besoin d'aide avec mon code SQL..

Je crois qu'il est impossible de faire une requête SELECT avec une jointure entre une table et un requête non?

Je vous mets en contexte, peut-être que je n'ai pas non plus la bonne façon de procéder..


J'ai donc deux tables attachées qui comportent chacune une clé primaire qui, en temps normal se correspondent, sauf que leur type de donnée les dissocie actuellement.

- La table 1 (dbo_GPM_N_FACT) contient le champ [EMPR] au format texte de 7 caractères

- La table 2 (dbo_GPM_E_ELE_DOSSIER) contient quant à elle le champ [FICHE] au format numérique donc le nombre de caractère varie entre 1 et 7.

Voici un exemple des correspondance possibles:

[EMPR]  =>     [FICHE]

0001234 =>      1234

0078956 =>     78956

2145687 => 2145687

Vous comprendrez donc que je ne suis pas capable d'établir une relation entre les deux étant donné que leur type de donnée n'est pas le même et que je ne peux pas changer le type des données contenues dans une table attachée (à moins que je me trompe?).

Après réflexion, j'ai créé la requête A (07-01_GPI_SOLDE_ANN_DEM_RECH) à partir de la table 1 et j'ai inséré une colonne calculée EMPR2 : [EMPR]+0, ce qui transpose mes données de format texte vers le format numérique et qui retire donc les zéros au début des données. Maintenant [EMPR2] correspond donc parfaitement à [FICHE]. Si je crée manuellement une seconde requête, soit la requête B, pour joindre ma requête A à ma table 2 en insérant une relation entre les colonnes correspondantes, ça me donne exactement ce dont j'ai besoin! Yeah!

Par contre, ce n'est jamais aussi simple.

Plutôt que de créer me requête B manuellement, je dois l'écrire en SQL et c'est ici que ça ne fonctionne plus. Je croyais que d'utiliser simplement le code SQL de ma requête en l'adaptant au code vba ça fonctionnerait, mais j'ai l'impression que je ne peux pas faire une requête SELECT à partir d'une requête existante, est-ce vrai?

Voici mon code SQL diffonctionnel à partir de ma requête existante A (07-01_GPI_SOLDE_ANN_DEM_RECH) et de ma table 2 (dbo_GPM_E_ELE_DOSSIER):

Dim base As DAO.Database
Dim enr As DAO.Recordset
Dim SqlD As String

Set base = CurrentDb

SqlD = "SELECT [dbo_GPM_E_ELE_DOSSIER].[FICHE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[NOM], [dbo_GPM_E_ELE_DOSSIER].[PNOM], [07-01_GPI_SOLDE_ANN_DEM_RECH].[ANNEE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[SommeDeSOLDE]" & _
" FROM [dbo_GPM_E_ELE_DOSSIER] INNER JOIN [07-01_GPI_SOLDE_ANN_DEM_RECH] ON [dbo_GPM_E_ELE_DOSSIER].[FICHE] = [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR2]" & _
" WHERE ((([07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR]) " & strRechRef & ") AND (([dbo_GPM_E_ELE_DOSSIER].[NOM]) " & strRechNom & ") AND (([dbo_GPM_E_ELE_DOSSIER].[PNOM]) " & strRechPNom & "));"

Set enr = base.OpenRecordset(SqlD)

Erreur d'exécution 3061 - Trop peu de paramètres 2  attendus sur la ligne : Set enr = base.OpenRecordset(SqlD)

J'ai essayé de simplifier mon code pour trouver la provenance du problème en retirant ma condition WHERE, mais le résultat est le même. Ça me laisse donc croire que c'est la requête existante le problème.

Voici également le code de ma requête existante A si jamais vous avez besoin :

SELECT dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, Sum(dbo_GPM_N_FACT.SOLDE) AS SommeDeSOLDE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 AS EMPR2
FROM dbo_GPM_N_FACT
GROUP BY dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0
HAVING (((dbo_GPM_N_FACT.ECO)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) AND ((dbo_GPM_N_FACT.ANNEE)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) AND ((Sum(dbo_GPM_N_FACT.SOLDE))>0) AND ((dbo_GPM_N_FACT.STATUT_FACT)<>"X"));

Suis-je sur la bonne voie  ou existe-t-il une solution miraculeuse à tout ceci?

Merci beaucoup encore une fois!

3 réponses

yg_be Messages postés 23329 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 Ambassadeur 1 551
24 sept. 2024 à 12:53

bonjour,

A première vue, je dirais que tu retombes sur une limitation que tu as récemment rencontrée:

Tu ne peux pas utiliser en VBA une requête qui utilise des données d'un formulaire.

Je n'ai pas (encore) essayé de comprendre ta logique globale.  Je ne sais donc pas si tu es sur la bonne voie.

Supposant que tu es sur la bonne voie, tu peux continuer en remplaçant, dans ta requête B, 

INNER JOIN [07-01_GPI_SOLDE_ANN_DEM_RECH]

par

INNER JOIN 
(
SELECT dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, Sum(dbo_GPM_N_FACT.SOLDE) AS SommeDeSOLDE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 AS EMPR2
FROM dbo_GPM_N_FACT
GROUP BY dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0
HAVING (((dbo_GPM_N_FACT.ECO)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) AND ((dbo_GPM_N_FACT.ANNEE)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) AND ((Sum(dbo_GPM_N_FACT.SOLDE))>0) AND ((dbo_GPM_N_FACT.STATUT_FACT)<>"X"))
) AS [07-01_GPI_SOLDE_ANN_DEM_RECH]

Ce qui donne, je pense,

SqlD = "SELECT [dbo_GPM_E_ELE_DOSSIER].[FICHE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[NOM], [dbo_GPM_E_ELE_DOSSIER].[PNOM], [07-01_GPI_SOLDE_ANN_DEM_RECH].[ANNEE], [07-01_GPI_SOLDE_ANN_DEM_RECH].[SommeDeSOLDE]" & _
" FROM [dbo_GPM_E_ELE_DOSSIER] INNER JOIN " & _
" ( SELECT dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, Sum(dbo_GPM_N_FACT.SOLDE) AS SommeDeSOLDE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 AS EMPR2 " & _
" FROM dbo_GPM_N_FACT " & _
" GROUP BY dbo_GPM_N_FACT.ECO, dbo_GPM_N_FACT.EMPR, dbo_GPM_N_FACT.ANNEE, dbo_GPM_N_FACT.STATUT_FACT, [EMPR]+0 " & _
" HAVING (((dbo_GPM_N_FACT.ECO)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) " & _
" AND ((dbo_GPM_N_FACT.ANNEE)=[Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) " & _
" AND ((Sum(dbo_GPM_N_FACT.SOLDE))>0) AND ((dbo_GPM_N_FACT.STATUT_FACT)<>"X")) ) " & _
" as [07-01_GPI_SOLDE_ANN_DEM_RECH] ON [dbo_GPM_E_ELE_DOSSIER].[FICHE] = [07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR2]" & _
" WHERE ((([07-01_GPI_SOLDE_ANN_DEM_RECH].[EMPR]) " & strRechRef & ") AND (([dbo_GPM_E_ELE_DOSSIER].[NOM]) " & strRechNom & ") AND (([dbo_GPM_E_ELE_DOSSIER].[PNOM]) " & strRechPNom & "));"

Ensuite, tu dois utiliser la technique que tu connais bien pour "sortir" les deux utilisations du formulaire de la requête SQL, et les évaluer en VBA.

.

J'essaie de comprendre ce que tu veux réaliser, afin de voir si il n'est pas possible de faire tout cela plus simplement.

0
yg_be Messages postés 23329 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 Ambassadeur 1 551
Modifié le 24 sept. 2024 à 13:12

Je pense que tu peux très facilement faire une jointure entre les deux tables, sans toucher au contenu des tables:

SELECT bnkb_empr.EMPR, bnkb_fiche.FICHE
FROM bnkb_empr , bnkb_fiche
where [EMPR]+0=FICHE;

Cependant, je pense que cela ne va pas réellement t'aider, comme ton problème, c'est l'utilisation des champs du formulaire.

Peut-être cela va t'il t'aider à simplifier tes requêtes.

0
BiankaBo Messages postés 68 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 24 septembre 2024
24 sept. 2024 à 15:33

Ouiiiiiiiiiiiiii!!!! C'est exactement ce dont j'avais besoin!

Ça fonctionne à la perfection!

Tu es excellent!! Tu as parfaitement cerné ma demande!

Je savais qu'on pouvait faire ça plus simple et je savais également que je m'engageait dans un chemin connu que j'ai de la difficulté à comprendre, alors je suis extrêmement contente de ta réponse.

J'ai donc testé à petite échelle ta condition WHERE proposée ci-dessus et une fois que j'ai constaté que tout fonctionnait comme il le fallait, j'ai ajouté les autres colonnes avec leurs conditions. Ça s'est donc transformé en HAVING, mais c'est exactement la formule qui répond à mon besoin! Voici donc mon code SQL final:

SqlD = "SELECT [dbo_GPM_N_FACT].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[FICHE], [dbo_GPM_E_ELE_DOSSIER].[NOM], [dbo_GPM_E_ELE_DOSSIER].[PNOM], " & _
"[dbo_GPM_N_FACT].[ECO], [dbo_GPM_N_FACT].[ANNEE], Sum([dbo_GPM_N_FACT].[SOLDE]) AS [SommeDeSOLDE], [dbo_GPM_N_FACT].[STATUT_FACT]" & _
" FROM [dbo_GPM_N_FACT], [dbo_GPM_E_ELE_DOSSIER]" & _
" GROUP BY [dbo_GPM_N_FACT].[EMPR], [dbo_GPM_E_ELE_DOSSIER].[FICHE], [EMPR]+0, [dbo_GPM_E_ELE_DOSSIER].[NOM], " & _
"[dbo_GPM_E_ELE_DOSSIER].[PNOM], [dbo_GPM_N_FACT].[ECO], [dbo_GPM_N_FACT].[ANNEE], [dbo_GPM_N_FACT].[STATUT_FACT]" & _
" HAVING ((([dbo_GPM_N_FACT].[EMPR]) " & strRechRef & ") AND (([EMPR]+0)=[FICHE]) AND (([dbo_GPM_E_ELE_DOSSIER].[NOM]) " & strRechNom & ") " & _
"AND (([dbo_GPM_E_ELE_DOSSIER].[PNOM]) " & strRechPNom & " ) AND (([dbo_GPM_N_FACT].[ECO])='" + CStr([Forms]![03-B1_Ajout_Creance_GPI].[Texte33]) + "') AND (([dbo_GPM_N_FACT].[ANNEE])=" + CStr([Forms]![03-B1_Ajout_Creance_GPI].[Texte14]) + ") AND " & _
"((Sum([dbo_GPM_N_FACT].[SOLDE]))>0) AND (([dbo_GPM_N_FACT].[STATUT_FACT])<>'X'));"

Merci énormément pour ta rapidité et ton talent!

Bonne journée!

0