Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 03:45

Вырезание строк в новую таблицу

Автор RomanCasper, 12 мая 2015, 09:06

0 Пользователей и 1 гость просматривают эту тему.

RomanCasper

Привет знатоки.

Помогите с одним вопросом, я просто не хочу накосячить.

Есть ТаблицаЗначиний ТЗ1 вида:
Адрес Паллета Количество
ADR1    P001    100
ADR1    P002    103
ADR2    P003    5
ADR2    P004    88
ADR3    P005    100
ADR4    P006    150


Во такая простенькая, теперь нужно вырезать строки в которых "Адрес" равен "ADR2" и "Адрес" равен "ADR4" вставить в таблицу ТЗ2

В иготе должно быть так:
ТЗ1
Адрес Паллета Количество
ADR1    P001    100
ADR1    P002    103
ADR3    P005    100


ТЗ2
Адрес Паллета Количество
ADR2    P003    5
ADR2    P004    88
ADR4    P006    150


Когда удаляешь строку то индексы путаются, как сделать правильно? Чтобы каждая строка была проверена, и выборка не выходила за границы массива?:dfbsdfbsdf:

Спасибо! :lol:

nemox

Отбор = Новый Структура();

Отбор.Вставить("Адрес", "ADR2");

Отбор.Вставить("Адрес", "ADR4");

Строки = ТЗ1.НайтиСтроки(Отбор);

Для Каждого стр из строки Цикл
    НоваяСтрока = ТЗ2.Добавить();
    НоваяСтрока....
    НоваяСтрока.....
    ТЗ1.Удалить(стр);
КонецЦикла;

LexaK

не надо ни чего удалять, у вас таблица ТЗ в каком-то виде находится в базе данных, вы ее формируете запросом,
или сразу при формировании вашей ТЗ добавьте условие по отбору нужных строк,
или используйте временную таблицу ТЗ и к ней сделайте запрос

Запрос на равенство нужным адресам (ADR2,ADR4)

Запрос.текст = "
|выбрать
|  *
|из ТЗ
|где
|  Адрес в (&Адреса)
"


и второй Запрос на НЕ равенство нужным адресам (ADR2,ADR4)

Запрос.текст = "
|выбрать
|  *
|из ТЗ
|где
|  Не Адрес в (&Адреса)
"


Выполняете эти два запроса, можно даже в одном пакете запросов, см.книгу.
получаете две таблицы одну с нужными адресами, другую с остальными адресами не вошедшими в нужные.
если помогло нажмите: Спасибо!

RomanCasper

Если я не ошщибаюсь, то ваш алгоритм будет пропускать строки после удаления. Ну в общем я сам написал. вот код:
ТаблицаДокИПол = Новый ТаблицаЗначений;
ТаблицаДокИПол.Колонки.Добавить("Адрес");
ТаблицаДокИПол.Колонки.Добавить("Паллета");
Сч = 0;
Пока Сч < ТаблицаОстатков.Количество() Цикл
Состояние("Подсчет на "+Формат(ДатаОтчета, "ДФ=""дд.ММ.гггг""")+" - обработка ячеек POL и DOK "+Сч+" из "+ТаблицаОстатков.Количество()+"");
Строка = ТаблицаОстатков[Сч];
Если (Найти(Строка.Получить(0),"POL") > 0) ИЛИ (Найти(Строка.Получить(0),"DOK") > 0) Тогда
НоваяСтрока = ТаблицаДокИПол.Добавить();
НоваяСтрока.Адрес = Строка.Адрес;
НоваяСтрока.Паллета = Строка.Паллета;
ТаблицаОстатков.Удалить(Строка);
Иначе // Благодаря этой переменной мы
  // не пропускаем строки в таблице значений
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;


Данные тут другие, но думаю смысл будет понятен.
Добавлено: 12 мая 2015, 10:07


LexaK, до этого я почему-то не догадался. Спасибо)

vitasw

Цитата: RomanCasper от 12 мая 2015, 10:04Ну в общем я сам написал. вот код

Попробуйте те строки которые нужно удалить помещать в массив. В качестве примера:
МассивСтрок=ТЗ.НайтиСтроки(СтруктураОтбора);
Для Каждого ЭлемМассив ИЗ МассивСтрок Цикл
     ТЗ.УдалитьСтроку(ЭлемМассив);
КонецЦикла;



Похожие темы (5)

Рейтинг@Mail.ru

Поиск