pb requête update Access avec equi-jointure de table

pb requête update Access avec equi-jointure de table - ASP - Programmation

Marsh Posté le 17-08-2006 à 10:55:38    

Bonjour,
 
Voilà mon problème je veux mettre à jour deux champs(mini) de deux tables différentes mais liées par un identifiant.
Le hic c'est que je renseigne mes deux champs de la requete sql avec deux variables et j'arrive pas a chopper la bonne syntaxe étant donné que je suis en asp avec une bdd Access et que je suis débutant en asp  :whistle:.
Voici mon code qui pose probleme
 

Code :
  1. <% @LANGUAGE="VBSCRIPT" %>
  2. <%
  3. vNum=Application("IdUnique" )
  4. var1=request.form("champ1" )
  5. var2=request.form("champ2" )
  6. %>
  7. <%
  8. Set OBJdbConnection = Server.CreateObject ("ADODB.Connection" )
  9. OBJdbConnection.Open "DSN=NomDeMaBDD;UID=;PWD=" 
  10. sql="UPDATE tab2, tab1 SET col2_prenom="&var1&", col1_nom="&var2&" WHERE tab2.col2_visa = "&vNum&" AND tab1.col1_cle = tab2.col2_cle"
  11. set req=OBJdbConnection.execute(sql)
  12. %>


J'ai afficher toutes mes variables et elles sont bien renseignées donc c'est vraiment au niveau de la requete que la syntaxe passe pas :( .
Donc j'ai un message d'erreur qui apparait me signalant que la =>" de "&var1&" dans la requete est prise comme une fin de requete :pfff:  et qu il comprend plus la suite j'ai tenté de remplacer par des ' mais ma variable n'est pas pris en compte. :sweat:  
Si quelqu'un à une idée de la syntaxe pour mes variables...merci d'avance
 :hello:


Message édité par rouanelion le 18-08-2006 à 11:35:55
Reply

Marsh Posté le 17-08-2006 à 10:55:38   

Reply

Marsh Posté le 17-08-2006 à 11:01:52    

\" ou \' autour des variables come ca :  
 
 
- tu mets des guillemets autour des valeurs de ta requete : normal c'est des string  
- Tu les échappes pour qu'il ne soit pas interprétés
 

Reply

Marsh Posté le 17-08-2006 à 11:05:12    

Donc je dois mettre par exemple:

Code :
  1. sql="UPDATE tab2, tab1 SET col2_prenom=\"&var1&\", col1_nom=\"&var2&\" WHERE tab2.col2_visa = "&vNum&" AND tab1.col1_cle = tab2.col2_cle"


 
Où je suis a coté de la plaque et je dois virer les &

Reply

Marsh Posté le 17-08-2006 à 11:08:20    

Citation :

sql="UPDATE tab2, tab1 SET col2_prenom=\""&var1&"\", col1_nom=\""&var2&"\" WHERE tab2.col2_visa = "&vNum&" AND tab1.col1_cle = tab2.col2_cle"

Reply

Marsh Posté le 17-08-2006 à 11:20:25    

Merci bien de ton aide, j'ai trouvé la syntaxe qui marche

Code :
  1. sql="UPDATE tab2, tab1, Elu SET col2_prenom='"&var1&"', col1_nom='"&var2&"' WHERE tab2.col2_visa = "&vNum&" AND tab1.col1_cle = tab2.col2_cle"


Sinon j'avais les \ dans l'enregistrement :-)
En revanche si je mets comme prenom => j'asper, le ' empeche de faire un update, y a t'il un moyen de parer se problème.
Encore merci de ton aide ^_^

Reply

Marsh Posté le 17-08-2006 à 11:32:27    

Essaie un traitement sur les paramètres ( suppresion des ' ou échappement )

Reply

Marsh Posté le 17-08-2006 à 11:33:33    

Re tout le monde,
 
En fait, j'ai quand même des problèmes avec cette requête, s'il y aucun caractère je ne peux pas faire l'update il faut au mini que je mette un espace et s'il y a une cote ' ça tue ma requete...le drame
Si quelqu un a une idée :)
 
Merci

Reply

Marsh Posté le 17-08-2006 à 14:39:16    

Re,
 
Bon j'ai fait un traitement de ma chaine de caractere

Code :
  1. <%
  2. for i=0 to 26
  3. response.Write("la valeur est :"&Tab(i)&"<br>" )
  4. CleanReplaceApos=replace(Tab(i),"'"," " ) //remplace les apostrophes par espace
  5. RemSpace=trim(CleanReplaceApos) //Supprime les espaces avant et apres ma chaine de caracteres
  6. longueur=len(RemSpace) //renvoie la taille de ma chaine de caracteres
  7. response.Write("la longueur est :"&longueur&"<br>" ) //affiche la taille
  8. response.Write("la phrase est :"&RemSpace&"<br>" ) //affiche le resultat apres le traitement
  9. next
  10. %>


Me reste plus que le probleme de la mise a jour quand la longueur est à 0 car ça fait planter ma requete donc si quelqu un a une idée car je vois pas comment faire sans faire un travail de porc genre si longueur=0 alors RemSpace=" "...autant dire vaudrait mieux éviter ^^


Message édité par rouanelion le 17-08-2006 à 14:39:58
Reply

Marsh Posté le 17-08-2006 à 15:21:32    

Voilà le message d'erreur que j'obtiens
 
Microsoft OLE DB Provider for ODBC Drivers erreur '80004005'  
 
[Microsoft][Pilote ODBC Microsoft Access] Le champ 'tab1.col1_bp' ne peut pas être une chaîne vide.  
 
/home/asp_test/boucle.asp, ligne 56  
 
Si ça fait penser à quelque chose a quelqu un je le remercie d'avance car là je bloque


Message édité par rouanelion le 17-08-2006 à 15:22:02
Reply

Marsh Posté le 17-08-2006 à 15:26:16    

Ca plante si var1 ou var2 sont vides ? Bizarre.
 
A part mettre un contrôle sur le formulaire pour empêcher les champs vides, je crois que tu n'échapperas pas à ta solution "à la main".

Reply

Marsh Posté le 17-08-2006 à 15:26:16   

Reply

Marsh Posté le 17-08-2006 à 15:26:34    

Ben on dirait que que col1_bp n'est pas renseigné dans ta requete donc ...

Reply

Marsh Posté le 17-08-2006 à 15:35:14    

En faite ce qui se passe c'est que je fais un formulaire pour modifier des données existantes que je met par defaut dans les champ de mon formulaire donc si un champ n'est pas remplie et que j'y touche pas quand j'envoie ma requete la variable par defaut est vide...donc j'aimerai la laissé vide donc col1_bp est renseigné par une variable qui n'a rien...donc c'est un peu foireux peut-être comme systeme?

Reply

Marsh Posté le 17-08-2006 à 15:39:54    

J'ai une solution de contournement mais qui me plait pas car c'est pas propre, je la donne quand meme des fois que des gens ont le meme problème et veule avancer

Code :
  1. if len(RemSpace)=0 then // si la taille de la chaine de caracteres=0 alors je met un espace
  2. response.Write("champ vide" ) //permet juste de savoir quand je passe dans le if
  3. RemSpace=" " //je met mon espace donc il sera plus vide et ma requete passera
  4. end if


autant dire que ça marche mais j'en veux pas car c'est vraiment pas propre ;-)

Reply

Marsh Posté le 17-08-2006 à 15:40:00    

Ben le truc c'est que col1_bp est NULL dans la base , mais toi tu veux y inserer "" qui est différent de NULL  
 
Donne voir la requete complète ?

Reply

Marsh Posté le 17-08-2006 à 15:45:23    

Voilà la requete avec col1_bp=variable 4 du tableau dont voici l'initialisation
Tab(4)=request.form("sCol1Bp" )

Code :
  1. sql="UPDATE tab2, tab1 SET col2_siege='"&Tab(1)&"', col1_nom='"&Tab(2)&"', col1_adr1='"&Tab(3)&"', col1_bp='"&Tab(4)&"' WHERE tab2.col2_visa = "&vNum&" AND tab1.col1_cle = tab2.col2_cle

Reply

Marsh Posté le 17-08-2006 à 15:47:21    

Tiens dans mon formulaire voilà comment je recupere le champ

Code :
  1. <input name="sCol1Bp" type="text" size="30" value="<%=req("col1_bp" )%>">


En tout cas merci pour ton aide jbourdellon je te gonfle avec ça depuis un moment ^_^ sympa d'être patient


Message édité par rouanelion le 17-08-2006 à 15:50:26
Reply

Marsh Posté le 17-08-2006 à 15:51:39    

ben comme tout à l'heure traitement sur sCol1Bp avec je sais pas une requete que tu generes au fur et à mesure que tu traites les variables et surtout qu'elles existent  
PSEUDO CODE
 
if (exist(VarA)){
requete = "update ... SET varA = "&varA;
}
if (exist(varB)){
requete = requete & AND varB = "&varB ;
}
 
....

Reply

Marsh Posté le 17-08-2006 à 15:54:52    

ok donc tu préconises une requête par champ à update dans le cas où c'est pas vide c'est bien ça?

Reply

Marsh Posté le 17-08-2006 à 16:06:45    

non par une requete par champ mais une seule requete "variable"  
donc une seule string requete  
 
et pis pour chaque variable présente tu ajoutes le bout de code qui va bien à la requete pour mettre a jour  
 
Etape 1 :  
Requete " UDPATE .... SET"
Etape 2 :  
Requete " UDPATE .... SET varA = 'ABC'"
Etape 2 :  
Requete " UDPATE .... SET varA = 'ABC' AND varC = 'DEF'"
 
...
 

Reply

Marsh Posté le 17-08-2006 à 16:29:53    

ok ça marche merci bien je vais me pencher dessus

Reply

Sujets relatifs:

Leave a Replay

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