Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.03;
Скачать: CL | DM;

Вниз

Как упаковать таблицу в делфе?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.024 c
1-4829
wit721
2003-01-24 13:00
2003.02.03
Нужен аналог функции xBase Str()


3-4824
VinRaider
2003-01-18 00:40
2003.02.03
Корректность ввода


3-4781
chsv
2003-01-12 19:06
2003.02.03
временный каталог


14-5178
-----------------
2003-01-18 13:05
2003.02.03
Как пихнуть файл типа Tbitmap в record?


3-4764
AALLEEXX
2003-01-15 07:27
2003.02.03
ПОМОГИТЕ !!!!!!! (Надо 12 П.10,158-1*2 --> 12П1015812)