Исключить COMPUTED BY поля для генератора запроса

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

Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Пт 07 авг 2020 09:04

Начало здесь.
viewtopic.php?f=26&t=26707&sid=b2a7ad1e ... 5c0827ae58

Проблема в том, что генератор запросов включает в SQL-запросы INSERT/UPDATE и некоторые COMPUTED BY поля. Вернее, в моем случае, пока только одно поле.
На картинке скрипт этого поля.

Кстати, и в design-time, в генераторе SQL это вычисляемое поле тоже попадает в SQL-запросы INSERT/UPDATE. Но в дизайне я могу с помощью клавиши Ctrl и мышки убрать выделение с этого поля.
В таблице много вычисляемых полей, но проблема только с этим.

Подскажите, по каким признакам генератор определяет, что поле - изменяемое или только для чтения?
Может перед генерацией запросов как-то пометить ненужные для INSERT/UPDATE поля?
Вложения
Screenshot_6.jpg
Screenshot_6.jpg (26.14 КБ) 4809 просмотров

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Пт 07 авг 2020 11:04

И вот еще одно поле. Оно вычисляемое и в Update/Insert оно не должно попадать
Вложения
Screenshot_9.jpg
Screenshot_9.jpg (45.26 КБ) 4805 просмотров

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Пн 10 авг 2020 06:34

тут есть кто-нибудь?


oleg0k
Devart Team
Сообщения: 21
Зарегистрирован: Вт 10 мар 2020 17:46

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение oleg0k » Чт 13 авг 2020 10:03

Здравствуйте,
Спасибо за информацию. Мы исследуем данное поведение UniDAC и сообщим Вам результат.

wbr, Oleg
Devart Team

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Вс 08 ноя 2020 13:29

Проблема так и не исправлена.
Вот, вычисляемое поле попадает в insert/update запрос, если нажать кнопку GenerateSQL в редакторе TuniQuery.
Вложения
Screenshot_19.jpg
Screenshot_19.jpg (22.29 КБ) 2056 просмотров
Screenshot_20.jpg
Screenshot_20.jpg (13.63 КБ) 2056 просмотров

oleg0k
Devart Team
Сообщения: 21
Зарегистрирован: Вт 10 мар 2020 17:46

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение oleg0k » Вт 10 ноя 2020 15:45

Здравствуйте,
Мы работаем над проблемой, исправление будет включено в следующий релиз UniDAC

wbr, Oleg
Devart Team

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Вс 21 фев 2021 13:49

А когда можно ожидать исправление проблемы?

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение ViktorV » Пт 05 мар 2021 08:00

Мы улучшили автоопределение computed полей при генерации update-запросов для датасета. Новый билд UniDAC 8.4.1, включающий данное улучшение, уже доступен для скачивания.

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Пт 05 мар 2021 08:23

Хорошо. Попробую новую версию.
Спасибо большое.

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение ViktorV » Пт 05 мар 2021 09:00

Спасибо за интерес к нашим продуктам.
Обращайтесь к нам, если у вас возникнут вопросы по нашим продуктам.

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Ср 17 мар 2021 09:34

uniDAC 8.4.1, Firebord 3.
Теперь появилась другая проблема.

Исходный запрос:

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

select id, name, deleted  from OPERATION
все три поля редактируемые
вот скрипт создания таблицы

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

CREATE TABLE OPERATION (
    ID               INTEG NOT NULL /* INTEG = INTEGER */,
    NAME             STRING32 /* STRING32 = VARCHAR(32) */,
    OPER_SUPER_TYPE  STRING128 /* STRING128 = VARCHAR(128) */,
    DELETED          FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT DEFAULT 0 CHECK (VALUE IN (0,1,NULL)) */
);
а вот автоматически сгенерированный запрос:

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

INSERT INTO OPERATION
  (ID, NAME)
VALUES
  (:ID, :NAME)
отсутствует поле deleted

а вот со сгенерированным запросом update проблемы нет:

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

UPDATE OPERATION
SET
  ID = :ID, NAME = :NAME, DELETED = :DELETED
WHERE
  ID = :Old_ID

вот процедура автогенерации запросов (вот снимок, где виден входящий sql-запрос http://prntscr.com/10nxr0e )

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

procedure GenSQL(const UniQuery: TUniQuery; const aSelectSql: string = '');
Var
 DAParamsInfo: TDAParamsInfo;
begin
  // если параметр aSelectSql пустой, значит запрос живет UniQuery.SQL и тогда его не меняем
  if not aSelectSql.IsEmpty then
    UniQuery.SQL.Text := aSelectSql;

  UniQuery.KeyFields := 'id';

  if not UniQuery.Active then
    UniQuery.Open;

  TDBAccessUtils.SQLGenerator(UniQuery).SubstituteParamName := False;// для генерирования запроса с именованными параметрами

  DAParamsInfo := TDAParamsInfo.Create(TDAParamInfo);
  UniQuery.SQLInsert.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(DAParamsInfo, _stInsert, true);
  DAParamsInfo.Free;


  DAParamsInfo := TDAParamsInfo.Create(TDAParamInfo);
  UniQuery.SQLUpdate.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(DAParamsInfo, _stUpdate, False);// Для Update 3й параметр = False
  DAParamsInfo.Free;


  DAParamsInfo := TDAParamsInfo.Create(TDAParamInfo);
  UniQuery.SQLDelete.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(DAParamsInfo, _stDelete, true);
  DAParamsInfo.Free;

  DAParamsInfo := TDAParamsInfo.Create(TDAParamInfo);
  UniQuery.SQLRefresh.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(DAParamsInfo, _stRefresh, true);
  DAParamsInfo.Free;
end;

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Ср 17 мар 2021 11:09

Когда я вызываю метод Insert, то появляется исключение:
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 113
).
откуда 113, если в запросе всего до 60 символов?

Очень плохо, что uniDAC не показывает в какой SQL-секции произошло исключение и что именно за запрос вызвал это конкретное исключение.

oleg0k
Devart Team
Сообщения: 21
Зарегистрирован: Вт 10 мар 2020 17:46

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение oleg0k » Чт 18 мар 2021 15:05

Здравствуйте,
К сожалению, нам не удалось воспроизвести указанную вами проблему на основании предоставленных вами данных ни в Runtime, не в Designtime. Если у вас воспроизводится в Runtime то, пожалуйста, составьте небольшой пример, демонстрирующий проблему с генерацией SQL выражений в Runtime, а также воспроизводящий указанное исключение и включающий в себя DDL скрипт (или backup базы). Пример пришлите через форму: https://devart.com/company/contactform.html
Если в Designtime, то предлагаем снять видео. Видео залейте на наш FTP: ftp.devart.com Login public Password public
или на любой бесплатный хостинг и пришлите ссылку через указанную форму.

wbr, Oleg
Devart Team

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

Re: Исключить COMPUTED BY поля для генератора запроса

Сообщение Akella » Чт 18 мар 2021 17:48

Отправил.
Нажмите кнопку Button3, а потом Insert

Ответить