Project

Profile

Help

HostedRedmine.com has moved to the Planio platform. All logins and passwords remained the same. All users will be able to login and use Redmine just as before. *Read more...*

Bug #947821

open

8.3.15-21-+ В ВИДах не поддерживается запись значения Неопределено в необъектные таблицы для строковых и булевых колонок, а для числовых и дат - поддерживается

Added by Max im 4 months ago. Updated 2 months ago.

Status:
New
Priority:
Normal
Assignee:
-
Category:
-
Sprint/Milestone:
-
Start date:
Due date:
% Done:

0%

Estimated time:

Description

Способ воспроизведения:
  1. Создать в MSSQL таблицу хотя бы из двух колонок, одной из колонок назначить тип "булево" (bit).
    USE [Test_1C_DWH]
    GO
    
    /****** Object:  Table [dbo].[Test_Nullable_bit]    Script Date: 25-07-2022 16:48:31 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Test_Nullable_bit](
        [id] [int] NOT NULL,
        [isFull] [bit] NULL
    ) ON [PRIMARY]
    GO
    

2. Подключить эту таблицу как необъектную таблицу ВИД (файл конфигурации во вложении):

.

3. В режиме предприятия в форме списка нажать "Создать" и в открывшейся форме нажать "Записать и закрыть". Получим ошибку:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 42000
Номер ошибки: 102
Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '<'.

4. В форме списка нажать кнопку "*Команда1*". Выполнится код:


    ВИД = ВнешниеИсточникиДанных.ТестовыйВИД;
    ТаблицаВИД = ВИД.Таблицы.dbo_Test_Nullable_bit;

    НЗ = ТаблицаВИД.СоздатьНаборЗаписей();
    НЗ.Отбор.id.Установить(1);

    ЗаписьВИД = НЗ.Добавить();
    ЗаписьВИД.id = НЗ.Отбор.id.Значение;

    НЗ.Записать();


и получим ту же самую ошибку.

Ошибка возникает из-за того, что платформа посылает в СУБД следующий запрос (взято из профайлера SQL):

INSERT INTO "dbo"."Test_Nullable_bit"  (id,isFull) VALUES(1,<Bad type>)

Стоит отметить, что ошибка для nullable-колонок возникает только если в метаданных конфигурации эти колонки имеют тип "Булево" или "Строка".
Если же колонки имеют тип "Число" или "Дата", то платформа успешно выполняет запись в БД (в БД записывается значение NULL):

INSERT INTO "dbo"."Test_Nullable_bit"  (id,isFull) VALUES(1,NULL) 

В этом можно убедиться, сменив в метаданных конфигурации тип колонки isFull с Булево на Число или Дата и повторить шаг 3 или 4.

Итого: сейчас можно в коде / на форме не заполнять nullable-поля записи (набора записей), если в метаданных это поле имеет тип "Число" или "Дата". При любой другом типе получаем ошибку СУБД.

Что ожидаю:
  1. Платформа не должна передавать в СУБД синтаксически некорректные инструкции-запросы
  2. Что-то одно на выбор (в порядке убывания желаемости):
    • Для nullable-колонок платформа должна трактовать Неопределено (неуказанное значение) как NULL независимо от заданного в метаданных конфигурации типа данных этой колонки.
      либо
    • Сделать поведение аналогично объектным таблицам ВИДа - где платформа уже сейчас выдает осмысленную платформенную ошибку о том, что поле не может принимать значение "Неопределено" - и распространить такое поведение на nullable-колонки любого типа (для необъектных таблиц ВИДов).

Files

Untitled.png (31.3 KB) Untitled.png Max im, 2022-07-25 03:53 PM
dbo_Test_Nullable_bit.cf (76.8 KB) dbo_Test_Nullable_bit.cf Max im, 2022-07-25 04:21 PM
clipboard-202208170005-i0ayx.png (63.2 KB) clipboard-202208170005-i0ayx.png Сергей Старых, 2022-08-16 11:05 PM
dbo_Test_Nullable_bit_correct.cf (76.8 KB) dbo_Test_Nullable_bit_correct.cf Max im, 2022-08-17 08:18 AM

Also available in: Atom PDF