Имя: Пароль:
1C
1C 7.7
v7: Нужна помощь с прямым запросом
,
0 Mnemonic1C
 
25.05.12
10:53
Доброго дня всем!
Кто знает, помогите с запросом, вот текст:
SELECT
   CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END AS Контрагент
   ,CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END AS Договор
   , NullIf(Max(Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime)), '17530101') МаксимумДокумент_дата
FROM _1SENTRY AS Проводки With (NOLOCK)
WHERE (Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime) <= :ДатаНачала)
   AND (((Проводки.ACCDTID IN (:СчетВзаиморасчетов))
   AND (Проводки.DTSC0 IN (:Контрагенты)))
   OR ((Проводки.ACCKTID IN (:СчетВзаиморасчетов))
   AND (Проводки.KTSC0 IN (:Контрагенты))))
GROUP BY Контрагент
    ,Договор

Запрос рабочий, проблема здесь
GROUP BY Контрагент
    ,Договор
пишет ошибку "message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Контрагент'.". Понятно что не понимает имена полей. Вопрос, как правильно оформить код. Спасибо.
1 ДенисЧ
 
25.05.12
10:56
SELECT
  CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END AS Контрагент
   ,CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END AS Договор
   , NullIf(Max(Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime)), '17530101') МаксимумДокумент_дата
FROM _1SENTRY AS Проводки With (NOLOCK)
WHERE (Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime) <= :ДатаНачала)
   AND (((Проводки.ACCDTID IN (:СчетВзаиморасчетов))
   AND (Проводки.DTSC0 IN (:Контрагенты)))
   OR ((Проводки.ACCKTID IN (:СчетВзаиморасчетов))
   AND (Проводки.KTSC0 IN (:Контрагенты))))
GROUP BY CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END
    ,CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END
2 ДенисЧ
 
25.05.12
10:56
Или сделать вложенный запрос, а потом уже группировать...
3 Mnemonic1C
 
25.05.12
10:57
Большое спасибо!
4 Mnemonic1C
 
25.05.12
12:43
Прошу ещё помочь разобраться с методом "УложитьСписокОбъектов", перепробовал несколько вариантов, вот код:

   RS = СоздатьОбъект("ODBCRecordSet");
   RS.Отладка(1);
   
   ТекстЗапроса = "
   |SELECT
   |CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END [Контрагент $Справочник.Контрагенты]
   |,CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END [Договор $Документ]
   |, NullIf(Max(Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime)), '17530101') МаксимумДокумент_дата
   |FROM _1SENTRY AS Проводки With (NOLOCK)
   |WHERE (Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime) <= :ДатаНачала)
   |AND (((Проводки.ACCDTID IN (:СчетВзаиморасчетов))
   |AND (Проводки.DTSC0 IN (SELECT Val FROM #Контрагенты)))
   |OR ((Проводки.ACCKTID IN (:СчетВзаиморасчетов))
   |AND (Проводки.KTSC0 IN (SELECT Val FROM #Контрагенты))))
   |GROUP BY CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END
   |,CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END";
   
   RS.УстановитьТекстовыйПараметр("ДатаНачала" ,НачДата);
   RS.УстановитьТекстовыйПараметр("СчетВзаиморасчетов" ,СчетПоКоду("361"));
   RS.УложитьСписокОбъектов13(сзКонтрагенты,"#Контрагенты");
   
   ТЗвыборка = СоздатьОбъект("ТаблицаЗначений");
   ТЗвыборка = RS.ВыполнитьИнструкцию(ТекстЗапроса);
   RS = "";
   ТЗвыборка.ВыбратьСтроку();
5 Mnemonic1C
 
25.05.12
12:46
Да, кстати список сзКонтрагенты, это список на форме, может в этом проблема?
6 Mnemonic1C
 
25.05.12
12:52
Апну разочек
7 Mnemonic1C
 
25.05.12
17:02
Не работает хоть плач, тупо ничего не передается во временную таблицу ни УложитьСписокОбъектов13 ни УложитьСписокОбъектов
8 Salimbek
 
25.05.12
17:10
(4) не факт, что KTSC0 - это 13-ти значное поле, скорее всего там "Неопределено", т.е. 23 символа. Посмотри лучше пару записей в реальной базе, и посмотри - какие поля и какого размера у тебя получаются.
9 Sereja
 
25.05.12
17:13
(5) ИмяТаблицы = "#ГруппаКонтрагентов";
   ЗапросSQL.УложитьСписокОбъектов(ИгнорируемыеКонтрагенты, ИмяТаблицы, "Контрагенты");
10 viktor_vv
 
25.05.12
17:18
(9)+

  |AND (Проводки.DTSC0 IN (SELECT $ВидСправочника36.Контрагенты + Val FROM #Контрагенты)))
   |OR ((Проводки.ACCKTID IN (:СчетВзаиморасчетов))
   |AND (Проводки.KTSC0 IN (SELECT $ВидСправочника36.Контрагенты +Val FROM #Контрагенты))))

Таки там Проводки.DTSC0 13-ти значное поле.

А то УложитьСписокОбъектов13 не укладывает в иерархии, а у него наверное в списке условии группы выбраны.
11 Mnemonic1C
 
25.05.12
17:20
Беда в том что даже это не работает:

   тзи = СоздатьОбъект("ТаблицаЗначений");    
   сз = СоздатьОбъект("СписокЗначений");        

   RS.Отладка(1);
   
   ТекстЗапроса = "
   |SELECT val FROM #Контрагенты_tmp
   |";
   сзКонтрагенты.Выгрузить(сз);
   RS.УложитьСписокОбъектов(сз,"#Контрагенты_tmp","Контрагенты");    
   RS.ВыполнитьИнструкцию(ТекстЗапроса,тзи);
   RS = "";
   тзи.ВыбратьСтроку();
12 viktor_vv
 
25.05.12
17:24
(11) ПРикольно. Ну а

сзКонтрагенты.Выгрузить(сз);
Сообщить(сз.РамерСписка());
   RS.УложитьСписокОбъектов(сз,"#Контрагенты_tmp","Контрагенты");
13 viktor_vv
 
25.05.12
17:29
(11) А если

Для i = 1 по сзКонтрагенты.РамзерСписка() Цикла
   Сообщить(ТипЗначенияСтр(сзКонтрагенты.ПолучитьЗначение(i)));
КонецЦикла ;

что скажет?
14 Mnemonic1C
 
25.05.12
17:31
(13) Там есть значение, у меня перед каждым выполнением, стоит сзКонтрагенты.ВыбратьЗначение("","")
15 Mnemonic1C
 
25.05.12
17:31
Так тоже не хочет,

   ТекстЗапроса = "
   |SELECT $ВидСправочника36.Контрагенты + Val FROM #Контрагенты_tmp
   |";
   сзКонтрагенты.Выгрузить(сз);
   сз.ВыбратьЗначение("","");
   RS.УложитьСписокОбъектов13(сз,"#Контрагенты_tmp");
16 viktor_vv
 
25.05.12
17:34
(15) Так еще проверь для верности тип значения, как в (13). Может там просто строки.
17 Salimbek
 
25.05.12
17:35
Х.з. обычно так работает:
   ТекстЗапроса = "
   |SELECT val FROM #Контрагенты_tmp
   |";
   сзКонтрагенты.Выгрузить(сз);
   RS.УложитьСписокОбъектов(сз,"#Контрагенты_tmp","Контрагенты");    
   тзи = СоздатьОбъект("ТаблицаЗначений");
   тзи=RS.ВыполнитьИнструкцию(ТекстЗапроса,тзи,1);
   тзи.ВыбратьСтроку();
   RS = "";
18 viktor_vv
 
25.05.12
17:42
(16)+ Таки да, если в списке значений в значениях просто строки, то уложитьОбъекты ничего не укладывает. Только если в значениях агрегатные типы данных.
19 Mnemonic1C
 
25.05.12
17:47
(18)
Пишет:
Справочник
20 Mnemonic1C
 
25.05.12
17:47
Куда ещё копнуть можно...
21 viktor_vv
 
25.05.12
18:00
(19) Ну тогда я тоже ХЗ :). Должно работать.
22 Mnemonic1C
 
25.05.12
18:01
(21) Можешь кинуть плиз работающий пример запроса со всеми определениями,  и ещё, какую версию 1cpp используешь?
23 viktor_vv
 
25.05.12
18:06
(22) Так тут надо разобраться че у тебя (11) нифига не показывает. И у меня по проводкам есть только для ДБФ под sqlite.
У тебя должно работать (9) + (10). Но сначала с (11) разобраться надо.
24 Mnemonic1C
 
25.05.12
18:09
(23) Так SQL 2000 используется...
25 viktor_vv
 
25.05.12
18:09
И у тебя вот здесь шняга какая-то

   |CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END [Контрагент $Справочник.Контрагенты]
   |,CASE Проводки.DTSC0 WHEN (:СчетВзаиморасчетов) THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END [Договор $Документ]

Проводки.DTSC0 - это первое субконто у счета, а ты сравниваешь со счетом.
26 Mnemonic1C
 
25.05.12
18:10
(25) Это да
27 viktor_vv
 
25.05.12
18:11
Сейчас попробую твой запрос прогнать у себя. Правда не до конца понял, что надо выбрать.
28 viktor_vv
 
25.05.12
18:13
И вот здесь не надо кастовать

Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime) <= :ДатаНачала)

Проводки.DATE_TIME_DOCID <= :ДатаНачала
29 Mnemonic1C
 
25.05.12
18:18
(28) Ты в ДБФ смотришь?
30 viktor_vv
 
25.05.12
18:25
В скуль.
31 Mnemonic1C
 
25.05.12
18:26
(30) А (11) работает у тебя?
32 viktor_vv
 
25.05.12
18:32
Пробую упрощенный вариант.
33 Mnemonic1C
 
25.05.12
18:33
(32) Скинь плиз длл 1c++ на [email protected]
34 viktor_vv
 
25.05.12
18:41
А кстати вспомнил, там какая-то фигня получается со значением в Проводки.DTSC0 в случае когда субконто с типом значения Справочник определенного вида.
35 viktor_vv
 
25.05.12
18:46
Вот так получилось, правда торомозить может. Приходится СокрЛП() для  Проводки.DTSC0 делать, ну и для val тоже. И вот наэто обрати внимание.
глЗапросСКЛ.УстановитьТекстовыйПараметр("СчетВзаиморасчетов" ,СчетПоКоду("36.4")); КодСчета с точками разделения на группы.
   ТекстЗапроса = "
   |SELECT
   |Проводки.DTSC0 [Контрагент $Справочник.Клиенты],
   |Проводки.DTSC0 as КлИД
   |, NullIf(Max(Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime)), '17530101') МаксимумДокумент_дата
   |FROM _1SENTRY AS Проводки With (NOLOCK)
   |WHERE Проводки.DATE_TIME_DOCID <= :ДатаНачала
   |AND (Проводки.ACCDTID  = :СчетВзаиморасчетов)
   |AND (RTrim(LTrim(Проводки.DTSC0)) IN (SELECT RTrim(LTrim(Val)) FROM #Контрагенты))
   |GROUP BY Проводки.DTSC0
   |";
   
   глЗапросСКЛ.УстановитьТекстовыйПараметр("ДатаНачала" ,фдДатаНач);
   глЗапросСКЛ.УстановитьТекстовыйПараметр("СчетВзаиморасчетов" ,СчетПоКоду("36.4"));
   глЗапросСКЛ.УложитьСписокОбъектов(Условие2,"#Контрагенты","Клиенты");
   
   глЗапросСКЛ.Отладка(1);
   ТЗ = глЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   глЗапросСКЛ.Отладка(0);
   ТЗ.ВыбратьСтроку();
36 viktor_vv
 
25.05.12
18:47
1cpp уже из дому кину.
37 Mnemonic1C
 
25.05.12
18:49
(36) Спасибо!
38 EvgeniuXP
 
25.05.12
18:53
Текущие элементы ложить надо.
39 Mnemonic1C
 
25.05.12
18:59
(38) Похоже что да, спасибо
40 sapphire
 
25.05.12
19:00
41 viktor_vv
 
25.05.12
20:21
(35)+ А вот оно что. Для Субконто определенного вида он пишет ИД объекта с самого начала строки, но без последних пробелов.
Тогда так.

   ТекстЗапроса = "
   |SELECT
   |Проводки.DTSC0 [Контрагент $Справочник.Клиенты],
   |Проводки.DTSC0 as КлИД,
   |Len(Проводки.DTSC0) as ДлинаСтроки,
   |NullIf(Max(Cast(Left(Проводки.DATE_TIME_DOCID, 8) AS datetime)), '17530101') as МаксимумДокумент_дата
   |
   |FROM  _1SENTRY AS Проводки With (NOLOCK)
   |
   |WHERE Проводки.DATE_TIME_DOCID <= :ДатаНачала
   |AND (Проводки.ACCDTID  = :СчетВзаиморасчетов)
   //|AND (RTrim(LTrim(Проводки.DTSC0)) IN (SELECT RTrim(LTrim(Val)) FROM #Контрагенты))
   |AND Проводки.DTSC0 IN (SELECT RTrim(Val) FROM #Контрагенты)
   |GROUP BY Проводки.DTSC0
   |";
   
   глЗапросСКЛ.УстановитьТекстовыйПараметр("ДатаНачала" ,фдДатаНач);
   глЗапросСКЛ.УстановитьТекстовыйПараметр("СчетВзаиморасчетов" ,СчетПоКоду("36.1"));
   глЗапросСКЛ.УложитьСписокОбъектов(Условие2,"#Контрагенты","Клиенты");
   
   глЗапросСКЛ.Отладка(1);
   ТЗ = глЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   глЗапросСКЛ.Отладка(0);
   ТЗ.ВыбратьСтроку();
42 viktor_vv
 
25.05.12
20:47
Вроде вкурил че тебе надо. Вот так.

   ТекстЗапроса = "
   |SELECT
   //|Проводки.DTSC0 [Контрагент $Справочник.Клиенты],
   |CASE WHEN Проводки.ACCDTID  = :СчетВзаиморасчетов THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END [Контрагент $Справочник.Клиенты],
   |CASE WHEN Проводки.ACCDTID  = :СчетВзаиморасчетов THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END [Договор $Документ],
   |
   |Max(Left(Проводки.DATE_TIME_DOCID, 8)) as МаксимумДокумент_дата
   |
   |FROM  _1SENTRY AS Проводки With (NOLOCK)
   |
   |WHERE Проводки.DATE_TIME_DOCID <= :ДатаНачала
   |AND
   |(
   |    ((Проводки.ACCDTID  = :СчетВзаиморасчетов)
   |        AND Проводки.DTSC0 IN (SELECT RTrim(Val) FROM #Контрагенты))
   |
   |or
   |    ((Проводки.ACCKTID  = :СчетВзаиморасчетов)
   |        AND Проводки.KTSC0 IN (SELECT RTrim(Val) FROM #Контрагенты))
   |)
   |GROUP BY
   |    CASE WHEN Проводки.ACCDTID  = :СчетВзаиморасчетов THEN Проводки.DTSC0 ELSE Проводки.KTSC0 END,
   |    CASE WHEN Проводки.ACCDTID  = :СчетВзаиморасчетов THEN Проводки.DTSC1 ELSE Проводки.KTSC1 END
   |";
   
   глЗапросСКЛ.УстановитьТекстовыйПараметр("ДатаНачала" ,фдДатаНач);
   глЗапросСКЛ.УстановитьТекстовыйПараметр("СчетВзаиморасчетов" ,СчетПоКоду("36.1"));
   глЗапросСКЛ.УложитьСписокОбъектов(Условие2,"#Контрагенты","Клиенты");
   
   глЗапросСКЛ.Отладка(1);
   ТЗ = глЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   глЗапросСКЛ.Отладка(0);
   ТЗ.ВыбратьСтроку();

Насчет СчетПоКоду("36.1") с разделением на группы, это у меня в конфе субсчета так заведены, в типовой вроде как без точек.
43 Mnemonic1C
 
25.05.12
22:09
Спасибо всем, реально помогли парни!