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

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

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


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Проблема с пользовательскими индексами.

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Проблема с пользовательскими индексами.
 
Здравствуйте уважаемые коллеги.
Проявилась такая проблема, я добавил несколько пользовательских полей в Partner.dbf и сделал 6 индексов к ним прописав в Bases_03.dbf, так что общее число индексов стало 52. Мои модули при зтом работают исправно но вот при формировании накладной Торг12 fastreport выдает ошибку - Partner:Error 7200:.... Maximum tag expected ..... Я удалил 2 индекса и ошибка пропала, но они мне нужны, подскажите что нибудь.
 
Цитата
Сергей Иваницкий пишет:
Здравствуйте уважаемые коллеги.

Проявилась такая проблема, я добавил несколько пользовательских полей в Partner.dbf и сделал 6 индексов к ним прописав в Bases_03.dbf, так что общее число индексов стало 52. Мои модули при зтом работают исправно но вот при формировании накладной Торг12 fastreport выдает ошибку - Partner:Error 7200:.... Maximum tag expected ..... Я удалил 2 индекса и ошибка пропала, но они мне нужны, подскажите что нибудь.


Добрый день!
Видимо, слишком много индексных выражений...
Быть может лучше сделать для Вашей задачи отдельную таблицу, связав ее с Partner.dbf. Попробуйте еще расположить индексы не в bases_03.dbf, а в bases_00.dbf.
 
В последнее время, все больше сколняюсь к мнению, что при решении задач плагинами и модулями следует как можно меньше вторгаться в системную часть. Есть каталог USER, в нем формируем свое дерево в котором располагаем базы и индексы.
Так будет потом понятнее, да и транспортабельнее решения получаются.
Конечно же, это сильно повлияет на программный код.
Но избавит от головных болей в дальнейшем.
С уважением,
Ильин Евгений
 
Не правильно написал, я прописал свои индексы на Partner.dbf в bases_00.dbf.
Может это какие-то ограничения fastreport или advantage?
В таблице Partner.dbf родных 46 индексов при чем последних 12 появились не так давно, то есть у разработчика осталось всего 4, и ещё имеются абсолютно одинаковые индексы с разными названиями "CODE" и "FullCode", "Name" и "FullName". А можно сделать временный индекс с исключениями типа !Empty(Dop1)?
 
Цитата
Сергей Иваницкий пишет:
Не правильно написал, я прописал свои индексы на Partner.dbf в bases_00.dbf.

Может это какие-то ограничения fastreport или advantage?

В таблице Partner.dbf родных 46 индексов при чем последних 12 появились не так давно, то есть у разработчика осталось всего 4, и ещё имеются абсолютно одинаковые индексы с разными названиями "CODE" и "FullCode", "Name" и "FullName". А можно сделать временный индекс с исключениями типа !Empty(Dop1)?

Не такие уж они и одинаковые, особенно если посмотреть на FOR-условия :lol:
Если количество партнеров не очень велико, попробуйте обычный фильтр.
 
Да не посмотрел, тогда может временные индексы типа ordsetfocus только не знаю как там исключения сделать и как его включить вместо родного.
 
перепутал типа ordcreate()
 
Цитата
itman пишет:
В последнее время, все больше сколняюсь к мнению, что при решении задач плагинами и модулями следует как можно меньше вторгаться в системную часть. Есть каталог USER, в нем формируем свое дерево в котором располагаем базы и индексы.
Так будет потом понятнее, да и транспортабельнее решения получаются.
Конечно же, это сильно повлияет на программный код.
Но избавит от головных болей в дальнейшем.

Евгений я с Вами абсолютно согласен но разговор про БЭСТ-4.
Там нет папки User
 
Цитата
Сергей Иваницкий пишет:
перепутал типа ordcreate()

Сергей тут дело такое:
Насколько я понял Вы индексы создавали для того, чтобы они уже были на момент формирования печатной формы.
Если же Вы всякий раз перед печатью их будете создавать, то:
1.Вы будете ждать реиндексацию
2.Если своими индексами подменить штатный, то означает еще и ждать реиндексацию таблицы после печатной формы...

Я попросил Сан Саныча подключиться к разговору, чтобы понимать есть такое ограничение и можни ли его обойти. По его ответам я понял, что Сан Саныч предлагает искать другие пути.
А это значит:
1.Нужно иметь вспмогательную таблицу по партнерам.
2.Индексы к этой таблице Вы можете прописать туда же в bases_00
3.В печатной форме настроить селекты к этой таблице...
 
Нет эффект с печатными формами возник как побочный, я добавил пару индексов в bases_00, переиндексировал и тут выяснилось, что при печати объект TfrADSQuery ругается. На счет ожидания, я пишу отдельный модуль для учета транспортных расходов и при открытии готов подождать, раз не получается иначе.
 
Цитата
Сергей Иваницкий пишет:
На счет ожидания, я пишу отдельный модуль для учета транспортных расходов и при открытии готов подождать, раз не получается иначе.

Вероятно Вы меня не правильно поняли.
Речь не идет о каких-то изменениях в штатном БЭСТе которые надо ждать.
речь идет о том, что пользовательский всякий раз будет сидеть ждать построение индексов, прежде чем печатная форма откроется: т.е. построение формы с существенной задержкой....

Тут речь идет о том, что Вам надо свое решение пересматривать на предмет убирания индексов к таблице partner.dbf
 
Да понял то я правильно. Только то, что вы предлагаете крайне не удобно, и потом что будет делать разработчик если ему понадобится добавить в Partner ещё 5 индексов?
Все таки можно использовать Drdcreate(), что бы создать новый файл .cdx и потом использовать созданный индексный файл вместо штатного?
 
Цитата
Сергей Иваницкий пишет:
Да понял то я правильно. Только то, что вы предлагаете крайне не удобно, и потом что будет делать разработчик если ему понадобится добавить в Partner ещё 5 индексов

Разработчик в БЭСТ-4 не будет индексы добавлять.
Последние то несколько были скорее как исключение добавлены.

Цитата
Сергей Иваницкий пишет:
Все таки можно использовать Drdcreate(), что бы создать новый файл .cdx и потом использовать созданный индексный файл вместо штатного

Попробуйте, только вам всякий раз его надо будет строить....
Это намного хуже, чем то, что Вам предлагалось
 
Спасибо за Внимание сделал временный индекс (слегка переделал пример), но вот Вопрос как вернуть штатный индекс после завершения программы?
вот функция которая у меня получилась:
Код
Function MkTempIndex(cNtxKey,cForKey,cNameTag)
// Создание временных индексов
// все параметры - массивы
// Количество тэгов определяется по 1 параметру
// cNtxKey - ключ для индекса, cForKey - исключения, cNameTag - имя тэга
//
// FUNCTION: FormulParsBlock(cFormul, aPars)
// Назначение.........Преобразование строки символов в блок кода
// cFormul - преобразуемая строка
// aPars - массив параметров для блока кода
//
 Local I, aIndex, nPoz
 Local cNameNtx := TempFile(m->GlobalTmpPath,'CDX')
 If ValType(cNtxKey)='A' .And. ValType(cForKey)='A' .And. ValType(cNameTag)='A' .And. Len(cNtxKey)=Len(cForKey) .And. Len(cNtxKey)=Len(cNameTag)
// Взято из примера
   If (nPoz := AScan(aIndex := BsSaveIndex(),{|cNameIdx| Upper(cNameIdx) == Upper(cNameNtx) })) != 0
     ADel(aIndex,nPoz)
     ASize(aIndex,Len(aIndex)-1)
     BsClearIndex()
     BsRestIndex(aIndex)
   EndIf
   FErase(cNameNtx)
   DbGoTop()
// Взято из примера
   For I:=1 To Len(cNtxKey)
// Исключения
     If !Empty(cForKey[I])
       ordCondSet(cForKey[I],FormulParsBlock(cForKey[I],{""}),NIL,,,1,RecNo(),,,.T.,,.F.,,.T., .F., .F., .T., .F., .F.)
     EndIf
// делаем индекс
     ordCreate(cNameNtx, Iif( Empty(cNameTag[I]), "TMP_TAG"+AllTrim(Str(I)), cNameTag[I]),cNtxKey[I],FormulParsBlock(cNtxKey[I],{""}))
   Next
   ORDSETFOCUS(Iif(Empty(cNameTag[1]), "TMP_TAG"+AllTrim(Str(I)), cNameTag[1]))
   DbGoTop()
   ReopenDbf()
 Else
   SayAndWait('в MkTempIndex()  Не массив!')
 EndIf
 Return cNameNtx

 
в строке
Код
ORDSETFOCUS(Iif(Empty(cNameTag[1]), "TMP_TAG"+AllTrim(Str(I)), cNameTag[1])) 

исправил на
Код
ORDSETFOCUS(Iif(Empty(cNameTag[1]), "TMP_TAG"+AllTrim(Str(1)), cNameTag[1])) 
 
Написал вот такой код вроде работает.
Код
Function RstTempIndex(cNameNtx,aBaseName)
// Удаление временного индекса
// cNameNtx-имя индексного файла, aBaseName - имя алиаса
// если имя алиаса не указано, то для поиска используется текущий активный алиас
 Local I, aIndex, nPoz , A
 A:=Select()
If !(aBaseName == Nil)
 Select Select(aBaseName)
Endif
 If (nPoz := AScan(aIndex := BsSaveIndex(),{|cNameIdx| Upper(cNameIdx) == Upper(cNameNtx) })) != 0
   ADel(aIndex,nPoz)
   ASize(aIndex,Len(aIndex)-1)
   BsClearIndex()
   BsRestIndex(aIndex)
 EndIf
 FErase(cNameNtx)
 ORDSETFOCUS(1)
 DbGoTop()
 ReopenDbf()
 Select A
 Return .T.
 
Жаль, что ограничение в 50 индексов не получается обойти.
Тему можно закрыть.
Спасибо всем.
Страницы: 1
Читают тему (гостей: 1)