J'hésite à commenter les réponses données par Tom, car je le considère comme faisant autorité. Mais je tiens à souligner deux petites choses.
Tout d'abord, l'utilisation de RECID pourrait être mieux utilisée comme ROWID. L'utilisation de ROWID est recommandée par Progress (voir http://documentation.progress.com/output/OpenEdge102a/oe102ahtml/wwhelp/wwhimpl/common/html/wwhelp.htm?context=dvref&file=dvref-15-48.html ) puisque la fonction RECID est "prise en charge pour des raisons de compatibilité ascendante. Pour la plupart des applications, utilisez plutôt la fonction ROWID".
Mais c'est mineur, vraiment. Ce qui est également important à mon avis, c'est ce que Tom a fait dans son exemple pour vous - il a défini un tampon ("define buffer updCustomer for customer.") qu'il a utilisé dans la mise à jour. Je vous encourage à utiliser des tampons CHAQUE fois que vous travaillez avec un enregistrement, en particulier si vous utilisez des procédures persistantes ou des super procédures, ou si vous utilisez des fonctions ou des procédures internes.
Pourquoi ? La définition d'un tampon garantit que la portée du tampon que vous mettez à jour est limitée à l'endroit où vous l'avez défini. Par exemple, Progress fera "fuir" le tampon par défaut dans votre super procédure si vous ne faites pas attention. Imaginez ce scénario... un programme qui trouve un enregistrement, appelle une fonction dans une super procédure pour faire "certaines choses", puis supprime l'enregistrement.
FIND MyTable WHERE MyTable.fk = fkValue NO-LOCK NO-ERROR.
UpdateOtherStuff(MyTable.fkValue).
DeleteMyRecord(MyTable.fkValue).
Mais dans "UpdateOtherStuff", il fait quelques travaux dont celui-ci...
FOR EACH MyTable:
If MyTable.Thing = 'ThingOne' THEN LEAVE.
/* other processing here... */
END.
Vous pourriez être surpris de constater que la super procédure partage le tampon par défaut "MyTable" avec votre programme, et finit par repositionner l'enregistrement à un endroit que vous ne voulez pas... de sorte que l'appel à "DeleteMyRecord()" a un enregistrement différent de celui que vous attendez.
Le problème serait résolu si "UpdateOtherStuff" avait un "DEFINE BUFFER ... FOR MyTable" en haut, même si c'était "DEFINE BUFFER MyTAble for MyTable" (aussi étrange que cela puisse paraître...).
C'est pourquoi l'exemple de Tom, qui comprend un DEFINE BUFFER..., devrait servir de modèle pour le travail que vous faites dans l'ABL.
Cette question a été posée précédemment - voir https://stackoverflow.com/a/5490130/1433147 .