Problème sur INSERT / UPDATE

Fermé
Kyndred Messages postés 16 Date d'inscription mardi 3 mai 2022 Statut Membre Dernière intervention 30 janvier 2023 - 15 déc. 2022 à 09:46
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 - 15 déc. 2022 à 11:19

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

A voir également:

1 réponse

yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469
15 déc. 2022 à 10:37

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?

0
Kyndred Messages postés 16 Date d'inscription mardi 3 mai 2022 Statut Membre Dernière intervention 30 janvier 2023 1
15 déc. 2022 à 10:46

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= " " 

0
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469 > Kyndred Messages postés 16 Date d'inscription mardi 3 mai 2022 Statut Membre Dernière intervention 30 janvier 2023
15 déc. 2022 à 11:19

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 Then

Tu 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.

0