Mise à jour VB6 et Access 2007 avec requête SQL

Bonjour l'Ami,

J'ai besoin de votre aide. Je me suis trouvé coincé au bout du couloir. Je n'arrive pas à dépasser le niveau de la mise à jour, surtout la commande Modifier

Pour information

Je travaille avec VB6 et Acces 2007, utilisant la requête SQL

sur le Module, j'ai écris

Public DB as New ADOBD.Connection

Public RS as New ADODB.RecordSet

Public Rss as New ADODB.RecordSet

Public SQLs as String

Sur acces il y a Trois Tables

Une TablePrincipale ( stock les données saisies à partir de la feuille de saisie )
Deux Tables Secondaires indexéeqs ( TableNom, TableMatiere )

TableNom est indexée par Les Nom
TableMatiere est indexée par les Matiere

Mon problème se situe au niveau de la commande Modifier.

Sur la feuille d'affichage pour la consultation en vue de la modification, les données sélectionnées sur la feuille de Recherche s'affichent

lorsque je change le contenu d'un objet text, le changement s'effectue :

Normalement sur la TablePrincipale

Normalement sur les deux Tables secondaires tant que Nom ( index sur la TableNom ) et Matiere ( Index sur la TableMatiere ) n'ont pas été modifié sur la feuille de consultation en vue de la modification

Mon objectif est : lorsque je change sur la feuille de consultation en vue de modification, par exemple Nom, les données saisies auparavant devant le nom x disparaissent de la ligne de ce nom, mais apparaissent sur la ligne du nouveau Nom saisi sur l'objet Text de la feuille consultation

Bien sur il y a toujours une condition pour chacune de modification

Une partie de mon objectif se réalise, à savoir la disparition des données de la ligne de l'Index modifié
mais l'apparition des ces données sur la ligne du nouveau Nom ne se réalise pas

pour plus d'éclaircissement

Sub cmdModifier_Click ()

if NOrdre = TNOrdre then

Goto Ne_Fais_Rien :

end if

SQLs="Select * TablePrincipale where NOrdre = " & TNOrdre &""

if Rss.State=adStateOpen Then Rss.Close
Rss.Open SQLs, DB, adOpenKeySet, adLockPessimistic

if Rss.EOF then

Goto Oks:

else

msgbox" Ce Numero Existe "

exit sub
end if

Oks:
'-------
Ne_Fais_Rien:

ActuMsg=msgbox("Voulez vous modofier ?",VBquestion+vbYesNo,)

if AcuMsg=vbYes then

'-----l'Actualisation de la TablePrincipale

RS![Nom]=TNom
RS![Matiere]=TMatiere
RS![Note]=TNote

RS.Update

'--------------------------------------------

Dim N

N=CStr(TNom)

SQLs="Select * from TableNom where Nom = '" & CStr(TNom) &"'"

if Rss.State=adStateOpen Then Rss.Close
Rss.Open SQLs, DB, adOpenKeySet, adLockPessimistic

'-----l'Actualisation de la TableNom

Selct Case TNom

Case is <> RS![Nom]

RS![NOrdre]=0
RS![Matiere]=""
RS![Note]=0

Case Else

RS![NOrdre]=TNOrdre
RS![Matiere]=TMatiere
RS![Note]=TNote

end Select

RS.Update

'-------------------------------------------------

'-----l'Actualisation de la TableMatiere

Dim M

M=CStr(TMatiere)

SQLs="Select * from TableMatiere where Matiere = '" & CStr(TMatiere) &"'"

if Rss.State=adStateOpen Then Rss.Close
Rss.Open SQLs, DB, adOpenKeySet, adLockPessimistic

Selct Case TMatiere

Case is <> RS![Matiere]

RS![NOrdre]
RS![Nom]=""
RS![Note]=0

Case Else

rs![NOrdre]
RS![Nom]=TNom
RS![Note]=TNote

end Select

RS.Update

end if

FRecherche.Show

Load me

end sub


l'instruction équivalente à case is <> se réalise
par contre celle concernant Case = ne se réalise pas

Merci d'avance pour votre aide

28 réponses

Résumé de la discussion

Problème majeur : la synchronisation des mises à jour entre TablePrincipale et les tables liées TableNom et TableMatiere lors de modifications via une feuille de consultation en VB6 et Access 2007. Des réponses indiquent que les mises à jour ne se propagent pas correctement lorsque les requêtes partent de variables sans vérifier le Recordset, et recommandent d'utiliser RS.Edit puis RS.Update pour rendre les modifications persistantes. Autre piste, certains suggèrent d’installer un identifiant unique comme clé primaire (par exemple CNE ou NOrdre) et d’actualiser TableNom et TableMatiere séparément lors de modifications de Nom ou Matiere.

Bobot (l’IA à votre service)
  1. Bonjour,

    contre celle concernant Case = Cette instruction n'existe pas dans votre code, vous avez ecrit Case Else qui devrait faire ce que vous attendez.
    Un simple
    If TMatiere <> RS![Matiere] Then ....... Else ....... End if 
    aurait suffi.
    Il manque Rs.Edit pour chaque Rs.Udate. Si vous avez plusieurs fois le meme nom, comment vous faiies ????
    1. Bonjour l'Ami,

      Merci pour votre attention.
      Même avec la condition If .... then ..... Else ..... end if, le resultat était toujours le même. Car c'est cette condition que j'ai essayé en premier lieu.

      Concernant la RS.EditMode ( Je crois ) je ne sais pas comment l'utiliser. Si vous m'éclairiez sur ce point je vous en serai reconnaissant.

      Concernant le même nom, je crois ce n'est pas un problème. Car Sur la TableNom c'est le cumul des note qui gère

      Merci encore pour votre aide
      1. Re,

        Concernant la RS.EditMode ( Je crois ) ----> Autant pour moi, si requete sql, pas de passage en mode edition pour modifier les champs d'un enregistrement

        un exemple qui marche chez moi avec une base simple

        Private Sub CommandButton1_Click()
        Texte = Me.Controls("Textbox" & 4)

        Sql = "select * from BdD_Bon where [Group]='" & Texte & "'"
        rs.Open Sql, conn, 3, 3

        If rs.EOF And rs.BOF Then
        MsgBox "Existe pas!!!"
        Else
        If Texte <> rs![Group] Then
        rs![numero] = 0
        rs![Group] = ""
        rs![Matricule] = 0
        Else
        rs![numero] = Texte
        rs![Group] = "AZER"
        rs![Matricule] = 99999
        End If
        rs.Update
        End If
        End Sub
        1. Bonjour l'Ami,

          Je vous donnerai plus d'explications pour vous permettre de bien cerner mon problème

          Voilà :

          il y'a tout d'abord une Table où sont enregistrées les données ( TablePrincipale )
          elle contient 4 colonnes

          0 = Nordre

          1=Nom

          2=Matiere

          3=Note

          avec comme clé primaire le NOrdre

          ensuite

          il y'a la table secondaire 1 ( TableNom) .Elle contient aussi 4 Colonnes

          0=Nom

          1=NOrdre

          2=Matiere

          3=Note

          Déjà dans cette table la colonne 1 [Nom] est remplie par plusieurs noms différents à partir d'une fenêtre de paramétrage ( Nom est considéré comme Index ), avec comme clé primaire le Nom

          ensuite

          il y'a la Table secondaire 2 ( TableMatière ). Elle contient elle aussi 4 Colonnes

          0=Matiere

          1=NOrdre

          2=Nom

          3=Note

          Aussi la colonne 1 [Matiere] est déjà remplie par les différentes matières à partir de la fenêtre du parametrage ( Matiere est considérée ici comme Index), avec comme clé primaire la Matiere

          au moment de la saisie générale, les codes saisis sont comme suit

          la Feuille de saisie

          SQLs="Select * from TablePrincipale where NOrdre=" & TNOrdre &""

          if RS.State=adStateOpen Then RS.Close
          RS.Open SQLs, DB, adOpenKeySet, adLockPessimistic

          if RS.EOF then

          Goto Oks:

          else

          Msgbox"Désolé, ce Numéro existe déjà"

          exit sub
          end if

          Oks:

          RS.addNew

          RS![NOrdre]=TNOrdre
          RS![Nom]=TNom
          RS![Matiere]=TMatiere
          RS![Note]=TNote

          RS.Update

          '-------------------------------
          Dim N

          N=CStr(TNom)

          SQLs="Select * from TableNom where Nom=' " & TNom &" ' "

          if RS.State=adStateOpen Then RS.Close
          RS.Open SQLs, DB, adOpenKeySet, adLockPessimistic

          if TNom = RS![Nom] Then

          RS![NOrdre]=TNOrdre
          RS![Matiere]=TMatiere
          RS![Note]=TNote

          RS.Update

          End if

          '---------------------------------

          Dim M

          M=CStr(TMatiere)

          SQLs="Select * from TableMatiere where Matiere=' " & TMatiere &" ' "

          if RS.State=adStateOpen Then RS.Close
          RS.Open SQLs, DB, adOpenKeySet, adLockPessimistic

          if TMatiere = RS![Matiere] Then

          RS![NOrdre]=TNOrdre
          RS![Matiere]=TMatiere
          RS![Note]=TNote

          RS.Update

          End if


          Ces codes sont ici pour la saisie générale

          seulement en cas d'erreur de saisie, détectée après, il y' a une fenêtre de recherche qui renvoie à la fenêtre de mise à jour.

          Supposons que la saisie générale a donné ce qui suit

          sur la TablePrincipale

          NOrdre Nom Matiere Note

          1 XXXX Math 14,45

          Sur la TableNom ( Déjà la colonne 0 est pleine par les Noms )

          Nom NOrdre Matiere Note

          XXXX 1 Math 14,45

          YYYY

          ZZZZ

          WWW

          Sur la TableMatiere ( Déjà la Colonne 0 est pleine par les matières )

          Matiere NOrdre Nom Note

          Math 1 XXX 14,45

          Phisique

          Chimie

          Science

          Ceci étant exposé

          Supposons que l'erreur détectée est comme suite

          au lieu de saisir YYYY on a saisi par erreur XXX ,
          et
          au lieu de saisir Chimie on a saisi Math

          on veut corriger ces deux erreurs

          les codes écris sur la feuille de modification est comme suit

          Sub CmdModifier_Click ()

          If NOrdre = TNOrdre then

          Goto Ne_Fais_Rien :

          end if

          SQLs="Select * TablePrincipale where NOrdre = " & TNOrdre &""

          if Rss.State=adStateOpen Then Rss.Close
          Rss.Open SQLs, DB, adOpenKeySet, adLockPessimistic

          if Rss.EOF then

          Goto Oks:

          else

          msgbox" Ce Numero Existe "

          exit sub
          end if

          Oks:
          '-------
          Ne_Fais_Rien:

          ActuMsg=msgbox("Voulez vous modofier ?",VBquestion+vbYesNo,)

          if AcuMsg=vbYes then

          '-----l'Actualisation de la TablePrincipale

          RS![Nom]=TNom
          RS![Matiere]=TMatiere
          RS![Note]=TNote

          RS.Update

          '--------------------------------------------

          Dim N

          N=CStr(TNom)

          SQLs="Select * from TableNom where Nom = '" & CStr(TNom) &"'"

          if Rss.State=adStateOpen Then Rss.Close
          Rss.Open SQLs, DB, adOpenKeySet, adLockPessimistic

          '-----l'Actualisation de la TableNom

          if TNom <> RS![Nom] then

          RS![NOrdre]=0
          RS![Matiere]=""
          RS![Note]=0

          Else

          RS![NOrdre]=TNOrdre
          RS![Matiere]=TMatiere
          RS![Note]=TNote

          RS.Update

          end If

          '-------------------------------------------------

          '-----l'Actualisation de la TableMatiere

          Dim M

          M=CStr(TMatiere)

          SQLs="Select * from TableMatiere where Matiere = '" & CStr(TMatiere) &"'"

          if Rss.State=adStateOpen Then Rss.Close
          Rss.Open SQLs, DB, adOpenKeySet, adLockPessimistic

          if TMatiere <> RS![Matiere] Then

          RS![NOrdre]
          RS![Nom]=""
          RS![Note]=0

          Else

          Rs![NOrdre]
          RS![Nom]=TNom
          RS![Note]=TNote

          RS.Update

          end if

          FRecherche.Show

          Load me

          end if

          end sub


          sur la TablePrincipale avec les codes dessus la correction est réussie

          mais sur la TableNom et la TableMatiere , la suppression des données saisies qui sont supprimées mais la correction est ignorée

          c'est à dire

          sur la TableNom NOrdre Math 14,45 ( Saisis sur la ligne de XXX ) sont supprimé, mais sur la ligne de YYY rien n'est enregistrés

          la même chose se passe sur la ligne matire dans la ( TableMatiere )

          les données saisie par erreur sur la ligne de Math sont supprimées, mais rien n'est enregistré sur la ligne de Chimie

          Voilà mon problème

          J'espère être clair pour vous permettre de bien situer le problème et me donner une solution viable.

          Merci pour votre patience

          A plus l'Ami
          1. Bonjour,

            J'ai compris votre probleme, table Matiere et Nom il n'y a pas de mise a jour sur correction(s).

            Parcontre, choses qui me chagrinent un peu:
            vous faites des requetes en partant de variables et vous testez si dans le recordset c'est different de la variable que vous avez utilisee pour creer ce recordset

            SQLs="Select * from TableNom where Nom = '" & CStr(TNom) &"'"
            et
            if TNom <> RS![Nom] then

            SQLs="Select * from TableMatiere where Matiere = '" & CStr(TMatiere) &"'"
            et
            if TMatiere <> RS![Matiere] Then

            Pouvez-vous mettre a dispo votre projet complet en changent le noms s'il y en a
            1. Bonjour l'Ami,

              Je n'est pas compris votre phrase le .vbw ne me sert a rien.

              Si je vous n'aviez pas reçu mon dossier de le renvoie une autre fois

              A plus
              1. Re,

                Pas de dossier dans ce que vous avez mis a dispo, seulement un .vbw
                1. Re,

                  meme chose !!!!!!!!

                  Votre projet est dans un repertoire, compressez le repertoire
                  1. Re,

                    Structure de base de donnees un peu curieuse:

                    Table TableNoms: que viennent faire la Matiere et la note dans cette table ??????
                    Table TableMatieres: que viennent faire le Nom et la note dans cette table ??????

                    et comme je l'ai deja ecrit, comment faites vous pour les personnes de meme nom

                    Il faudrait commencer par terminer la saisie des noms avant de penser a voir comment rectifier les erreurs de saisie des notes et matieres

                    De plus, la saisie des notes par matieres est un peu confuse. Y a plus simple.

                    A+
                    1. Re,

                      Concernant la saisie des noms. J'ai prévu d'attribuer un code pour chaque
                      nom.

                      concernant la TableNoms , la Matiere et la Note y sont pour me permettre
                      d'appeler la note pour chaque nom ou la matière pour chauqe nom( si je ne me trompe pas )

                      ainsi pour la TableMatieres.

                      Que pensez vous ?

                      A plus l'Ami
                      1. Bonjour,

                        J'ai prévu d'attribuer un code pour chaque
                        nom.
                        Non, vous faites un test si meme nom
                        MsgBox "Ce Nom est déjà saisi"
                        et pas d'enregistrement

                        Les tables Nom et Matieres ne doivent pas contenir d'autres informations que celles qui les concernent.

                        Il n'y a qu'une seule a mettre a jour pour la saisie ou rectification de notes: TableNotes
                        1. Bonjour,

                          Après votre remarque ("Structure de base de donnees un peu curieuse: ")
                          J'ai revu la structure de ma BD . Je n'ai pas encore terminé, une faite, je mettrai
                          à votre disposition mon petit projet

                          Merci pour votre attention
                          1. Re,

                            Je mets à votre disposition mon petit projet, revu suite à vos conseils.

                            j'aimerai bien que vous y jetiez un coup d'oeil et me dire votre avis.

                            l'Etape prochaine, je tenterai de calculer les cumuls

                            1 : des notes par Etudiant

                            2 : des notes par Etudiant et par matières

                            A plus et Merci pour tout

                            https://www.cjoint.com/?0EyqDrAUsic
                            1. Bonjour,

                              Dans ce que je vous ai mis a dispo, il y a un petit probleme, en faisant le menage du repertoire j'ai supprime la form EditionSaisie que j'ai modifiee avec Nom_Prenom.

                              Dans votre nouveau projet, si le CNE est unique, il doit etre la cle primaire de la table et vous n'avez pas besoin du NOrdre. Par contre il faut qu'a chaque fois vous ayez ce numero avec le nom sinon comment reconnaitre les personnes de meme nom
                              • 1
                              • 2