Форум: "Базы";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
ВнизКак упаковать таблицу в делфе? Найти похожие ветки
← →
Oxy (2003-01-15 19:40) [0]Собственно subj.
Как упаковать таблицу в делфе? C помощью чего это можно сделать?
← →
Anatoly Podgoretsky (2003-01-15 20:07) [1]dbiPackTable
← →
Oxy (2003-01-15 20:12) [2]А что это такое?
← →
Anatoly Podgoretsky (2003-01-15 20:36) [3]Это функция БДЕ
← →
gsu (2003-01-15 20:41) [4]из Rx:
procedure PackTable(Table: TTable);
{ This routine copied and modified from demo unit TableEnh.pas
from Borland Int. }
var
{ FCurProp holds information about the structure of the table }
FCurProp: CurProps;
{ Specific information about the table structure, indexes, etc. }
TblDesc: CRTblDesc;
{ Uses as a handle to the database }
hDb: hDbiDB;
{ Path to the currently opened table }
TablePath: array[0..dbiMaxPathLen] of Char;
Exclusive: Boolean;
begin
if not Table.Active then _DBError(SDataSetClosed);
Check(DbiGetCursorProps(Table.Handle, FCurProp));
if StrComp(FCurProp.szTableType, szParadox) = 0 then begin
{ Call DbiDoRestructure procedure if PARADOX table }
hDb := nil;
{ Initialize the table descriptor }
FillChar(TblDesc, SizeOf(CRTblDesc), 0);
with TblDesc do begin
{ Place the table name in descriptor }
StrPCopy(szTblName, Table.TableName);
{ Place the table type in descriptor }
StrCopy(szTblType, FCurProp.szTableType);
bPack := True;
bProtected := FCurProp.bProtected;
end;
{ Get the current table"s directory. This is why the table MUST be
opened until now }
Check(DbiGetDirectory(Table.DBHandle, False, TablePath));
{ Close the table }
Table.Close;
try
{ NOW: since the DbiDoRestructure call needs a valid DB handle BUT the
table cannot be opened, call DbiOpenDatabase to get a valid handle.
Setting TTable.Active = False does not give you a valid handle }
Check(DbiOpenDatabase(nil, szCFGDBSTANDARD, dbiReadWrite, dbiOpenExcl, nil,
0, nil, nil, hDb));
{ Set the table"s directory to the old directory }
Check(DbiSetDirectory(hDb, TablePath));
{ Pack the PARADOX table }
Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));
{ Close the temporary database handle }
Check(DbiCloseDatabase(hDb));
finally
{ Re-Open the table }
Table.Open;
end;
end
else if StrComp(FCurProp.szTableType, szDBase) = 0 then begin
{ Call DbiPackTable procedure if dBase table }
Exclusive := Table.Exclusive;
Table.Close;
try
Table.Exclusive := True;
Table.Open;
try
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, nil, True));
finally
Table.Close;
end;
finally
Table.Exclusive := Exclusive;
Table.Open;
end;
end
else DbiError(DBIERR_WRONGDRVTYPE);
end;
← →
Anatoly Podgoretsky (2003-01-15 20:48) [5]Так у него наверно хелп есть или ты так плохо о нем думаешь, что он не в состоянии им пользоваться?
← →
gsu (2003-01-15 20:54) [6]>> Anatoly Podgoretsky ©
да ничего я о нем не думаю: умный, глупый ? какая разница - просто помог, вдруг человек хороший. Получилось али нет - не мне решать.
(-:|~
← →
Дмитрий К.К. (2003-01-16 06:31) [7]
> Anatoly Podgoretsky © (15.01.03 20:48)
Если чел на ответ "dbiPackTable" задает вопрос "А что это такое?", есть основания полагать, что хэлпом пользоваться он не умеет, поетому ему нужно все разжевать до детали, шо и сделал gsu.
← →
Oxy (2003-01-16 09:51) [8]Спасибо всем за ответы. Хелпом я умею пользоваться, но опыта работы с БД у меня очень мало.
Довольно долго я искал в каком модуле находится ф-ция dbiPackTable, а потом разбирался как она работает. Ж-))
В этом плане ф-ция PackTable из Rx намного удобнее.
← →
Pat (2003-01-16 15:23) [9]>if not Table.Active then _DBError(SDataSetClosed);
Undeclared identifier: "_DBError"
:-((
Хелп....
← →
gsu (2003-01-16 15:44) [10]Замени на DatabaseError
← →
Pat (2003-01-16 18:07) [11]Теперь та же проблема с SDataSetClosed :-))))
Я тут подглядел у Тейксейры упаковку таблицы Paradox
procedure PackTable(Table: TTable);
var TblDesc: CrTblDesc;
TempDBHandle:HDBIDb;
WasActive:boolean;
begin
FillChar(TblDesc, SizeOf(TblDesc),0);
with TblDesc do
begin
StrPCopy(szTblName, Table.TableName);
strPCopy(szTblType, szPARADOX);
bPack:=true;
end;
WasActive:=Table.active;
if WasActive then Table.close;
try
Check(dbiOpenDatabase(PChar(Table.DatabaseName),nil,dbiREADWRITE,
dbiOpenExcl,nil,0,nil,nil,TempDBHandle));
try
Check(dbiDoRestructure(TempDBHandle,1,@TblDesc,nil,nil,nil,false));
finally
dbiCloseDatabase(TempDBHandle);
end;
finally
Table.Active:=WasActive;
end;
end;
Не совсем работает. Есть у меня две таблицы Master и Detail. После упаковки прога виснет. Конкретно - не открывает Master-таблицу. И вообще как нужно упаковывать Главные и подчиненные таблицы. Плюс еще для главной есть фильтр...
← →
gsu (2003-01-16 18:17) [12]SDataSetClosed = "Cannot perform this operation on a closed dataset"
или что угодно;
← →
Pat (2003-01-16 18:25) [13]>gsu © (16.01.03 18:17)
Спасибо за быстрые ответы :-))
А как надо упаковывать связанные таблицы, таблицы с фильтрами? Нужно ли потом заново задавать фильтр?
← →
Anatoly Podgoretsky (2003-01-16 18:58) [14]gsu © (15.01.03 20:54)
Дмитрий К.К. © (16.01.03 06:31)
Тем более - ему надо все равно идти в хелп, что бы посмотреть примечания, а текст примера он там, при желании скопирует.
Голый пример, без комментариев, да к тому же стандартный не многого стоит, а точнее только лишняя нагрузка на форум, а у многих плата идет за трафик.
Вот кусок кода именно из рабочей программы, специально адоптированный под dBase (Д5)
procedure TFaqListForm.msPackClick(Sender: TObject);
begin
DM.Table.Close;
DM.Table.Exclusive := TRUE;
DM.Table.Open;
Check(DbiPackTable(DM.Table.DBHandle, DM.Table.Handle, nil, nil, True));
DM.Table.Close;
DM.Table.Exclusive := FALSE;
DM.Table.Open;
end;
← →
gsu (2003-01-16 19:04) [15]>> Anatoly Podgoretsky ©
это что улыбка мастера ?
та же проца из Rx, только урезанная и без учета исключений
← →
gsu (2003-01-16 19:08) [16]>> Pat ©
Перед паковкой закрой все связанные таблицы и причем тут фильтры ?
← →
Serginio (2003-01-16 19:17) [17]Интересно зачем вызывать Try Check если можно все по возвращаемому значению определить и не мучится. Ну а если не OK и нужно передать пользователю исключение тогда Check без Try
← →
Anatoly Podgoretsky (2003-01-16 19:28) [18]Anatoly Podgoretsky © (16.01.03 18:58)
Не знаю как там в Rx может и также, но что то мне подсказывает врядли.
В данный пример желательно добавить try finally end блок.
← →
Anatoly Podgoretsky (2003-01-16 19:38) [19]Serginio (16.01.03 19:17)
Try нужен для другой цели, что бы вернуть таблицу в исходное состоянии, для этого желательно сохранить это состоянии. В данном примере, поскольку в программе предопределенное состоянии.
Таблица открыта в не монопольном режиме.
← →
gsu (2003-01-16 19:40) [20]>> Anatoly Podgoretsky ©
>> Не знаю как там в Rx
см, gsu © (15.01.03 20:41), взял 1:1 для экономии времени
← →
Serginio (2003-01-16 19:41) [21]procedure TFaqListForm.msPackClick(Sender: TObject);
Var res:Integer;
begin
DM.Table.Close;
DM.Table.Exclusive := TRUE;
DM.Table.Open;
Res:=DbiPackTable(DM.Table.DBHandle, DM.Table.Handle, nil, nil, True);
DM.Table.Close;
DM.Table.Exclusive := FALSE;
DM.Table.Open;
If res<>0 Then Check(res)
end;
← →
Pat (2003-01-16 21:53) [22]>gsu © (16.01.03 19:08)
Так вот, она, млин, при открытии потом глючит.. :-((
← →
Pat (2003-01-17 01:07) [23]Все, разобрался...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c