Имя: Пароль:
1C
1C 7.7
v7: Прямые запросы к БД: Получить Primary Key
,
0 OnePrg
 
28.09.21
09:33
Как в запросе к таблице БД добавить столбец со значением Primary Key?
1 OnePrg
 
28.09.21
09:34
SQL
2 ADirks
 
28.09.21
09:35
(0) вот интересно, а откуда ты узнал про Primary Key?
3 mikecool
 
28.09.21
09:36
(0) кто есть PK в твоей таблице? вот его и добавляй
4 pechkin
 
28.09.21
09:39
Alter table
5 OnePrg
 
28.09.21
09:41
(3) а если PK состоит из нескольких полей?

мне нужно выбрать записи из таблицы и в зависимости от значений двух полей в ней и удалить эти записи

если удалять по одной, то долго, хочу собрать в список все PK и удалить одним запросом
6 Ёпрст
 
28.09.21
09:42
(5) годная трава
7 OnePrg
 
28.09.21
09:42
8 youalex
 
28.09.21
09:49
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
9 ДенисЧ
 
28.09.21
09:50
А зачем в запросе добавлять ПК?
Он уже есть. Только в таблице...
10 Ёпрст
 
28.09.21
09:51
(7) и ?
Конечная цель какая? Тебе же вроде Майк давал готовое изделие по очистке таблички регистрации объектов.
11 OnePrg
 
28.09.21
09:52
(4) мне не нужно изменять саму таблицу БД, мне нужно выбрать запросом поля таблицы и левым соединением прикрутить ещё уникальный идентификатор записи таблицы
12 OnePrg
 
28.09.21
09:53
(10) Не нахожу у себя, бл....! Покорно прошу сбросить ещё раз.
13 ДенисЧ
 
28.09.21
09:54
(11) Открой свойства твоего ПК и добавь в запрос колонки из него
14 ADirks
 
28.09.21
10:06
(11) трава ваще годная, уважаю
15 mikecool
 
28.09.21
10:08
(5) если два твоих поля есть в РК, и если они идут в порядке друг за другом - РК итак будет использован
даже если не по порядку )
16 ДенисЧ
 
28.09.21
10:08
(14) Трава такого не даёт. Это грибы...
17 mikecool
 
28.09.21
10:09
(16) снимаю шляпу перед экспертом
18 OnePrg
 
28.09.21
10:10
Сейчас я удаляю записи из таблицы так: выгружаю таблицу в таблицу значений, перебираю её, по двум полям определяю запись, которую нужно удалить и удаляю

                    ТекстЗапроса = "
                    |DELETE
                    |    _1SUPDTS
                    |FROM
                    |    _1SUPDTS as U
                    |WHERE
                    |    U.OBJID=:OBJID AND U.DBSIGN=:DBSIGN";
                    RS.УстановитьТекстовыйПараметр("OBJID",  тбОбмен.OBJID);
                    RS.УстановитьТекстовыйПараметр("DBSIGN", тбОбмен.DBSIGN);
                    RS.ВыполнитьИнструкцию(ТекстЗапроса);


Хочу сделать это одним запросом, а не запросом в цикле.
19 mikecool
 
28.09.21
10:13
delete
from
where (поле1, поле2) in(набор пар)
20 OnePrg
 
28.09.21
10:14
(19) а набор пар как задать?
21 Ёпрст
 
28.09.21
10:15
https://infostart.ru/public/15830/
Как вариант, ибо Майка выиезали с нимфостарта
22 Ёпрст
 
28.09.21
10:16
(18) ну в запросе, в котором определяешь, замени select на delete
23 Ёпрст
 
28.09.21
10:16
Усё
24 Mikeware
 
28.09.21
10:20
(12) ты издеваешься, чтоль? просмотреть пяток своих же тем - что тебе не позволяет?????
Зависание обмена РиБ
25 Mikeware
 
28.09.21
10:20
(21) кстати, непонятно почему
26 youalex
 
28.09.21
10:25
(18) создай из таблицы временную (как в твоем контексте это сделать - не знаю синтаксис)
и сделай join c ней

DELETE U
FROM _1SUPDTS as U
JOIN #t t
  on U.OBJID = t.OBJID AND U.DBSIGN = t.DBSIGN
27 OnePrg
 
28.09.21
10:55
(22) спасибо, втупил, искал по названию темы и не сообразил, тема-то была про зависание обмена
28 OnePrg
 
28.09.21
11:51
(26) как можно таблицу значений запихнуть во временную таблицу в прямых запросах? можно пример

SELECT
  *
INTO #t
FROM
  :tabl as t;

так правильно?
29 OnePrg
 
28.09.21
11:53
А вот нашёл

ТЗ = СоздатьОбъект("ТаблицаЗначений");
     ТЗ.НоваяКолонка("Раз");
     ТЗ.НоваяКолонка("Два");
     Для сч = 1 По 100 Цикл
           ТЗ.НоваяСтрока();
           ТЗ.Раз = сч;
           ТЗ.Два = сч * 5;
     КонецЦикла;
    
     Запрос = СоздатьОбъект("ODBCRecordset");
     Запрос.Выполнить("
     |create table MyTable(Раз int, Два int)");
     Запрос.Подготовить("
     |insert into MyTable(Раз, Два)
     |values(?, ?)");
     Запрос.ВыполнитьSQL_ИзТЗ(ТЗ);
    
     ТЗ1 = Запрос.ВыполнитьИнструкцию("select * from MyTable");
     ТЗ1.ВыбратьСтроку();
     Запрос.Выполнить("drop table MyTable");


Всем спасибо.
30 OnePrg
 
01.10.21
06:45
(19)

   |DELETE
   |    _1SUPDTS
   |FROM
   |    _1SUPDTS as U
   |WHERE (U.OBJID, U.DBSIGN) in (SELECT val FROM #тбУдалять as тбУдалять)


Рядом с "," в контексте, где ожидается условие, указано выражение типа, отличного от логического.
31 OnePrg
 
01.10.21
06:52
Получилось

    //***************************************
    //     создаём временную таблицу склады
    //***************************************
    тбСкладыЗаполнить();
    //тбСклады.ВыбратьСтроку();
    RS = СоздатьОбъект("ODBCRecordset");
    RS.ВыполнитьСкалярный("
          |IF OBJECT_ID('tempdb..#ТаблВрем', 'U') IS NOT NULL
          |  DROP TABLE #ТаблВрем;
          |CREATE TABLE #ТаблВрем (КодИБ Char(3),Склад int);");
    RS.Подготовить("
      |insert into #ТаблВрем(КодИБ, Склад)
      |values(?, ?)");
    RS.ВыполнитьSQL_ИзТЗ(тбСклады);
    
    ТекстЗапроса = "
    |SELECT
    |    U.OBJID as [Док $Документ],
    |    J.IDDocDef as Док_вид,
    |   Склады.ID as [Склад $Справочник.МестаХранения],                            
    |   U.DBSIGN,
    |   U.OBJID
    |FROM
    |    _1SUPDTS as U
    |INNER JOIN
    |    _1Sjourn as J ON U.TypeID=J.IDDocDef And U.OBJID=J.IDDoc
    |LEFT JOIN
    |    #ТаблВрем as ТаблВрем ON U.DBSIGN=ТаблВрем.КодИБ
    |LEFT JOIN
    |    $Справочник.МестаХранения as Склады ON ТаблВрем.Склад = Склады.Code";
    
    тбОбмен = RS.ВыполнитьИнструкцию(ТекстЗапроса);
    //тбОбмен.ВыбратьСтроку();
    //Возврат;
    Сообщить(тбОбмен.КоличествоСтрок());  
    
    //спКодИБ_НетСклада    = СоздатьОбъект("СписокЗначений");

    тбУдалять = СоздатьОбъект("ТаблицаЗначений");
    тбУдалять.НоваяКолонка("OBJID");
    тбУдалять.НоваяКолонка("DBSIGN");
    
    тбОбмен.ВыбратьСтроки();
    Пока тбОбмен.ПолучитьСтроку()=1 Цикл        
        Удалять = 0;
        Если ПустоеЗначение(тбОбмен.Склад) = 1 Тогда
            Удалять = 1;
        ИначеЕсли ДокументСклада(тбОбмен.Док,тбОбмен.Склад) = 0 Тогда
            Удалять = 1;
        КонецЕсли;
        
        Если Удалять = 1 Тогда
            тбУдалять.НоваяСтрока();
            тбУдалять.OBJID     = тбОбмен.OBJID;
            тбУдалять.DBSIGN     = тбОбмен.DBSIGN;
        КонецЕсли;
    КонецЦикла;
    
    RS.ВыполнитьСкалярный("
          |IF OBJECT_ID('tempdb..#тбУдалять', 'U') IS NOT NULL
          |  DROP TABLE #тбУдалять;
          |CREATE TABLE #тбУдалять (OBJID Char(9),DBSIGN Char(3));");
    RS.Подготовить("
      |insert into #тбУдалять(OBJID, DBSIGN)
      |values(?, ?)");
    RS.ВыполнитьSQL_ИзТЗ(тбУдалять);

    ТекстЗапроса = "
    |DELETE
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U          
    |INNER JOIN
    |   #тбУдалять as тбУдалять ON U.OBJID = тбУдалять.OBJID and U.DBSIGN = тбУдалять.DBSIGN";
    RS.ВыполнитьИнструкцию(ТекстЗапроса);

    
    //***************************************
    //     очищаем справоник переоценки
    //***************************************

    ТекстЗапроса = "
    |DELETE
    |    _1SUPDTS
    |FROM
    |    _1SUPDTS as U2
    |INNER JOIN
    |    $Справочник.Переоценки as Переоценки ON U2.TypeID=3494 And  U2.OBJID=Переоценки.ID
    |LEFT JOIN
    |    #ТаблВрем as ТаблВрем ON U2.DBSIGN=ТаблВрем.КодИБ
    |LEFT JOIN
    |    $Справочник.МестаХранения as Склады ON ТаблВрем.Склад = Склады.Code
    |WHERE
    |   Склады.ID <> $Переоценки.Склад";
    тбОбмен = RS.ВыполнитьИнструкцию(ТекстЗапроса);
32 Ёпрст
 
01.10.21
10:24
(31) все в топку.
Временная табличка там не нужна, подготовленный текс запроса тоже, кучка запросов и между ними код, тоже.
Выкинуть всё. Написать ОДИН запрос на delete из таблички упдс по условию. Усё.
33 OnePrg
 
01.10.21
10:36
(32) в следующий раз может быть так и сделаю
сейчас задача достигнута - вместо часа 5 минут
и что переделка улучшит? пару секунд быстрее?
34 OnePrg
 
01.10.21
10:38
(32) для чего код нужен был - чтобы привязать код ИБ к складу
как это можно без кода сделать?
добавить в склад реквизит "КодИБ"?
35 OnePrg
 
01.10.21
10:41
(32)
+ нужно определять принадлежит ли этот документ Складу не только по шапке но и для некоторых документов по табличной части
36 Ёпрст
 
01.10.21
11:22
(33) вот так и будешь г..о кодить, даже с наличием хорошего инструмента.
37 Ёпрст
 
01.10.21
11:22
И ты не поверишь, но прямые запросы тоже надо оптимизировать
38 ДенисЧ
 
01.10.21
11:24
(37) Что за ересь ты гонишь? На каждом заборе написано, что прямые запросы рулят.
А тут ещё, оказывается, их оптимизировать надо...
39 Ёпрст
 
01.10.21
11:27
(38) а точно, совсем забыл. Да из коробки же..как и снеговик )
40 Arbuz
 
01.10.21
15:11
Вот есть молоток для забивания гвоздей. Берём гвозди раскладываем кучками в виде пентаграмм. Кидаем кубики-зарики. Свистим в свисток сколько выпало. Мажем ручку молотка клеем. Сначала засовываем на сколько можем гвоздь плоскогубцами. Потом забиваем молотком. Работает же - цель достигнута!
41 youalex
 
01.10.21
15:16
(37) Вообще-то,  ТС и оптимизировал (без иронии)
Как я понял, у него был delete в цикле (со всеми накладными расходами), а он сделал его джойном с вт.
То что оптимизация не оптимальна ("вместо часа 5 минут") - а могло бы и 1 минут, уже следующий вопрос.
42 Ёпрст
 
01.10.21
15:24
(41) ага, заместо взять готовый код и переписать под себя, изобретает велосипед
43 Arbuz
 
01.10.21
15:28
(41) ага, оптимизируем - выкидываем из моего алгоритма кубики и свисток ))))))
44 youalex
 
01.10.21
16:09
(43) Пентаграммой было бы создать в скуле хранимку (если прав хватит, то и из 1С) , и дергать ее из 1С, отдавая на вход данные тбСклады в xml
45 Arbuz
 
01.10.21
16:16
(44) А как же микросервис на Go?
46 Arbuz
 
01.10.21
16:24
+(45) отдаёшь ему POST'ом JSON, а он тебе времянку в скуле.
Если к ж#пе присобачить сопроцессор фирмы CRAY, можно с#ать в два унитаза в сорок тысяч раз быстрей (с)
Независимо от того, куда вы едете — это в гору и против ветра!