Probleme pour updater un champ

Signaler
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006
-
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006
-
Bonjour,

voila je suis en stage et je dois concevoir une base de donnees
je suis debutant en vba et j'ai deja fait plusieurs recherche
sur ce site pour repondre a ma question, mais je n'ai pas trouve
le site etant tres vaste.

alors voila le probleme:
j'ai deux tables:
[books]
b_id_books      b_name      b_count
1                         ortho2         45
2                         dico1           52

[supports]
s_id_supports         s_id_ci_customer         s_b_id_books      s_b_count
1                                 32                              1                     (lieu du probleme)

le but du jeu est de transferer la valeur 45 de la table "books" vers le champ
s_b_count de la table "supports"

pour cela j'utilise un recorset:

Private Sub ModifiableBooks_BeforeUpdate(Cancel As Integer)
      
    Dim rs As ADODB.Recordset, A As Integer    Set rs CurrentProject.Connection.Execute("select* from Books where b_id_books 0" & s_b_id_books)
   j'utilise cette astuce pour aller chercher la bonne ligne dans la table "books"
  
    If rs.EOF Then
        Me.supportscount.Caption = "probleme prix inexistant"
    Else
        A = ((rs.Fields("b_count")) * (Me.qtybooksetiquette))        CurrentProject.Execute "update supports set s_b_count A where s_id_supports Me.etiquette50"
       le probleme ce situe a ce niveau avec cette requette, j'ai chercher longtemps
       et la j'ai pu d'idee !! je souhaite que cette requete update le s_b_count par la valeur contenu dans la table
       books
    End If

End Sub

j'espere aoir ete assez claire dans ma question !!
merci beaucoup si quelqu'un peu m'aider

17 réponses

Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonjour,


J' avoue que je n' ai pas compris pourquoi :  = 0 & s_b_id_books !!!


Quoi qu' il en soit ,


Est-ce que tu es sûr déjà que
Set rs = CurrentProject.Connection.Execute("select* from Books where
b_id_books = 0" & s_b_id_books)
te renvoie quelque chose ?
Parce que :


> si s_b_id_books est une variable alors elle n' est définie nulle part
avant cette ligne .


> s' il s' agit du champ s_b_id_books de la table Supports il fallait mettre :
Set rs = CurrentProject.Connection.Execute("select* from Books where
Books.b_id_books = 0" & Supports.s_b_id_books )


non ?


Quand au UPDATE
Qu' est ce que c' est Me.etiquette50 ?
Une chaine sûrement ! correspondant à un label dans ton formulaire.
Que fait elle à l' intérieure de la requête ?
En plus si s_id_supports
 -est un Entier Long il faudra la remplacer par Clng(Me.etiquette50)
 -est un Entier il faudra la remplacer par Clnt(Me.etiquette50)


Essaies donc ceci :CurrentProject.Execute "update supports set s_b_count A where s_id_supports" & _
Clng( Me.etiquette50).




Corriges moi si je me trompe .


CHAIBAT


 














 
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

merci pour ta réponse

en ce qui concerne cette requete:
"Set rs = CurrentProject.Connection.Execute("select* from Books where
b_id_books = 0" & s_b_id_books)
te renvoie quelque chose ?"

en effet elle me renvoie:
vraie si le numero de la clé primaire du champs b_id_books correspond a la valeur
contenue dans le champ s_b_id_books! j'utilise cette commande pour verifier si l'utilisateur
existe

faux si il n'existe pas.

"si s_b_id_books est une variable alors elle n' est définie nulle part
avant cette ligne ."

s_b_id_books n'est pas une variable c'est un champ dans une table
dans ce cas c'est la clé primaire de la table "books"

je vais tester ton conseil:
s' il s' agit du champ s_b_id_books de la table Supports il fallait mettre :
Set rs = CurrentProject.Connection.Execute("select* from Books where
Books.b_id_books = 0" & Supports.s_b_id_books )

Quand au UPDATE
Qu' est ce que c' est Me.etiquette50 ?
oui en effet c'est une etiquette qui prend la valeur de la clé primaire
de la table supports et je lui est defini aucun format!!
je savais pas qu'il fallait faire ça
je t'avouerais que je joue a l'apprenti sorcier
sur ce coup là
je suis aux etats unis, je ne trouve aucune litterature en français sur access
j'ai debarqué là sans meme savoir sur quelle sujet allait traiter mon stage
donc voila

merci ton aide
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonjour / Bonsoir
Avec le décalage horaire ....!
Il faut dire que tu es au bout du monde, cher ami .

N' oubli pas de nous tenir au courant, (sur la même page)

amicalement

CHAIBAT05
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

bonjour,

et bien j'ai teste
avec cette ligne:CurrentProject.Execute "update supports set s_b_count A where s_id_supports" & _
Clng( Me.etiquette50)
ca plante et ca me met  " no value given for one or more required parameters"

sinon si j'ai essaye:CurrentProject.Connection.Execute "update supports set s_b_count " & A & " where s_id_supports " & Me.Texte35
ca repond bien a mon utilisation aucun pb
le seul truc c que la ligne au moment ou je veux l'updater, elle
n'existe pas et donc il ne ce passe rien.
je ne sais pas comment resourdre ce probleme, j'aimerais bien creer un bouton qui valide lenregistremen mais je ne sais pas comment faire !!
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonsoir,

^^ 1) Est ce que tu as vérifié que la valeur de ton Text correspond à une valeur de s_id_supports dans ta table. Fais le avant pour être sûr que cette valeur existe
bel et bien.

^^ 2) Jusqu' à présent tu ne m' as pas dit de quel Type est s_id_supports

^^ 3) Je ne sais pas pourquoi, mais quelque fois il faut mettre à jour
la clé (dans ton cas) par sa propre valeur

^^ 4) Ajoute  une apostrophe de chaque coté des quotes.
     si s_id_supports est de Type String.

^^ 5) Ajoute un Point virgule à la fin de ta requête.

En résumé
> si s_id_supports est un Entier ; essaies avec ça"update SUPPORTS set SUPPORTS.s_id_supports [SUPPORTS]![s_id_supports], SUPPORTS.s_b_count " & A &
" where [SUPPORTS]![s_id_supports]=" & CLng(Texte35.Text & ";"

> si s_id_supports est une chaine de caractère ;essaies avec ça"update SUPPORTS set SUPPORTS.s_id_supports [SUPPORTS]![s_id_supports], SUPPORTS.s_b_count " & A &
" where [SUPPORTS]![s_id_supports] like '" & Texte35.Text & "';"

Crois moi, je fais ce que je peux pour répondre à ton problème, en te donnant
les grandes ligne, car il m' est difficile de tout savoir en détail , comme ça ,de loin.
En plus c' est  ta propre logique et ton propre raisonnement.
Ce n' est pas comme si j' avais toutes les données devant moi. 

A+

CHAIBAT
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

ah oui c sur je te comprends mais c'est vraiment sympas d'essayer
je crois qu'il n'y a rien de pire que d'essayer de comprendre un programme
que l'on a pas fait lol

pour te repondre:
s_id_supports est une clé primaire donc du type entier, vu que c'est un chiffre
désolé pour le manque d'infos, mais quand on est dedans on voit pas forcement
tous les details qui sont tres importants !!

un prof m'avait conseillé de  mettre toujours _id_  pour reconnaitre tous de suite
si c'est une clé primaire ou pas

j'ai testé ton code et ça me met:
impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé.

sinon j'ai trouvé ça et ça marche mais ça ne doit pas etre du code vba correct je pense ;)CurrentProject.Connection.Execute "update supports set s_b_count " & A & " where s_id_supports " & Me.Texte35
je precise que la valeur "A" est issue d'un tableau qui contient des entiers
je sais pas si ça peut t'aider, moi perso je suis un peu perdu
avec les & " ' lol
alors jen met partout et je test pour voir si ça marche
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Salut,
Tu as raison de tout essayer.C' est comme ça qu' on apprend.
Ma devise à ce sujet est:
"Plus tu fais des erreurs , moins tu en feras à l' avenir !".

Pour ce qui est de ton problème, on va tenter une chose plus simple.
Elle consiste:
> Ouvrir ta table Supports
> Rechercher la valeur de s_id_supports _
>Si ce s_id_supports  existe
>Tu mets à  jour s_b_count .

Voici les grandes lignes du code :
 1°/ "Rs" est un recordset lié à ma table Supports
 2°/  'Précaution à prendre:
        si tu execute ton code en dehors de ton Form, Me.Text36 n' est pas
        accessible .Tu dois utiliser une variable à la place .
        
         tu cherches ensuite ta valeur
         Rs.FindFirst "[s_id_supports ]=" & Clng(Me.Text36) 
                                                                   'si s_id_supports n' est pas un Entier Long
                                                        'tu utilises  Clnt(Me.Text36)
         If Rs.NoMatch Then   
                MsgBox "Valeur non trouvée"
                Exit Sub
         Else           
.              Rs.Edit
               Rs![s_b_count]=A
               Rs.Update
         End Sub

 Je pense que ça ira comme ça si l' utilisation d' une requête n' est imposée.

      Si ça marches pas je t' expliquerai le pourquoi du :
     "...impossible de faire référence à une propriété ou de la définir pour un contrôle si     ce dernier n'est pas activé."
       On corrigera alors l' erreur.
       Commençons d' abord par le plus simple

Tiens nous au courant du résultat.

 chaibat

 Ps:  moi aussi j' utilise ce truc de "Id".

 .
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

En effet ça fonctionne !!
merci beaucoup ;)

mais bon c'est un peut volumineux niveau code

je veux bien que tu m'explique le:
Si ça marches pas je t' expliquerai le pourquoi du :
     "...impossible de faire référence à une propriété ou de la définir pour un contrôle si     ce dernier n'est pas activé."

goku95
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonsoir,
Du moment que ça marche, il ne faut pas tenir compte du volume
du code. Parfois on n'y est obligé.

Pour
"...impossible de faire référence à une propriété ou de la définir pour un contrôle si     ce dernier n'est pas activé."


C' est quand tu as utilisé l' instruction
CurrentProject.Connection.Execute 
Or tu n' as pas ouvert de Connection auparavent, et donc la connection
n' était pas activée.
Mais l' erreur ne s' est pas produite quand tu as fait
CurrentProject.Execute .......

Bon courage alors et à la prochaine

chaibat
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Encore une chose pour le ' Id '
Si un identifiant existe dans plusieures tables ne change pas son libellé.
Conserve son nom pour toutes les tables.Comme ça on comprend  qu' il y' a une
 relation entre ces tables et on voit quel lien il y' a entres elles.
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

ouai t'inquiete pas ;)

par exemple que je lie la clé primaire de la table books avec un champ dela table supports
j'appele le champ lié dans ce cas: s_b_id_books
comme ça je sais qu'il existe une relation ;)

merci pour ton aide c'est vraiment sympas,
il est possible que j'ai d'autre x-files au cours de mon projet lol
je peux poster d'autre question sur ce meme post ?
comme je serais ou te trouver

++
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
t'inquietes ! comme tu dis.
tu peux me trouver n' importe ou dans le Forum, je suis partout.
Mais le plus simple serait que tu poses ta question, avec un peu de chance
je la lirais et je te répondrais aussitot.
De toute façon j' ai ton Pseudo en mémpoir.

Allez ! Bon courage et ne t' attardes pas trop dans Central-Park .

chaibat
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

voila j'ai autre question ;)


est il possible d'empecher un formulaire d'enregistrer automatiquement les donnees saisies


je m'explique: j'ai un formulaire "client" destine a etre remplie par une secraitaire
dans ce formulaire on trouve les champs classique comme "nom", "prenom" etc
lorsque que je commence a ecrire dans ce formulaire automatiquement la cle
primaire s'incremente. imaginons que la secraitaire ce trompe, elle ferme le formulaire
pour annuler la saisie, mais voila ce qui q ete saisie est quand meme enregistre !!

comment puis je faire pour desactive cette fonctionnalite et la remplacer par l'appuie d'un
bouton qui lui enregisterai les champs saisis dans la table ??

merci pour la reponse


 
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Salut,
Je pense qu' à l' heure ou j' écris ce post tu es encore couché.


Pour ce qui est de ta question, je vais te livrer mon secret et te montrer
comment moi je procède .
Supposons que j' ai une table CLIENTS.
Je crée une copie de cette table que j' appelle TMP_CLIENTS.
Cette table temporaire n' aura pas d' index et pour tous les champs je met
"Null Accéptée" et "Chaine Vide Autorisée". Tu verras plutard pourquoi.


Ensuite
Dans le formulaire qui liste mes clients, j' utilise un ListView et non un DataGrid.
Comme ça l' utilisateue ne pourra saisir ou modifier un client que par procédure.
J' utilise pour celà un menu contextuel avec les procédures classiques : Ajouter-Modifier-
Supprimer-Rechercher-Trier-...etc.
Comme ça j' ai toujours le controle sur l' action que va entreprendre l' utilisateur.


Je crée un deuxieme formulaire pour la saisie:
J' évite d' utiliser un DataGrid.J' utilise à la place des TextBox ,
des ComboBox et autres
Je lie tous ces controls à TMP_CLIENTS.et non à CLIENTS.


S' il choisi Ajouter, je lance ma Fonction "Ajouter_Client" dans laquelle:
 _Je vide ma table TMP_CLIENTS pour l' initialiser
 _J' ajoute ma Clé en incrémentant le dernier dans la table CLIENTS (Last+1)
  et je valide mon enregistrement.Comme ça je n' aurais pas d' erreur genre
"Aucun enregistrement..."
 De plus je n' aurais pas de problème puisque pour tous mes champs j' ai mis
"Null Accéptée" et "Chaine Vide Autorisée"
 Et je charge mon formulaire de saisi en mode "Ajout"
Dans celui-ci j'ai deux bouttons: Annuler et Valider
//Si on clique sur Valider. Je lance ma de transaction pour inserer l' enregistrement
 de la table TMP_CLIENTS vers CLIENTS.
 Je rafraichit par la suite ma ListView pour que le nouvel enregistrement soit
 ajouter à la liste.
//Si on clique sur Annuler je ne fais rien.


Pour la modification
Je lance ma Fonction "Modifier_Client" dans la quelle :
Je vide ma table TMP_CLIENTS pour l' initialiser
 _Je vide ma table TMP_CLIENTS pour l' initialiser
 -J' insére l' enregistrement que je veux modifier dans ma table TMP_CLIENTS
 à partir de ma table CLIENTS
 Et je charge mon formulaire de saisi en mode "Modification"
  
//Si on clique sur Valider. Je lance ma de transaction pour Updater mon enregistrement
  de la table CLIENTS. à partir TMPP_CLIENTS
 Je rafraichit par la suite ma ListView pour que mon enregitrement soit mis à jour
 dans ma liste
//Si on clique sur Annuler je ne fais rien.


Mon formulaire étant le même, avec "Mode" (en général j' utilise la propriété Tag),
je sais au moment de valider si c' est pour Ajouter ou Modifier


Pour la suppression
Je supprime directement de la table Clients en récupérant la clé dans ma ListView.


Voilà, c' est tout.
J' espère que ça te suffit comme réponse..




a+
chaibat
 




 
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

Bonjour,
en effet je dormais lol
bon j'ai compris ce que tu veux dire et je trouve cette
solution genial c'est parfait, je me demande pourquoi
j'y avais pas penser plutot!!
mais il y a des choses que je ne comprend ou que
je ne sais pas faire, je precise que ma formation
access etait bidon et que je ne maitrise pas du tout
les mouvements dans les tables:
par exemple j'adorerais pouvoir supprimer un enregistrement,
deplacer un enregistrement dans la table, selectionner un champ sur une
ligne, updater des champs (meme si maintenant j'y arrive bien grace a toi )
les mystheres des requetes, SQL ??, ADO??, DAO?? pour moi c'est du chinois lol
connaiterais tu un site internet ou meme un lien sur ce site qui explique
de facon claire comment faire c'est chose ?

sinon j'ai repris ton commentaire, tous ce qui est vert je sais faire lol,
et en rouge je sais pas faire, et en bleu c q la je comprend pas les
mots lol je suis vraiment desole !!

"Je crée une copie de cette table que j' appelle TMP_CLIENTS.
Cette table temporaire n' aura pas d' index et pour tous les champs je met
"Null Accéptée" et "Chaine Vide Autorisée"






Dans le formulaire qui liste mes clients, j' utilise un ListView et non un DataGrid.
Comme ça l' utilisateue ne pourra saisir ou modifier un client que par procédure.
J' utilise pour celà un menu contextuel avec les procédures classiques : Ajouter-Modifier-
Supprimer-Rechercher-Trier-...etc.
Comme ça j' ai toujours le controle sur l' action que va entreprendre l' utilisateur.


Je crée un deuxieme formulaire pour la saisie:
J' évite d' utiliser un DataGrid.J' utilise à la place des TextBox ,
des ComboBox et autres
Je lie tous ces controls à TMP_CLIENTS.et non à CLIENTS.

S' il choisi Ajouter, je lance ma Fonction "Ajouter_Client" dans laquelle:
 _Je vide ma table TMP_CLIENTS pour l' initialiser  comment on fait ca?
 _J' ajoute ma Clé en incrémentant le dernier dans la table CLIENTS (Last+1) comment on fait ca?
si je comprend bien c que tu na pas de cle primaire sur cette table ?
  et je valide mon enregistrement.Comme ça je n' aurais pas d' erreur genre
"Aucun enregistrement..."
 De plus je n' aurais pas de problème puisque pour tous mes champs j' ai mis
"Null Accéptée" et "Chaine Vide Autorisée"
 Et je charge mon formulaire de saisi en mode "Ajout"
    DoCmd.OpenForm "NomFormulaire", acNormal, , stLinkCriteria, acFormAdd      comme ca ?

Dans celui-ci j'ai deux bouttons: Annuler et Valider
//Si on clique sur Valider. Je lance ma de transaction pour inserer l' enregistrement
 de la table TMP_CLIENTS vers CLIENTS.
 Je rafraichit par la suite ma ListView pour que le nouvel enregistrement soit
 ajouter à la liste.
//Si on clique sur Annuler je ne fais rien.

Pour la modification
Je lance ma Fonction "Modifier_Client" dans la quelle :
Je vide ma table TMP_CLIENTS pour l' initialiser
 _Je vide ma table TMP_CLIENTS pour l' initialiser
 -J' insére l' enregistrement que je veux modifier dans ma table TMP_CLIENTS
 à partir de ma table CLIENTS
 Et je charge mon formulaire de saisi en mode "Modification"
  
//Si on clique sur Valider. Je lance ma de transaction pour Updater mon enregistrement
  de la table CLIENTS. à partir TMPP_CLIENTS
 Je rafraichit par la suite ma ListView pour que mon enregitrement soit mis à jour
 dans ma liste
//Si on clique sur Annuler je ne fais rien.

Mon formulaire étant le même, avec "Mode" (en général j' utilise la propriété Tag),
je sais au moment de valider si c' est pour Ajouter ou Modifier

je pense que ca va etre long a tous expliquer lol si ca te saoule laisse tomber ;)
et puis la il me reste 1mois et deux semaines pour finir et je pars deux semaines
en vacance a partir de lundi prochain, je pense que ca va etre dur pour tous boucle!!
c'etait un vrai defis pour moi de faire ca surtout que ce n'est pas ma formation
initial je suis electronicien a la base lol
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Salut,
Pour en savoir plus sur les requetes, Dao et  Ado, cherche dans les Tutoriaux.
avec le moteur de recherche.
Tu trouveras tout ce qu' il te faut.En plus c' est bien expliqué.
En ce qui concerne ce que tu as souligné en rouge.C' est pas très important.
L' essentiel c' est que tu as compris le truc des fichiers temporaires.
Pour tout le reste ce sont des choses personnelles et tu n' est pas obligé de faire
comme moi. Par exemple pour
 -//^^menu contextue : c' est un menu qu' il n' est visible que lorsqu' on clique avec le boutton
 droit de la souris.A la place tu peux utiliser des Bouttons :Ajouter-Modifier-Supprimer-
Rechercher-Trier-...etc.


 //^^S' il choisi Ajouter, je lance ma Fonction "Ajouter_Client" .
     C' est une procedure dans laquelle je met mon code pour l' ajout d' un client.
Même chose pour Modifier_Client".


//^^Et je charge mon formulaire de saisi en mode "Modification"
    "mode" est une varaible qui me permet de savoir si mon formulaire a été afficher pour
Ajouter ou modifier.
  Puisque j' utlise le même formulaire pour les deux.Quand je click sur "Enregistrer" je test
If mode="Ajouter" Then
    j' ajoute un enregistrement
else if Lode="Modifier" then
   je modifie...
End if


Ceci pour ne pas faire deux Formulaires.


Et ce n' est pas que tu me "soules" mais ça serait long à t' expliquer tout.
L' essentiel c' est que tu comprend en gros comment faire, le reste tu fais
 comme tu veux
Mais je pense qu' avec les Tutoriaux tu avanceras bien.


Allez ! Bonne chance et bon courage


chaibat


 
Messages postés
12
Date d'inscription
mardi 8 août 2006
Statut
Membre
Dernière intervention
15 septembre 2006

bonjour,

j'ai essaye depuis trois jours de faire un copier coller de ma table "supportsTemp" vers ma table "supports"
rien a faire les tutoriaux de ce site ne m'ont pas aides
j'ai essayer en faisant des:
'Dim NewLigne As DataRow

'NewLigne = DtSet.Tables("Supports").NewRow
'B6 = Me.st_ci_id_customer
'CurrentProject.Connection.Execute "update Supports set s_ci_id_customer = " & B6 & ""

etc.... mais rien a faire je despere !!