Имя: Пароль:
1C
 
Работа с базой скл из 1С
0 Мисти
 
05.10.14
20:54
[Id] [uniqueidentifier] NULL
Есть там такое поле.
Если его не заполнять, то всё нормально, но у меня есть ситуация, когда
Id может быть, а может и не быть, т.е. мне бы хотелось написать в программе
Если СокрЛП(СтрДоговорСКЛ.Id)=""  Тогда
  Cmd.Parameters(10).Value = null;
Иначе
  Cmd.Parameters(10).Value = СтрДоговорСКЛ.Id;
КонецЕсли;
Но, походе, скл мой null не нравится!
А иначе надо прямо указывать все поля для заполнения, а их где 15, а где 27. Да, и полей с Id В 1 таблице может быть несколько.
Как быть? Может, как-то null по-другому рисовать?
1 zulu_mix
 
05.10.14
20:56
а оно вообще nullable?
2 Мисти
 
05.10.14
20:58
В 1 строчке описание.
3 zulu_mix
 
05.10.14
21:00
ну попробуй Cmd.Parameters(10).Value = "null";
4 zulu_mix
 
05.10.14
21:00
я таким извратом не занимался если честно. я загонял сразу текст запроса
5 КонецЦикла
 
05.10.14
21:03
Что за база-то?
Записывай пустой тип значения того типа значения - или все поломается?
6 Мисти
 
05.10.14
21:06
(5) Говорят, нельзя! говорят, должно остаться пустым.
Если в запросе написать все нужные поля и этого не указывать вовсе, то всё прекрасно записывается, в этом столбце остается null по умолчанию.
7 КонецЦикла
 
05.10.14
21:08
(6) ОК
Проблема ясна
Тогда пиши так:

Если СокрЛП(СтрДоговорСКЛ.Id)=""  Тогда
//  Cmd.Parameters(10).Value = null;
Иначе
  Cmd.Parameters(10).Value = СтрДоговорСКЛ.Id;
КонецЕсли;
8 Мисти
 
05.10.14
21:12
Нет, так не получится! Тогда надо сначала указывать все поля..
Или нет?? Вот это открытие!
Поле указано и не заполняется и всё успешно записывается??
9 Мисти
 
05.10.14
21:13
Т.е. я думала, что поля, которые я не буду заполнять, я должна заранее определить как NULL, вот так:

            ТекстЗапроса = "INSERT INTO gtw_ObjectInContract VALUES
            |(NULL,
            |?,    
            |?,  
            |?,      
            |?,      
            |NULL,
            |?,
            |?,
            |?)";
10 Fragster
 
гуру
05.10.14
21:19
как в (0) при условии prepared statements как в (9) работает.

единственное, можно параметры не в саму команду писать, а в ComМассив("VT_VARIABLE") и передавать параметром в Execute()
11 Fragster
 
гуру
05.10.14
21:20
а вот без сообщения об ошибке как-то не круто рассуждать.
12 КонецЦикла
 
05.10.14
21:24
insert into ObjectInContract (Id25) values ('33')

Ставишь только id25

А еще есть default values - но это уже 80 lvl
13 КонецЦикла
 
05.10.14
21:32
(8) Ну как? Спать не будешь точно :)
Или будешь?
Поле НЕ УКАЗАНО в перечислении полей - тогда работает
14 Мисти
 
05.10.14
21:40
Ничего не поняла. Наверное, таки спать пора.
Мне понравилась идея, что я перечислю для заполнения 10полей (как в п. 9), а заполню только часть, какие не сочту нужным - не заполню. У нее есть шанс сообразить, что я имела в виду.
15 КонецЦикла
 
05.10.14
21:44
Млин, я рассчитывал на о-зм... жаль...
Допустим, в таблице ObjectInContract есть поля id2, id3, id25
Надо вставить id3, id25, а id2 оставить NULL
Пишешь
insert into ObjectInContract (id3, id25) values ('33', '44')
16 Мисти
 
05.10.14
21:55
(15) Так это понятно! Это у меня в 0 описано
"А иначе надо прямо указывать все поля для заполнения, а их где 15, а где 27. Да, и полей с Id В 1 таблице может быть несколько. "
- так вот, все 27, где 4 могут быть типа ид и любой из них может быть не заполнен - это что же за простыня получится??
Каждый раз я в общем случае должна заполнить все поля.
17 КонецЦикла
 
05.10.14
21:57
(16) Ну ты и зануда!
Динамически формируй запрос, примени фантазию
Если проще можно сделать так
insert into ObjectInContract default values  
Потом проапдейтить пару поле - будет меньше простыня
18 КонецЦикла
 
05.10.14
21:58
Не, девушки-программистки это пистец...
19 КонецЦикла
 
05.10.14
22:00
Что значит "и полей с Id В 1 таблице может быть несколько"?
Поля должны иметь уникальное имя в пределах таблицы
20 Мисти
 
06.10.14
10:31
Там может быть ид договора, ид контрагента и т.д., у которых те же ограничения.
А если я везде напишу попытка - исключение? При первичной выгрузке этих ид наверняка нет, а потом - они скорее всего будут, в 99 из 100.
21 КонецЦикла
 
06.10.14
14:04
Ну и что? Трудно написать процедуру формирования текста запроса? Она будет смотреть заполненность значения и формировать отдельно текст списка полей и текст списка значений. Никакой простыни и близко в коде не будет. Несколько строчек.
22 Мисти
 
06.10.14
14:17
(21) У меня разных таких таблиц штук 20 - это вообще всё переписать!
Причем, если написать непосредственно в базе insert [dbo].[gtw_AccountBillingInfoExport](

[Id],

      [ModifiedOnBPMonline],

      [DoDelete],

      [AccountId],

      [CountryUi1C],

      [INN],

      [OKPOCode],

      [BankBIK],

      [AccountNumber])

      values(

      NULL,

      GETDATE(),

      0,

      NULL,

      NULL,

      '12312312',

      '123123312',

      'asdasd',

      'asdasd'

      ), то работает, а если из 1С, то нет. Может есть какой-то фокус, чтобы их null определить из 1с?
23 Sammo
 
06.10.14
14:33
(22) Сделай хранимку с параметрами и вызывай ее из 1с.
Но вообще-то у меня инсерт
|    NULL,
работает
Текс запроса дальше как используется? Command?
Поля поддерживает NULL?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.