Имя: Пароль:
1C
1C 7.7
v7: делать ли if exist или сразу update?
0 monsterZE
 
10.06.13
13:22
что получается быстрее?
справочник около 15000
было:
update ..
Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Если Результат=0 Тогда
insert ..
переделал на if exist ..
вот думаю, не медленнее ли?
1 ЧеловекДуши
 
10.06.13
13:27
(0) Лучше проверить, а потом писать.
Или писать, но с условием.
Нам не виден весь запрос :)
2 monsterZE
 
10.06.13
13:29
апдейтится внешняя табличка с данными по товару

       Если ОстатокТовара>0 Тогда      
           Состояние("SQL items (update/insert)");  
           ТекстЗапроса = "
           |IF Exists (SELECT * FROM "+ТекСКЛТаб+" WHERE id = '"+ СокрЛП(Элемент.Код)+"')
           |     BEGIN
           |           UPDATE "+ТекСКЛТаб+"
           |            SET
           |              parent_id = '"+ СокрЛП(Элемент.Родитель.Код)+"'
           |                 ,nazvan = '"+ СокрЛП(текТоварНаименование)+"'
           |                   ,cena = '"+  Число(Элемент.Опт_Цена)+"'
           |                  ,up_ed = '"+ СокрЛП(Элемент.БазоваяЕдиница)+"'
           |                 ,up_kol = '"+  Число(?(Элемент.СтоимостьСборки>0,Элемент.СтоимостьСборки,1))+"'
           |                ,ostatok = '"+  Число(ОстатокТовара)+"'
           |                 ,rezerv = '"+  Число(РезервТовара)+"'
           |            WHERE  
           |                 id = '"+ СокрЛП(Элемент.Код)+"'
           |     END
           |ELSE
           |      BEGIN
           |            INSERT INTO "+ТекСКЛТаб+" (parent_id,id,nazvan,cena,up_ed,up_kol,ostatok,rezerv)
           |            VALUES
           |                  ('"+СокрЛП(Элемент.Родитель.Код)+"','"+
                                  СокрЛП(Элемент.Код)+"','"+
                                  СокрЛП(текТоварНаименование)+"','"+
                                   Число(Элемент.Опт_Цена)+"','"+
                                  СокрЛП(Элемент.БазоваяЕдиница)+"','"+
                                   Число(?(Элемент.СтоимостьСборки>0,Элемент.СтоимостьСборки,1))+"','"+
                                   Число(ОстатокТовара)+"','"+
                                   Число(РезервТовара)+"')
           |      END
           |";
       Иначе
           Состояние("SQL items (delete)");
           ТекстЗапроса = "
           |DELETE FROM "+ТекСКЛТаб+"
           |WHERE
           |     id = '"+ СокрЛП(Элемент.Код) +"'";    
       КонецЕсли;
       
       Результат = Запрос.ВыполнитьСкалярный(ТекстЗапроса);
   КонецЦикла;
3 trad
 
10.06.13
13:32
обычно пишу так

|UPDATE ...
|IF @@ROWCOUNT = 0
|   INSERT ...

и не парюсь
4 Jaap Vduul
 
10.06.13
13:38
(2)
Некомильфо.
Запросто может быть, что сразу после проверки на exists, в конкуретной сессии сделают insert.
5 monsterZE
 
10.06.13
13:51
(3) ясно, значит быстрее по старому..
(4) не могет быть - вызывается из процедуры проведения
6 Злой Бобр
 
10.06.13
14:04
(5) Может, еще как может. Проведение блочит токо журнал документов а не справочник...
7 Ёпрст
 
10.06.13
14:06
(6) тут ты ошибаешься, если была открыта выборка - заблочит и справочник.
8 Ёпрст
 
10.06.13
14:06
и любую табличку..
9 monsterZE
 
10.06.13
14:07
(6) так я-ж обновляю справочник по проведению документа?..
вобщем правильней вот так?
           ТекстЗапроса = "
           |    UPDATE "+ТекСКЛТаб+"
           |    SET
           |      parent_id = '"+ СокрЛП(Элемент.Родитель.Код)+"'
           |      ,nazvan    = '"+ СокрЛП(текТоварНаименование)+"'
           |      ,cena      = '"+  Число(Элемент.Опт_Цена)+"'
           |      ,up_ed     = '"+ СокрЛП(Элемент.БазоваяЕдиница)+"'
           |      ,up_kol    = '"+  Число(?(Элемент.СтоимостьСборки>0,Элемент.СтоимостьСборки,1))+"'
           |      ,ostatok   = '"+  Число(ОстатокТовара)+"'
           |      ,rezerv    = '"+  Число(РезервТовара)+"'
           |    WHERE  
           |         id = '"+ СокрЛП(Элемент.Код)+"'
           |   IF @@ROWCOUNT = 0
           |      BEGIN
           |            INSERT INTO "+ТекСКЛТаб+" (parent_id,id,nazvan,cena,up_ed,up_kol,ostatok,rezerv)
           |            VALUES
           |                  ('"+СокрЛП(Элемент.Родитель.Код)+"','"+
                                  СокрЛП(Элемент.Код)+"','"+
                                  СокрЛП(текТоварНаименование)+"','"+
                                   Число(Элемент.Опт_Цена)+"','"+
                                  СокрЛП(Элемент.БазоваяЕдиница)+"','"+
                                   Число(?(Элемент.СтоимостьСборки>0,Элемент.СтоимостьСборки,1))+"','"+
                                   Число(ОстатокТовара)+"','"+
                                   Число(РезервТовара)+"')
           |      END
           |";
10 Jaap Vduul
 
10.06.13
14:23
(9)
Вместо подстановки конкретных значений в текст запроса, лучше использовать параметры.
11 Ёпрст
 
10.06.13
14:34
(9) странный id у элемента твоего..
12 Serginio1
 
10.06.13
14:34
Merge
13 trad
 
10.06.13
14:35
(7) а была ли открыта выборка у автора ?..
14 Ёпрст
 
10.06.13
14:38
(13) это к (0) не относилось..
:)
15 Ёпрст
 
10.06.13
14:39
нафига вот останки в табличке хранить последние, тоже не ясно.. видать для показа в форме списка справочника при подборе
16 Ёпрст
 
10.06.13
14:45
(13) давно спросить хотел, а чего с ИС усё удалил ?..
хде теперь твои поделки искать ? Только на 1cpp ?
17 trad
 
10.06.13
14:49
(14) и мой вопрос был риторическим, адресован тебе, но предназначен автору. :)
(16) не имел желания оформить согласно требованиям модерации, поэтому пришлось удалить. Да, на 1cpp.ru
18 monsterZE
 
10.06.13
15:32
(11) имеешь ввиду
ИДОбъекта = глМД.ЗначениеВДлиннуюСтрокуБД(Объект);
? =)
а что такое?.. он уникальный
19 monsterZE
 
10.06.13
15:36
про открытую выборку - не понял при чем тут оно и выборка чего должна быть открыта..?
апдейтится табличка во внешней базе скл
апдейтится по проведению определенных документов
давно уже работает и ничего не задваивалось и т.д...
20 Ёпрст
 
10.06.13
15:51
(18) не, ты пихаешь Код элемента в id таблички... как то не комильфо, если тебе код элемента ручонками исправят
21 monsterZE
 
10.06.13
17:00
(20) а.. не, не имеют права =)
коды справочников, документов - все закрыто для редактирования
у документов отдельное поле в чем юзвери пишут, что хотят
а в справочниках - нех
22 Ёпрст
 
10.06.13
17:05
я бы всё равно пихал id , а не код..ну так. на всякий :)
23 monsterZE
 
10.06.13
17:14
и... (0) (9) зря я вобщем "справочником" внешнюю табличку обозвал.. айм-сорри
trad - благодарности Ж)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший