DELPHI Установил приоритет между основным детализированным отношением и вычисляемыми полями

#delphi-xe #master-detail #firedac #calculated-field #command-precedence

#delphi-xe #master-detail #firedac #вычисляемое поле #приоритет команды

Вопрос:

У меня есть TFDQuery, я назову его FDQ_Master, содержащий формулу в тексте. Идея состояла бы в том, чтобы добавить вычисляемое (или внутреннее вычисляемое с тем же результатом, что и до сих пор) поле к этому FDQ_Master для оценки этой формулы. У меня есть функция, использующая TEvaluator (JclExprEval из проекта Jedi), которая отлично работает при выполнении с помощью нажатия кнопки для оценки формулы.

Для оценки этой функции требуется информация из другой таблицы (FDQ_Detail), которая является подробной таблицей в определенном главном подробном отношении с помощью FDQ_Master. FDQ_Master работает над «кэшированными обновлениями», о которых я упоминаю на всякий случай, если это может иметь какое-либо значение для этой проблемы. (FDQ_Detail вообще не обновляется в этой форме)

Проблема, которую я нахожу, заключается в том, что когда событие OnCalcFields происходит в FDQ_Master, FDQ_Detail еще не перешел (или, лучше сказать, отфильтровал, я думаю) к записям, соответствующим новому основному, и так далее, вычисление происходит с неправильным набором подробных записей.

Итак. Я говорю, нет проблем, я добавляю новый TFDQuery в ту же таблицу FDQ_Master, (FDQ_Master_BIS), и я устанавливаю основное детализированное отношение от FDQ_Master_BIS к FDQ_Master (отношение будет 1 к 1), и я пытаюсь выполнить вычисления там, но я нахожу ту же проблему. И это немного усложняет дело, потому что, если я выполню другой детализированный TFDQuery Detail из FDQ_Master, это сработает (не имеет особого смысла воспринимать это как решение проблемы, поскольку для этих подробных TFDQueries вычисление будет выполняться столько раз, сколько существует подробных записей, и мне нужно, чтобы оно выполнялосьтолько один раз для каждой записи FDQ_Master)

И это мой вопрос. Для первого подхода (добавление вычисляемого поля в FDQ_Master) Есть ли какой-либо способ предотвратить вычисление полей в FDQ_Master до тех пор, пока FDQ_Detail не выполнит отношение master-detail?

И в случае, если это было бы невозможно или просто стало бы слишком сложным, есть ли какой-либо способ указать Delphi — Firedac для извлечения записей из одного TFDQuery перед другим среди разных основных подробных связей с одной и той же главной таблицей?

Конечно, я мог бы использовать «ручное» решение для вычисления формулы отдельно и найти способ вывести ее на экран, код выглядел бы не так хорошо, но это решение, я думаю, можно было бы как-то реализовать. Вопрос больше касается приоритета этих операций и есть ли какой-либо способ программно повлиять на этот приоритет.

Заранее благодарим вас за помощь

Ответ №1:

В конце концов, решение, которое я действительно реализовал, было тем же, что я предполагал с этим FDQ_Master_BIS, но наоборот, то есть вместо создания FDQ_Master_BIS в качестве подробной записи из FDQ_Master, я создал FDQ_Master_BIS в качестве Master из FDQ_Master и изменил отношение master detail в FDQ_Detail на FDQ_Master_BIS вместо FDQ_Master. Я выполняю вычисления в FDQ_Master и до сих пор, похоже, работает просто отлично.

Ну, на самом деле трюк заключается в том, что FDQ_Master_BIS выбирается перед открытием FDQ_Detail, и поэтому я уверен, что при открытии FDQ_Detail уже указывает на нужные записи.