Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
2-1177592173
sadasd
2007-04-26 16:56
2007.05.20
TClientSocket


8-1157439275
ников
2006-09-05 10:54
2007.05.20
скорость мультипликации


9-1150914786
Угадай кто?
2006-06-21 22:33
2007.05.20
Отражение?


2-1177593211
ppcumax
2007-04-26 17:13
2007.05.20
IP адрес


15-1177074037
Сергей М.
2007-04-20 17:00
2007.05.20
Фокс-геморрой