IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C# & MS SQL Server] Liaison entre une grille et un enregistrement (1 -> n)


Sujet :

C#

  1. #1
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut [C# & MS SQL Server] Liaison entre une grille et un enregistrement (1 -> n)
    Salut
    J'ai créé un formulaire pour qui gére des factures (ajout, suppression, etc.). Le formulaire contient les champs d'entête de la facture et une grille DataGridView qui contient les articles vendus.
    Le probléme se pose quand je créé une nouvelle facture et que je commence immédiatement à remplir les articles vendus dans la grille! Apparemment, le champs de clé primaire utilisé pour lier les enregistrements de la grille sont mises à -1 par la grille au lieu de l'ID de la facture nouvellement créée!
    PS: Si je déclenche la mise à jour des tables dans la base de données et après j'ajoute des enregistrements dans la grille tout se passe très bien! Cependant, l'annulation de la facture n'est plus possible!

    Projet : Visual C# 2008 Express
    DB : MS SQL Server 2005 Express

    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 176
    Points : 25 118
    Points
    25 118
    Par défaut
    pas tout compris

    j'imagine que tes infos d'en tete sont une table et des objets vendus dans une autre (si ce n'est pas le cas c'est étrange ^^)

    et le problème donc c'est que tu ne peux en effet pas ajouter les objets à la base si la facture n'existe pas
    rien d'anormal et il faut en effet créer les infos de factures dans la base avant

    par contre les problèmes que ca engendre du coté de ton appli viennent de ce que tu as codé, et le comportement est modifiable (entre autre le fait que tu ne puisses plus annuler, il suffit de supprimer)

  3. #3
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut Y a-t-il une autre solution?
    Oui c'est ça! Y a deux tables, la table 'facture' qui a une relation de 1 à n avec la table 'article vendu'. Bien évidemment, la dernière table est liée avec la grille... Pour que l'ajout d'articles vendus à la grille se passe sans incidents, je dois mettre à jour (update) la base de données avec la facture nouvellement créée!

    Donc, à ton avie, je dois créer une nouvelle facture, faire une update et remplir à nouveau l'objet TableAdapter avant de laisser la possibilité à l'utilisateur de remplir la grille?!..
    Y a-t-il une autre solution?
    Merci

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 176
    Points : 25 118
    Points
    25 118
    Par défaut
    Citation Envoyé par emmr.rida Voir le message
    Donc, à ton avis, je dois créer une nouvelle facture, faire une update et remplir à nouveau l'objet TableAdapter avant de laisser la possibilité à l'utilisateur de remplir la grille?!..
    c'est pas mal oui
    ca depend de comment il ajoute une ligne, si c'est un bouton, au debut, tu enregistre la facture, et si c'est pas possible tu l'obliges à finir de remplir au dessus
    si c'est direct dans la grille, il te faut intercepter le editmode et l'annuler si c'est pas encore bon pour la facture

    Citation Envoyé par emmr.rida Voir le message
    Y a-t-il une autre solution?
    surement. il y a souvent plein de choses possibles ...

  5. #5
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut Question reformulée!
    Merci sperot51
    Je vais reformuler ma question...
    J'ai deux tables [Facture]1--->N[Article vendu]. J'aimerai bien récupérer la valeur suivante du compteur unique des enregistrements de la table [Facture] pour pouvoir lier les enregistrements 'enfants' de la table [Article vendu] au moment d'ajout par la grille bindée.
    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bsFacture.AddNew();    //Ajout d'une nouvelle facture
    Le champs [FactureID] du DataRow créé est mis à -1 alors qu'il me faut la valeur du compteur unique pour la liaison des enregistrements 'enfant' de la table [Article vendu] avec l'enregistrement 'parent' de la table [Facture]!

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 176
    Points : 25 118
    Points
    25 118
    Par défaut
    s'il te le faut, récupère le (ou fais en sorte qu'il soit récupéré)

  7. #7
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Ouais... Mais comment

  8. #8
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut Probléme résolu!
    Peut être que j'ai pas su bien présenter mon problème mais j'ai pu détecter l'anomalie et la résoudre... Casse tête continu durant une semaine!!!!

    Le problème surgit quand j'ajoute un enregistrement en appelant Facture.AddNew()! Apparemment, cette fonction ajoute l'enregistrement mais quand je vérifies dans la collection dans la table, je trouves pas l'enregistrement que je viens d'ajouter! Comme ça, quand je demande la mise à jour de la table de la base de données après ajout d'enregistrements enfants dans la grille DataGridView, une exception d'enfreint des régles de clés étrangére vient me ploger dans une dépression grave!
    La solution que j'ai trouvée après une semaine d'insupportable malaise et de...
    - Créer un nouvel objet DataRow en appelant DataTable.NewRow()
    - Initialiser le nouvel objet
    - Ajouter le nouvel objet DataRow à la table en appelant DataTable.AddRow(row)
    - Atteindre le dernier enregistrement BindingSource.MoveLast() pour trouver le nouvel enregistrement qu'on vient d'ajouter

    Voici aussi le code pour récupérer le dernier nombre généré en tant qu'identité d'une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SqlCommand sqlCmd = table.Connection.CreateCommand();
    sqlCmd.CommandText = "SELECT IDENT_CURRENT('nom_table') FROM nom_table;";
    sqlCmd.Connection.Open();
    long lIdentity = long.Parse(sqlCmd.ExecuteScalar().ToString());
    Remarque : Ce code ne fonctionne pas si la table 'nom_table' est vide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de liaison entre une requete et un objet...
    Par actibluelevrai dans le forum Access
    Réponses: 4
    Dernier message: 20/11/2005, 20h26
  2. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43
  3. [Sql Server] Fusion d'une date et d'une heure
    Par Invité dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/07/2005, 14h55
  4. [Sql server]Taille d'une requete
    Par kashue dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/04/2005, 16h05
  5. Réponses: 15
    Dernier message: 20/12/2004, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo