Элексир
|
|
« : 05-02-2009 01:14 » |
|
Здравствуйте. помогите с такой проблемой. Есть документ вида № телефона \ Баланс1 \ Баланс2 в котором лежат только "оригинальные" по (№ тел) записи. после некоторых манипуляций. записей становится больше. подскажите пожалуйста как составить запрос чтобы при сравнении двух одинаковых по столбцу (№ телефона) строк удалялась только строка с меньшими балансами. я к истине чет не могу подобраться
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 05-02-2009 07:58 » |
|
удалялась или не выдавалась в запросе?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Элексир
|
|
« Ответ #2 : 05-02-2009 12:19 » |
|
удалялась.
Я кажется неправильно выразился запрос не из внешних обработок а из самого документа. типа по кнопке нажать.
|
|
« Последнее редактирование: 05-02-2009 12:27 от Алексей1153++ »
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #3 : 05-02-2009 16:04 » |
|
В 1С 7.7 запрос изменять данные не может. Ты или не в ту тему написал (возможно - 8.Х?) или не так сформулировал (тебе алгоритм нужен?)
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #4 : 05-02-2009 21:23 » |
|
да, если не затруднит подскажи текстовку. я уже несколько раз документ заново набирал
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #5 : 05-02-2009 23:11 » |
|
1. ВыгрузитьТабличнуюЧасть в Таблицу значений 2. Отсортировать по НомерТелефона,Баланс 3. Пройти с конца до начала по ТЗ: если номер телефона поменялся от предыдущей строки - оставляем, если нет - удаляем 4. ЗагрузитьТабличнуюЧасть
(можно и без загрузки/выгрузки, но мне так привычнее - ИМХО быстрее работает на больших объемах)
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #6 : 05-02-2009 23:53 » |
|
попробуем
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #7 : 06-02-2009 00:38 » |
|
Kivals, а как пройтись по таблице значений?? у меня хмурь выдает
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #8 : 06-02-2009 00:56 » |
|
выдает ошибку номер за пределами значения. Процедура ТЗ() ТабЗнач = СоздатьОбъект("ТаблицаЗначений");
ТабЗнач.НоваяКолонка("Номер","Строка",7); ТабЗнач.НоваяКолонка("Баланс1","Число",10,2); ТабЗнач.НоваяКолонка("Баланс2","Число",10,2); ВыбратьСтроки(); Пока ПолучитьСтроку()=1 цикл ТабЗнач.НоваяСтрока(); ТабЗнач.Номер=№ тел; ТабЗнач.Баланс1=Баланс1; ТабЗнач.Баланс2=Баланс2; КонецЦикла; ТабЗнач.Сортировать("Номер+","Баланс1+"); сообщить(строка(ТабЗнач.КоличествоСтрок()));
Для НомерСтроки=ТабЗнач.КоличествоСтрок() По 1 Цикл ТабЗнач.ПолучитьСтрокуПоНомеру(НомерСтроки); номер0="9000000000"; если ТабЗнач.Номер=номер0 тогда ТабЗнач.УдалитьСтроку(); КонецЕсли; КонецЦикла;
КонецПроцедуры
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #9 : 06-02-2009 07:10 » |
|
ТабЗнач.НоваяКолонка("Номер","Строка",7); ТабЗнач.НоваяКолонка("Баланс1","Число",10,2); ТабЗнач.НоваяКолонка("Баланс2","Число",10,2); ВыбратьСтроки(); Пока ПолучитьСтроку()=1 цикл ТабЗнач.НоваяСтрока(); ТабЗнач.Номер=№ тел; ТабЗнач.Баланс1=Баланс1; ТабЗнач.Баланс2=Баланс2; КонецЦикла; заменяется на ВыгрузитьТабличнуюЧасть(ТабЗнач,"Номер,Баланс1,Баланс2"); НомерСтроки - это предопределенній атрибут документа, лучше в качестве счетчика используй что-то типа И1 1С не умеет делать цикл с шагом -1 - только +1, поэтому: Для И1=-ТабЗнач.КоличествоСтрок() По -1 Цикл ТабЗнач.ПолучитьСтрокуПоНомеру(-И1); и еще: ошибку тебе выдает на конкретную строку. Какую именно? УдалитьСтроку() требует номер строки, следовательно будет: ТабЗнач.УдалитьСтроку(-И1);
|
|
« Последнее редактирование: 06-02-2009 07:12 от Kivals »
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #10 : 06-02-2009 07:36 » |
|
спасибо щас попробую
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #11 : 06-02-2009 08:07 » |
|
Kivals, посмотри пожалуйста что в коде он у меня нифига не удаляет. Процедура ТЗ() ТабЗнач = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТабЗнач,"№ Тел, Баланс1, Баланс2"); удалитьстроки();
ТабЗнач.Сортировать("№ тел+","Баланс1+"); сообщить(строка(ТабЗнач.КоличествоСтрок())); Для И1=-ТабЗнач.КоличествоСтрок() По -1 Цикл ТабЗнач.ПолучитьСтрокуПоНомеру(-И1); номер0="9200000000"; если ТабЗнач.№ тел=номер0 тогда номер0=ТабЗнач.ЛицСч; ТабЗнач.УдалитьСтроку(-И1); КонецЕсли; КонецЦикла; ЗагрузитьТабличнуюЧасть(ТабЗнач); КонецПроцедуры
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #12 : 06-02-2009 08:56 » |
|
даже если исправить ошибку(вынести номер0 за цикл для...по...) он все равно не удаляет
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #13 : 06-02-2009 10:24 » |
|
У меня получилось УРА!!! оказывается там надо еще использовать ПолучитьЗначение() Всем, большое спасибо!!!
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #14 : 06-02-2009 21:25 » |
|
Не понял - где там нужно ПолучитьЗначение()? у тебя есть ПолучитьСтрокуПоНомеру() - этого должно было хватить...
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #15 : 06-02-2009 23:14 » |
|
Kivals,вот с этим кодом у меня все заработало. [ ТабЗнач = СоздатьОбъект("ТаблицаЗначений"); ВыгрузитьТабличнуюЧасть(ТабЗнач,"№ тел,,Баланс1,Баланс2"); удалитьстроки(); ТабЗнач.Сортировать("+№ тел,+Баланс1"); Номер0=""; Для И1= -(ТабЗнач.КоличествоСтрок()) По -1 Цикл ТабЗнач.ПолучитьЗначение(-И1,"№ тел"); сообщить(ТабЗнач.ПолучитьЗначение(-И1,"№ тел")); если СокрЛП(лицевой)=СокрЛП(ТабЗнач.ПолучитьЗначение(-И1,"№ тел")) тогда ТабЗнач.УдалитьСтроку(-И1); сообщить("строка удалена"); иначе лицевой=ТабЗнач.ПолучитьЗначение(-И1,"№ тел"); КонецЕсли; КонецЦикла; ЗагрузитьТабличнуюЧасть(ТабЗнач);
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #16 : 06-02-2009 23:24 » |
|
Kivals,А как правильно надо было использовать ПолучитьСтрокуПоНомеру()?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #17 : 07-02-2009 09:23 » |
|
№ тел - это у тебя идентификатор колонки? тогда наверное только как у тебя сделано... Просто у меня идентификаторы колонок всегда соответствуют правилам идентификаторов 1С, и тогда начало цикла будет такое: Для И1= -(ТабЗнач.КоличествоСтрок()) По -1 Цикл ТабЗнач.ПолучитьСтрокуПоНомеру(-И1); ЗнКол=ТабЗнач.ИдентКолонки;
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #18 : 07-02-2009 17:09 » |
|
А теперь понятно я не извлекал значение колонки из полученной строки. поэтому не происходило сравнение значений.
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #19 : 07-02-2009 17:12 » |
|
№ тел это идентификатор только без пробела.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #20 : 07-02-2009 23:36 » |
|
Если идентификатор колонки НомерТелефона то прекрасно будет работать следующий код: ТабЗнач = СоздатьОбъект("ТаблицаЗначений"); ВыгрузитьТабличнуюЧасть(ТабЗнач,"НомерТелефона,Баланс1,Баланс2"); УдалитьСтроки(); // не обязательно ТабЗнач.Сортировать("+НомерТелефона,+Баланс1"); Лицевой=""; Для И1= -(ТабЗнач.КоличествоСтрок()) По -1 Цикл ТабЗнач.ПолучитьСтрокуПоНомеру(-И1); Сообщить(ТабЗнач.НомерТелефона); Если СокрЛП(Лицевой)=СокрЛП(ТабЗнач.НомерТелефона) Тогда ТабЗнач.УдалитьСтроку(-И1); Сообщить("строка удалена"); Иначе Лицевой=ТабЗнач.НомерТелефона; КонецЕсли; КонецЦикла; ЗагрузитьТабличнуюЧасть(ТабЗнач);
|
|
|
Записан
|
|
|
|
Элексир
|
|
« Ответ #21 : 08-02-2009 13:57 » |
|
Kivals, спасибо за помошь все работает
|
|
|
Записан
|
|
|
|
|