Requête SELECT entre une table et une requête existante
RésoluBiankaBo Messages postés 71 Date d'inscription Statut Membre Dernière intervention -
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!
- Quelle requête écrire pour demander au moteur de recherche de présenter de préférence les pages web traitant de tennis mais pas de tennis de table ?
- Impossible de supprimer une page word - Guide
- Table ascii - Guide
- Creation de site web - Guide
- Table de matière word - Guide
- Google moteur de recherche page d'accueil - Guide
3 réponses
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.
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.
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!