Форум: "Базы";
Текущий архив: 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.005 c