|
Помогите с запросом (поиск несовпадающих записей по 2-м регистрам) | ☑ | ||
---|---|---|---|---|
0
suvolod
01.07.12
✎
20:16
|
Создал обработчик ПриПроведении документа РТиУ
Моя задача - сравнить движения по двум регистрам - НДСПартииТоваров и ПартииТоваровНаСкладах. Сравниваю по полям: номенклатура, характеристика, серия, партия, склад, вид движения. Заготовку запроса написал: "ВЫБРАТЬ | ЕСТЬNULL(НДСПартииТоваров.Номенклатура, ПартииТоваровНаСкладах.Номенклатура) КАК Номенклатура, | ЕСТЬNULL(НДСПартииТоваров.Количество, 0) КАК Поле2, | ЕСТЬNULL(НДСПартииТоваров.Стоимость, 0) КАК Поле3, | ЕСТЬNULL(ПартииТоваровНаСкладах.Количество, 0) КАК Количество1, | ЕСТЬNULL(ПартииТоваровНаСкладах.Стоимость, 0) КАК Стоимость1 |ИЗ | РегистрНакопления.НДСПартииТоваров КАК НДСПартииТоваров | ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах | ПО НДСПартииТоваров.Номенклатура = ПартииТоваровНаСкладах.Номенклатура | И НДСПартииТоваров.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры | И НДСПартииТоваров.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры | И НДСПартииТоваров.Партия = ПартииТоваровНаСкладах.ДокументОприходования | И НДСПартииТоваров.Склад = ПартииТоваровНаСкладах.Склад | И НДСПартииТоваров.ВидДвижения = ПартииТоваровНаСкладах.ВидДвижения |ГДЕ | НДСПартииТоваров.Регистратор = &Регистратор | И ПартииТоваровНаСкладах.Регистратор = &Регистратор"; Не понимаю, что мне поставить в условие ГДЕ, чтобы я мог выбрать несовпадющие записи? |
|||
1
Живой Ископаемый
01.07.12
✎
20:17
|
что такое несовпадающая запись?
|
|||
2
suvolod
01.07.12
✎
20:20
|
Ну например по этим двум регистрам не совпадает поле количество. Или по одному из регистров вообще нет записи по количеству
|
|||
3
Живой Ископаемый
01.07.12
✎
20:22
|
| И ((НДСПартииТоваров.СУММА <> ПартииТоваровНаСкладах.СУММА) ИЛИ (НДСПартииТоваров.Количество <> ПартииТоваровНаСкладах.Количество))
|
|||
4
suvolod
01.07.12
✎
20:24
|
... тогда придется проверять все поля, по которым я соединил таблицы.. ведь может и партия не совпадать, и характеристика.
|
|||
5
Живой Ископаемый
01.07.12
✎
20:25
|
Нет, не придется... потому что если не совпадает партия или характеристика, то это не та запись
|
|||
6
suvolod
01.07.12
✎
20:26
|
вот тут не понял. Если не совпадает партия, тогда на "одной стороне" будет партия, а на другой Есть NULL. Или я ошибаюсь?
|
|||
7
Живой Ископаемый
01.07.12
✎
20:28
|
Ну или по-прежнему я задам вопрос. что такое несовпадающая запись?
Например если в первом регистре у тебя запись с номенклатурой "Туалетная бумага", а во втором три записи с номенклатурой "Швейная машинка", "Самокат" и "Точная уменьшенная копия орбитальной станции МИР" что ты будешь с чем сравнивать? |
|||
8
Живой Ископаемый
01.07.12
✎
20:28
|
2(6) а как я тебя не понял.
|
|||
9
suvolod
01.07.12
✎
20:29
|
(7) В твое примере я предполагаю, что будет 4 записи.
Туалетная бумага, NULL, остальные поля NULL, Швейная машинка, остальные поля NULL, Самокат, остальные поля. и т.д.. |
|||
10
Живой Ископаемый
01.07.12
✎
20:30
|
то есть какая запись из (7) с какой будет не совпадать? :)
|
|||
11
suvolod
01.07.12
✎
20:30
|
В твоем случае не одна запись не будет совпадать
|
|||
12
suvolod
01.07.12
✎
20:31
|
Возможно я путаю понятия. Оператор ГДЕ выполняется ведь после соединения таблиц, так?
|
|||
13
Живой Ископаемый
01.07.12
✎
20:31
|
2(9) Отлично, а если в одном регистре 1000 записей, и в другом 1000 записей, то я должен буду вернуть
1000*1000 - 1000 = 999 000 записей... Чувак, ты серьезен? |
|||
14
Живой Ископаемый
01.07.12
✎
20:32
|
2(12) какая разница? Прежде чем решать частности, ответь на концептуальный вопрос - что такое несовпадающие записи?
|
|||
15
suvolod
01.07.12
✎
20:33
|
Серьезен.. :)
не забывай, мне надо проверить движения только по одному документу. Максимум строк на 200, а обычно на 5-10 |
|||
16
Живой Ископаемый
01.07.12
✎
20:33
|
в(13) тысячу отнял в надежде на то, что это совпадающие записи. :))
|
|||
17
suvolod
01.07.12
✎
20:34
|
(14) Я вроде ответил. Несопадающие записи - это те, которые отличаются одним или несколькими полями... К чему ты клонишь, не мучай :)
|
|||
18
Живой Ископаемый
01.07.12
✎
20:34
|
2(15) херня какая-то... Это не научный подход... Ученый должен решать задачу в пределах. Пределы - это 0 и бесконечность. Если ты этого не сделаешь сейчас, это сделает за тебя пользователь, и напишет тебе письмо с текстом "твоя программа не работает"
|
|||
19
suvolod
01.07.12
✎
20:35
|
Если вернуться к твоему примеру, пусть будут просто две ТЗ. В одной одна запись, в другой 3. Надо в третьей ТЗ отобразить все несовпадающие записи по этим ТЗ. Итого: в третьей ТЗ будет 4 записи. Т.к. записи по обоим таблицам не совпадают
|
|||
20
Живой Ископаемый
01.07.12
✎
20:36
|
2(17) Тогда получай все записи из первого плюс второго полным соединением (декартово произведение), и отнимай из этого множества результат второго запроса, в котором внутренне соединяй первый и второй регистр (это только совпадающие записи).
все |
|||
21
Живой Ископаемый
01.07.12
✎
20:37
|
2(19) окей... тогда рецепт в (20).
смысла правда в этом никакого, но если ты говоришь что тебе это нужно... |
|||
22
Живой Ископаемый
01.07.12
✎
20:39
|
фу, про полное соединение набредил.. Просто декартово соединение, без связи по каким-либо полям....
а второй запрос - внутренним соединением по равенству всех полей |
|||
23
suvolod
01.07.12
✎
20:39
|
Декартово произведение я и так получаю полным соеденинием. Как отнять не до конца понимаю.. Ладно, буду думать. На всякий случай еще спрошу: может есть другое решение?
Задача: документ делает движения по двум регистрам: НДСПартииТоваров и ПартииТоваровНаСкладах. Как проще отловить несовпадающие записи по этим регистрам? Только через (20)? |
|||
24
Живой Ископаемый
01.07.12
✎
20:41
|
гы...
|
|||
25
suvolod
01.07.12
✎
20:52
|
вроде придумал спрособ проще. полное соединение, да еще по нескольким полям действительно не оптимально
|
|||
26
m-serg74
01.07.12
✎
20:53
|
попробуй вот так
|
|||
27
m-serg74
01.07.12
✎
20:53
|
ВЫБРАТЬ
Вложение.Номенклатура КАК Номенклатура, Вложение.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, Вложение.СерияНоменклатуры КАК СерияНоменклатуры, Вложение.Партия КАК Партия, Вложение.Склад КАК Склад, Вложение.ВидДвижения КАК ВидДвижения, Вложение.Количество1 КАК Количество1, Вложение.Стоимость1 КАК Стоимость1, Вложение.Количество2 КАК Количество2, Вложение.Стоимость2 КАК Стоимость2 ИЗ (ВЫБРАТЬ Вложение.Номенклатура КАК Номенклатура, Вложение.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, Вложение.СерияНоменклатуры КАК СерияНоменклатуры, Вложение.Партия КАК Партия, Вложение.Склад КАК Склад, Вложение.ВидДвижения КАК ВидДвижения, СУММА(Вложение.Количество1) КАК Количество1, СУММА(Вложение.Стоимость1) КАК Стоимость1, СУММА(Вложение.Количество2) КАК Количество2, СУММА(Вложение.Стоимость2) КАК Стоимость2 ИЗ (ВЫБРАТЬ НДСПартииТоваров.Номенклатура КАК Номенклатура, НДСПартииТоваров.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, НДСПартииТоваров.СерияНоменклатуры КАК СерияНоменклатуры, НДСПартииТоваров.Партия КАК Партия, НДСПартииТоваров.Склад КАК Склад, НДСПартииТоваров.ВидДвижения КАК ВидДвижения, НДСПартииТоваров.Количество КАК Количество1, НДСПартииТоваров.Стоимость КАК Стоимость1, 0 КАК Количество2, 0 КАК Стоимость2 ИЗ РегистрНакопления.НДСПартииТоваров КАК НДСПартииТоваров ГДЕ НДСПартииТоваров.Регистратор = &Регистратор ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПартииТоваровНаСкладах.Номенклатура, ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры, ПартииТоваровНаСкладах.СерияНоменклатуры, ПартииТоваровНаСкладах.ДокументОприходования, ПартииТоваровНаСкладах.Склад, ПартииТоваровНаСкладах.ВидДвижения, 0, 0, ПартииТоваровНаСкладах.Количество, ПартииТоваровНаСкладах.Стоимость ИЗ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах ГДЕ ПартииТоваровНаСкладах.Регистратор = &Регистратор) КАК Вложение СГРУППИРОВАТЬ ПО Вложение.Номенклатура, Вложение.ХарактеристикаНоменклатуры, Вложение.СерияНоменклатуры, Вложение.Партия, Вложение.Склад, Вложение.ВидДвижения) КАК Вложение ГДЕ (Вложение.Количество1 <> Вложение.Количество2 ИЛИ Вложение.Стоимость1 <> Вложение.Стоимость2) |
|||
28
suvolod
01.07.12
✎
20:59
|
Спасибо, сейчас тоже попробую.
Я сейчас пытаюсь сделать свою задумку через объединение |
|||
29
m-serg74
01.07.12
✎
21:01
|
а я тебе через что прислал?
|
|||
30
suvolod
01.07.12
✎
21:03
|
точно :).. просмотрел твой код мельком, не въехал сразу :)
|
|||
31
m-serg74
01.07.12
✎
21:05
|
условие и группировку только точнее под себя сделай потому что все таки не совсем понятно что на выходе должно быть
|
|||
32
m-serg74
01.07.12
✎
21:11
|
хотя не пойму как один и тот же док сделает разный количества и стоимость?
|
|||
33
suvolod
01.07.12
✎
21:15
|
запросто :). Галочку "учитывать НДС" в документе поступления сними, и вот тебе косяк: по партиям на складе остатки есть, а по НДСПартии - уже нет
|
|||
34
m-serg74
01.07.12
✎
21:16
|
понятно т.е. в НДСе вообще записей не будет...
|
|||
35
m-serg74
01.07.12
✎
21:18
|
тогда просто левое, связь по номеру строки дока и где в НДСе любое из полей НУЛЛ
|
|||
36
suvolod
01.07.12
✎
21:19
|
(34) Не факт. Если было несколько партий. Тогда, НДСПартии захватит другую партию (а она может иметь совсем другую себестоимость), а ПартииТоваров будет списывать ту, которая со снятой галочкой НДС. Вот и поехали партии...
|
|||
37
m-serg74
01.07.12
✎
21:21
|
помудри сам конечно предугадать трудно) но ты берешь записи дока, а не виртуальные таблицы
|
|||
38
suvolod
01.07.12
✎
21:26
|
Спасибо, уже что-то стало получаться :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |