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

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

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


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

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Несколько индексов для временного файла
 
Здравствуйте!
Для временной таблицы создаю несколько индексов.
Проверяю ключевое выражение с помощью indexkey().
Программа упорно "видит" ключевое выражение только
для последнего индекса DOC_2

Private aDbf,Path_1
dbpush()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
aDbf:={}
AADD(aDbf, { "Grup", "C", 5, 0 })
AADD(aDbf, { "Nnum", "C",13, 0 })
AADD(aDbf, { "Code", "C", 5, 0 })
AADD(aDbf, { "Name", "C",40, 0 })
AADD(aDbf, { "EAN_13", "C",13, 0 })
AADD(aDbf, { "EAN_13_p", "C",13, 0 })
AADD(aDbf, { "NUMDOC", "C", 6, 0 })
AADD(aDbf, { "NUMDOCP", "C", 15, 0 })
AADD(aDbf, { "NUMDOC_P", "C", 50, 0 })
AADD(aDbf, { "DATE", "D", 10, 0 })
AADD(aDbf, { "Kol", "N", 10, 0 })
Path_1:=GlobalTmpPath+'alko_kol.dbf'
DBCREATE(Path_1, aDbf)
NETUSE('ALKO_KOL',Path_1)
altd()
dbpush('ALKO_KOL')
ALKO_KOL->(dbcreateindex(GlobalTmpPath+"DOC_EAN13","upper(NUMDOCP+EAN_13)"))
ALKO_KOL->(ORDSETFOCUS("DOC_EAN13"))
sayandwait("DOC_EAN13"+" "+ALKO_KOL->(indexkey()))
// dbpop()
// dbpush('ALKO_KOL')
ALKO_KOL->(dbcreateindex(GlobalTmpPath+"DOC_1","upper(NUMDOCP+NUMDOC_p+EAN_13+EAN_13_p)"))
ALKO_KOL->(ORDSETFOCUS("DOC_1"))
sayandwait("DOC_1"+" "+ALKO_KOL->(indexkey()))
// dbpop()
// dbpush('ALKO_KOL')
ALKO_KOL->(dbcreateindex(GlobalTmpPath+"DOC_2","upper(NUMDOC_p,50)"))
ALKO_KOL->(ORDSETFOCUS("DOC_2"))
sayandwait("DOC_2"+" "+ALKO_KOL->(indexkey()))
dbpop()


ALKO_KOL->(ORDSETFOCUS("DOC_EAN13"))
sayandwait("DOC_EAN13"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ORDSETFOCUS("DOC_1"))
sayandwait("DOC_1"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ORDSETFOCUS("DOC_2"))
sayandwait("DOC_2"+" "+ALKO_KOL->(indexkey()))

ALKO_KOL ->( DbCloseArea())
FERASE(Path_1)
RestSetKey(aSetKey)
RestSet(aSet)
DBPOP()

Т.е. код выглядеть должен как-то по другому?
Заранее спасибо.Габов Алексей.
 
Вот пример как это делаю я.
Код
  select tmpbase
  dbcreateindex(cIndexName1:=tempfile(,'idx'), 'dtos(date)+upper(saloonname+left(docfio,25))')  // 1 индекс
  dbcreateindex(cIndexName2:=tempfile(,'idx'), 'upper(saloonname+left(docfio,25))')             // 2 индекс
  dbcreateindex(tempfile(,'idx'), 'upper(left(docfio,25)+saloonname)')                          // 3 индекс (остаётся открытым)
  dbsetindex(cIndexName2) // открываем индекс 2
  dbsetindex(cIndexName1) // открываем индекс 1

  dbsetorder(3)     // установить индекс 3 (соответственно нужная цифра для нужного индекса)
Изменено: Алексей Новиков - 10.01.2010 12:27:17
С уважением, Новиков Алексей.
 
Я Вам рекомендую со своей стороны пользоваться функцией ORDCREATE
Это уже далеко не первая полдобная тема
ОБразец текста

Цитата
Select tmp
ORDCREATE(,"tmp","Upper(grup+nnum+mlname)+Str(cena)",{||Upper(grup+nnum+mlname)+Str(cena)},.T.)
ORDCREATE(,"tmc","Upper(lentatov)",{||Upper(lentatov)})
 
Здравствуйте!
Спасибо всем ,помогло.
Если вставить в программу команды ,на которые указал Алексей Новиков
Цитата
Алексей Новиков пишет:
Вот пример как это делаю я.
dbsetindex(cIndexName2) // открываем индекс 2
dbsetindex(cIndexName1) // открываем индекс 1

перед кодом :
Цитата

ALKO_KOL->(ORDSETFOCUS("DOC_EAN13"))
sayandwait("DOC_EAN13"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ORDSETFOCUS("DOC_1"))
sayandwait("DOC_1"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ORDSETFOCUS("DOC_2"))
sayandwait("DOC_2"+" "+ALKO_KOL->(indexkey()))

то все работает без каких либо дополнительных изменений!!!

А в вот с командой ORDCREATE не совсем Хорошо все получается.
Индекс становиться доступным только после применении команды dbsetindex

Цитата

Private aDbf,Path_1
dbpush()
aSet:=SaveSet()
aSetKey:=SaveSetKey()
aDbf:={}
AADD(aDbf, { "Grup", "C", 5, 0 })
AADD(aDbf, { "Nnum", "C",13, 0 })
AADD(aDbf, { "Code", "C", 5, 0 })
AADD(aDbf, { "Name", "C",40, 0 })
AADD(aDbf, { "EAN_13", "C",13, 0 })
AADD(aDbf, { "EAN_13_p", "C",13, 0 })
AADD(aDbf, { "NUMDOC", "C", 6, 0 })
AADD(aDbf, { "NUMDOCP", "C", 15, 0 })
AADD(aDbf, { "NUMDOC_P", "C", 50, 0 })
AADD(aDbf, { "DATE", "D", 10, 0 })
AADD(aDbf, { "Kol", "N", 10, 0 })
Path_1:=GlobalTmpPath+'alko_kol.dbf'
DBCREATE(Path_1, aDbf)
NETUSE('ALKO_KOL',Path_1)
altd()
dbpush('ALKO_KOL')
ALKO_KOL->(ordcreate('ALKO_KOL',GlobalTmpPath+"DOC_EAN13","upper(NUMDOCP+EAN_13)"))
dbsetindex("DOC_EAN13")
ALKO_KOL->(ORDSETFOCUS("DOC_EAN13"))
sayandwait("DOC_EAN13"+" "+ALKO_KOL->(indexkey()))

ALKO_KOL->(ordcreate('ALKO_KOL',GlobalTmpPath+"DOC_1","upper(NUMDOCP+NUMDOC_p+EAN_13+EAN_13_p)"))
dbsetindex("DOC_1")
ALKO_KOL->(ORDSETFOCUS("DOC_1"))
sayandwait("DOC_1"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ordcreate('ALKO_KOL',GlobalTmpPath+"DOC_2","upper(NUMDOC_p,50)"))
dbsetindex("DOC_2")
ALKO_KOL->(ORDSETFOCUS("DOC_2"))
sayandwait("DOC_2"+" "+ALKO_KOL->(indexkey()))
dbpop()

dbsetindex("DOC_EAN13")
dbsetindex("DOC_1")
dbsetindex("DOC_2")

ALKO_KOL->(ORDSETFOCUS("DOC_EAN13"))
sayandwait("DOC_EAN13"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ORDSETFOCUS("DOC_1"))
sayandwait("DOC_1"+" "+ALKO_KOL->(indexkey()))
ALKO_KOL->(ORDSETFOCUS("DOC_2"))
sayandwait("DOC_2"+" "+ALKO_KOL->(indexkey()))

ALKO_KOL ->( DbCloseArea())
FERASE(Path_1)
RestSetKey(aSetKey)
RestSet(aSet)
DBPOP()


Т.е. я опять что-то не так делаю?
И еще пара вопросов.
1. В каких случаях надо применять функцию ORDSETFOCUS и в каких dbsetorder. Или это все равно.В справочнике по программированию функцию dbsetorder применили с нечисловым параметром ,т.е.mkart->(DBSETORDER("mprice")).
Такое применение тоже допустимо?
2. В каких случаях функция dbcreateindex не будет работать и почеиу ее надо заменять на ordcreate().
3. Какую практическую пользу дает указание в функции ordcreate кодового
блока,т.е что это дает?
Заранее спасибо. Алексей Габов.
Изменено: gabov - 16.01.2010 15:49:41
 
Алексей и те и другие функции работать будут....
Дело в том, что функции, которые начинаются со слова ORD появились в клиппере позже.
Т.е. когда он начал работать с cdx стандартом...и потребовались индексные файлы с несколькими тегами.
Сейчас в БЭСТе мы на самомо деле работаем в харборе и судя по всему эти функции идентичны (после переработки создателями харбора) - на мой взгляд по краней мере.

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