удаление строки из таблицы значений

  • Автор темы Helena
  • Дата начала
H

Helena

Гость
#1
Вроде простая операция, а не работает... :)

тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку()=1 Цикл
Если (тз.Подр="ППС") Тогда
тз.удалитьстроку();
КонецЕсли;
КонецЦикла;

Подскажите, пожалуйста, что я делаю не так? В отладчике точно вижу, что тз.Подр=ППС, но условие все равно проскакивается
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#2
Посмотрите внимательно в отладчике.
Подозреваю, что тз.Подр = "ППС "
Всмысле, содержит либо впереди, либо в конце строки пробелы
условие СокрЛП(тз.Подр) точно будет "ППС"
 
L

LSH

Гость
#4
Для: Helena

<!--QuoteBegin-Helena+12:04:2007, 10:22 -->
<span class="vbquote">(Helena @ 12:04:2007, 10:22 )</span><!--QuoteEBegin-->тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку()=1 Цикл
Если (тз.Подр="ППС") Тогда
тз.удалитьстроку();
КонецЕсли;
КонецЦикла;
[snapback]62197" rel="nofollow" target="_blank[/snapback]​
[/quote]

Не правильно.

У вас в цикле пропускаются строки. Например, у нас 3-я и 4-я строка содержат тз.Подр = "ППС".
Цикл попадает на 3-ю строку, условие выполняется, и он эту строку удаляет. При этом, все последующиестроки сдвигаются на 1 вверх, и получается так, что 4-я строка стала 3-ей, но цикл 3-ю уже обработал, поэтому он её пропустит и перейдет сразу на следующую.

Идеальный вариант:
Код:
а=1;

Пока а <= тз.КоличествоСтрок() Цикл
тз.ПолучитьСтрокуПоНомеру(а);
Если СокрЛП(тз.Подр)="ППС" Тогда
тз.УдалитьСтроку(а);		//удаляем строку, но "а" не увеличиваем, т.к. следующая строка у нас и есть "а"
Иначе
а = а + 1;						 //увеличиваем а (для перехода на след. строку)
КонецЕсли;
КонецЦикла;
 
H

Helena

Гость
#5
В итоге строки я удаля, но в дальнейшем, когда я из функции обращаюсь к этой таблице, оказывается так, что строки не удалены.....:(
не понимаю, почему....
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#6
Для: LSH
Еще можно так:
Код:
поз=0;
Пока тз.НайтиЗначение("ППС",поз,"Подр") <> 0 Цикл
тз.УдалитьСтроку(поз);
поз=0;
КонецЦикла;
ИМХО, короче будет...
 
L

LSH

Гость
#7
Для: vitfil

Короче, но по-моему медленнее.

Всё будет тормозить
Код:
тз.НайтиЗначение("ППС",поз,"Подр")
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#8
Для: LSH
сказывается отсутствие индексов на ТЗ в семерке.
только вот я лично не знаю, как работает тз.КоличествоСтрок()...
Ради прикола сейчас сделаю тест на скорость двух вариантов...
 
H

Helena

Гость
#9
Это все замечательно, но не могли бы вы на мой вопрос ответить? :)

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

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#10
Для: LSH
Ваш вариант на 10 000 строк - 3267 мсек
Мой вариант без сортировки таблицы - 11120 мсек
После сортировки таблицы - 11808 мсек.

Вывод: мой код более компактный, ваш код более быстрый!
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#11
Для: LSH
Дальнейшие испытания показали, что время выполнения моего варианта практически всегда в 4 раза больше.

Для: Helena
ах даааааааа.
Давайте ваш код по удалению и потом как обращаетесь к таблице, в которой оказывается, что не удалены строки. Может, удаление все же не происходит? В отладчике посмотрите, удаляются строки или нет.
 
L

LSH

Гость
#12
Для: vitfil

В коде часто встречаю такие конструкции:

Код:
тз.ВыбратьСТроки();
Пока тз.ПолучитьСтроку() = 1 Цикл
Если какое_то_условие = 1 Тогда
тз.УдалитьСТроку();
тз.ВыбратьСтроки();
КонецЦикла;
Можете замерять время такого способа (на ваших данных)?
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#13
Для: LSH
Время указано в мсек. Таблица заполнялась случайным образом двумя значениями: "ППС" и "ККС". Удалялись строки с "ППС".
Всего строк в таблице: 10000
Вот парочка замеров. Тенденция, однако, прослеживается.

Удалено позиций: 2925
Первый вариант (ваш): 1100
Вариант без сортировки: 4240
Вариант с сортировкой: 7540
Вариант с перевыборкой: 152344

Удалено позиций: 3032
Первый вариант: 1143
Вариант без сортировки: 4547
Вариант с сортировкой: 8511
Вариант с перевыборкой: 160330
 
L

LSH

Гость
#14
<!--QuoteBegin-vitfil+14:04:2007, 08:10 -->
<span class="vbquote">(vitfil @ 14:04:2007, 08:10 )</span><!--QuoteEBegin-->Вариант с перевыборкой: 152344
...
Вариант с перевыборкой: 160330
[snapback]62405" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ничего себе!!
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#15
Для: LSH
С перевыборкой - это ваш последний код. В общем, в следующий раз, когда встречаете такой код, берете топор и отымаете руки тому, кто это писал... :)
Я еще и не такое встречал. Расходная накладная. При проведении запрос формируется не по списку товаров, а по каждому товару в отдельности с запретом товарных дублей в табличной части документа.
 
H

Helena

Гость
#16
тз.ВыбратьСтроки();
Пока тз.ПолучитьСтроку()=1 Цикл

Если (СокрЛП(тз.Подр)="ППС") и (тз.НомерСтроки()<>0) Тогда
тз.удалитьстроку();
КонецЕсли;
КонецЦикла;

// вывожу тз, строки удалены

Функция занято()
зан=0;
тз.выбратьстроки();
Пока тз.ПолучитьСтроку()=1 Цикл
........
КонецЦикла;
возврат зан;
КонецФункции

// в отладчике вижу, что обрабатывается вся таблица тз (т.е. строки в ней не удалены)
 
F

Flut

Гость
#17
Пробуй сделать как написал LSH, должно получиться

а=1;

Пока а <= тз.КоличествоСтрок() Цикл
тз.ПолучитьСтрокуПоНомеру(а);
Если СокрЛП(тз.Подр)="ППС" Тогда
тз.УдалитьСтроку(а); //удаляем строку, но "а" не увеличиваем, т.к. следующая строка у нас и есть "а"
Иначе
а = а + 1; //увеличиваем а (для перехода на след. строку)
КонецЕсли;
КонецЦикла;
 
H

Helena

Гость
#18
В том-то и дело, чтьо удалять-то удаляет, потому что я сначала вывожу "очищенную" таблицу, потом снова к ней обращаюсь и уже оказывается, что она "не очищена"
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#19
Для: Helena
Посмотрел ваш код... Посмотрел рекомендации и примеры, которые дали вам в качестве правильного кода... Никак не могу понять, почему вы не хотите читать то, что вам пишут?! У вас в коде ошибка. Не удаляются все "ненужные" строки в таблице.