Base de données à deux tables

Bonjour les amis,

Je travaille dans un environnement de VB6 lié à MS Access 2003, avec la méthode d'appel SQL ( Microsoft.Jet.OLEDB.4.0)

J'ai tenté de travaillé avec deux Tables dans une seule Base de données, mais au bout du chemin, je me suis trouvé bloqué.

Dans une table, j'ai enregistré les données personnelles de l'employé : ( Nom, Prénom, Carte d'identité, n° du sécurité sociale, Qualification, poste, la date d'entrée, et le Matricule, avec comme clé le n° de la carte d'identité )

Dans la deuxième table, je voulais enregistré les heures du travail ( l'année, département, la journée, l'heure d'entrée , heure de sortie, le nombre des heures supplémentaires, le cumul des heures ) Aucune clé n'a été spécifiée pour cette deuxième table.

Je vous demande si vous pourriez me montrer comment je dois travailler dans le cas de Deux tables dans une seule base de données, de façon que si je supprime les données du Pointage ( c'est à dire les données enregistrées dans la deuxième table, les données enregistrées dans la première table restent intactes)

Merci d'avance

26 réponses

Résumé de la discussion

Problématique centrale : dans un projet VB6 avec MS Access 2003, comment structurer deux tables liées pour que la suppression des enregistrements du pointage n’affecte pas les données des employés. Pour cela, créer une clé primaire dans la table des employés (par exemple le numéro de carte d'identité) et une clé étrangère dans Pointage qui référence cette clé, avec une contrainte d'intégrité référentielle. Désactiver le cascade delete évite que la suppression d'un enregistrement de pointage entraîne la suppression des données de l’employé; on peut aussi prévoir un identifiant unique pour chaque ligne. En pratique, veillez aussi à donner un identifiant unique à chaque enregistrement de pointage et à indexer les champs de recherche, ce qui optimise les requêtes et le reporting.

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

    il me semble que le n°de carte d'identite change si vous la renouveler, donc peut pas etre une cle. Le matricule, normalement ne change pas, peut etre une cle.

    Il faut ajouter cette cle a votre deuxieme table pour faire un lien entre la table une et deux.

    Vous pouvez effacer les donnees de la table deux sans que les donnees de la table une soient affectees.

    requete sql du genre:

    delete * from table2 where matricule=ce_matricule

    Dans votre application, il faudra penser au compactage de votre base de donnees.
    Quand vous supprimez des enregistrements, vous ne les voyez plus mais ils occupent toujours l'espace dans la base. Si vous faites cette operation souvent ou a plus ou moins long terme votre base grossi et cela ralenti les recherches.

    Bon courage
    1. Bonjour l'Ami,
      j'aimerai bien vous envoyer mon projet d'application, pour vous permettre de la repasser et corriger mes erreurs, mais je ne sais pas comment.
      Si il y a une solution, dites la moi. Franchement, je n'arrive pas à débloquer la situation

      Merci d'avance
      1. Bonjour l'ami,

        j'ai cliquer sur le lien htpp//www.joint.com/mais je sais pas comment télécharger le projet entier.
        Fichier par fichier sûrement ne marchera pas.

        expliquez moi plus pour pouvoir vous envoyer mon petit projet

        A plus
        1. Bonjour l'Ami,

          en attendant, j'aimerai vous expliquer mon problème actuel.

          Dans ma conception du projet j'ai élaboré :
          1- Une feuille pour la saisie
          2- une feuille pour la recherche par : matricule
          nom
          prénom

          une feuille de consultation avec une DataGrid, une fois la case du matricule sélectionnée, une feuille de modification avec les données de la ligne sélectionnées apparaissent, et la feuille de consultation disparaît

          le problème est toujours les données d'une seule ligne qui apparaissent, même si une autre ligne qui a été sélectionnée.

          Je mets à votre appréciation mes codes écris sur les feuilles :

          1- De Recherche
          2- De Consultation
          3- De Modification

          Sur la feuille de la Recherche

          Private Sub Form_Load()
          
          On Error Resume Next
          
          FConsultDonnees.Adodc1.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" & App.Path & "\BDMezgani3.mdb; Persist security info = false"
          
          SQLs = " select * from TableauInfo"
          
          FConsultDonnees.Adodc1.RecordSource = SQLs
          
          Set FConsultDonnees.DataGrid1.DataSource = FConsultDonnees.Adodc1
          
          FConsultDonnees.DataGrid1.AllowAddNew = False
          FConsultDonnees.DataGrid1.AllowUpdate = False
          
          
          
          
          FConsultDonnees.lblCpteur.Caption = "Le nombre des enregistrements :" & "     " & FConsultDonnees.Adodc1.Recordset.RecordCount & "     " & "Personnes"
          FConsultDonnees.Adodc1.Refresh
          
          
          
          FConsultDonnees.DataGrid1.Columns.Item(0).Button = True
          
          
          
          
          End Sub


          Sur la feuille de Recherche

          Private Sub TNom_Change()
          If TMatricule = "" And TNom = ""  Then
          
          SQLs = " Select * from TableauInfo"
          FConsultDonnees.Adodc1.RecordSource = SQLs
          FConsultDonnees.Adodc1.Refresh
          
          FConsultDonnees.lblCpteur.Caption = "Le nombre des enregistrements :" & FConsultDonnees.Adodc1.Recordset.RecordCount & "     " & "Personnes"
          
          Exit Sub
          End If
          
          SQLs = "Select * from TableauInfo " & " where MATRICULE like '" & TMatricule & "%' and NOM like '" & TNom & "%' "
          
          FConsultDonnees.Adodc1.RecordSource = SQLs
          FConsultDonnees.Adodc1.Refresh
          
          FConsultDonnees.lblCpteur.Caption = "Le nombre des enregistrements :" & FConsultDonnees.Adodc1.Recordset.RecordCount & "     " & "Personnes"
          FConsultDonnees.Adodc1.Refresh
          
          
          FConsultDonnees.DataGrid1.Columns.Item(0).Button = True
          
          FConsultDonnees.Show
          Unload Me
          
          End Sub
          


          Sur la feuille de Consultation

          Private Sub DataGrid1_ButtonClick(ByVal ColIndex As Integer)
          On Error GoTo xxx
          
          Select Case ColIndex
          Case 0
          SQLs = " Select * from TableauInfo where CIN = '" & DataGrid1.Text & "'"
          End Select
          
          FModifRensi.Show
          Unload Me
          
          
          xxx:
          
          End Sub


          Sur la feuille de Consultation

          Private Sub Form_Load()
          
          lblCpteur.Caption = "Le nombre des enregistrements :" & "    " & Adodc1.Recordset.RecordCount & "    " & "Personnes"
          Adodc1.Refresh
          
          
          End Sub


          Sur la feuille de Modification

          Private Sub Form_Load()
          
          PoolConnection
          
          SQLs = "select * from TableauInfo"
          
          If RS.State = adStateOpen Then RS.Close
          RS.Open SQLs, DB, adOpenKeyset, adLockPessimistic
          
          FillData
          
          
          End Sub


          Sur la feuille de modification

          Sub FillData()
          
          On Error Resume Next
          
          If Not IsNull(RS![MATRICULE]) Then TMatricule = RS![MATRICULE]
          If Not IsNull(RS![NOM]) Then TNom = RS![NOM]
          If Not IsNull(RS![PRENOM]) Then TPrenom = RS![PRENOM]
          If Not IsNull(RS![CIN]) Then TCin = RS![CIN]
          
          CIN = TCin
          
          If Not IsNull(RS![ADRESSE]) Then TAdresse = RS![ADRESSE]
          If Not IsNull(RS![TELEPHONE]) Then TTel = RS![TELEPHONE]
          If Not IsNull(RS![EMAIL]) Then TEmail = RS![EMAIL]
          If Not IsNull(RS![DNAISSANCE]) Then TDNaissance = RS![DNAISSANCE]
          If Not IsNull(RS![LNAISSANCE]) Then TLNaissance = RS![LNAISSANCE]
          If Not IsNull(RS![SEXE]) Then TSexe = RS![SEXE]
          If Not IsNull(RS![NATIONALITE]) Then TNationalite = RS![NATIONALITE]
          If Not IsNull(RS![SFAMILIALE]) Then TSFamiliale = RS![SFAMILIALE]
          If Not IsNull(RS![NENFANT]) Then TNEnfant = RS![NENFANT]
          If Not IsNull(RS![CNSS]) Then TCnss = RS![CNSS]
          If Not IsNull(RS![NINSTRUCTION]) Then TNInstruction = RS![NINSTRUCTION]
          If Not IsNull(RS![QUALIFICATION]) Then TQualification = RS![QUALIFICATION]
          If Not IsNull(RS![DEPARTEMENT]) Then TDepart = RS![DEPARTEMENT]
          If Not IsNull(RS![POSTE]) Then TPoste = RS![POSTE]
          If Not IsNull(RS![DENTREE]) Then TDateEntree = RS![DENTREE]
          'If Not IsNull(RS![DSORTIE]) Then RS![DSORTIE] = TDateSortie
          
          
          
          End Sub


          Sur la feuille de Modification ( commande de Modification )

          Private Sub cmdModifier_Click()
          Dim Reponse As String
          Dim Reponse2 As String
          
          Reponse2 = MsgBox("Cette personne est elle sortante ?", vbCritical + vbQuestion + vbYesNo, "Alors ! Quoi ?")
          
          If Reponse2 = vbYes Then
          
                   TDSortie.SetFocus
          Exit Sub
          End If
          
          
          If Not TDSortie = "" Then
          
          
          GoTo oKS:
          
          Else
          
          
          Reponse2 = True
          
          End If
          
          
          
          
          If CIN = TCin Then
          End If
          
          
          SQLs = "select * from TableauInfo where CIN ='" & TCin & "'"
          
          If Rss.State = adStateOpen Then Rss.Close
          Rss.Open SQLs, DB, adOpenKeyset, adLockPessimistic
          
          
          If Rss.EOF Then
           
            MsgBox "Ce numéro existe déjà", vbCritical + vbMsgBoxRight, "Erreur"
            
          Else
          
          
           GoTo Dont_Check
          Exit Sub
          End If
          
          
          oKS:
          '------------
          Dont_Check:
          
          
          Reponse = MsgBox("Etes vous sûr de vouloir modifier ces données ?", vbCritical + vbExclamation + vbYesNo, "Alors quoi ?")
          
          If Reponse = vbYes Then
          
          'RS.AddNew
          
          If Not TMatricule = "" Then RS![MATRICULE] = TMatricule
          If Not TNom = "" Then RS![NOM] = TNom
          If Not TPrenom = "" Then RS![PRENOM] = TPrenom
          If Not TCin = "" Then RS![CIN] = TCin
          If Not TAdresse = "" Then RS![ADRESSE] = TAdresse
          If Not TTel = "" Then RS![TELEPHONE] = TTel
          If Not TEmail = "" Then RS![EMAIL] = TEmail
          If Not TDNaissance = "" Then RS![DNAISSANCE] = TDNaissance
          If Not TLNaissance = "" Then RS![LNAISSANCE] = TLNaissance
          If Not TSexe = "" Then RS![SEXE] = TSexe
          If Not TNationalite = "" Then RS![NATIONALITE] = TNationalite
          If Not TSFamiliale = "" Then RS![SFAMILIALE] = TSFamiliale
          If Not TNEnfant = "" Then RS![NENFANT] = TNEnfant
          If Not TCnss = "" Then RS![CNSS] = TCnss
          If Not TNInstruction = "" Then RS![NINSTRUCTION] = TNInstruction
          If Not TQualification = "" Then RS![QUALIFICATION] = TQualification
          If Not TDepart = "" Then RS![DEPARTEMENT] = TDepart
          If Not TPoste = "" Then RS![POSTE] = TPoste
          If Not TDateEntree = "" Then RS![DENTREE] = TDateEntree
          'If Not TDateSortie = "" Then RS![DSORTIE] = TDateSortie
          
          
          RS.Update
          
          MsgBox "Les données sont modifiées", vbCritical + vbInformation, "Enregistrement des données"
          
          Else
          
          FRecherche.Show
          Unload Me
          
          Exit Sub
          End If
          
          TMatricule = ""
          TNom = ""
          TPrenom = ""
          TCin = ""
          TAdresse = ""
          TTel = ""
          TEmail = ""
          TDNaissance = ""
          TLNaissance = ""
          TSexe = ""
          TNationalite = ""
          TSFamiliale = ""
          TNEnfant = ""
          TCnss = ""
          TNInstruction = ""
          TQualification = ""
          TDepart = ""
          TPoste = ""
          TDateEntree = ""
          'TDateSortie = ""
          
          FConsultDonnees.Show
          Unload Me
          
          
          End Sub


          Sur la feuille de modification ( commande de suprimer )

          Private Sub cmdSupprimer_Click()
          Dim Reponse1 As String
          
          SQLs = " Select * from TableauInfo where CIN='" & TCin & "'"
          
          If Rss.State = adStateOpen Then Rss.Close
          Rss.Open SQLs, DB, adOpenKeyset, adLockPessimistic
          
          Reponse1 = MsgBox("Etes vous sûr de vouloir supprimer ces données ?", vbCritical + vbQuestion + vbYesNo, "Alors ! quoi ? ")
          
          If Reponse1 = vbYes Then
          
          If Not TMatricule = "" Then RS![MATRICULE] = TMatricule
          If Not TNom = "" Then RS![NOM] = TNom
          If Not TPrenom = "" Then RS![PRENOM] = TPrenom
          If Not TCin = "" Then RS![CIN] = TCin
          If Not TAdresse = "" Then RS![ADRESSE] = TAdresse
          If Not TTel = "" Then RS![TELEPHONE] = TTel
          If Not TEmail = "" Then RS![EMAIL] = TEmail
          If Not TDNaissance = "" Then RS![DNAISSANCE] = TDNaissance
          If Not TLNaissance = "" Then RS![LNAISSANCE] = TLNaissance
          If Not TSexe = "" Then RS![SEXE] = TSexe
          If Not TNationalite = "" Then RS![NATIONALITE] = TNationalite
          If Not TSFamiliale = "" Then RS![SFAMILIALE] = TSFamiliale
          If Not TNEnfant = "" Then RS![NENFANT] = TNEnfant
          If Not TCnss = "" Then RS![CNSS] = TCnss
          If Not TNInstruction = "" Then RS![NINSTRUCTION] = TNInstruction
          If Not TQualification = "" Then RS![QUALIFICATION] = TQualification
          If Not TDepart = "" Then RS![DEPARTEMENT] = TDepart
          If Not TPoste = "" Then RS![POSTE] = TPoste
          If Not TDateEntree = "" Then RS![DENTREE] = TDateEntree
          'If Not TDateSortie = "" Then RS![DSORTIE] = TDateSortie
          
          
          RS.Delete
          
          MsgBox "Les données sont supprimées", vbCritical + vbInformation, "Suppression des données"
          
          FConsultDonnees.Show
          Unload Me
          
          
          End If
          
          End Sub
          


          Merci d'avance de toute correction, et pour toute remarque, et aussi pour toute critique

          A plus
          1. Bonjour,

            Pour votre projet a mettre a dispositon, mettez la base dans le meme repertoire et compresse le repertoire de votre projet. Ensuite ci-joint.com et selectionnez le .zip du repertoire.

            En attendant, je recupere votre code.

            A+
            1. Re,

              Adodc1 de FConsultDonnees: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Visual Studio\VB98\ProjetAgafruit3\BDMezgani3.mdb;Persist Security Info=False

              DataSource a revoir, mettre le repertoire de la base, car si le pc ou vous installerez votre appli n'a pas le VB6, cela ne marchera pas.

              Idem pour Adodc1 de FConsultPointage

              Je continue a tester.

              A+
              1. Bonjour l'ami,

                Si je la termine d'ici la fin de cette semaine se sera mieux
                j'aimerai aussi avoir votre opinion,

                merci d'avance
                1. Bonjour,

                  Si je la termine d'ici la fin de cette semaine c'est pas gagne votre affaire, car il y a beaucoup de travail a faire
                  1. Bonjour l'Ami,

                    Sincèrement, je ne savais pas que mon affaire est si compliquée.
                    Je crois que j'ai trop déconné.

                    Merci quand même pour votre attention,
                    je te suis reconnaissant

                    Bon courage
                    1. Re,

                      Ce n'est pas complique pour celui qui sait faire, mais pour vous ce n'est pas vraiment le cas.
                      1. Re,

                        je l'admis; dans mon cas ce n'est pas donné. Il me faut beaucoup d'exrcices

                        a plus l'ami
                        1. Bonjour l'Ami,

                          Quoi de neuf ?

                          J'espère que les choses avancent pour le mieux

                          A plus
                          1. Bonjour,

                            J'ai regarde votre fichier, pour ce qui est des recherches, rien ne peut marcher. Votre code est assez evolue mais pas place correctement. La recherche doit se faire avec quoi ???? Un element (matricule ou nom) ou tous ce que vous avez mis
                            Il faudrait un bouton de validation de depart de recherche car c'est en lisant le code que nous decouvrons comment ca marche. Meme chose pour la fiche de renseignement
                            Tables: TableauPointage---->comment faites vous le lien entre une personne, la campagne et ses horaires
                            1. Bonjour l'Ami,

                              En ce qui concerne la recherche, je voulais laisser le choix à l'opérateur, ou il cherche par Matricule ou par le nom.

                              concernant le lien entre la personne, la campagne et ses heures de pointage, à mon avis le lien serait une clé, mais je n'arrive pas à fixer une clée avec deux tableaux dans une même base de données.

                              Un point à ne pas oublier, je ne connais pas assez le jargon des programmeurs. Je ne suis qu'un débutant

                              A plus
                              1. Bonjour,

                                je ne connais pas assez le jargon des programmeurs qui vous a demande de faire cette appli vb6, que connaissez-vous en programmation ???
                                • 1
                                • 2