Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.11 c
15-1176806589
икс-игрик-й
2007-04-17 14:43
2007.05.20
Помогите решить задачки по физике(кто решит отблагодарю)


1-1174561093
Димыч
2007-03-22 13:58
2007.05.20
ScrollBar в Treeview


15-1177055145
pavel_guzhanov
2007-04-20 11:45
2007.05.20
Недавно я спрашивал про глюки у DVD-RW


2-1178260166
allucard
2007-05-04 10:29
2007.05.20
Как при печати разбить форму на две страницы.


3-1172908676
Бабенко Олег
2007-03-03 10:57
2007.05.20
Перевод базы формата Firebird 2.0 в Firebird 1.5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский