Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Индексированная таблица, НайтиСтроку()... (число прочтений - 4661 )
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Индексированная таблица, НайтиСтроку()...
08. Февраля 2007 :: 13:28
Печать  
При попытке найти строку ИТЗ как-то странно ищет.
Если значение агрегатного типа - не находит только в первой строке значение, в остальных строках находит.
Если по составному ключу - находит значения, НЕ соответствующие условию поиска...

Или ошибка, или я не умею ее готовить (ИТЗ)...

В архиве - тестовая конфигурация, обработка "Тест ИТЗ" в меню.

P.S.
Релиз 1С - 21,SQL.
База данных - ДБФ.
Проверялось на 1C++: 2.5.0.0, 2.0.3.2 (ночные сборки 02.02.2007)
« Последняя редакция: 08. Февраля 2007 :: 16:28 - nvg »  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #1 - 08. Февраля 2007 :: 13:54
Печать  
А зачем ты делаешь Цитата:
Условия.ДобавитьИндекс("КлючАгрегат"      , "*Скидка");

Если Скидка у тебя строка?

И почему ты говоришь "по состовному ключу", если у тебя
Цитата:
Условия.ДобавитьИндекс("КлючСтрока"            , "#Значение");
...
Если Условия.НайтиСтроку("КлючСтрока", ЗначениеСтр, 0, 1) > 1 Тогда
                 Сообщить("Составной ключ: Значение найдено, строка: " + Условия.НомерСтроки + ", значения:
                 |К1 [" + итзГруппы.Скидка + "], К2 [" + итзГруппы.Фактор + "], К3 [" + Строка(ЗначениеСтр) + "]");
           Иначе
                 Сообщить("Составной ключ: Значение НЕ найдено: " + Строка(ЗначениеСтр));
           КонецЕсли;
  
Наверх
 
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #2 - 08. Февраля 2007 :: 14:48
Печать  
JohnyDeath писал(а) 08. Февраля 2007 :: 13:54:
А зачем ты делаешь Цитата:
Условия.ДобавитьИндекс("КлючАгрегат"      , "*Скидка");

Если Скидка у тебя строка?

И почему ты говоришь "по состовному ключу", если у тебя
Цитата:
Условия.ДобавитьИндекс("КлючСтрока"            , "#Значение");
...
Если Условия.НайтиСтроку("КлючСтрока", ЗначениеСтр, 0, 1) > 1 Тогда
                 Сообщить("Составной ключ: Значение найдено, строка: " + Условия.НомерСтроки + ", значения:
                 |К1 [" + итзГруппы.Скидка + "], К2 [" + итзГруппы.Фактор + "], К3 [" + Строка(ЗначениеСтр) + "]");
           Иначе
                 Сообщить("Составной ключ: Значение НЕ найдено: " + Строка(ЗначениеСтр));
           КонецЕсли;


Согласен, наглючил при подготовке тестовой базы.

Исправленная версия в архиве.
В первом случае (поиск по агрегатному типу) не находит в первой строке значения.
По составному ключу - не находи вообще записей.

Может, снова в чем ошибся сам (я только учусь)?
« Последняя редакция: 08. Февраля 2007 :: 16:28 - nvg »  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #3 - 08. Февраля 2007 :: 15:00
Печать  
Сразу видно, что ты индексы неправильно опять расставляешь.
Код
Выбрать все
Условия.ДобавитьИндекс("КлючСоставной"	, "*Скидка, *Фактор, #Значение"); 


А скидка - у тебя строка
Код
Выбрать все
	|Скидки.DESCR As Скидка,
 


внимательно проверь все индексы и *
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #4 - 08. Февраля 2007 :: 15:05
Печать  
Цитата:
Если значение агрегатного типа - не находит только в первой строке значение, в остальных строках находит.


Код
Выбрать все
Если Условия.НайтиСтроку("КлючАгрегат", итзГруппы.Фактор, 0, 1) > 1 Тогда
 


зачем больше 1? изучи доку - так ты пропускаешь первую строку !!
Вот и ответ Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #5 - 08. Февраля 2007 :: 15:26
Печать  
artbear писал(а) 08. Февраля 2007 :: 15:05:
Цитата:
Если значение агрегатного типа - не находит только в первой строке значение, в остальных строках находит.


Код
Выбрать все
Если Условия.НайтиСтроку("КлючАгрегат", итзГруппы.Фактор, 0, 1) > 1 Тогда
 


зачем больше 1? изучи доку - так ты пропускаешь первую строку !!
Вот и ответ Улыбка


Посыпаю голову пеплом...
Все нормально после типизации значений и исправлений проверки возвращаемого значения.

Спасибо всем за помощь!
Второй раз пытаюсь использовать ИТЗ, и на грабли наступаю. Первый раз таки ошибка была при свертке, а теперь сам наглючил...
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #6 - 08. Февраля 2007 :: 16:20
Печать  
Да, похоже, что здесь нарисовался баг.

Есть запрос
Код
Выбрать все
	ТекстSQL = "SELECT
     |Скидки.ID As [Скидка $Справочник.СхемыДисконтирования],
     |$Скидки.Ставка As Ставка,
     |Факторы.ID AS [Фактор $Справочник.УсловияСкидки],
     |trim($Факторы.ЗначениеФактора) AS Значение
     |FROM
     |$Справочник.СхемыДисконтирования As Скидки
     |LEFT OUTER JOIN $Справочник.СхемыДисконтирования As ГруппыСкидок ON Скидки.PARENTID = ГруппыСкидок.ID
     |LEFT OUTER JOIN $Справочник.СхемыДисконтирования As Схемы ON ГруппыСкидок.PARENTID = Схемы.ID
     |LEFT OUTER JOIN $Справочник.УсловияСкидки As Факторы ON Скидки.ID = Факторы.PARENTEXT
     |WHERE
     |Скидки.ISFOLDER = 2
     |AND
     |(Схемы.CODE = '10002' OR ГруппыСкидок.CODE = '10002')
     |";
 


Выгружаем запрос в таблицу и добавляем индекс
Код
Выбрать все
РезультатЗапроса = Запрос.ВыполнитьИнструкцию(ТекстSQL);

Условия = СоздатьОбъект("ИндексированнаяТаблица");
Условия.Загрузить(РезультатЗапроса);
Условия.ДобавитьИндекс("КлючСоставной"	, "*Скидка, *Фактор, #Значение");
 


далее поиск по ключу, в котором поле "Значение" заполняем сами нужной строкой, например, "2010"

И получается баг - невозможно найти нужную строку, хотя она точно есть.
« Последняя редакция: 09. Февраля 2007 :: 05:54 - artbear »  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #7 - 08. Февраля 2007 :: 16:24
Печать  
Поспешил, однако, с выводами.
Не находит по составному ключу значение.

Измененная тестовая конфигурация в архиве.
  

TestDB_3.rar ( 59 KB | Загрузки )
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #8 - 09. Февраля 2007 :: 05:58
Печать  
Короче, в ИТЗ ошибки нет.
Ошибка у тебя в алгоритме Улыбка
У тебя Фактор - это элементы справочника "УсловияСкидки", подчиненного спр СхемыДисконтирования.
А в справочнике "УсловияСкидки" куча элементов с разными ID, но одинаковыми названиями.
Поэтому поиск ничего не находит, потому что ищет по ID, а не по названию.
Поменяй алгоритм и все будет ок.

ЗЫ для проверки убери группировку в тзГруппы и выполни такой же поиск в цикле, все будет ок, хотя бы один раз значение будет найдено.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #9 - 09. Февраля 2007 :: 09:18
Печать  
Таки да, ошибка в алгоритме. Спасибо!

Сбила меня с толку группировка:
Код
Выбрать все
итзГруппы.Группировать("Скидка: *Скидка; Фактор: *Фактор", ""); 


По колонке "Фактор" группирует по наименованию, а не по ID?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированная таблица, НайтиСтроку()...
Ответ #10 - 09. Февраля 2007 :: 11:30
Печать  
nvg писал(а) 09. Февраля 2007 :: 09:18:
Таки да, ошибка в алгоритме. Спасибо!

Сбила меня с толку группировка:
Код
Выбрать все
итзГруппы.Группировать("Скидка: *Скидка; Фактор: *Фактор", ""); 


По колонке "Фактор" группирует по наименованию, а не по ID?

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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать