none
Problem Avec les Update RRS feed

  • Question

  • Bonjour- je trouve des difficultés énormes pour enregistrer les donnes dans ma base Ms Acces à partir d'un dataset  en  VB.net - je m'explique jai une BD qui contient 2 table: "patient" et "Consult" relié par un cléf unique et autoincrémentée  qu'est N_Doss (l'Id) de patient -connecter la base et créez les dataset ne pose pas problme (en mode assistant) - je cree 2 form le premier reçoit les données de la table Patient (des textbox et un datagridview)  le deuxième reçoit les donnes de consult (idem  des textbox et un datagridview)- je fait la liaison par un simple bouton - ce que je veut faire c'est de rajouter pour chaque Enregistrement de patient un enregistrement dans table cons en utilisant N_doss - le problem c'est que la valeur de N_doss dans le form père est négative (autoincrémentation du dataset). je suis obligé de fermer le form pourque le nouveau ID (N_doss) se mette à jour- sinon l'ouverture du form enfant affiche la valeur négative de l'ID et l'enrteguistremnt est impossible- voici mon code sur le bouton - je précise que je débute - mais alors je débute avec VB et le Code En génréal!!  merci d'avance:-) ))))



    mardi 12 mai 2015 15:43

Réponses

  • Bonsoir,

    Le résultat de mes tests...
    J'ai fais une application basique avec Visual studio 2013
    Je déclare une source de données.

    Ensuite je fais un glisser-coller de la source sur le formulaire. visual Studio créé un gridview et un Navigator bindingsource.

    Voici ce que cela donne:

    Lorsque j'ajoute un enregistrement la première cellule qui est un compteur automatique est bien à -1.

    Pour enregistrer vers la base de données il suffit de cliquer sur le dernier bouton du bindingnavigator (la disquette).

    Dans l'évènement déclenché par ce clic j'ai copié une ligne.

    public partial class Form1 : Form
    {
      public Form1()
      {
         InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
         // TODO: cette ligne de code charge les données dans la table 'gBgestionDataSet.Client'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
         this.clientTableAdapter.Fill(this.gBgestionDataSet.Client); //Ligne à copier...
      }

      private void clientBindingNavigatorSaveItem_Click(object sender, EventArgs e)
      {
         this.Validate();
         this.clientBindingSource.EndEdit();
         this.tableAdapterManager.UpdateAll(this.gBgestionDataSet);
         //Ligne suivant a été copiée de Form1_Load...
         this.clientTableAdapter.Fill(this.gBgestionDataSet.Client);
      }

    La DB et le DS se mettent à jour...

    Cordialement
    Gérard

    • Proposé comme réponse GP79 mercredi 13 mai 2015 19:40
    • Marqué comme réponse MostMaster mercredi 13 mai 2015 20:14
    mercredi 13 mai 2015 19:39

Toutes les réponses

  • Bonsoir,
    Lorsque vous enregistrez un nouveau patient, la table du Dataset ne contient pas l'identifiant incrémenté par la base de données, effectivement, celui ci reste à -1. Vous devez recharger la table des patients (sans fermer le formulaire), récupérer l'id du patient et l'utiliser pour la table des consultations. (En fait, fermer et réouvrir le formulaire revient à recharger la table des patients... avec les bons ID)

    Cordialement
    Gérard

    mardi 12 mai 2015 15:52
  • Merci Gérard d'avoir répondu Si Rapidement-

    Comment faire Pour recharger la table ?
    mardi 12 mai 2015 17:18
  • je pense à fill .. on va voir
    mardi 12 mai 2015 18:16
  • Bonjour,

    Je crois que ceci (à adapter) devrait faire l'affaire :

    Dim rs as DAO.Recordset

    CurrentDB.Execute ("INSERT INTO .....")
    Set rs = CurrentDB.OpenRecordset("SELECT @@IDENTITY")

    If Not rs.EOF Then
     MsgBox rs.Fields(0)
    Else
     MsgBox "No AutoNumber generated."
    End If

    rs.Close()


    Jacques
    Si la réponse vous satisfait, n'oubliez pas de la proposer comme réponse. Merci

    mardi 12 mai 2015 21:48
  • BONSOIR Jaques et MERCI D'AVOIR RÉPONDU-

    IL ME SEMBLE QUE VOUS UTILISEZ LA SYNTAXE DE ADO  (VOUS EVOQUEZ RECORDSET)  -EST  t ' iL toujours POSSIBLE DE L'UTILISER DANS ADO.NET ?)-

    Merci encore une fois 

    mardi 12 mai 2015 22:10
  • Bonjour,

    Non, c'est juste le principe qu'il faut traduire en vb net. :-)

    Cela permet de récupérer le dernier ID créé.

     Dim cmdInsert As New OleDbCommand
     cmdInsert.Connection = ObjetConnection
     cmdInsert.CommandText = strSQL
     cmdInsert.ExecuteNonQuery()


    Jacques
    Si la réponse vous satisfait, n'oubliez pas de la proposer comme réponse. Merci


    mardi 12 mai 2015 22:24
  • Bonjour,
    Vous devriez montrer une partie de votre code pour vous répondre plus précisément.
    Gérard

    mercredi 13 mai 2015 07:10
  • Bonjour

    voila un aperçu ( ne vous cassez pas la tête avec la qualité car c'est un projet d'apprentissage donc se sont des Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click essais que je fait )

       '-->updat
            Me.Validate()
            Me.PatientBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.BDMDataSet)
       '--> rechargement du DS
            Me.ConsultTableAdapter.Fill(Me.BDMDataSet.Consult)
            Me.PatientTableAdapter.Fill(Me.BDMDataSet.Patient)
            Form2.Show()
            Form2.PatientBindingSource.AddNew()
            NomTextBox.Text = Me.NomTextBox.Text
            PrenomTextBox.Text = Me.PrenomTextBox.Text

    End Sub

    Fermer et rouvrir le Form  est une solution non élégante - en rechargeant le DS avec la methode Fill ne semble pas régler le problème  des suggestion?

    Merci pour tous

    mercredi 13 mai 2015 12:34
  • En fait j'utilise rarement les bindingsource, je vous réponds demain.

    Gérard

    mercredi 13 mai 2015 14:44
  • Merci Gerard.. entre temps je bricolerai un peu  :_) )) merci 
    mercredi 13 mai 2015 16:08
  • Bonsoir,

    Le résultat de mes tests...
    J'ai fais une application basique avec Visual studio 2013
    Je déclare une source de données.

    Ensuite je fais un glisser-coller de la source sur le formulaire. visual Studio créé un gridview et un Navigator bindingsource.

    Voici ce que cela donne:

    Lorsque j'ajoute un enregistrement la première cellule qui est un compteur automatique est bien à -1.

    Pour enregistrer vers la base de données il suffit de cliquer sur le dernier bouton du bindingnavigator (la disquette).

    Dans l'évènement déclenché par ce clic j'ai copié une ligne.

    public partial class Form1 : Form
    {
      public Form1()
      {
         InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
         // TODO: cette ligne de code charge les données dans la table 'gBgestionDataSet.Client'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
         this.clientTableAdapter.Fill(this.gBgestionDataSet.Client); //Ligne à copier...
      }

      private void clientBindingNavigatorSaveItem_Click(object sender, EventArgs e)
      {
         this.Validate();
         this.clientBindingSource.EndEdit();
         this.tableAdapterManager.UpdateAll(this.gBgestionDataSet);
         //Ligne suivant a été copiée de Form1_Load...
         this.clientTableAdapter.Fill(this.gBgestionDataSet.Client);
      }

    La DB et le DS se mettent à jour...

    Cordialement
    Gérard

    • Proposé comme réponse GP79 mercredi 13 mai 2015 19:40
    • Marqué comme réponse MostMaster mercredi 13 mai 2015 20:14
    mercredi 13 mai 2015 19:39
  • Bingo !!!!!

    ça Marche Maintenant avec un projet clean--

    Mon erreur était de trop compliquer le code au point de tout brouiller 

    Effectivement et ça parait logique : il faut charger les données à partir de la BD jusqu'au Dataset- une fois les modifs faites et  enregistrement fait la BD est mise à jour il faut reconvoquer les donnes par une méthode fill sur le binding source. pour que notrer DAtaset affiche les nouvelles modification (et donc les Id positif).

    merci beaucoup Gérard - Bon Point

    mercredi 13 mai 2015 20:28