Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Внизdbf-файлы Найти похожие ветки
← →
alyona © (2007-03-21 14:59) [0]Здравствуйте всем!
Прошу помочь в решении следующей проблемы. Есть dbf-файлЮ сформированный при помощи компонента QExsport3SQL. Требуется изменить структуру этого файла (тип и размер некоторых полей). После отработки программы файл остается без изменений. Подскажите, пожалуйста, в чем моя ошибка?
Вот фрагмент кода:
...
DBFName := "C:\DBF\Av\ORG03";
CurrentPos := 192;
hFile := FileOpen("C:\DBF\Av\ORG03",fmOpenReadWrite);
with DBFHeader do
begin
FileSeek(hFile,192,0);
FileRead(hFile,FieldDescriptor,SizeOf(TFieldDescriptor));
FieldDescriptorMod.FieldName:= FieldDescriptorMod.FieldName;
FieldDescriptorMod.FieldType:= "N";
FieldDescriptorMod.OffsetOfBeingRecord:= FieldDescriptorMod.OffsetOfBeingRecord;
FieldDescriptorMod.FieldLength:= 15;
FieldDescriptorMod.DecimalCont:= 4;
FieldDescriptorMod.ReservedOne:= FieldDescriptorMod.ReservedOne;
FieldDescriptorMod.WokrAreaID:= FieldDescriptorMod.WokrAreaID;
FieldDescriptorMod.MultyUserDBase:= FieldDescriptorMod.MultyUserDBase;
FieldDescriptorMod.SetFields:= FieldDescriptorMod.SetFields;
FieldDescriptorMod.ReservedTwo:= FieldDescriptorMod.ReservedTwo;
FieldDescriptorMod.MDXIndex:= FieldDescriptorMod.MDXIndex;
FileSeek(hFile,192,0);
FileWrite(hFile,FieldDescriptorMod,SizeOf(TFielddescriptor));
end;
FileClose(hFile);
Может быть, кто-нибудь подскажет другое решение?
Спасибо.
← →
clickmaker © (2007-03-21 15:38) [1]
> alyona © (21.03.07 14:59)
ну первое, что приходит в голову - неверное смещение, либо формат структуры.
FieldDescriptorMod.FieldName - string? array of char?
← →
alyona © (2007-03-21 15:52) [2]to clickmaker
type
TFieldDescriptor=record
FieldName: array[1..11] of Char;
FieldType: Char;
OffsetOfBeingRecord: array[1..4] of byte;
FieldLength: byte;
DecimalCont: byte;
ReservedOne: array[1..2] of byte;
WokrAreaID: byte;
MultyUserDBase: array[1..2] of byte;
SetFields: byte;
ReservedTwo: array[1..7] of byte;
MDXIndex: byte;
end;
.....
private
{ Private declarations }
DBFName: string;
CurrentPos: integer;
FieldDescriptor, FieldDescriptorMod: TFieldDescriptor;
hFile: integer;
DBFHeader:TDBFHeader;
← →
clickmaker © (2007-03-21 16:01) [3]
> [2] alyona © (21.03.07 15:52)
при работе с файлами лучше
TFieldDescriptor=packed record
и почему читаешь FieldDescriptor, а в качестве источника FieldDescriptorMod?
← →
alyona © (2007-03-21 16:29) [4]попробовала TFieldDescriptor=packed record
исправила
DBFName := "C:\DBF\Av\ORG03";
CurrentPos := 192;
hFile := FileOpen("C:\DBF\Av\ORG03",fmOpenReadWrite);
with DBFHeader do
begin
FileSeek(hFile,192,0);
FileRead(hFile,FieldDescriptor,SizeOf(TFieldDescriptor)); FieldDescriptor.FieldName:= FieldDescriptor.FieldName;
FieldDescriptor.FieldType:= "N";
FieldDescriptor.OffsetOfBeingRecord:= FieldDescriptor.OffsetOfBeingRecord;
FieldDescriptor.FieldLength:= 15;
FieldDescriptor.DecimalCont:= 4;
FieldDescriptor.ReservedOne:= FieldDescriptor.ReservedOne;
FieldDescriptor.WokrAreaID:= FieldDescriptor.WokrAreaID;
FieldDescriptor.MultyUserDBase:= FieldDescriptor.MultyUserDBase;
FieldDescriptor.SetFields:= FieldDescriptor.SetFields;
FieldDescriptor.ReservedTwo:= FieldDescriptor.ReservedTwo;
FieldDescriptor.MDXIndex:= FieldDescriptor.MDXIndex;
FileSeek(hFile,192,0);
FileWrite(hFile,FieldDescriptor,SizeOf(TFielddescriptor));
...
не помогло...
← →
Elen © (2007-03-21 16:32) [5]
> Требуется изменить структуру этого файла
Ну вообще то это из Sql делается (alter table) например через ADO, а [0] это не лучший выход.
← →
clickmaker © (2007-03-21 16:34) [6]Ну а смысл этого?
FieldDescriptor.WokrAreaID:= FieldDescriptor.WokrAreaID;
и в отладчике если посмотреть - правильно структура прочиталась?
← →
alyona © (2007-03-21 16:47) [7]to clickmaker:
Извините, не то. Вот:
DBFName := "C:\DBF\Av\ORG04";
CurrentPos := 96;
hFile := FileOpen("C:\DBF\Av\ORG04",fmOpenReadWrite);
with DBFHeader do
begin
FileSeek(hFile,CurrentPos,0);
FileRead(hFile,FieldDescriptor,SizeOf(TFieldDescriptor));
FieldDescriptorMod.FieldName:= FieldDescriptor.FieldName;
FieldDescriptorMod.FieldType:= "N";
FieldDescriptorMod.OffsetOfBeingRecord:= FieldDescriptor.OffsetOfBeingRecord;
FieldDescriptorMod.FieldLength:= 15;
FieldDescriptorMod.DecimalCont:= 4;
FieldDescriptorMod.ReservedOne:= FieldDescriptor.ReservedOne;
FieldDescriptorMod.WokrAreaID:= FieldDescriptor.WokrAreaID;
FieldDescriptorMod.MultyUserDBase:= FieldDescriptor.MultyUserDBase;
FieldDescriptorMod.SetFields:= FieldDescriptor.SetFields;
FieldDescriptorMod.ReservedTwo:= FieldDescriptor.ReservedTwo;
FieldDescriptorMod.MDXIndex:= FieldDescriptor.MDXIndex;
FileSeek(hFile,CurrentPos,0);
FileWrite(hFile,FieldDescriptorMod,SizeOf(TFielddescriptor));
end;
FileClose(hFile);
.....
Да, структура прочиталась...
← →
clickmaker © (2007-03-21 16:51) [8]кстати, а зачем два экземпляра структуры?
Почему нельзя в прочитанной просто поля поменять нужные? И ее же обратно и вернуть
← →
clickmaker © (2007-03-21 17:00) [9]+ ко всему
1) нет ли ошибок при FileWrite?
2) если это разовая операция - не проще ли воспользоваться database desktop из дельфи?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c