Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) ИТЗ (Позиционирование после сортировки) (число прочтений - 8580 )
zsw
YaBB Newbies
*
Отсутствует


I Love

Сообщений: 6
Местоположение: Тольятти
Зарегистрирован: 29. Июня 2006
Пол: Мужской
ИТЗ (Позиционирование после сортировки)
06. Сентября 2007 :: 06:40
Печать  
Необходимо после сортировки в ИТЗ получать значения по номеру строки.
Код
Выбрать все
Процедура Сформировать()
	Перем ИндТабл,Поз;
	ИндТабл=СоздатьОбъект("ИндексированнаяТаблица");
	ИндТабл.НоваяКолонка("Кол1");
	ИндТабл.НоваяСтрока(); ИндТабл.Кол1 = "3";
	ИндТабл.НоваяСтрока(); ИндТабл.Кол1 = "1";
	ИндТабл.НоваяСтрока(); ИндТабл.Кол1 = "2";
	Сообщить("До Сортировки");
	Для Поз=1 По 3 Цикл          
		ИндТабл.НомерСтроки=Поз;
		Сообщить(Строка(Поз)+"="+ИндТабл.Кол1);
	КонецЦикла;                
	Сообщить("Сортировка");
	ИндТабл.Сортировать("Кол1");
	ИндТабл.Показать();
	Сообщить("Прямое позиционирование");
	Для Поз=1 По 3 Цикл          
		ИндТабл.НомерСтроки=Поз;
		Сообщить(Строка(Поз)+"="+ИндТабл.Кол1);
	КонецЦикла;                
	Сообщить("Получение значения");
	Для Поз=1 По 3 Цикл          
		Сообщить(Строка(Поз)+"="+ИндТабл.ПолучитьЗначение(Поз,"Кол1"));
	КонецЦикла;                
	Сообщить("ПереборСтрок");
	ИндТабл.ВыбратьСтроки();
	Поз=1;
	Пока ИндТабл.ПолучитьСтроку() = 1 Цикл
		Сообщить(Строка(Поз)+"="+ИндТабл.Кол1);
		Поз=Поз+1;
	КонецЦикла;
КонецПроцедуры
 


Таблица сортируется:  ИндТабл.Показать() и перебор строк это показывают, но прямая адресация оставляет по прежнему.

Результат работы:

До Сортировки
1=3
2=1
3=2
Сортировка
Прямое позиционирование
1=3
2=1
3=2
Получение значения
1=3
2=1
3=2
ПереборСтрок
1=1
2=2
3=3

Создание индексов не помогало. Что же я делаю не так? Озадачен
PS Поиском пользовался. 1С++ 1cpp-2.0.3.3
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #1 - 06. Сентября 2007 :: 07:37
Печать  
В ИТ физический порядок строк не меняется никогда.  Метод Сортировать() на самом деле создаёт индекс, и ничего более.
  
Наверх
 
IP записан
 
zsw
YaBB Newbies
*
Отсутствует


I Love

Сообщений: 6
Местоположение: Тольятти
Зарегистрирован: 29. Июня 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #2 - 06. Сентября 2007 :: 08:10
Печать  
Как тогда получить значение конкретной строки этого индекса?

ИТЗ похоже повторяет стандартую ТЗ с расширением возможностей ее методов.
В стандартной ТЗ этот код работает.
Код
Выбрать все
Процедура СформироватьТЗ()
	Перем ТЗ,Поз;
	ТЗ=СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("Кол1");
	ТЗ.НоваяСтрока(); ТЗ.Кол1 = "3";
	ТЗ.НоваяСтрока(); ТЗ.Кол1 = "1";
	ТЗ.НоваяСтрока(); ТЗ.Кол1 = "2";
	Сообщить("До Сортировки");
	Для Поз=1 По 3 Цикл          
		ТЗ.ПолучитьСтрокуПоНомеру(Поз);
		Сообщить(Строка(Поз)+"="+ТЗ.Кол1);
	КонецЦикла;                
	Сообщить("Сортировка");
	ТЗ.Сортировать("Кол1");
	ТЗ.ВыбратьСтроку();
	Сообщить("Прямое позиционирование");
	Для Поз=1 По 3 Цикл          
		ТЗ.ПолучитьСтрокуПоНомеру(Поз);
		Сообщить(Строка(Поз)+"="+ТЗ.Кол1);
	КонецЦикла;                
	Сообщить("Получение значения");
	Для Поз=1 По 3 Цикл          
		Сообщить(Строка(Поз)+"="+ТЗ.ПолучитьЗначение(Поз,"Кол1"));
	КонецЦикла;                
	Сообщить("ПереборСтрок");
	ТЗ.ВыбратьСтроки();
	Поз=1;
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		Сообщить(Строка(Поз)+"="+ТЗ.Кол1);
		Поз=Поз+1;
	КонецЦикла;
КонецПроцедуры
 


Её результат:

До Сортировки
1=3
2=1
3=2
Сортировка
Прямое позиционирование
1=1
2=2
3=3
Получение значения
1=1
2=2
3=3
ПереборСтрок
1=1
2=2
3=3

Если сортировка делает только индекс, значит это синоним ДобавитьИндекс() Печаль
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТЗ (Позиционирование после сортировки)
Ответ #3 - 06. Сентября 2007 :: 08:55
Печать  
Твоя ошибка в том, что ты пытаешься программировать на трезвую голову.
В этом нет ничего необычного, к сожалению это общее заблуждение.

А после стакана мартини-водка (со льдом) ты бы сразу понял, что отсортированную ИТ можно выгрузить в другую ИТ, в которой порядок строк уже будет другим.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
zsw
YaBB Newbies
*
Отсутствует


I Love

Сообщений: 6
Местоположение: Тольятти
Зарегистрирован: 29. Июня 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #4 - 06. Сентября 2007 :: 09:10
Печать  
Это не ошибка. Выгрузка помогает если ИТЗ не большая и позволяет память/время.
Недоработка в НомерСтроки=, ПолучитьЗначение(), УстановитьЗначение() ,которые должны работать с номером строки основного индекса. К тому же в доке на свойство НомерСтроки указано

Цитата:
Доступ: чтение и запись.
Тип: Число.
Описание: Номер текущей строки в основном индексе. Если строка не выбрана, то 0.


  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #5 - 06. Сентября 2007 :: 09:19
Печать  
Индекс в ИТ представляет собой двоичное дерево, и как следствие, там нет таких понятий, как "номера строк", а есть понятие "узлы". С помощью такого индекса легко найти нужное значение. Но получить некое значение по номеру узла можно только полным перебором. 

НомерСтроки в ИТ - это всегда номер строки в массиве строк. Массив строк, напомню, не сортируется никогда.
  
Наверх
 
IP записан
 
zsw
YaBB Newbies
*
Отсутствует


I Love

Сообщений: 6
Местоположение: Тольятти
Зарегистрирован: 29. Июня 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #6 - 06. Сентября 2007 :: 13:27
Печать  
Спасибо всем за помощь!
Вопрос решен по совету kms.
Но в описании свойства ТекущаяСтрока все таки опечатка.
Тему можно закрыть. Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТЗ (Позиционирование после сортировки)
Ответ #7 - 06. Сентября 2007 :: 14:31
Печать  
Там, кстати, я смайлов забыл добавить, но там они есть Улыбка

А по теме я бы сказал, что это скорее метод Сортировать выбивается из общей картины.
По крайней мере, его целевая аудитория отличается от целевой аудитории ИТ в целом.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #8 - 06. Сентября 2007 :: 14:38
Печать  
kms писал(а) 06. Сентября 2007 :: 08:55:
А после стакана мартини-водка (со льдом) ты бы сразу понял


Загадка: если сделать поиск по форуму за все время по слову 'мартини', то как думаете, кто будет автором постов?  Смех
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #9 - 13. Сентября 2007 :: 14:22
Печать  
ADirks писал(а) 06. Сентября 2007 :: 07:37:
В ИТ физический порядок строк не меняется никогда.  Метод Сортировать() на самом деле создаёт индекс, и ничего более.

Странно, если хочешь выбрать по индексу надо писать Выбрать(индекс), а при сортировке не нужно индекс указывать, т.е. выборка идет по основному индексу?
Код
Выбрать все
	ит = СоздатьОбъект("ИндексированнаяТаблица");
	ит.НоваяКолонка("тест");

	ит.НоваяСтрока();
	ит.тест = 2;
	ит.НоваяСтрока();
	ит.тест = 3;
	ит.НоваяСтрока();
	ит.тест = 1;
	ит.НоваяСтрока();
	ит.тест = 4;


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


Результат - 1, 2, 3, 4.
Поведение, конечно, запутанное. Сам когда-то времени много потерял пытаясь найти ошибку посл перевода алгоритма с ТЗ на ИТЗ.
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #10 - 14. Сентября 2007 :: 07:13
Печать  
Цитата:
Поведение, конечно, запутанное. Сам когда-то времени много потерял пытаясь найти ошибку посл перевода алгоритма с ТЗ на ИТЗ.

Да, согласен, метод Сортировать() выбивается из концепции ИТ. Самое прикольное, что он (и не только он) был приделан как раз для упрощения перехода с ТЗ на ИТ, а получилось наоборот  Улыбка
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #11 - 14. Сентября 2007 :: 07:30
Печать  
Я как раз так и подумал, что обозвали НомеромСтроки какой-то номер узла типа как в ТЗ, а на самом деле это вовсе, оказывается, и не номер строки, уж лучше был бы НомерУзла, тогда путанницы бы не было. Для эмуляции ТЗ все равно классы народ делает.
  
Наверх
ICQ  
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #12 - 14. Сентября 2007 :: 08:03
Печать  
Может записать баг, чтоб не забылось? Может когда будет С++спец, который захочет исправить этот недостаток...
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #13 - 14. Сентября 2007 :: 08:51
Печать  
alest писал(а) 14. Сентября 2007 :: 07:30:
Я как раз так и подумал, что обозвали НомеромСтроки какой-то номер узла типа как в ТЗ, а на самом деле это вовсе, оказывается, и не номер строки, уж лучше был бы НомерУзла, тогда путанницы бы не было. Для эмуляции ТЗ все равно классы народ делает.

Неееее!!!  НомерСтроки - это именно номер строки! Это тот номер, который раз и навсегда был "присвоен" строке при добавлении.  Методы Найти...()  возвращают этот самый номер, по которому можно обратиться к нужной строке за данными.
  
Наверх
 
IP записан
 
alest
Senior Member
****
Отсутствует



Сообщений: 380
Местоположение: Гродно, Беларусь
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ (Позиционирование после сортировки)
Ответ #14 - 14. Сентября 2007 :: 17:03
Печать  
В доке по Номеру строки написать бы, что это ПЕРВОНАЧАЛЬНО присваиваемый номер и он НЕ изменяется.
Думал НомерСтроки() будет возвращать порядковый номер- зря, а жальПечаль
А для индекса понятие НомерСтроки неприменимо, чтоб при построении индекса сразу номер проставлялся?
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать