Имя: Пароль:
1C
1С v8
как мне выполнить ту же самую работу только на SQL, а не на 1с
,
0 MAPATNK2
 
naïve
05.10.16
09:14
Здравствуйте. Такой вопрос. Писал обработку, которая выгружает всю номенклатуру в базу sql . Вот таким способом:
Соединение = Новый COMОбъект("ADODB.Connection");
    СтрокаСоединения = "DSN=PostgreSQL35W;DATABASE=Trade;SERVER=localhost;PORT=5432;UID=postgres;PWD=12345678;CA=d;A6=;A7=100;B0=255;B1=8190;BI=0;C2=dd_;CX=1c205008b;A1=7.4;";
    Соединение.ConnectionString = (СтрокаСоединения);
    Попытка
        Соединение.Open();
        Сообщить("База подключена!!!");
    Исключение
        Сообщить("Не могу подключиться к базе!!!");
    КонецПопытки;
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Код,
    |    Номенклатура.Наименование,
    |    Номенклатура.Услуга,
    |    Номенклатура.Родитель
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура";
    Результат = Запрос.Выполнить().Выгрузить();    
    я=0;
    Запрос="SELECT * FROM cls_nomenklatura";
    ТЗ=RunQuery(Запрос);
    Для каждого стр Из Результат Цикл
        //Для каждого строчка  Из ТЗ Цикл
            v = ТЗ.Найти(стр.Код,"nom_id");
            Если v=0   Тогда
                f="INSERT INTO cls_nomenklatura (nom_id, nomenklatura_name, usluga, parrents) VALUES ('"+стр.Код+"','"+стр.Наименование+"','"+стр.Услуга+"','"+стр.Родитель+"')";
                Соединение.execute(f);    
            ИначеЕСЛИ v <> 0 тогда
                m =  "update cls_nomenklatura set usluga='"+стр.Услуга+"',nomenklatura_name = '"+стр.Наименование+"',parrents = '"+стр.Родитель+"' where nom_id='"+стр.Код+"'";
                Соединение.execute(m);    
            КонецЕсли;
        //КонецЦикла;
    КонецЦикла;                                                                                             
    Соединение.Close();






Теперь появилась необходимость использовать вложенные процедуры. Не подскажете как мне выполнить ту же самую работу только на SQL, а не на 1с. тоесть передать временную таблицу в SQL, и обработать ее на совпадения уже там?
1 Ёпрст
 
05.10.16
09:16
создай глобальную временную таблицу и делай, че хочешь
2 MAPATNK2
 
naïve
05.10.16
09:16
(1) Не подскажете как это сделать? Или ссылку на пример, если не сложно. Не так давно с 1с. Маловато знаю
4 Ёпрст
 
05.10.16
09:20
(2)
дык, смотри бол или в гугле : глобальная временная таблица - фас-фас
5 MAPATNK2
 
naïve
05.10.16
09:26
(4) Спасибо, с переменной разобрался. А как производить последующее сравнение строк в SQL не подскажете?
6 Ёпрст
 
05.10.16
09:27
(5) обычный update, если rowcount = 0 после этого, тогда инсерт
7 MAPATNK2
 
naïve
05.10.16
09:42
(6) А совпадения по каким атрибутам он ищет? Т.е У меня в таблице ID номенклатуры, наименование, услуга , родитель. Я могу что либо поменять в этой строчке в SQL е. Мне нужно, чтобы отбор происходил именно по ID номенклатуре. Т.е Если в этих двух таблицах есть одинаковые ID, то заменяем строки первой таблицы на вторую(временную), если совпадения нет, то нужно добавить не совпавшие строки в первую таблицу из временной.
8 ERWINS
 
05.10.16
09:49
посмотри какая версия SQL
есть ли там
UPSERT

This page summarizes the INSERT ... ON CONFLICT UPDATE patch. This feature is popularly known as "UPSERT".
9 Ёпрст
 
05.10.16
09:50
(7) ну так и пиши, апдейт .. вере ид=ид..
10 ERWINS
 
05.10.16
09:50
кроме того одним insert ом можно сразу вставить много строк
11 ERWINS
 
05.10.16
09:55
можно первым SELECT выбрать все кода, в вторым update insert через ";" вставить.
12 МихаилМ
 
05.10.16
14:13
(8) UPSERT только в сентябрьском 9.6 появился
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой