Ошибка UNION ALL + SmartFetch
Ошибка UNION ALL + SmartFetch
Есть 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
Ссылка на пример (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
Re: Ошибка UNION ALL + SmartFetch
При использовании SmartFetch режима UniDAC, если свойство TUniQuery.SmartFetch.SQLGetKeyValues установлено в пустую строку, UniDAC пытается составить и выполнить запрос на чтение ключевых полей и полей указанных в свойстве PrefetchedFields.
Когда SQL запрос является сложным, как в вашем случае, автоматически сгенерированный запрос может быть некорректным. В таком случае вам следует в свойстве TUniQuery.SmartFetch.SQLGetKeyValues.Text указать запрос на получения полей, которые будут уникально идентифицировать запись. Например:
Когда 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
Re: Ошибка UNION ALL + SmartFetch
Т.е. убрать из запроса все поля и оставить только поля ID (в моем случае)....
А я туда вписывал не запрос, а просто два символа "ID".
Спасибо.
А я туда вписывал не запрос, а просто два символа "ID".
Спасибо.
Re: Ошибка UNION ALL + SmartFetch
Еще вопрос.
Подскажите, а как быть с макросами?
Или в запросе в свойстве SQLGetKeyValues макросы тоже будут заменены?
Подскажите, а как быть с макросами?
Или в запросе в свойстве SQLGetKeyValues макросы тоже будут заменены?
Re: Ошибка UNION ALL + SmartFetch
Еще вопрос.
А зачем использовать JOIN, ведь в SQLGetKeyValues идет запрос только для A.ID.
А зачем использовать JOIN, ведь в SQLGetKeyValues идет запрос только для A.ID.
Re: Ошибка UNION ALL + SmartFetch
Проблема не решена. Я получаю ошибку Record not found
Замените код на вот этот и вы получите ошибку:
я так понимаю, проблема с FetchRows.
У меня используется таблица с пагинацитей.
Замените код на вот этот и вы получите ошибку:
Код: Выделить всё
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;
У меня используется таблица с пагинацитей.
Re: Ошибка UNION ALL + SmartFetch
Нет, макросы в свойстве SQLGetKeyValues заменяться не будут. Поэтому, там должен быть точный SQL запрос для получения полей, которые будут уникально идентифицировать запись.
Re: Ошибка UNION ALL + SmartFetch
Мы не можем воспроизвести указанное вами поведение, так как в присланном вами примере используются макросы. И в вашем примере запрос ничего не возвращает. Пожалуйста, укажите точный код, чтобы мы смогли воспроизвести данное поведение на вашем примере.Akella писал(а): ↑Пт 29 окт 2021 13:27 Проблема не решена. Я получаю ошибку Record not found
Замените код на вот этот и вы получите ошибку:
я так понимаю, проблема с FetchRows.Код: Выделить всё
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;
У меня используется таблица с пагинацитей.
Re: Ошибка UNION ALL + SmartFetch
Странно, ну вот, еще раз: https://files.dp.ua/ru/DBAUYcz
у меня ошибка воспроизводится
у меня ошибка воспроизводится
Project Project1.exe raised exception class ESmartFetchError with message 'Record is not found'.
Re: Ошибка UNION ALL + SmartFetch
Спасибо за информацию.
Мы воспроизвели указанное вами поведение и приступили к исследованию. Мы сообщим вам как только появиться любые результаты.
Мы воспроизвели указанное вами поведение и приступили к исследованию. Мы сообщим вам как только появиться любые результаты.
Re: Ошибка UNION ALL + SmartFetch
Исправление ошибки планируется?
Re: Ошибка UNION ALL + SmartFetch
В данный момент мы продолжаем исследование этого вопроса, но, к сожалению, пока не готовы предоставить никаких временных рамок.
Пока полного решения нет, вы можете воспользоваться временным решением. Для этого установите свойство FetchRows в большее значение, например 100 (этот параметр может быть меньше в зависимости от ваших условий).
Пока полного решения нет, вы можете воспользоваться временным решением. Для этого установите свойство FetchRows в большее значение, например 100 (этот параметр может быть меньше в зависимости от ваших условий).