Главная страница
    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.043 c
2-1177583759
гость_2007
2007-04-26 14:35
2007.05.20
MySQL


2-1178113619
FireWind
2007-05-02 17:46
2007.05.20
Подсчет строк в гриде.


2-1178200691
RomanLN
2007-05-03 17:58
2007.05.20
Как присвоить цвет Edit программно


15-1176757770
ArtemESC
2007-04-17 01:09
2007.05.20
PHP


4-1166124336
Shico
2006-12-14 22:25
2007.05.20
работа с выводами com порта





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