rédation d'un SQL bien dur

rédation d'un SQL bien dur - VB/VBA/VBS - Programmation

Marsh Posté le 28-08-2007 à 15:12:42    

voila, j'aurai besoin d'écrire proprement ce code SQL sous VBA, et je n'y arrive pas... si vous pouvez m'aider, ce serai bien simpa!
 
SQL = "SELECT [Tbl_E2_Installation_Appareil].[ModèleInstall], [Tbl_E2_Installation_Appareil].[NumSerieInstall], [Tbl_F2_CQ_NivB].[EcheanceControle],[Tbl_F2_CQ_NivB].[DateRDV1], [Tbl_F2_CQ_NivB].[DateRédaction], [Tbl_A1_EPM].[NomEPM], [Tbl_A1_EPM].[NumEPM] "
SQL = SQL & "FROM [Tbl_A1_EPM] INNER JOIN [Tbl_B_Hopital] ON [Tbl_A1_EPM].[NumEPM] = [Tbl_B_Hopital].[NumEPM] "
SQL = SQL & "INNER JOIN [Tbl_C2_Service] ON ([Tbl_B_Hopital].[NumHopital] = [Tbl_C2_Service].[NumHopital] "
MsgBox SQL
SQL = SQL & "INNER JOIN [Tbl_D2_Salle] ON [Tbl_C2_Service].[NumService] = [Tbl_D2_Salle].[NumService] "
SQL = SQL & "INNER JOIN [Tbl_E2_Installation_Appareil] ON [Tbl_D2_Salle].[NumSalle] = [Tbl_E2_Installation_Appareil].[NumSalle] "
SQL = SQL & "INNER JOIN [Tbl_F2_CQ_NivB] ON [Tbl_E2_Installation_Appareil].[NumInstallation] = [Tbl_F2_CQ_NivB].[NumInstallation] "
SQL = SQL & "WHERE [Tbl_A1_EPM].[NomEPM] = Lst_EPM.Value"
Form_Tbl_F2_CQ_NivB.RecordSource = SQL
 
l'erreur qui apparait est "opérateur absent"  :(  
 
merci d'avance!

Reply

Marsh Posté le 28-08-2007 à 15:12:42   

Reply

Marsh Posté le 28-08-2007 à 16:59:04    

Une parenthèse a été ouverte
 
  ... ON ([Tbl_B_Hopital]....
 
mais n'a pas été refermée.

Reply

Marsh Posté le 28-08-2007 à 17:05:23    

en effet oui... merci!
je vais essayer

Reply

Marsh Posté le 28-08-2007 à 17:05:47    

pitaing !
 
effectivement le coup de la parenthèse ça devrait aider pas mal :)
 
par contre, déjà, trois trucs :
1/ sors le SQL de ton code VB, ça sera bien plus lisible
2/ vite les [ ] qui sont absolument inutiles ici
3/ je suis sur qu'en simplifiant le nom des tables/champs (genre notation hongroise) ça ira vachement mieux pour améliorer la lisibilié*
 
* mais bon, c'est vrai que si t'as déjà une application à moitié écrite c'est plus chaud à faire...


Message édité par MagicBuzz le 28-08-2007 à 17:06:01
Reply

Marsh Posté le 28-08-2007 à 17:07:24    

je viens de l'enlever, mais il ne se passe rien de plus qu'avant... opérateur absent...

Reply

Marsh Posté le 28-08-2007 à 17:14:21    

l'appli est écrite a 85% et je la met en route jeudi avant depart en vacances...
 
c'est cho... en fait c'est pour mettre a jour un sous formulaire qui liste tous les appareils en fonction de l' "EPM". et le sql, sorti de VB, est dejà écrit dans une requete, et marche très bien.  
c'est en fait un formulaire de recherche: en fonction de la valeur choisie dans une zone de liste, le sous formulaire suivant se met a jour automatiquement et prend en compte la valeur selectionnée plus haut. mais les liens entre ce que j'affiche et ce qui m'interesse sont indirects, et passent par 5tables différentes. d'ou le mic mac en VB...
 

Reply

Marsh Posté le 28-08-2007 à 17:27:44    

aucune idée de ce qui provoque ton problème.
 
le seul truc qui m'étonne, c'est que tu envoies directement une requête SQL à RecordSource, mais je ne connais pas du tout VBA...

Reply

Marsh Posté le 28-08-2007 à 17:48:52    

et moi non plus! j'ai tenté une interpretation de ce que je faisais en mettant a jours deux listbox, l'une en fonction de l'autre... et ca donne ca.  

Reply

Marsh Posté le 28-08-2007 à 22:01:34    

petite idée pour aider :
fais un debug.print avant de mettre ton recordsource,
et vérifie que si tu effectues cette requete dns une requete bidon access ca pointe sur une erreur ou non...

Reply

Marsh Posté le 29-08-2007 à 09:28:53    

"WHERE [Tbl_A1_EPM].[NomEPM] = Lst_EPM.Value"

Ta clause WHERE me semble poser problème.
Il faut sortir « Lst_EPM.Value » des guillemets en faisant une concaténation :

"WHERE [Tbl_A1_EPM].[NomEPM] = " & Lst_EPM.Value

Si le contenu est du String il faut aussi ajouter des quotes entourant cette valeur

"WHERE [Tbl_A1_EPM].[NomEPM] = '" & Lst_EPM.Value & "'"

Reply

Marsh Posté le 29-08-2007 à 09:28:53   

Reply

Marsh Posté le 29-08-2007 à 09:40:56    

J'ai buté sur ce point aussi. Mais vu que c'est du VBA j'étais sûr de rien ^^

Reply

Marsh Posté le 29-08-2007 à 09:43:20    

d'accord merci tout le monde... je teste tout ce qui a été proposé et je vous redit de suite...

Reply

Marsh Posté le 29-08-2007 à 09:46:46    

jp, j'ai pas tout suivi a propos de faire une requete bidon, comment je fais ca?
 
voici ce que j'ai fait:
 
Le CODE:
 
SQL = "SELECT [Tbl_E2_Installation_Appareil].[ModèleInstall], [Tbl_E2_Installation_Appareil].[NumSerieInstall], [Tbl_F2_CQ_NivB].[EcheanceControle],[Tbl_F2_CQ_NivB].[DateRDV1], [Tbl_F2_CQ_NivB].[DateRédaction], [Tbl_A1_EPM].[NomEPM], [Tbl_A1_EPM].[NumEPM] "
SQL = SQL & "FROM [Tbl_A1_EPM] INNER JOIN [Tbl_B_Hopital] ON [Tbl_A1_EPM].[NumEPM] = [Tbl_B_Hopital].[NumEPM] "
SQL = SQL & "INNER JOIN [Tbl_C2_Service] ON [Tbl_B_Hopital].[NumHopital] = [Tbl_C2_Service].[NumHopital] "
SQL = SQL & "INNER JOIN [Tbl_D2_Salle] ON [Tbl_C2_Service].[NumService] = [Tbl_D2_Salle].[NumService] "
SQL = SQL & "INNER JOIN [Tbl_E2_Installation_Appareil] ON [Tbl_D2_Salle].[NumSalle] = [Tbl_E2_Installation_Appareil].[NumSalle] "
SQL = SQL & "INNER JOIN [Tbl_F2_CQ_NivB] ON [Tbl_E2_Installation_Appareil].[NumInstallation] = [Tbl_F2_CQ_NivB].[NumInstallation] "
SQL = SQL & "WHERE [Tbl_A1_EPM].[NumEPM] = '" & Me.Lst_EPM.Value & "'"
 
Debug.Print SQL
 
Form_Tbl_F2_CQ_NivB.RecordSource = SQL
 
 
 
Le DEBUG.PRINT:
 
SELECT [Tbl_E2_Installation_Appareil].[ModèleInstall], [Tbl_E2_Installation_Appareil].[NumSerieInstall], [Tbl_F2_CQ_NivB].[EcheanceControle],[Tbl_F2_CQ_NivB].[DateRDV1], [Tbl_F2_CQ_NivB].[DateRédaction], [Tbl_A1_EPM].[NomEPM], [Tbl_A1_EPM].[NumEPM] FROM [Tbl_A1_EPM] INNER JOIN [Tbl_B_Hopital] ON [Tbl_A1_EPM].[NumEPM] = [Tbl_B_Hopital].[NumEPM] INNER JOIN [Tbl_C2_Service] ON [Tbl_B_Hopital].[NumHopital] = [Tbl_C2_Service].[NumHopital] INNER JOIN [Tbl_D2_Salle] ON [Tbl_C2_Service].[NumService] = [Tbl_D2_Salle].[NumService] INNER JOIN [Tbl_E2_Installation_Appareil] ON [Tbl_D2_Salle].[NumSalle] = [Tbl_E2_Installation_Appareil].[NumSalle] INNER JOIN [Tbl_F2_CQ_NivB] ON [Tbl_E2_Installation_Appareil].[NumInstallation] = [Tbl_F2_CQ_NivB].[NumInstallation] WHERE [Tbl_A1_EPM].[NumEPM] = '3'
 
 
 
j'ai toujours la meme erreur malgré tout:
 
Erreur d'execution 3075 Erreur de syntaxe (opérateur absent) dans L'expresion:  
'[Tbl_A1_EPM].[NumEPM] = [Tbl_B_Hopital].[NumEPM] INNER JOIN [Tbl_C2_Service] ON [Tbl_B_Hopital].[NumHopital] = [Tbl_C2_Service].[NumHopital] INNER JOIN [Tbl_D2_Salle] ON [Tbl_C2_Service].[NumService] = [Tbl_D2_Salle].[NumService] INNER JOIN [Tbl_E2_Instal'
 
voila....
 
mais il y a un truc bizare: la valeur retournée par Lst_EPM est un nombre... alors que ce devrait etre un nom. du coup il faut que je change de concaténation pour le rendre compatible a un format numérique...


Message édité par La poisse1 le 29-08-2007 à 09:56:55
Reply

Marsh Posté le 29-08-2007 à 09:58:44    

meme après avoir changé de format, j'ai toujours le meme message d'erreur...

Reply

Marsh Posté le 29-08-2007 à 10:50:32    

si tu as un chiffre pout numEPM il faut virer les quote.

Reply

Marsh Posté le 29-08-2007 à 10:54:00    

oui, c'est ce que j'ai fait, j'ai repris la deuxième ligne de tegu.  
mais l'errer est toujours la meme... dois-je remettre les parenthèses autour de tous les Inner join? les crochets je peux les garder ou pas?
 
 

Reply

Marsh Posté le 29-08-2007 à 16:40:41    

tu peux essayer le paréenthèsage à fond oui, mais sinon pour le test, mets la requete qui sort du debug.print dans access, dans 'requêtes' pour voir à quel endroit il pond l'erreur (endroit où le curseur de la souris se placera si la requete est foireuse)µ.
Tu vois de quoi je parle ?
 
JP

Reply

Marsh Posté le 29-08-2007 à 17:43:59    

a tenter en effet... personellement, vu que je dois donner la base demain matin et que j'ai demandé a séniorpapou, de ce meme forum, de l'aide, j'ai maintenant un truc qui marche... comment, j'ai pas tout saisi, mais ca marche... mais la route est encore longue avant que la base soit finie, donc je testerai cela plus tard, pour ma culture perso... merci a tous!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed