Имя: Пароль:
1C
1С v8
Добавление (или обновление) данных в SQL-таблице
0 Caesar
 
26.09.12
12:25
Добрый день.

Вот какая задачка:
Есть SQL-база данных, информация в которую попадает из 1с 8.2
В базе данных имеется таблица, скажем, Actions, с двумя полями - BAR и Quantity, в которую надо либо добавлять записи, либо обновлять существующие в зависимости от содержимого BAR.

Заранее благодарен за подсказки.
1 ДенисЧ
 
26.09.12
12:28
подсказываю - надо установить соединение с скуль-базой и писать/обновлять данные в ней, а так же читать оные данные.
2 ДенисЧ
 
26.09.12
12:28
А что ещё ты хотел услышать на такой вопрос?
3 MadHead
 
26.09.12
12:30
наверное еще тригер подойдет
4 Caesar
 
26.09.12
12:30
Соединение я установить умею) Отдельно добавлять данные могу, отдельно модифицировать - тоже. Можно ли это сделать единой операцией? Как в таком случае будет выглядеть запрос?
5 Caesar
 
26.09.12
12:31
(3) А триггер как тут подойдет?
6 Caesar
 
26.09.12
12:35
то есть задача такова:

Исходная таблица

Bar      Quantity
123456       2
234567       3
345678       4

Входящие данные:

Bar      Quantity
123456       7
456789       8
567890       8
234567      12

то есть две строки обновить, две добавить.
7 shuhard
 
26.09.12
12:37
(6) проблема то в чем ?
8 ДенисЧ
 
26.09.12
12:46
update where
insert ()

одним оператором не обойдёшься
9 Caesar
 
26.09.12
13:39
не пинайте ногами в лицо сильно, делаю так:

   рез = Запрос.Выполнить().Выбрать();
   НаборЗаписей.ActiveConnection = Подключение;
   НаборЗаписей.CursorType = 3;
   Пока рез.Следующий() Цикл
     НаборЗаписей.Open("SELECT * FROM zActionBar Where (zActionBar.BAR_ID = '"+СокрЛП(рез.Штрихкод)+"')",Подключение,1,4);
     Если НаборЗаписей.EOF и  НаборЗаписей.BOF  Тогда //добавляем новую запись
         НаборЗаписей.addNew();
         НаборЗаписей.Fields("Bar_ID").value = СокрЛП(рез.Штрихкод);
         НаборЗаписей.Fields("Bar_ID_GROOP").value = Число(рез.Владелец.ГруппаТоваров.Код);
         НаборЗаписей.Fields("Bar_Price").value = рез.Цена;
         НаборЗаписей.Fields("Bar_Quantity").value = рез.Ограничение;
         НаборЗаписей.Fields("Bar_Factor").value = 1;
         НаборЗаписей.Fields("BAR_CHANGE").value = ТекущаяДата();
         НаборЗаписей.Fields("Bar_Lock").value = ?(рез.Владелец.ВАкции,0,1);
         НаборЗаписей.update();
         НаборЗаписей.UpdateBatch();
         НаборЗаписей.Close();

         флОбновлять = Истина;
     Иначе //обновляем существующую
         ТекстЗапроса="UPDATE zActionBar
         |SET zActionBar.BAR_Price="+рез.Цена+"
         |WHERE    (zActionBar.BAR_ID = '"+СокрЛП(рез.Штрихкод)+"')";
         подключение.Execute(ТекстЗапроса);
         Сообщить("Цена установлена "+рез.Цена+" у товара "+рез.Владелец.Наименование);
         НаборЗаписей.Close();
     КонецЕсли;
   КОнецЦикла;    
   Подключение = "";

Все работает, но есть большие сомнения с точки зрения оптимальности - может, кто-то подскажет что-то?
С уважением.
10 kolanych
 
26.09.12
13:42
(8) вы не поверите - можно обойтись
11 Sammo
 
26.09.12
13:46
Сделай хранилку и вызывай ее из 1с :)
12 shuhard
 
26.09.12
13:46
(9) НаборЗаписей.UpdateBatch(); - это лишнее
13 Sammo
 
26.09.12
13:47
Или вьюху
14 Caesar
 
26.09.12
13:47
(10) а как?
(11) Пока не умею. Подскажешь примерно как?
15 Caesar
 
26.09.12
13:47
(12) понял, попробую сейчас
16 Caesar
 
26.09.12
13:48
(13) вьюха - это, прошу прощения, что?))
17 Caesar
 
26.09.12
13:55
(12) без updatebatch новые строки в БД не добавляются, решил оставить.
18 Ненавижу Неопределен
 
26.09.12
14:00
СУБД какая?
19 Caesar
 
26.09.12
14:12
MS SQL
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший