|
V8: Помогите с запросом | ☑ | ||
---|---|---|---|---|
0
astraborz
07.03.13
✎
03:40
|
Запрос.Текст = "ВЫБРАТЬ
| Платежи.СНИЛС, | Платежи.ФИО, | Платежи.ППНомер, | Платежи.ППДата, | Платежи.Сумма, | Платежи.Учреждение, | Платежи.ВидВыплат, | Платежи.НаименованиеПолучателя, | Платежи.ИНН, | Платежи.КПП, | Платежи.РасчетныйСчет, | Платежи.НаименованиеБанкаПолучателя, | Платежи.БИК, | Платежи.КорреспондентскийСчет, | Платежи.ВходящийНомер |ИЗ | РегистрСведений.Платежи КАК Платежи | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ | СУММА(1) КАК Кол, | Платежи.ФИО КАК ФИО | ИЗ | РегистрСведений.Платежи КАК Платежи | | СГРУППИРОВАТЬ ПО | Платежи.ФИО) КАК ВложенныйЗапрос | ПО Платежи.ФИО = ВложенныйЗапрос.ФИО |ГДЕ | ВложенныйЗапрос.Кол > 1 | |УПОРЯДОЧИТЬ ПО | Платежи.ФИО"; 1 Запрашиваю имеющиеся более двух раз с одинаковыми полями ФИО. Но этого мало. Надо еще отбросить из этого списка строки у которых имеются все одинаковые значение в поле СНИЛС или если у всех одинаковых по ФИО пустые СНИЛС 2. Прогнать этот список и менять сразу значения в регистре сведений Платежи (Если СНИЛС = пусто тогда брать из заполненного, Но если если имеются разные СНИЛСы, не менять а просто вывести в список) 3. В регистре платежей 160000 записей. Через что лучше делать? тем методом что я делаю очень долго выполняется но делает? Цель = Заполнить оставшиеся измерения с одинаковыми измерениями . Избавиться от дублей и пустых строк.Вообщем я объединил разные списки из экселя и делаю правильный единый список. 1С 8.2 управляемая форма |
|||
1
astraborz
07.03.13
✎
03:59
|
Нету никого кто даст совет?
|
|||
2
Килограмм
07.03.13
✎
04:18
|
(1) жди пока основная масса проснётся и апай тему
|
|||
3
SeraFim
07.03.13
✎
04:23
|
Сделай внутреннее соединение
ПО Платежи.ФИО = ВложенныйЗапрос.ФИО И ВложенныйЗапрос.Кол > 1 чуток быстрее получится |
|||
4
astraborz
07.03.13
✎
09:45
|
Народ проснулся а сижу тут :(
|
|||
5
Галахад
гуру
07.03.13
✎
09:56
|
Заменить "левое" на "правое" и убрать "где"
|
|||
6
ИсчадиеADO
07.03.13
✎
10:13
|
<code>
"ВЫБРАТЬ | Платежи.ФИО, | количество(*) КАК ОбщееКоличество, | количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) КАК КоличествоСНИЛС, | МАКСИМУМ(Платежи.СНИЛС) КАК ЛюбойСНИЛС |ПОМЕСТИТЬ ВТ |ИЗ | РегистрСведений.Платежи КАК Платежи |СГРУППИРОВАТЬ ПО | Платежи.ФИО |ИМЕЮЩИЕ | количество(*) > 1 | И ВЫБОР КОГДА количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 ТОГДА МАКСИМУМ(Платежи.СНИЛС) <> """" ИНАЧЕ ИСТИНА КОНЕЦ |; |ВЫБРАТЬ | Платежи.СНИЛС, | Платежи.ФИО, | Платежи.ППНомер, | Платежи.ППДата, | Платежи.Сумма, | Платежи.Учреждение, | Платежи.ВидВыплат, | Платежи.НаименованиеПолучателя, | Платежи.ИНН, | Платежи.КПП, | Платежи.РасчетныйСчет, | Платежи.НаименованиеБанкаПолучателя, | Платежи.БИК, | Платежи.КорреспондентскийСчет, | Платежи.ВходящийНомер |ИЗ | ВТ КАК ВТ |ЛЕВОЕ СОЕДИНЕНИЕ | РегистрСведений.Платежи КАК Платежи |ПО | ВТ.ФИО = Платежи.ФИО |УПОРЯДОЧИТЬ ПО | Платежи.ФИО |"; </code> как то так... запрос не проверял т.ч. автор, проверь сам |
|||
7
ИсчадиеADO
07.03.13
✎
10:23
|
ну и эта...
2. Прогнать этот список и менять сразу значения в регистре сведений Платежи (Если СНИЛС = пусто тогда брать из заполненного, Но если если имеются разные СНИЛСы, не менять а просто вывести в список) делай так, добавь секцию ИТОГИ ПО. Если рег.св. подчинен регистратору, то по регистратору; иначе по измерениям с основным отбором ну и периоду если он есть и основной отбор. Ну и вперед обходить выборку |
|||
8
astraborz
07.03.13
✎
10:59
|
(5) В этом случае выводится полный список, а мне ссуженный надо. Убрать полные по ФИО дубликаты где снилсы одинаковые
|
|||
9
astraborz
07.03.13
✎
11:10
|
(3) Тоже хороший вариант, но как бы избавится в вложенном запросе сразу от значений с кол = 1 и потом связать с основной
|
|||
10
astraborz
07.03.13
✎
11:24
|
(6) Это просто отличная версия, но есть одно но :) Из это списка надо убрать еще те строки у которых по одинаковым ФИО если все СНИЛСы совпадают
|
|||
11
ИсчадиеADO
07.03.13
✎
11:33
|
(10) напутал:
И ВЫБОР КОГДА количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 ТОГДА МАКСИМУМ(Платежи.СНИЛС) <> """" ИНАЧЕ ИСТИНА КОНЕЦ замени на И ВЫБОР КОГДА количество(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 ТОГДА МАКСИМУМ(Платежи.СНИЛС) = """" ИНАЧЕ ИСТИНА КОНЕЦ |
|||
12
ИсчадиеADO
07.03.13
✎
11:34
|
а вообще открой для себя консоль запросов и играйся в ней
|
|||
13
astraborz
07.03.13
✎
12:03
|
(11) Тогда он и с пустыми выдает. Но огромное спасибо. Я просто давно сним играю и не получалось никак :)
|
|||
14
ИсчадиеADO
07.03.13
✎
12:06
|
(13) так я по заданию так и понял, что надо и с пустыми выдавать? внимательное чтение задания это не мое :)
|
|||
15
astraborz
07.03.13
✎
13:08
|
(14) Все равно спасибо. У меня пока что туговато с запросами.
|
|||
16
astraborz
07.03.13
✎
13:14
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | Платежи.ФИО, | КОЛИЧЕСТВО(*) КАК ОбщееКоличество, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Платежи.СНИЛС) КАК КоличествоСНИЛС, | МАКСИМУМ(Платежи.СНИЛС) КАК ЛюбойСНИЛС |ПОМЕСТИТЬ ВТ |ИЗ | РегистрСведений.Платежи КАК Платежи | |СГРУППИРОВАТЬ ПО | Платежи.ФИО | |ИМЕЮЩИЕ | КОЛИЧЕСТВО(*) > 1 И | ВЫБОР | КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Платежи.СНИЛС) = 1 | ТОГДА МАКСИМУМ(Платежи.СНИЛС) <> """" | ИНАЧЕ ИСТИНА | КОНЕЦ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Платежи.СНИЛС, | Платежи.ФИО, | Платежи.ППНомер, | Платежи.ППДата, | Платежи.Сумма, | Платежи.Учреждение, | Платежи.ВидВыплат, | Платежи.НаименованиеПолучателя, | Платежи.ИНН, | Платежи.КПП, | Платежи.РасчетныйСчет, | Платежи.НаименованиеБанкаПолучателя, | Платежи.БИК, | Платежи.КорреспондентскийСчет, | Платежи.ВходящийНомер |ИЗ | ВТ КАК ВТ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Платежи КАК Платежи | ПО ВТ.ФИО = Платежи.ФИО | |УПОРЯДОЧИТЬ ПО | Платежи.ФИО"; Выгрузка = Запрос.Выполнить().Выгрузить(); Выборка = Запрос.Выполнить().Выбрать(); Обход = Запрос.Выполнить().Выбрать(); Колонки = ПолучитьСтруктуруКолонок(); РегПлатежи = РегистрыСведений.Платежи; Пока Выборка.Следующий() Цикл ФИО = Выборка.ФИО; Пока Обход.НайтиСледующий(Выборка.ФИО, "ФИО") Цикл СНИЛС = Неопределено; Если НЕ Обход.СНИЛС = "" ТОгда Если СНИЛС = Неопределено Тогда СНИЛС = Обход.СНИЛС; Район = Обход.Учреждение; КонецЕсли; КонецЕсли; КонецЦикла; Если Не СНИЛС = Неопределено И Выборка.СНИЛС = "" Тогда НаборПоиска = РегПлатежи.СоздатьНаборЗаписей(); Сч = 0; Для Каждого Колонка Из НаборПоиска.Отбор Цикл Сч = Сч + 1; Колонка.Установить(Выборка[Сч - 1]); КонецЦикла; НаборПоиска.Прочитать(); Если НаборПоиска.Количество() > 0 Тогда НаборПоиска.Очистить(); НаборПоиска.Записать(); Запись = РегПлатежи.СоздатьМенеджерЗаписи(); Сч = 0; Для Каждого Колонка Из Колонки Цикл Сч = Сч + 1; Запись[Колонка.Ключ] = Выборка[Сч - 1]; КонецЦикла; Запись.СНИЛС = СНИЛС; Если Не ЗначениеЗаполнено(Запись.Учреждение) И ЗначениеЗаполнено(Район) Тогда Запись.Учреждение = Район; КонецЕсли; Запись.Записать(); НоваяСтрока = Таблица.Добавить(); НоваяСтрока.СНИЛС = Запись.СНИЛС; НоваяСтрока.ФИО = Запись.ФИО; НоваяСтрока.Сумма = Запись.Сумма; КонецЕсли; КонецЕсли; КонецЦикла; |
|||
17
astraborz
07.03.13
✎
13:15
|
В этом обходе он долго выполняется. как бы упростить. знающие люди помогите пожалуйста
|
|||
18
butterbean
07.03.13
✎
13:17
|
(16) ппц, нафига 3 раза запрос выполнять??
|
|||
19
astraborz
07.03.13
✎
13:22
|
(18) Выгрузку забыл убрать просто это я результат сразу смотрел просто. А выборка выбирает весь список, а Обход обходит по одинаковым полям ФИО
|
|||
20
astraborz
07.03.13
✎
13:26
|
при замере
Пока Обход.НайтиСледующий(Выборка.ФИО, "ФИО") Цикл вызывается 1 053 раз за 55,188835 сек 90,22 |
|||
21
astraborz
07.03.13
✎
13:45
|
Тема еще актуальна
|
|||
22
butterbean
07.03.13
✎
13:48
|
сделай в запросе
ИТОГИ ПО ФИО и обходи результат по группировкам |
|||
23
butterbean
07.03.13
✎
13:48
|
(22) + это если я правильно понял что тебе надо...
|
|||
24
astraborz
07.03.13
✎
13:50
|
(23) Шас гляну
|
|||
25
astraborz
07.03.13
✎
14:05
|
(22) он тогда обходит только по группировкам, а мне надо перебрать весь список, если СНИЛС пустой то заменять надо измерения, на тот у которого существует СНИЛС. (А вот это скорее всего в запросе надо убрать Если снилсы у всех строк по ФИО одинаковые их вообще не обрабатывать)
|
|||
26
astraborz
07.03.13
✎
21:22
|
Больше идей нет?
по обходу запроса? |
|||
27
Kvestin
07.03.13
✎
23:17
|
Если с запросами пока сложно, то оставьте так, как есть с небольшими дополнениями:
1. Добавить индексирование по полю ФИО временной таблицы (вкладка дополнительно конструктора запроса) 2. Исправить обход следующим образом <code> Пока Выборка.Следующий() Цикл Если Выборка.СНИЛС = "" Тогда Продолжить; КонецЕсли; ФИО = Выборка.ФИО; СНИЛС = Неопределено; Пока Обход.НайтиСледующий(Выборка.ФИО, "ФИО") Цикл Если НЕ Обход.СНИЛС = "" ТОгда СНИЛС = Обход.СНИЛС; Район = Обход.Учреждение; Прервать; КонецЕсли; КонецЦикла; Если Не СНИЛС = Неопределено И Выборка.СНИЛС = "" Тогда НаборПоиска = РегПлатежи.СоздатьНаборЗаписей(); Сч = 0; Для Каждого Колонка Из НаборПоиска.Отбор Цикл Сч = Сч + 1; Колонка.Установить(Выборка[Сч - 1]); КонецЦикла; НаборПоиска.Прочитать(); Если НаборПоиска.Количество() > 0 Тогда НаборПоиска.Очистить(); НаборПоиска.Записать(); Запись = РегПлатежи.СоздатьМенеджерЗаписи(); Сч = 0; Для Каждого Колонка Из Колонки Цикл Сч = Сч + 1; Запись[Колонка.Ключ] = Выборка[Сч - 1]; КонецЦикла; Запись.СНИЛС = СНИЛС; Если Не ЗначениеЗаполнено(Запись.Учреждение) И ЗначениеЗаполнено(Район) Тогда Запись.Учреждение = Район; КонецЕсли; Запись.Записать(); НоваяСтрока = Таблица.Добавить(); НоваяСтрока.СНИЛС = Запись.СНИЛС; НоваяСтрока.ФИО = Запись.ФИО; НоваяСтрока.Сумма = Запись.Сумма; КонецЕсли; КонецЕсли; КонецЦикла;</code> Если есть желание разобраться, то получите все, что вам надо запросом, а не из еще одной выборки. Сделать это можно так: 1. Вашу последнюю выборку помещаем в еще одну временную таблицу (не забываем индексировать по полям которые потом используем в соединениях и отборах) (пусть будет ВТ2) 2. Из этой временной таблицы выбираем данные которые будем использовать для заполнения (те у которых СНИЛС <> ""). Помещаем их тоже во временную таблицу (пусть будет ВТ3) При этом группируем по ФИО (по СНИЛС берем Максимум), чтобы не задублить 3. Соединяем ВТ2 и ВТ3 по ФИО ЛЕВЫМ соединением и используем в выборке СНИЛС из присоединенной ВТ3 |
|||
28
astraborz
09.03.13
✎
19:21
|
(27) Спасибо. Попробую реализовать и напишу что было
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |