Ошибка UNION ALL + SmartFetch

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Ошибка UNION ALL + SmartFetch

Сообщение Akella » Ср 20 окт 2021 13:55

Есть SQL-запрос в компоненте UniQuery1.
Ссылка на пример (https://files.dp.ua/ru/PGRfAmND )
Используется конструкция UNION ALL.
Если включить SmartFetch, то появляется ошибка "Invalid command count of column list and variable list do not match".
Запустите пример и нажмите Button2.

Delphi 10.4.2 + UniDAC 9.0.1

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка UNION ALL + SmartFetch

Сообщение ViktorV » Вт 26 окт 2021 15:44

При использовании SmartFetch режима UniDAC, если свойство TUniQuery.SmartFetch.SQLGetKeyValues установлено в пустую строку, UniDAC пытается составить и выполнить запрос на чтение ключевых полей и полей указанных в свойстве PrefetchedFields.
Когда SQL запрос является сложным, как в вашем случае, автоматически сгенерированный запрос может быть некорректным. В таком случае вам следует в свойстве TUniQuery.SmartFetch.SQLGetKeyValues.Text указать запрос на получения полей, которые будут уникально идентифицировать запись. Например:

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

  SELECT  A.ID FROM UNLIST(:PARAM1) UL

  INNER JOIN PHONES P ON P.TEL = UL.RES
  INNER JOIN APART A ON A.ID = P.ID_APART
  LEFT JOIN OPERATION O ON O.ID = A.ID_OPERATION
  LEFT JOIN STREETS S ON S.ID = A.ID_STREET

  UNION ALL
  SELECT DISTINCT A.ID  FROM UNLIST(:PARAM1) UL

  INNER JOIN PHONES P ON P.TEL = UL.RES
  INNER JOIN ARENDA A ON A.ID = P.ID_ARENDA
  LEFT JOIN OPERATION O ON O.ID = A.ID_OPERATION
  LEFT JOIN STREETS S ON S.ID = A.ID_STREET

  UNION ALL
  SELECT DISTINCT A.ID FROM UNLIST(:PARAM1) UL

  INNER JOIN PHONES P ON P.TEL = UL.RES
  INNER JOIN OFFICES A ON A.ID = P.ID_OFF
  LEFT JOIN OPERATION O ON O.ID = A.ID_OPERATION
  LEFT JOIN STREETS S ON S.ID = A.ID_STREET


  UNION ALL
  SELECT DISTINCT A.ID FROM UNLIST(:PARAM1) UL

  INNER JOIN PHONES P ON P.TEL = UL.RES
  INNER JOIN MEDIATORS A ON A.ID = P.ID_MEDIATOR

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Ошибка UNION ALL + SmartFetch

Сообщение Akella » Ср 27 окт 2021 12:55

Т.е. убрать из запроса все поля и оставить только поля ID (в моем случае)....
А я туда вписывал не запрос, а просто два символа "ID".

Спасибо.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Ошибка UNION ALL + SmartFetch

Сообщение Akella » Чт 28 окт 2021 08:38

Еще вопрос.
Подскажите, а как быть с макросами?
Или в запросе в свойстве SQLGetKeyValues макросы тоже будут заменены?

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Ошибка UNION ALL + SmartFetch

Сообщение Akella » Пт 29 окт 2021 12:21

Еще вопрос.
А зачем использовать JOIN, ведь в SQLGetKeyValues идет запрос только для A.ID.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Ошибка UNION ALL + SmartFetch

Сообщение Akella » Пт 29 окт 2021 13:27

Проблема не решена. Я получаю ошибку Record not found

Замените код на вот этот и вы получите ошибку:

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

procedure TForm1.Button2Click(Sender: TObject);
begin
  UniQuery1.SpecificOptions.Values['FetchAll'] := 'False';
  UniQuery1.FetchRows := 1;
  UniQuery1.SmartFetch.LiveBlock := True;
  UniQuery1.SmartFetch.Enabled   := True;

  UniQuery1.SmartFetch.Enabled := true;
  UniQuery1.ParamByName('PARAM1').AsString := '7451487';
  UniQuery1.Open;
end;
я так понимаю, проблема с FetchRows.

У меня используется таблица с пагинацитей.

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка UNION ALL + SmartFetch

Сообщение ViktorV » Пт 29 окт 2021 17:08

Akella писал(а): Чт 28 окт 2021 08:38 Еще вопрос.
Подскажите, а как быть с макросами?
Или в запросе в свойстве SQLGetKeyValues макросы тоже будут заменены?
Нет, макросы в свойстве SQLGetKeyValues заменяться не будут. Поэтому, там должен быть точный SQL запрос для получения полей, которые будут уникально идентифицировать запись.

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка UNION ALL + SmartFetch

Сообщение ViktorV » Пт 29 окт 2021 17:10

Akella писал(а): Пт 29 окт 2021 12:21 Еще вопрос.
А зачем использовать JOIN, ведь в SQLGetKeyValues идет запрос только для A.ID.
Вы правы, мы привели данный пример для более простого представления указанной функциональности ))

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка UNION ALL + SmartFetch

Сообщение ViktorV » Пт 29 окт 2021 17:17

Akella писал(а): Пт 29 окт 2021 13:27 Проблема не решена. Я получаю ошибку Record not found

Замените код на вот этот и вы получите ошибку:

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

procedure TForm1.Button2Click(Sender: TObject);
begin
  UniQuery1.SpecificOptions.Values['FetchAll'] := 'False';
  UniQuery1.FetchRows := 1;
  UniQuery1.SmartFetch.LiveBlock := True;
  UniQuery1.SmartFetch.Enabled   := True;

  UniQuery1.SmartFetch.Enabled := true;
  UniQuery1.ParamByName('PARAM1').AsString := '7451487';
  UniQuery1.Open;
end;
я так понимаю, проблема с FetchRows.

У меня используется таблица с пагинацитей.
Мы не можем воспроизвести указанное вами поведение, так как в присланном вами примере используются макросы. И в вашем примере запрос ничего не возвращает. Пожалуйста, укажите точный код, чтобы мы смогли воспроизвести данное поведение на вашем примере.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Ошибка UNION ALL + SmartFetch

Сообщение Akella » Пн 01 ноя 2021 09:25

Странно, ну вот, еще раз: https://files.dp.ua/ru/DBAUYcz

у меня ошибка воспроизводится
Project Project1.exe raised exception class ESmartFetchError with message 'Record is not found'.

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка UNION ALL + SmartFetch

Сообщение ViktorV » Вт 02 ноя 2021 15:13

Спасибо за информацию.
Мы воспроизвели указанное вами поведение и приступили к исследованию. Мы сообщим вам как только появиться любые результаты.

Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Ошибка UNION ALL + SmartFetch

Сообщение Akella » Вт 23 ноя 2021 09:37

Исправление ошибки планируется?

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Ошибка UNION ALL + SmartFetch

Сообщение ViktorV » Пн 29 ноя 2021 16:57

В данный момент мы продолжаем исследование этого вопроса, но, к сожалению, пока не готовы предоставить никаких временных рамок.

Пока полного решения нет, вы можете воспользоваться временным решением. Для этого установите свойство FetchRows в большее значение, например 100 (этот параметр может быть меньше в зависимости от ваших условий).

Ответить