Стесняюсь комментировать любой ответ, который дал Том, так как считаю его авторитетным. Но я хочу отметить две маленькие вещи.
Прежде всего, использование RECID может быть лучше, чем ROWID. ROWID рекомендуется для использования Progress (см. http://documentation.progress.com/output/OpenEdge102a/oe102ahtml/wwhelp/wwhimpl/common/html/wwhelp.htm?context=dvref&file=dvref-15-48.html), поскольку RECID «поддерживается для обратной совместимости. Для большинства приложений вместо этого используйте функцию ROWID».
Но это незначительно, правда. На мой взгляд, также важно то, что Том сделал в своем примере для вас - он определил буфер («определите буфер updCustomer для клиента»), который он использовал в обновлении. Я хочу призвать вас использовать буферы КАЖДЫЙ раз, когда вы работаете с записью, особенно если вы используете постоянные или супер-процедуры, или если вы используете функции или внутренние процедуры.
Почему? Определение буфера гарантирует, что область действия обновляемого буфера ограничена тем местом, где вы его определили. В качестве примера, Progress «утечет» буфер по умолчанию в вашу супер процедуру, если вы не будете осторожны. Представьте себе этот сценарий ... программа, которая находит запись, вызывает функцию в супер-процедуре для выполнения "некоторых вещей", а затем удаляет запись.
FIND MyTable WHERE MyTable.fk = fkValue NO-LOCK NO-ERROR.
UpdateOtherStuff(MyTable.fkValue).
DeleteMyRecord(MyTable.fkValue).
Но в "UpdateOtherStuff" он выполняет некоторую работу, включая эту ...
FOR EACH MyTable:
If MyTable.Thing = 'ThingOne' THEN LEAVE.
/* other processing here... */
END.
Вы можете быть удивлены, когда обнаружите, что супер-процедура совместно использует по умолчанию буфер «MyTable» с вашей программой и заканчивает тем, что перемещает запись туда, куда вам не нужно ... так что вызов «DeleteMyRecord ()» имеет другую запись, чем вы ожидаете.
Проблема была бы решена, если бы «UpdateOtherStuff» имел «DEFINE BUFFER ... FOR MyTable» вверху, даже если бы это было «DEFINE BUFFER MyTAble для MyTable» (как ни странно это выглядит ...).
Вот почему пример Тома, включая DEFINE BUFFER ..., должен быть шаблоном для работы, которую вы выполняете в ABL.
Этот вопрос задавался ранее - см. https://stackoverflow.com/a/5490130/1433147.