|
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
|
Спасибо всем, реально помогли парни!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |