Tutorials and Guide to Samples (v11)

レッスン 2:Delphi で Btrieve API を使用する

このセクションでは、Delphi での Btrieve API の使用について説明します。作業項目は以下のとおりです。

基本的なファイル操作を実行する

ファイルを開く

Btrieve ファイルを開くには、Open(0)オペレーションおよび以下の情報を指定して BTRV を呼び出します。

  1. ファイルのポジション ブロック
  2. ファイル名
  3. ファイルのオーナー ネーム

BTRV 呼び出しをするために、ファイル名をキー バッファーに入力し、オーナー ネームをデータ バッファーに入力します。両方のパラメーターは、「ヌルで終了」している必要があります。DataLength パラメーターには、データ バッファーの長さを入力する必要があります。

ポジション ブロックは、ファイルが開いている間、有効なスコープで宣言する必要があります。ポジション ブロックは、関数の呼び出し中のカレンシー データおよびその他の情報を保存するために使用されるため、この変数は、ファイルに関連するすべての Btrieve 呼び出しから有効かつ参照可能である必要があります。

var 
  Status:smallint; 
  PosBlock:array[1..128] of byte; 
  DataBuffer:array[0..8] of char; 
  KeyBuffer:array[0..254] of char; 
  DataLength:word; 
  KeyNumber:byte; 
  [. . .] 
  // オーナー ネーム(ある場合)を DataBuffer に設定し、長さも指定する 
  fillchar(DataBuffer, sizeof(DataBuffer), #0); 
  DataBuffer := ''; // このファイルには、オーナー ネームなし 
  DataLength := length(DataBuffer); 
  // KeyBuffer にファイル名を入力する 
  fillchar(KeyBuffer, sizeof(KeyBuffer), #0); 
  KeyBuffer := 'g:¥psql¥sdk¥pviddb¥data¥customer.mkd'; 
  // KeyNumber を 0 に設定 
  KeyNumber := 0; 
  // パラメーターを指定して Btrieve を呼び出す 
  Status := BTRV( B_OPEN, 
                  PosBlock, 
                  DataBuffer, 
                  DataLength, 
                  KeyBuffer, 
                  KeyNumber); 
  // 返されたステータスを確認 
  ShowMessage('Open returned ' + intToStr(Status)); 
  [. . .] 

ファイルを閉じる

Btrieve ファイルを閉じるには、Close(1)オペレーションで BTRV を呼び出し、開いているファイルのポジション ブロックを渡します。ステータスが返され、この操作が正しく完了したかどうかを確認できます。

[. . .] 
Status := BTRV( B_CLOSE, 
                PosBlock, 
                DataBuffer, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 
ShowMessage('Close returned ' + intToStr(Status)); 
[. . .] 

ファイルを作成する

ファイルを作成するには、新しい Btrieve ファイルの作成に必要な情報を含む構造体を作成する必要があります。この構造体を作成する最も簡単な方法は、BTRV 呼び出しが実行される前に集計される複数の小さい構造体を作成することです。Create(14)関数呼び出しに渡される構造体についての詳細は、プログラマ用のドキュメントを参照してください。

{****************************************************** 
  Stat および Create 処理用のレコードの型定義 
******************************************************} 
type 
// ファイル仕様 - ファイル 1 つにつき 1 つの構造体 
FILE_SPECS = packed record 
  recLength   :smallint; 
  pageSize    :smallint; 
  indexCount  :smallint; 
  reserved    :array[0..3] of char; 
  flags       :smallint; 
  dupPointers :byte; 
  notUsed     :byte; 
  allocations :smallint; 
end; 
// キー仕様 - ファイル内のキー セグメント 1 つにつき 1 つの構造体 
KEY_SPECS = packed record 
  position    :smallint; 
  length      :smallint; 
  flags       :smallint; 
  reserved    :array[0..3] of char; 
  keyType     :char; 
  nullChar    :char; 
  notUsed     :array[0..1] of char; 
  manualKeyNumber :byte; 
  acsNumber       :byte; 
end; 
// 集合バッファーには、1 つの FILE_SPECS と、 
// キー セグメントと同数の KEY_SPECS 構造体が入る 
FILE_CREATE_BUF = packed record 
  fileSpecs :FILE_SPECS; 
  // ここでは、拡張性を考慮して配列を使用 
  keySpecs  :array[1..1] of KEY_SPECS; // 1 つのキー セグメント 
end; 
{****************************************************** 
  ファイル仕様構造体を作成して値を入力 
******************************************************} 
var 
  NewFileSpec :FILE_CREATE_BUF; 
  DataLength  :smallint; 
  KeyBuffer   :array[0..254] of char; 
  KeyNumber   :byte; 
  PosBlock    :array[1..128] of byte; 
[. . .] 
fillchar(NewFileSpec, sizeof(NewfileSpec), #0); 
With NewFileSpec.fileSpecs do begin 
  recLength   := 100; 
  pageSize    := 4096; 
  indexCount  := 3;  // インデックスの数(キー セグメント数ではない) 
  reserved    := 0; 
  flags       := 0; 
  dupPointers := 0; 
  notUsed     := 0; 
  allocations := 0; 
end; 
 
With NewFileSpec.keySpecs[1] do begin 
  position        := 0; 
  length          := 4; 
  flags           := 0; 
  // 予約済み               // 必要なし - fillchar() によって NULL 化済み 
  keyType         := 1; 
  nullChar        := 0; 
  // 使用せず               // 必要なし - fillchar() によって NULL 化済み 
  manualKeyNumber := 0; 
  acsNumber       := 0; 
end; 
{****************************************************** 
  ファイル パスとファイル名の指定 
******************************************************} 
fillchar(KeyBuffer, sizeof(KeyBuffer), #0); 
KeyBuffer := 'c:¥test.mkd'; 
{****************************************************** 
  Key Number を設定。警告せずに上書きする場合は 0、ファイルが存在する場合にエラーとする場合は -1。 
******************************************************} 
KeyNumber := 0; 
{****************************************************** 
  Btrieve Create オペレーションを呼び出し、返されたステータスを確認 
******************************************************} 
Status := BTRV( B_CREATE, 
                PosBlock, 
                NewFileSpec, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 
ShowMessage('Create returned ' + intToStr(Status)); 

データの変更

レコードの挿入

  1. 挿入する Btrieve レコードをデータ バッファーに配置します。
  2. Btrieve Insert 関数を呼び出し、返されたステータスを確認します。

Status := BTRV( B_INSERT, 
                PosBlock, 
                DataBuffer, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 
ShowMessage('Insert returned ' + intToStr(Status)); 

レコードの更新

  1. Get オペレーションまたは Step オペレーションを使用してカレンシーを確立し、レコードを読み込みます。
  2. データ バッファーを変更します。
  3. Btrieve Update 関数を呼び出します。

Status := BTRV( B_UPDATE, 
                PosBlock, 
                DataBuffer, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 
ShowMessage('Update returned ' + intToStr(Status)); 

レコードの削除

  1. Get オペレーションまたは Step オペレーションを使用してカレンシーを確立し、レコードを読み込みます。
  2. Btrieve Delete 関数を呼び出します。

Status := BTRV( B_DELETE, 
                PosBlock, 
                DataBuffer, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 
ShowMessage('Delete returned ' + intToStr(Status)); 

データの取得

Step オペレーションを実行する

Step オペレーションは、インデックスを使用せずにレコードを返します。

  1. Step オペレーションを呼び出します。
    Status := BTRV( B_STEP_FIRST, 
                    PosBlock, 
                    DataBuffer, 
                    DataLength, 
                    KeyBuffer, 
                    KeyNumber); 
    
  2. ステータスを確認します。
    ShowMessage('Update returned ' + intToStr(Status)); 
    
  3. データ バッファーを使用または操作します。

Get オペレーションを実行する

Get オペレーションは、インデックスを使用してレコードを返します。

  1. (Get Equal、Get Greater、Equal 用などに) キー バッファーのパラメーターを適切な値に設定します。
    // 次のコードは、2 つのセグメント(両方とも 10 文字)を持つ 
    // インデックスのキー バッファーを設定します。 
    // ZStrings とは違い、これらのフィールドはヌル終端でなく、 
    // 空白を詰めます。 
    KeyBuffer := 'Adams     George    '; 
    
  2. 特定のインデックスにキー番号パラメーターを設定します。
    KeyNumber := 1; 
    
  3. Step オペレーションを呼び出します。
    Status := BTRV( B_GET_EQUAL, 
                    PosBlock, 
                    DataBuffer, 
                    DataLength, 
                    KeyBuffer, 
                    KeyNumber); 
    
  4. ステータスを確認します。
    ShowMessage('Update returned ' + intToStr(Status)); 
    
  5. データ バッファーを使用または操作します。

セグメント インデックスを使用する

セグメント インデックスは、セグメントを持たないインデックスと同じように使用できますが、キー バッファーに値を入力する際に注意が必要です。

キー バッファーには、キーと同じ形式で値を入力する必要があります。整数フィールドおよびその他のバイナリ フィールドでは、キー バッファーの情報は、バイナリ形式である必要があります。それ以外の文字列型では、データは、Btrieve ファイルに表示される形式とまったく同じ形式で表示される必要があります。

キー バッファーのレコードは、Variant Record(「C」では、「共用体」)として定義すると便利です。次のキー バッファーの種類は、異なる複数のセグメント キー タイプおよびセグメント化されていないキー タイプに対して使用できます。

type 
  KEY_BUFFER_TYPE = packed record 
    case integer of 1:  ( 
          IDNumber:integer; 
          Filler1:array[1..255 - sizeof(integer)] of char; 
        ); 
    2:  ( 
          LastName:array[0..23] of char; 
          FirstName:array[0..23] of char; 
          Filler2:array[1..255 - 24 - 24] of char; 
        ); 
    3:  ( 
          ZipCode:array[0..9]  of char; 
          Filler3:array[1..255 - 10] of char 
        ) 
  end; 
[. . .] 
var 
  KeyBuffer:KEY_BUFFER_TYPE; 
[. . .] 
fillchar(KeyBuffer, sizeof(KeyNumber), #0); 
KeyBuffer.IDNumber := 1047; 
Status := BTRV( B_GET_EQUAL, 
                PosBlock, 
                DataBuffer, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 

データを検索する

データを検索するには、キーを使用してデータベース内の行を検出します。

実際の行ではなくファイル内のキーのみを検出(存在しているものと仮定)するには、GetEqual、GetNext、GetFirst、GetLast のいずれかのオペレーション番号に +50(btrconst.pas の KEY_BIAS)を追加します。

// キーのみを取得 -- レコードは取得しない 
Status := BTRV( B_GET_EQUAL + KEY_BIAS, 
                PosBlock, 
                DataBuffer, 
                DataLength, 
                KeyBuffer, 
                KeyNumber); 

レッスン 1:Delphi で ActiveX を使用する

レッスン 3:Delphi で ODBC を使用する