Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Вниз

потерялся индекс в фоксе, как быть? 


Olivka   (2001-12-13 15:28) [0]

Господа! помогите разобраться! есть база данных, созданная в foxPro для дос или win, которая при обработке в программе моих коллег индексируется(потом индекс удаляется, но сами понимаете в FoxPro это дело неоднозначно:) и в результате то ли файл индекса теряется, то ли портится, то ли еще что, но когда я загружаю эту базу в программу получаются чудеса - то LangDriver не устанавливается, то пишет -неправильных индекс, то еще что. Приходится открывать эту базу в FoxPro, делать "Ignore" на вопрос об индексах (то, что индекс запорчен, или файл отсутствует), а он дописывает после этого что-то в базу, что она становиться нормальной, а затем спокойно можно открывать ее в моей программе и все ОК. Так вот, нельзя ли этот "Ignore" сделать программно, и не в фоксе, а в Дельфи?
Благо моя программа с вашей помощью становится уже просто совершенной, осталась вот эта вроде бы мелочь (чтоб все предусмотреть, не скажешь же заказчикам, обладающим комплексом наших программ, что им еще и фокс нужен! На всякий случай:))) вот :) и скажут, что все наши программы ... ну сами знаете, а ведь это не так!)
С уважением!



DmitryA   (2001-12-15 17:48) [1]

Hi, Olivka!

Дело в том, что индексные файлы MDX и CDX являются связанными с соответствующими файлами DBF (т.е. у DBF присутствует признак наличия его индексного файла, если этот признак убрать, то файл откроется без проблем). Попробуйте договориться со своими FoxPro-товарищами, что индексы будет генерировать Ваша программа.

Best regards!



Olivka   (2001-12-17 09:41) [2]

Мое замечание о загадочности FoxPro касалось того, что индексы, создаваемые в их программах в их же программах и удаляются после использования, но на деле - остаются! :) что же мне с этой особенностью FoxPro делать? :))) Надо заметить, что в этом языке это неудивительно, потому что там много подобных глюков.



DmitryA   (2001-12-17 15:47) [3]

Не понял смысла "удаляются после использования, но на деле - остаются". Как это? Зачем удалять?!!



Olivka   (2001-12-17 18:33) [4]

Дело в том, что если в программе на фоксе оставить индексы в базе, даже если файл индекса mdx или cdx, кажется , сохранился - все равно дельфи не воспримет этот файл как нужный ей и будет считать, что в базе какая-то ошибка. Для этого я и прошу в программе на foxPro эти индексы удалять - что-то типа delete all index (не знаю точно команды). ТАк она - то срабатывает, то нет - и программист тут не причем. А мне нужен универсальный способ удаления этого индекса (фокспрошного) из программы на дельфи. Вот. :)



Гоша   (2001-12-17 18:46) [5]

>Olivka:
"не скажешь же заказчикам, обладающим комплексом наших программ, что им еще и фокс нужен! На всякий случай:))) вот :) и скажут, что все наши программы ... ну сами знаете, а ведь это не так!)"
Честно говоря, на месте ваших заказчиков я бы так и сказал...
Скажите, а зачем вам далась DELPHI, если формат данных у вас FoxPro, какие-то программы пишутся на FoxPro, что-то делается на DELPHI, а чтобы все это работало, вы хотите каждый раз создавать/удалять индексы...
Ей-бо, я бы на их месте точно послал...



DmitryA   (2001-12-17 19:12) [6]

Вот универсальный способ удаления индекса (MDX, и кажется CDX тоже): нужно взять описание DBF формата 3-й версии, почитать, и написать процедурку удаления индексного файла (CDX) и корректировки заголовка файла данных (DBF).



DmitryA   (2001-12-18 16:28) [7]

Кстати - на этом же сайте, по-моему в кладовке есть описание формата DBF-файла 3 версии. А можно поискать на Yahoo и Rambler...



Olivka   (2001-12-18 22:06) [8]

Гоша > У нас хм... не коммерческое предприятие, раз, во вторых я базу имею, а в основном у меня работа идет с Surfer и Word-Excel, два , и интерфейс пользователя большое значение имеет, три. А в четвертых - можете сами попробовать написать все это на фоксе, который к тому же еще и не выпускают. А в пятых - я не собираюсь тут всю жизнь работать, со знанием foxPro далеко не уйдешь, от него противно веет... затхлостью какой-то (ну это ИМХО, только для меня)
Дмитрию > а попробую, спасибо, чем черт не шутит, может получится?



Гоша   (2001-12-19 10:34) [9]

>Olivka: Милая Olivka (я не ошибся?), пожалуйста, не обижайтесь, я совсем не хотел Вас обидеть. Как Вам делать Ваши продукты - это исключительно Ваше дело. Но просто исходя из житейской логики не согласитесь ли Вы, что действительно несколько странно делать часть прогр. продукта на FoxPro, а часть на DELPHI и каждый раз при запуске создавать/удалять индексы у таблиц - IMHO это вряд ли благотворно скажется на производительности...

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

PS: я не знаю будущее FoxPro, знаю о недостатках этой среды для написания клиентского интерфейса, но по моему глубокому убеждению в средствах доступа к данным и их обработке среда DELPHI c ее BDE, ADO и компонентами не дотягивает до уровня, предоставляемого FoxPro.
С уважением.



DmitryA   (2001-12-20 18:29) [10]

Ну, ребята! Вы меня просту умилили!!!

Зачем с черто-то шутить? Вот исходники. Можно попробовать, хотя реально они выглядят несколько иначе (я их рихтовал уже в IN Browser"е). Но должно работать!..

TDBFHeader = record
abBuffer0: array[0..7] of byte;
wHeaderLength: word;
abBuffer1: array[0..17] of byte;
bMDX: byte;
abBuffer2: array[0..2] of byte;
end;

TDBFDesc = record
abBuffer0: array[0..30] of byte;
bMDX: byte;
end;

function DropIndexes(const DBFFileName: string): boolean;
var Header: TDBFHeader;
Desc: TDBFDesc;
iHandle, iDescCount, iDesc: integer;
sFileName: string;
begin
Result := true;

// Кооректируем заголовок
sFileName := DBFFileName + ".DBF";
iHandle := FileOpen(sFileName, fmOpenReadWrite or fmShareDenyNone);
if iHandle = -1 then
begin
Result := false;
exit;
end;

FileRead(iHandle, Header, 32);

Header.bMDX := 0;

FileSeek(iHandle, 0, fsSET);
FileWrite(iHandle, Header, 32);

iDescCount := (Header.wHeaderLength - 33) div 32;
for iDesc := 1 to iDescCount do
begin
FileRead(iHandle, Desc, 32);

Desc.bMDX := 0;

Application.ProcessMessages();

FileSeek(iHandle, iDesc * 32 , fsSET);
FileWrite(iHandle, Desc, 32);
end;

FileClose(iHandle);

// Удаляем индекс, если есть
sFileName := DBFFileName + ".MDX";
if FileExists(sFileName) then SysUtils.DeleteFile(sFileName);
end;

И еще.

Olivka! Если у Вас проблемы, пишитя прямо на мой e-mail: dmitry@lintec.net.ua




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.022 c
1-99928           MARcoDEN              2002-01-09 20:53  2002.01.31  
Delphi 6


4-100098          Evgeniy_S             2001-11-28 16:13  2002.01.31  
THREADS !!!


6-100029          Alex_Sudakov          2001-11-01 11:56  2002.01.31  
Дурацкий вопрос...:)


3-99924           EternalWonderer       2001-12-29 09:32  2002.01.31  
Проблема с представлением дробных чисел Oracle


4-100116          Miwa                  2001-11-30 16:25  2002.01.31  
Вывод сообщения