Problème sur INSERT / UPDATE
yg_be Messages postés 24281 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je viens vers vous car j'ai un soucis, je vais déjà vous mettre le code pour que vous puissiez comprendre:
Private Sub EntréeStocks_Click()
Dim rstS As DAO.Recordset
Dim strSql As String
Set rstS = Me.RecordsetClone 'source
'Vérifier si le jeu d'enregistrements ne contient pas de lignes
If rstS.RecordCount = 0 Then Exit Sub
rstS.MoveLast 'Inutile dans ce cas, mais gardons les bonnes habitudes
rstS.MoveFirst
Do Until rstS.EOF
If DCount("*", "StocksEm", "Ref = '" & rstS.Fields("Ref") & "'" _
& " AND Emplacement = '" & rstS.Fields("Emplacement") & "'" _
& " AND CodeVariante= '" & rstS.Fields("CodeVariante") & "'") > 0 Then
strSql = "UPDATE StocksEm" _
& " SET Qte = Qte + " & rstS.Fields("Qte") & "" _
& " WHERE Ref = '" & rstS.Fields("Ref") & "'" _
& " AND Emplacement = '" & rstS.Fields("Emplacement") & "'" _
& " AND CodeVariante = '" & rstS.Fields("CodeVariante") & "'"
CurrentDb.Execute strSql, dbFailOnError
strSql = "INSERT INTO HistEntre (Ref,Qte,NumBl,DateS,Emplacement,CodeVariante)" _
& " SELECT NewStocks.Ref, NewStocks.Qte, NewStocks.NumBl, NewStocks.DateS, NewStocks.Emplacement, NewStocks.CodeVariante " _
& " FROM NewStocks"
CurrentDb.Execute strSql, dbFailOnError
ElseIf DCount("*", "StocksEm", "Ref = '" & rstS.Fields("Ref") & "'" _
& " AND Emplacement = '" & rstS.Fields("Emplacement") & "'" _
& " AND IsNull(CodeVariante) ") > 0 Then
strSql = "UPDATE StocksEm" _
& " SET Qte = Qte + " & rstS.Fields("Qte") & "" _
& " WHERE Ref = '" & rstS.Fields("Ref") & "'" _
& " AND Emplacement = '" & rstS.Fields("Emplacement") & "'" _
& " AND IsNull(CodeVariante)"
CurrentDb.Execute strSql, dbFailOnError
strSql = "INSERT INTO HistEntre (Ref,Qte,NumBl,DateS,Emplacement,CodeVariante)" _
& " SELECT NewStocks.Ref, NewStocks.Qte, NewStocks.NumBl, NewStocks.DateS, NewStocks.Emplacement, NewStocks.CodeVariante " _
& " FROM NewStocks"
CurrentDb.Execute strSql, dbFailOnError
Else
strSql = "INSERT INTO StocksEm (Ref,Qte,NumBl,DateS,Emplacement,Provenance,CodeVariante)" _
& " SELECT NewStocks.Ref, NewStocks.Qte, NewStocks.NumBl, NewStocks.DateS, NewStocks.Emplacement, NewStocks.Provenance, NewStocks.CodeVariante " _
& " FROM NewStocks" _
'& " WHERE id_art_fk = " & rstS.Fields("id_art_fk")
CurrentDb.Execute strSql, dbFailOnError
strSql = "INSERT INTO HistEntre (Ref,Qte,NumBl,DateS,Emplacement,CodeVariante)" _
& " SELECT NewStocks.Ref, NewStocks.Qte, NewStocks.NumBl, NewStocks.DateS, NewStocks.Emplacement, NewStocks.CodeVariante " _
& " FROM NewStocks"
CurrentDb.Execute strSql, dbFailOnError
End If
rstS.MoveNext
Loop
strSql = "DELETE * FROM NewStocks"
CurrentDb.Execute strSql, dbFailOnError
Me.Requery
rstS.Close
Set rstS = Nothing
Me.Refresh
End Sub
Le problème que j'ai actuellement c'est que lorsque je veux Insérer un enregistrement avec CodeVariante rempli dans un Emplacement qui existe déjà il ne veut pas et à la place il fait un UPDATE sur ce même enregistrement situé à l'emplacement.
Exemple
Et je souhaite insérer celui-ci :
Cela met à jour l'enregistrement qui existe déjà à cet Emplacement, hors moi j'aimerai qu'il sois insérer comme CodeVariante n'est pas Null au moment ou je souhaite l'INSERT . Le deuxième formulaire que vous voyez est basé sur la table NewStocks et le premier sur StocksEm.
Avez-vous une idée ? Merci par avance
Cdlt
Windows / Chrome 108.0.0.0
- Problème sur INSERT / UPDATE
- Touche insert - Guide
- Windows update bloqué - Guide
- Winget update - Guide
- Asus live update - Télécharger - Utilitaires
- Disk boot failure insert system disk and press enter - Guide
1 réponse
bonjour,
Il fait cela parce que l'enregistrement existant (dans StocksEm) n'a pas de CodeVariante.
pour tester, mets provisoirement en commentaire tes lignes de code 29 à 43.
dans la table NewStocks, que contient précisément le champ "CodeVariante" quand il est vide? Null ou bien une chaine vide?
D'accord je vais faire cela
Quand le champ CodeVariante est vide dans la table NewStocks il n'y a rien donc je dirais plutôt chaine vide (" ") car j'ai cru lire que Null était seulement pour les Variants . ce champ est un TexteCourt comme type.
Il faudrait que je change ma condition IsNull par un truc comme ça ? : CodeVariante.Value= " "
Il est préférable, au lieu de "je dirais plutôt", de répondre "je ne sais pas".
La question, "" ou Null, porte sur un champ d'une table, pas sur une variable.
Tu dois aller voir dans la définition et dans le contenu de la table pour y trouver la réponse.
Ton souci, je pense, c'est que tu négliges de tester la valeur de CodeVariante de la table NewStocks dans ton test en ligne 29-31. Peut-être ainsi:
ElseIf rstS.Fields("CodeVariante") = "" _ DCount("*", "StocksEm", "Ref = '" & rstS.Fields("Ref") & "'" _ & " AND Emplacement = '" & rstS.Fields("Emplacement") & "'" _ & " AND IsNull(CodeVariante) ") > 0 ThenTu pourrais sans doute simplifier cela si tu n'utilisais pas Null pour le champ CodeVariante de la table StocksEm.
Ton utilisation de la table NewStocks dans tes requêtes INSERT et UPDATE te causera d'autres soucis.