:: Visual Foxpro, Foxpro for DOS
Индекс
rusl

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Создаю структурный индекс для таблицы.
IF FILE ('NormalTab.DBF')
IF USED('NormalTab')
SELECT NormalTab
ELSE
USE NormalTab IN 0
ENDIF
ELSE
CREATE TABLE NormalTab (Word C(50), NormalForm C(50))
INDEX ON Word TAG Word
SET ORDER TO tag Word
ENDIF

Чтобы потом использовать его в:
Select NormalTab
Set Order To Tag Word
Set Exact On
Seek (lcWord)
If Found()
lcWord=NormalTab.NormalForm
ENDIF

Но на строке Set Order To Tag Word (если таблица с индексом не создается заново, а используется уже созданная (то есть 'NormalTab.DBF' уже существует)) Фокс ругаясь говорит: Table has no index order set. (26).

Видно при открытии таблицы он не открыл индекс. Но разве такое может быть если индекс составной?



Отредактировано (03.04.05 17:42)


------------------
Ratings: 0 negative/0 positive
Re: Индекс
Aries

Сообщений: 4349
Откуда: Николаев
Дата регистрации: 24.12.2002
Естественно! Ты открыл таблицу, не открыл индекс. Надо так
IF FILE ('NormalTab.DBF')
IF USED('NormalTab')
SELECT NormalTab
ELSE
USE NormalTab IN 0 ORDER TAG Word
ENDIF
ELSE
CREATE TABLE NormalTab (Word C(50), NormalForm C(50))
INDEX ON Word TAG Word
SET ORDER TO tag Word
ENDIF




------------------
Я бы переписал жизнь, но Бог не дает мне исходники (с)
==============================
Злостный линуксоид!
Ratings: 0 negative/0 positive
Re: Индекс
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Цитата:
Естественно! Ты открыл таблицу, не открыл индекс. Надо так
Нет, проблема не в этом. Он же создает структурный индексный файл, который должен открываться автоматически с открытием таблицы.

Скорее всего, у него проблема в выборе текущей директории. Есть сильное подозрение, что он создает и открывает разные таблицы. Т.е. команда USE дается для одной таблицы, а CREATE TABLE - создает таблицу в другой директории.

Или опять что-то намулрил с алиасами. Например, открыл какую-нибудь другую таблицу с алиасом NormalTab.
Ratings: 0 negative/0 positive
Re: Индекс
rusl

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Владимир, Вы кажется правы. Потому что даже когда она запускается (то есть в цикле IF.. ENDIF срабатывает ELSE и создается новая таблица) процедура работает, но ничего в NormalTab не сохраняет. Таблица остается пустой.

Но я же создаю таблицу один раз и у нее не должно быть дубликатов.

Function content_to_freq
Cd h:\fox\dproject\worktab\
cd_worktables='h:\fox\dproject\worktab\'
SET SAFETY OFF
IF FILE ('DATAPRO.DBC')
OPEN DATABASE DATAPRO
ELSE
CREATE DATABASE cd_worktables+'DATADPRO'
ENDIF
IF FILE ('WordID.DBF')
IF USED('WordID')
SELECT WordID
ELSE
USE WordID IN 0
ENDIF
ELSE
Create Table WordID (WordForm C(50), Word_ID I)
INDEX ON WordForm TAG WordForm
SET ORDER TO tag WordForm
ENDIF
IF FILE ('NormalTab.DBF')
IF USED('NormalTab')
SELECT NormalTab
ELSE
USE NormalTab IN 0
ENDIF
ELSE
CREATE TABLE NormalTab (Word C(50), NormalForm C(50))
INDEX ON Word TAG Word
Set Order To Tag Word
ENDIF
...
...
...
DO freq_count WITH lcSiteCatalog, lnI, lns, lcCursorName1, cd_worktables, laFile[m.lnI,1], lnk, lnIdw
...
...


PROCEDURE freq_count
LPARAMETERS lcSiteCatalog, lnI, lns, lcCursorName1, cd_worktables, laFile, lnk, lnIdw, lnA
Local min_count_words, lnIdw, lnC
#Define min_count_words 21
lcFileStr=Filetostr(m.lcSiteCatalog+laFile)
lcFileStr=Chrtran(lcFileStr,Chr(13)+Chr(10),Space(2))
lnCountOfWords=Getwordcount(lcFileStr)
If lnCountOfWords < min_count_words
Loop
Else
lnk=lnk +1
lnC= lnk +lnS
Select (TableNameID)
Append Blank
Replace FileName With laFile
Replace FileNameID With lnC
Replace CountOfW With lnCountOfWords
Select (m.lcCursorName1)
For m.lnA=1 To (lnCountOfWords)
lcWord=Lower(Getwordnum(lcFileStr, m.lnA))
lcWord=Alltrim(Chrtran(lcWord, Chrtran(lcWord, 'qwertyuiopasdfghjklzxcvbnm', ''), ''))
Select NormalTab
Set Order To Tag Word
Set Exact On
Seek (lcWord)
If Found()
lcWord=NormalTab.NormalForm
Else
Do dos_normalizator With lcWord, cd_worktables
ENDIF
...


Может есть какие то хитрости при переходе от одной процедуры к другой?
Ratings: 0 negative/0 positive
Re: Индекс
rusl

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Про не сохранение в NormalTab кажется погаречился. Вставил в цикл FLUSH и стал сохранять. Но с индексом все равно проблема.
Ratings: 0 negative/0 positive
Re: Индекс
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Это все слишком сложно. "Надо быть проще, и народ к тебе потянется" (с)

Имею в виду, что нет смысла проверять каждую таблицу. Вообще не вижу смысла во всех этих "навротах". Ты либо создаешь базу данных целиком, либо используешь ранее созданную базу данных. А делать проверку на каждую таблицу - просто бессмысленно. Т.е. общая логика должна быть примерно такая:

CLOSE DATABASES ALL
IF FILE ('DATAPRO.DBC')
* Открываем базу данных и таблицы
ELSE
* Создаем заново базу данных и все таблицы
ENDIF

Контроль факта существования таблиц не имеет смысла ни в одном из вариантов.

Если база данных существует, то пути доступа к таблицам прописаны в самой базе данных. Просто открываем таблицы не задумываясь о том, где они лежат и лежат ли вообще.

Если базы данных НЕ существует, то, разумеется, нет и таблиц, ее составляющих. Просто создаем безо всякого контроля их существования.
Ratings: 0 negative/0 positive
Re: Индекс
rusl

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
О! Убрал "навороты" и заработало

Скажите Владимир, а если у меня две БД. Могу я из одной БД обратится к таблице другой БД или есть какие то сложности?
Ratings: 0 negative/0 positive
Re: Индекс
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi rusl!

Цитата:
Могу я из одной БД обратится к таблице другой БД или есть какие то
сложности?
Что значит "из БД"? Фокс не обращается "ИЗ БД" - он обращается из контекста
некоторой программы (метода/формы и т.п.) - и нету никаких проблем в том,
чтобы открыть 2, 3, ... 100 БД и обращаться к их таблицам. Да, если БД имеют
одинаковые имена, то сложно не запутаться в них - SET DATABASE TO
полный_путь_к_БД\Имя_БД.dbc + USE SomeTable помогут конечно, но это слишком
сложно IMHO.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Индекс
rusl

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
То есть если открыто две БД я могу открывать во всех процедурах программы любую таблицу из этих баз?
Ratings: 0 negative/0 positive
Re: Индекс
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi rusl!

Да. Впрочем даже если БД НЕ открыта, ты можешь открывать её таблицы (БД откроется автоматически). Просто для "текущей" БД не обязательно указывать пути...




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика