16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"dBASEのインデックス(MDXとNDX)の生成"
この発言に対し以下のコメントが寄せられています
#01235 高田 浩 さん RE:dBASEのインデックス(MDXとNDX)の生成
こんにちは、高田浩です。
現在、xBase.pas なる xBASE言語ライク環境の開発中なのですが、
その中からの紹介です。
(出来たってだけですのでその点を留意ください)
TTable.AddIndex では実現できない dBase 形式の日付型、数値型、
文字型混在のインデックス条件を実現するためのプロシージャ2種
(NDX用、MDX用)です。
インデックス生成の条件はそれぞれのdBASEバージョン
(dBASE III plus,dBASE IV)での規則に従ってください。
従わなくても生成されてしまいます。が、dBASE側で誤動作します。
尚、MDX の場合、1つめの Tag で自動的に[.MDX]が生成され、
TTable.DeleteIndex() で1つも無くなったら自動的に[.MDX]も
削除されます。
また、インデックスは生成されるだけですので、使う場合は、
TTable.IndexName に設定してください。
ついでに xReindex も紹介しときます。
-----------------------------------------------------------------
unit xBaseSub;
interface
uses
DBTables,BDE;
procedure xIndex( {INDEX}{NDX用}
TblName : TTable;
NdxExp : string; {ON <キー表現>}
{注:キー表現はxBASE書式で}
NdxFileName : string; {TO <ファイル名>}
rUnique : boolean {[UNIQUE]}
);overload;
procedure xIndex( {INDEX}{MDX用}
TblName : TTable;
MdxExp : string; {ON <キー表現>}
{注:キー表現はxBASE書式で}
TagName : string; {TAG <タグ名>}
rUnique : boolean; {[UNIQUE]}
rDescending : boolean {[DESCENDING]}
);overload;
procedure xReindex( {REINDEX}
TblName : TTable
);
implementation
{INDEX}
procedure xIndex(TblName: TTable;NdxExp,NdxFileName: string;
rUnique: boolean);
var
NewIndex : IDXDesc;
xTbl : TTable;
xNdx,xExp : string;
begin
xTbl:= TblName; {テーブル名}
xExp:= NdxExp; {インデックス式はxBASE書式で}
xNdx:= NdxFileName; {インデックス名}
FillChar(NewIndex, sizeof(IDXDesc) - 1, 0); {IDXDescの初期化}
with NewIndex do begin
AnsiToNative(xTbl.Locale, xNdx, szName, DBIMAXTBLNAMELEN - 1);
AnsiToNative(xTbl.Locale, xExp, szKeyExp, DBIMAXKEYEXPLEN - 1);
bPrimary := False;
bUnique := rUnique;
bDescending := False;
bMaintained := False;
bExpIdx := true;
iFldsInKey := 0;
iKeyExpType:=fldDBCHAR;
bCaseInsensitive := False;
end;
Check(DbiAddIndex(xTbl.dbhandle, xTbl.handle,
PChar(xTbl.TableName),
szDBASE, NewIndex, nil));
end;
{Index式は[NDX]のマルチインデックスの生成方法を採用している}
{(シングルインデックスを包括している)
procedure Index(TblName: TTable;MdxExp,TagName: string;
rUnique,rDescending: Boolean);
var
NewIndex : IDXDesc;
xTbl : TTable;
xTag,xExp : string;
begin
xTbl:= TblName; {テーブル名}
xExp:= MdxExp; {インデックス式はxBASE書式で}
xTag:= TagName; {タグ名}
FillChar(NewIndex, sizeof(IDXDesc) - 1, 0); {IDXDescの初期化}
with NewIndex do begin
AnsiToNative(xTbl.Locale, xTag, szTagName, DBIMAXTBLNAMELEN-1);
AnsiToNative(xTbl.Locale, xExp, szKeyExp, DBIMAXKEYEXPLEN-1);
bPrimary := false;
bUnique := rUnique ;
bDescending := rDescending ;
bMaintained := true;
bCaseInsensitive := false;
iFldsInKey := 1;
aiKeyFld[0]:= 2;
bExpIdx := true;
iKeyExpType := fldDBCHAR;
bSubSet := false;
szKeyCond := '';
iBlockSize := 0;
end;
Check(DbiAddIndex(xTbl.dbhandle, xTbl.handle,
PChar(xTbl.TableName),
szDBASE, NewIndex, nil));
end;
procedure xReindex(TblName: TTable);
begin
Check(DbiRegenIndexes(TblName.Handle));
end;
end.
-------------------------------------------------------------------
実行例
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Exclusive:=true;
Table1.Open;
{MDXの場合}
xIndex(Table1,'RIGHT("0"+LTRIM(TRIM(STR(納期,2,0))),2) + '
+ '商品コード','Tag1',false,true);
{NDXの場合}
xIndex(Table1,'RIGHT("000000"+LTRIM(TRIM(STR(単価,6,0))),6) + '
+ 'DTOC(発注日)+商品コード','商品.NDX',false);
end;
xBase.pas 開発資料収集を SBORLAND (4)dBASE 会議室に展開中・・・
xBase保護団体「xBaseを絶滅から救え!」(失笑)
_/dBASE3-4形式_/VdB7&Delphi4pro_/_/KFE06073_/_/高田浩_/_/
Original document by 高田 浩 氏 ID:(KFE06073)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|