Страница 1 из 2

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

Добавлено: Пт 07 авг 2020 09:04
Akella
Начало здесь.
viewtopic.php?f=26&t=26707&sid=b2a7ad1e ... 5c0827ae58

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

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

Подскажите, по каким признакам генератор определяет, что поле - изменяемое или только для чтения?
Может перед генерацией запросов как-то пометить ненужные для INSERT/UPDATE поля?

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

Добавлено: Пт 07 авг 2020 11:04
Akella
И вот еще одно поле. Оно вычисляемое и в Update/Insert оно не должно попадать

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

Добавлено: Пн 10 авг 2020 06:34
Akella
тут есть кто-нибудь?

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

Добавлено: Ср 12 авг 2020 07:23
Akella
up

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

Добавлено: Чт 13 авг 2020 10:03
oleg0k
Здравствуйте,
Спасибо за информацию. Мы исследуем данное поведение UniDAC и сообщим Вам результат.

wbr, Oleg
Devart Team

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

Добавлено: Вс 08 ноя 2020 13:29
Akella
Проблема так и не исправлена.
Вот, вычисляемое поле попадает в insert/update запрос, если нажать кнопку GenerateSQL в редакторе TuniQuery.

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

Добавлено: Вт 10 ноя 2020 15:45
oleg0k
Здравствуйте,
Мы работаем над проблемой, исправление будет включено в следующий релиз UniDAC

wbr, Oleg
Devart Team

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

Добавлено: Вс 21 фев 2021 13:49
Akella
А когда можно ожидать исправление проблемы?

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

Добавлено: Пт 05 мар 2021 08:00
ViktorV
Мы улучшили автоопределение computed полей при генерации update-запросов для датасета. Новый билд UniDAC 8.4.1, включающий данное улучшение, уже доступен для скачивания.

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

Добавлено: Пт 05 мар 2021 08:23
Akella
Хорошо. Попробую новую версию.
Спасибо большое.

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

Добавлено: Пт 05 мар 2021 09:00
ViktorV
Спасибо за интерес к нашим продуктам.
Обращайтесь к нам, если у вас возникнут вопросы по нашим продуктам.

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

Добавлено: Ср 17 мар 2021 09:34
Akella
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;

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

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

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

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

Добавлено: Чт 18 мар 2021 15:05
oleg0k
Здравствуйте,
К сожалению, нам не удалось воспроизвести указанную вами проблему на основании предоставленных вами данных ни в 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

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

Добавлено: Чт 18 мар 2021 17:48
Akella
Отправил.
Нажмите кнопку Button3, а потом Insert