![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как упаковать таблицу в делфе? [D5, dBase, FoxPro]
Oxy © (2003-01-15 19:40:00)Собственно subj.
Как упаковать таблицу в делфе? C помощью чего это можно сделать?
Pat (2003-01-17 01:07:00) [1]Все, разобрался...
Pat (2003-01-16 21:53:00) [2]>gsu © (16.01.03 19:08)
Так вот, она, млин, при открытии потом глючит.. :-((
Serginio (2003-01-16 19:41:00) [3]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;
gsu (2003-01-16 19:40:00) [4]>> Anatoly Podgoretsky ©
>> Не знаю как там в Rx
см, gsu © (15.01.03 20:41), взял 1:1 для экономии времени
Anatoly Podgoretsky (2003-01-16 19:38:00) [5]Serginio (16.01.03 19:17)
Try нужен для другой цели, что бы вернуть таблицу в исходное состоянии, для этого желательно сохранить это состоянии. В данном примере, поскольку в программе предопределенное состоянии.
Таблица открыта в не монопольном режиме.
Anatoly Podgoretsky (2003-01-16 19:28:00) [6]Anatoly Podgoretsky © (16.01.03 18:58)
Не знаю как там в Rx может и также, но что то мне подсказывает врядли.
В данный пример желательно добавить try finally end блок.
Serginio (2003-01-16 19:17:00) [7]Интересно зачем вызывать Try Check если можно все по возвращаемому значению определить и не мучится. Ну а если не OK и нужно передать пользователю исключение тогда Check без Try
gsu (2003-01-16 19:08:00) [8]>> Pat ©
Перед паковкой закрой все связанные таблицы и причем тут фильтры ?
gsu (2003-01-16 19:04:00) [9]>> Anatoly Podgoretsky ©
это что улыбка мастера ?
та же проца из Rx, только урезанная и без учета исключений
Anatoly Podgoretsky (2003-01-16 18:58:00) [10]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;
Pat (2003-01-16 18:25:00) [11]>gsu © (16.01.03 18:17)
Спасибо за быстрые ответы :-))
А как надо упаковывать связанные таблицы, таблицы с фильтрами? Нужно ли потом заново задавать фильтр?
gsu (2003-01-16 18:17:00) [12]SDataSetClosed = "Cannot perform this operation on a closed dataset"
или что угодно;
Pat (2003-01-16 18:07:00) [13]Теперь та же проблема с 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 15:44:00) [14]Замени на DatabaseError
Pat (2003-01-16 15:23:00) [15]>if not Table.Active then _DBError(SDataSetClosed);
Undeclared identifier: "_DBError"
:-((
Хелп....
Oxy (2003-01-16 09:51:00) [16]Спасибо всем за ответы. Хелпом я умею пользоваться, но опыта работы с БД у меня очень мало.
Довольно долго я искал в каком модуле находится ф-ция dbiPackTable, а потом разбирался как она работает. Ж-))
В этом плане ф-ция PackTable из Rx намного удобнее.
Дмитрий К.К. (2003-01-16 06:31:00) [17]
> Anatoly Podgoretsky © (15.01.03 20:48)
Если чел на ответ "dbiPackTable" задает вопрос "А что это такое?", есть основания полагать, что хэлпом пользоваться он не умеет, поетому ему нужно все разжевать до детали, шо и сделал gsu.
gsu (2003-01-15 20:54:00) [18]>> Anatoly Podgoretsky ©
да ничего я о нем не думаю: умный, глупый ? какая разница - просто помог, вдруг человек хороший. Получилось али нет - не мне решать.
(-:|~
Anatoly Podgoretsky (2003-01-15 20:48:00) [19]Так у него наверно хелп есть или ты так плохо о нем думаешь, что он не в состоянии им пользоваться?
gsu (2003-01-15 20:41:00) [20]из 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;