Edit apres un append dans une boucle

Résolu
epeichette
Messages postés
5
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
6 octobre 2006
- 29 sept. 2006 à 16:16
epeichette
Messages postés
5
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Derniè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.

<!-- / message -->

10 réponses

epeichette
Messages postés
5
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Derniè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

Merci de vos conseils
3
cs_pers
Messages postés
38
Date d'inscription
vendredi 2 mai 2003
Statut
Membre
Derniè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...
0
cs_pers
Messages postés
38
Date d'inscription
vendredi 2 mai 2003
Statut
Membre
Dernière intervention
9 décembre 2009

4 oct. 2006 à 15:15
ce serait quand même super d'avoir une réaction non ???
0
epeichette
Messages postés
5
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Derniè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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
retaks666
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 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);

     notices.Post;
       ...
     Table001.Next;
  end;
0
epeichette
Messages postés
5
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Derniè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 ?
0
retaks666
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 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
0
epeichette
Messages postés
5
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Derniè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
0
Qualvin
Messages postés
21
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Derniè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
0
Qualvin
Messages postés
21
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Derniè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.

Qualvin
0