Requête d'ajout/modification multi-tables

Résolu
rabenls Messages postés 24 Date d'inscription mardi 15 novembre 2005 Statut Membre Dernière intervention 4 août 2007 - 13 avril 2007 à 20:58
rabenls Messages postés 24 Date d'inscription mardi 15 novembre 2005 Statut Membre Dernière intervention 4 août 2007 - 14 avril 2007 à 23:32
Bonjour,
Je travaille en VB6 et j'accède à ma base avec ADO et des requêtes SQL.
J'ai une table "Composant", une table "Categories" et une table "Marque". L'application finale aura encore plus de tables et de relations mais si j'arrive à gèrer ces 3 là, le reste posera pas de problème. Chaque table a un ID clé primaire, ce qui complique surement les choses mais qui est nécessaire.

Tout d'abord, pour la suppression, pas de problème, avec ce code ADO:


<hr />

TbComposants.MoveFirst
While (Not TbComposants.EOF)
    If (TbComposants("NomComposant") = ListComposants.Text) Then
        If (TbComposants.RecordCount <> 0) Then
            TbComposants.Delete
            TbComposants.Update
            TbComposants.Requery
        End If
    End If
TbComposants.MoveNext
Wend





<hr />
J'aurais pu m'en sortir avec une requête sql, mais soit, çà marche bien comme çà.
Maintenant j'ai un soucis pour l'ajout et la mise à jour. Comme la mise à jour et l'ajout sont proche techniquement, c'est par l'ajout que j'ai commencé avant de me lancer dans la modification. Mon premier test a été:


<hr />

Private Sub CommandAjout_Click()
Combo2.Text = ""
Combo3.Text = ""
Text1.Text = ""
End Sub

Private Sub CommandValiderAjout_Click()
CmdAdoAddComposant.ActiveConnection = MaConnection
CmdAdoAddComposant.CommandText = "SELECT * FROM Composants"
Composants.Ref_Marque FROM Composants"
TbComposants.CursorLocation = adUseClient
TbComposants.CursorType = adOpenDynamic
TbComposants.LockType = adLockPessimistic
TbComposants.Open CmdAdoAddComposant
TbComposants.AddNew
TbComposants![NomComposant] = IIf(IsNull(Text1.Text), "", (Text1.Text))
TbComposants![Ref_Categorie] = IIf(IsNull(Combo2.Text), "", (Text1.Text))
TbComposants![Ref_Marque] = IIf(IsNull(Combo3.Text), "", (Text1.Text))
TbComposants.Update
TbComposants.Requery
End Sub





<hr />
Mais celà ne fonctionne pas, j'ai une erreur, vb6 n'associe pas les références aux tables.
Le seul moyen que j'ai trouvé pour ajouté des composants à la table est celui ci:


<hr />

Private Sub Command4_Click()
CmdAdoAddComposant.ActiveConnection = MaConnection
CmdAdoAddComposant.CommandText = "INSERT INTO Composants ( Id, NomComposant, Ref_Categorie, Ref_Marque ) SELECT Composants.Id, Composants.NomComposant, Composants.Ref_Categorie, Composants.Ref_Marque FROM Composants"
TbComposants.CursorLocation = adUseClient
TbComposants.CursorType = adOpenDynamic
TbComposants.LockType = adLockPessimistic
TbComposants.Open CmdAdoAddComposant
TbComposants.requery
End Sub




<hr />
Mais celui ci rajoute le contenu entier de la table composant, à la table composant. Mais celà fonctionne, donc je pense que c'est déjà une bonne base.
Il faudrait donc que dans ma requête SQL, je spécifie le contenu de NomComposant, Ref_Categorie et Ref_Marque, ce que j'ai essayé sans succès pour l'instant.

Voilà, merci à ceux qui ont lu jusqu'au bout et encore plus à ceux qui répondront
A bientot

merci
raben

9 réponses

chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
14 avril 2007 à 17:50
Bonjour,
Je n' arrive toujours pas à comprendre l' insertion des composants
dans composants.
Insertion veut dire Ajout.
Si ton Id est Auto, tu vas te retrouver avec des composants en double
(voir plus) mais avec des Id différents
Composasants
1    A
2    B
3    C
4    A
5    B
6    C


Ensuite, je considère que Categories et Marques sont des tables "Fixes"
Elles doivent être initialisées avant d' entreprendre d' ajouter des composants
Chacun dans un formulaire et tu choisira toi même leur Ref.
(évite le N° Auto)


Dans ton Formulaire Saisie Des Composants
Tu dois avoir deux DBCombo .L' un liste les Catégories et l' autre les Marques
à partir desquels l' utilisateur séléctionnera une valeur.
IdComposant étant  étant Auto il ne te reste plus que NomComposant que tu dois saisir.


Autre chose à propos de N° Auto.
Lors de l' insertion avec requête ajout ,il faut l' exclure de la liste des champs


"INSERT INTO Composants ( NomComposant, Ref_Categorie, Ref_Marque )
SELECT " & xNomComposant & " AS Expr1, " & xRef_Categorie & " AS Expr2, " & _
 xRef_Marque & " AS Expr3;"




xNomComposant,xRef_Categorie et xRef_Marque sont des variables bien sur...

Mais je continue toujours à te déconseiller le N° Auto...

C' est vous qui voyez...!
3
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 avril 2007 à 21:28
salut,

ta requête doit se présenter comme ça :
"INSERT INTO Composants ( Id, NomComposant, Ref_Categorie, Ref_Marque )
SELECT Composants.Id, Composants AS Expr1. NomComposant, Composants.Ref_Categorie
AS Expr2, Composants.Ref_Marque AS Expr3 FROM Composants
WHERE + la valeur de l' Id de l' enregistrement que tu dois ajouter
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 avril 2007 à 21:46
Bon on laisse le code pour l' instant et corrigeant quelques imperfection au niveau
de la conception:
1° lorsqu' il s' agit de tables liées, il faut éviter le N° Auto
   et opter pour un Long


2° C' est mieux d' avoir, dans les trois tables, le même nom de champ
sur le quel est établie la relation


Composant    Categories     Marque
 Id                     Id                   Id


3° je viens de me rendre compte que
"INSERT INTO Composants ( Id, NomComposant, Ref_Categorie, Ref_Marque )
SELECT Composants.Id, Composants.NomComposant, Composants.Ref_Categorie,
Composants.Ref_Marque FROM Composants"


tu inseres dans Composants le contenu de Composant...
il y' a là quelque chose qui ne colle pas ! , non ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 avril 2007 à 22:32
...

ce que je veux dire c' est :


                           *Composants   
*Categories                  Id
 Ref_Categorie --->  Ref_Categorie            *Marques                            
                               Ref_Marque   <---------   Ref_Marque  


 


Si la propriété "Mettre à jour automatiquement" de la relation est True:
>tu changes dans Categories, ça  change automatiquement dans Composants
>tu changes dans Marques, ça  change automatiquement dans Composants 


2°Après
TbComposants.AddNew
Ou est l' Id ? Si c' est Auto , d' accord
sinon tu dois récupérer le dernier et l' incrémenter de 1


3° Peut être que chaine vide autorisée pou NomComposant
Mais, tes tables étant liées,
TbComposants![Ref_Categorie] = IIf(IsNull(Combo2.Text), "", (Text1.Text))
TbComposants![Ref_Marque] = IIf(IsNull(Combo3.Text), "", (Text1.Text))
sont érronées               
Dans Composants,Ref_Categorie ne doit pas être nulle.
Ref_Marque aussi...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rabenls Messages postés 24 Date d'inscription mardi 15 novembre 2005 Statut Membre Dernière intervention 4 août 2007
14 avril 2007 à 16:06
Bonjour,

En efftet la requête rajoute la table composants à la table composants, mais au moins celà fonctionnait, donc je partais de çà comme base.

La mise à jour des relations est bien automatique entre les tables.

En effet les champs ref_categorie et ref_marque doivent être rempli, mais je n'arrive pas à faire comprendre au programme qu'il doit les remplir en partant du textbox ou combobox, mais en allant chercher la valeur dans la table de la relation. J'ai essayé d'assigner un numérique, au cas ou le programme n'accepterait que la valeur d' id comme valeur.

merci
0
rabenls Messages postés 24 Date d'inscription mardi 15 novembre 2005 Statut Membre Dernière intervention 4 août 2007
14 avril 2007 à 18:27
J'ai bien 2 combos avec catégories et marques qui sont remplies avec le contenu des tables respectives, que l'utilisateur peut choisir. Et un textbox pour le nom du composant que l'utilisateur doit encoder.

Je vais tenté sans les numéros auto pour categories et marques, je crois en effet que ca sera plus simple, que çà n'est pas nécessaire, et que ca sera plus facile. Mais on m'a toujours donné comme consigne de mettre des ids clé primaire pour chaque table.

Evidemment que la requête de la table composants ne sert à rien et créer des doublons, mais c'était le seul moyen d'ajouter quelque chose à ma table et qui fonctionnait.

merci
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
14 avril 2007 à 19:30
^^Je vais tenté sans les numéros auto pour categories et marques, je crois en effet que ca sera plus simple,..."
t' as donc rien compris...!
crois moi ça sera encore plus difficile
Indexes Categories sur Ref_Categorie (Texte)
Indexes Marques sur Ref_Marque (Texte)
Quand tu listes dans les combos, c' est plus facile de récupérer du texte...
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
14 avril 2007 à 19:33
pardon !
c' est moi qui a mal compris...
je croyais que c' était tenté avec  les numéros auto...
0
rabenls Messages postés 24 Date d'inscription mardi 15 novembre 2005 Statut Membre Dernière intervention 4 août 2007
14 avril 2007 à 23:32
pas de soucis ;)
je suis entrain d'arriver a quelque chose :)
enfin même, çà marche ! mais je refais çà au propre demain et j'attaque la mise à jour après l'insertion

merci !
0
Rejoignez-nous