Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо