![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBIDORESTRUCTURE - как вставить числовое поле в DBF- файл? [D3, D5, dBase, FoxPro]
Fishka © (2002-06-25 15:19:00)Помогите найти пример использования функции DBIDORESTRUCTURE для вставки числового поля размерностью, например 9.3 между, допустим 5 и 6 полями файла.
В примере, приведенном в BDE, не могу разобраться.
Lusha (2002-06-28 12:55:00) [1]>Fishka (28.06.02 12:42)
Повторяю ничего не надо менять... Вызов AddField(Table1,2,"p3", ftBCD, 3, 9) как раз и является правильным... Потому и работает... Читайте справку в разделе TField.Size...
Fishka (2002-06-28 12:42:00) [2]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:25:00) [3]>Fishka (28.06.02 11:57)
Да нет там никакой опечатки... Так и должно быть... Сие есть особенность BCD полей... :)
Fishka (2002-06-28 11:57:00) [4]Мне подумалось, что насчет завтра (Lusha © (25.06.02 15:37)) - шутка. Ваш кусок работает (видимо, очепятка iUnits1 := Precision;iUnits2 := Size; - лучше поменять местами).
Спасибо.
Lusha (2002-06-27 10:59:00) [5]>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-26 16:09:00) [6]Завтра не наступит никогда ...
Lusha (2002-06-25 15:37:00) [7]>Fishka (25.06.02 15:19)
Гы-гы... Ладно, завтра сделаем... :)