То, что вы хотите - это на самом деле динамический c запрос. Я вернусь к этому в конце, но сначала я хотел бы объяснить, почему вы не сможете попытаться подставить имя поля в переменную which-hold #: поскольку запрос оценивается во время компиляции. И это то, что он читает (предположим, что у которого-удержание # есть значение widget.holdn ДЛЯ КАЖДОГО виджета, где "widget-holdn" (...) И это не оценивается как ИСТИНА или ЛОЖЬ. Так что, спросите вы? Хорошо это ключ здесь. Каждое условие должно оцениваться как истинное или ложное, так что вам больше повезет, если вы попытаетесь
for each widget where (if widget-hold# = 'widget.holdn' then widget.holdn = true else TRUE) (...)
Опять же, обратите внимание, что условие будет существовать, если виджет-удерживать # имеет значение, которое я хочу, иначе оно вообще не фильтруется. Таким образом, вы можете просто кодировать, как я показал (для каждого из ваших условий), и оно должно работать нормально. НО позвольте мне предложить динамический c запрос вместо этого. Вам нужно иметь:
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
CREATE QUERY hQuery.
hQuery:SET-BUFFERS(BUFFER widget:HANDLE).
hQuery:QUERY-PREPARE('<THIS IS THE CORE>').
hQuery:QUERY-OPEN().
DO WHILE hQuery:GET-NEXT():
A bunch of code to make a nice report with the retrieved records...
END.
Таким образом, в ядре у вас есть строка, которая соответствует вашей для каждого, как вы хотите, чтобы он выглядел. Так должно быть, например (сохраните это в переменной или соберите его внутри запроса на подготовку, это не имеет значения):
'FOR EACH widget NO-LOCK WHERE ' +
(if which-hold = 'B' then 'widget.holdn = true and widget.holdl = true'
else if which-hold = 'L' then 'widget-holdl = true'
else /* N */ 'widget-holdn = true').
Помните, я говорил, что ваш запрос оценивается во время компиляции? Ну, как вы знаете, динамические c запросы на другой конец оцениваются во время выполнения меня, так что будьте готовы к появлению ошибок только при запуске. Еще одна вещь, которую я должен упомянуть, - это динамические c запросы, которые медленнее, чем stati c, поэтому, пожалуйста, оцените и выберите свой яд:)
Это должно быть то, что вам нужно. Пожалуйста, дайте мне знать, если это будет полезно или у вас останутся какие-либо вопросы.