Bonjour à tous et bonne année 2008 !
Voici mon problème.
Mon appli développée en VB.NET sous VS2005 se connecte à une base de donnée Access.
J'accède aux données et les modifie via un DataSet, des BindingSource et des TableAdapter générés automatiquement lors de l'insertion de la base dans le projet.
Jusque là, pas de problème, j'arrive à créer des enregistrements simples, à les modifier et à les supprimer.
Or, je souhaite sur une fenêtre de mon application pouvoir créer-modifier-supprimer des enregistrements 'composés' venant de 2 tables différentes.
J'ai donc créé la fenêtre suivante.
Chaque tableau pointe sur le BindingSource correspondant à la bonne table.
Les boutons + permettent d'afficher dans le cadre en haut ou en bas le formulaire d'ajout d'un enregistrement (respectivement pour Parent et Enfant).
Les boutons EDIT permettent d'afficher dans le cadre en haut ou en bas le formulaire de modification d'un enregistrement (respectivement pour Parent et Enfant).
Chaque formulaire possède un bouton OK qui valide dans le DataSet les modifications, et un bouton Annuler qui efface le formulaire sans rien faire au niveau des données.
Les boutons - permettent de supprimer un enregistrement (respectivement pour Parent et Enfant).
Le bouton Annuler permet de ne pas enregistrer les modifications dans la base de données (on refuse les changement)
Le bouton Valider permet d'enregistrer les modifications dans la base de données (on accepte les modifications) et de revenir sur la page principale.
Actuellement, cela fonctionne, mais un cas particulier me fait planter l'appli.
En effet, mes 2 tables sont liées, et donc, un enregistrement ENFANT ne peut être créé que si l'enregistrement PARENT existe déjà.
Or, avec l'incrément automatique d'Access (et d'autres SGBD), si l'on a les enregistrements 1-2-3-4 et que l'on supprime le 4, l'incrément auto reprendra alors à 5 (1-2-3-5 si l'on ajoute un nouvel enregistrement).
----------------------------------------
Voici un exemple de mon problème :
1) Situation initiale :
PARENT :
ID-NOM
1-Youpi
2-Youpla
ENFANT :
ID-NOM-ID_PARENT
1-Boum-1
2-Bim-1
3-Ploum-2
4-Plim-2
2) Je supprime l'enregistrement PARENT d'ID=2 --> J'ai une suppression automatique des enregistrements ENFANT d'ID=3 et ID=4 :
PARENT :
ID-NOM
1-Youpi
ENFANT :
ID-NOM-ID_PARENT
1-Boum-1
2-Bim-1
3.1) Je ne valide pas mon formulaire (pas d'enregistrement en base de données) --> Si je rajoute un enregistrement PARENT puis un enregistrement ENFANT qui lui est rattaché, j'obtiens la situation correcte suivante :
PARENT :
ID-NOM
1-Youpi
3-PloumPloum
ENFANT :
ID-NOM-ID_PARENT
1-Boum-1
2-Bim-1
5-Pim-3
3.2.) En revanche, si je valide mon formulaire (enregistrement en base de données) --> Si je rajoute un enregistrement PARENT puis un enregistrement ENFANT qui lui est rattaché, j'obtiens la situation INCORRECTE suivante :
PARENT :
ID-NOM
1-Youpi
2-PloumPloum
ENFANT :
ID-NOM-ID_PARENT
1-Boum-1
2-Bim-1
3-Pim-2
==> L'auto incrémentation ne se fait plus correctement.
Cela ne pose pas de problème pour la table PARENT car lors de l'update, l'ID sera automatiquement modifié.
Cependant, cela pose un problème pour la table ENFANT car elle référence alors un enregistrement PARENT qui n'existe plus (ID_PARENT=2 au lieu de ID_PARENT=3).
Lors de l'update, j'obtiens donc le message d'erreur OleDbException suivant : "Vous ne pouvez pas ajouter ou modifier un enregistrement car l'enregistrement associé est requis dans la table 'PARENT'."
----------------------------------------
----------------------------------------
Voici le code utilisé (je ne mets pas les paramètres des procédures pour ne pas trop alourdir) :
Private Sub FRM_Load
Me.ENFANTTableAdapter.Fill(Me.MYDATASET.ENFANT)
Me.PARENTTableAdapter.Fill(Me.MYDATASET.PARENT)
End Sub
Private Sub BOUTON_PLUS_Click (La procédure pour la table ENFANT est sur le même modèle)
If Me.MYDATASET.PARENT.Select("NOM='" & Me.TBX_Nom.Text & "'").Length = 0 Then
'Si l'enregistrement n'existe pas déjà, on le crée
Me.MYDATASET.PARENT.AddPARENTRow(Me.TBX_Nom.Text, Me.TBX_Desc.Text)
Else
'Sinon, on prévient
MsgBox("Attention", MsgBoxStyle.Exclamation, "Alerte")
Me.TBX_Nom.Focus()
EndIf
End Sub
Private Sub BOUTON_MOINS_Click (La procédure pour la table ENFANT est sur le même modèle)
If Me.DataGridView_PARENT.SelectedRows.Count <> 1 Then
'Si aucune ligne n'est sélectionnée
MsgBox("Sélectionner une ligne", MsgBoxStyle.Exclamation, "Alerte")
Else
If MsgBox("Sûr?", MsgBoxStyle.YesNo + MsgBoxStyle.Exclamation, "Alerte") = MsgBoxResult.Yes Then
'Définition de l'enregistrement à supprimer
Dim DataToDel As MYDATASET.PARENTRow = MYDATASET.PARENT.FindByID(Me.DGV_PARENT.SelectedRows.Item(0).Cells(0).Value)
'Suppression de l'enregistrement dans le dataset
DataToDel.Delete()
End If
End If
End Sub
Private Sub BOUTON_EDIT_Click (La procédure pour la table ENFANT est sur le même modèle)
'Définition de l'enregistrement à modifier
Dim DataToModif As MYDATASET.PARENTRow = MYDATASET.PARENT.FindByID(Me.DataGridView_PARENT.SelectedRows.Item(0).Cells(0).Value)
If Me.MYDATASET.PARENT.Select("NOM='" & Me.TBX_Nom.Text & "'").Length = 0 Or _
DataToModif.NOM = Me.TBX_Nom.Text Then
'Si l'enregistrement n'existe pas déjà, on le modifie
DataToModif.NOM = Me.TBX_Nom.Text
DataToModif.DESCRIPTION = Me.TBX_Desc.Text
Else
'Sinon, on prévient
MsgBox("Attention", MsgBoxStyle.Exclamation, "Alerte")
Me.TBX_Nom.Focus()
End If
End Sub
Private Sub BOUTON_ANNULER_Click
'Rejet des changements effectués sur le dataset
Me.PNG_ETCreatorDataSet.PARENT.RejectChanges()
Me.PNG_ETCreatorDataSet.ENFANT.RejectChanges()
'Retour à la fenêtre principale
Me.Close()
End Sub
Private Sub BOUTON_VALIDER_Click
'Sauvegarde des changements dans la base de données
Me.PARENTTableAdapter.Update(Me.MYDATASET)
Me.ENFANTTableAdapter.Update(Me.MYDATASET)
'Retour à la fenêtre principale
Me.Close()
End Sub
----------------------------------------
==> Auriez-vous des idées pour que mes ID dans mon DataSet s'incrémentent correctement ?
Merci d'avance !
Partager