Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];

Вниз

DBIDORESTRUCTURE - как вставить числовое поле в DBF- файл?   Найти похожие ветки 

 
Fishka   (2002-06-25 15:19) [0]

Помогите найти пример использования функции DBIDORESTRUCTURE для вставки числового поля размерностью, например 9.3 между, допустим 5 и 6 полями файла.
В примере, приведенном в BDE, не могу разобраться.


 
Lusha   (2002-06-25 15:37) [1]

>Fishka (25.06.02 15:19)
Гы-гы... Ладно, завтра сделаем... :)


 
Fishka   (2002-06-26 16:09) [2]

Завтра не наступит никогда ...


 
Lusha   (2002-06-27 10:59) [3]

>Fishka (26.06.02 16:09)
Если это шутка, то почему без смайлика? А если серьезно, то Вы батенька исключительный нахал...

Следующая процедура добавляет в таблицу Table поле с именем fName и типом fType с порядковым номером fIndex в списке полей...

Внимание: Проверка на корректность значения fIndex в теле процедуры отсутствует

procedure AddField(Table : TTable; fIndex : Integer; fName : string; fType : TFieldType; fSize, fPrecision : Word);
const
TableTypeNames : array [TTableType] of PChar = (szPARADOX, szPARADOX, szDBASE, szFoxpro, szASCII);
var TblDesc : CRTblDesc;
Database : TDatabase;
FieldDescs: TFieldDescList;
ValDescs : VCHKDesc;
ValOpType : CROpType;

procedure EncodeFieldDesc(iNum : Integer; var FieldDesc: FLDDesc; const Name: string; DataType: TFieldType; Size: Word; Precision : Word);
begin
with FieldDesc do
begin
AnsiToNative(Table.DBLocale, Name, szName, SizeOf(szName) - 1);
iFldType := FldTypeMap[DataType];
iSubType := FldSubTypeMap[DataType];
iFldNum := iNum;
case DataType of
ftString, ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
ftParadoxOle, ftDBaseOle, ftTypedBinary:
iUnits1 := Size;
ftBCD:
begin
iUnits1 := Precision;
iUnits2 := Size;
end;
end;
end;
end;

procedure InitFieldDescriptors;
var
I: Integer;
TempDescs: TFieldDescList;
begin
Table.Open;
with TblDesc do
try
iFldCount := Table.FieldDefs.Count + 1; //We are going to add one field
SetLength(FieldDescs, iFldCount);
for I := 0 to Table.FieldDefs.Count - 1 do
with Table, FieldDefs[I] do
EncodeFieldDesc(I + 1, FieldDescs[I + 1], Name, DataType, Size, Precision);
Move(FieldDescs[1], FieldDescs[0], SizeOf(FLDDesc) * fIndex);
EncodeFieldDesc(0, FieldDescs[fIndex], fName, fType, fSize, fPrecision); //Added field initialization
SetLength(TempDescs, iFldCount);
pFldDesc := BDE.PFLDDesc(TempDescs);
Check(DbiTranslateRecordStructure(nil, iFldCount, BDE.PFLDDesc(FieldDescs),
TableTypeNames[Table.TableType], nil, pFLDDesc, False));
finally
Table.Close;
end;
end;

procedure InitOperationTypes;
var J : Integer;
F : pCROpType;
begin
TblDesc.pecrFldOp := AllocMem(SizeOf(CROpType) * TblDesc.iFldCount);
F := TblDesc.pecrFldOp;
for J := 0 to TblDesc.iFldCount - 1 do
begin
if J <> fIndex then F^ := crNoop
else F^ := crAdd;
inc(F);
end;
end;

begin
Table.DisableControls;
Database := Table.OpenDatabase;
with TblDesc do
try
if Database.IsSQLBased then
raise Exception.Create("Изменение структуры SQL таблиц не предусмотрено.");
FillChar(TblDesc, SizeOf(CRTblDesc), 0);
StrPCopy(TblDesc.szTblName, Table.TableName);
InitFieldDescriptors;
InitOperationTypes;
FillChar(ValDescs, SizeOf(VCHKDesc), 0);
Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil, nil, nil, False));
finally
if TblDesc.pecrFldOp <> nil then FreeMem(TblDesc.pecrFldOp);
Table.CloseDatabase(Database);
Table.EnableControls;
end;
end;


 
Fishka   (2002-06-28 11:57) [4]

Мне подумалось, что насчет завтра (Lusha © (25.06.02 15:37)) - шутка. Ваш кусок работает (видимо, очепятка iUnits1 := Precision;iUnits2 := Size; - лучше поменять местами).
Спасибо.


 
Lusha   (2002-06-28 12:25) [5]

>Fishka (28.06.02 11:57)
Да нет там никакой опечатки... Так и должно быть... Сие есть особенность BCD полей... :)


 
Fishka   (2002-06-28 12:42) [6]

Lusha © (28.06.02 12:25)
А у меня поле в таблицу не добавляется, если пишу так:
AddField(Table1,2,"p3", ftBCD, 9, 3);
а если так:
AddField(Table1,2,"p3", ftBCD, 3, 9);
то все нормально.

А если в программе поменять значения переменных iUnits1, iUnits2, то можно написать, как в 1-м случае.


 
Lusha   (2002-06-28 12:55) [7]

>Fishka (28.06.02 12:42)
Повторяю ничего не надо менять... Вызов AddField(Table1,2,"p3", ftBCD, 3, 9) как раз и является правильным... Потому и работает... Читайте справку в разделе TField.Size...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.022 c
3-70674
_dron_
2002-07-02 16:11
2002.07.22
Фильтрация в ADODataSet


1-70799
Пастор
2002-07-05 08:57
2002.07.22
Реестр или ini ?


1-70788
EugenCFG
2002-07-10 10:46
2002.07.22
Здраствуйте ещё раз...


3-70590
dimanew
2002-06-27 09:24
2002.07.22
Подскажите как в IB создать генератор, котоый при добавлении


14-70860
Chak
2002-06-23 21:15
2002.07.22
Иконка у компонента!





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