BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Определение уровня в STRUCT
 
Здравствуйте уважаемые разработчики.
Существует следующая проблема: есть ID_struct 3-го уровня в БД (например kadry_ordmove), используя это значение необходимо найти, в базе STRUCT, имя подразделения-родителя 1-го уровня (LVL=1).
Пробовали использовать условие для поиска между LFT и RGT, в большинстве случаев проходит, но в некоторых отказывается работать.
Подскажите пожалуйста, как можно задать условие?
 
А чем Вам не нравится ID_parent ?
 
Цитата
nordk пишет:
А чем Вам не нравится ID_parent ?

Тем, что ID_PARENT третьего уровня ссылается на второй уровень (возникает рекурсия), а хотелось бы сразу на первый уровень шагнуть.
 
for i to struct->lvl-1
struct->(dbseek(struct->parent_id))
next

А для сразу на первый надо просить ID корня класть в поле подразделения.
В принципе Вы можете это добавить сами и небольшим плагином заполнить этот ID.
Подразделения не та таблица, которая ежедневно подлежит изменениям.
 
Спасибо, но базу со структурой править не нужно, только получить данные нужно.
В итоге получилось так:
Код
u_struct->(DbGoTop())
u_struct->(OrdSetfocus("TAG_ID"))
u_struct->(__DbLocate({|| u_struct->id_struct=CodePodr}))
//получаем коды текущего подразделения
p_Lft:=u_struct->lft
p_Rgt:=u_struct->rgt
//ищем коды подразделения первого уровня
u_struct->(OrdSetfocus("TAG_LFT"))
u_struct->(__DbLocate({|| (u_struct->lft<=p_Lft .and. u_struct->rgt>=p_Rgt .and. u_struct->lvl=1)}))
//считываем код и наименование подразделения-родителя
u_test->code:=u_struct->id_struct
u_test->shortname:=u_struct->shortname

Длинный код с двумя обходами, время обработки плагина увеличилось. Может есть у кого идеи, как упростить?
 
Думается мне DBLOCATE не самый лучший способ и мой вариант должен работать намного бысстрее
 
Цитата
nordk пишет:
мой вариант должен работать намного бысстрее

Конечно, Ваш вариант очень простой и использует seek, так что скорость налицо.
А как быть, если требуется (имея ID_STRUCT подразделения допустим пятого уровня) определить его родителя первого уровня?
 
А там же по циклу бежит
Он просто сделает 4 раза Seek :)
 
nordk, тогда задача по определению верхнего уровня будет выглядеть так?
Код
//получаем из struct данные о родителе
My_id_struct_N_Level:=Ordmove->id_struct
Struct->(dbSeek(Struct->id_struct=My_id_struct_N_Level)
My_id_parent:=Struct->Id_parent
// вставляем цикл с полученным id_parent
for i to struct->lvl-1
struct->(dbseek(struct->parent_id=My_id_parent))
next 
// выводим в переменную
My_id_struct_1_Level:=struct->id_struct
 
Цитата
ОАО КРССУ пишет:
dbseek(struct->parent_id=My_id_parent)


Вот здесь Вы пишете совершенно не то !!!
Почитайте внимательно про DBSEEK()
Сюда надо класть значение для поиска по индексному ключу
А вы кладете логическое значение которое будет либо .T. либо .F.
Скорее всего такая конструкция работать не будет. Надо именно как я Вам написал.
Там все очень просто
Вы делаете поиск по значению parent_id текущей строки
Она ссылается на строку уровнем выше и по SEEK она перейдет на ту строку.
В той строке значение будет ссылкой на следующий уровень.
Т.е. Вам надо по сути:
1, найти нужную строку по ссылке из kadry_ordmove
В найденной строке определяете на сколько уровней надо подняться и делаете SEEK по id_parent
строки на которой стоите.
И больше ничего выдумывать не требуется
 
Получилось вот так:
Код
cFile5:=B6_DBF_PATH+"struct.dbf"
NetUse("u_struct",  cFile5)

u_struct->(OrdSetfocus("TAG_ID"))
u_struct->(dbSeek(NAL14_X->ID_STRUCT))

for i:=0 to u_struct->lvl-1
  u_struct->(dbseek(u_struct->id_parent))
next 

MessageBox(u_struct->shortname)
u_struct->(DBCLOSEAREA())

nordk, спасибо большое. Действительно способ отличный, время на обработку плагина заметно уменьшилось.
Страницы: 1
Читают тему (гостей: 1)