![]() |
|
Как выборке запроса найти одинаковые записи? | ☑ | ||
---|---|---|---|---|
0
vsafonin
08.03.13
✎
14:31
|
Здравствуйте!
Необходимо в выборке из запроса найти записи где -один и тот же контрагент -один и тот же договор. Сам запрос: ВЫБРАТЬ РеализацияТоваровУслуг.Дата, РеализацияТоваровУслуг.Проведен, РеализацияТоваровУслуг.ПометкаУдаления, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.ДоговорКонтрагента, РеализацияТоваровУслуг.СуммаДокумента, РеализацияТоваровУслуг.Ссылка ПОМЕСТИТЬ ДокРеализации ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Дата >= &ДатаНач И РеализацияТоваровУслуг.Дата <= &ДатаОкончания И РеализацияТоваровУслуг.Проведен = ИСТИНА И РеализацияТоваровУслуг.Услуги.Номенклатура.Код = &Код ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДоговорыКонтрагентов.Владелец КАК Контрагент, ДоговорыКонтрагентов.Ссылка КАК Договор, ДоговорыКонтрагентов.СуммаНачисления, ДоговорыКонтрагентов.СодержаниеУслуги, ДокРеализации.СуммаДокумента КАК СуммаРеализации, ДокРеализации.Ссылка КАК ДокументРеализации ИЗ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов ЛЕВОЕ СОЕДИНЕНИЕ ДокРеализации КАК ДокРеализации ПО ДоговорыКонтрагентов.Владелец.Наименование = ДокРеализации.Контрагент.Наименование ГДЕ ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ И ДоговорыКонтрагентов.Дата <= &ДатаНач И ДоговорыКонтрагентов.СрокДействия >= &ДатаОкончания И ДоговорыКонтрагентов.СуммаНачисления > 0 Выводит все правильно, но результатом должны быть записи для одного контрагента по одному договору с одним документом реализации, а тут получается что если в этом месяце для одного и того же контрагента делали два документа реализации, то он тоже попадает в результат. Нужно отфильтровать и выдать сообщение об ошибке. Сам я ничего лучше придумать не могу как при переборе выборки сделать еще один запрос с параметрами контрагент и договор и если количество больше 1 то выдать сообщение об ошибке. Но по моему это не оптимально, получается для каждого результата запроса будет новый и так пока вся выборка не кончится. Можно ли как то по другому сделать? Заранее премного благодарен! |
|||
1
shuhard
08.03.13
✎
14:33
|
(0) кури группировку и Having
|
|||
2
vsafonin
08.03.13
✎
14:36
|
Да дело в том что нужно найдя эти документы, выдать сообщение а остальные добавить....вот как с группировкой и имеющие это сделать?
Будет еще одна колонка в которой будет число с количеством записей? |
|||
3
mistеr
08.03.13
✎
16:31
|
Я так и не понял, какой документ нужен, если их несколько. Определись.
И ВТ лишняя по-моему. |
|||
4
vsafonin
08.03.13
✎
20:16
|
(3) Нужно пострить таблицу вида:
Договор Контрагент СуммаНачислений Начисленно Документ начислений Заполняется таблица за определенный период (месяц указанный пользователем) Первые 3 заполняются из данных справочника ДоговорыКонтрагентов. Последние 2 поля берутся из документа реализации, И заполняются только тогда когда они существуют, проведены, и номенклатура в Табличной Части совпадает с константой (в ней хранится определенная номенклатура) Как сделать без ВТ не понятно мне... Документы реализации для определенного договора и контрагента должны заполняться РАЗ В МЕСЯЦ. Вот мне нужно если например в текущем месяце "Ошибочно" Заполнили документ реализации 2 или больше раза.. Эти записи мне не нужны, и для них нужно выдать сообщение об ошибке.... как это сделать ума уже не приложу.. |
|||
5
vsafonin
08.03.13
✎
20:19
|
То есть после ошибки, нужно продолжить работу и заполнить что есть....
Пока Сделал так, если найден хоть один такой документ, выдаеться сообщение об ошибке..и просьба исправить ситуацию..пока этого не сделано, работать Обработка не будет)) Более гуманный способ есть? |
|||
6
Steel_Wheel
08.03.13
✎
21:29
|
(5) Есть.
Все документы сохраняют данные в регистр со струутурой твоей таблицы, обработка подойдет стандартная по остаткам регистра. Перед записью документа, документ проверяет условие на наличие такого же документа в системе. Если документ есть, то запись текущего документа не производится. Т.е. в регистре всегда актуальные данные, твоя задача -- предотвратить попадание в регистр неактуальных или избыточных данных |
|||
7
EugeniaK
08.03.13
✎
21:30
|
(5) Ну вообще-то это правильная схема работы. Нужно исправить ошибочные документы и запустить обработку еще раз.
Только не поняла, зачем перебор выборки. У тебя пакет запросов. Добавь в него еще один запрос Количество различных(Документ) сгруппировать по контрагенту и договору. Если в запросе есть данные, выдаем сообщение об ошибке и прекращаем работу. И, кстати, такое сравнение очень плохое ДоговорыКонтрагентов.Владелец.Наименование = ДокРеализации.Контрагент.Наименование Это 2 дополнительных соединения с таблицей контрагентов и плюс условие по строковому полю. Намного быстрее будет работать связь ДоговорыКонтрагентов.Владелец = ДокРеализации.Контрагент |
|||
8
vsafonin
08.03.13
✎
23:46
|
(6) Конфа типовая, делаю внешнуюю обработку не затрагивая что либо в конфигурации..
(7) Запрос поменял. Спасибо! В принципе сейчас делаю сначала выгрузку в ТЗ, а уж В ТЗ ищу дубли, которые нашел оттуда удаляю, вывожу сообщение что мол есть докумены их надо исправить и имена и коды этих доков, хотя обработка продолжает работать. Как только буду на 100% уверен что попадание двух или более документов это ОШИБКА, либо будет критично сказываться на производительности - то оставлю только Сообщение об ошибке, и после исправления только работать. |
|||
9
sergus_dixi
08.03.13
✎
23:57
|
Не надо сравнивать по наименованию - кури план запроса и увидишь проблемы. агрегатные функции не читал? количество различных > 1 и все прекрасно выводится в СКД или консоли с использованием как вариант ВЫБОР КОГДА....
|
|||
10
GANR
08.03.13
✎
23:58
|
Сгруппировать запрос по всем полям и добавить агрегатную функцию КОЛИЧЕСТВО(*). Если непонятно - читать СП.
|
|||
11
GANR
08.03.13
✎
23:59
|
А ещё лучше http://sql-ex.ru/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |