DBEdit mise à jour de la base [Résolu]

jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 12 mars 2012 à 14:24 - Dernière réponse : cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention
- 13 mars 2012 à 13:25
Bonjour,

Encore moi, après le DBcomboBox le DBedit !!

J'ai, à la conception, configuré la chaine TSqlconnexion, TSQLQuery, TDataSetProvider, TClientDataSet, TDataSource, TDBedit. La première valeur remonter par TSQlQuery est affiché dans le DBedit.

La requete est "select annee_fab from voiture"

A l'éxécution, dans l'évenement Onclick d'un bouton, j'ai ce code dans le ClientDataset :

if ClientDataset3.State in [dsEdit,dsInsert] then
ClientDataSet3.Post;
ClientDataSet3.ApplyUpdates(-1);

Si je modifie la valeur du DBedit puis je clique sur le bouton j'obtiens ce message d'erreur :
"Update affected more than 1 record"
Je ne comprend pas, pourtant le clientDataSet est sur first et il n'affiche qu'une valeur dans le DbEdit donc c'est cette valeur à mettre à jour ?

Merci pour votre aide.
Jean
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 13 mars 2012 à 12:24
3
Merci
C' est évident!

Tant que tu ne fais pas "ClientDataSet2.Open;", le champ n' existe pas voyons!

Voilà le code correct:

ClientDataSet2.Close;
  DataSetProvider2.UpdateMode := UpWhereKeyOnly;
  SQLQuery2.Close;
  SQLQuery2.SQL.Clear;
  SQLQuery2.SQL.Add('select id_voiture, annee_fab from avion');
  SQLQuery2.Open;



  ClientDataSet2.Open;
  ClientDataSet2.First;

  ClientDataSet2.FindField('id_voiture').ProviderFlags := [pfInKey];

  DBEdit1.DataField:='annee_fab';



Composants Cindy pour Delphi
Faites une donation.

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 12 mars 2012 à 16:12
0
Merci
Salut Jean,

ça veux dire simplement qu' il lui est impossible de faire la mise à jour car il ne sait pas quel enregistrement mettre à jour étant donné que plusieurs enregistrements sont "candidats" à la mise à jour (côté SQL serveur) !

Il faut tout simplement éviter les doublons ou encore créer une clé unique dans la table.

PS: il te manque les connaissances necessaires et tu risques de buter sur ce genre de problèmes tous les jours si tu t' obstines à apprendre sur le tas. Un peu de lecture est plus que conseillé.

A+


Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 13 mars 2012 à 11:03
0
Merci
Bonjour Mauricio,

Pour moi le ClientDataSet avait un pointeur sur l'enregistrement en cours et donc savait quel champs à modifier. Mais effectivement comment peut-il connaître la clé primaire de la table, oups, désolé

J'ai donc chercher comment indiquer la clé primaire. Mais j'ai pas trouvé de champs keyfield ou un truc du genre ??
J'ai fais cela, mais sans grand succes
SQLQuery2.SQL.Add('select id_voiture, annee_fab from voiture');
SQLQuery2.Open;
SQLQuery2.FieldByName('id_voiture').ProviderFlags := [pfInKey];

DataSetProvider2.UpdateMode := UpWhereKeyOnly;


Mais il trouve pas la clé "Unable to find record No key specified"

Jean
Commenter la réponse de jderf
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 13 mars 2012 à 11:12
0
Merci
Salut Jean,

comme tu y es presque et que je suis EXTREMEMENT sympa, double cliques sur le TClientDataset et sélectionne le champ clé "idVoiture".
Maintenant, cherche la propriété ProviderFlags du champ et ajoute l' élément pkInKey.

A+

PS: attention au champ clé qui doit avoir Required à false si c' est un champ AutoInc!




Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 13 mars 2012 à 11:49
0
Merci
Merci Mauricio,

Comme je fais cela par prog, j'ai rien dans le double clic, ce qui est normal.

J'ai donc fais ceci
with ClientDataSet2.FieldDefs.AddFieldDef do begin
DataType := ftInteger;
Attributes := [];
Name := 'id_voiture';
end;

Mais j'ai toujours le même message.

Jean
Commenter la réponse de jderf
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 13 mars 2012 à 11:55
0
Merci
Non,

fais donc plutot comme ça après ouverture du ClientDataset:
ClientDataSet2.FindField('idVoiture').ProviderFlags := [pkInKey];

A+


Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 13 mars 2012 à 12:00
0
Merci
et j'avais oublié

ClientDataSet2.FieldByName('id_avion').ProviderFlags := [pfInKey];
Du coup, j'ai un message: "ClientDataSet2:Field 'id_avion' not found"

Jean
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 13 mars 2012 à 12:08
0
Merci
Arh ! Tu as répondu plus vite que moi.
J'ai testé avec FindField et j'ai un message "Access Violation at adress..."

Je te redonne tous mon code

  ClientDataSet2.Close;

  SQLQuery2.Close;
  SQLQuery2.SQL.Clear;
  SQLQuery2.SQL.Add('select id_voiture, annee_fab from avion');
  SQLQuery2.Open;
  SQLQuery2.FieldByName('id_voiture').ProviderFlags := [pfInKey]; 

  DataSetProvider2.UpdateMode := UpWhereKeyOnly;

  with ClientDataSet2.FieldDefs.AddFieldDef do begin
    DataType := ftInteger;
    Attributes := [];
    Name := 'id_voiture';
  end;
  ClientDataSet2.FindField('id_voiture').ProviderFlags := [pfInKey];

 // ClientDataSet2.FieldByName('id_voiture').ProviderFlags := [pfInKey];

  ClientDataSet2.Open;
  ClientDataSet2.First;

  DBEdit1.DataField:='annee_fab';


Merci encore pour ton aide. J'ai pas trouver de tuto un peu complet pour expliquer comment faire des choses simple en apparence !

Jean
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 13 mars 2012 à 12:55
0
Merci
Désolé, mais j'ai toujours le message "Unable to find record No key specified"
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 13 mars 2012 à 13:11
0
Merci
Bon, j'ai trouvé mais je ne vois pas pourquoi il faut laisser DataSetProvider2.UpdateMode := UpWhereAll;

Merci, beaucoup Mauricio, je vais reprendre tranquillement tous ça pour assimilé un peu.

Jean
Commenter la réponse de jderf
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 13 mars 2012 à 13:25
0
Merci
Salut,

Je t' expliquerai bien pourquoi ça marche d' une façon et pas d' une autre mais j' ai largement répondu à la question posée et en plus, je vais pas écrire tout le manuel de la programation SQL découpé en petits messages: je te conseille de commencer à lire l' aide Delphi qui m' a beaucoup éclairé (regarde l' aide sur les propriétés providerFlags etc ...).

A+

PS: tu as des unités d' aide à la programation mySQL sur le site de mes compos ici:


Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.