|
Помощь с алгоритмом объединения документов | ☑ | ||
---|---|---|---|---|
0
Mr-FReSH
30.03.17
✎
06:01
|
Доброго времени суток, господа.
Никак не могу придумать более-менее адекватный алгоритм объединения документов по одному признаку, может у кого уже был подобный опыт. Задача такая: есть 2000 документов с разными физ лицами, среди них есть документы, где физ лица одинаковые, и вот такие документы нужно объединить. т.е. на выходе из 2000 документов в районе 900 нужно будет найти и обработать, но каким образом это сделать я придумать не могу. Спасибо |
|||
1
Злопчинский
30.03.17
✎
06:14
|
хз на какой платформе
для 77 есть COMMONITER - смотри на ИС |
|||
2
Mr-FReSH
30.03.17
✎
06:29
|
(1) 8.3
Придумал пользоваться методом НайтиСтроки и объединять по тому что нашло Пока что написал примерно такое (еще в процессе написания) Процедура ОбъеденитьНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Случай.Ссылка, | Случай.Пациент |ИЗ | Документ.Случай КАК Случай |ГДЕ | Случай.ДатаНачала МЕЖДУ &ДатаНачала И &ДатаОкончания"; Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания); Случаи = Запрос.Выполнить().Выгрузить(); МассивПациентов = Новый Массив; Для Каждого Случай Из Случаи Цикл Если МассивПациентов.Найти(Случай.Пациент) = 0 ИЛИ МассивПациентов.Найти(Случай.Пациент) = Неопределено Тогда МассивПациентов.Добавить(Случай.Пациент); НовыйСлучай = Документы.Случай.СоздатьДокумент(); Отбор = Новый Структура; Отбор.Вставить("Пациент", Случай.Пациент); НайденныеДокументы = Случаи.НайтиСтроки(Отбор); Если НайденныеДокументы.Количество() > 1 Тогда Для Каждого Документ Из НайденныеДокументы Цикл НовыйСлучай.Пациент = Случай.Пациент; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
3
Мимохожий Однако
30.03.17
✎
06:47
|
(2) А вот это " НовыйСлучай = Документы.Случай.СоздатьДокумент();" Зачем?!
Лучше уточни задачу. Тебе надо проигнорировать документы, в которых пациент встречается только один раз? |
|||
4
Злопчинский
30.03.17
✎
06:55
|
хрен какая-то, явно в запросе д.б чтото типа
Выбрать ссылка, поциент; 1 как счетчик ... далее в запросе сгруппировать по поциент с суммированием счетчик на первом уровне, на втором уровне группировка по ссылка, отрезать те где на 1 уровне счетчик=1 . я в запросах восмерочных ноль |
|||
5
Mr-FReSH
30.03.17
✎
07:02
|
я создаю новый документ из данных старых документов, а старые удаляю
|
|||
6
Mr-FReSH
30.03.17
✎
07:02
|
т.е. в новом документе у меня объединяются табличные части старых
|
|||
7
Мимохожий Однако
30.03.17
✎
07:05
|
Сделай группировку по пациентам и выборку по группе
|
|||
8
mexanik_96
30.03.17
✎
07:05
|
группировать по контрагенту не предлагали ещо?
|
|||
9
Мимохожий Однако
30.03.17
✎
07:06
|
(8) Я успел))
|
|||
10
Mr-FReSH
30.03.17
✎
07:13
|
Ладно, за час, который мне на это выделили сделал так, знаю что коряво и не оптимизированно, но работает как надо
&НаСервере Процедура ОбъеденитьНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Случай.Ссылка, | Случай.Пациент |ИЗ | Документ.Случай КАК Случай |ГДЕ | Случай.ДатаНачала МЕЖДУ &ДатаНачала И &ДатаОкончания"; Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания); Случаи = Запрос.Выполнить().Выгрузить(); МассивПациентов = Новый Массив; Для Каждого Случай Из Случаи Цикл Если МассивПациентов.Найти(Случай.Пациент) = 0 ИЛИ МассивПациентов.Найти(Случай.Пациент) = Неопределено Тогда МассивПациентов.Добавить(Случай.Пациент); НовыйСлучай = Документы.Случай.СоздатьДокумент(); Отбор = Новый Структура; Отбор.Вставить("Пациент", Случай.Пациент); НайденныеДокументы = Случаи.НайтиСтроки(Отбор); Если НайденныеДокументы.Количество() > 1 Тогда ДатаНачалаСлучая = ТекущаяДата(); ДатаОкончанияСлучая = ТекущаяДата(); Для Каждого Документ Из НайденныеДокументы Цикл ДокументОбъект = Документ.Ссылка.ПолучитьОбъект(); Если ДокументОбъект.ДатаНачала < ДатаНачалаСлучая Тогда НовыйСлучай.ДатаНачала = ДатаНачалаСлучая Иначе ДатаНачалаСлучая = ДокументОбъект.ДатаНачала; КонецЕсли; Если ДокументОбъект.ДатаОкончания < ДатаОкончанияСлучая Тогда НовыйСлучай.ДатаОкончания = ДатаОкончанияСлучая; Иначе ДатаОкончанияСлучая = ДокументОбъект.ДатаОкончания; КонецЕсли; ЗаполнитьЗначенияСвойств(НовыйСлучай, ДокументОбъект); ДокументОбъект.ДатаНачала = ДатаНачалаСлучая; ДокументОбъект.ДатаОкончания = ДатаОкончанияСлучая; Для Каждого Строка Из ДокументОбъект.Услуги Цикл СтрокаНовУслуга = НовыйСлучай.Услуги.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаНовУслуга, Строка); КонецЦикла; НовыйСлучай.Номер = ""; НовыйСлучай.Объединен = Истина; КонецЦикла; НовыйСлучай.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
11
Злопчинский
30.03.17
✎
07:30
|
и вот такие восьмерочники будут стыдить нас, клюшечников, что мы ковыряемся в носу?
я думаю что выборку дублирующих документов или наоборот недублирующих документов если упрусь то и чорным запросом в клюшках получу |
|||
12
Мимохожий Однако
30.03.17
✎
07:50
|
(11) Фактор времени...
|
|||
13
Mr-FReSH
30.03.17
✎
07:53
|
И что вы так прицепились к этому запросу, знаю что можно было получить все дубли с помощью него, но возиться с проверкой всего не хотелось
|
|||
14
Мимохожий Однако
30.03.17
✎
08:06
|
(13) Вот теперь к тебе прицепятся. Пакетным запросом можно было бы получить только нужные документы и отсортировав по пациентам сформировать документы с пометкой удаления не нужных.
|
|||
15
aleks_default
30.03.17
✎
09:23
|
(11)Вот он как раз похоже семерочник. Все восьмерочники давно такое запросами делают.
|
|||
16
aleks_default
30.03.17
✎
09:26
|
(15)Налицо у пациента использование запроса только для выборки - что характерно как раз для семерочников.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |