Как добавить пользовательскую агрегатную функцию с помощью TFDSQLiteFunction?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как добавить пользовательскую агрегатную функцию с помощью TFDSQLiteFunction?

Сообщение Anonymous »

Я хочу создать специальную функцию для использования таким образом:

Код: Выделить всё

FDQuery1->SQL->Text = "SELECT SQRT_SUM(FIELD_1) FROM TABLE_1 WHERE ID = 1";
FDQuery1->Open();

ShowMessage(Form1->FDQuery1->Fields->Fields[0]->AsFloat);

FDQuery1->Close();
Мне нужно стандартное отклонение и другие статистические функции, но для простоты давайте возьмем «квадратный корень из суммы». На основе учебника «Использование SQLite с FireDAC» я добавил:

Код: Выделить всё

void __fastcall TForm1::FDSQLiteFunction1Calculate(TSQLiteFunctionInstance *AFunc,
TSQLiteInputs *AInputs, TSQLiteOutput *AOutput, TObject *&AUserData)

{
double sum = 0;
for (long i = 0; i < AInputs->Count; i++) sum += AInputs->Inputs[i]->AsFloat;
AOutput->AsFloat = sqrt(sum);
}

FDSQLiteFunction1->DriverLink = FDPhysSQLiteDriverLink1;
FDSQLiteFunction1->FunctionName = 'SQRT_SUM';
FDSQLiteFunction1->Aggregated = true;
FDSQLiteFunction1->ArgumentsCount = 1;
FDSQLiteFunction1->OnCalculate = FDSQLiteFunction1Calculate;
FDSQLiteFunction1->Active = true;
Но функция вызывается для каждой строки, а не один раз, и я не могу получить нужное значение, если не использую глобальные переменные. Как мне выполнить цикл for для суммирования всех значений?


Подробнее здесь: https://stackoverflow.com/questions/791 ... tefunction
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»