|
v7: Фильтр в индексированной таблице "Итерирование после изменения индекса невозмож" | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
24.09.12
✎
15:44
|
Добрый день. Есть таблица значений с колонкой типа "СписокЗначений", Хочу на ее основе сделать другую ТЗ, отфильтрованную по спискам в строках. Для этого использую ИндексированнуюТаблицу, но видимо что-то делаю не так, может недопонимаю, в общем вот код:
(тзХарактеристик - ТаблицаЗначений, тз_ХР_ост - ИТЗ) тзХарактеристик.ВыбратьСтроки(); Пока тзХарактеристик.ПолучитьСтроку() = 1 Цикл Если тзХарактеристик.спОтбора.РазмерСписка() = 0 Тогда Продолжить; КонецЕсли; ИНД = тзХарактеристик.Характеристика; тз_ХР_ост.ДобавитьИндекс(ИНД, ИНД); Для сч=1 По тзХарактеристик.спОтбора.РазмерСписка() Цикл зн = тзХарактеристик.спОтбора.ПолучитьЗначение(сч); тз_ХР_ост.УстановитьФильтр(зн, зн, ИНД, 0, 2 - тзХарактеристик.ВсеКроме); КонецЦикла; тз_ХР_ост.ВыбратьСтроки(ИНД); Пока тз_ХР_ост.ПолучитьСтроку(ИНД) = 1 Цикл тз_ХР_ост.УдалитьСтроку(тз_ХР_ост.НомерСтроки); КонецЦикла; тз_ХР_ост.ВыключитьФильтр(ИНД); КонецЦикла; |
|||
1
Zhuravlik
24.09.12
✎
15:46
|
+ кроме того "тз_ХР_ост.УстановитьФильтр" - делаю в цикле, это я так понимаю неправильно, а можно в виде значений фильтра сам список значений указать?
|
|||
2
Zhuravlik
24.09.12
✎
15:48
|
+ Дико извиняюсь, переделал, но ошибка осталась:
тзХарактеристик.ВыбратьСтроки(); Пока тзХарактеристик.ПолучитьСтроку() = 1 Цикл Если тзХарактеристик.спОтбора.РазмерСписка() = 0 Тогда Продолжить; КонецЕсли; ИНД = тзХарактеристик.Характеристика; тз_ХР_ост.ДобавитьИндекс(ИНД, ИНД); тз_ХР_ост.УстановитьФильтр(тзХарактеристик.спОтбора, тзХарактеристик.спОтбора, ИНД, 0, 2 - тзХарактеристик.ВсеКроме); тз_ХР_ост.ВыбратьСтроки(ИНД); Пока тз_ХР_ост.ПолучитьСтроку(ИНД) = 1 Цикл тз_ХР_ост.УдалитьСтроку(тз_ХР_ост.НомерСтроки); КонецЦикла; тз_ХР_ост.ВыключитьФильтр(ИНД); КонецЦикла; |
|||
3
Zhuravlik
24.09.12
✎
15:51
|
Решил)) тз_ХР_ост.УдалитьСтроки(ИНД);
1С++ рулит))))) |
|||
4
Zhuravlik
26.09.12
✎
18:15
|
Извините, снова подниму вопрос. Как оказалось, при способе в (3) удаляет строки, фильтруя только по первому значению списка. А как сделать так, чтобы удалял, фильтруя по всему списку? Зачитался уже литературой, подумал может есть какой прием, до которого я все не допру никак?
Вот конечный код: тзХарактеристик.ВыбратьСтроки(); Пока тзХарактеристик.ПолучитьСтроку() = 1 Цикл Если тзХарактеристик.спОтбора.РазмерСписка() = 0 Тогда Продолжить; КонецЕсли; ИНД = тзХарактеристик.Характеристика; тз_ХР_ост.ДобавитьИндекс(ИНД, ИНД); тз_ХР_ост.УстановитьФильтр(тзХарактеристик.спОтбора, тзХарактеристик.спОтбора, ИНД, 0, 2 - тзХарактеристик.ВсеКроме); тз_ХР_ост.УдалитьСтроки(ИНД); тз_ХР_ост.ВыключитьФильтр(ИНД); КонецЦикла; КонецЦикла; |
|||
5
Mikeware
26.09.12
✎
18:20
|
выводи табличку перед удалением, да смотри, что у тебя попадает под фильтр
|
|||
6
Mikeware
26.09.12
✎
18:23
|
а вообще, чушь какая-то...
|
|||
7
Zhuravlik
26.09.12
✎
18:29
|
(5) Ды уже час вывожу, не вкурю никак...
(6) тзХарактеристик.спОтбора - список значений тз_ХР_ост - таблица с остатками, с колонками характеристик авто. Необходимо исключить из таблицы с остатками значения по списку спОтбора, с проверкой условия "ВсеКроме". Т.е. если ВсеКроме - 1 - удалить все значения из тз_ХР_ост, кроме тех, что есть в списке спОтбора. Иначе - просто удалить значения. |
|||
8
Mikeware
26.09.12
✎
18:32
|
(7) если индекс у тебя по одной колонке - коего хера ты ему в фильтр список подсовываешь?
|
|||
9
Zhuravlik
26.09.12
✎
18:32
|
+(7) т.е. не значения, а строки таблицу тз_ХР_ост
|
|||
10
Zhuravlik
26.09.12
✎
18:33
|
(8) Сначала невнимательно прочитал доку, так заработало, и не стал вникать глубже. Потом глюкануло, стал разбираться, оказалось работает - но только по первому значению в списке. Теперь вот думаю как обойтись.
|
|||
11
ADirks
27.09.12
✎
06:35
|
А ты их откуда берёшь то, остатки эти? Зачем ты их с сервера на клиент тащил, чтоб удалять потом?
Массовое удаление строк в ИТ - плохая идея, ибо индексы каждый раз пересчитываются. |
|||
12
Zhuravlik
27.09.12
✎
09:27
|
(11) Беру прямым запросом 1Sqlite, получаю мгновенно.
|
|||
13
ADirks
27.09.12
✎
09:39
|
(12) Вот, замечательно. Просто запрос перепиши так, чтобы этих лишних строк там не было. Это и проще и правильней.
|
|||
14
Zhuravlik
27.09.12
✎
10:11
|
(13) Вы не поняли, я пишу обработку для универсального подбора по регистру. При открытии я получаю остатки, потом фильтрую их из пользовательского диалога на форме, и передаю в контекст при закрытии то,что осталось. Сделать как вы говорите - это на каждый фильтр делать новый запрос? Нет, не пойдет)))
Я уже решил, использовал методы индексированной таблицы Разность() и Пересечение(). Спасибо всем за советы. |
|||
15
Mikeware
27.09.12
✎
10:16
|
(14) не проще формировать запрос динамически?
|
|||
16
Zhuravlik
27.09.12
✎
11:18
|
(15) Я так и хотел сначала, потом понял, что опыта маловато, могу в срок не попасть. Сделал так, все равно все эти остатки получаю меньше чем за секунду.
|
|||
17
Zhuravlik
27.09.12
✎
11:21
|
+ И так даже лучше, потому что пользователь видит в диалоге остаток ресурса по измерениям.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |