Добавить все временные (псевдоним) результаты столбца в TMemo - PullRequest
0 голосов
/ 23 марта 2020

Цель состоит в том, чтобы выбрать первую запись из DBGrid (которая дает мне значение id_employee), запустить SQL query и получить временный column (alias), содержащий результаты.

Пока это работает. Подтвержденный с помощью query в MySQL Workbench, он возвращает все значения для column total, для всех rows в этом table, которые имеют указанные c id_employee.

Теперь мне нужно скопировать все отдельные результаты из временных (alias) Result column и вставить их в TMemo. После этого он должен перейти к следующей записи в DBGrid и повторить весь процесс.

Как мне это сделать? Я пытался использовать другое for loop и проходить через поле Result, но оно не работает.

var
row: Integer;
i: Integer;
begin
DBGrid4.DataSource.DataSet.First;
for row := 0 to DBGrid4.DataSource.DataSet.RecordCount -1 do
 begin
 lunaQuery.SQL.Clear;
 lunaQuery.SQL.Text := 'SELECT total AS Result FROM table1 WHERE id_employee=:id_employee AND Month(date)=:month AND Year(date)=:year';
 lunaQuery.Params.ParamByName('id_employee').AsInteger := DBGrid4.DataSource.DataSet.FieldByName('id').AsInteger;
 lunaQuery.Params.ParamByName('month').AsString := ComboBox3.Text;
 lunaQuery.Params.ParamByName('year').AsString := Edit3.Text;
 lunaQuery.Open;

 Memo1.Lines.Add(lunaQuery.FieldByName('Result').AsString);

 DBGrid4.DataSource.DataSet.Next;
 end;
end;

Pi c результатов с использованием вышеуказанного query в MySQL Workbench: - это необходимо в TMemo

enter image description here

Я использую компоненты MyDA C (компонент запроса) .

РЕДАКТИРОВАНИЕ:

Это не работает, хотя. Только первое значение Result добавляется для каждого сквозного id_employee I go. Потенциальные другие для того же id_employee не добавляются к Memo. Мне нужны все Result значения для каждого id_employee I go через добавленные в Memo.

Вот как это выглядит в Memo после изменения на Query.Open и запуска кода выше:

enter image description here

Они верны в том смысле, что каждое из них представляет только первое значение из Result на каждом id_employee. Есть еще. table содержит несколько строк с разными суммарными значениями для каждого id_employee. В Workbench они успешно отображаются, когда я запускаю запрос к одному id_employee, но в Memo из-за l oop добавляется только первый, а остальные нет.

Как видно из сравнения двух изображений, 35 - это первое значение, которое он находит для id_employee=1, и добавляет его к Memo (2-е изображение - 1-е значение). Но он полностью игнорирует следующие 5 найденных значений (pi c 1) и продолжает добавлять первое найденное значение для 2nd id_employee (id_employee=2), равное 20 (pi c 2 - 2nd значение) затем игнорируя другие значения для id_employee=2 при переходе на 3-е, добавляя первое значение и так далее ...

Я в замешательстве.

1 Ответ

4 голосов
/ 23 марта 2020

Правильный способ итерации по строкам набора данных: while not DataSet.Eof l oop.

Если ваш запрос возвращает более одной строки при выполнении, вам также нужно al oop для этот запрос.

begin
  DBGrid4.DataSource.DataSet.First;
  while not DBGrid4.DataSource.DataSet.Eof do
  begin
    lunaQuery.SQL.Clear;
    lunaQuery.SQL.Text := 'SELECT total AS Result FROM table1 WHERE 
    id_employee=:id_employee AND Month(date)=:month AND Year(date)=:year';
    lunaQuery.Params.ParamByName('id_employee').AsInteger :=  DBGrid4.DataSource.DataSet.FieldByName('id').AsInteger;
    lunaQuery.Params.ParamByName('month').AsString := ComboBox3.Text;
    lunaQuery.Params.ParamByName('year').AsString := Edit3.Text;
    lunaQuery.Open;

    while not LunaQuery.Eof do
    begin
      Memo1.Lines.Add(lunaQuery.FieldByName('Result').AsString);
      lunaQuery.Next;
    end;
    lunaQuery.Close;
    DBGrid4.DataSource.DataSet.Next;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...