![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dbf-файлы [D7, WinXP]
alyona © (2007-03-21 14:59:00)Здравствуйте всем!
Прошу помочь в решении следующей проблемы. Есть 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 17:00:00) [1]+ ко всему
1) нет ли ошибок при FileWrite?
2) если это разовая операция - не проще ли воспользоваться database desktop из дельфи?
clickmaker (2007-03-21 16:51:00) [2]кстати, а зачем два экземпляра структуры?
Почему нельзя в прочитанной просто поля поменять нужные? И ее же обратно и вернуть
alyona (2007-03-21 16:47:00) [3]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:34:00) [4]Ну а смысл этого?
FieldDescriptor.WokrAreaID:= FieldDescriptor.WokrAreaID;
и в отладчике если посмотреть - правильно структура прочиталась?
Elen (2007-03-21 16:32:00) [5]
> Требуется изменить структуру этого файла
Ну вообще то это из Sql делается (alter table) например через ADO, а [0] это не лучший выход.
alyona (2007-03-21 16:29:00) [6]попробовала 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));
...
не помогло...
clickmaker (2007-03-21 16:01:00) [7]
> [2] alyona © (21.03.07 15:52)
при работе с файлами лучше
TFieldDescriptor=packed record
и почему читаешь FieldDescriptor, а в качестве источника FieldDescriptorMod?
alyona (2007-03-21 15:52:00) [8]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 15:38:00) [9]
> alyona © (21.03.07 14:59)
ну первое, что приходит в голову - неверное смещение, либо формат структуры.
FieldDescriptorMod.FieldName - string? array of char?