Главная страница
    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.005 c
1-70802
dlK
2002-07-09 11:36
2002.07.22
Процесс сервиса занимает 99% процессорног времени.


1-70744
race1
2002-07-06 16:53
2002.07.22
inifile


1-70781
eruc
2002-07-09 22:10
2002.07.22
ListBox1


7-70947
Ник
2002-04-30 12:34
2002.07.22
2 Delphi на одном компьютере


3-70597
Fox_Home
2002-06-28 04:46
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский