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