epeichette
Messages postés5Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 6 octobre 2006
-
29 sept. 2006 à 16:16
epeichette
Messages postés5Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 6 octobre 2006
-
6 oct. 2006 à 09:03
Bonjour,
Je souhaite effectuer une opération
très simple : Mettre à jour les données d'un champ d'un
enregistrement.
Je lis dans une table Paradox des infos qui sont ensuite
enregistrées dans une table MySQL.
L'accès à la base de données MySQL se fait
par ODBC et la table en question est déclarée en TADOTable.
L'accès à la base
de données Paradox se fait par BDE et la table en question est déclarée en
TTable.
Voici mon source :
(Toutes les déclarations sont correctement
faites)
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
Table001.First;
while not Table001.Eof do
begin
notices.Append;
notices.Fields[1].AsString := Table002.Fields[3].AsString;
...
notices.Post;
id_notice := notices.fields[0].AsInteger;
... xtmp_ved est initialisée ...
if notices.Locate('ID_Notice', id_notice, [loCaseInsensitive]) then
begin
notices.Edit;
notices.Fields[8].AsString := IntToStr(xtmp_ved);
notices.Post;
end;
...
Table001.Next;
end;
<!-- END TEMPLATE: bbcode_code -->
Et voilà l'erreur
obtenue :
<!-- BEGIN TEMPLATE: bbcode_quote -->
Citation:
La
ligne n'a pas pu être trouvée pour la mise à jour. Certaines valeurs ont peut
être changé depuis leur dernière lecture.
<!-- END TEMPLATE: bbcode_quote -->
L'erreur
est obtenue après que 2 ou 3 enregistrements soient correctement traités. La
partie APPEND fonctionne parfaitement bien. C'est le EDIT qui semble être
problématique (en gras). Il semble que ce soit un problème de positionnement
mais bon....
Merci par avance pour l'aide que vous pourrez
m'apporter.
epeichette
Messages postés5Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 6 octobre 2006 6 oct. 2006 à 09:03
Bonjour,
J'ai fait comme vous me l'avez recommander c'est à dire un append avec un post à la fin sans edit. Et je génère maintenant mon ID_Notice avec une incrémentation en fin de boucle. Je n'est donc plus besoin d'aller le rechercher dans la table.
Ca marche très bien comme cela
cs_pers
Messages postés38Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention 9 décembre 2009 2 oct. 2006 à 11:45
selon moi du fait que tu travailles avec le table.EOf et en même temps des append sur la même table peut poser des problèmes. Ton edit devrait se situer dans une autre boucle...
epeichette
Messages postés5Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 6 octobre 2006 4 oct. 2006 à 15:33
Bonjour,
excuse moi, mon silence vient du fait que j'était occupé sur un autre projet ces jours-ci. En fait je reprend le travail d'un collègue et je débute en delphi.
Donc dans cette boucle T001.of en plus d'alimenter ma table Notices, j'alimente d'autres tables à partir de mon ID_Notice qui vient d'être enregistré et notament une table vedette, qui me donne de nouvelles informations pour mettre à jour mon enregistrement de Notices que j'ai créé plus haut. Je ne vois pas comment je pourrai faire autrement que de faire la mise à jours de l'enregistrement dans la boucle : pour traiter vedette il faut que je connaisse l'ID_Notice en cours et donc que j'ai fait mon enregistrement dans Notices et je ne peux pas traiter le champs 8 de Notices sans être passer par mon algo de vedette. Je tourne donc en rond...
Maintenant il existe peut être une autre méthode delphi pour faire ce que je veux. J'ai essayé de faire la mise à jour de ma table Notices avec une requête sql mais cela prend vraiment trop de temps.
Si quelqu'un peut m'expliquer une alternative, j'en serais ravie
Vous n’avez pas trouvé la réponse que vous recherchez ?
retaks666
Messages postés286Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention16 juillet 2007 4 oct. 2006 à 15:52
Tu fais un:
id_notice := notices.fields[0].AsInteger;
...
notices.Locate('ID_Notice', id_notice, [loCaseInsensitive]) then
Mais logiquement, tu n'as pas changé de ligne, a moins que si dans la partie de ton code que tu n'as pas affiché. Si tu n'as pas fait d'autres insértion entre temps, pourquoi ne pas essayer quelque chose comme:
Table001.First;
while not Table001.Eof do
begin
notices.Append;
notices.Fields[1].AsString := Table002.Fields[3].AsString;
... xtmp_ved est initialisée ...
notices.Fields[8].AsString := IntToStr(xtmp_ved);
epeichette
Messages postés5Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 6 octobre 2006 4 oct. 2006 à 16:57
Je ne suis pas sur mais si j'ai bien compris, tu me propose de faire l'enregistrment dans la table notices en une fois après avoir initialisé xtmp_ved. Mon problème est que je dois connaitre le ID_Notice pour initialiser xtmp_ved. Comment faire pour connaitre la valeur de ID_Notice si je ne l'est pas enregistré avant et fait un post avant xtmp_ved ?
retaks666
Messages postés286Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention16 juillet 2007 4 oct. 2006 à 17:16
humm as tu essayer de récupérer la valeur sans faire de post ?
genre
Table001.First;
while not Table001.Eof do
begin
notices.Append;
notices.Fields[1].AsString := Table002.Fields[3].AsString;
... xtmp_ved:=notices.Fields[0].asinteger
notices.Fields[8].AsString := IntToStr(xtmp_ved);
notices.Post;
...
Table001.Next;
end;
Je ne sais pas si ça marche, mais tu peux otujours tester
epeichette
Messages postés5Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention 6 octobre 2006 5 oct. 2006 à 09:02
J'ai testé cette suggestion mais elle ne marche pas car le POST génère l'incrémentation automatique du ID_Notice.
Cette solution fait que nous cherchons toujours à faire une mise à jour de l'enregistrement dont le ID_Notice=00000000000000
Qualvin
Messages postés21Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention 5 avril 2012 5 oct. 2006 à 19:03
J'ai refait l'exercice et ça me donne vraiment la même chose que Retaks... Tu n'as peut-être pas enlevé l'utilisation de id_notice := notices.fields[0].AsInteger;
On utilise pas du tout cette variable (id_notice) c'est la seule chose qui me fait penser que tu es encore sur le 00000
Tu pourrais peut-être utiliser FieldByName('NomDuChamp') au lieu de Fields[x], ça serait peut-être plus fiable, l'ordre des colonnes pourrait changer.
Table001.First;
while not Table001.Eof do
begin
notices.Append;
notices.Fields[1].AsString := Table002.Fields[3].AsString;
...
... xtmp_ved est initialisée ...
notices.Fields[8].AsString : = IntToStr(xtmp_ved);
notices.Post;
...
Table001.Next;
end;
S'il y a une propriété CachedUpdate sur notices, mets-le peut-être à False
Qualvin
Messages postés21Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention 5 avril 2012 5 oct. 2006 à 19:06
Si tu fais comme ça, c'est presque impossible que ça ne marche pas, puisque tu n'as pas changé d'enregistrement. Du moins ton problème ne viendrais pas te tes données.