Incrémentation automatique

[Résolu]
Signaler
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008
-
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008
-
Bonjour,

J'ai une form maître/détail avec une textbox numéro de facture qui est "binder" avec une tableadapater.
Comment faire pour incrémenter automatique le numéro lorsque j'ajoute un enregistrement

Merci pour votre aide

7 réponses

Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Je sais pas si va servir mais j'ai trouvé voilà ce que je fait pour ne plus avoir l'erreur

this.fATICBindingSource.EndEdit();  J'ajoute cette ligne avant l'appel de ma form de sélection pour ne plus avoir l'erreur

frmSelectPrestation FormSelPrestation = newfrmSelectPrestation();
FormSelPrestation.MdiParent = this.MdiParent;
FormSelPrestation.SelectPrestation += newfrmSelectPrestation.SelectPrestationEventHandler(FormSelPrestation_SelectPrestation);

FormSelPrestation.Show();
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Salut,

En fait, je pense qu'il faut plutot voir ca au niveau de ton DataTable, et plus précisement du DataColumn en question.
Tu dois avoir une propriété AutoIncrementa mettre a true;



Mx
MVP C#
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Salut,

Merci pour ta réponse, mais la propriété AutoIncrement est déjà à True.
En fait, j'alimente mon détail (datagridview par une liste), pour la première tout va bien mais ensuite j'ai une exeception sur la clé étrangère car mon numéro de facture n'est incrémenté.


foreach (cSelectArticle
ListDataRow
in
listArticle)


{



MonDataSet.
GSARTRow Article = (
MonDataSet.
GSARTRow)
this.gsartTableAdapter1.GetDataByCode(ListDataRow.Gsart_cod).Rows[0];



decimal montantTtc = Article.GSART_PRXVEN * ListDataRow.Gsart_qte;



int index = ExistProduit(ListDataRow.Gsart_cod);



if (index == -1)


{




fADTIBindingSource1.AddNew();


index = fADTIBindingSource1.Position;


}


fADTIDataGridView.Rows[index].Cells[
"FAART_COD"].Value = ListDataRow.Gsart_cod;


fADTIDataGridView.Rows[index].Cells[
"FAART_REF"].Value = Article.GSART_REF;


fADTIDataGridView.Rows[index].Cells[
"FADTI_QTE"].Value = ListDataRow.Gsart_qte;


fADTIDataGridView.Rows[index].Cells[
"FADTI_TYP"].Value =
"A";


fADTIDataGridView.Rows[index].Cells[
"FADTI_PRX"].Value = Article.GSART_PRXVEN;


fADTIDataGridView.Rows[index].Cells[
"FADTI_MNTTTC"].Value = montantTtc;


fADTIDataGridView.Refresh();


}

Lors du deuxième AddNew() j'ai l'erreur suivante :
InvalidConstraintExecption "ForeignKeyConstraint FK_FATIC_FADTI a besoin des valeurs de clé enfant (0) dans la table parente."

Merci
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Salut,

Un peu dur de voir le probleme comme ca. Tu es sur que c'est un probleme d'autoincrement ?
Ca ressemble plus a un probleme de clé etrangere qui n'existe pas et qui te pose donc probleme a cause de la contrainte d'integrité.
Je pense que si le probleme venait de la clé qui ne s'incremente pas, il te jeterait plutot parce que tu as un doublon.

D'ailleurs, y'a u truc que j'ai pas compris, tu essaies d'incrementer le numéro pour chaque ligne de ta facture ?

Enfin, la je te cache pas que c'est assez flou pour moi



Mx
MVP C#
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Salut,

C'est vrai que en relisant c'est pas très clair.
Je vais reexpliquer :
J'ai une form avec une partie maître (l'entête de ma facture) composé de champ (textbox,...) et une partie détail composé d'un datagridview
Il existe un relation entre mon entête et le détail (avec une contrainte de clé étrangère sur le détail)
Quand je creer une nouvelle facture
Je créer l'entête avec :
this.fATICBinginsource.Addnew() avec FATIC correspondant à l'entête de la facture.

Puis après sélection des articles (par une autre form) j'alimente le datagridview avec le code décrit dans mon dernier post. (où FADTI correspond au détail de la facture)

Lorsque je fait un Addnew sur FADTI (détail), il me met une erreur car je pense qu'il n'a pas encore incrémenter le numéro de facture de l'entête.

Voilà, j'espère que c'est un peu plus clair

Merci
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Salut,

Oui c'est plus clair ainsi :)
On va resumer et voir ce qui peut causer le plantage

Le AddNew sur l'entete de la facture marche. Donc a priori, tu as un numéro de facture bien incrémenté, c'est ca ? Tu as essayé de voir quelle etait la valeur prise par ce numéro ? et si tu ajoutes encore une facture, le n° est-il encore bon (bien incrementé) ?

On passe au detail :
A l'ajout d'une ligne dans le detail, ca plante, c'est ca ? Et a ce que j'ai compris, il te dit que le n° de facture pour une ligne n'existe pas dans la table maitre (j'ai pris comme hypothese que ton n° de facture etait ta clé etrangere).
As-tu verifié quelle valeur prenait cette clé? Normalement, il n'y a plus d'histoire d'incrementation a ce niveau la, puiqu'elle se faisait dans l'entete. Les lignes de ton detail doivent avoir le meme numéro de facture que leur entete.

Autre petite question, as tu essayé en appliquant la méthode SetParentRow() a tes DataRow de detail, en lui indiquant en parametre la Row parente ?



Mx
MVP C#
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Salut,

Le Addnew() marche mais le numéro de facture n'est pas incrémenté, le champ textbox binder au numéro de facture prend 0 comme valeur (ce qui me laisse penser que la valeur n'est pas incrémenter et c'est ce qui pose problème).

En fait, ce que j'ai pas dit, c'est que si l'entête existe déjà, je peux ajouter des lignes de détail sans problème avec le même code que j'ai mis dans le poste plus haut.

Je sais plus trop quoi faire...