:: Visual Foxpro, Foxpro for DOS
слетает индекс
taty_2014

Сообщений: 4
Дата регистрации: 12.05.2014
Всем привет! ребят, подскажите пожалуйста. пришлось работать с чужой программой, но возникла проблема. создаю индекс таблицы, а он постоянно слетает. хотя если создам его через фокс все норм, а программно летит.в этой программе в некоторых формах стоит Data Environment, может из за этого, но я с этим никогда не работала, поэтому не знаю может быть в этом причина или нет.Может кто сталкивался с такой ситуацией!?



Исправлено 1 раз(а). Последнее : taty_2014, 19.11.18 12:37
Ratings: 0 negative/0 positive
Re: слетает индекс
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
taty_2014
создаю индекс таблицы, а он постоянно слетает. хотя если создам его через фокс
А к чему относится первое слово цитаты?
Цитата:
все норм, а программно летит.в этой программе в некоторых формах стоит Dana Environment, может из за этого, но я с этим никогда не работала, поэтому не знаю может быть в этом причина или нет.Может кто сталкивался с такой ситуацией!?
С какой ТАКОЙ? Кто на ком стоял?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: слетает индекс
taty_2014

Сообщений: 4
Дата регистрации: 12.05.2014
с такой, когда индекс постоянно слетает!
Ratings: 0 negative/0 positive
Re: слетает индекс
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
taty_2014
Может кто сталкивался с такой ситуацией

Вероятность очень мала. Обычно подобное уникально.

А вообще - надо смотреть по коду, возможно где-то эта таблица просто переоткрывается без индекса. Т.е. поискать все команды USE с именем данной таблицы.
И что понимается под "индекс постоянно слетает"? Что индекс отключается? Или просто становится не активным?
Также надо бы уточнить, какой конкретно используется индекс - простой или составной? Т.е. IDX или CDX?
Т.е. как-то конкретней формулировать саму проблему.
Ну и почему нельзя, открыв базы данных в среде разработки - просто посмотреть, привязаны ли к данной таблице какие-то другие индексы.
И есть ли необходимость использования той же самой таблицы для каких-то своих целей? Может быть использовать вместо нее курсор/таблицу-выборку?

И действительно, как понимать "все норм" в начале? ;) В смысле: "проблемы нет"?

Т.е. желательно приводить фрагменты своего кода. Для лучшей его читаемости лучше при этом использовать тэги "CODE" - выделив свой введенный код и нажав эту кнопку наверху окошка ввода.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 19.11.18 13:20
Ratings: 0 negative/0 positive
Re: слетает индекс
Penner

Сообщений: 4102
Откуда: Muenster
Дата регистрации: 26.04.2002
еще возможно в самой прогремме где-то есть программное пересоздание индексов


------------------
Никогда не откладывайте на завтра, то, о чем можно забыть навсегда
Ratings: 0 negative/0 positive
Re: слетает индекс
Alsim

Сообщений: 3636
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Когда мне приходилось работать с данными чужих программ (метод "приставных стульчиков"), я никогда не создавал там свои индексы (поскольку лучше не трогать чужое, пусть работает себе как работало), а просто делал запрос к чужой таблице в курсор, а уж дальше делал с ним всё что хотел
Предполагаю, что Вам также захочется и что-то своё в чужую таблицу положить. Тогда кладём по тем правилам структуры, и не умничаем
Ratings: 0 negative/1 positive
Re: слетает индекс
taty_2014

Сообщений: 4
Дата регистрации: 12.05.2014
Таблица создается таким образом:

IF NOT FILE('G:\...\PVNB150.DBF')
SELECT 0
USE G:\...\PVN150.DBF
COPY STRUCTURE TO G:\...\PVNB150.DBF
USE
ENDIF
А затем мне нужно создать к PVNB150.DBF индексы:

IF NOT FILE('G:/.../PVNB150.cdx')
SELECT 0
USE G:/.../PVNB150.dbf
INDEX on sch+stip+sbi+DTOC(d) TAG SDS OF G:/.../PVNB150.cdx ADDITIVE
INDEX on ch+tip+bi+DTOC(d) TAG DSE OF G:/.../PVNB150.cdx ADDITIVE
INDEX on DTOC(d)+sch+stip+sbi TAG DAT OF G:/.../PVNB150.cdx ADDITIVE
USE
ENDIF

SELECT C
USE G:/.../PVNB150 alias 'pvnb' SHARED
SET ORDER TO SDS

А при вводе записи выскакивает ошибка: "Ошибка при построении ключа для индекса G:/.../PVNB150.cdx тег SDS ".
длина всех полей максимум 90 получается, то есть за пределы возможного вроде бы не выходит!



Исправлено 1 раз(а). Последнее : taty_2014, 20.11.18 09:46
Ratings: 0 negative/0 positive
Re: слетает индекс
taty_2014

Сообщений: 4
Дата регистрации: 12.05.2014
Все, проблема решилась: DTOC(d,1) оказывается нужно.
Ratings: 0 negative/0 positive
Re: слетает индекс
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Во-первых, как я выше уже замечал, для удобочитаемости текст кода следует обрамлять тэгами CODE - открывающим и закрывающим, либо просто выделив текст и нажав кнопку CODE в меню над окошком ввода.

taty_2014
Все, проблема решилась: DTOC(d,1) оказывается нужно.
...
Ну тогда все дальнейшее не нужно.
...
Разве что все-таки замечу, что обычно через sql-выборку все же проще делать подобные вещи.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 4 раз(а). Последнее : Crispy, 20.11.18 10:13
Ratings: 0 negative/0 positive
Re: слетает индекс
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Пока вижу 2 возможных источника ошибки:
1. Указание имени индексного cdx в команде Index создает неструктурированный индекс. Чтобы его затем использовать, надо принудительно указывать имя индексного файла. Если же при в команде Index имя индексного файла не указывать, будет создан структурированный индекс в файле cdx, имя которого совпадает с именем файла dbf. Additive для структурированных индексов указывать не обязательно. То есть попробуйте так:
USE G:/.../PVNB150.dbf
INDEX on sch+stip+sbi+DTOC(d) TAG SDS
INDEX on ch+tip+bi+DTOC(d) TAG DSE
INDEX on DTOC(d)+sch+stip+sbi TAG DAT
USE
2. Не уверен, но вроде при некоторых Set Collate длина индекса ограничена 50 символами.

...

А, проблема уже решена...



Исправлено 1 раз(а). Последнее : ry, 20.11.18 10:17
Ratings: 0 negative/1 positive
Re: слетает индекс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
taty_2014
Все, проблема решилась: DTOC(d,1) оказывается нужно.
DTOS() то же самое даёт, но чуть короче и понятнее. А так - вполне логично что при разных настройках SET DATE/SET CENT будет полная каша в том что делаает DTOC() с одной и той же датой.
OF G:/.../PVNB150.cdx ADDITIVE
Лишнее. Читать про структурные индексные файлы.
И хотелось бы верить что в реальной программе не указаны полные пути с буквами дисков прямо в исходном коде

В cdx все теги будут в "компактном" формате, поэтому при COLLATE=MACHINE максимальный размер ключа составит 240 символов, а при других COLLATE 120.

ry
но вроде при некоторых Set Collate длина индекса ограничена 50 символами.
Нет, COLLATE может учитываться лишь в компактном индексе, а значит минимальный размер ключа будет 120 символов (ну если не учитывать что потенциально 1 байт скушает признак NULL-а, если индексное выражение в принципе может обращаться в NULL - тогда 119 символов останётсяна сам ключ).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: слетает индекс
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Igor Korolyov
taty_2014
Все, проблема решилась: DTOC(d,1) оказывается нужно.
DTOS() то же самое даёт, но чуть короче и понятнее. А так - вполне логично что при разных настройках SET DATE/SET CENT будет полная каша в том что делаает DTOC() с одной и той же датой.
OF G:/.../PVNB150.cdx ADDITIVE
Лишнее. Читать про структурные индексные файлы.
И хотелось бы верить что в реальной программе не указаны полные пути с буквами дисков прямо в исходном коде

В cdx все теги будут в "компактном" формате, поэтому при COLLATE=MACHINE максимальный размер ключа составит 240 символов, а при других COLLATE 120.

ry
но вроде при некоторых Set Collate длина индекса ограничена 50 символами.
Нет, COLLATE может учитываться лишь в компактном индексе, а значит минимальный размер ключа будет 120 символов (ну если не учитывать что потенциально 1 байт скушает признак NULL-а, если индексное выражение в принципе может обращаться в NULL - тогда 119 символов останётсяна сам ключ).

При SET COLLATE язык, действительно сокращаятся длина индекного значения до 50, как в СМС0ках, до 70. Никто же не расчитывал, что кроме англов будут использоват систему программирования )
Ratings: 0 negative/0 positive
Re: слетает индекс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
При SET COLLATE язык, действительно сокращаятся длина индекного значения до 50, как в СМС0ках, до 70. Никто же не расчитывал, что кроме англов будут использоват систему программирования )
До 120-ти (или 119). Читай внимательно хелп. "Visual FoxPro System Capacities" там всё есть. Правда, похоже, самого оригинального хелпа уже онлайн и нету...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: слетает индекс
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Игорь, я веть, как все люди, сначала сам получаю ограничения (фокс в этом благосклонен - сообщает). И от того же е..к фоксу, и вам желаю, чтобы вы удачно отладились))
Ratings: 0 negative/0 positive
Re: слетает индекс
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Спрашивающий мтк, доолжен набрать наши нещастные команды... Или просто отпистеться сделать работу )

Игорь, про методологию сравнений строк в редиме COLLATE я все знаю, и ты знаешь больше. Я живу в коллате RUSIAN? и буду за это держатся )

Доб. Туплю



Исправлено 2 раз(а). Последнее : of63, 23.11.18 00:18
Ratings: 0 negative/0 positive


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

On-line: 32 vlgrech  (Гостей: 31)

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