Главная страница
    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.046 c
3-1173160550
Sansy
2007-03-06 08:55
2007.05.20
Сохранение отчёта в поток для FastReport


15-1176804812
Kolan
2007-04-17 14:13
2007.05.20
А что это с rsdn — негрузится че-то&#133


2-1176888703
allucard
2007-04-18 13:31
2007.05.20
Как добавить в ListView компонент ComboBox?


2-1178357756
Marat
2007-05-05 13:35
2007.05.20
Непонятки в QReport


2-1178265430
Abcdef123
2007-05-04 11:57
2007.05.20
Есть ли в Делфи функция, которая...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский