![]() |
![]() |
![]() |
|
Как в запросе сравнить табличные части двух документов ? | ☑ | ||
---|---|---|---|---|
0
Родной
24.11.10
✎
10:36
|
Есть два дока одного вида. Как в результате запроса получить просто Истина или Ложь ? Тоесть равны табл. части или нет. Можно и не запросом, главное быстро. Спасибо.
|
|||
1
mikecool
24.11.10
✎
10:37
|
ОБЪЕДИНИТЬ + доп поле с 1 + СГРУППИРОВАТЬ + ИМЕЮЩИЕ допполе > 1 - вот тут и будут неравные
|
|||
2
Cube
24.11.10
✎
10:37
|
(0) А что для тебя значит выражение "равны табл. части"?
|
|||
3
el-gamberro
24.11.10
✎
10:38
|
О... это есть великое колдунство!
|
|||
4
el-gamberro
24.11.10
✎
10:40
|
Выгрузить обе ТЧ в ТЗ, далее
Если ТЗ1 = ТЗ2 Тогда Возврат Истина; Иначе Возврат ЛОжь; КонецЕсли |
|||
5
Виталий
24.11.10
✎
10:40
|
Как вариант:
ТабЧасть1 = Док1Ссылка.ТабЧасть.Выгрузить(); ТабЧасть2 = Док2Ссылка.ТабЧасть.Выгрузить(); Для Каждого Строка Из ТабЧасть1 Цикл Строка.Количество = - Строка.Количество; Строка.Сумма = - Строка.Сумма; КонецЦикла ЗагрузитьВТаблицуЗначений(Таб |
|||
6
Родной
24.11.10
✎
10:40
|
(1)а можешь пример ? пост в голове расшифровать немогу...
|
|||
7
Виталий
24.11.10
✎
10:41
|
Как вариант:
ТабЧасть1 = Док1Ссылка.ТабЧасть.Выгрузить(); ТабЧасть2 = Док2Ссылка.ТабЧасть.Выгрузить(); Для Каждого Строка Из ТабЧасть1 Цикл Строка.Количество = - Строка.Количество; Строка.Сумма = - Строка.Сумма; ... КонецЦикла ЗагрузитьВТаблицуЗначений(ТабЧасть1, ТабЧасть2); ТабЧасть2.Свернуть("..."); |
|||
8
Родной
24.11.10
✎
10:41
|
(4)хм, незнал что их так можно сравнить... спасибо
|
|||
9
dimoff
24.11.10
✎
10:42
|
В (4) бред написан, имхо
|
|||
10
Родной
24.11.10
✎
10:43
|
Не. непрокатит мне в ТЗ сравнивать. Нужно именно в запросе...
|
|||
11
dimoff
24.11.10
✎
10:43
|
Сравнить в запросе легко. Выбрать различные из запроса с объединением таб. частей и сравнить количество записей с количеством строк в документах.
|
|||
12
МихаилМ
24.11.10
✎
10:43
|
таб1 LEFT JOIN tab2
ON таб1.поле1 = таб2.поле2 ... ON таб1.полеN = таб2.полеN WHERE tab2.ссылка is not NULL |
|||
13
mikecool
24.11.10
✎
10:46
|
(6)
Выбрать Количество(*) Как Результат ИЗ (выбрать * , 1 Как ДопПоле из Документ где Документ.Ссылка = &Ссылка1 ОБЪЕДИНИТЬ выбрать *, -1 из Документ где Документ.Ссылка = &Ссылка2) как ВлЗапрос Сгруппировать По * Имеющие Не Сумма(ДопПоле) = 0 * заменяем на список полей |
|||
14
Grusswelle
24.11.10
✎
10:47
|
(4) мдя...
|
|||
15
Виталий
24.11.10
✎
10:51
|
(12) Не прокатит, нужно полное соединение:
ВЫБРАТЬ ВЫБОР КОГДА Таб1.Ссылка IS NULL ИЛИ Таб1.Ссылка IS NULL ТОГДА Ложь ИНАЧЕ Истина КОНЕЦ ИЗ Док1.Таб КАК Таб1 ПОЛНОЕ СОЕДИНЕНИЕ Док2.Таб КАК Таб2 ПО <все поля> |
|||
16
dimoff
24.11.10
✎
10:54
|
Запрос = "ВЫБРАТЬ
| Подсчет.НомерСтроки КАК НомерСтроки, | Подсчет.Номенклатура, | Подсчет.Количество, | Подсчет.Цена, | Подсчет.Сумма, | СУММА(Подсчет.Счетчик) КАК Счетчик |ИЗ | (ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура, | ПоступлениеТоваровУслугТовары.Количество КАК Количество, | ПоступлениеТоваровУслугТовары.Цена КАК Цена, | ПоступлениеТоваровУслугТовары.Сумма КАК Сумма, | 0.5 КАК Счетчик | ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ГДЕ | ПоступлениеТоваровУслугТовары.Ссылка = &Док1 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.НомерСтроки, | ПоступлениеТоваровУслугТовары.Номенклатура, | ПоступлениеТоваровУслугТовары.Количество, | ПоступлениеТоваровУслугТовары.Цена, | ПоступлениеТоваровУслугТовары.Сумма, | 0.5 | ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ГДЕ | ПоступлениеТоваровУслугТовары.Ссылка = &Док2) КАК Подсчет | |СГРУППИРОВАТЬ ПО | Подсчет.НомерСтроки, | Подсчет.Номенклатура, | Подсчет.Количество, | Подсчет.Цена, | Подсчет.Сумма |ИТОГИ | МАКСИМУМ(НомерСтроки), | СУММА(Счетчик) |ПО | ОБЩИЕ" Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); ТЧРавны = (Выборка.НомерСтроки = Выборка.Счетчик) |
|||
17
el-gamberro
24.11.10
✎
10:56
|
(16) неправильно. а вот в (11) правильная идея.
|
|||
18
Crosby
24.11.10
✎
10:58
|
Если не в запросе:
Почти как в (4), только сравнение другое: Выгрузить обе ТЧ в две ТЗ СтараяТЗ = ДокОбъект1.МойДокумент.Выгрузить(); НоваяТЗ = ДокОбъект2.МойДокумент.Выгрузить(); Если ЗначениеВСтрокуВнутр(СтараяТЗ) = ЗначениеВСтрокуВнутр(НоваяТЗ) Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; |
|||
19
Crosby
24.11.10
✎
11:00
|
+(18) как раз полная идентичность. Даже совпадение порядка строк.
|
|||
20
dimoff
24.11.10
✎
11:20
|
(17) В 16 реализация 11
|
|||
21
dimoff
24.11.10
✎
11:20
|
+20 На всякий случай сейчас проверю 16.
|
|||
22
el-gamberro
24.11.10
✎
11:27
|
(21) Если цена или кол-во отличаются а кол-во строк совпадает, то твой запрос выдаст истину. а вот если по 11 сделать, то выдаст ложь.
|
|||
23
dimoff
24.11.10
✎
11:51
|
В 16 неточность, вот проверенно работающий запрос
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Подсчет.НомерСтроки КАК НомерСтроки, | Подсчет.Номенклатура, | Подсчет.Количество, | Подсчет.Цена, | Подсчет.Сумма, | СУММА(Подсчет.Счетчик) КАК СчетчикМин, | СУММА(Подсчет.Счетчик) КАК СчетчикМакс |ИЗ | (ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки, | ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура, | ПоступлениеТоваровУслугТовары.Количество КАК Количество, | ПоступлениеТоваровУслугТовары.Цена КАК Цена, | ПоступлениеТоваровУслугТовары.Сумма КАК Сумма, | 0.5 КАК Счетчик | ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ГДЕ | ПоступлениеТоваровУслугТовары.Ссылка = &Док1 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ПоступлениеТоваровУслугТовары.НомерСтроки, | ПоступлениеТоваровУслугТовары.Номенклатура, | ПоступлениеТоваровУслугТовары.Количество, | ПоступлениеТоваровУслугТовары.Цена, | ПоступлениеТоваровУслугТовары.Сумма, | 0.5 | ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары | ГДЕ | ПоступлениеТоваровУслугТовары.Ссылка = &Док2) КАК Подсчет | |СГРУППИРОВАТЬ ПО | Подсчет.НомерСтроки, | Подсчет.Номенклатура, | Подсчет.Количество, | Подсчет.Цена, | Подсчет.Сумма |ИТОГИ | МИНИМУМ(СчетчикМин), | МАКСИМУМ(СчетчикМакс) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Док1", Док1); Запрос.УстановитьПараметр("Док2", Док2); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); ТЧРавны = (Выборка.СчетчикМин = Выборка.СчетчикМакс И Выборка.СчетчикМин = 1); Сообщить(ТЧРавны); |
|||
24
el-gamberro
24.11.10
✎
12:15
|
(23) явно перемудрил))
|
|||
25
dimoff
24.11.10
✎
12:18
|
(24) Ничего перемудреного нет, счетчик для каждой строки должен показать 1 если ввсе строки идентичны, соответственно минимум должен быть равен 1 и максимум 1, всё предельно просто.
|
|||
26
artbear
24.11.10
✎
12:41
|
1. Что означает "таблица равны"? Сначала нужно определиться с терминами! Равны по каким-то ключевым полям или количество строк одинаково или еще что?
Номер/порядок строки имеет значение? 2. Нужно определиться со списком ключевых полей, по которым идет сравнение. . В (23) неявно выделены ключевые поля + к ним добавлен номер строки, но ИМХО решение все равно слишком хитрое. |
|||
27
dimoff
24.11.10
✎
13:19
|
Да, оно жутко хитрое, я большой хитрец
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |