Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-5268
Junior
2003-01-17 02:40
2003.02.03
Посоветуйте библиотечку NetBios


1-5055
diks
2003-01-22 17:48
2003.02.03
PaNEL


1-5010
stas_a
2003-01-23 17:44
2003.02.03
Динамический массив


1-4891
Armageddon
2003-01-25 10:22
2003.02.03
Как програмно посмотреть путь к файлу form1.BitBtn1.Glyph в кото


1-4861
Groove
2003-01-24 16:47
2003.02.03
Как вставить табуляцию в TStringList?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский