Форум: "Базы";
Текущий архив: 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
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.31;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c