|
v7: Отбор в прямом запросе | ☑ | ||
---|---|---|---|---|
0
Альбатрос
18.04.13
✎
09:34
|
Мужики, подскажите, что не так.
Было вот так и работало: ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) |SELECT | Клиенты.ID, | ЮрЛица.ID, | $Справочник.ЮрЛица.ТорговаяСеть |FROM | $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK) | INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK) | ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID |WHERE | $Справочник.ЮрЛица.ТорговаяСеть = ? |AND | $Справочник.Клиенты = ? |AND | $Справочник.ЮрЛица = ? |"; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Добавил еще 2 условия и не работает... (((( без ошибок, но щаписей нет: ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) |SELECT | Клиенты.ID, | ЮрЛица.ID, | $Справочник.ЮрЛица.ТорговаяСеть |FROM | $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK) | INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK) | ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID |WHERE | $Справочник.ЮрЛица.ТорговаяСеть = ? |AND | $Справочник.Клиенты = ? |AND | $Справочник.ЮрЛица = ? |"; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть); глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка); глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
1
Wobland
18.04.13
✎
09:35
|
это два одинаковых куска текста?
|
|||
2
spock
18.04.13
✎
09:37
|
$Справочник.Клиенты = ?
$Справочник.ЮрЛица = ? о_О |
|||
3
Альбатрос
18.04.13
✎
09:38
|
(1) Сори, в первом вот так:
ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) |SELECT | Клиенты.ID, | ЮрЛица.ID, | $Справочник.ЮрЛица.ТорговаяСеть |FROM | $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK) | INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK) | ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID |WHERE | $Справочник.ЮрЛица.ТорговаяСеть = ? |"; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
4
Альбатрос
18.04.13
✎
09:39
|
(2) так низзя? =)
|
|||
5
sapphire
18.04.13
✎
09:39
|
| $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
Здесь объявлен алиас таблицы $Справочник.ЮрЛица стало быть | $Справочник.ЮрЛица.ТорговаяСеть = ? - неверно, а условие | $Справочник.Клиенты = ? вообще бред ибо $Справочник.Клиенты - это таблица |
|||
6
spock
18.04.13
✎
09:40
|
(4)можно, но работать не будет.
|
|||
7
sapphire
18.04.13
✎
09:41
|
(0) Было вот так и работало -
Не верю! (с) |
|||
8
sapphire
18.04.13
✎
09:41
|
(6) Ну метаскулю - поровну, а вот СУБД - вряд ли :)
|
|||
9
Mikeware
18.04.13
✎
09:43
|
чойто я насторожился....
неужто бананан-2? |
|||
10
sapphire
18.04.13
✎
09:43
|
// А если так?
ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) |SELECT | Клиенты.ID, | ЮрЛица.ID, | $Справочник.ЮрЛица.ТорговаяСеть |FROM | $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK) | INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK) | ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID |WHERE | $ЮрЛица.ТорговаяСеть = ? |AND | Клиенты.ID = ? |AND | ЮрЛица.ID = ? |"; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть); глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка); глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
11
sapphire
18.04.13
✎
09:44
|
(9) Не, он до времянок и параметров врядли дошел.
Долбобей таки. |
|||
12
Альбатрос
18.04.13
✎
09:45
|
(7) Клянусь! =)
|
|||
13
Альбатрос
18.04.13
✎
09:50
|
(10) не, так не пашет
Начало выгрузки: 18.04.13 13:50:59 Ошибка исполнения обработчика: ПВД_ПередОбработкойПравила_ПродажиТовараНал - Недопустимое значение индекса параметра Выгружено объектов: 0 Окончание выгрузки: 18.04.13 13:50:59 |
|||
14
Альбатрос
18.04.13
✎
09:53
|
Перед этим запросом еще такая штука есть:
ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt1')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt1"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; |
|||
15
Альбатрос
18.04.13
✎
09:57
|
(10) Неее, втупляю, как раз так работает. Спасибо!!!
|
|||
16
sapphire
18.04.13
✎
09:57
|
ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) VALUES(?,?,?)";
|
|||
17
sapphire
18.04.13
✎
09:58
|
(15) Или тебе еще проверки нужны?
|
|||
18
Альбатрос
18.04.13
✎
09:59
|
Ради просвещения объясните, что происходит в этих строчках:
ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt1')"; |
|||
19
Альбатрос
18.04.13
✎
09:59
|
(17) Нет, это все проверки =) еще раз спасибо!
|
|||
20
sapphire
18.04.13
✎
10:02
|
(14) ...
Я писал уже - ищи на просторахъ книжко Основы t-SQL. Автор Ицик Бен-Ган. ТекстЗапроса = " |IF OBJECT_ID('tempdb..#tt1') IS NOT NULL |DROP TABLE #tt1 |CREATE TABLE #tt1(f_0 char(9), f_1 char(9), f_2 char(9)) |INSERT INTO #tt1(f_0, f_1, f_2) |SELECT | Клиенты.ID, | ЮрЛица.ID, | $Справочник.ЮрЛица.ТорговаяСеть |FROM | $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK) | INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK) | ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID |WHERE | $ЮрЛица.ТорговаяСеть = ? |AND | Клиенты.ID = ? |AND | ЮрЛица.ID = ? |"; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть); глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка); глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
21
sapphire
18.04.13
✎
10:02
|
(18) ФИгня. Так никто не пишет
|
|||
22
sapphire
18.04.13
✎
10:03
|
(18) Проверка, что такая таблица уже существует.
|
|||
23
Mikeware
18.04.13
✎
10:03
|
(18) так вроде все написано. только сомнения в адекватности писавшего это возникают...
|
|||
24
sapphire
18.04.13
✎
10:05
|
(23) или я уже привык, или принято такъ:
|IF OBJECT_ID('tempdb..#tt1') IS NOT NULL |DROP TABLE #tt1 |CREATE TABLE #tt1(f_0 char(9), f_1 char(9), f_2 char(9)) |
|||
25
Альбатрос
18.04.13
✎
10:06
|
(22) Типо если такая временная таблица существует, он ее уничтожает и создает заново. Ясненько...
Книжку уже качаю, спасибо в третий раз =) |
|||
26
sapphire
18.04.13
✎
10:09
|
(25) Вообще нахрена такой сыр-бор с join-ами, если речь об операции вставки во времянку.
ИМХается мне, что там быдлокод внутри :( |
|||
27
Mikeware
18.04.13
✎
10:11
|
(24) дык нафига 1 или 0 переводить в "есть" или "нет"?
и потом сравнивать с "есть"... |
|||
28
sapphire
18.04.13
✎
10:14
|
(25) Грубо, если проверять платформой параметры, то запрос вообще вырождается в :
|IF OBJECT_ID('tempdb..#tt1') IS NOT NULL |DROP TABLE #tt1 |CREATE TABLE #tt1(f_0 char(9), f_1 char(9), f_2 char(9)) |INSERT INTO #tt1(f_0, f_1, f_2) VALUES(?,?,?) Тогда ясно, что ,скорее всего, код на стороне 1С неоптимален, ибо есть инструкция типа (точно не воспроизведу) ВыполнитьSQL_ИзТЗ |
|||
29
Альбатрос
18.04.13
✎
10:19
|
(26) Могу выложить, если глаз не жалко =)
|
|||
30
Альбатрос
18.04.13
✎
10:19
|
(27) совершенно согласен
|
|||
31
Альбатрос
18.04.13
✎
10:20
|
+(29) там дальше вообще ахинея полная ))) Но работает )))
|
|||
32
sapphire
18.04.13
✎
10:26
|
(29) Ну выложи, мы и не такое видали :)
|
|||
33
Альбатрос
18.04.13
✎
10:30
|
(32) Сами напросились)))
// выборка всех клиентов торговой сети во временную таблицу #tt1 // Реквизиты: // Клиент, ЮрЛицо, ТорговаяСеть // Состояние("выборка всех клиентов торговой сети..."); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt1')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt1"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt1(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(9))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) |SELECT | Клиенты.ID, | ЮрЛица.ID, | $Справочник.ЮрЛица.ТорговаяСеть |FROM | $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK) | INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK) | ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID |WHERE | $ЮрЛица.ТорговаяСеть = ?"; Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда ТекстЗапроса = ТекстЗапроса+ "AND | Клиенты.ID = ?"; КонецЕсли; Если ПустоеЗначение(Параметры.ЮрЛицо) = 0 тогда ТекстЗапроса = ТекстЗапроса+ "AND | ЮрЛица.ID = ?"; КонецЕсли; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть); Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка); КонецЕсли; Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); // выборка всех документов отгрузки по клиентам торговой сети "К100" во временную таблицу #tt2 // Реквизиты: // Ссылка, Дата, Номер, Клиент, Фирма, Склад // Состояние("выборка всех документов отгрузки по клиентам торговой сети..."); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt2')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt2"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt2(f_0 CHAR(9), f_1 DATETIME, f_2 CHAR(13), f_3 CHAR(9), f_4 CHAR(9), f_5 CHAR(9))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt2(f_0, f_1, f_2, f_3, f_4, f_5) |SELECT | Журнал.IDDOC, | CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME), | Журнал.DOCNO, | Журнал.SP1165, | Журнал.SP1005, | $Документ.РасходнаяКредит.Склад |FROM | _1SJOURN as Журнал WITH(NOLOCK) | INNER JOIN #tt1 as Клиенты | ON Клиенты.f_0 = Журнал.SP1165 | INNER JOIN $Документ.РасходнаяКредит as РасходнаяКредит WITH(NOLOCK) | ON РасходнаяКредит.IDDOC = Журнал.IDDOC |WHERE | CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME) BETWEEN ? AND ? |"; глЗапросSQL.Подготовить(ТекстЗапроса); Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда глЗапросSQL.УстПараметр(1, ДатаНачала); глЗапросSQL.УстПараметр(2, ДатаОкончания); КонецЕсли; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); // выборка всех ценников торговой сети в отдельную таблицу #tt3 // Реквизиты: // Ссылка, Контрагент, Дата, ПозицияДокумента // Состояние("выборка всех ценников торговой сети"); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt3')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt3"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt3(f_0 CHAR(9), f_1 CHAR(9), f_2 DATETIME, f_3 CHAR(23))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt3(f_0, f_1, f_2, f_3) |SELECT DISTINCT | Ценники.IDDOC, | RIGHT($Документ.Ценники.Контрагент, 9), | CONVERT(DATETIME, LEFT(Журнал.DATE_TIME_IDDOC, 8), 12), | Журнал.DATE_TIME_IDDOC |FROM | $Документ.Ценники as Ценники WITH(NOLOCK) | INNER JOIN #tt1 as Клиенты | ON Клиенты.f_0 = RIGHT($Документ.Ценники.Контрагент, 9) OR Клиенты.f_1 = RIGHT($Документ.Ценники.Контрагент, 9) | OR Клиенты.f_2 = RIGHT($Документ.Ценники.Контрагент, 9) | INNER JOIN _1SJOURN as Журнал WITH(NOLOCK) | ON Журнал.IDDOC = Ценники.IDDOC |"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); // на дату каждого документа отгрузки нужно найти по одному ближайшему // по дате "слева" ценнику по клиенту, юрлицу и торговой сети #tt4 // Реквизиты: // Ссылка, ПозицияЦенникаПоКлиенту, ПозицияЦенникаПоЮрЛицу, ПозицияЦенникаПоТС // Состояние("поиск ценников на документы отгрузки"); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt4')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt4"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt4(f_0 CHAR(9), f_1 CHAR(23), f_2 CHAR(23), f_3 CHAR(23))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt4(f_0, f_1, f_2, f_3) |SELECT | ВложЗапрос.Ссылка, | MAX(ЦенникиПоКлиенту), | MAX(ЦенникиПоЮрЛицу), | MAX(ЦенникиПоТС) |FROM | (SELECT | Документ.Ссылка, | ЦенникиПоКлиенту.f_3 as ЦенникиПоКлиенту, | ЦенникиПоЮрЛицу.f_3 as ЦенникиПоЮрЛицу, | ЦенникиПоТС.f_3 as ЦенникиПоТС | FROM | (SELECT | Клиенты.f_0 as Клиент, | Клиенты.f_1 as ЮрЛицо, | Клиенты.f_2 as ТС, | РасходнаяКредит.f_0 as Ссылка, | РасходнаяКредит.f_1 as Дата | FROM | #tt2 as РасходнаяКредит | INNER JOIN #tt1 as Клиенты | ON Клиенты.f_0 = РасходнаяКредит.f_3 | ) as Документ | LEFT JOIN #tt3 as ЦенникиПоКлиенту | ON ЦенникиПоКлиенту.f_1 = Документ.Клиент AND ЦенникиПоКлиенту.f_2 <= Документ.Дата | LEFT JOIN #tt3 as ЦенникиПоЮрЛицу | ON ЦенникиПоЮрЛицу.f_1 = Документ.ЮрЛицо AND ЦенникиПоЮрЛицу.f_2 <= Документ.Дата | LEFT JOIN #tt3 as ЦенникиПоТС | ON ЦенникиПоТС.f_1 = Документ.ТС AND ЦенникиПоТС.f_2 <= Документ.Дата | ) as ВложЗапрос |GROUP BY | ВложЗапрос.Ссылка"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); // выборка всех ценников по документам отгрузки по клиентам торговой сети "К100" во // временную таблицу #tt5 // Реквизиты: // СсылкаДокументОтгрузки, СсылкаЦенник // Состояние("определение вида ценника по документу отгрузки"); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt5')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt5"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt5(f_0 CHAR(9), f_1 CHAR(9))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt5(f_0, f_1) |SELECT | ЦенникиПоДокументамОтгрузки.f_0, | CASE | WHEN ЦенникиПоКлиенту_Шапка.SP7164 = 0 THEN ЦенникиПоКлиенту_Шапка.IDDOC | WHEN ЦенникиПоЮрЛицу_Шапка.SP7164 = 0 THEN ЦенникиПоЮрЛицу_Шапка.IDDOC | WHEN ЦенникиПоТС_Шапка.SP7164 = 0 THEN ЦенникиПоТС_Шапка.IDDOC | ELSE NULL | END |FROM | #tt4 as ЦенникиПоДокументамОтгрузки | LEFT JOIN #tt3 as ЦенникиПоКлиенту | ON ЦенникиПоКлиенту.f_3 = ЦенникиПоДокументамОтгрузки.f_1 | LEFT JOIN $Документ.Ценники as ЦенникиПоКлиенту_Шапка WITH(NOLOCK) | ON ЦенникиПоКлиенту_Шапка.IDDOC = ЦенникиПоКлиенту.f_0 | LEFT JOIN #tt3 as ЦенникиПоЮрЛицу | ON ЦенникиПоЮрЛицу.f_3 = ЦенникиПоДокументамОтгрузки.f_2 | LEFT JOIN $Документ.Ценники as ЦенникиПоЮрЛицу_Шапка WITH(NOLOCK) | ON ЦенникиПоЮрЛицу_Шапка.IDDOC = ЦенникиПоЮрЛицу.f_0 | LEFT JOIN #tt3 as ЦенникиПоТС | ON ЦенникиПоТС.f_3 = ЦенникиПоДокументамОтгрузки.f_3 | LEFT JOIN $Документ.Ценники as ЦенникиПоТС_Шапка WITH(NOLOCK) | ON ЦенникиПоТС_Шапка.IDDOC = ЦенникиПоТС.f_0 |"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); // выборка всех табличных частей документов отгрузки по клиентам (на основе оборотов // регистра "продажи") во временную таблицу #tt6 // Реквизиты: // Ссылка, Товар, ГТД, Импортер, Количество, Сумма // Состояние("формирование табличной части документов"); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt61')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt61"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt61(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(13), f_3 NUMERIC(19,2), f_4 NUMERIC(19,2))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt61(f_0, f_1, f_2, f_3, f_4) |SELECT | Продажи.IDDOC, | Продажи.SP4877, | Продажи.SP4876, | Продажи.SP4878, | Продажи.SP4879 |FROM | #tt2 as РасходнаяКредит_Шапка | INNER JOIN DT410 as РасходнаяКредит_ТабЧасть WITH(NOLOCK) | ON РасходнаяКредит_ТабЧасть.IDDOC = РасходнаяКредит_Шапка.f_0 | INNER JOIN RA4872 as Продажи WITH(NOLOCK) | ON Продажи.IDDOC = РасходнаяКредит_ТабЧасть.IDDOC | AND Продажи.SP4877 = РасходнаяКредит_ТабЧасть.SP423 |"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt6')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt6"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt6(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(500), f_3 CHAR(9), f_4 NUMERIC(19,2), f_5 NUMERIC(19,2))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); ТекстЗапроса = "INSERT INTO #tt6(f_0, f_1, f_2, f_3, f_4, f_5) |SELECT | tab1.f_0, | tab1.f_1, | ПриходДатыРозлива_ТабЧасть.SP3229, | ПриходДатыРозлива_ТабЧасть.SP7031, | SUM(tab1.f_3), | SUM(tab1.f_4) |FROM | #tt61 as tab1 | LEFT JOIN(SELECT | Продажи.f_0, | Продажи.f_1, | Продажи.f_2, | ПриходДатыРозлива_ТабЧасть.IDDOC as IDDOC, | MIN(ПриходДатыРозлива_ТабЧасть.LINENO_) as LINENO_ | FROM | #tt61 as Продажи | INNER JOIN $Документ.ПриходДатыРозлива as ПриходДатыРозлива_Шапка WITH(NOLOCK) | ON $Документ.ПриходДатыРозлива.ДокументОснование = Продажи.f_2 | INNER JOIN DT2166 as ПриходДатыРозлива_ТабЧасть WITH(NOLOCK) | ON ПриходДатыРозлива_ТабЧасть.IDDOC = ПриходДатыРозлива_Шапка.IDDOC | AND ПриходДатыРозлива_ТабЧасть.SP2162 = Продажи.f_1 | GROUP BY | Продажи.f_0, | Продажи.f_1, | Продажи.f_2, | ПриходДатыРозлива_ТабЧасть.IDDOC) as tab2 | ON tab2.f_0 = tab1.f_0 AND tab2.f_1 = tab1.f_1 AND tab2.f_2 = tab1.f_2 | LEFT JOIN DT2166 as ПриходДатыРозлива_ТабЧасть WITH(NOLOCK) | ON ПриходДатыРозлива_ТабЧасть.IDDOC = tab2.IDDOC | AND ПриходДатыРозлива_ТабЧасть.LINENO_ = tab2.LINENO_ |GROUP BY | tab1.f_0, | tab1.f_1, | ПриходДатыРозлива_ТабЧасть.SP3229, | ПриходДатыРозлива_ТабЧасть.SP7031 |"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); // соединение "шапки" и табличной части документов отгрузки в запросе с итогами по // документу отгрузки - результирующий запрос // Реквизиты: // Ссылка, Дата, Номер, Клиент, Фирма, Склад, СуммаДокумента / Товар, Количество, Цена, // Сумма, СсылкаПрихода, НомерСтрокиПрихода // Состояние("выборка документов"); ТекстЗапроса = "SELECT | f_0 [Документ $Документ.РасходнаяКредит], | f_00 [Ценник $Документ.Ценники], | f_1 [Товар $Справочник.Товары], | f_2 as ГТД, | f_3 [Импортер $Справочник.Импортеры], | f_4 as Количество, | f_5 as Сумма, | level as УровеньГруппировки |FROM | (SELECT | f_0, | '' as f_00, | f_1, | f_2, | f_3, | f_4, | f_5, | 2 as level | FROM | #tt6 | UNION ALL | SELECT | tab1.f_0, | tab2.f_1 as f_00, | '' as f_1, | '' as f_2, | '' as f_3, | 0 as f_4, | SUM(tab1.f_5) as f_5, | 1 as level | FROM | #tt6 as tab1 | LEFT JOIN #tt5 as tab2 | ON tab2.f_0 = tab1.f_0 | GROUP BY | tab1.f_0, tab2.f_1) as Ins |ORDER BY | f_0, | f_1 | "; Попытка Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Исключение Сообщить(глЗапросSQL.ПолучитьОписаниеОшибки()); Отказ = 1; Возврат 0; КонецПопытки; ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений"); ВыборкаДанных.НоваяКолонка("алкЛицензия"); ВыборкаДанных.НоваяКолонка("алкСкладКонтрагента"); ВыборкаДанных.НоваяКолонка("ВалютаДокумента"); ВыборкаДанных.НоваяКолонка("ДатаВходящегоДокумента"); ВыборкаДанных.НоваяКолонка("ДоговорКонтрагента"); ВыборкаДанных.НоваяКолонка("Контрагент"); ВыборкаДанных.НоваяКолонка("НомерВходящегоДокумента"); ВыборкаДанных.НоваяКолонка("Организация"); ВыборкаДанных.НоваяКолонка("Подразделение"); ВыборкаДанных.НоваяКолонка("Склад"); ВыборкаДанных.НоваяКолонка("СуммаДокумента"); ВыборкаДанных.НоваяКолонка("Дата"); ВыборкаДанных.НоваяКолонка("ПометкаУдаления"); ВыборкаДанных.НоваяКолонка("Товары"); ВыборкаДанных.НоваяКолонка("алкИдентификатор"); ВыборкаДанных.НоваяКолонка("Проведен"); Накладные = СоздатьОбъект("Документ.РасходнаяКредит"); Ценники = СоздатьОбъект("Документ.Ценники"); Результат.ВыбратьСтроки(); Пока Результат.ПолучитьСтроку() = 1 Цикл УровеньГруппировки = Результат.УровеньГруппировки; Если УровеньГруппировки = 1 Тогда Накладная = Результат.Документ; Состояние("обработка документа " + Накладная); Если Накладные.НайтиДокумент(Накладная) = 0 Тогда Сообщить("ошибка обмена данных - не найден документ"); Отказ = 1; Возврат 0; КонецЕсли; // ценники ТзТовары = СоздатьОБъект("ТаблицаЗначений"); ТзТовары.НоваяКолонка("Товар"); ТзТовары.НоваяКолонка("ЦенаРозн"); ТзТовары.НоваяКолонка("МинЦена"); СпсТовары = СоздатьОБъект("СписокЗначений"); Накладные.ВыгрузитьТабличнуюЧасть(СпсТовары,"Товар"); ТзТов = СоздатьОБъект("ТаблицаЗначений"); Накладные.ВыгрузитьТабличнуюЧасть(ТзТов); //-------------------------------- ПараметрыЦенников = СоздатьОБъект("СписокЗначений"); ПараметрыЦенников.Установить("Дата",Накладная.ДатаДок); ПараметрыЦенников.Установить("Документ",Накладная); ПараметрыЦенников.Установить("Спецификация",1); //что печатать ПараметрыЦенников.Установить("Ценник",1); //что печатать ПараметрыЦенников.Установить("ТаблицаДокумента",ТзТов); //передаем документ, как таблицу ПараметрыЦенников.Установить("#Действие","Таблица"); //чтоб вернула таблицу с ценниками ПараметрыЦенников.Установить("ВыходнаяТаблица",""); //сюда возвращает таблицу с ценниками глОткрытьВнешнююОбработкуОтчет("Ценник",,0,ПараметрыЦенников); ТЗВозвр = ПараметрыЦенников.ПолучитьЗначение(7,"ВыходнаяТаблица"); Если ТипЗначенияСтр(ТЗВозвр)="ТаблицаЗначений" Тогда Если СпсТовары.РазмерСписка()>0 Тогда Для Сч = 1 по СпсТовары.РазмерСписка() Цикл ТзТовары.НоваяСтрока(); ТзТовары.Товар = СпсТовары.ПолучитьЗначение(Сч); м=""; Если ТЗВозвр.НайтиЗначение(СпсТовары.ПолучитьЗначение(Сч),м,"Товар")=1 Тогда ТЗВозвр.ПолучитьСтрокуПоНомеру(м); ТзТовары.ЦенаРозн=Число(ТЗВозвр.Ценник); ТзТовары.МинЦена = Число(ТЗВозвр.МинЦена); КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; //-------------------------------- ВыборкаДанных.НоваяСтрока(); Фирма = Накладные.Фирма; Фирма.ИспользоватьДату(Накладные.ДатаДок); ВыборкаДанных.алкЛицензия = Фирма.Лицензия; ВыборкаДанных.алкСкладКонтрагента = Накладные.Склад; ВыборкаДанных.ВалютаДокумента = Накладные.Валюта; ВыборкаДанных.ДатаВходящегоДокумента = Дата(ДатаГод(Накладные.ДатаДок), ДатаМесяц(Накладные.ДатаДок), ДатаЧисло(Накладные.ДатаДок)); ВыборкаДанных.алкИдентификатор = Накладные.Идентификатор; ВыборкаДанных.Контрагент = Фирма; ВыборкаДанных.НомерВходящегоДокумента = Накладные.НомерДок; Клиент = Накладные.Клиент; ДоговорКонтрагента = СоздатьОбъект("СписокЗначений"); ДоговорКонтрагента.ДобавитьЗначение(Накладные.Валюта, "ВалютаВзаиморасчетов"); ДоговорКонтрагента.ДобавитьЗначение("ПоДоговоруВЦелом", "ВедениеВзаиморасчетов"); ДоговорКонтрагента.ДобавитьЗначение("СПоставщиком", "ВидДоговора"); ДоговорКонтрагента.ДобавитьЗначение(Клиент.ЮрЛицо, "Организация"); ДоговорКонтрагента.ДобавитьЗначение(Фирма, "Владелец"); ДоговорКонтрагента.ДобавитьЗначение("Основной договор", "Наименование"); ДоговорКонтрагента.ДобавитьЗначение(0, "ПометкаУдаления"); ДоговорКонтрагента.ДобавитьЗначение(0, "ЭтоГруппа"); ВыборкаДанных.ДоговорКонтрагента = ДоговорКонтрагента; ВыборкаДанных.Организация = Клиент.ЮрЛицо; ВыборкаДанных.Подразделение = Клиент; ВыборкаДанных.Склад = Клиент; СуммаДокумента = Результат.Сумма; ВыборкаДанных.СуммаДокумента = СуммаДокумента; ВыборкаДанных.Дата = Накладные.ДатаДок; //ВыборкаДанных.Дата = ?(ПустоеЗначение(Накладные.ДатаДоставки)=0, // Накладные.ДатаДоставки, Накладные.ДатаДок); ВыборкаДанных.ПометкаУдаления = Накладные.ПометкаУдаления(); ВыборкаДанных.Проведен = Накладные.Проведен(); ВыборкаДанных.Товары = СоздатьОбъект("ТаблицаЗначений"); Товары = ВыборкаДанных.Товары; Товары.НоваяКолонка("ЕдиницаИзмерения"); Товары.НоваяКолонка("Количество"); Товары.НоваяКолонка("Номенклатура"); Товары.НоваяКолонка("ПроцентРозничнойНаценки"); Товары.НоваяКолонка("СерияНоменклатуры"); Товары.НоваяКолонка("Сумма"); Товары.НоваяКолонка("Цена"); Товары.НоваяКолонка("ЦенаВРознице"); Товары.НоваяКолонка("МинЦена"); ИначеЕсли УровеньГруппировки = 2 Тогда Товары.НоваяСтрока(); Товар = Результат.Товар; ЕдиницаИзмерения = СоздатьОбъект("СписокЗначений"); ЕдиницаИзмерения.ДобавитьЗначение(Строка(Товар.БазоваяЕдиница), "Наименование"); ЕдиницаИзмерения.ДобавитьЗначение(Товар.БазоваяЕдиница, "ЕдиницаПоКлассификатору"); ЕдиницаИзмерения.ДобавитьЗначение(1, "Коэффициент"); ЕдиницаИзмерения.ДобавитьЗначение(Товар, "Владелец"); Товары.ЕдиницаИзмерения = ЕдиницаИзмерения; Количество = Результат.Количество; Товары.Количество = Количество; Товары.Номенклатура = Товар; НС = 0; тзТовары.НайтиЗначение(Товар, НС, "Товар"); тзТовары.ПолучитьСтрокуПоНомеру(НС); Товары.ПроцентРозничнойНаценки = ""; Товары.ЦенаВРознице = тзТовары.ЦенаРозн; Товары.МинЦена = тзТовары.МинЦена; СерияНоменклатуры = СоздатьОбъект("СписокЗначений"); Импортер = Результат.Импортер; ЮрЛицоИмпортера = Импортер.ЮрЛицо; ЮрЛицоИмпортера.ИспользоватьДату(Накладные.ДатаДок, 1); ПодрИмпортера = СоздатьОбъект("СписокЗначений"); ПодрИмпортера.ДобавитьЗначение("", "Адрес"); ПодрИмпортера.ДобавитьЗначение(ЮрЛицоИмпортера.КПП, "КПП"); ПодрИмпортера.ДобавитьЗначение(ЮрЛицоИмпортера.КПП, "Наименование"); ПодрИмпортера.ДобавитьЗначение(ЮрЛицоИмпортера, "Владелец"); СерияНоменклатуры.ДобавитьЗначение(ПодрИмпортера, "алкПодразделениеИмпортера"); Производитель = Товар.Производитель; ЮрЛицоПроизводителя = Производитель.ЮрЛицо; ЮрЛицоПроизводителя.ИспользоватьДату(Накладные.ДатаДок, 1); ПодрПроизводителя = СоздатьОбъект("СписокЗначений"); ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя.Адрес, "Адрес"); ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя.КПП, "КПП"); ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя.КПП, "Наименование"); ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя, "Владелец"); СерияНоменклатуры.ДобавитьЗначение(ПодрПроизводителя, "алкПодразделениеПроизводителя"); СерияНоменклатуры.ДобавитьЗначение(Результат.ГТД, "НомерГТД"); СерияНоменклатуры.ДобавитьЗначение(Результат.ГТД, "СерийныйНомер"); СерияНоменклатуры.ДобавитьЗначение(Производитель.Страна, "СтранаПроисхождения"); СерияНоменклатуры.ДобавитьЗначение(Товар, "Владелец"); СерияНоменклатуры.ДобавитьЗначение(Результат.ГТД, "Наименование"); Товары.СерияНоменклатуры = СерияНоменклатуры; Сумма = Результат.Сумма; Товары.Сумма = Сумма; Цена = Сумма / Количество; Товары.Цена = Цена; Товары.ПроцентРозничнойНаценки=(тзТовары.ЦенаРозн/Цена)*100-100; КонецЕсли; КонецЦикла; |
|||
34
sapphire
18.04.13
✎
10:46
|
(33) Смущает сей момент:
Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка); КонецЕсли; Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо); КонецЕсли; |
|||
35
sapphire
18.04.13
✎
10:49
|
(33) Видимо, либо печать ГТД, либо заполнение какой-то муйни.
В приницпе, коли работает - и ладно, коли нет - убери эти конструкции: ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt6')"; Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда ТекстЗапроса = "DROP TABLE #tt6"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "CREATE TABLE #tt6(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(500), f_3 CHAR(9), f_4 NUMERIC(19,2), f_5 NUMERIC(19,2))"; глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
36
Альбатрос
18.04.13
✎
11:00
|
(34) Это я уже быдлокодил =) Очепятка.
(35) Работает, я и не трогаю)) Это модуль ПВД в правилах обмена |
|||
37
sapphire
18.04.13
✎
11:10
|
(36) В принципе, лучше вынести во встроенную процедуру, ИМХО
|
|||
38
Альбатрос
18.04.13
✎
11:24
|
(37) Ну да, как вариант. Воспользуюсь советом =)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |