Btrieve Programmer’s Reference disclaimer PERVASIVE SOFTWARE INC. LICENSES THE SOFTWARE AND DOCUMENTATION PRODUCT TO YOU OR YOUR COMPANY SOLELY ON AN “AS IS”BASIS AND SOLELY IN ACCORDANCE WITH THE TERMS AND CONDITIONS OF THE ACCOMPANYING LICENSE AGREEMENT. PERVASIVE SOFTWARE INC. MAKES NO OTHER WARRANTIES WHATSOEVER, EITHER EXPRESS OR IMPLIED, REGARDING THE SOFTWARE OR THE CONTENT OF THE DOCUMENTATION; PERVASIVE SOFTWARE INC. HEREBY EXPRESSLY STATES AND YOU OR YOUR COMPANY ACKNOWLEDGES THAT PERVASIVE SOFTWARE INC. DOES NOT MAKE ANY WARRANTIES, INCLUDING, FOR EXAMPLE, WITH RESPECT TO MERCHANTABILITY, TITLE, OR FITNESS FOR ANY PARTICULAR PURPOSE OR ARISING FROM COURCE OF DEALING OR USAGE OF TRADE, AMONG OTHERS. trademarks Btrieve and XQL are registered trademarks of Pervasive Software Inc. Scalable SQL, MicroKernel Database Engine, MicroKernel Database Architecture, Navigational Client/Server, Built on Btrieve, Built on Scalable SQL, Xtrieve PLUS, and Client/Server in a box are trademarks of Pervasive Software Inc. Microsoft, MS-DOS, Windows, Windows NT, Win32, Win32s, and Visual Basic are registered trademarks of Microsoft Corporation. Windows 95 is a trademark of Microsoft Corporatoin. NetWare and Novell are registered trademarks of Novell, Inc. NetWare Loadable Module, NLM, Novell DOS, Transaction Tracking System, and TTS are trademarks of Novell, Inc. All company and product names are the trademarks or registered trademarks of their respective companies. ©Copyright 1998 Pervasive Software Inc. All rights reserved worldwide.Reproduction, photocopying, or transmittal of this publication, or portions of this publication, is prohibited without the express prior written consent of the publisher, unless such reproduction, photocopying, or transmittal is part of a Derivative Software Product as defined in the licenses granted in conjunction with the purchase of this publication and associated software. This product includes software developed by Powerdog Industries. © 1994 Powerdog Industries.All rights reserved. Pervasive Software Inc. 8834 Capital of Texas Highway Austin, Texas 78759 U.S.A. Btrieve Programmer's Reference March 1998 TONBO: W 176 × H 227 FILE NAME: CREDIT.DOC PAGE: 2 OF 7 LAST SAVED: 98/02/19 21:37 BY: JUNKO OKUMURA PRINTED: 98/03/03 17:26 目次 本書について 本書の読者...............................................................................................................................x 本書の構成...............................................................................................................................x 表記の規則..............................................................................................................................xi 第 1 章 Btrieve API について Btrieve 関数 .......................................................................................................................... 1-2 BTRV 関数 ............................................................................................................ 1-3 BTRVID 関数 ........................................................................................................ 1-3 BTRCALL 関数 ..................................................................................................... 1-4 BTRCALL32 関数 ................................................................................................. 1-4 BTRCALLID 関数................................................................................................. 1-4 BTRCALLID32 関数............................................................................................. 1-4 BTRCALLBACK 関数 .......................................................................................... 1-5 Btrieve の以前のバージョンでサポートされていた関数 ............................... 1-5 Btrieve 関数のパラメータ .................................................................................................. 1-6 オペレーションコード........................................................................................ 1-6 ステータスコード................................................................................................ 1-7 ポジションブロック............................................................................................ 1-7 データバッファ.................................................................................................... 1-8 データバッファ長................................................................................................ 1-8 キーバッファ........................................................................................................ 1-9 キー番号.............................................................................................................. 1-10 クライアント ID................................................................................................. 1-10 キー長.................................................................................................................. 1-12 目次 iii TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 目次.DOC PAGE: III OF 6 LAST SAVED: 98/03/05 14:59 BY: JUNKO OKUMURA PRINTED: 98/03/05 15:00 Btrieve オペレーションの概要 ........................................................................................ 1-14 セッション固有のオペレーション.................................................................. 1-14 ファイル固有のオペレーション...................................................................... 1-15 Btrieve オペレーションを実行するときのイベントのシーケンス ............................ 1-19 第 2 章 Btrieve オペレーション Abort Transaction (21) .......................................................................................................... 2-2 Begin Transaction (19 または 1019) .................................................................................... 2-3 Clear Owner (30)................................................................................................................... 2-5 Close (1) ................................................................................................................................ 2-6 Continuous Operation (42).................................................................................................... 2-8 Create (14)........................................................................................................................... 2-12 ファイルスペック.............................................................................................. 2-14 キースペックブロック...................................................................................... 2-16 オルタネートコーティングシーケンス (ACS).............................................. 2-19 データバッファ長.............................................................................................. 2-21 キー番号.............................................................................................................. 2-21 Create Index (31)................................................................................................................. 2-23 Delete (4)............................................................................................................................. 2-28 Drop Index (32)................................................................................................................... 2-30 End Transaction (20) ........................................................................................................... 2-32 Find Percentage (45) ........................................................................................................... 2-33 Get By Percentage (44)........................................................................................................ 2-36 Get Direct/Chunk (23)......................................................................................................... 2-39 ランダムチャンクディスクプリタの構造...................................................... 2-40 矩形チャンクディスクプリタの構造.............................................................. 2-42 Next-in-Record サブファンクションバイアス ............................................... 2-45 Get Direct/Record (23) ........................................................................................................ 2-48 Get Directory (18) ............................................................................................................... 2-50 Get Equal (5) ....................................................................................................................... 2-51 Get First (12) ....................................................................................................................... 2-53 Get Greater (8)..................................................................................................................... 2-55 Get Greater Than or Equal (9) ............................................................................................. 2-57 iv Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 目次.DOC PAGE: IV OF 6 LAST SAVED: 98/03/05 14:59 BY: JUNKO OKUMURA PRINTED: 98/03/05 15:00 Get Key (+50)...................................................................................................................... 2-59 Get Last (13)........................................................................................................................ 2-61 Get Less Than (10) .............................................................................................................. 2-63 Get Less Than or Equal (11)................................................................................................ 2-65 Get Next (6)......................................................................................................................... 2-67 Get Next Extended (36)....................................................................................................... 2-69 使用例.................................................................................................................. 2-72 レコードに含まれるフィールドの取得.......................................................... 2-73 Get Position (22) ................................................................................................................. 2-77 Get Previous (7)................................................................................................................... 2-78 Get Previous Extended (37)................................................................................................. 2-80 Insert (2) .............................................................................................................................. 2-82 Insert Extended (40) ............................................................................................................ 2-84 Open (0) .............................................................................................................................. 2-88 Reset (28) ............................................................................................................................ 2-94 Set Directory (17) ................................................................................................................ 2-95 Set Owner (29) .................................................................................................................... 2-96 Stat (15)............................................................................................................................... 2-98 ファイルスペック............................................................................................ 2-101 キースペック.................................................................................................... 2-102 ACS .................................................................................................................... 2-102 Stat Extended (65) ............................................................................................................. 2-103 Step First (33).................................................................................................................... 2-106 Step Last (34) .................................................................................................................... 2-107 Step Next (24) ................................................................................................................... 2-108 Step Next Extended (38) ................................................................................................... 2-110 Step Previous (35) ............................................................................................................. 2-113 Step Previous Extended (39) ............................................................................................. 2-115 Stop (25)............................................................................................................................ 2-117 Unlock (27) ....................................................................................................................... 2-118 Update (3).......................................................................................................................... 2-120 Update Chunk (53) ............................................................................................................ 2-123 ランダムチャンクディスクリプタの構造.................................................... 2-124 矩形チャンクディスクリプタの構造............................................................ 2-127 目次 v TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 目次.DOC PAGE: V OF 6 LAST SAVED: 98/03/05 14:59 BY: JUNKO OKUMURA PRINTED: 98/03/05 15:00 切り捨てディスクリプタの構造.................................................................... 2-130 Next-in-Record サブファンクションバイアス .............................................. 2-130 Append サブファンクションバイアス .......................................................... 2-130 Version (26) ...................................................................................................................... 2-133 付録 A 言語インタフェース C/C++................................................................................................................................... A-4 インタフェースモジュール............................................................................... A-4 BTRAPI.C................................................................................................. A-4 BTRAPI.H................................................................................................. A-4 BTRCONST.H .......................................................................................... A-5 BTITYPES.H ............................................................................................ A-5 BTRSAMP.C ............................................................................................ A-6 プログラミングの必要条件............................................................................... A-6 C によるサンプルプログラム ........................................................................... A-7 Tenberry DOS/4G Extender を使ったアプリケーション作成 ....................... A-19 インタフェースを使用する Windows アプリケーションのリンク............ A-19 C++ Builder アプリケーションのコンパイル................................................ A-20 COBOL .............................................................................................................................. A-32 サンプルプログラム......................................................................................... A-32 Delphi................................................................................................................................. A-36 Pascal.................................................................................................................................. A-48 BTRAPID.PAS と BTRAPIW.PAS.................................................................... A-48 BTRCONST.PAS ................................................................................................ A-48 BTRSAMPD.PAS と BTRSAMPW.PAS........................................................... A-49 プログラミングの必要条件............................................................................. A-49 インタフェースを使用したコンパイルとリンク......................................... A-49 サンプルプログラム......................................................................................... A-50 Visual Basic........................................................................................................................ A-60 サンプルプログラム......................................................................................... A-60 32 ビットアプリケーションの作成................................................................ A-69 索引 vi Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 目次.DOC PAGE: VI OF 6 LAST SAVED: 98/03/05 14:59 BY: JUNKO OKUMURA PRINTED: 98/03/05 15:00 図表目次 表 表 1-1 Btrieve 関数 ........................................................................................................... 1-2 表 1-2 クライアント ID 構造体 .................................................................................... 1-11 表 1-3 セッション固有のオペレーション .................................................................. 1-14 表 1-4 ファイルアクセスおよび情報オペレーション .............................................. 1-15 表 1-5 データ取得オペレーション .............................................................................. 1-16 表 1-6 データ操作オペレーション .............................................................................. 1-18 表 2-1 Create オペレーションのデータバッファ構造............................................... 2-13 表 2-2 ファイルフラグの値 .......................................................................................... 2-14 表 2-3 キーフラグの値 .................................................................................................. 2-16 表 2-4 拡張キータイプ .................................................................................................. 2-18 表 2-5 ユーザ定義 ACS を作成するためのデータバッファ .................................... 2-20 表 2-6 ロケール固有 ACS を指定するためのデータバッファ................................. 2-20 表 2-7 ISR ACS を指定するためのデータバッファ .................................................. 2-21 表 2-8 ACS 名のフォーマット ..................................................................................... 2-24 表 2-9 ランダムチャンクディスクリプタの構造 ...................................................... 2-41 表 2-10 矩形チャンクディスクリプタの構造 ............................................................. 2-43 表 2-11 Extended Get および Step オペレーションの入力データバッファ構造...... 2-70 表 2-12 Extended Get および Step オペレーションのリターンデータバッファ構造 .. 2-73 表 2-13 Insert Extended オペレーションのデータバッファ構造 ............................... 2-85 表 2-14 オープンモード ................................................................................................. 2-89 表 2-15 SEFS を使用するローカルクライアントで使用可能なオープンモードの 組み合わせ.......................................................................................................... 2-91 表 2-16 MEFS を使用するローカルクライアントで使用可能なオープンモードの 組み合わせ.......................................................................................................... 2-92 表 2-17 リモートクライアントで使用可能なオープンモードの組み合わせ ......... 2-93 表 2-18 アクセスおよび暗号化コード ......................................................................... 2-97 目次 vii TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 目次.DOC PAGE: VII OF 6 LAST SAVED: 98/03/05 14:59 BY: JUNKO OKUMURA PRINTED: 98/03/05 15:00 表 2-19 ファイルバージョン情報を除外したデータバッファ ................................. 2-99 表 2-20 ファイルバージョン情報を含めたデータバッファ ................................... 2-100 表 2-21 拡張ファイルディスクリプタ ....................................................................... 2-103 表 2-22 システムデータディスクリプタ ................................................................... 2-104 表 2-23 拡張ファイルリターンバッファ ................................................................... 2-104 表 2-24 システムデータリターンバッファ ............................................................... 2-105 表 2-25 ランダムチャンクディスクリプタの構造 ................................................... 2-125 表 2-26 矩形チャンクディスクリプタの構造 ........................................................... 2-128 表 2-27 切り捨てディスクリプタの構造 ................................................................... 2-130 表 2-28 バージョンブロック ....................................................................................... 2-134 表 A-1 言語インタフェースソースモジュール........................................................... A-1 表 A-2 Btrieve のデータバッファで使用されるコモンデータ型 .............................. A-3 表 A-3 オペレーティングシステムスイッチ............................................................... A-6 viii Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 目次.DOC PAGE: VIII OF 6 LAST SAVED: 98/03/05 14:59 BY: JUNKO OKUMURA PRINTED: 98/03/05 15:00 本書について 本書では、Btrieve ナビゲーショナルデータ管理システムを使用するアプリ ケーションを開発する方法について説明します。Btrieve は、効率的なデー タ処理を実現し、プログラミングの生産性を向上するように設計されてい ます。 本書について ix TONBO: W 176 × H 227 FILE NAME: BT7-R0.DOC PAGE: IX OF 3 LAST SAVED: 98/03/05 15:03 BY: MARIKO WATANABE PRINTED: 98/03/05 15:18 本書の読者 本書は、Btrieve を使って、OS/2、NetWare、Windows、Windows NT、また は Windows 95 オペレーティング環境に対応したアプリケーションを開発し ようとしている開発者に必要な情報を提供します。 本書の構成 ◆ 第 1 章 Btrieve API について この章では、Btrieve 関数とそのパラメータの概要について説明しま す。また、Btrieve オペレーションの概要についても説明します。 ◆ 第 2 章 Btrieve オペレーション この章では、Btrieve オペレーションについて詳細に説明します。 ◆ 付録 A 言語インタフェース この章では、言語インタフェースに関する情報を提供します。 x Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R0.DOC PAGE: X OF 3 LAST SAVED: 98/03/05 15:03 BY: MARIKO WATANABE PRINTED: 98/03/05 15:18 表記の規則 特に断らない限り、コマンドの構文とコード例には、次の表記の規則を適 用します。 大文字と小文字 コマンドと予約語は、通常、大文字で表記します。ただ し、特に断らない限り、これらの項目を実際に入力する ときは、すべて大文字または小文字で入力するか、ある いは大文字と小文字を混在させることが可能です。たと えば、MYPROG、myprog、または Myprog と入力するこ とができます。 [] [log_name] のように、角カッコで囲まれた情報は省略可 能な項目を示します。逆に、角カッコで囲まれていない 項目は、必ず指定する必要があります。 | [filename | @filename] のように、縦棒で区切られた項目 は、その中のいずれかを選択します。 < > /D=<5|6|7> のように、山カッコで囲まれた情報は、必 ず指定する必要のある項目に対する選択肢を表します。 variable variable のように、斜体で表記された単語は、実際には適 切な値と置き換える必要のある変数を表します。 ... [parameter . . . ] のように、特定の情報に続く省略記号 (...)は、その情報を繰り返し指定できることを表しま す。 ::= ::= という記号は、ある項目が別の項目によって定義され ていることを表します。たとえば、a::=b という式は、a が b によって定義されているという意味です。 本書について xi TONBO: W 176 × H 227 FILE NAME: BT7-R0.DOC PAGE: XI OF 3 LAST SAVED: 98/03/05 15:03 BY: MARIKO WATANABE PRINTED: 98/03/05 15:18 第 1 章 Btrieve API について Btrieve ナビゲーショナルデータベース管理システムは、効率的なデータ処 理を実現し、プログラミングの生産性を向上するように設計されています。 Btrieve オペレーションを使用すると、開発したアプリケーションはキー値、 あるいはシーケンシャルまたはランダムアクセスメソッドに基づいて、レ コードの取得、挿入、更新、または削除を行えるようになります。 Btrieve Developer Kit は次のプログラミング言語および開発環境と互換性が あります。 ◆ Borland C/C++ ◆ Borland Delphi ◆ Micro Focus COBOL ◆ Microsoft Access ◆ Microsoft Visual Basic ◆ Microsoft Visual C++ ◆ Powersoft PowerBuilder ◆ Watcom C/C++ Btrieve API について 1-1 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 1 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 Btrieve 関数 Btrieve はシングルファンクション API を提供します。この API では、プロ グラムの大部分の動作が関数名ではなく、オペレーションコードパラメー タによって決定されます。複数のプラットフォーム間でのコードの互換性 と特定のプラットフォームでの最高のパフォーマンスのどちらに重点を置 くかによって、開発するアプリケーションに最適な API を選択してくださ い。 Btrieve アプリケーションでは、データファイルに対して絶対に標準 I/O を 実行しないでください。開発するアプリケーションでは、Btrieve 関数を 使って、すべてのファイル I/O を実行する必要があります。 次に、Btrieve 関数の一覧を示します。 表 1-1 Btrieve 関数 関数 オペレーティングシステム 説明 BTRV すべて 各オペレーティングシステム間での完全な コード互換性を得るために使用します。大 部分の開発者にとって、この利点はパ フォーマンスの若干の低下を十分に埋め合 わせるものです。 BTRVID BTRCALL BTRCALLID BTRCALL32 OS/2、Windows v3.x、Windows NT、 および Windows 95 のみ 32 ビット OS/2 アプリケーションのみ これらの関数は、パフォーマンスの若干の 向上を得たり、既存のソースコードとの互 換性を維持するために使用します。 BTRCALLID32 BTRCALLBACK Windows v3.x のみ 開発するアプリケーションが Btrieve 呼出し の実行中に他のアプリケーションに制御を 譲渡する必要がある場合に、コールバック 関数の登録と登録の解除を行うために使用 します。 Btrieve 関数を呼出すときに必要となるプログラミング言語固有の構文につ いては、付録 A「言語インタフェース」を参照してください。 1-2 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 2 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 BTRV 関数 BTRV により、アプリケーションは Btrieve 呼出しを実行できるようになり ます。Btrieve Developer Kit で提供されるすべての言語インタフェースモ ジュールでは、BTRV 関数がサポートされています。 OS/2、Windows v3.x、Windows NT、および Windows 95 では、BTRV 関数は 実 際 に は BTRCALL 関 数 (BTRCALLS.DLL 、 WBTRCALL.DLL 、 お よ び WBTRV32.DLL によってエクスポートされる) を呼出しています。ただし、 プラットフォームに依存しないという点で、BTRV 関数の選択をお勧めし ます。 BTRVID 関数 BTRVID により、アプリケーションはクライアント ID パラメータを含む単 独の Btrieve 呼出しを実行できるようになります。クライアント ID パラ メータはアプリケーションによって制御されます。アプリケーションでは BTRVID を使って、自分自身を Btrieve に対する複数のクライアント ID と して割当て、他のクライアントのステータスに影響を与えることなく、1 つのクライアントに対するオペレーションを実行することができます。 詳細については、「クライアント ID」を参照してください。 OS/2、Windows v3.x、Windows NT、および Windows 95 では、BTRVID 関数 は実際には別の関数を呼出しています。16 ビットアプリケーションの場合 は BTRCALLID 関数 (BTRCALLS.DLL と WBTRCALL.DLL によってエクス ポ ー ト さ れ る ) が 呼 出 さ れ 、 32 ビ ッ ト ア プ リ ケ ー シ ョ ン の 場 合 は BTRCALLID32 関数が呼出されています。ただしいずれの場合も、プラッ トフォームに依存しないという点で、BTRVID 関数の選択をお勧めします。 DOS アプリケーションでは、/T オプションに適切な値を設定して DOS リ クエスタをロードする必要があります。/T には、アプリケーション内で使 用しているクライアント ID の数に等しい値を設定します。詳細については、 『Getting Started with Btrieve』の「DOS リクエスタ」を参照してください。 Btrieve API について 1-3 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 3 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 BTRCALL 関数 アプリケーションがローカルファイルのみにアクセスし、OS/2、Win16、また は Win32 ワ ー ク ス テ ー シ ョ ン MicroKernel の み を 使 用 す る 場 合 は 、 BTRCALL 関数の選択をお勧めします。 OS/2 および Windows v3.x では、BTRCALL 関数は、BTRCALLS.DLL (OS/2) お よび WBTRCALL.DLL (Windows v3.x) によってエクスポートされ、直接 DLL を呼出す 16 ビット関数です。Windows NT、Windows 95、および 32 ビット Windows アプリケーションでは、BTRCALL 関数は、WBTRV32.DLL によっ てエクスポートされ、直接 DLL を呼出す 32 ビット関数です。 BTRCALL32 関数 BTRCALL32 関数は、BTRCALLS.DLL によってエクスポートされ、32 ビッ ト関数である点を除けば BTRCALL とまったく同じ関数です。 BTRCALLID 関数 クライアントレベルの制御が必要で、アプリケーションが OS/2、Windows v3.x 、 Windows NT 、 お よ び Windows 95 環 境 で の み 動 作 す る 場 合 は BTRCALLID 関数を使用します。 この関数は BTRVID 関数に似ていますが、BTRCALLS.DLL (OS/2) または WBTRCALL.DLL (Windows v3.x) を 直 接 呼 出 し ま す 。 Windows NT 、 Windows 95 、 お よ び 32 ビ ッ ト Windows ア プ リ ケ ー シ ョ ン で は 、 BTRCALLID は WBTRV32.DLL によってエクスポートされる 32 ビット関数 です。 BTRCALLID32 関数 BTRCALLID32 関数は、32 ビット関数である点を除けば BTRCALLID と まったく同じ関数です。 1-4 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 4 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 BTRCALLBACK 関数 BTRCallback 関数は、WBTRCALL.DLL と WBTRV32.DLL によってエクス ポートされます。 Windows NT と Windows 95 では、BTRCallback 関数は無視されます。 BTRCallback は、Windows v3.x に対応して書かれた既存のアプリケーショ ンとの互換性を維持するために用意されています。 Btrieve の以前のバージョンでサポートされていた関数 次の関数は、v6.15 よりも前の Btrieve に対応して書かれた古いアプリケー ションとの互換性を維持するためだけにサポートされています。 ◆ BTRVINIT ◆ BTRVSTOP ◆ RQSHELLINIT ◆ WBRQSHELLINIT ◆ WBTRVINIT ◆ WBTRVSTOP ◆ BRQSHELLINIT 現在のバージョンではこれらの関数を使用しませんが、これらの関数を呼 出す古いアプリケーションは v6.15 以降の MicroKernel でも正常に実行され ます (Btrieve v7.0 でさらに廃止された関数はありません)。 Btrieve API について 1-5 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 5 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 Btrieve 関数のパラメータ Btrieve 関数を呼出すときは、パラメータの名前ではなく、むしろそのポジ ションが重要になります。それぞれの呼出しでは、すべてのパラメータを 指定する必要があります。ただし、すべてのオペレーションにすべてのパ ラメータが使用されるわけではありません。場合によっては、パラメータ の値が無視されることもあります。一般に、それぞれのオペレーションで は、 異な るパ ラメ ータ が送 られ 、実 行結 果が 返さ れま す。 それ ぞれ の Btrieve オペレーションに必要なパラメータについては、第 2 章「Btrieve オ ペレーション」を参照してください。 注意 C 開発者: C 言語インタフェースで使用されるプラットフォームに依存しないデータ 型とポインタについては、BTITYPES.H を参照してください。 次に、Btrieve 関数に渡すパラメータの一覧を示します。 ◆ オペレーションコード ◆ ステータスコード (BASIC と COBOL のみ) ◆ ポジションブロック ◆ データバッファ ◆ データバッファ長 ◆ キーバッファ ◆ キー番号 ◆ クライアント ID (BTRVID および BTRCALLID 関数のみ) ◆ キ ー 長 (BTRCALL 、 BTRCALLID 、 BTRCALL32 、 お よ び BTRCALLID32 関数のみ) オペレーションコード オペレーションコードパラメータにより、Btrieve 関数の実行するアクショ ンが決まります。たとえば、1 つまたは複数のレコードの読み込み、書き 込み、削除、または更新のようなオペレーションです。アプリケーション では、それぞれの Btrieve 呼出しに対して有効なオペレーションコードを指 定する必要があります。MicroKernel がオペレーションコードを変更するこ とはありません。指定する変数は、第 2 章「Btrieve オペレーション」に示 1-6 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 6 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 されている Btrieve の正しいオペレーションコードのいずれかでなければな 第 1 章 りません。 注意 C 開発者: 指定する変数は BTI_WORD 型 (符号なし short integer) でなければなり ません。 ステータスコード 言語により構文にちがいがあるため、ステータスコードパラメータは一部 の BASIC および COBOL 言語インタフェースでだけ使用されます。このパ ラメータは 2 バイトの整数で、オペレーションの実行中に何らかのエラー が発生したかどうかを示すコード化された値を含みます。Btrieve 呼出しの 終了後は、ステータス変数の値を必ずチェックし、呼出しが正常に終了し たかどうかを確認する必要があります。 他のプログラミング環境では、ステータスコードは関数に渡すパラメータ ではなく、Btrieve 関数呼出しの戻り値となります。 ポジションブロック ポジションブロックパラメータは、128 バイト配列のアドレスで、ファイ ル I/O 構造体や、Open (0) オペレーションに関連するポジショニング情報 を格納するために使用されます。アプリケーションでファイルをオープン するたびに、それぞれの Open オペレーションに対して重複のないポジ ションブロックを割当てる必要があります。 アプリケーションが Open オペレーションを実行するとき、ポジションブ ロックが初期化されます。さらにファイルオペレーションの実行に伴い、 Btrieve はこのポジションブロックを参照して更新します。このためアプリ ケーションでは、ファイルに対する一連の Btrieve オペレーションに対して 同じポジションブロックを指定する必要があります。 注意 ポジションブロックへの書き込みは行わないでください。書き込みを行ってしまう と、ポジション喪失エラー、その他のエラー、あるいはファイルの損傷などの原因 になります。 Btrieve API について 1-7 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 7 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 複数のファイルを同時にオープンするときは、どのファイルがどの呼出し に対応しているかを決めるためにポジションブロックが使用されます。同 様に、同じファイルを何度もオープンするときは、それぞれの Open オペ レーションについて異なるポジションブロックが使用されます (1 つの ファイルを何度もオープンできるのはマルチクライアントがサポートされ ているときだけです)。 データバッファ アプリケーションでは、データバッファを使ってファイルとの間でデータ のやり取りを行います。データバッファを使ってやり取りされる情報は、 実行する Btrieve オペレーションによって異なります。通常データバッファ には、アプリケーションとファイルとの間で相互に転送されるレコードが 格納されています。しかし、実行する Btrieve オペレーションによっては、 データバッファにファイルスペック、キースペック、MicroKernel のバー ジョン情報など、他の情報が格納されることもあります。 データバッファを割当てる場合は、ファイル内の最長のレコードに合わせ て十分なサイズを確保してください。データバッファ長パラメータに指定 した値がデータバッファのサイズよりも小さいと、Btrieve の変更オペレー ションによりデータバッファの後に格納されているデータが破壊される場 合があります。 データバッファ長 データバッファを必要とするオペレーションでは、データバッファのサイ ズ (バイト単位) を示す変数を渡す必要があります。データバッファには オペレーションによって返されるデータを十分格納できるだけのサイズを 確保する必要があります。 注意 BASIC 開発者: データバッファ長パラメータとして整数を渡す必要があります。 C、COBOL、Pascal 開発者: データバッファ長パラメータとして、データバッファ の長さを含む 2 バイト符号なし整数へのポインタを渡す必要があります。 可変長レコードを含むファイルにレコードを挿入したり、ファイルそのも のを更新するとき、データバッファ長は、ファイルを最初に作成したとき 1-8 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 8 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 に指定したレコード長に固定長部分を超える文字数を加算した値と等しく なければなりません。また、可変長レコードを取得するときは、データ バッファ長にファイル内の最長のレコードを十分に格納できるサイズを指 定する必要があります。 MicroKernel ではデータバッファ長パラメータを使って、データバッファに 使用可能なスペースを決定します。実際に割当てたデータバッファよりも 長いデータバッファ長を渡すと、MicroKernel によりメモリの上書きが行わ れます。データバッファ長は、実際にアロケートされたデータバッファの サイズを常に正確に表すようにしてください。 キーバッファ オペレーションがキーバッファを使用しない場合でも、アプリケーション では各 Btrieve オペレーションにキーバッファパラメータを渡す必要があり ます。オペレーションによっては、キーバッファにデータをセットしたり、 キーバッファに値が返される場合があります。 注意 BASIC 開発者: キーバッファパラメータとして文字列を渡す必要があります。キー 値が整数である場合、アプリケーションでは Btrieve 関数を呼出す前に、MKI$ス テートメントを使ってキー値を文字列に変換しておく必要があります。また、キー が複数のセグメントから構成される場合は、それらを 1 つの文字列変数として結合 し、それをキーバッファの変数として渡す必要があります。 キーバッファとして渡した文字列変数がキーの定義された長さよりも短いとエラー が返されます。最初の呼出しがキーバッファの初期化を必要としなかった場合、文 字列変数に SPACE$(x) の値を割当てる必要があります。ここで x はキーの定義さ れている長さを表します。アプリケーションが BASIC の文字列変数に何らかの値を 割当てるまで、その長さは 0 になります。詳細については製品のドキュメントファ イルを参照してください。 C 開発者: キーバッファパラメータとしてキー値を含む変数のアドレスを渡す必要 が あ り ま す 。 BTITYPES.H フ ァ イ ル は キ ー バ ッ フ ァ を VOID ポ イ ン タ (BTI_VOID_PTR) として定義しています。アプリケーションでは、必要に応じて、 キーバッファのデータ型を定義することができます。 COBOL 開発者: キーバッファパラメータとしてレコード変数を渡す必要があります。 キーが複数のセグメントから構成されている場合は、01 レコードレベルよりも下の 個別フィールドとして、それらを正しい順序でリストしてください。これで、レ コード全体をキーバッファとして渡すことができます。 Btrieve API について 1-9 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 9 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 Pascal 開発者: キーバッファパラメータとしてキー値を含む変数を渡す必要があり ます。キーが複数のセグメントから構成されている場合は、レコード構造を使って キーに含まれる個別のフィールドを定義します。 たいていの環境では、アプリケーションが Btrieve 呼出しを実行するとき、 MicroKernel はキーバッファ長を決めることができません。このため、バッ ファがキーを最初に作成したときに指定したキー長と少なくとも同じであ ることを確認してください。そうでないと、Btrieve オペレーションにより、 メモリ内でキーバッファの後に格納されているデータが破壊される場合が あります。常に 255 バイトのキーバッファをセットしておくのも 1 つの方 法です。 キー番号 キー番号パラメータに渡す値は、実行するオペレーションによって異なり ます。たいていの場合、キー番号には特定のオペレーションに最大 119 あ るキー (アクセス) パスのどれが使用されているかを示す値を指定します。 しかし、ファイルのオープンモードを示す値のように、その他の情報が キー番号パラメータから渡されたり、キー番号パラメータに返される場合 もあります。 BTRV および BTRVID 関数の場合、キー番号パラメータは 2 バイト整数で す。また、BTRCALL、BTRCALLID、BTRCALL32、および BTRCALLID32 関数の場合、キー番号パラメータは 1 バイトの符号付き文字 (BTI_CHAR) です。すべての関数で、キー番号パラメータは 0 から 118 までの範囲の値 となります。Btrieve 関数がキー番号パラメータを変更することはありませ ん。 クライアント ID クライアント ID パラメータは BTRVID および BTRCALLID 関数でだけ使 用されます。クライアント ID パラメータは、MicroKernel がコンピュータ 上のクライアントを識別するために使用する 16 バイト構造体のアドレスで す。クライアント ID には次のような構造体を使用します。 1-10 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 10 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 表 1-2 クライアント ID 構造体 第 1 章 要素 長さ 説明 Filler 12 0 に初期化します。 Service Agent ID 2 MicroKernel に対するアプリケーションの各インスタンスを識別しま す。これは 2 文字の ASCII 値です。この識別子の値は ASCII 値の AA (0x41 0x41) 以上でなければなりません。次の値には特殊な意味があり ます。 0x4140 (@A) 内部的に使用されます。 0xFFFF 内部的に使用されます。 0x4952 (RI) 内部的に使用されます。 0x4553 (SE) Scalable SQL によって生成されたクライアント を識別するために使用されます。 0x4353 (SC) 0x4344 (DC) 0x4544 (DE) 0x5544 (DU) 0x5257 (WR) Client Identifier 2 Btrieve リクエスタによって使用されます。 アプリケーションの現在のインスタンスにおけるクライアントの ID を 確立します。MicroKernel では、この重複のない識別子を、並行処理お よびトランザクション処理のために使用します。 Btrieve クライアントとは、Btrieve 呼出しを実行するアプリケーション定義 のエンティティです。それぞれの Btrieve クライアントは Btrieve 呼出しを 実行することができ、MicroKernel に登録される独自のリソース (ファイル など) を保持します。また、MicroKernel では、各クライアントごとにトラ ンザクション (排他および並行トランザクション) のステータスを管理し ます。 注意 NetWare 開発者: Btrieve クライアントは必ずしも NetWare クライアントと同じもの ではありません。マルチタスクオペレーティングシステム上で動作する 1 台の NetWare クライアントマシンは、サーバベースの MicroKernel に対してリクエスト を行う 複数の Btrieve クラ イアン トを持 つこ とがで きます 。一方 、それ ぞれ の Btrieve クライアントは、NetWare クライアントマシン上で実行されている Btrieve アプリケーションのインスタンスです。サーバベースの MicroKernel では、それぞ れの Btrieve クライアントを独立したエンティティとして取り扱います。 Btrieve API について 1-11 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 11 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 次に、クライアント ID を使用すると便利な状況の例を示します。 ◆ 同時に複数のトランザクションを処理するマルチスレッド対応のアプ リケーションを開発しているとします。それぞれの Begin Transaction オペレーションについて、アプリケーションは異なるクライアント ID を指定します。このため MicroKernel では、各クライアント ID に 対して個別のトランザクションのステータスを管理することができま す。 ◆ 2 つのクライアント ID を使用し、それぞれのクライアント ID につい て複数のファイルをオープンするアプリケーションを開発していると します。このアプリケーションは BTRVID または BTRCALLID を 使 っ て Reset オ ペ レ ー シ ョ ン を 実 行 す る こ と が で き る た め 、 MicroKernel では指定された一方のクライアント ID に対して複数の ファイルをクローズし、リソースを解放することができます。 ◆ 複数のインスタンスを同時に実行できるようなアプリケーションを開 発しているとします。アプリケーションデータの整合性を得るため、 MicroKernel ではすべてのインスタンスを独立したクライアントとし て取り扱う必要があります。この状況では、アプリケーションのどの インスタンスが呼出しを実行したかに関係なく、アプリケーションは 各 Btrieve 呼出しに対して同一のクライアント ID を指定します。 ◆ DDE (Dynamic Data Exchange) サーバとして動作するアプリケーショ ンを開発しているとします。Btrieve 呼出しを実行するサーバアプリ ケーションでは、サーバアプリケーションに対するリクエストを開始 したアプリケーション間で返された情報を分割する必要があります。 この状況では、サーバアプリケーションはリクエストを行った各アプ リケーションに異なるクライアント ID を割当てることができ、複数 のクライアントに分散された情報を追跡する方法が提供されます。 キー長 キ ー 長 パ ラ メ ー タ は 、 BTRCALL 、 BTRCALLID 、 BTRCALL32 、 お よ び BTRCALLID32 関数でだけ使用され、しかも OS/2 および Windows v3.x オペ レーティングシステムだけで使用されます。 キー長パラメータは現在のところ MicroKernel による内部的な使用のため だけに用意されていますが、アプリケーションが BTRCALL、BTRCALLID、 1-12 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 12 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 BTRCALL32、または BTRCALLID32 を呼出す場合は、キー長パラメータと して、255 (キーの最大長) という値を含む符号なし文字 (BTI_BYTE) を渡 す必要があります。 Btrieve API について 1-13 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 13 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 Btrieve オペレーションの概要 Btrieve には、アプリケーションプログラムから呼出すことのできる 40 種 を超えるオペレーションが用意されています。次の表に、これらのオペ レーションの概要を示します。Btrieve オペレーションの詳細については、 第 2 章 「Btrieve オペレーション」を参照してください。 セッション固有のオペレーション 次のオペレーションを使用すると、カレントディレクトリの設定と取得、 ワークステーション MicroKernel のシャットダウン、MicroKernel のバー ジョン番号の取得、サーバ MicroKernel に接続されているクライアントの 終了、トランザクションの開始、終了、または中止といった処理を実行で きます。マルチクライアントを処理するアプリケーションの場合、これら のオペレーションは呼出し元のクライアントに固有なものとなります。 表 1-3 セッション固有のオペレーション オペレーション コード 説明 Set Directory 17 カレントディレクトリを変更します。 Get Directory 18 カレントディレクトリを取得します。 Stop 25 MicroKernel を終了します (サーバベースの MicroKernel では使用でき ません)。 Version 26 MicroKernel のバージョン番号を取得します。 Reset 28 クライアントによって保持されているすべてのリソースを解放しま す。 Begin Transaction 19 論理的に関連するオペレーションのセットの先頭を示します。オペ レーション 19 は排他トランザクションを開始し、オペレーション 1019 は並行トランザクションを開始します。 1019 End Transaction 20 論理的に関連するオペレーションのセットの末尾を示します。 Abort Transaction 21 完了しなかったトランザクション中に実行されたオペレーションを削 除します。 1-14 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 14 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 ファイル固有のオペレーション 次のオペレーションは特定のファイルを取り扱います。このため、オペ レーションの対象となるファイルを識別するためにポジションブロックパ ラメータが使用されます。ファイル固有のオペレーションは次の 3 つのタ イプに分類されます。 ◆ ファイルアクセスと情報。これらのオペレーションを使用すると、 ファイルの作成、ファイルのオープンとクローズ、ファイル情報の取 得、ファイルのオーナネームの設定とクリア、ファイルに対する Continuous オペレーションモードの開始と停止、ファイルのロック解 除、ファイルに対するインデックスの作成と削除といった処理を実行 できます。 ◆ データ取得。これらのオペレーションを使用すると、指定した検索条 件に従ってシングルレコードまたはレコードのセットを取得できます。 Btrieve ではインデックスパス内の論理ロケーションまたは物理ロ ケーションによるデータ検索がサポートされています。詳細について は、『Btrieve Programmer's Guide』の「レコードへのアクセス」を参 照してください。 また、オペレーションコードにバイアスを適用して、マルチクライア ント環境でのファイルとレコードのロックを制御することもできます。 詳細については、『Btrieve Programmer's Guide』の「マルチクライア ントのサポート」を参照してください。 ◆ データ操作。これらのオペレーションを使用すると、データの挿入、 更新、または削除を行うことができます。 表 1-4 ファイルアクセスおよび情報オペレーション オペレーション コード 説明 Open 0 ファイルをアクセス可能な状態にします。 Close 1 ファイルをアクセスできない状態にします。 Create 14 指定したスペックを持つファイルを作成します。 Stat 15 ファイルとインデックスのスペック、およびレコード件数などを取得しま す。 Set Owner 29 ファイルにオーナネームを割当てます。 Clear Owner 30 ファイルからオーナネームを削除します。 Btrieve API について 1-15 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 15 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 オペレーション コード 説明 Continuous Operation 42 サーバベースの MicroKernel だけで使用します。システムバックアップに使 用するため、指定されたファイルを Continuous オペレーションモードに入 れたり、Continuous オペレーションモードから解除します。 Unlock 27 レコードのロックを解除します。 Create Index 31 インデックスを作成します。 Drop Index 32 インデックスを削除します。 表 1-5 データ取得オペレーション オペレーション コード 説明 インデックスベースの (論理) データ検索 Get Equal 5 指定されたキー値と同じキー値を持つレコードを取得します。 Get Next 6 インデックスパスでカレントレコードの後にあるレコードを取得しま す。 Get Previous 7 インデックスパスでカレントレコードの前にあるレコードを取得しま す。 Get Greater 8 指定されたキー値より大きいキー値を持つレコードを取得します。 Get Greater Than or Equal 9 指定されたキー値以上のキー値を持つレコードを取得します。 Get Less Than 10 指定されたキー値より小さいキー値を持つレコードを取得します。 Get Less Than or Equal 11 指定されたキー値以下のキー値を持つレコードを取得します。 Get First 12 指定されたインデックスパスの先頭のレコードを取得します。 Get Last 13 指定されたインデックスパスの末尾のレコードを取得します。 Get Next Extended 36 インデックスパスでカレントレコードの後にある 1 つまたは複数のレ コードを取得します。フィルタ条件を適用できます。 Get Previous Extended 37 インデックスパスでカレントレコードの前にある 1 つまたは複数のレ コードを取得します。フィルタ条件を適用できます。 Get Key +50 実際のレコードを返すことなく、ファイル内に特定のキー値が存在す るかどうかを検出します。 Get By Percentage 44 指定されたパーセンテージの値に対応するポジションの最も近くにあ るレコードを取得します。 Find Percentage 45 ファイル内でのカレントレコードのポジションに基づくパーセンテー ジの値を取得します。 非インデックスベースの (物理) データ検索 Get Position 22 カレントレコードのポジションを取得します。 1-16 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 16 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 オペレーション コード 説明 Get Direct/Chunk 23 指定されたポジションにあるレコードの指定部分 (チャンク) から データを取得します。 Get Direct/Record 23 指定されたポジションにあるレコードを取得します。 Step Next 24 物理的にカレントレコードの後にあるレコードを取得します。 Step First 33 ファイル内で物理的に先頭のロケーションにあるレコードを取得しま す。 Step Last 34 ファイル内で物理的に末尾のロケーションにあるレコードを取得しま す。 Step Previous 35 物理的にカレントレコードの前にあるレコードを取得します。 Step Next Extended 38 物理的にカレントレコードの後のロケーションから 1 つまたは複数の 連続するレコードを取得します。フィルタ条件を適用できます。 Step Previous Extended 39 物理的にカレントレコードの前のロケーションから 1 つまたは複数の 連続するレコードを取得します。フィルタ条件を適用できます。 Get By Percentage 44 指定されたパーセンテージの値に対応するポジションの最も近くにあ るレコードを取得します。 Find Percentage 45 ファイル内でのカレントレコードのポジションに基づくパーセンテー ジの値を取得します。 並行トランザクションのバイアス シングルレコードウェ イトロック 1 +100 一度に 1 つのレコードだけをロックします。対象となるレコードが既 にロックされていると、このオペレーションは再試行されます。 シングルレコードノー ウェイトロック +200 一度に 1 つのレコードだけをロックします。対象となるレコードが既 にロックされていると、ステータスコードが返されます。 マルチレコードウェイ トロック 1 +300 同じファイルに含まれる複数のレコードを並行的にロックします。対 象となるレコードが既にロックされていると、このオペレーションは 再試行されます。 マルチレコードノー ウェイトロック +400 同じファイルに含まれる複数のレコードを並行的にロックします。対 象となるレコードが既にロックされていると、ステータスコードが返 されます。 ノーウェイトページ ロック +500 並行トランザクションで、変更しようとしたページが現在アクティブ な別の並行トランザクションによって既に変更されている場合、 MicroKernel にウェイトしないように指示します。このバイアスは、任 意のレコードロックバイアス (+100、+200、+300、または +400) と組 み合わせて使用することができます。 1 Windows v3.x 環境では実際にはウェイトは行われません。 Btrieve API について 1-17 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 17 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 表 1-6 データ操作オペレーション オペレーション コード 説明 Insert 2 ファイルに新しいレコードを挿入します。 Update 3 カレントレコードを更新します。 Delete 4 ファイルからカレントレコードを削除します。 Insert Extended 40 ファイルに 1 つまたは複数のレコードを挿入します。 Update Chunk 53 カレントレコードの指定された部分 (チャンク) を更新します。この オペレーションにより、レコードにデータを追加したり、レコードか らデータを削除することができます。 1-18 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 18 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 Btrieve オペレーションを実行するときのイベントのシーケンス ➣ Btrieve オペレーションを実行するため、アプリケーションでは次のタスク を完了する必要があります。 1. オペレーションが要求する必要条件を満足させます。たとえば、何らか のファイル I/O オペレーションを実行する前に、対象となるファイルに Open オペレーション (0) を実行し、そのファイルにアクセスできる状 態にしておく必要があります。 2. Btrieve オペレーションが要求するパラメータを初期化します。パラ メータとはプログラム変数またはデータ構造体のことで、そのデータ型 とサイズは指定したオペレーションの実行に必要な特定の値に対応して いなければなりません。 将来の互換性を維持するため、使用するかどうかに関係なく、すべての パラメータを初期化するようにしてください。INTEGER 型のパラメー タでは、値としてバイナリ 0 をセットします。また文字配列では、バッ ファへのポインタを渡します。この場合は、バッファの先頭バイトにバ イナリ 0 をセットしてください。 3. 適切な Btrieve 関数を呼び出します (詳細については、「Btrieve 関数」 を参照してください)。 4. 関数呼出しの実行結果を評価します。Btrieve オペレーションを実行す ると必ずステータスコードが返されます。アプリケーションでは、返さ れたステータスコードをチェックして、適切な操作を行う必要がありま す。また、オペレーションの目的により、各パラメータにはデータやそ の他の情報が返されます。 Btrieve API について 1-19 TONBO: W 176 × H 227 FILE NAME: BT7-R1.DOC PAGE: 19 OF 19 LAST SAVED: 98/03/05 16:21 BY: M PRINTED: 98/03/05 16:22 第 1 章 第 2 章 Btrieve オペレーション この章では、アプリケーションが Btrieve API を使って実行できるオペレー ションについて説明します。それぞれのオペレーションについて、この章 では次の情報を示します。 ◆ オペレーションの名前、コード、および説明。 ◆ パラメータ − オペレーションとアプリケーションとの間でやり取り する 6 つのパラメータ値を一覧表で示します。「センド」パラメータ はアプリケーションからオペレーションに送られます。また、「リ ターン」パラメータは、オペレーションが完了したときに、オペレー ションからアプリケーションに返されます。 ◆ 必要条件 − オペレーションを正常に実行するために必要な条件を示 します。 ◆ 手順 − オペレーションが要求するパラメータを初期化する手順を示 します。 ◆ 詳細 − オペレーションに関する追加情報。 ◆ 実行結果 − オペレーションが正常に終了した場合と、何らかのエ ラーが発生した場合の実行結果を示します。それぞれのオペレーショ ンは、オペレーションの実行結果をアプリケーションに通知するス テータスコードを返します。ステータスコード 0 はオペレーションが 正常に終了したことを示します。一般に、0 以外のステータスコード は何らかのエラーが発生したことを示します。ただし、0 以外のス テータスコードの中には、単に情報を伝えるだけで、関連するオペ レーションが正常に終了したときにも表示されるものがあります。た とえば、ステータスコード 60 はリジェクト最大数に到達したことを 意味します。 ◆ ポジショニング − ファイル内のレコードの論理/物理カレンシーに 対するオペレーションの影響を示します。 Btrieve オペレーション 2-1 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 1 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Abort Transaction (21) 現在のトランザクションを終了し、そのトランザクションの開始以降に実 行されたすべてのオペレーションの結果を削除します。また、トランザク ションによって設定されたすべてのファイルとレコードのロックを解除し ます。 パラメータ オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ キー番号 × センド リターン 必要条件 Abort Transaction オペレーションを実行する前に、Begin Transaction オペ レーション (19 または 1019) が正常に実行されている必要があります。 手順 オペレーションコードに 21 を設定します。Abort Transaction 呼出しに他の パラメータを設定しても、すべて無視されます。 実行結果 Abort Transaction オペレーションが正常に終了すると、ステータスコード 0 が返されます。トランザクションの開始以降に実行されたすべての Insert、 Update、および Delete オペレーションの結果がファイルから削除されます。 Abort Transaction オペレーションが正常に実行されなかった場合は、主に次 のステータスコードのいずれかが返されます。 36 トランザクションエラーが発生しました。 39 End/Abort Transaction の前には Begin Transaction オペレー ションを実行しなければなりません。 ポジショニング Abort Transaction オペレーションはファイルのカレンシー情報にまったく影 響しません。 2-2 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 2 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Begin Transaction (19 または 1019) トランザクションの開始を宣言します。複数の Btrieve オペレーションを 1 つのイベントとして実行する必要があるときは、トランザクションを使用 すると便利です。たとえば、複数のオペレーションのうち少なくとも 1 つ でも異常終了すると、データベースの論理的整合性が保てなくなる場合に は、トランザクションを使用してください。 1 組みのオペレーションを Begin Transaction と End Transaction で囲んでおく と、明示的な End Transaction オペレーション (20) でトランザクションが 完了しないかぎり、その間に実行された複数のオペレーションをすべて無 効にすることができます。 ファイルやパフォーマンスに対する影響が大きすぎるため、トランザク ション中に一部のオペレーションの使用は禁止されています。このような オペレーションには、Set Owner、Clear Owner、Create Index、Drop Index、 および Close (トランザクション中に更新されたファイルを対象とする) が あります。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ キー番号 × リターン 必要条件 Begin Transaction オペレーションを発行する前に、先行するトランザク ションが終了または中止されている必要があります。 手順 オペレーションコードに 19 を設定して排他トランザクションを開始するか、 オペレーションコードに 1019 を設定して並行トランザクションを開始しま す。Begin Transaction 呼出しに他のパラメータを設定しても、すべて無視さ れます。 アプリケーションから Begin Transaction オペレーションを呼出すとき、そ のアプリケーションではデフォルトのロックバイアスを指定できます。 実行結果 Begin Transaction オペレーションが正常に終了すると、ステータスコード 0 が返されます。 Btrieve オペレーション 2-3 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 3 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Begin Transaction オペレーションが正常に実行されなかった場合は、主に次 のステータスコードのいずれかが返されます。 ポジショニング 36 トランザクションエラーが発生しました。 37 別のトランザクションが実行中です。 Begin Transaction オペレーションはファイルのカレンシー情報にまったく影 響しません。 2-4 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 4 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Clear Owner (30) それまでに Set Owner オペレーションを使ってファイルに割当ててある オーナネームを削除します。データがあらかじめ暗号化されている場合、 Clear Owner オペレーションの実行中にデータの非暗号化も行われます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × キー番号 × リターン 必要条件 データバッファ長 キーバッファ ◆ 対象となるファイルがオープンされている必要があります。 ◆ トランザクションが実行中でないことが必要です。 手順 1. オペレーションコードに 30 を設定します。 2. 対象となるファイルを識別するポジションブロックを渡します。 実行結果 Clear Owner オペレーションが正常に実行されると、それ以降、そのファイ ルをオープンしたり変更したりするときにオーナネームを要求されなくな ります。オーナを割当てたときにファイルのデータを暗号化している場合、 Clear Owner オペレーションの実行中にデータの非暗号化も行われます。暗 号化されているデータが多いほど、Clear Owner オペレーションの実行には 時間がかかります。 Clear Owner オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 41 ポジショニング ファイルがオープンされていません。 実行しようとした操作は許可されていません。 Clear Owner オペレーションはファイルのカレンシー情報にまったく影響し ません。 Btrieve オペレーション 2-5 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 5 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Close (1) 指定されたポジションブロックに関連づけられているファイルをクローズ し、そのファイルに対して実行されたロックをすべて解除します。ファイ ルへのアクセスを終了するとき、アプリケーションでは必ず Close オペ レーションを実行する必要があります。Close オペレーションの実行後は、 もう一度 Open オペレーション (0) を発行するまで、そのファイルにはア クセスできなくなります。 次の状況ではファイルをクローズできません。 ◆ 排他トランザクション中に、ユーザがファイルの読み込みまたは変更 を行っている場合 (この場合はトランザクションを終了または中止し てください)。 ◆ 並行トランザクション中に、ロックバイアスを含むオペレーションを 使ってユーザがファイルの読み込みまたは変更を行っている場合。 ロックバイアスは、オペレーションに直接指定されている場合と (た とえば、マルチレコードノーウェイトロックを含む Get Next Extended、 オペレーションコードは 436)、Begin Transaction オペレーションから 引き継いでいる場合があります (たとえば、シングルレコードノー ウ ェ イ ト ロ ッ ク を 含 む 並 行 ト ラ ン ザ ク シ ョ ン を 開 始 す る Begin Transaction、オペレーションコードは 1219)。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × データバッファ長 キーバッファ キー番号 リターン 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ ファイルがアプリケーションのアクティブなトランザクションに含ま れていてはいけません。 手順 1. オペレーションコードに 1 を設定します。 2. クローズするファイルに対応する有効なポジションブロックを渡します。 実行結果 Close オペレーションが正常に終了すると、クローズしたファイルに対応す るポジションブロックは有効でなくなります。アプリケーションでは、こ 2-6 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 6 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 のポジションブロックを別のファイルに使用したり、そのデータ領域を他 の目的のために使用できるようになります。 Close オペレーションが正常に実行されなかった場合は、主に次のステータ スコードのいずれかが返されます。 3 41 ポジショニング ファイルがオープンされていません。 実行しようとした操作は許可されていません。 Close オペレーションは対象となるファイルの物理/論理カレンシー情報を すべて削除します。 Btrieve オペレーション 2-7 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 7 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Continuous Operation (42) アクティブな Btrieve ファイルをクローズすることなくシステムバックアッ プを実行することを可能にします。ファイルのバックアップ中に加えた変 更はデルタファイルと呼ばれるテンポラリファイルに格納されます。デル タファイルに書き込まれた変更を除き、Continuous オペレーションモード に置かれたすべてのファイルの内容がシステムバックアップの対象となり ます。これらのファイルが Continuous オペレーションモードから抜けると、 デルタファイルの変更が自動的にバックアップファイルに反映されます。 またこのオペレーションを使用すると、アクティブなファイルをコピーす ることもできます 注意 このオペレーションはサーバベースの MicroKernel でだけ使用できます。 パラメータ オペレーション ポジション データ コード ブロック バッファ × センド リターン 注意 データバッファ長 キーバッファ × × × × キー番号 × キー番 号パ ラメー タが 0 (Continuous オ ペレ ーシ ョンを 開始 します ) ま たは 2 (Continuous オペレーションを終了します) の場合のみ、データバッファおよびデー タバッファ長パラメータの値が必要になります。ここでは、これらのキー番号値に ついて説明します。キー番号パラメータが 1 の場合、データバッファ長にはゼロを 設定する必要があります。 手順 ➣ Continuous オペレーションモードを開始するには、次の操作を行います。 1. バックアップの対象となるファイルまたはファイルのセットを定義する か、目的のファイルを現在バックアップの対象として定義されている ファイルのセットに追加します。 a. オペレーションコードに 42 を設定します。 b. Continuous オペレーションモードに置くファイルの名前をデータ バッファパラメータに設定します。サーバ名のみを除き、ファイル のフルパス名を指定します。次の例のように、ファイル名の間はカ ンマで区切り、ファイル名のリストはバイナリ 0 で終端させます。 2-8 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 8 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 sys:¥acct¥march.btr,sys:¥acct¥april.btr<バイナリ 0> c. ファイル名の長さをデータバッファ長パラメータに設定します。こ の値は、データバッファそのものに含まれるファイル名の実際の長 さ以上でなければなりません。たとえば前述の例では、データバッ ファ長に 40 以上の値を設定する必要があります。 d. キー番号パラメータに 0 を設定します。 2. バックアップを実行します。 3. Continuous オペレーションモードを終了します。 a. オペレーションコードに 42 を設定します。 b. キー番号パラメータに 1 を設定します。 特定のファイルを対象に Continuous オペレーションを終了するには、 キー番号パラメータに 2 を設定し、操作手順 1.b に従って、対象と なるファイル名をデータバッファパラメータに設定します。また、 操作手順 1.c に従って、ファイル名の長さをデータバッファ長パラ メータに設定します。 詳細 バックアップするファイルのセットを定義するときには、次の点に注意し てください。 ◆ データバッファにファイル名が設定されていなくても、エラーとは見 な さ れ ま せ ん 。 フ ァ イ ル 名 が 検 出 さ れ な い 場 合 、 MicroKernel は Continuous オペレーションに対して何のアクションも実行しません。 ◆ データバッファに設定したファイル名が重複していても、Continuous オペレーションの動作にはまったく影響しません。指定したファイル は 1 度だけ Continuous オペレーションモードに置かれます。 ◆ ファイル名が同じでファイル拡張子だけが異なる複数のファイルを指 定することはできません。これは、デルタファイルの名前に、対応す るファイルのファイル名と、「.^^^」というファイル拡張子を使用す るためです。 ◆ アプリケーションでは、Continuous オペレーションを反復的に呼出し て、Continuous オペレーションモードに置くファイルのリストに新し いファイルを追加することができます。ただし、Scalable SQL によっ てファイルの一部に参照整合性 (RI) 制約が設定されていると、この 操作によりバックアップエラーが発生する場合があります。 Btrieve オペレーション 2-9 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 9 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 既に Continuous オペレーションモードに入っているファイルを指定 すると、ステータスコード 88 が返されます。 Continuous オペレーションを呼出すサーバベースのアプリケーションを開 発するときには、BTRVID を呼出していることと、有効なクライアント ID を使用していることを確認してください。こうすれば、同一クライアント のもとで Continuous オペレーションの開始と終了を確実に行えるようにな ります。 Btrieve では、BTRVID 関数経由でそれぞれのバックアップセットに異なる クライアント ID を指定し、複数のバックアップセットを定義することがで きます。ただし、複数のセットに同じファイルが重複して含まれていては いけません。 MicroKernel によりデルタファイルからデータファイルに変更内容が反映さ れている間も、ユーザは通常通りに Btrieve ファイルの更新、挿入、および 読み込みを行うことができます。変更内容の反映を行っている間も、必要 な場合はデルタファイルに新しいページが追加されます。このため、変更 内容が失われることはありません。 注意 デルタファイルは絶対に手動で削除しないでください。 ア プ リ ケ ー シ ョ ン が BTRV 関 数 を 使 用 し て い る 場 合 は 、 フ ァ イ ル が Continuous オペレーションモードに入っているときにそのアプリケーショ ンをアンロードしないでください。もしアンロードを行ってしまうと、対 象となるファイルを Continuous オペレーションモードから解除できなく なってしまうことがあります。これは、対象となるファイルのオーナとし て最初に割当てられたデフォルトのクライアント ID が別のアプリケーショ ンに再割当てされてしまう可能性があるためです。対象となるファイルの 正しいオーナがわからなくなってしまうため、それらのファイルを Continuous オペレーションモードから解除できなくなってしまうというこ とです。 Continuous オペレーションモードに入るのに失敗したとき、あるいはデル タファイルからデータファイルに変更内容の反映を行っているときにシス テムクラッシュが発生すると、システムの再起動後にはじめてファイルを オープンしたとき、すべての変更内容がそのファイルに反映されます。 2-10 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 10 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 実行結果 Continuous オペレーションが正常に終了すると、ステータスコード 0 が返 されますが、データバッファまたはデータバッファ長パラメータには何の 値も返されません。 Continuous オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 11 指定されたファイル名は不正です。 12 指定されたファイルがありません。 41 実行しようとした操作は許可されていません。 51 オーナネームが不正です。 88 不一致モードエラーが発生しました。 91 サーバエラーです。 3024 指定されたオペレーションコードはリモートエンジンに対し て許可されていません。 これらのコードに加えて、アプリケーションからステータスコード 18 のよ うな標準 I/O エラーコードが返されることもあります。 ワークステーションアプリケーションから Continuous オペレーションを呼 出そうとすると、ステータスコード 3024 が返されます。 0 以外のステータスコードが返される場合、Continuous オペレーションは データバッファにエラーを発生させた入力文字列の一部を返します。入力 文字列が使用されていない場合は、データバッファにエラーの原因となっ たファイル名が返されます。またデータバッファ長には、データバッファ に返された出力文字列の長さが反映されます。この場合はエラーの原因と なったファイル名の長さが返されます。 ポジショニング Continuous オペレーションは対象となるファイルのカレンシーを確立しま せん。 Btrieve オペレーション 2-11 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 11 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Create (14) アプリケーションの内部からファイルを生成します。 パラメータ オペレーション ポジション データ コード ブロック バッファ センド × データバッファ長 キーバッファ × × キー番号 × × リターン 必要条件 既存のファイルに対して空白の新規ファイルを作成する場合は、Create オ ペレーションを実行する前に既存のファイルがクローズされていることを 確認してください。 手順 1. オペレーションコードに 14 を設定します。 2. 「詳細」の説明に従って、ファイルスペック、キースペック、およびオ ルタネートコレーティングシーケンスをデータバッファに指定します (データバッファに格納するファイルスペックとキースペックに対する すべての値はバイナリ形式で指定する必要があります)。 3. データバッファ長を設定します。これは、Create スペックを含むバッ ファの長さであり、ファイルに含まれるレコードの長さではありません。 4. 作成するファイルのパス名をキーバッファに設定します。パス名の末尾 は必ずブランクまたはバイナリゼロで終端させます。パス名は、ボ リューム名と区切り文字を含めて、半角 80 文字までの範囲で指定でき ます。 注意 アプリケーションと Scalable SQL との互換性を維持する場合は、半角 64 文字まで の範囲でパス名を指定してください。 5. 同じ名前のファイルが存在するかどうかをチェックする場合は、キー番 号パラメータに -1 を設定します。そうでない場合は、キー番号パラ メータに 0 を設定します。 詳細 表 2-1 に、ファイルおよびキースペックを格納する順序を示します。 2-12 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 12 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 表 2-1 Create オペレーションのデータバッファ構造 要素 ファイルスペック 説明 符号なし データ型 1 長さ (バイト単位) 論理レコード長 short int 2 ページサイズ short int 2 インデックス数 short int 2 予約済み char 4 ファイルフラグ short int 2 予約する重複ポインタ数 char 1 未使用 char 1 アロケーション short int 2 キースペック キーポジション (各 キ ー セ グ メ ン ト に ついて繰り返します) short int 2 キー長 short int 2 キーフラグ short int 2 予約済み char 4 拡張キータイプ char 1 ヌル値 char 1 未使用 char 2 手動割当てキー番号 char 1 ACS (オルタネートコレーティングシーケンス) 番号 char 1 ACS 番号 0 ACS char 265 . . char . . . char . . . char . ACS 番号 x ACS char 265 1 説明を簡略にするため、この表では C 言語のデータ型を示しています。他の言語の データ型の一覧については、表 A-2 を参照してください。 Btrieve オペレーション 2-13 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 13 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 注意 Create オペレーションでは使用されませんが、データバッファの「未使用」および 「予約済み」領域を割当てる必要があります。将来のバージョンとの互換性を維持す るため、予約済み領域には 0 を設定してください。 ファイルスペック データバッファの先頭 16 バイトにはファイルスペックを格納します。各バ イトには 0 で始まる番号が付けられています。レコード長、ページサイズ、 インデックス数は整数として格納します。データオンリーファイルを作成 するには、インデックス数を 0 に設定します。 ファイル属性は、ファイルフラグワードのビットをセットして指定します。 表 2-2 に、ファイルフラグの値をバイナリ、16 進、および 10 進で示しま す。 表 2-2 ファイルフラグの値 属性 バイナリ 可変長レコード XXXX XXXX XXXX XXX1 01 1 ブランクトランケーション XXXX XXXX XXXX XX1X 02 2 ページプリアロケーション XXXX XXXX XXXX X1XX 04 4 データ圧縮 XXXX XXXX XXXX 1XXX 08 8 キーオンリーファイル XXXX XXXX XXX1 XXXX 10 16 インデックスバランス XXXX XXXX XX1X XXXX 20 32 10%のフリースペースを確保 XXXX XXXX 01XX XXXX 40 64 20%のフリースペースを確保 XXXX XXXX 10XX XXXX 80 128 30%のフリースペースを確保 XXXX XXXX 11XX XXXX C0 192 重複ポインタを予約する XXXX XXX1 XXXX XXXX 100 256 システムデータを含める XXX0 XX1X XXXX XXXX 200 512 システムデータを含めない XXX1 XX1X XXXX XXXX 1100 4,352 システムデータを含めるときに MicroKernel の環境設定を使用 XXX0 XX0X XXXX XXXX 0 0 キー番号 XXXX X1XX XXXX XXXX 400 1,024 VAT の使用 XXXX 1XXX XXXX XXXX 800 2,048 2-14 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 14 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 16 進 10 進 未使用ビットは将来使用するために予約されています。このビットには 0 をセットします。 ファイル属性を組み合わせるには、対応するファイルフラグの値を加算し ます。たとえば、可変長レコードを含み、ブランクトランケーションを行 うファイルを作成するには、ファイルフラグワードに 3 (2+1) を設定しま す。可変長レコードビットに 0 がセットされていると、ブランクトラン ケーションとフリースペース確保のビットは無視されます。 ページプリアロケーションビットがセットされている場合、ファイルス ペックブロックの最後の 2 バイト (アロケーション) を使って、ファイル にプリアロケートするページ数を指定する整数値を格納します。データ圧 縮ビットをセットしている場合、可変長レコードビットは無視されます。 キーオンリーファイルビットをセットしている場合、システムデータビッ トは無視されます。 ファイルを作成した後でインデックスの追加が予想され、かつそのイン デックスに多数の重複した値が含まれる場合は、重複ポインタビットを セットします。このビットをセットすると、重複した値をリンクするポイ ンタのためにファイルの各レコードにはスペースが確保されるようになり ます。このようなスペースを確保することにより、検索時間を短縮し、 ディスクスペースを節約できる場合があります (特に、キーが長く、多数 のレコードが重複するキー値を持つことが予想される場合)。 注意 重複ポインタスペースは、ファイル作成後に追加されるインデックスだけを対象に 予約できます。したがって、値が重複するポインタのためにスペースを確保すると きは、Create オペレーションの実行中に作成されるインデックスのスペースを含め ないでください。また、繰り返し重複キーとして指定するキーには、重複ポインタ スペースは確保されません。 あるキーに特定のキー番号を割当て、キースペックブロックの手動割当て キー番号要素 (オフセット 0x0E) に目的のキー番号を配置する必要がある 場合は、キー番号ビットをセットします。MicroKernel ではキー番号が連続 している必要はありません。つまり、ファイルではキー番号が飛び飛びに なっていてもかまいません。キーが作成されるとき、デフォルトの設定で そのインデックスで使用可能な最小のキー番号 (0 から始まります) が自動 Btrieve オペレーション 2-15 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 15 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 的に割当てられます。ただし、アプリケーションによってはデフォルトの 割当てとは異なるキー番号が必要なこともあります。 ファイルが可変長部割当てテーブル (VAT) を使用する場合は、VAT 使用 ビットをセットします。VAT を使用するには、ファイル内で可変長レコード が使用されている必要があります。 キースペックブロック キースペックブロックはファイルスペックの直後に配置します。ファイル 内の各キーセグメントに対して、それぞれ 16 バイトのキースペックブロッ クを割当てます。キーポジションとキー長に対する情報は整数として格納 します。 キーポジション キーポジションはキーが始まる位置のバイトオフセッ トです。 キーフラグ キー属性は、キーフラグワードのビットをセットして指定 します。表 2-3 に、キーフラグの値をバイナリ、16 進、および 10 進で示 します。 表 2-3 キーフラグの値 属性 バイナリ 16 進 10 進 リンク重複 XXXX XXXX XXXX XXX1 01 1 変更可能キー値 XXXX XXXX XXXX XX1X 02 2 旧形式の BINARY データ型を使用 XXXX XXX0 XXXX X1XX 04 4 旧形式の STRING データ型を使用 XXXX XXX0 XXXX X0XX 0 0 ヌルキー (全セグメント) XXXX XXXX XXXX 1XXX 08 8 セグメントキー XXXX XXXX XXX1 XXXX 10 16 デフォルトの ACS を使用 XXXX 00XX XX1X XXXX 20 32 ファイル内の番号付き ACS の使用 XXXX 01XX XX1X XXXX 420 1,056 名前付き ACS の使用 XXXX 11XX XX1X XXXX C20 3,104 降順ソート XXXX XXXX X1XX XXXX 40 64 繰り返し重複 XXXX XXXX 1XXX XXXX 80 128 拡張キータイプの使用 XXXX XXX1 XXXX XXXX 100 256 ヌルキー (一部セグメント) XXXX XX1X XXXX XXXX 200 512 2-16 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 16 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 属性 バイナリ 大小文字無視 XXXX X1XX XXXX XXXX 16 進 10 進 400 1,024 未使用ビットは将来使用するために予約されています。このビットには 0 を設定します。 キー属性を組み合わせるには、対応するキーフラグの値を加算します。た とえば、キーが拡張キータイプで、セグメントキーの一部であり、さらに 降順に照合される場合は、キーフラグワードに 336 (256 + 16 + 64) を設定 します。 セグメントキー属性は、データバッファ内の次のキースペックブロックが 同じキーの次のセグメントであることを示します。セグメントキーは次の 規則に従ってください。 ◆ 同じキーのすべてのセグメントは、同一のリンク重複、繰り返し重複、 変更可能キー値、およびヌルキー属性を持っていなければなりません (全セグメントまたは一部セグメントのヌルキー属性を指定する場合、 個別のセグメントに対して異なるヌル値を割当てることができます)。 ◆ 同じキーのすべてのセグメントは同一の ACS を使用する必要があり ます。 ◆ 同じキーの各セグメントは、降順ソートおよび拡張キータイプ属性に ついて異なる値を持つことができます。 ACS は、STRING、LSTRING、および ZSTRING 型のキーにのみ適用されま す。大小文字を無視し、ACS を使用するキーを定義することはできません。 あるキーが一部のセグメントにのみ適用される ACS を持っているファイル の場合、ACS が指定されているセグメントはその ACS に従ってソートされ、 ACS のないセグメントはそれぞれのデータ型に従ってソートされます。 拡張キータイプ(データ型) キースペックブロックの拡張キータイプ (オフセット 0x0A) はバイナリ値として指定します。表 2-4 に、それぞれの 拡張キータイプに対応するコードを示します。 Btrieve オペレーション 2-17 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 17 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 表 2-4 拡張キータイプ データ型 コード データ型 コード STRING 0 BFLOAT 9 INTEGER 1 LSTRING 10 FLOAT 2 ZSTRING 11 DATE 3 UNSIGNED BINARY 14 TIME 4 AUTOINCREMENT 15 DECIMAL 5 NUMERICSTS 17 MONEY 6 NUMERICSA 18 LOGICAL 7 CURRENCY 19 NUMERIC 8 TIMESTAMP 20 拡張キータイプコードの 12、13、16 は将来使用するために予約されていま す。 STRING および UNSIGNED BINARY データ型は標準また拡張型として定義 できます。これにより、Btrieve の以前のバージョンで開発したアプリケー ションとの互換性を維持しつつ、新しいアプリケーションでは排他的に拡 張キータイプを使用できるようになります。 キーに割当てるデータ型に関して、Btrieve は入力されたレコードがキーに 定義されているデータ型に従っているかどうかを確認しません。たとえば、 あるファイルで TIMESTAMP 型のキーを定義することはできますが、そこ に文字列を格納することもできます。この場合も、Btrieve アプリケーショ ンは特に問題なく動作しますが、ODBC TIMESTAMP フォーマットを使っ て同じデータにアクセスしようとすると ODBC アプリケーションは正常に 動作しません。これは、バイトフォーマットが異なり、タイムスタンプ値 を生成するために使用するアルゴリズムが異なるためです。データ型の詳 細については、『Btrieve User's Guide』を参照してください。 ヌル値 キースペックブロックのオフセット 0x0B はキーに対する排除 値を表します。キーをヌルキーと定義した場合、MicroKernel に各キーセグ メントのヌル値として認識させる値を指定する必要があります。 手動割当てキー番号 MicroKernel を使用すると、アプリケーションはイ ンデックスを含むファイルを作成するときに特定のキー番号を割当てるこ 2-18 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 18 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 とができます。ファイルの各インデックスに手動でキー番号を割当てるに は、各キーの番号を、キースペックブロックのバイト 14 (0x0E) のバイナ リ値として指定し、ファイルフラグワードのキー番号ビット (0x400) を セットします。 キー番号はファイル内で重複がなく、キー0 から始まり、昇順に指定され ている必要があります。また、その値が有効でなければなりません (つま り、ファイルのページサイズに対するキーの最大数を超えないということ です)。 手動でキー番号を割当てるという機能は、キーを削除して、そのキーより キー番号が大きなキーで自動的なキー番号の再編を MicroKernel に行わせ ないという機能と相補的な関係にあります。たとえば、アプリケーション がインデックスを削除し、それよりキー番号の大きなキーでキー番号を再 編せず、ユーザが特定のキー番号を割当てることなく影響を受けたファイ ルのクローンを作成すると、クローンファイルではオリジナルのファイル とは異なるキー番号が使用されることになります。 ACS 番号 特定の ACS (オルタネートコレーティングシーケンス) を使 用するキーに対して、キースペックブロックのオフセット 0x0F には、キー の照合に使用する ACS 番号を指定します。ACS 番号はデータバッファ内で のそのポジションに基づいています。最後のキースペックブロックの直後 にある ACS は ACS 番号 0 になります。ACS0 の後には ACS1 が続き、さら にその後には ACS2、ACS3、... が続きます。 オルタネートコレーティングシーケンス (ACS) アプリケーションはデータバッファ内の最後のキースペックブロックの直 後に任意の数の ACS を 1 つずつ順に指定します。 ユーザ定義 ACS ASCII 標準とは異なる方法で文字列値をソートする ACS を作成するには、次のフォーマットを使って、265 バイトを直接デー タバッファに配置する必要があります。 Btrieve オペレーション 2-19 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 19 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 表 2-5 ユーザ定義 ACS を作成するためのデータバッファ オフセット 長さ 説明 (バイト単位) 0 1 識別バイト。0xAC を指定します。 1 8 この ACS を Microkernel に識別させる、重複のない 8 バイトの名前。 9 256 256 バイトのマップ。マップ内の 1 バイトのポジションは、それぞれマップ 内でのそのポジションのオフセットと同じ値を持つコードポイントに対応し ます。そのポジションのバイトの値はそのコードポイントに割当てられてい るコレーティングウェイトです。たとえば、コードポイント 0x61 ('a') が コードポイント 0x41 ('A') と同じウェイトでソートされるようにするには、 オフセット 0x61 ('a') と 0x41 ('A') に同じ値を配置します。 ユーザ定義 ACS の例については、『Btrieve User's Guide』を参照してくだ さい。 ロケール固有 ACS ロケール固有のコレーティングシーケンスに従って 文字列値をソートする ACS を指定するには、次のフォーマットを使って、 265 バイトを直接データバッファに配置する必要があります。 表 2-6 ロケール固有 ACS を指定するためのデータバッファ オフセット 長さ 説明 (バイト単位) 0 1 識別バイト。0xAD を指定します。 1 2 カントリ ID (Intel フォーマット)。国別言語サポートの詳細については、オ ペレーティングシステムのマニュアルを参照してください。 3 2 コードページ ID (Intel フォーマット)。国別言語サポートの詳細について は、オペレーティングシステムのマニュアルを参照してください。 5 260 Filler. デフォルトのロケール固有 ACS を使用するには、カントリ ID とコード ページ ID の値として 0xFFFF を指定します。 イ ン タ ー ナ シ ョ ナ ル ソ ー ト 規 則 (ISR) ISR を 指 定 す る に は 、 次 の フォーマットを使って、265 バイトを直接データバッファに配置する必要 があります。 2-20 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 20 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 表 2-7 ISR ACS を指定するためのデータバッファ オフセット 長さ 説明 (バイト単位) 0 1 識別バイト。0xAE を指定します。 1 16 ISR テーブルを MicroKernel に識別させる、重複のない 16 バイトの名前。 ISR テーブル名の一覧については、『Btrieve User's Guide』を参照してくださ い。 17 248 Filler. データバッファ長 データバッファ長は、ファイルスペック、キースペック、および定義され ているすべての ACS を十分に格納できるだけの長さを持つ必要があります。 このパラメータにファイルのレコード長を指定しないでください。 たとえば、それぞれ 1 セグメントからなる 2 つのキーと 1 つの ACS を持つ ファイルを作成するには、次に示すように、Create オペレーションのデー タバッファは少なくとも 313 バイトの長さを持たなければなりません。 ファイル スペック 16 + キー1 スペック + キー2 スペック + ACS + 16 + 16 + 265 = 313 キー番号 Create オペレーションのキー番号パラメータは、同じ名前のファイルが既 に存在することを警告するかどうかを指定するために使用します。 注意 NetWare 開発者: サーバベースの MicroKernel for NetWare ではキー番号をチェック して、[トランザクションフラグの割り当て] 環境設定オプションの保持またはオー バーライドを行います。しかし、MicroKernel の他のすべてのバージョンでは、この ような TTS ビットの処理は実行しません。 実行結果 Create オペレーションが正常に終了すると、同名ファイルが既に存在する ことを警告するメッセージが表示されるか、指定したスペックに従って新 規ファイルが作成されます。新規ファイルにはレコードは含まれていませ ん。Create オペレーションでは作成したファイルをオープンしません。作 Btrieve オペレーション 2-21 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 21 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 成したファイルにアクセスするには、Open オペレーションを実行する必要 があります。 Create オペレーションが正常に実行されなかった場合は、主に次のステー タスコードのいずれかが返されます。 2 I/O エラーが発生しました。 18 ディスクがいっぱいです。 22 データバッファパラメータが短すぎます。 24 ページサイズまたはデータバッファサイズが不正です。 25 指定されたファイルを作成できません。 26 指定されたキーのセグメント数が不正です。 27 キー位置が不正です。 28 レコード長が不正です。 29 キー長が不正です。 48 オルタネートコレーティングシーケンス定義が不正です。 49 拡張キータイプが不正です。 59 指定されたファイルは既に存在します。 104 ロケール情報がありません。 105 VAT の割当てテーブルを持つファイルを作成できません。 134 インターナショナルソート規則を読み込めません。 135 指定されたインターナショナルソート規則テーブルは壊れて いるか不正です。 ポジショニング Create オペレーションはファイルのカレンシー情報を確立しません。 2-22 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 22 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Create Index (31) 既存のファイルにキーを追加します。 パラメータ オペレーション ポジション データ コード ブロック バッファ × × × センド データバッファ長 キーバッファ × キー番号 × リターン 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ ファイル内の既存のキーセグメントの数は次の式の値以下でなければ なりません。 (許容されるキーセグメントの最大数) - (追加するキーセグメント数) 許容されるキーセグメントの最大数はファイルのページサイズによっ て決まります。次に、ページサイズとキーセグメントの最大数の関係 を示します。 ページサイズ キーセグメントの最大数 512 8 1024 23 1536 24 2048、2560、3072、または 3584 54 4096 119 ◆ 新しいキーのキーフラグ、ポジション、および長さがキーを追加しよ うとしているファイルに対して適切であることを確認してください。 ◆ トランザクションが実行中でないことが必要です。 手順 1. オペレーションコードに 31 を設定します。 2. キーを追加するファイルに対するポジションブロックを渡します。 3. キーを構成する各セグメントについて、16 バイトのキースペックブ ロックをデータバッファに格納します。表 2-1 で定義されているものと 同じ構造を使用します。キーポジションとキー長の情報は整数として格 納します。システムデータキーを再構築している場合、データバッファ Btrieve オペレーション 2-23 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 23 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 は少なくとも 16 バイトの長さで、ゼロに初期化されている必要があり ます。 4. 新しいキーで使用する ACS を定義するには、次のいずれかの操作を行 います。 ◆ デフォルトの ACS を使用するには、キーフラグワードのデフォルト の ACS を使用ビットをセットします。デフォルトの ACS とは、 ファイル内で既に定義されている先頭の ACS のことです。 ◆ 新しい ACS を定義するには、キーフラグワードのファイル内の番号 付き ACS の使用ビットをセットし、ACS 番号フィールドに 0 を設 定します。また、データバッファの最後のキースペックブロックの 後に 265 バイトの ACS を格納します。 ◆ 名前によって既存の ACS を指定するには、キーフラグワードの名前 付き ACS の使用ビットをセットし、ACS 番号フィールドに 0 を設 定します。また、データバッファの最後のキースペックブロックの 後にある 265 バイトブロックの先頭に ACS の名前を格納します (名 前の後にある ACS ブロックの残りの部分は無視されます)。名前は、 次のフォーマットのいずれかで指定する必要があります。 表 2-8 ACS 名のフォーマット ACS のタイプ 長さ (バイト単位) ユーザ定義 ACS ロケール固有 ACS ISR 説明 1 識別バイト 0xAC 8 ACS テーブル名 1 識別バイト 0xAD 2 カントリ ID 2 コードページ ID 1 識別バイト 0xAE 16 ISR テーブル名 5. データバッファ長パラメータにデータバッファのバイト数を設定します。 ACS を含まない新しいキー (またはデフォルトの ACS を使用するキー) の場合は、次の数式を使って正しいデータバッファ長を決定します。 16 × (セグメント数) 新しいキーがデフォルト以外の ACS を指定する場合は、次の数式を 使って正しいデータバッファ長を決定します。 2-24 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 24 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 16 × (セグメント数) + 265 6. 作成されるキーに特定のキー番号を割当てるには、目的のキー番号に 0x80 を加算し、その合計値をキー番号パラメータに設定します。シス テムデータキーを再構築している場合は、0xFD (つまり、キー番号 125 + 128) を指定します。 注意 ファイル内でキー番号に重複があってはいけません。また、キー番号が有効な値で なければなりません (つまり、各キー番号の値は、ファイルのページサイズで許容 されるキーセグメントの最大数を超えてはいけません)。 詳細 MicroKernel では、キーを作成するときに特定のキー番号を割当てることが できます。手動でキー番号を割当てるという機能は、キーを削除して、そ のキーよりキー番号が大きなキーで自動的なキー番号の再編を MicroKernel に行わせないという機能と相補的な関係にあります。たとえば、アプリ ケーションがインデックスを削除し、それよりキー番号の大きなキーで キー番号を再編せず、ユーザが特定のキー番号を割当てることなく影響を 受けたファイルのクローンを作成すると、クローンファイルではオリジナ ルのファイルとは異なるキー番号が使用されることになります。 データバッファで ACS を定義すると、MicroKernel はそれをファイルに追 加する前に、まず既存の ACS をチェックします (指定した名前を使って)。 指定した名前を持つ既存の ACS が検出されると、ファイル内で ACS 定義 の重複は行われず、既存の ACS が新しいキーと関連づけられます。 キーフラグワードの名前付き ACS の使用ビットをセットしている場合、 MicroKernel ではデータバッファに指定されている ACS 名を使って、ファ イル内で同名の ACS を検索し、その ACS を新しいキーに割当てます。 あるファイルが複数の MicroKernel によってオープンされていて、あるク ライアントが Create Index プロセスを開始した場合、リモートクライアント は、MicroKernel によってキーが作成されている間にも、同じファイルに対 して Get および Step オペレーションを実行することができます。 作成されるキーが AUTOINCREMENT キーでない場合、リモートクライア ントの Get および Step オペレーションはロックバイアスを持つことができ、 Create Index プロセスが完了したとき、さらに読み込みオペレーションを行 うことなく、ロックされていたレコードを更新または削除することができ Btrieve オペレーション 2-25 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 25 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 ます。MicroKernel ではインデックスを作成するためにレコードのイメージ を変更する必要がないため、このような処理が可能になります。 し か し 、 作 成 さ れ る キ ー が AUTOINCREMENT キ ー で あ る 場 合 、 MicroKernel ではインデックスを構築しつつ、適切なフィールドでゼロ値を 使って各レコードを変更する必要があります。キー作成の前または途中で ロックバイアスなしに Get または Step オペレーションを実行するリモート クライアントは、キーの作成が正常に終了した後で更新または削除オペ レーションを実行するとき、ステータスコード 80 を受け取ります。 また MicroKernel では、あるクライアントがレコードをロックしていると きに、別のクライアントが AUTOINCREMENT キーを作成しようとすると、 ス テ ー タ ス コ ー ド 84 を 返 し ま す 。 同 様 に 、 あ る ク ラ イ ア ン ト が AUTOINCREMENT キーに対するインデックスを作成しているときに、あ るクライアントがロックバイアスを使って Get または Step オペレーション を実行しようとすると、ステータスコード 85 を返します。 実行結果 Create Index オペレーションを実行すると、ファイルに新しいキーが即座に 追加されます。このオペレーションに要する時間は、インデックス化され る総レコード数、ファイルのサイズ、および新しいインデックスの長さに よって異なります。 Create Index オペレーションが正常に終了すると、新しいキーのキー番号は 指定したもの、または次のいずれかになります。 ◆ キー番号にギャップのないファイルの場合、キー番号は以前の最大の キー番号に 1 を加えたものになります。 ◆ キー番号にギャップのあるファイルの場合、キー番号は次に使用可能 な最小のキー番号になります。 オペレーションが完了すると、新しいインデックスを使ってすぐにデータ にアクセスできるようになります。 Create Index オペレーションが正常に実行されなかった場合、すでに一部が 構築されている新しいインデックスは削除されます。また、エラーの前に 新しいインデックスに割当てられたファイルページはフリースペースとな り、新しいレコードを挿入したり別のキーを作成するときに再使用されま す。 2-26 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 26 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 AUTOINCREMENT キーの作成中にエラーが発生すると、その時点までに 変更されている値はそのまま残ります。 主に次のステータスコードのいずれかが返されます。 22 データバッファパラメータが短すぎます。 27 キー位置が不正です。 41 実行しようとした操作は許可されていません。 45 指定されたキー属性は不正です。 49 拡張キータイプが不正です。 56 インデックスが不完全です。 84 レコードまたはページがロックされています。 85 ファイルがロックされています。 104 ロケール情報がありません。 134 インターナショナルソート規則を読み込めません。 135 指定されたインターナショナルソート規則テーブルは壊れ ているか不正です。 136 ファイル内で指定されたオルタネートコレーティングシー ケンスが見つかりません。 キーの作成中に停電が発生したりシステムリセットが行われても、ファイ ルの他のキーを介してそのファイルのデータにアクセスすることはできま す。しかし、不完全なインデックスによってデータにアクセスしようとす ると、0 以外のステータスコードが返されます。この問題を解決するには、 Drop Index オペレーション (32) を使って不完全なインデックスを削除し、 Create Index オペレーションを再発行してください。 ポジショニング Create Index オペレーションはファイルのカレンシー情報にまったく影響し ません。 Btrieve オペレーション 2-27 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 27 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Delete (4) ファイルから既存のレコードを削除します。削除したレコードが占有して いたスペースは新しいレコードを挿入するために再利用されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × リターン 必要条件 データバッファ長 キーバッファ キー番号 × ◆ データファイルがオープンされている必要があります。 ◆ 対象となるファイルの物理または論理カレンシーを確立しておく必要 が あ り ま す 。 こ の 必 要 条 件 を 満 た す オ ペ レ ー シ ョ ン に は 、 Get (Extended Get と Get Key を除く)、Step (Extended Step を除く)、Insert、 または Update があります。 ◆ トランザクション中にレコードを削除するには、トランザクション中 にレコードが取得されている必要があります。 手順 1. オペレーションコードに 4 を設定します。 2. 削除するレコードを含むファイルのポジションブロックを渡します。 詳細 Delete オペレーションを Extended Get または Extended Step オペレーション の直後に実行するとエラーになります。 Get オペレーションの直後に Delete オペレーションを実行するときは、Get オペレーションから返されるキー番号を変更しないでください。キー番号 を変更してしまうと、レコードは正常に削除されますが、レコード削除後 に実行する最初の Get オペレーションでステータスコード 7 が返されます。 MicroKernel では、Get Key オペレーション (+50) の後に Delete オペレー ションを実行することはできません。Delete オペレーションを実行する前 に、変更を加えようとしているデータページの現在の使用回数と、レコー ドを読み込んだときのデータページの使用回数が比較されます。使用回数 を取得するため、MicroKernel ではデータページを読み込む必要があります。 Get Key オペレーションではデータページが読み込まれないため、Delete オ ペレーションで使用回数の比較に使用できなくなってしまいます。 2-28 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 28 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 MicroKernel では、比較なしにパッシブ並行制御のコンフリクトチェックを 実行できないため、Delete オペレーションは正常に実行されません。Delete オペレーションが正常に実行されないと、ステータスコード 8 が返されま す。 実行結果 Delete オペレーションが正常に終了すると、ファイルからレコードが削除 され、レコードのロックが解除され (削除したレコードに設定されている 場合)、さらに削除の結果を反映して、すべてのキーインデックスが自動的 に調整されます。 Delete オペレーションが正常に実行されなかった場合、主に次のステータ スコードのいずれかが返されます。 8 カレントポジションが不正です。 80 レコードレベルの矛盾が生じました。 83 トランザクション外で読み込んだレコードを変更しようとし ました。 ポジショニング Delete オペレーションは物理ロケーション情報とカレント論理レコードポ ジションを削除しますが、ネクストおよびプリビアス論理レコードのポジ ションはそのまま残されます。 Btrieve オペレーション 2-29 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 29 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Drop Index (32) 既存のファイルからキーを削除します。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × データバッファ長 キーバッファ キー番号 × リターン 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ ファイル内にキーが存在する必要があります。 ◆ トランザクションが実行中でないことが必要です。 手順 1. オペレーションコードに 32 を設定します。 2. 削除するキーを含むファイルのポジションブロックを渡します。 3. キー番号パラメータに削除するキーのキー番号を格納します。システム データキーを削除するには、125 を指定します。 詳細 システムデータキーが壊れてしまった場合は、まず削除した後で再構築し ます。システムデータキーを削除した後、Create Index (31) オペレーション を使って再構築します。 キーを削除するとき、特に指定しなければ、削除したキーよりキー番号が 大きなキーはすべて自動的に再編されます。削除したキーよりもキー番号 が大きなキーは 1 ずつ小さくなります。たとえば、キー番号 1、4、および 7 を含むファイルがあるとします。キー4 を削除すると、残ったキーは 1、 6 と再編されます。 MicroKernel に自動的なキー番号の再編を行わせたくない場合は、キー番号 パラメータに指定する値に 0x80 バイアスを追加します。こうすることで、 キー番号を飛び飛びのままにしておくことができます。その結果、壊れた インデックスを削除し、ファイル内の他のキーの番号付けに影響を与える ことなくインデックスの再構築を行うことができます。インデックスを再 構築するには、Create Index オペレーション (31) を使用します。このオペ レーションではキー番号を指定できます。 2-30 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 30 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 ただし、キーを削除し、それよりキー番号の大きなキーでキー番号を再編 せず、特定のキー番号を割当てることなく影響を受けたファイルのクロー ンを作成すると、クローンファイルではオリジナルとは異なるキー番号が 使用されることになります。 実行結果 Drop Index オペレーションが正常に終了すると、指定したインデックスは 削除され、その後で再利用できるように、そのインデックスに割当てられ ていたページはフリースペースとなります。特に指定しないと、削除した キーよりも大きなキー番号の再編が自動的に行われます。 Drop Index オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 6 41 キー番号パラメータが不正です。 実行しようとした操作は許可されていません。 インデックスを削除しているときに処理が中断されても、ファイルの他の キーを介してそのファイルのデータにアクセスすることはできます。しか し、不完全なインデックスによってファイルにアクセスしようとすると、 ステータスコード 56 が返されます。処理が中断された場合は、Drop Index オペレーションを再発行してください。 ポジショニング Drop Index オペレーションはファイルの物理カレンシー情報にまったく影 響しません。しかし、直前に論理カレンシーを確立するために使用した キーを削除すると、論理カレンシーは完全に削除されます。 Btrieve オペレーション 2-31 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 31 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 End Transaction (20) トランザクションの終了を宣言し、データファイルに適切な変更を加えま す。また、トランザクションによって設定されたすべてのファイルとレ コードのロックを解除します。 パラメータ オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ キー番号 × センド リターン 必要条件 End Transaction オペレーションを実行する前に、Begin Transaction オペレー ション (19 または 1019) が正常に終了している必要があります。 手順 オペレーションコードに 20 を設定します。End Transaction 呼出しに他のパ ラメータを設定してもすべて無視されますが、Btrieve の将来のバージョン との互換性を維持するため、オペレーションコード以外のパラメータには 0 を設定してください。 実行結果 End Transaction オペレーションが正常に終了すると、トランザクション内 で実行されたすべてのオペレーションの結果がファイルに保存されます。 End Transaction オペレーションを実行した後でトランザクションを中止す ることはできません。 End Transaction オペレーションが正常に実行されなかった場合は、主に次 のステータスコードが返されます。 38 トランザクション制御ファイル I/O エラーが発生しまし た。 ポジショニング End Transaction オペレーションはファイルのカレンシー情報にまったく影 響しません。 2-32 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 32 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Find Percentage (45) Find Percentage オペレーションは、スクロールバーをインプリメントする ウィンドウ指向のアプリケーションで使用することのできる 2 つの Btrieve オペレーションのうちの 1 つです。もう 1 つの Btrieve オペレーションは Get By Percentage オペレーション (44) です。Find Percentage では、キーパ スを基準とする相対的なレコード位置、またはファイル内でのレコードの 物理ロケーションを基準とする相対的なレコード位置を検索します。検出 されたポジションはパーセンテージで表されます。パーセンテージの範囲 の定義については、「実行結果」を参照してください。 パラメータ センド リターン 注意 オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ × × × × × × × × キー番号 × キーパスを基準とする相対的なパーセンテージを検索するとき、データバッファパ ラメータに値をセットする必要はありません。ファイル内でのレコードの物理ロ ケーションを基準とする相対的なパーセンテージを検索するときは、キーバッファ パラメータに値をセットする必要はありません。 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ キーパスを基準にするパーセンテージを検索する場合は、対象となる ファイルがデータオンリーファイルであってはいけません。 ◆ ファイル内のレコードの物理ロケーションによってパーセンテージを 検索するときは、そのレコードの 4 バイト物理ロケーションを指定す る必要があります。Get Position オペレーション (22) を使って、この ロケーションを取得することができます。 手順 1. オペレーションコードに 45 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. ファイル内のレコードの物理ロケーションを基準にパーセンテージを検 索する場合は、レコードの物理アドレスをデータバッファパラメータに 格納します。そうでない場合は、データバッファパラメータに値を設定 する必要はありません。 Btrieve オペレーション 2-33 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 33 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 4. データバッファ長パラメータに最小値である 4 バイトを設定します (こ の 4 バイトは MicroKernel の内部的なインプリメンテーションに必要と されます)。 5. キーパスを基準にパーセンテージを検索する場合は、キーバッファパラ メータにキー値を設定します。そうでない場合は、キーバッファパラ メータに値を設定する必要はありません。 6. キー番号パラメータを次のように設定します。 a. キーパスによってパーセンテージを検索する場合は、キー番号パラ メータに実際のキー番号を設定します。 b. ファイル内のレコードの物理ロケーションによってパーセンテージ を検索する場合は、キー番号パラメータに -1 (0xFF) を設定します。 詳細 Find Percentage オペレーションは、特にスクロールバーのインプリメン テーションをサポートするために用意されています。このオペレーション の精度、つまり返されたパーセンテージの値がレコードまたはキー値のポ ジションをどれだけ厳密に反映しているかどうかは、さまざまな要因に よって影響を受けます。このため、スクロールバーのインプリメンテー ション以外の目的で使用する場合は、このオペレーションの精度を信頼し ないでください。 Find Percentage オペレーションを最適化するため、MicroKernel では、レ コードがデータページ内に均等に分布していること、またはキーがイン デックスページ内に均等に分布していることを前提としています。ただし、 この分布は次のような状況によって影響を受けます。 ◆ ファイルがインデックスバランスを使用していなくて、同じ範囲の キーで多数のレコードを削除した。 ◆ 同じ範囲の物理アドレスで多数のレコードを削除した。 ◆ ファイルに多数の重複したキー値が含まれていて、そのキーがリンク 重複キーになっている。 実行結果 Find Percentage オペレーションが正常に終了すると、指定したキー値また はレコードのポジションがデータバッファに返されます。このポジション は、キーパスまたはファイルへのオフセットのパーセンテージとして表さ れ、0 (0%) から 10,000 (100.00%) までの範囲の値となります。 2-34 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 34 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 パーセンテージの値は、下位バイト、上位バイトの順に整数として返され ます。たとえば、次のようになります。 戻り値 (16 進) 戻り値 (10 進) キーパスまたはファイル内でのパーセンテージ 88h 13h 5,000 50% オペレーションが正常に終了すると、データバッファ長として 4 バイトが 返されます。 Find Percentage オペレーションが正常に実行されなかった場合は、主に次 のステータスコードのいずれかが返されます。 ポジショニング 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 7 キー番号が変更されました。 8 カレントポジションが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 41 実行しようとした操作は許可されていません。 43 指定されたレコードアドレスは不正です。 82 ポジションを失いました。 Find Percentage オペレーションはカレンシー情報を変更しません。 Btrieve オペレーション 2-35 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 35 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Get By Percentage (44) Get By Percentage オペレーションは、スクロールバーをインプリメントす るためにウィンドウ指向のアプリケーションで使用することのできる 2 つ の Btrieve オペレーションのうちの 1 つです。もう 1 つの Btrieve オペレー ションは Find Percentage オペレーション (45) です。 Get By Percentage では、ファイル内のポジションによってレコードを取得 します。このポジションはオペレーションを呼出すときに指定したパーセ ンテージの値に基づきます。特定のキーパスを基準としてレコードを取得 するのか、ファイル内の実際の物理ロケーションによってレコードを取得 するのかを指定する必要があります。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × × × リターン 注意 データバッファ長 キーバッファ キー番号 × × レコードの物理ロケーションを基準としてレコードを検索するとき、キーバッファ パラメータに情報は返されません。 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ キーパスを基準としてレコードを検索する場合は、対象となるファイ ルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 44 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. パーセンテージの値を 16 ビット整数としてデータバッファに格納しま す。指定できるパーセンテージの値の範囲と関連する情報については、 「詳細」を参照してください。 4. データバッファ長パラメータに取得される最長のレコード長以上の値を 設定します (データバッファ長の最小値は 4 バイトになります)。 5. キー番号パラメータを次のように設定します。 2-36 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 36 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 a. キーパスによってレコードを検索する場合は、キー番号パラ メータに実際のキー番号を設定します。システムデータキーを 使用するには、125 を指定します。 b. ファイル内のレコードの物理ポジションによってレコードを検 索する場合は、キー番号パラメータに -1 (0xFF) を設定します。 詳細 データバッファパラメータに設定できるパーセンテージの値の範囲は、0 (キーパスまたはファイルの先頭を表します) から 10,000 (キーパスまたは ファイルの末尾を表します) までです。この値は必ず整数として格納して ください (下位バイト、上位バイトの順に)。たとえば、ファイル内の 50% の位置にあるレコードを検索するには、5,000 (0x1388) という値を使用し ます。0x1388 の下位バイトと上位バイトを入れ替え、0x88 と 0x13 をデー タバッファパラメータの先頭の 2 バイトに格納します。 Get By Percentage オペレーションは、特にスクロールバーのインプリメン テーションをサポートするために用意されています。このオペレーション の精度、つまり返されたレコードがファイル内の指定したパーセンテージ ポジションに実際に位置しているかどうかは、さまざまな要因によって影 響を受けます。このため、スクロールバーのインプリメンテーション以外 の目的で使用する場合は、このオペレーションの精度を信頼しないでくだ さい。 Get By Percentage オペレーションを最適化するため、MicroKernel では、レ コードがデータページ内に均等に分布していること、またはキーがイン デックスページ内に均等に分布していることを前提としています。ただし、 この分布は次のような状況によって影響を受けます。 ◆ ファイルがインデックスバランスを使用していなくて、同じ範囲の キーで多数のレコードを削除した。 ◆ 同じ範囲の物理アドレスで多数のレコードを削除した。 ◆ ファイルに多数の重複したキー値が含まれていて、そのキーがリンク 重複キーになっている。 実行結果 Get By Percentage オペレーションが正常に終了すると、データバッファに は、指定したキーパスを基準とするポジションまたはファイル内の物理ポ ジションにあるレコードが返されます。また、データバッファ長パラメー タには、レコード長がバイト単位で返されます。キーパスによってレコー Btrieve オペレーション 2-37 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 37 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 ドを検索する場合、キーバッファパラメータには指定したキーパスに対応 するキー値が返されます。また、物理レコード順によってレコードを検索 する場合、キーバッファパラメータには何の情報も返されません。 注意 Get By Percentage オペレーションがキーパスを基準としてレコードを検索すると き、そのキーに重複する値が含まれていると、つねに重複した値を含む先頭のレ コードが返されます。これにより、オペレーションの精度が影響を受ける場合があ ります。 Get By Percentage オペレーションが正常に実行されなかった場合は、主に 次のステータスコードのいずれかが返されます。 ポジショニング 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 7 キー番号が変更されました。 8 カレントポジションが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 41 実行しようとした操作は許可されていません。 43 指定されたレコードアドレスは不正です。 82 ポジションを失いました。 指定したキーパスを基準としてレコードを検索するとき、Get By Percentage オペレーションが正常に終了すると、指定したキー番号と取得したレコー ドのそれぞれに基づいて新しい論理および物理カレンシーが確立されます。 ファイル内のレコードの物理ロケーションによってレコードを検索すると き、Get By Percentage オペレーションが正常に終了すると、取得したレ コードに基づいて新しい物理カレンシーが確立されます。 Get By Percentage オペレーションが正常に実行されない場合、カレンシー は変更されません。 2-38 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 38 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Direct/Chunk (23) チャンクと呼ばれるレコードの任意の部分を取得します。このオペレー ションは 65,535 バイトを超える長いレコードを含むファイルで役立ちます。 このようなレコードは長すぎるため、データバッファの長さの制限により、 他の Get および Step オペレーションでは取得できません。アプリケーショ ンでは、物理アドレスを指定することで、チャンクが取得されるレコード を指定します。通常、レコード内でのチャンクのロケーションは、そのオ フセットと長さによって指定されます。 パラメータ オペレーション ポジション データ コード ブロック バッファ × × × × × × × センド リターン 必要条件 データバッファ長 キーバッファ キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 4 バイトからなるレコードの物理ロケーションを指定する必要があり ます。このロケーションは、Get Position オペレーション (22) を使っ て取得できます。 ◆ データバッファは、Get Direct/Chunk オペレーションによって返され るすべての値を十分に格納できる長さでなければなりません。また、 Get Direct/Chunk オペレーションが間接チャンクオペレーションを実行 するとき、データバッファにはチャンクディスクリプタ全体 (すべての チャンク定義) を格納できなければなりません。データバッファのサイ ズは最大 64,512 (0xFC00) バイトに制限されています。 手順 1. オペレーションコードに 23 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファの先頭 4 バイトに目的のレコードの 4 バイトポジション を格納します。 4. データバッファの先頭 4 バイトの直後にチャンクディスクリプタ構造を 格納します。 5. データバッファ長パラメータに次の 2 つの値のうち大きいものを設定し ます。 Btrieve オペレーション 2-39 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 39 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 ◆ 取得するチャンクを記述するために使用するバイト数 + レコード アドレスのための 4 バイト ◆ 取得したチャンクをデータバッファ内に格納するために必要なバイ ト数 Get Direct/Chunk オペレーションの一部のオプションでは、データバッ ファ以外のロケーションにチャンクを取得します。データバッファ長を 計算する方法については、「詳細」を参照してください。 6. キー番号パラメータに -2 (0xFE) を設定します。 詳細 データバッファでは、次のチャンクディスクリプタのいずれかを使用します。 ◆ ランダムチャンクディスクリプタ − オペレーションにつき 1 つの チャンクを取得するため、またはチャンクがレコード全体にわたって ランダムに分布しているときに、1 回のオペレーションで複数のチャ ンクを取得するために使用します。 ◆ 矩形チャンクディスクリプタ − 1 回のオペレーションで多数のチャ ンクを取得するために使用します。ただし、各チャンクは同じ長さで あり、レコード内で等間隔に分布している必要があります。 ランダムチャンクディスクリプタの構造 次の図はランダムに分布する 3 つのチャンクを含むレコードを示していま す。チャンク 0 (バイト 0x12 から 0x16)、チャンク 1 (バイト 0x2A から 0x31)、チャンク 2 (バイト 0x41 から 0x4E) は、それぞれ網かけで示してあ ります。 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2-40 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 40 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 ランダムチャンクディスクリプタを定義するには、次の表を参考にして、 データバッファ内に構造を作成する必要があります (レコードの 4 バイト 物理アドレスに続けて)。 表 2-9 ランダムチャンクディスクリプタの構造 要素 長さ 第 2 章 説明 (バイト単位) サブファンクション チャンクディスクリプタのタイプを指定します。 4 ◆ 0x80000000 (直接ランダムチャンクディスクリプタ) − チャン クを直接データバッファに取得します。取得された先頭のチャ ンクはデータバッファのオフセット 0 に格納されます。2 番目以 降に取得されたチャンクはその前のチャンクの直後に格納され ます。 ◆ 0x80000001 (間接ランダムチャンクディスクリプタ) − チャン クをチャンク定義で指定されたアドレス内に取得します。 チャンク数 4 取得するチャンクの数を示します。少なくとも 1 以上の値を指定す る必要があります。指定可能な明示的最大値は存在しませんが、 チャンクディスクリプタはデータバッファに収まる必要がありま す。データバッファのサイズは最大 64,512 (0xFC00) バイトに制限さ れています。 チャンク 0 定義 12 各チャンク定義は、次のような 4 バイトのチャンクオフセット、そ れに続く 4 バイトのチャンク長、およびそれに続くユーザデータか ら構成されます。 チャンク 1 定義 12 . . ◆ チャンクオフセット − レコードの先頭からのバイト数によっ て、対象となるチャンクの開始位置をオフセットとして指定し ます。指定できる最小値は 0 で、最大値はレコードの末尾のバ イトのオフセットです。 . . . . チャンク n 定義 12 ◆ チャンク長 − チャンクに含まれるバイト数を指定します。指 定できる最小値は 0 で、最大値は 65,535 です。ただし、データ バッファのサイズは最大 64,512 (0xFC00) に制限されているた め、64,512 バイトがチャンクのサイズの現実的な最大値となり ます。 ◆ ユーザデータ − (間接ディスクリプタのみで使用します) 実際 のチャンクデータへの 32 ビットポインタです。使用すべき フォーマットはオペレーティングシステムによって異なりま す。1 直接ランダムチャンクディスクリプタにこの要素を指定し ても無視されます。ただし、それでもこの要素を割当て、0 を設 定しておく必要があります。 1 16 ビットアプリケーションの場合は、16 ビットオフセットおよび 16 ビットセグメン トとしてユーザデータを設定します。ユーザデータでは、メモリセグメントの境界を 超えてメモリをアドレスすることはできません。チャンク長がユーザデータのオフ セット部分に追加されるとき、その結果はユーザデータによって定義されるセグメン ト内に収まる必要があります。デフォルトの設定で、この規則に対する違反はチェッ クされず、このような違反は適切に処理されません。 Btrieve オペレーション 2-41 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 41 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 次の表は、直接ランダムチャンクディスクリプタ構造の例を示しています。 要素 サンプル値 長さ (バイト単位) サブファンクション 0x8000000 4 チャンク数 3 4 チャンクオフセット 0x12 4 チャンク長 0x05 4 ユーザデータ n/a 4 チャンクオフセット 0x2A 4 チャンク長 0x08 4 ユーザデータ n/a 4 チャンクオフセット 0x41 4 チャンク長 0x0E 4 ユーザデータ n/a 4 チャンク 0 チャンク 1 チャンク 2 矩形チャンクディスクリプタの構造 同じ長さのチャンクがレコード全体にわたって等間隔に分布している場合、 矩形チャンクディスクリプタを使って、取得するすべてのチャンクを記述 することができます。たとえば、次のような図を考えてみましょう。この 図には、レコードのオフセット 0x00 から 0x4F までが示されています。 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2-42 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 42 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 このレコードには 3 つのチャンクが含まれ、その領域は網かけで示されて います。チャンク 0 はバイト 0x19 から 0x1C、チャンク 1 はバイト 0x29 か ら 0x2C、チャンク 2 はバイト 0x39 から 0x3C を含みます。各チャンクはど れも 4 バイトの長さで、各チャンクの先頭から計算すると、チャンクその ものの長さとそれぞれのチャンクの間隔を合計すると、いずれも 16 (0x10) バイトになっています。 1 つの矩形ディスクリプタを使って、3 個のチャンクを同時に取得すること ができます。矩形チャンクディスクリプタを定義するには、次の表を参考 にして、データバッファ内に構造を作成する必要があります (レコードの 4 バイト物理アドレスに続けて)。 表 2-10 矩形チャンクディスクリプタの構造 要素 長さ 説明 (バイト単位) サブファンクション 4 チャンクディスクリプタのタイプを指定します。 ◆ 0x80000002 (直接矩形チャンクディスクリプタ) − チャンクを 直接データバッファに取得します。取得された先頭のチャンク はデータバッファのオフセット 0 に格納されます。2 番目以降に 取得されたチャンクはその前のチャンクの直後に格納されま す。 ◆ 0x80000003 (間接矩形チャンクディスクリプタ) − チャンクを ユーザデータおよびアプリケーションの行間隔要素によって定 義されたアドレス内に取得します。 行数 4 矩形チャンクディスクリプタで処理するチャンクの数を指定します。指 定できる最小値は 1 です。明示的な最大値の制限はありません。 オフセット 4 レコードの先頭を起点として、取得する先頭バイトのオフセットを 指定します。指定できる最小値は 0 で、最大値はレコードの末尾の バイトのオフセットです。レコードが矩形として表される場合、こ の要素は取得される先頭行にある先頭バイトのオフセットを参照す ることになります。 行のバイト数 4 各チャンクで取得するバイト数を指定します。指定できる最小値は 0 で、最大値は 65,535 です。ただし、他の要因 (データバッファ長 パラメータやクライアント/サーバの制限など) との関連で、通常、 このように大きな値を指定することはできません。 行間隔 4 各チャンクの先頭が何バイトの間隔になっているかを指定します。 ユーザデータ 4 (間接ディスクリプタのみで使用します) MicroKernel が各行からバイ トを取得した後でそれらを格納するロケーションへの 32 ビットポイ ンタです。使用すべきフォーマットはオペレーティングシステムに よって異なります。 1 直接矩形ディスクリプタにこの要素を指定し ても無視されます。ただしそれでも、この要素を割当て、0 を設定 しておく必要があります。 Btrieve オペレーション 2-43 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 43 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 要素 長さ 説明 (バイト単位) アプリケーションの 4 行間隔 (間接矩形ディスクリプタのみで使用します) 矩形がアプリケーショ ンのメモリ (つまり、ユーザデータで指定したアドレス) に格納さ れたときに、矩形内の各チャンクの先頭が何バイトの間隔になるか を指定します。直接矩形ディスクリプタにこの要素を指定しても無視され ます。ただしそれでも、この要素を割当て、0 を設定しておく必要が あります。 1 16 ビットアプリケーションの場合は、16 ビットオフセットとそれに続く 16 ビットセ グメントとしてユーザデータを設定します。ユーザデータでは、メモリセグメントの 境界を超えてメモリをアドレスすることはできません。チャンク長がユーザデータの オフセット部分に追加されるとき、その結果はユーザデータによって定義されるセグ メント内に収まる必要があります。デフォルトの設定で、この規則に対する違反は チェックされず、このような違反は適切に処理されません。 間接矩形ディスクリプタを使用するときは、取得されたチャンクがチャン クディスクリプタを上書きしないように、ユーザデータポインタが設定さ れていることを確認してください。MicroKernel では、返されたチャンクを ユーザデータ要素で指定したロケーションにコピーするとき、ディスクリ プタを使用します。チャンクディスクリプタを上書きしてしまうと、ス テータスコード 62 が返されます。 矩形がメモリに格納されたときに、各行の間隔がレコードとして格納されたと きと同じバイト数になる場合、アプリケーションの行間隔には行間隔と同じ 値を設定します。しかし、矩形がアプリケーションのメモリ内で再配置され、 行の間隔が何バイトか増減する場合は、アプリケーションの行間隔により、 その情報を MicroKernel に渡すことができます。 間接矩形ディスクリプタを使用するときは、ユーザデータおよびアプリケー ションの行間隔要素を使って、取得後のデータを格納するロケーションを決定 します。取得された先頭行のデータは、ユーザデータのオフセット 0 に格納さ れます。また、2 番目の行のデータは、ユーザデータ+アプリケーションの行 間隔で指定されるアドレスに格納されます。さらに、3 番目の行のデータは、 ユーザデータ + (アプリケーションの行間隔 × 2) で指定されるアドレスに格 納され、一般に、n 番目の行のデータは、ユーザデータ + (アプリケーション の行間隔 × (n-1)) で指定されるアドレスに格納されます。 2-44 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 44 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 注意 Windows v3.x 開発者: Win16 アプリケーションの場合、アプリケーションの行間隔お よびユーザデータのオフセットコンポーネントを使って、ユーザデータのセグメントコ ンポーネントの境界を超えてメモリをアドレスすることはできません。アプリケーショ ンの行間隔がユーザデータのオフセット部分に追加されるとき、その結果はユーザ データによって定義されるセグメント内に収まる必要があります。デフォルトの設 定で、この規則に対する違反はチェックされず、このような違反は適切に処理され ません。 次の表は、直接矩形チャンクディスクリプタ構造の例を示しています。 要素 サンプル値 長さ (バイト単位) サブファンクション 0x80000002 4 行数 3 4 オフセット 0x19 4 行のバイト数 0x04 4 行間隔 0x10 4 ユーザデータ 0 4 アプリケーションの行間隔 0 4 Next-in-Record サブファンクションバイアス これまでに述べたサブファンクションの値に 0x40000000 というバイアスを 加算すると、物理レコード内カレンシー (つまり、レコード内でのカレン ト物理ロケーション) に基づいて、サブファンクションのオフセット要素 の値が計算されます。Next-in-Record サブファンクションを使用すると、 チャンクディスクリプタのオフセット要素は無視されます。 実行結果 Get Direct/Chunk オペレーションが正常に終了し、直接チャンクディスクリ プタが使用されている場合、チャンクが順にデータバッファに返されます。 間接ランダムチャンクディスクリプタを使用している場合、データは各 チャンクのユーザデータ要素で指定したロケーションに返されます。また、 間接矩形ディスクリプタを使用している場合、既に述べたように、データ はユーザデータおよびアプリケーションの行間隔要素から計算されるロ ケーションに返されます。 Btrieve オペレーション 2-45 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 45 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 データバッファ長パラメータには、取得されたチャンクの長さの総計が格 納されます (このパラメータに返される値は、チャンクが取得されて直接 データバッファに格納されたか、バイトの取得と格納に間接ディスクリプ タを使用したかどうかに関係なく、取得された全バイト数を反映していま す)。オペレーションの一部しか正常に実行されなかった場合、アプリケー ションではデータバッファ長パラメータに返された値を使って、どのチャ ンクが取得されなかったか、また最後のチャンクの何バイトまでが取得さ れたかを調べることができます。 チャンクがレコードの末尾を超えてしまう場合 (結果としてステータス コード 103 が返されます)、またはチャンクのオフセットと長さの合計がレ コード長を超えてしまう場合は、Get Direct/Chunk オペレーションの一部だ けが正常に実行されます。後者の場合はステータスコード 0 が返されます が、それ以降のチャンクの処理は中止されてしまいます。 注意 すべてのチャンクが適切に取得されたかどうかチェックできるのは、データバッ ファ長パラメータだけです。このため、Get Direct/Chunk オペレーションの実行後 は、必ずデータバッファ長パラメータに返された値をチェックしてください。 次のステータスコードは Get Direct/Chunk オペレーションの一部だけが実行 されたことを示します。これらのステータスコードのいずれかが返される ときは、データバッファ長パラメータに返された値をチェックし、実際に 取得されたデータの数を調べてください。 54 103 レコードの可変長部分が破損しています。 チャンクのオフセットが大きすぎます。 次のステータスコードのいずれかが返される場合、データはまったく取得 されません。 43 指定されたレコードアドレスは不正です。 58 圧縮バッファ長が短すぎます。 62 ディスクリプタが間違っています。 97 データバッファが小さすぎます。 106 Get Next Chunk オペレーションを実行できません。 2-46 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 46 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 ポジショニング Get Direct/Chunk オペレーションは論理カレンシーにはまったく影響しませ ん。物理カレンシーに関しては、取得されたチャンクを含むレコードが物 理カレントレコードになります。 第 2 章 Btrieve オペレーション 2-47 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 47 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Direct/Record (23) 定義済みのキーパスではなく、ファイル内の物理ロケーションを使ってレ コードを取得します。次のような処理を実行する場合は、Get Direct/ Record を使用してください。 ◆ キー値の代わりに物理ロケーションを使って、より高速にレコードを 取得する。 ◆ Get Position オペレーション (22) を使って、レコードの 4 バイト物理 ロケーションを取得し、そのロケーションを保存する。また、カレン シ ー に 影 響 す る 他 の オ ペ レ ー シ ョ ン を 実 行 し た 後 で 、 Get Direct/Record オペレーションを使って、元のロケーションにすばやく 戻る。 ◆ 4 バイト物理ロケーションを使って、重複チェーンの先頭から再度読 み込みを行うことなく、チェーンの中にあるレコードを取得する。 ◆ 現在のキーパスを変更する。Get Position オペレーションに続けて、 異なるキー番号を使った Get Direct/Record オペレーションを実行する と、カレントレコードは異なるインデックスパスに位置づけられます。 この後で Get Next オペレーションを実行すると、新しいキーパスに基 づいてファイル内の次のレコードが返されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × × × リターン 注意 データバッファ長 キーバッファ キー番号 × × データオンリーファイルを対象に Get Direct/ Record オペレーションを実行すると きには、キー番号パラメータは必要ありません。 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ 4 バイトからなるレコードの物理ロケーションを指定する必要があり ます。このロケーションを取得するには、Get Position オペレーショ ン (22) を使用します。このオペレーションはカレントレコードの物 理アドレスを返します。 2-48 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 48 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 手順 1. オペレーションコードに 23 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファの先頭の 4 バイトに目的のレコードの 4 バイト物理ロ ケーションを格納します。 4. データバッファ長パラメータに取得するレコード長以上の値を設定しま す。 5. キー番号パラメータには論理カレンシーを確立するパスのキー番号を指 定します。論理カレンシーを確立する必要がない場合は、値として -1 を指定します。システムデータキーを使用するには、125 を指定します。 実行結果 Get Direct/Record オペレーションが正常に終了すると、目的のレコードが データバッファに返され、レコードの長さがデータバッファ長パラメータ に返されます。また、指定したキーパスに対するキー値がキーバッファに 返されます。 Get Direct/Record オペレーションが正常に実行されず、目的のレコードが取 得できなかった場合は、主に次のステータスコードのいずれかが返されま す。 22 データバッファパラメータが短すぎます (論理カレンシーは確 立されています)。 43 指定されたレコードアドレスは不正です (論理カレンシーは確 立されていません)。 44 指定されたキーのインデックスパスは不正です (論理カレン シーは確立されていません)。 82 ポジションを失いました (論理カレンシーは確立されていま せん)。 ポジショニング Get Direct/Record オペレーションは既存の論理カレンシー情報を消去し、指 定されたキー番号に従って新しい論理カレンシーを確立します。物理カレ ンシー情報にはまったく影響しません。 Btrieve オペレーション 2-49 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 49 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Get Directory (18) 指定された論理ディスクドライブのカレントディレクトリを返します。 パラメータ オペレーション ポジション データ コード ブロック バッファ センド データバッファ長 キーバッファ × リターン 必要条件 キー番号 × × Get Directory オペレーションはいつでも発行することができます。キー バッファには少なくとも半角 65 文字の領域を確保してください。 手順 1. オペレーションコードに 18 を設定します。 2. キー番号パラメータに論理ディスクドライブ番号を格納します。ドライ ブ A: には 1、ドライブ B: には 2 を設定します (以下同様)。デフォル トドライブを使用するには、0 を設定します。 実行結果 オペレーションが正常に終了すると、バイナリ 0 で終端するカレントディ レクトリがキーバッファに返されます。 ポジショニング Get Directory オペレーションはファイルのカレンシー情報にまったく影響 しません。 2-50 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 50 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Equal (5) キーバッファに指定されているキー値と等しいキー値を持つレコードを取 得します。重複キーの場合は、同じキー値を持つグループの中で先頭のレ コード (作成順) が取得されます。Get Key (+50) バイアスを使って、ファ イル内に値が存在するかどうかを検出することもできます。一般に、Get Key オペレーションの方が高速に処理されます。 パラメータ センド ポジション データ コード ブロック バッファ × × × リターン 必要条件 オペレーション データバッファ長 キーバッファ × × × キー番号 × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 5 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファに目的のキー値を指定します。 5. キー番号に正しいキーパスを設定します。システムデータキーを使用す るには、125 を指定します。 実行結果 Get Equal オペレーションが正常に終了すると、指定したレコードがデータ バッファに返され、そのレコードのレコードの長さがデータバッファ長パ ラメータに返されます。 Get Equal オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 4 キー値が見つかりません。 6 キー番号パラメータが不正です。 22 データバッファパラメータが短すぎます。 Btrieve オペレーション 2-51 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 51 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 ポジショニング Get Equal オペレーションは新しい論理および物理カレンシーを確立し、取 得したレコードをカレントレコードにします。 2-52 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 52 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get First (12) 指定されたキーに基づいて論理的に先頭のレコードを取得します。Get Key (+50) バイアスを使って、ファイル内に値が存在するかどうかを検出する こともできます。一般に、Get Key オペレーションの方が高速に処理されま す。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 必要条件 データバッファ長 キーバッファ × × × キー番号 × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 12 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キー番号にキーパスを設定します。システムデータキーを使用するには、 125 を指定します。 実行結果 Get First オペレーションが正常に終了すると、指定したレコードがデータ バッファに返され、対応するキー値がキーバッファに格納されます。また、 そのレコードの長さがデータバッファ長パラメータに返されます。 Get First オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 Btrieve オペレーション 2-53 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 53 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 ポジショニング Get First オペレーションは新しい論理および物理カレンシーを確立し、取 得したレコードをカレントレコードにします。論理プリビアスポジション はファイルの先頭よりも前をポイントすることになります。 2-54 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 54 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Greater (8) キー番号で指定されたフィールドの値がキーバッファの値よりも次に大き いレコードを取得します。重複キーの場合は、同じキー値を持つグループ の中で先頭のレコード (作成順) が取得されます。Get Key (+50) バイアス を使って、ファイル内に値が存在するかどうかを検出することもできます。 一般に、Get Key オペレーションの方が高速に処理されます。 注意 降順キーで Get Greater オペレーションを実行する場合、「次に大きな値」とは、 実際にはキーバッファに指定されている値よりも小さな値を指すことになります。 パラメータ センド ポジション データ コード ブロック バッファ × × × リターン 必要条件 オペレーション データバッファ長 キーバッファ × × × × × キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 8 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファパラメータに目的のキー値を指定します。 5. キー番号パラメータに正しいキーパスを設定します。システムデータ キーを使用するには、125 を指定します。 実行結果 Get Greater オペレーションが正常に終了すると、指定したレコードがデー タバッファに返され、キー値がキーバッファに返されます。また、そのレ コードの長さがデータバッファ長パラメータに返されます。 Get Greater オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 Btrieve オペレーション 2-55 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 55 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 22 ポジショニング データバッファパラメータが短すぎます。 Get Greater オペレーションは新しい論理および物理カレンシーを確立し、 取得したレコードをカレントレコードにします。 2-56 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 56 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Greater Than or Equal (9) キー番号で指定されたキーの値がキーバッファに指定された値以上である レコードを取得します。まず等しい値を持つレコードが検索されます。重 複キーの場合は、同じキー値を持つグループの中で先頭のレコード (作成 順) が取得されます。Get Key (+50) バイアスを使って、ファイル内に値が 存在するかどうかを検出することもできます。一般に、Get Key オペレー ションの方が高速に処理されます。 注意 降順キーで Get Greater Than or Equal オペレーションを実行する場合、「次に大き な値」とは、実際にはキーバッファに指定されている値よりも小さな値を指すこと になります。 パラメータ センド リターン 必要条件 オペレーション ポジション データ コード ブロック バッファ × × × データバッファ長 キーバッファ × × × × × キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 9 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファパラメータにキー値を指定します。 5. キー番号パラメータに正しいキーパスを設定します。システムデータ キーを使用するには、125 を指定します。 実行結果 Get Greater Than or Equal オペレーションが正常に終了すると、指定したレ コードがデータバッファに返され、キー値がキーバッファに格納されます。 また、そのレコードの長さがデータバッファ長パラメータに格納されます。 Btrieve オペレーション 2-57 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 57 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Get Greater Than or Equal オペレーションが正常に実行されなかった場合は、 主に次のステータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 22 ポジショニング データバッファパラメータが短すぎます。 Get Greater Than or Equal オペレーションは新しい論理および物理カレン シーを確立し、取得したレコードをカレントレコードにします。 2-58 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 58 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Key (+50) Get Key バイアスを使用すると、実際にデータレコードを取得することなく Get オペレーションを実行できます。Get Key を使って、ファイル内にある 値が存在するかどうかを検出できます。一般に、Get Key オペレーションは 対応する Get オペレーションよりも高速に実行できます。Get Key オペレー ションは、次のいずれかの Get オペレーションとともに使用します。 ◆ Get Equal (5) ◆ Get Next (6) ◆ Get Previous (7) ◆ Get Greater (8) ◆ Get Greater Than or Equal (9) ◆ Get Less Than (10) ◆ Get Less Than or Equal (11) ◆ Get First (12) ◆ Get Last (13) パラメータ パラメータは対応する Get オペレーションと同様です。ただし、データ バッファ長パラメータの設定は無視され、レコードがデータバッファに返 されることはありません。 必要条件 Get Key オペレーションの必要条件は、対応する Get オペレーションと同様 です。 手順 1. 対応する Get オペレーションに合わせて適切なパラメータを設定します。 ただし、データバッファ長パラメータを設定する必要はありません。 2. 実行する Get オペレーションのオペレーションコードに 50 を加算しま す。たとえば、Get Equal オペレーション (5) とともに Get Key (+50) を 実行するには、オペレーションコードに 55 を設定します。 MicroKernel では、Get Key オペレーション (+50) の後に Delete または Update オペレーションを実行することはできません。Delete または Update オペレーションを実行する前に、変更を加えようとしているデータページ の現在の使用回数と、レコードを読み込んだ時点でのデータページの使用 Btrieve オペレーション 2-59 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 59 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 回数が比較されます。使用回数を取得するため、MicroKernel ではデータ ページを読み込む必要があります。 Get Key オペレーションではデータページが読み込まれないため、Update または Delete オペレーションで使用回数を比較に使用できなくなってしま います。MicroKernel では、比較なしにパッシブ並行制御のコンフリクト チェックを実行できないため、Update または Delete オペレーションは正常 に実行されません。Update または Delete オペレーションが正常に実行され ないと、ステータスコード 8 が返されます。 実行結果 指定したキーが検出されると、そのキー値がキーバッファに格納され、ス テータスコード 0 が返されます。正常に実行されなかった場合は、キー値 を検出できなかった理由を示すステータスコードが返されます。 ポジショニング Get Key オペレーションは、対応する Get オペレーションと同様の方法でカ レントポジションを確立します。ただし、重複キーを含む Get Key オペ レーションでは、取得されたカレントキー値の重複分は無視されます。Get Key オペレーションの実行後、論理プリビアスポジションは次に小さな キー値を含むレコードをポイントします。また、論理ネクストポジション は次に大きなキー値を含むレコードをポイントします。 たとえば、Smith が 8 回出現し、Smythe が 1 回出現する名字のキーを対象 に Get Key/Get Equal オペレーション (55) を実行したとします。論理ネク ストポジションは次の Smith ではなく、Smythe をポイントすることになり ます。 Get Key オペレーションではレコードが実際に特定されるわけではないため、 Get Key オペレーションに続けて Update または Delete オペレーションを実 行することはできません。 2-60 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 60 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Last (13) 指定されたキーに基づいて論理的に末尾のレコードを取得します。重複 キーの場合は、同じキー値を持つグループの中で末尾のレコードが返され ます。Get Key (+50) バイアスを使って、ファイル内に値が存在するかどう かを検出することもできます。一般に、Get Key オペレーションの方が高速 に処理されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 必要条件 データバッファ長 キーバッファ × × × キー番号 × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 13 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キー番号にキーパスを設定します。システムデータキーを使用するには、 125 を指定します。 実行結果 Get Last オペレーションが正常に終了すると、指定したレコードがデータ バッファに返され、対応するキー値がキーバッファに格納されます。また、 そのレコードの長さがデータバッファ長パラメータに返されます。 Get Last オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 Btrieve オペレーション 2-61 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 61 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 ポジショニング Get Last オペレーションは新しい論理および物理カレンシーを確立し、取 得したレコードをカレントレコードにします。論理ネクストポジションは ファイルの末尾よりも後をポイントすることになります。 2-62 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 62 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Less Than (10) キー番号で指定されたキーの値がキーバッファに設定した値よりも次に小 さいレコードを取得します。重複キーの場合は、同じキー値を持つグルー プの中で末尾のレコード (作成順) が取得されます。Get Key (+50) バイア スを使って、ファイル内に値が存在するかどうかを検出することもできま す。一般に、Get Key オペレーションの方が高速に処理されます。 注意 降順キーで Get Less Than オペレーションを実行する場合、「次に小さな値」とは、 実際にはキーバッファに指定されている値よりも大きな値を指すことになります。 パラメータ センド リターン 必要条件 オペレーション ポジション データ コード ブロック バッファ × × × データバッファ長 キーバッファ × × × × × キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 10 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファパラメータに目的のキー値を指定します。 5. キー番号パラメータにキーパスを設定します。システムデータキーを使 用するには、125 を指定します。 実行結果 Get Less Than オペレーションが正常に終了すると、レコードがデータバッ ファに返され、そのレコードに対応するキー値がキーバッファに返されま す。また、そのレコードの長さがデータバッファ長パラメータに返されま す。 Btrieve オペレーション 2-63 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 63 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Get Less Than オペレーションが正常に実行されなった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 22 ポジショニング データバッファパラメータが短すぎます。 Get Less Than オペレーションは新しい論理および物理カレンシーを確立し、 取得したレコードをカレントレコードにします。 2-64 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 64 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Less Than or Equal (11) キー番号で指定されたキーの値がキーバッファに格納した値以下であるレ コードを取得します。まず等しい値を持つレコードが検索されます。重複 キーの場合は、同じキー値を持つグループの中で末尾のレコード (作成順) が取得されます。Get Key (+50) バイアスを使って、ファイル内に値が存在 するかどうかを検出することもできます。一般に、Get Key オペレーション の方が高速に処理されます。 注意 降順キーで Get Less Than or Equal オペレーションを実行する場合、「次に小さな 値」とは、実際にはキーバッファに指定されている値よりも大きな値を指すことに なります。 パラメータ センド リターン 必要条件 オペレーション ポジション データ コード ブロック バッファ × × × データバッファ長 キーバッファ × × × × × キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 手順 1. オペレーションコードに 11 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファパラメータにキー値を指定します。 5. キー番号パラメータにキーパスを設定します。システムデータキーを使 用するには、125 を指定します。 実行結果 Get Less Than or Equal オペレーションが正常に終了すると、レコードが データバッファに返され、キー値がキーバッファに格納されます。また、 そのレコードの長さがデータバッファ長パラメータに返されます。 Btrieve オペレーション 2-65 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 65 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Get Less Than or Equal オペレーションが正常に実行されなかった場合は、 主に次のステータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 22 ポジショニング データバッファパラメータが短すぎます。 Get Less Than or Equal オペレーションは新しい論理および物理カレンシー を確立し、取得したレコードをカレントレコードにします。 2-66 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 66 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Next (6) 論理ネクストポジションにあるレコードを取得します (指定されたキーに 基づいて)。Get Next オペレーションを使用すると、重複するキー値を持つ レコードのグループ内で検索を行うことができます。Get Key (+50) バイア スを使って、ファイル内に値が存在するかどうかを検出することもできま す。一般に、Get Key オペレーションの方が高速に処理されます。 パラメータ センド リターン 必要条件 オペレーション ポジション データ コード ブロック バッファ × × × データバッファ長 キーバッファ × × × × × キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 ◆ アプリケーションでは、指定されたキーに基づく論理ネクストポジ ションを確立しておく必要があります。 手順 1. オペレーションコードに 6 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファに前のオペレーションで取得したキー値を指定します。 キーバッファには、前の呼出しで返されたキー値とまったく同じものを 渡します。ファイル内のカレントポジションを決めるには、直前にキー バッファに格納された情報が必要であるためです。 5. キー番号パラメータに、前の呼出しで使用したキーパスを設定します。 Get Next オペレーションを使ってキーパスを変更することはできません。 実行結果 Get Next オペレーションが正常に終了すると、レコードがデータバッファ に返され、そのレコードのキー値がキーバッファに格納されます。また、 そのレコードの長さがデータバッファ長パラメータに返されます。 Btrieve オペレーション 2-67 TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 67 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 第 2 章 Get Next オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 7 キー番号が変更されました。 8 カレントポジションが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 82 ポジションを失いました。 論理ネクストポジションがファイルの末尾の後をポイントしている場合、 ステータスコード 9 が返されます。 ポジショニング Get Next オペレーションは新しい論理および物理カレンシーを確立し、取 得したレコードをカレントレコードにします。 2-68 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-R2.DOC PAGE: 68 OF 68 LAST SAVED: 98/03/05 16:25 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:25 Get Next Extended (36) 指定されたキーに基づき、論理ネクストポジションからファイルの末尾に 向かって複数のレコードを順に検索します。検索したレコードが一定の フィルタ条件を満たすかどうかチェックした上、条件を満たすレコードだ けを取得します。フィルタ条件は論理式の形で指定し、キーフィールドだ けに制限されません。 Get Next Extended では、レコードの中から指定した部分だけを抽出し、そ の部分だけをアプリケーションに返すこともできます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × × × × × リターン 必要条件 データバッファ長 キーバッファ キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 ◆ 指定したキーに基づいて論理ネクストポジションを確立しておく必要 があります。 手順 1. オペレーションコードに 36 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. 入力データバッファとリターンデータバッファのいずれか大きい方を格 納できるように、十分な長さのデータバッファを指定します。表 2-11 に示す構造に従ってデータバッファを初期化してください。 4. 入力構造 (表 2-11) とリターン構造 (表 2-12) のいずれか大きい方の長 さをデータバッファ長に指定します。 このオペレーションの作業領域は 64 KB です。このため、データバッ ファ構造、取得される最大のレコード、リクエスタのオーバーヘッド (リクエスタを使用している場合) の合計が 65,536 バイトを超えること はできません。 5. キーバッファに前のオペレーションで取得したキー値を指定します。 キーバッファには、前の呼出しで返されたキー値とまったく同じものを Btrieve オペレーション 2-69 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 69 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 渡します。ファイル内のカレントポジションを決めるには、直前にキー バッファに格納された情報が必要であるためです。 6. キー番号パラメータに前の呼出しで使用したキーパスを設定します。 Get Next Extended オペレーションを使ってキーパスを変更することはで きません。 次の表は、入力データバッファの構造を示しています。 詳細 表 2-11 Extended Get および Step オペレーションの入力データバッファ構造 要素 長さ 説明 (バイト単位) ヘッダ 2 入力構造の長さを指定します。 2 2 つの定数のいずれかを指定します。 EG − ポジショニングしたレコードの次のレコードから検索を開始しま す。 UC − ポジショニングしたレコードから検索を開始します。 Step Next Extended オペレーションの場合、この値には常に EG を設定し ます。 フィルタ (固定部分) 2 リジェクトカウントの最大数を指定します。つまり、レコードの検索を 行うときに、フィルタ条件を満たさないものとしてスキップするレコー ドの件数です。0 から 65,535 までの範囲の値を指定できます (0 を指定 すると、システム定義の最大数 (4,095) が使用されます)。 2 フィルタ条件として使用する論理式の項の数を指定します (0 を指定す るとフィルタ処理は実行されません)。 2-70 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 70 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 要素 長さ 説明 (バイト単位) フィルタ 1 (繰り返し部分 − 論理式の各項に 2 ついて繰り返す) 2 フィールドのデータ型を指定します。 フィールド長を指定します。 フィールドのオフセット (0 オリジン) を指定します。 比較演算子のコードを指定します。 1 1 2 3 4 5 6 − − − − − − 等しい より大きい より小さい 等しくない 以上 以下 ファイルの既存の ACS のいずれかを使って文字列を比較するには、+8 バイアスを追加します。1 ファイルのデフォルト ACS を使って文字列を比較するには、+32 バイア スを追加します。デフォルト ACS とは、ファイルで定義されている先 頭の ACS のことです。 2 番目のオペランドが定数ではなく、レコード内の別のフィールドの場 合は、+64 バイアスを追加します。 大小文字を無視して文字列を比較するには、+128 バイアスを追加します。 フィルタ 1 (繰 り 返 し 部 分 の 続き) AND/OR 論理演算子を指定します。 0 − 最後の項目を示します。 1 − 次の項目を AND で結合します。 2 − 次の項目を OR で結合します。 2 または n 2 つのフィールドを比較するときは、2 番目のフィールドに対する 2 バ イトで、0 オリジンのオフセットを指定します (2 番目のフィールドは 同じデータ型で、同じ長さでなければなりません)。 または フィールドを定数と比較するときは、定数の実際の値を指定します。定 数の長さ (n) はフィールド長と同じでなければなりません。 5、9、または 名前によって ACS を指定するときは (バイアス +8)、表 2-8 の ACS 名 のフォーマットを使って、ACS 識別子を指定します。 17 ディスクリプタ 2 (固定部分) 取得するレコード数を指定します。レコードのセットではなく、1 つの レコードだけを取得するには、1 を指定します。 各レコードから抽出するフィールド数を指定します。 2 ディスクリプタ 2 (繰り返し部分 − 抽 出 さ れ る 各 2 フィールドにつ いて繰り返す) 抽出するフィールド長を指定します。 フィールドのオフセット (0 オリジン) を繰り返します。 1 +8 バイアスと +32 バイアスの両方を指定すると、+32 バイアスは無視されます。 Btrieve オペレーション 2-71 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 71 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Extended Get および Step オペレーションのフィルタで使用されている AND お よ び OR 演 算 子 は 、 厳 密 に 左 か ら 右 に 向 か っ て 解 釈 さ れ ま す 。 MicroKernel は、次の規則に従ってファイル内の論理式を評価します。 ◆ カレントレコードに適用された論理式が True で、次の論理演算子が OR の場合、そのレコードはフィルタ条件を満たすものと見なされま す。 ◆ 論理式が True で、次の論理演算子が AND の場合、次のいずれかの条 件が成立するまで、各論理式の評価が継続されます。 ◆ 次の OR 式に達する。 ◆ 論理式のいずれかが False と評価される。 ◆ フィルタの末尾に達する。 ◆ 論理式が False で、次の論理演算子が OR の場合、フィルタ内の次の 論理式の評価が継続されます。 ◆ 論理式が False で、次の論理演算子が AND の場合、そのレコードは フィルタ条件を満たさないと見なされます。 次のいずれかの条件が成立すると、レコードの検索は中止されます。 ◆ フィルタ条件を満たす、指定した数のレコードが検出される。 ◆ フィルタ条件を満たすレコードを検索している間に、検索したレコー ド数が指定したリジェクトカウントの最大数を超えてしまう。 ◆ カレントキーパスがフィルタ条件のフィールドとして使用されていて、 それ以降フィルタ条件を満たすレコードのないリジェクトレコードに 達する。 ◆ ファイルの末尾に達する。 使用例 フィルタ条件を満たす次のレコード全体を取得するには、必要に応じて フィルタ部分を設定し、次のようにディスクリプタフィールドを設定しま す。 1. レコード数に 1 を設定します。 2. フィールド数に 1 を設定します。 3. フィールド長に取得するレコード全体の長さを設定します。 2-72 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 72 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 4. フィールドのオフセットに 0 を設定します。 フィルタ条件を使用することなく次の 12 件のレコードを取得し、各レコー ドから 4 つのフィールドを抽出するには、フィルタ条件として使用する論 理式の項の数に 0 を設定し、次のようにディスクリプタフィールドを設定 第 2 章 します。 1. レコード数に 12 を設定します。 2. フィールド数に 4 を設定します。 3. 抽出する 4 つのフィールドそれぞれについてフィールド長とフィールド のオフセットを設定します。 レコードに含まれるフィールドの取得 Extended オペレーションを使ってレコードのフィールド (レコードの一部) を取得するときは、オペレーションから返される情報が十分にデータバッ ファに収まるかどうかをあらかじめ確認しておく必要があります。 次の表は、MicroKernel から返されるデータバッファの構造を具体的に示し ています。 表 2-12 Extended Get および Step オペレーションのリターンデータバッファ構造 要素 長さ 説明 (バイト単位) レコード数 2 返されたレコード数を示します。 繰り返し部分 (取得されたそれぞれのレコードについて繰り返される) 長さ 0 2 先頭レコードのイメージ (すべてのフィールドを含む) の長さ。 ポジション 0 4 先頭のレコードの物理カレンシー (アドレス)。 レコード 0 n 先頭のレコードのイメージ (すべてのフィールドを含む)。 長さ x 2 末尾レコードのイメージ (すべてのフィールドを含む) の長さ (バイ ト単位)。 ポジション x 4 末尾のレコードの物理カレンシー (アドレス)。 レコード x n 末尾のレコードのイメージ (すべてのフィールドを含む)。 . . . Btrieve オペレーション 2-73 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 73 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 返されたすべてのレコード (またはレコードのフィールド) が固定長であ る場合、リターンデータバッファ内のデータのロケーションは簡単に計算 できます。しかし、Extended オペレーションで取得したデータバッファか らレコードの可変長部分を抽出するには、さらに特別な手順を踏む必要が あります。 レコードの可変長部分が返されるとき、リターンデータバッファ内では余 分なレコードイメージの詰め込みは行われません。このため、レコードの 可変長部分が占有する最大のバイト数を想定してリターンデータバッファ 内のスペースを確保しても、実際に返されたデータがその最大値を下回る 場合、次に返されるフィールドのディスクリプションはカレントフィール ドのデータの直後から始まることになります。 たとえば、固定レコード長が 100 バイトで、可変長部分は最大 300 バイト に達することが予想されるときに、5 つのレコードの可変長部分だけを取 得したいとします。この場合、入力バッファのフィールドディスクリプタ 要素を使って、フィールド長に 300 を設定し、フィールドオフセットに 100 を設定します。リターンバッファについては、次の計算式のように、 レコード数を示す 2 バイトと、それぞれのレコードに対する 306 バイト (つまり、長さの 2 バイト、アドレスの 4 バイト、およびデータの 300 バイ ト) を加算する必要があります。 2 + ((2 バイト + 4 バイト + 300 バイト) × 5) = 1532 バイト しかし、返された先頭のレコードの可変長部分が 50 バイトのデータしかな かったとします。その結果、2 バイトからなる 2 番目のレコードの長さは データバッファのオフセット 58、つまり先頭レコードのフィールドイメー ジの直後に格納されることになります。こうした状況でもアプリケーショ ンでは、データバッファに返された長さ、ポジション、およびデータを正 確に解析する必要があります。 注意 レコードの可変長部分が 1 つのフィールドであり、そのフィールドが完全にデータ バッファに収まりきらず (レコードが十分に長くないため)、しかもそのフィールド が取得される最後のフィールドでない場合、そのレコードからフィールドは返され ません。詳細については、「実行結果」を参照してください。 2-74 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 74 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 実行結果 Get Next Extended オペレーションが正常に終了すると、次の情報が返されま す。 ◆ データバッファには、取得された複数のレコードに含まれるフィール ドが格納されます (表 2-12 を参照してください)。 ◆ データバッファ長には、取得されたバイト数の総計が格納されます。 ◆ キーバッファには、取得された最後のデータレコードのキー値が格納 されます。 Get Next Extended オペレーションが正常に実行されなかった場合は、主に 次のステータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 7 キー番号が変更されました。 8 カレントポジションが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 60 指定されたリジェクトカウントに達しました。 61 作業領域が小さすぎます。 62 ディスクリプタが間違っています。 64 フィルタ条件に達しました。 65 フィールドオフセットが不正です。 82 ポジションを失いました。 134 135 インターナショナルソート規則を読み込めません。 指定されたインターナショナルソート規則テーブルは壊れて いるか不正です。 136 ファイル内で指定されたオルタネートコレーティングシーケ ンスを見つけることができません。 Btrieve オペレーション 2-75 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 75 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 ステータスコードに 0 以外のものが返されても、有効なデータがデータ バッファに返されることがあります。ただしこの場合、返された最後のレ コードは不完全なものになります。データバッファ長パラメータに 0 を超 える 値が 返さ れて いる 場合 は、 デー タバ ッフ ァに 抽出 され たデ ータ を チェックしてください。 フィルタ条件で使用するフィールドと演算子によっては、リクエストを最 適化できる場合があります。たとえば、あらかじめ指定したリジェクトカ ウントに達すると、ステータスコード 64 が返され、ファイルの未検索の部 分にはフィルタ条件を満たすレコードがそれ以上存在しないことが示され ます。 ポジショニング Get Next Extended オペレーションは新しい論理および物理カレンシーを確 立します。検索された最後のレコードがカレントレコードになります。こ のレコードは、フィルタ条件を満たして取得されたレコード、またはフィ ルタ条件を満たさずにリジェクトされたレコードのいずれかです。 注意 MicroKernel では、Get Next Extended オペレーションの後に Delete または Update オペレーションを実行することはできません。カレントレコードは検索された最後 のレコードであるため、アプリケーションには、目的のレコードを適切に削除また は更新しているかどうかを確認する方法がありません。 2-76 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 76 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Get Position (22) カレントレコードの物理 4 バイトポジションを返します。オペレーション を発行したときに、物理カレンシーが確立されていないと、Get Position オ ペレーションは正常に実行されません。レコードのポジション (アドレス) を取得できれば、Get Direct/Record オペレーション (23) を使って、ファイ ル内の物理ロケーションにより目的のレコードを直接取得することができ ます。 MicroKernel では、Get Position オペレーションを実行するために実際のディ スク I/O は行われません。 パラメータ センド ポジション データ コード ブロック バッファ × × × リターン 必要条件 オペレーション データバッファ長 キーバッファ × × キー番号 × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ アプリケーションでは物理カレンシーを確立しておく必要があります。 手順 1. オペレーションコードに 22 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長を少なくとも 4 バイトに設定します。 4. キー番号に 0 を設定します。 実行結果 Get Position オペレーションが正常に終了すると、レコードのポジションがデー タバッファに返されます。ポジションは 4 バイトのバイナリ値で、ファイル内で のレコードのオフセット (バイト単位) を示します。また、データバッファ長に も 4 バイトが設定されます。 Get Position オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 ポジショニング 3 ファイルがオープンされていません。 8 カレントポジションが不正です。 Get Position オペレーションはポジショニングにまったく影響しません。 Btrieve オペレーション 2-77 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 77 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Get Previous (7) 指定されたキーに基づいて、論理プリビアスポジションにあるレコードを 取得します。Get Previous オペレーションを使用すると、重複するキー値を 持つレコードのグループ内で検索を行うことができます。Get Key (+50) バ イアスを使って、ファイル内に値が存在するかどうかを検出することもで きます。一般に、Get Key オペレーションの方が高速に処理されます。 パラメータ オペレーション ポジション データ コード ブロック バッファ × × センド リターン 必要条件 × データバッファ長 × キーバッ キー番号 ファ × × × × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 ◆ アプリケーションでは、指定されたキーに基づく論理ネクストポジ ションを確立しておく必要があります。 手順 1. オペレーションコードに 7 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 4. キーバッファに前のオペレーションで取得したキー値を指定します。 キーバッファには、前の呼出しで返されたキー値とまったく同じものを 渡します。MicroKernel では、ファイル内のカレントポジションを決め るには、直前にキーバッファに格納された情報が必要であるためです。 5. キー番号パラメータに、前の呼出しで使用したキーパスを設定します。 Get Previous オペレーションを使ってキーパスを変更することはできま せん。 実行結果 Get Previous オペレーションが正常に終了すると、キーバッファが新しいレ コードのキー値を使って更新され、データバッファにプリビアスレコード が返されます。また、データバッファ長にレコードの長さが返されます。 Get Previous オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 2-78 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 78 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 7 キー番号が変更されました。 8 カレントポジションが不正です。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 82 ポジションを失いました。 論理プリビアスポジションがファイルの先頭の前をポイントしている場合、 ステータスコード 9 が返されます。 ポジショニング Get Previous オペレーションは新しい論理および物理カレンシーを確立し、 取得したレコードをカレントレコードにします。 Btrieve オペレーション 2-79 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 79 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Get Previous Extended (37) 指定されたキーに基づき、論理プリビアスポジションからファイルの先頭 に向かって複数のレコードを順に検索します。検索したレコードが一定の フィルタ条件を満たすかどうかチェックした上、条件を満たすレコードだ けを取得します。フィルタ条件は論理式の形で指定し、キーフィールドだ けに制限されません。 Get Previous Extended では、レコードの中から指定した部分だけを抽出し、 その部分だけをアプリケーションに返すこともできます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × × × × × リターン 必要条件 データバッファ長 キーバッファ キー番号 × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 対象となるファイルがデータオンリーファイルであってはいけません。 ◆ 指定したキーに基づいて論理プリビアスポジションを確立しておく必 要があります。 手順 1. オペレーションコードに 37 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. 入力データバッファとリターンデータバッファのいずれか大きい方を格 納できるように、十分な長さのデータバッファを指定します。表 2-11 に示す構造に従ってデータバッファを初期化してください。 4. 入力構造 (表 2-11) とリターン構造 (表 2-12) のいずれか大きい方の長 さをデータバッファ長に指定します。 このオペレーションの作業領域は 64 KB です。このため、データバッ ファ構造、取得される最大のレコード、リクエスタのオーバーヘッド (リクエスタを使用している場合) の合計が 65,536 バイトを超えること はできません。 5. キーバッファに前のオペレーションで取得したキー値を指定します。 キーバッファには、前の呼出しで返されたキー値とまったく同じものを 2-80 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 80 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 渡します。ファイル内のカレントポジションを決めるには、直前にキー バッファに格納された情報が必要であるためです。 6. キー番号パラメータに前の呼出しで使用したキーパスを設定します。 Get Previous Extended オペレーションを使ってキーパスを変更すること はできません。 詳細 このオペレーションでは、Get Next Extended オペレーションと同じ入力お よびリターンデータバッファを使用します。詳細については、Get Next Extended オペレーションの「詳細」を参照してください。 実行結果 このオペレーションでは、Get Next Extended オペレーションと同じ実行結 果が返されます。詳細については、Get Next Extended オペレーションの 「実行結果」を参照してください。 ポジショニング Get Previous Extended オペレーションは新しい論理および物理カレンシーを 確立します。検索された最後のレコードがカレントレコードになります。 このレコードは、フィルタ条件を満たして取得されたレコード、または フィルタ条件を満たさずにリジェクトされたレコードのいずれかです。 注意 Extended オペレーション実行後のポジショニングにはあいまいな点があるため、 Get Previous Extended オペレーションの後に Delete または Update オペレーション を実行することはできません。最後に検索されたレコードがカレントレコードにな りますが、Extended オペレーションでは最後に検索されたレコードが必ずしもアプ リケーションに返されないことがあります。このため、削除または更新するレコー ドを確実に特定する方法がなくなってしまいます。 Btrieve オペレーション 2-81 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 81 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Insert (2) ファイルにレコードを挿入します。新しいレコードのキー値を反映して、 キーの B ツリーが調整されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 注意 データバッファ長 キーバッファ × × キー番号 × × NCC (No-currency-change) オプションを使用していると、Insert オペレーションは キーバッファパラメータの値を更新しません。つまり、このパラメータには何の情 報も返されません。 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ 挿入するレコードは適切なレコード長を持つ必要があります。また、 キー値は対象となるファイルで定義されているキーと一致していなけ ればなりません。 手順 1. オペレーションコードに 2 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファに挿入するレコードを格納します。 4. データバッファ長を設定します。この値は少なくともレコードの固定長 部分と同じ長さでなければなりません。 5. ポジショニング情報 (カレンシー) を確立するために使用するキー番号 を指定します。NCC オプションを使用するには、キー番号に -1 (0xFF) を指定します。システムデータキーを使用するには、125 を指定します。 実行結果 Insert オペレーションが正常に終了すると、ファイルに新しいレコードが挿 入され、新しいレコードを反映してキーの B ツリーが更新されます。また、 NCC オプションを指定していない場合は、キーバッファに指定したキーの 値が返されます。 Insert オペレーションが正常に実行されなかった場合は、主に次のステータ スコードのいずれかが返されます。 2-82 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 82 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 ポジショニング 2 I/O エラーが発生しました。 3 ファイルがオープンされていません。 5 レコードのキーフィールドに重複キー値があります。 18 ディスクがいっぱいです。 21 キーバッファパラメータが短すぎます。 22 データバッファパラメータが短すぎます。 NCC オプションを指定していない Insert オプションは新しい論理および物 理カレンシーを確立し、挿入されたレコードをカレントレコードにします。 論理カレンシーは指定されたキーに基づきます。 一方、NCC Insert オプションでは、新しい物理カレンシーは確立されます が、論理カレンシーは影響を受けません。つまり、NCC Insert オペレー ションを実行したアプリケーションでは、ファイルの論理ポジションが Insert オペレーションを実行する前と同じだということです。このような状 況で は、 NCC Insert オ ペレ ー ショ ンに 続 けて 、Get Next (6)、 Get Next Extended (36)、Get Previous (7)、および Get Previous Extended (37) などのオ ペレーションを実行すると、NCC Insert オペレーション実行前の論理カレ ンシーに基づく値が返されます。 注意 NCC Insert オペレーションを実行しても、キーバッファパラメータには何の情報も 返されません。このため、論理カレンシーを保持する必要のあるアプリケーション では、NCC Insert オペレーションに続けてキーバッファの値を変更してはいけませ ん。キーバッファの値を変更してしまうと、次に実行する Get オペレーションの実 行結果は予期できないものになってしまいます。 標準の Insert オペレーションと NCC Insert オペレーションのどちらを実行 しても、新しく挿入されたレコードの物理カレンシーが確立されます。こ の た め 、 NCC Insert オ ペ レ ー シ ョ ン に 続 く Step Next (24) 、 Step Next Extended (38)、Step Previous (35)、Step Previous Extended (39)、Update (3)、 Delete (4)、および Get Position (22) などのオペレーションは、新しい物理カ レンシーに基づいて実行されます。 Btrieve オペレーション 2-83 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 83 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Insert Extended (40) ファイルに複数のレコードを挿入します。新しいレコードのキー値を反映 して、キーの B ツリーが調整されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × リターン 注意 データバッファ長 キーバッファ × キー番号 × × NCC (No-currency-change) オプションを使用していると、Insert Extended オペ レーションはキーバッファパラメータの値を更新しません。つまり、このパラメー タには何の情報も返されません。 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ 挿入するレコードは適切なレコード長を持つ必要があります。また、 キー値は対象となるファイルで定義されているキーと一致していなけ ればなりません。 手順 1. オペレーションコードに 40 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. 表 2-13 の構造に従ってデータバッファを設定します。 4. データバッファ長を設定します。この値はデータバッファ構造のサイズ とまったく同じでなければなりません。 5. ポジショニング情報 (カレンシー) を確立するために使用するキー番号 を指定します。NCC オプションを使用するには、キー番号に -1 (0xFF) を指定します。システムデータキーを使用するには、125 を指定します。 詳細 次の表は、データバッファの構造を示しています。 2-84 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 84 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 表 2-13 Insert Extended オペレーションのデータバッファ構造 要素 長さ 説明 (バイト単位) 固定部分 挿入するレコード数。 2 第 2 章 繰り返し部分 (それぞれのレコードについて繰り返す) 実行結果 2 レコードイメージの長さ。 n レコードイメージ。 Insert Extended オペレーションが正常に終了すると、ファイルに新しいレ コードが挿入され、新しいレコードを反映してキーのすべての B ツリーが 更新されます。また、NCC Insert Extended オペレーションを実行していな い場合は、最後に挿入されたレコードから指定したキーの値が返されます。 さらに、返されたデータバッファの先頭ワードには、ファイルに正常に挿 入されたレコードの数が格納されます。データバッファの先頭ワードの後 には挿入されたレコードのアドレスが格納されます。 オペレーションの一部が正常に実行されず、0 以外のステータスコードが 返された場合、データバッファの先頭ワードの値は正常に挿入されたレ コードの数と等しくなります。エラーの原因となったレコードは、正常に 挿入されたレコード数 + 1 番目のレコードです。 Insert Extended オペレーションが正常に実行されなかった場合は、主に次の ステータスコードのいずれかが返されます。 ポジショニング 2 I/O エラーが発生しました。 3 ファイルがオープンされていません。 5 レコードのキーフィールドに重複キー値があります。 18 ディスクがいっぱいです。 21 キーバッファパラメータが短すぎます。 22 データバッファパラメータが短すぎます。 NCC オプションを指定していない Insert Extended オプションは新しい論理 および物理カレンシーを確立し、最後に挿入されたレコードをカレントレ Btrieve オペレーション 2-85 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 85 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 コードにします (挿入されたレコードのキー値がヌルでないかぎり)。論理 カレンシーは指定されたキーに基づきます。 一方、NCC Insert Extended オペレーションでは、新しい物理カレンシーは 確立されますが、論理カレンシーは影響を受けません。つまり、NCC Insert Extended オペレーションを実行したアプリケーションでは、ファイルの論 理ポジションが Insert Extended オペレーションを実行する前と同じだとい うことです。このような状況では、NCC Insert Extended オペレーションに 続けて、Get Next (6)、Get Next Extended (36)、Get Previous (7)、および Get Previous Extended (37) などのオペレーションを実行すると、NCC Insert Extended オペレーション実行前の論理カレンシーに基づく値が返されます。 注意 NCC Insert Extended オペレーションを実行しても、キーバッファパラメータには 何の情報も返されません。このため、論理カレンシーを保持する必要のあるアプリ ケーションでは、NCC Insert Extended オペレーションに続けてキーバッファの値 を変更してはいけません。キーバッファの値を変更してしまうと、次に実行する Get オペレーションの実行結果は予期できないものになってしまいます。 標準の Insert Extended オペレーションと NCC Insert Extended オペレーショ ンのどちらを実行しても、新しく挿入されたレコードの物理カレンシーが 確立されます。このため、NCC Insert Extended オペレーションに続く Step Next (24)、Step Next Extended (38)、Step Previous (35)、Step Previous Extended (39)、Update (3)、Delete (4)、および Get Position (22) などのオペレーション は、新しい物理カレンシーに基づいて実行されます。 Get Next オペレーション (6) などの、オリジナルの論理カレンシーに基づ くオペレーションを実行するために、Insert Extended オペレーション実行前 のファイルの論理ポジションを保存しておく必要がある場合に、NCC Insert Extended オペレーションが役立ちます。 NCC Insert Extended オペレーションを使用せずに同じ効果を得るには、次 のオペレーションを実行する必要があります。 1. Get Position (22) − 論理カレントレコードに対する 4 バイトの物理アド レスを取得します。アプリケーションではこの値を保存し、ステップ 3 に渡します。 2. Insert Extended (40) − 新しいレコードを挿入します。このオペレー ションにより、新しい論理および物理カレンシーが確立されます。 2-86 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 86 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 3. Get Direct/Record (23) − ステップ 1 の論理および物理カレンシーを再 確立します。 NCC Insert Extended オペレーションを使用すると、論理カレンシーについ てはこれらのオペレーションと同じ効果が得られますが、物理カレンシー については異なる効果が得られる場合があります。たとえば、オペレー ションの実行後に Get Next (6) オペレーションを実行すると同じ結果が得 られますが、Step Next (24) オペレーションを実行すると異なるレコードが 返されることがあります。 Btrieve オペレーション 2-87 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 87 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Open (0) ファイルをオープンし、アクセスできるようにします。アプリケーション がファイルにアクセスするには、まず Open オペレーションを実行する必 要があります。絶対パス名または相対パス名を指定するかぎり、対象とな るファイルがカレントディレクトリに保存されている必要はありません。 パラメータ オペレーション ポジション データ コード ブロック バッファ × センド リターン 必要条件 データバッファ長 キーバッファ × × × キー番号 × × ◆ オープンするファイルはアクセス可能な論理ドライブに保存されてい る必要があります。 ◆ 対象となるファイルのファイルハンドルが使用可能でなければなりま せん。 手順 1. オペレーションコードに 0 を設定します。 2. 対象となるファイルにオーナネームが設定されている場合は、データ バッファパラメータにオーナネームを指定します (オーナネームの末尾 はバイナリ 0 で終端させます)。 3. データバッファ長パラメータにバイナリ 0 を含めたオーナネームの長さ を指定します。 4. キーバッファパラメータにオープンするファイルのパス名を指定します。 パス名の末尾は必ずスペースまたはバイナリ 0 で終端させます。ボ リューム名と区切り文字を含めて、パス名は半角 80 文字までの範囲で 指定できます。 注意 アプリケーションと Scalable SQL との互換性を維持する場合は、半角 64 文字まで の範囲でパス名を指定してください。 5. 表 2-14 を参考にして、キー番号パラメータにオープンモードの値を指 定します。 詳細 キー番号パラメータでは、0 から -4 までのオープンモード値に -32 または -64 バイアスを加算して、標準のオープンモードとファイル共有モードを 2-88 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 88 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 組み合わせることができます。たとえば、-2 に -64 を加算すると (-66)、 そのファイルに対する MEFS (マルチエンジンファイル共有) モードがオン になり、そのファイルはリードオンリーモードでオープンされます。 表 2-14 オープンモード モード 0 -1 第 2 章 説明 ノーマル アクセラレイティド 特定のファイルに対するパフォーマンスを向上させるため、ファイルをアクセラレイティ ドモードでオープンすることができます (v6.x MicroKernel でもアクセラレイティドモード によるオープンを指定できましたが、この指定はノーマルモードによるオープンと解釈さ れていました)。ファイルをアクセラレイティドモードでオープンすると、そのファイルに 対するトランザクションロギングは実行されなくなります。 アクセラレイティドモードと MEFS モードを組み合わせてファイルをオープンすると、 ローカルクライアントは、同じモード (アクセラレイティド + MEFS) でオープンするとき だけ、そのファイルにアクセスできます。リモートクライアントはこのファイルにアクセ スできません。 アクセラレイティドモードと SEFS (シングルエンジンファイル共有) モードを組み合わせて ファイルをオープンすると、ローカルクライアントは、エクスクルーシブを除く任意の オープンモードと SEFS モードを組み合わせて同じファイルをオープンできます。 NetWare 開発者: アクセラレイティドモードでファイルをオープンすると、ファイルにトラ ンザクションフラグを設定する効果がキャンセルされてしまいます (他のプラットフォーム では、ファイルに対する NetWare の TTS フラグは無視されます)。 -2 リードオンリー リードオンリーモードでファイルをオープンすると、そのファイルを読み込むことはでき ますが、更新できなくなります。このモードを使用すると、MicroKernel が自動的に修復で きない不正データを含んだファイルも開くことができます。ファイルのインデックスの データに問題がある場合は、リードオンリーモードでファイルをオープンし、Step Next (24) オペレーションを使用してレコードを取得することができます。 -3 ベリファイ このモードは無視されます。このモードを指定しても、ファイルはノーマルモードでオー プンされます。MicroKernel の以前のバージョンでベリファイモードを指定すると、ディス クに書き込まれたデータの検証が行われていました。 -4 エクスクルーシブ エクスクルーシブモードはファイルに対する排他的なアクセスを可能にします。あるアプ リケーションがエクスクルーシブモードでオープンしたファイルは、クローズするまで他 のアプリケーションからアクセスできなくなります。 Btrieve オペレーション 2-89 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 89 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 モード 説明 -32 シングルエンジンファイル共有バイアス このオープンモードは、SEFS モードでファイルをオープンし、しかもドライブのデフォル トのファイル共有モードが MEFS のときに使用します。 注意: このバイアスは、MicroKernel の [共有バイアスの使用] 環境設定オプションがオンに なっている場合だけ動作します。[共有バイアスの使用] 環境設定オプションがオフになっ ていると、このバイアスの効果はありません。 -64 マルチエンジンファイル共有バイアス このオープンモードは、MEFS モードでファイルをオープンし、しかもドライブのデフォル トのファイル共有モードが SEFS のときに使用します。 注意: このバイアスは、MicroKernel の [共有バイアスの使用] 環境設定オプションがオンに なっている場合だけ動作します。[共有バイアスの使用] 環境設定オプションがオフになっ ていると、このバイアスの効果はありません。 MicroKernel では、最大 250 までのファイルを同時にオープンできますが、 実際にはシステムリソースの制限により、250 のファイルを同時にオープ ンできない場合もあります。 ファイルは 1 度だけオープンされます (MicroKernel は、複数のクライアン トが 1 つのファイルを同時にオープンしている状況や、1 つのクライアン トがファイル内の複数のポジションブロックにアクセスしている状況を認 識して適切に処理します)。拡張ファイルをオープンするときは、1 つのハ ンドルが使用され、ベースファイルとすべてのエクステンションファイル がオープンされます。 注意 NetWare サーバ版 MicroKernel で拡張ファイルをオープンするとき、NetWare セ キュリティが適用されるのはベースファイルのみで、エクステンションファイルに は適用されません。あるユーザがベースファイルに対する NetWare アクセス権を 持っていて、エクステンションファイルにはアクセス権を持っていないというまれ なケースでは、NetWare セキュリティに対する違反が発生することがあります。 ワークステーションエンジンの場合、NetWare セキュリティは常に適用されます。 このため、このようなユーザはエクステンションファイルにアクセスできなくなり ます。 実行結果 Open オペレーションが正常に終了すると、目的のファイルにファイルハン ドルが割当てられ、新しくオープンしたファイルに対するオペレーション の実行時に渡されるポジションブロックが予約されて、そのファイルへの アクセスが可能になります。 2-90 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 90 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Open オペレーションが正常に実行されなかった場合は、主に次のステータ スコードのいずれかが返されます。 2 I/O エラーが発生しました。 11 指定されたファイル名は不正です。 12 指定されたファイルがありません。 20 MKDE または Btrieve リクエスタが実行されていません。 46 要求されたファイルへのアクセスが拒否されました。 84 レコードまたはページがロックされています。 85 ファイルがロックされています。 86 ファイルテーブルがいっぱいです。 87 ハンドルテーブルがいっぱいです。 88 トランザクション外で読み込んだレコードを変更しようとし ました。 次の 3 つの表には、SEFS を使ったローカルクライアント、MEFS を使った ローカルクライアント、およびリモートクライアント (MEFS を暗黙に使 用しています) で使用可能なオープンモードの組み合わせを示します。 表 2-15 には、SEFS を使ったローカルクライアントで使用できるオープン モードを示します。 表 2-15 SEFS を使用するローカルクライアントで使用可能なオープンモードの組み合わせ ローカルクライアント 1 の オープンモード ローカルクライアント 2 の オープンモード 実行結果 ノーマル ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド 正常終了 ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド 正常終了 リードオンリー Btrieve オペレーション 2-91 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 91 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 ローカルクライアント 1 の オープンモード ローカルクライアント 2 の オープンモード 実行結果 エクスクルーシブ ノーマル ステータスコード 88 リードオンリー ステータスコード 88 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド 正常終了 アクセラレイティド 表 2-16 には、MEFS を使ったローカルクライアントで使用できるオープン モードを示します。 表 2-16 MEFS を使用するローカルクライアントで使用可能なオープンモードの組み合わせ ローカルクライアント 1 の オープンモード ローカルクライアント 2 の オープンモード 実行結果 ノーマル ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル ステータスコード 88 リードオンリー ステータスコード 88 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル ステータスコード 88 リードオンリー ステータスコード 88 エクスクルーシブ ステータスコード 88 アクセラレイティド 正常終了 リードオンリー エクスクルーシブ アクセラレイティド 2-92 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 92 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 表 2-17 には、リモートクライアントで使用できるオープンモードを示しま す。リモートクライアントでは MEFS が暗黙に使用されています。 表 2-17 リモートクライアントで使用可能なオープンモードの組み合わせ 第 2 章 リモートクライアント 1 の オープンモード リモートクライアント 2 の オープンモード 実行結果 ノーマル ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル 正常終了 リードオンリー 正常終了 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル ステータスコード 88 リードオンリー ステータスコード 88 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 ノーマル ステータスコード 88 リードオンリー ステータスコード 88 エクスクルーシブ ステータスコード 88 アクセラレイティド ステータスコード 88 リードオンリー エクスクルーシブ アクセラレイティド ポジショニング Open オペレーションはポジショニングの確立を行いません。ただし、物理 ネクストレコードがファイル内の先頭物理レコードになります。 Btrieve オペレーション 2-93 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 93 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Reset (28) クライアントが保持しているすべてのリソースを解放します。このオペ レーションは実行中のトランザクションを中止して、すべてのロックを解 除し、クライアントがオープンしたファイルをすべてクローズします。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ × × キー番号 × リターン 必要条件 MicroKernel またはリクエスタがロードされていて、Reset 呼出しを発行す るクライアントが MicroKernel との接続を確立していれば (たとえば、ファ イルをオープンしたり、Btrieve ユーティリティを使ってファイルのステー タスを検出して)、アプリケーションではいつでも Reset オペレーションを 発行することができます。 手順 1. オペレーションコードに 28 を設定します。 2. キー番号とキーバッファに 0 を設定します。 実行結果 Reset オペレーションが正常に終了すると、指定されたクライアント、ウィ ンドウ、またはセッションに対して次のアクションが順に実行されます。 1. 実行中のトランザクションがすべて中止される。 2. 保持されているすべてのロックが解除される。 3. すべてのオープンファイルがクローズされる。 Reset オペレーションが正常に実行されなかった場合は、0 以外のステータ スコードが返されます。 ポジショニング Reset オペレーションは、オープンファイルをすべてクローズするため、す べてのカレンシー情報を消去します。 2-94 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 94 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Set Directory (17) 指定されたパス名をカレントディレクトリとして設定します。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ × キー番号 × リターン 必要条件 対象となる論理ディスクドライブおよびディレクトリはアクセス可能でな ければなりません。 手順 1. オペレーションコードに 17 を設定します。 2. キーバッファに対象となる論理ディスクドライブとディレクトリのパス を格納します (パスの末尾はバイナリ 0 で終端させます)。ドライブ名 を省略すると、デフォルトドライブが使用されます。ディレクトリに対 する絶対パスを指定しないと、キーバッファに指定したディレクトリの パスがカレントディレクトリに追加されます。 実行結果 Set Directory オペレーションが正常に終了すると、キーバッファに指定した ディレクトリがカレントディレクトリになります。 Set Directory オペレーションが正常に実行されなかった場合、カレントディ レクトリは変更されず、0 以外のステータスコードが返されます。 ポジショニング Set Directory オペレーションはポジショニングにまったく影響しません。 Btrieve オペレーション 2-95 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 95 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Set Owner (29) ファイルにオーナネームを割当て、この名前を入力しないユーザがその ファイルにアクセスしたり、そのファイルを変更できないようにします。 ファイルにオーナネームが設定されていると、ユーザまたはアプリケー ションでは、そのファイルを開くたびにオーナネームを指定する必要があ ります。ファイルにアクセスするたび、またはファイルを更新するときだ けにオーナネームが必要になるように指定できます。 オーナネームを割当てるときに、ディスク上のファイルのデータを暗号化 するように MicroKernel に命令することもできます。データの暗号化を指 定すると、Set Owner オペレーションの実行中にすべてのデータが暗号化さ れます。このため、ファイルサイズが大きければ大きいほど、Set Owner オ ペレーションの完了に要する時間は長くなります。 パラメータ オペレーション ポジション データ コード ブロック バッファ × × × センド リターン 必要条件 データバッファ長 キーバッファ × × キー番号 × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ トランザクションが実行中でないことが必要です。 ◆ 対象となるファイルに既にオーナネームが設定されていてはいけませ ん。 手順 1. オペレーションコードに 29 を設定します。 2. 保護するファイルを識別するポジションブロックを渡します。 3. データバッファとキーバッファの両方にオーナネームを格納します。両 方のバッファに同じオーナネームを格納するのは、誤って不正なオーナ ネームを指定するのを防ぐためです。オーナネームは半角 8 文字までの 範囲で指定でき、その末尾はバイナリ 0 で終端させる必要があります。 4. データバッファ長を設定します。 5. キー番号に整数を設定し、ファイルに対するアクセス制限と暗号化のタ イプを指定します (表 2-18 を参照してください)。 2-96 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 96 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 詳細 一度オーナネームを指定すると、Clear Owner オペレーションを発行するま でそのまま残ります。 次に、キーバッファに指定できるアクセス制限コードの一覧を示します。 表 2-18 アクセスおよび暗号化コード 第 2 章 コード 説明 0 すべてのアクセスモードでオーナネームが必要になります (データは暗号化されません)。 1 オーナネームがなくてもリードオンリーアクセスは許可されます (データは暗号化されませ ん)。 2 すべてのアクセスモードでオーナネームが必要になります (データが暗号化されます)。 3 オーナネームがなくてもリードオンリーアクセスは許可されます (データが暗号化されま す)。 実行結果 Set Owner オペレーションが正常に終了すると、それ以降のオペレーション では正しいオーナネームを指定しないかぎりファイルへのアクセスやファ イルの変更を行えなくなります。唯一の例外は、オーナネームを入力しな くてもリードオンリーアクセスが許可されている場合だけです。さらに、 Set Owner オペレーションが正常に終了すると、ファイル内のデータが暗号 化されます (暗号化を指定した場合のみ)。 Set Owner オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 ポジショニング 41 実行しようとした操作は許可されていません。 50 ファイルのオーナネームが既に設定されています。 51 オーナネームが不正です。 Set Owner オペレーションはポジショニングにまったく影響しません。 Btrieve オペレーション 2-97 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 97 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Stat (15) ファイルを作成したときにファイルに指定されているスペックを取得しま す。また、ファイル内のレコード件数、ファイル内の各インデックスに格 納されている重複のないキー値の数、ファイル内の未使用ページの数、お よびファイル作成以降に定義されたキーなどの情報も返されます。 パラメータ オペレーション ポジション データ コード ブロック バッファ × × × × × × × × センド リターン 必要条件 手順 データバッファ長 キーバッファ キー番号 × 対象となるファイルがオープンされている必要があります。 1. オペレーションコードに 15 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. 対象となるファイルの情報を格納するのに十分なデータバッファを確保 します。 4. データバッファ長を設定します。ファイルの情報を十分に格納できる長 さでなければなりません (詳細については、表 2-19 と表 2-20 を参照し てください)。 5. 少なくとも 64 バイトを格納できるキーバッファを設定します。 6. 次のようにキー番号を設定します。 ◆ ファイルバージョンおよび未使用の重複ポインタ情報を除外するに は、0 を指定します。表 2-19 を参考にして、返されたデータバッ ファを解析してください。 ◆ ファイルバージョンおよび未使用の重複ポインタ情報を含めるには、 -1 (0xFF) を指定します。表 2-20 を参考にして、返されたデータ バッファを解析してください。 詳細 ファイル作成以降に追加されたものを含めて、ファイル内のすべてのキー に関する情報が返されます。このキー情報には適用可能な ACS 定義が含ま れています。データバッファにこれらの情報が格納されることをあらかじ め計算に入れておく必要があります。特に、このオペレーションでは、 2-98 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 98 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Create (14) オペレーションに使用したものと同じデータバッファを使用し ないでください。 MicroKernel では、ファイル内に最大 119 までのキーと複数の ACS を定義で きるため、考えられるうる最長のデータバッファは 33,455 バイトになります (つまり、16 + (119×16) + (119×265))。しかし実際には、これほど長いデータ バッファが必要になることはありません。一定の情報だけが必要な場合は、 もっとも短いデータバッファを指定します。たとえば、データバッファ長に 1,920 バイトを設定したとします (つまり、16 + (119×16))。この設定でも、す べてのキー情報を十分に格納できます。ただし、すべての ACS を格納するこ とはできないかもしれません。ACS についての情報を必要としないアプリ ケーションでは、この方法を使うことができます。 キー番号パラメータの値として 0 を指定した場合、次のような情報が返さ れます。 表 2-19 ファイルバージョン情報を除外したデータバッファ 要素 説明 長さ (バイト単位) ファイルスペック レコード長 2 ページサイズ 2 インデックス数 2 レコード数 4 ファイルフラグ 2 予約されています 2 未使用ページ 2 キースペック キーポジション (各キーセグメントについて キー長 繰り返される) 2 2 キーフラグ 2 重複のないキー値の数 4 拡張キータイプ 1 ヌル値 1 予約されています 2 キー番号 1 ACS (オルタネートコレーティングシーケンス) 番号 1 Btrieve オペレーション 2-99 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 99 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 要素 説明 長さ (バイト単位) ACS 番号 0 ACS 265 . . . . . . . . . ACS 番号 x ACS 265 キー番号パラメータの値として -1 を指定した場合、次のような情報が返 されます。 表 2-20 ファイルバージョン情報を含めたデータバッファ 要素 説明 ファイルスペック レコード長 2 ページサイズ 2 インデックス数 1 ファイルバージョン番号 1 レコード数 4 ファイルフラグ 2 未使用重複ポインタ数 1 予約されています 1 未使用ページ 2 キースペック (各キーセグメ キーポジション ントについて繰り返される) キー長 2 2 キーフラグ 2 重複のないキー値の数 4 拡張キータイプ 1 ヌル値 1 予約されています 2 キー番号 1 ACS 番号 1 2-100 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 100 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 長さ (バイト単位) 要素 説明 長さ (バイト単位) ACS 番号 0 ACS 265 . . . . . . . . . ACS 番号 x ACS 265 ファイルスペック 返されたデータバッファに含まれるファイルスペックは、次の点を除いて、 「Create (14)」で説明したものとまったく同じです。 ◆ データバッファにファイルバージョン情報が含まれている場合、イン デックス数が 1 バイトの長さになり、その後に 1 バイトのファイル バージョン番号が続きます。ファイルバージョン番号の値を 10 進に 変換しないでください。0x70 という値はそのファイルが v7.0 ファイ ルであることを示し、0x60 という値はそのファイルが v6.x ファイル であることを示します。ファイルを作成するとき、ファイルに定義さ れている属性に従ってバージョン番号が割当てられます。 ◆ レコード数はファイル内のレコードの数を表す 4 バイトの値です。 ◆ ファイルフラグワードで、Bit 9 と 12 は次のような意味を持ちます。 Bit 9 = 1 かつ ファイルはシステムデータを使って作成されま Bit 12 = 0 した (この情報は必ずしも、現在システムデー タが使用されているということを意味しませ ん。削除されている場合もあります)。 Bit 9 = 1 かつ ファイルはシステムデータを使わずに作成され Bit 12 = 1 ました。 Stat オペレーションでは、システムデータがデフォルトまたは明示的 に組み込まれているかどうかということは示されません。 ◆ データバッファにファイルバージョン情報が含まれている場合、1 バ イトの未使用重複ポインタの数がファイルフラグフィールドの後に続 き、ファイル内に残されている未使用重複ポインタの数が示されます。 Btrieve オペレーション 2-101 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 101 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 ◆ Stat オペレーションでは無視されますが、予約済領域も割当てられて います。 キースペック 返されたデータバッファに含まれるキースペックは、次の点を除いて、 「Create (14)」で説明したものとまったく同じです。キーフラグの後には 4 バイトの重複のないキー値の数が続き、指定されたキーに対して一意で重 複のない値を含むレコードの数が示されます。 ACS 返されたデータバッファに含まれる ACS 定義は、「Create (14)」で説明し たものとまったく同じです。 実行結果 Stat オペレーションが正常に終了すると、ファイルおよびキーのスペック がデータバッファに返され、データバッファの長さがデータバッファ長に 返されます。対象となるファイルが拡張ファイルの場合は、先頭のエクス テンションファイルのファイル名がキーバッファに返されます。先頭のエ クステンションファイルのファイル名が半角 63 文字を超える場合は、ファ イル名の切り捨てが行われます。対象となるファイルが拡張ファイルでな いと、キーバッファの先頭バイトに 0 が設定されます。 Stat オペレーションが正常に実行されなかった場合は、主に次のステータ スコードのいずれかが返されます。 3 22 ポジショニング ファイルがオープンされていません。 データバッファパラメータが短すぎます。 Stat オペレーションはポジショニングにまったく影響しません。 2-102 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 102 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Stat Extended (65) 2 つのサブファンクションが用意されています。一方のサブファンクショ ンは、拡張ファイルのコンポーネント (ベースファイルとエクステンショ ンファイル) のファイル名とパスを返します。もう一方のサブファンク ションは、ファイル内のレコードがシステムデータを使用しているかどう か、つまり、ファイルにトランザクション一貫性保守が設定されているか どうかをレポートします。 パラメータ オペレーション ポジション データ コード ブロック バッファ × × × × × × センド リターン 必要条件 手順 データバッファ長 キーバッファ キー番号 × 対象となるファイルがオープンされている必要があります。 1. オペレーションコードに 65 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファに拡張 Stat 構造を格納します。拡張 Stat 構造の詳細に ついては、「詳細」を参照してください。 4. データバッファ長を設定します。 5. キー番号に 0 を設定します。 詳細 拡張ファイルのコンポーネントに関する情報を取得するには、次の表を参 考にして、データバッファに拡張ファイルディスクリプタを作成する必要 があります。 表 2-21 拡張ファイルディスクリプタ 要素 長さ 説明 (バイト単位) 識別バイト 4 Stat Extended 呼出しのタイプを識別します。0x74537845 を指定し ます (この値は ASCII の「ExSt」に相当します)。 サブファンクション 4 Stat Extended 呼出しのタイプを識別します。0x00000001 を指定し ます。 ネームスペース 4 ファイル名規則を識別します。0x00000000 を指定します。 Btrieve オペレーション 2-103 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 103 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 要素 長さ 説明 (バイト単位) ファイルの最大数 4 返されるファイル名の最大数を指定します。拡張ファイルを構成 するエクステンションファイルの数を超える値を設定することが できます (拡張ファイルは最大 32 個のエクステンションファイル から構成されます)。 先頭ファイルのシーケ ンス 4 返される先頭のファイル名のシーケンス番号を指定します。ベー スファイルから始めるには 0 を指定し、先頭のエクステンション ファイルから始めるには 1 を指定します (以下同様)。エクステン ションファイルの数を超える値を指定すると、ステータスコード 0 が返されますが、ファイル名はまったく返されません。 ファイルでのシステムデータの使用に関する情報を取得するには、次の表 を参考にして、データバッファにシステムデータディスクリプタを作成す る必要があります。 表 2-22 システムデータディスクリプタ 要素 長さ 説明 (バイト単位) 識別バイト 4 Stat Extended 呼出しのタイプを識別します。0x74537845 を指定し ます (この値は ASCII の「ExSt」に相当します)。 サブファンクション 4 Stat Extended 呼出しのタイプを識別します。0x00000002 を指定し ます。 実行結果 Stat Extended オペレーションが正常に終了すると、データバッファにファ イルの情報が返され、データバッファ長パラメータに返されたバイト数が 設定されます。 拡張ファイルサブファンクションの場合は、次のような拡張ファイル構造 がデータバッファに返されます。 表 2-23 拡張ファイルリターンバッファ 要素 長さ 説明 (バイト単位) ファイル数 4 拡張ファイルを構成するオペレーティングシステムファイル の数を指定します。 エクステンションファイル数 4 返されたエクステンションファイルの数を指定します。 ファイル名部分 (返された各ファイル名について繰り返される) ファイル名の長さ 4 エクステンションファイル名の長さを指定します。 ファイル名 n エクステンションファイルを指定します。 2-104 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 104 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 システムデータサブファンクションの場合は、次のようなシステムデータ 構造がデータバッファに返されます。 表 2-24 システムデータリターンバッファ 要素 長さ 第 2 章 説明 (バイト単位) システムデータを持つ 1 ファイルのレコードにシステムデータが含まれているかどう かを示します。1 = Yes、0 = No。 ログキーを持つ 1 システムデータが削除されることなく、キーとして現在使用 されているかどうかを示します。1 = Yes、0 = No。 ログ可能 1 トランザクション一貫性を実現するために使用される重複の ないキーがファイルに含まれているかどうかを示します。こ のキーはユーザ定義の重複のないキーか、システムデータの いずれかです。1 = Yes、0 = No。 ログキー番号 1 トランザクションログキーとして現在使用されているキー番 号を指定します。システムデータキーがトランザクションロ グキーとして使用されていると、この値は 125 になります。 システムデータのサイズ 2 システムデータキーのサイズで、8 を指定します。 システムデータのバージョン 2 定数 700 (0x2BC)。 Stat Extended オペレーションが正常に実行されなかった場合は、主に次の ステータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 6 キー番号パラメータが不正です。 22 データバッファパラメータが短すぎます。 62 ディスクリプタが間違っています。 Btrieve オペレーション 2-105 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 105 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Step First (33) ファイル内で物理的に先頭のレコードを取得します。このレコードを取得 するためにキーは使用されません。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 必要条件 手順 データバッファ長 キーバッファ キー番号 × × × 対象となるファイルがオープンされている必要があります。 1. オペレーションコードに 33 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 実行結果 Step First オペレーションが正常に終了すると、ファイル内の先頭の物理レ コードがデータバッファに返され、返されたバイト数がデータバッファ長 パラメータに設定されます。 Step First オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 9 ファイルの終わりに対して操作が行われました (ファイルが空 のとき)。 22 ポジショニング データバッファパラメータが短すぎます。 Step First オペレーションは論理カレンシーを消去します。取得したレコー ドを物理カレントレコードとして使用し、物理カレンシーが設定されます。 物理プリビアスポジションはファイルの先頭よりも前をポイントすること になります。 2-106 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 106 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Step Last (34) ファイル内で物理的に末尾のレコードを取得します。このレコードを取得 するためにキーは使用されません。 第 2 章 パラメータ オペレーション ポジション データ コード ブロック バッファ × × センド × リターン 必要条件 手順 データバッファ長 キーバッファ キー番号 × × × 対象となるファイルがオープンされている必要があります。 1. オペレーションコードに 34 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 実行結果 Step Last オペレーションが正常に終了すると、ファイル内の末尾の物理レ コードがデータバッファに返され、返されたバイト数がデータバッファ長 パラメータに設定されます。 Step Last オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 9 ファイルの終わりに対して操作が行われました (ファイルが空 のとき)。 22 ポジショニング データバッファパラメータが短すぎます。 Step Last オペレーションは論理カレンシーを消去します。取得したレコー ドを物理カレントレコードとして使用し、物理カレンシーが設定されます。 物理ネクストポジションはファイルの末尾よりも後をポイントすることに なります。 Btrieve オペレーション 2-107 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 107 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Step Next (24) 物理ネクストポジションとしてポイントされるレコードを取得します。こ のレコードを取得するためにキーは使用されません。 Step Next オペレーションを任意の Get または Step オペレーションの直後に 実行すると、前のオペレーションで取得されたレコードの、物理的に次に あるレコードが返されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 必要条件 手順 データバッファ長 キーバッファ キー番号 × × × 対象となるファイルがオープンされている必要があります。 1. オペレーションコードに 24 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 実行結果 Step Next オペレーションが正常に終了すると、ファイル内の物理ネクスト レコードがデータバッファに返され、返されたバイト数がデータバッファ 長パラメータに設定されます。 Step Next オペレーションが正常に実行されなかった場合は、主に次のス テータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 9 ファイルの終わりに対して操作が行われました。 22 ポジショニング データバッファパラメータが短すぎます。 Step Next オペレーションは論理カレンシーを確立しません。取得したレ コードを物理カレントレコードとして使用し、物理カレンシーが設定され ます。 2-108 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 108 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Delete オペレーション (4) の直後に Step Next オペレーションを発行すると、 Delete の前のオペレーションで物理ネクストレコードとして確立されたレ コードが返されます。 Open オペレーション (0) の直後に Step Next オペレーションを実行すると、 ファイル内の先頭レコードが返されます。 Btrieve オペレーション 2-109 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 109 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Step Next Extended (38) 物理ネクストポジションからファイルの末尾に向かって複数のレコードを 順に検索します。検索したレコードが一定のフィルタ条件を満たすかどう かチェックした上で、条件を満たすレコードだけを取得します。フィルタ 条件は論理式の形で指定し、キーフィールドだけに制限されません。 Step Next Extended では、既存のレコードの中から指定したフィールドだけ を抽出し、抽出したフィールドだけを含む新しいレコードのセットを取得 することもできます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × × × リターン 必要条件 データバッファ長 キーバッファ キー番号 ◆ 対象となるファイルがオープンされている必要があります。 ◆ 物理ネクストポジションを確立しておく必要があります (たとえば、 Delete オペレーションに続けて Step Next Extended オペレーションを 実行することはできません)。 手順 1. オペレーションコードに 38 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. 入力データバッファとリターンデータバッファのいずれか大きい方を格 納できるように、十分な長さのデータバッファを指定します。表 2-11 に示す構造に従ってデータバッファを初期化してください。 4. 操作手順 3 に従って、データバッファ長に適切な値を設定します。 このオペレーションの作業領域は 64 KB です。このため、データバッ ファ構造、取得される最大のレコード、リクエスタのオーバーヘッド (リクエスタを使用している場合) の合計が 65,536 バイトを超えること はできません。 詳細 Step Next Extended オペレーションでは、Get Next Extended オペレーション と同じ入力およびリターンデータバッファを使用します。詳細については、 Get Next Extended オペレーションの「詳細」を参照してください。 2-110 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 110 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 実行結果 Step Next Extended オペレーションが正常に終了すると、データバッファに は取得された複数のレコードに含まれるフィールドが返されます (表 2-12 を参照してください)。また、データバッファ長パラメータには、データ バッファに返されたバイト数が設定されます。 Step Next Extended オペレーションが正常に実行されなかった場合は、主に 次のステータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 60 指定されたリジェクトカウントに達しました。 61 作業領域が小さすぎます。 62 ディスクリプタが間違っています。 64 フィルタ条件に達しました。 65 フィールドオフセットが不正です。 82 ポジションを失いました。 134 インターナショナルソート規則を読み込めません。 135 指定されたインターナショナルソート規則テーブルは壊れて いるか不正です。 136 ファイル内で指定されたオルタネートコレーティングシーケ ンスを見つけることができません。 ステータスコードに 0 以外のものが返されても、有効なデータがデータ バッファに返されることがあります。ただしこの場合、返された最後のレ コードは不完全なものになります。データバッファ長パラメータに 0 を超 える 値が 返さ れて いる 場合 は、 デー タバ ッフ ァに 抽出 され たデ ータ を チェックしてください。 ポジショニング Step Next Extended オペレーションは新しい論理カレンシーを確立しません が、検索された最後のレコード (必ずしも取得されるとは限りません) を カレント物理レコードにします。このレコードは、フィルタ条件を満たし Btrieve オペレーション 2-111 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 111 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 て取得されたレコード、またはフィルタ条件を満たさずにリジェクトされ たレコードのいずれかです。 注意 MicroKernel では、Step Next Extended オペレーションの後に Delete または Update オペレーションを実行することはできません。これは、Extended オペレーション実 行後のポジショニングにはあいまいな点があるためです。検索された最後のレコー ドがカレントレコードになりますが、Extended オペレーションでは最後に検索され たレコードが必ずしも返されない場合があります。このため、削除または更新する レコードを確実に特定する方法がなくなってしまいます。 2-112 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 112 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Step Previous (35) 物理プリビアスポジションとしてポイントされるレコードを取得します。 Step Previous オペレーションがレコードを取得するためにキーは使用され ません。 Step Previous オペレーションを任意の Get または Step オペレーションの直 後に実行すると、前のオペレーションで取得されたレコードの、物理的に 前にあるレコードが返されます。 パラメータ センド ポジション データ コード ブロック バッファ × × × リターン 必要条件 オペレーション データバッファ長 キーバッファ キー番号 × × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ 物理プリビアスポジションを確立しておく必要があります (たとえば、 Delete オペレーションに続けて Step Previous オペレーションを実行す ることはできません)。 手順 1. オペレーションコードに 35 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. データバッファ長に取得するレコードの長さ以上の値を設定します。 実行結果 Step Previous オペレーションが正常に終了すると、ファイル内の物理プリ ビアスレコードがデータバッファに返され、返されたバイト数がデータ バッファ長パラメータに設定されます。 Step Previous オペレーションが正常に実行されなかった場合は、主に次の ステータスコードのいずれかが返されます。 3 ファイルがオープンされていません。 9 ファイルの終わりに対して操作が行われました。 22 データバッファパラメータが短すぎます。 Btrieve オペレーション 2-113 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 113 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 ポジショニング Step Previous オペレーションは論理カレンシーを確立しません。取得した レコードを物理カレントレコードとして使用し、物理カレンシーが設定さ れます。 2-114 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 114 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Step Previous Extended (39) 物理プリビアスポジションからファイルの先頭に向かって複数のレコード を順に検索します。検索したレコードが一定のフィルタ条件を満たすかど うかチェックした上、条件を満たすレコードだけを取得します。フィルタ 条件は論理式の形で指定し、キーフィールドだけに制限されません。 Step Previous Extended では、既存のレコードの中から指定したフィールド だけを抽出し、抽出したフィールドだけを含む新しいレコードのセットを 取得することもできます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × × × × × リターン 必要条件 データバッファ長 キーバッファ キー番号 ◆ 対象となるファイルがオープンされている必要があります。 ◆ 物理ネクストポジションを確立しておく必要があります (たとえば、 Delete オペレーションに続けて Step Previous Extended オペレーション を実行することはできません)。 手順 1. オペレーションコードに 39 を設定します。 2. 対象となるファイルに対するポジションブロックを渡します。 3. 入力データバッファとリターンデータバッファのいずれか大きい方を格 納できるように、十分な長さのデータバッファを指定します。表 2-11 に示す構造に従ってデータバッファを初期化してください。 4. 操作手順 3 に従って、データバッファ長に適切な値を設定します。 このオペレーションの作業領域は 64 KB です。このため、データバッ ファ構造、取得される最大のレコード、リクエスタのオーバーヘッド (リクエスタを使用している場合) の合計が 65,536 バイトを超えること はできません。 詳細 Step Previous Extended オペレーションでは、Get Next Extended オペレーショ ンと同じ入力およびリターンデータバッファを使用します。詳細について は、Get Next Extended オペレーションの「詳細」を参照してください。 Btrieve オペレーション 2-115 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 115 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 実行結果 このオペレーションでは、Step Next Extended オペレーションと同じ実行結 果が返されます。詳細については、Step Next Extended オペレーションの 「実行結果」を参照してください。 ポジショニング Step Previous Extended オペレーションは新しい論理カレンシーを確立しま せんが、検索された最後のレコード (必ずしも取得されるとは限りません) をカレント物理レコードにします。このレコードは、フィルタ条件を満た して取得されたレコード、またはフィルタ条件を満たさずにリジェクトさ れたレコードのいずれかです。 注意 MicroKernel では、Step Previous Extended オペレーションの後に Delete または Update オペレーションを実行することはできません。これは、Extended オペレー ション実行後のポジショニングにはあいまいな点があるためです。検索された最後 のレコードがカレントレコードになりますが、Extended オペレーションでは最後に 検索されたレコードが必ずしも返されない場合があります。このため、削除または 更新するレコードを確実に特定する方法がなくなってしまいます。 2-116 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 116 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Stop (25) すべてのロックの解除、すべてのオープンファイルのクローズなど、クラ イアントに対するいくつかの終了ルーチンを実行します。 注意 第 2 章 OS/2 開発者: Stop オペレーションは Reset (28) と同様に動作します。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ データバッファ長 キーバッファ キー番号 × リターン 手順 実行結果 オペレーションコードに 25 を設定します。 Stop オペレーションが正常に終了すると、次のアクションが実行されます。 1. 実行中のトランザクションがすべて中止されます。 2. クライアントによって保持されているすべてのロックが解除されます。 3. クライアントがオープンしたすべてのファイルがクローズされます。 4. 他のクライアント (つまり、MicroKernel に登録されている他のアプリ ケーション) が存在しない場合、MicroKernel の環境設定にもよります が、MicroKernel の実行が終了し、それまで使用されていたリソースが 解放されます。 Stop オペレーションが正常に実行されなかった場合は、0 以外のステータ ス コ ー ド が 返 さ れ ま す 。 も っ と も 多 い の が ス テ ー タ ス コ ー ド 20 (MicroKernel または Btrieve リクエスタが実行されていません。) です。こ のステータスは MicroKernel またはリクエスタがロードされていないため に発生します。 ポジショニング Stop オペレーションは、オープンファイルをすべてクローズするため、す べてのカレンシー情報を消去します。 Btrieve オペレーション 2-117 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 117 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Unlock (27) レコードに設定されているロックを解除します。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × データバッファ長 キーバッファ キー番号 × × リターン 必要条件 アプリケーションで、少なくとも 1 つのレコードロックが保持されている 必要があります。 手順 シングルレコードロックを解除するには、次の操作を行います。 1. オペレーションコードに 27 を設定します。 2. ロックされたレコードを含むファイルのポジションブロックを渡します。 3. キー番号に負でない値を設定します。 マルチレコードロックが設定されている 1 つのレコードのロックを解除す るには、まずそのレコードを対象に Get Position オペレーション (22) を発 行して、ロックを解除するレコードの 4 バイトポジションを取得します。 この後、次の手順に従って Unlock オペレーションを発行します。 1. オペレーションコードに 27 を設定します。 2. ロックされたレコードを含むファイルのポジションブロックを渡します。 3. Get Position オペレーションによって返された 4 バイトポジションを データバッファに格納します。 4. データバッファ長に 4 を設定します。 5. キー番号パラメータに -1 を設定します。 ファイルに設定されている、すべてのマルチレコードロックを解除するに は、次の操作を行います。 1. オペレーションコードに 27 を設定します。 2. マルチロックを含むファイルのポジションブロックを渡します。 3. キー番号パラメータに -2 を設定します。 2-118 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 118 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 実行結果 Unlock オペレーションが正常に終了すると、オペレーションで指定した ロックがすべて解除されます。 Unlock オペレーションが正常に実行されなかった場合は、0 以外のステー タスコード、特にステータスコード 81 (ロックエラーが発生しました。) が返されます。 ポジショニング Unlock オペレーションはポジショニングにまったく影響しません。 Btrieve オペレーション 2-119 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 119 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Update (3) 既存のレコードに含まれる情報を変更します。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 注意 データバッファ長 キーバッファ × × キー番号 × × NCC (No-currency-change) オプションを使用していると、Update オペレーション はキーバッファパラメータの値を更新しません。つまり、このパラメータには何の 情報も返されません。 必要条件 ◆ 対象となるファイルがオープンされている必要があります。 ◆ ファイル内の物理カレンシーを確立しておく必要があります (Get Extended、Step Extended、または Get Key オペレーションも目的のポ ジションを確立しますが、これらのオペレーションの後に Update オ ペレーションを実行することはできません)。 ◆ トランザクション内でレコードを更新するには、そのレコードがトラ ンザクション開始以前ではなく、そのトランザクション内で取得され ている必要があります。 手順 1. オペレーションコードに 3 を設定します。 2. レコードを含むファイルのポジションブロックを渡します。 3. データバッファに更新後のデータレコードを格納します。 4. データバッファ長に更新後のレコードの長さを設定します。 5. キー番号パラメータにレコードの取得に使用するキー番号を設定します。 NCC オプションを使用するには、キー番号に -1 (0xFF) を指定します。 システムデータキーを使用するには、125 を指定します。 Get オペレーションの直後に NCC を使用しない Update オペレーション を実行するときは、Get オペレーションで取得したものとまったく同じ キー番号を渡します。キー番号を変更してしまうと、レコードは正常に 更新されますが、更新後に実行する最初の Get オペレーションでステー タスコード 7 が返されます。 2-120 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 120 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 実行結果 Update オペレーションが正常に終了すると、ファイル内に格納されている レコードがデータバッファに設定した値を使って更新され、キー値の変更 を反映してインデックスが調整されます。また、必要に応じて、そのキー 値を使ってキーバッファパラメータが更新されます。ただし、NCC Update オペレーションはキーバッファパラメータの値を更新しません。 アプリケーションが更新するレコードにシングルレコードロックを設定し ている場合は、ロックが解除されます。しかし、マルチレコードロックは Update オペレーションを実行しても解除されません。 Update オペレーションが正常に実行されなかった場合は、主に次のステー タスコードのいずれかが返されます。 5 レコードのキーフィールドに重複キー値があります。 8 カレントポジションが不正です。 10 キー項目は変更できません。 22 データバッファパラメータが短すぎます。 80 レコードレベルの矛盾が生じました。 83 トランザクション外で読み込んだレコードを変更しようとし ました。 ポジショニング Update オペレーションと NCC Update オペレーションは物理カレンシーに 影響しません。 更新されたキーの値がインデックス内のレコードを再配置する場合、NCC オプションを使用しない Update オペレーションは論理カレンシーに影響し ます。たとえば、INTEGER キーの論理カレントレコードが 1 という値を 持っているとします。これと同じキーについて、論理ネクストレコードは 2 という値を持ちます。このとき 1 を 4 に更新すると、論理ネクストレ コードも変更されます。この例では、Update オペレーションの実行後、論 理ネクストレコードは 4 を超える値を持つことになります。 NCC Update オペレーションは論理カレンシーに影響しません。つまり、 NCC Update オペレーションを実行したアプリケーションでは、ファイルの 論理ポジションが Update オペレーションを実行する前と同じだということ です。このような状況では、NCC Update オペレーションに続けて、Get Btrieve オペレーション 2-121 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 121 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 Next (6)、Get Next Extended (36)、Get Previous (7)、および Get Previous Extended (37) などのオペレーションを実行すると、NCC Update オペレー ション実行前の論理カレンシーに基づく値が返されます。 注意 NCC Update オペレーションを実行しても、キーバッファパラメータには何の情報 も返されません。このため、論理カレンシーを保持する必要のあるアプリケーショ ンでは、NCC Update オペレーションに続けてキーバッファーの値を変更してはい けません。キーバッファの値を変更してしまうと、次に実行する Get オペレーショ ンの実行結果は予期できないものになってしまいます。 2-122 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 122 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Update Chunk (53) レコードの一部 (それぞれの部分がチャンクです) に含まれる情報を変更 します。また、既存のレコードに情報を追加したり (結果的にレコードを 長くします)、指定されたオフセットで既存のレコードを切り捨てます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × × × リターン 必要条件 データバッファ長 キーバッファ × × キー番号 × × ◆ 対象となるファイルがオープンされている必要があります。 ◆ ファイル内の物理および論理カレントレコードを確立しておく必要が あります。 ◆ トランザクション内でレコードに含まれるチャンクを更新するには、 そのレコードがそれ以前ではなく、そのトランザクション内で取得さ れている必要があります。 注意 Extended オペレーションや Get Key オペレーション (+50) も目的のポジションを 確立しますが、これらのオペレーションの後に Update Chunk オペレーションを実 行することはできません。 手順 1. オペレーションコードに 53 を設定します。 2. レコードを含むファイルのポジションブロックを渡します。 3. データバッファにチャンクディスクリプタ構造を格納します。チャンク ディスクリプタ構造の詳細については、「詳細」を参照してください。 4. データバッファ長に、データバッファに格納するバイト数以上の値を設 定します。データバッファ長の計算方法については、「詳細」を参照し てください。 5. キー番号パラメータにレコードの取得に使用するキー番号を設定します。 システムデータキーを使用するには、125 を指定します。 詳細 データバッファでは、次のチャンクディスクリプタのいずれかを使用しま す。 Btrieve オペレーション 2-123 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 123 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 ◆ ランダムチャンクディスクリプタ − オペレーションにつき 1 つの チャンクを更新するため、またはチャンクがレコード全体にわたって ランダムに分布しているときに、1 回のオペレーションで複数のチャ ンクを更新するために使用します。 ◆ 矩形チャンクディスクリプタ − 1 回のオペレーションで多数のチャ ンクを更新するために使用します。ただし、各チャンクは同じ長さで、 レコード内で等間隔に分布している必要があります。 ◆ 切り捨てチャンクディスクリプタ − 指定されたオフセットでレコー ドを切り捨てるために使用します。 ランダムチャンクディスクリプタの構造 次の図はランダムに分布する 3 つのチャンクを含むレコードを示していま す。チャンク 0 (バイト 0x12 から 0x16)、チャンク 1 (バイト 0x2A から 0x31)、チャンク 2 (バイト 0x41 から 0x4E) はそれぞれ網かけで示してあり ます。 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F ランダムチャンクディスクリプタを定義するには、次の表を参考にして、 データバッファ内に構造を作成する必要があります (レコードの 4 バイト 物理アドレスに続けて)。 2-124 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 124 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 表 2-25 ランダムチャンクディスクリプタの構造 要素 長さ 説明 (バイト単位) サブファンクション 4 チャンクディスクリプタのタイプを指定します。 ◆ 0x80000000 (直接ランダムチャンクディスクリプタ) − データ バッファに直接格納されているチャンクを更新します。先頭の チャンクを更新するためのデータはデータバッファの最後の チャンク定義 (チャンク n) の直後に格納します。また、2 番目 のチャンクデータは先頭のチャンクデータの直後という形で順 次格納します。 ◆ 0x80000001 (間接ランダムチャンクディスクリプタ) − チャン ク定義で指定されたアドレスのデータに含まれるチャンクを更 新します。 チャンク数 4 更新するチャンクの数を示します。少なくとも 1 以上の値を指定す る必要があります。指定可能な明示的最大値は存在しませんが、 チャンクディスクリプタはデータバッファに収まる必要がありま す。データバッファのサイズは最大 64,512 (0xFC00) バイトに制限さ れています。 チャンク 0 定義 チャンク 1 定義 . . . チャンク n 定義 12 12 . . . 12 各チャンク定義は、次のような 4 バイトのチャンクオフセット、そ れに続く 4 バイトのチャンク長、およびそれに続く 4 バイトのユー ザデータから構成されます。 ◆ チャンクオフセット − レコードの先頭からのバイト数によっ て、対象となるチャンクの開始位置をオフセットとして指定し ます。指定できる最小値は 0 で、最大値はレコードの末尾のバ イトのオフセット + 1 です。 ◆ チャンク長 − チャンクに含まれるバイト数を指定します。指 定できる最小値は 0 で、最大値は 65,535 です。ただし、データ バッファのサイズは最大 64,512 (0xFC00) に制限されているた め、64,512 バイトがチャンクのサイズの現実的な最大値となり ます。 ◆ ユーザデータ − (間接ディスクリプタのみに使用します) 実際 のチャンクデータへの 32 ビットポインタです。使用すべき フォーマットはオペレーティングシステムによって異なりま す。1 直接チャンクディスクリプタサブファンクションにこの要 素を指定しても無視されます。 1 16 ビットアプリケーションの場合は、16 ビットオフセットおよび 16 ビットセグメン トとしてユーザデータを設定します。ユーザデータでは、メモリセグメントの境界を 超えてメモリをアドレスすることはできません。チャンク長がユーザデータのオフ セット部分に追加されるとき、その結果はユーザデータによって定義されるセグメン ト内に収まる必要があります。デフォルトの設定で、この規則に対する違反はチェッ クされず、このような違反は適切に処理されません。 Btrieve オペレーション 2-125 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 125 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 次の表は、直接ランダムチャンクディスクリプタ構造の例を示しています。 要素 サンプル値 長さ (バイト単位) サブファンクション チャンク数 0x8000000 4 3 4 チャンクオフセット 0x12 4 チャンク長 0x05 4 ユーザデータ N/A 4 チャンクオフセット 0x2A 4 チャンク長 0x08 4 ユーザデータ N/A 4 チャンクオフセット 0x41 4 チャンク長 0x0E 4 ユーザデータ N/A 4 チャンク 0 のデータ N/A 5 チャンク 1 のデータ N/A 8 チャンク 2 のデータ N/A 14 チャンク 0 チャンク 1 チャンク 2 2-126 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 126 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 矩形チャンクディスクリプタの構造 同じ長さのチャンクがレコード全体にわたって等間隔に分布している場合、 矩形チャンクディスクリプタを使って、更新するすべてのチャンクを記述 することができます。たとえば、次のような図を考えてみましょう。この 第 2 章 図には、レコードのオフセット 0x00 から 0x4F までが示されています。 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F このレコードには 3 つのチャンクが含まれ、その領域は網かけで示されて います。チャンク 0 はバイト 0x19 から 0x1C、チャンク 1 はバイト 0x29 か ら 0x2C、チャンク 2 はバイト 0x39 から 0x3C を含みます。各チャンクはど れも 4 バイトの長さで、各チャンクの先頭から計算すると、チャンクその ものの長さとそれぞれのチャンクの間隔を合計すると、いずれも 16 (0x10) バイトになっています。 1 つの矩形ディスクリプタを使って、3 個のチャンクを同時に更新すること ができます。矩形チャンクディスクリプタを定義するには、次の表を参考 にして、データバッファ内に構造を作成する必要があります (レコードの 4 バイト物理アドレスに続けて)。 Btrieve オペレーション 2-127 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 127 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 表 2-26 矩形チャンクディスクリプタの構造 要素 長さ 説明 (バイト単位) サブファンクション 4 チャンクディスクリプタのタイプを指定します。 ◆ 0x80000002 (直接矩形チャンクディスクリプタ) − データバッ ファに直接格納されているチャンクを更新します。先頭のチャ ンクを更新するためのデータはデータバッファの最後のチャン ク定義 (チャンク n) の直後に格納します。また、2 番目のチャ ンクデータは先頭のチャンクデータの直後という形で順次格納 します。 ◆ 0x80000003 (間接矩形チャンクディスクリプタ) − チャンク定 義で指定されたアドレスのデータに含まれるチャンクを更新し ます。 行数 4 矩形チャンクディスクリプタで処理するチャンクの数を指定しま す。指定できる最小値は 1 です。明示的な最大値の制限はありませ ん。 オフセット 4 レコードの先頭を起点として、更新する先頭バイトのオフセットを 指定します。指定できる最小値は 0 で、最大値はレコードの末尾の バイトのオフセット + 1 です。レコードが矩形として表される場 合、この要素は更新される先頭行にある先頭バイトのオフセットを 参照することになります。 行のバイト数 4 各チャンクで更新されるバイト数を指定します。指定できる最小値 は 0 で、最大値は 65,535 です。ただし、他の要因 (データバッファ 長パラメータやクライアント/サーバの制限など) との関連で、この ように大きな値を指定できないこともあります。 行間隔 4 各チャンクの先頭が何バイトの間隔になっているかを指定します。 ユーザデータ 4 (間接ディスクリプタのみに使用します) 実際のチャンクデータへの 32 ビットポインタです。使用すべきフォーマットはオペレーティン グシステムによって異なります。1 直接矩形ディスクリプタにこの 要素を指定しても無視されます。ただしそれでも、この要素を割当 て、0 を設定しておく必要があります。 アプリケーションの 行間隔 4 (間接矩形ディスクリプタのみに使用します) 矩形がアプリケーショ ンのメモリ (つまり、ユーザデータで指定されるアドレス) に格納 されたときに、矩形内の各チャンクの先頭が何バイトの間隔になる かを指定します。直接矩形ディスクリプタにこの要素を指定しても無視さ れます。ただしそれでも、この要素を割当て、0 を設定しておく必要 があります。 1 16 ビットアプリケーションの場合は、16 ビットオフセットとそれに続く 16 ビットセ グメントとしてユーザデータを設定します。 矩形がメモリに格納されたときに、各行の間隔がレコードとして格納されたと きと同じバイト数になる場合、アプリケーションの行間隔には行間隔と同じ 値を設定します。しかし、矩形がアプリケーションのメモリ内で再配置され、 2-128 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 128 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 行の間隔が何バイトか増減する場合は、アプリケーションの行間隔により、 その情報を MicroKernel に渡すことができます。 間接矩形ディスクリプタを使用するときは、ユーザデータおよびアプリケー ションの行間隔要素を使って、更新のためにデータを読み込むロケーションを 決定します。先頭行のデータはユーザデータのオフセット 0 から読み込まれま す。また、2 番目の行のデータはユーザデータ + アプリケーションの行間隔 で指定されるアドレスから読み込まれます。さらに、3 番目の行のデータは、 ユーザデータ + (アプリケーションの行間隔 × 2) で指定されるアドレスから 読み込まれます。 注意 Windows v3.x 開発者: Win16 アプリケーションの場合、アプリケーションの行間隔お よびユーザデータのオフセットコンポーネントを使って、ユーザデータのセグメントコ ンポーネントの境界を超えてメモリをアドレスすることはできません。アプリケーショ ンの行間隔がユーザデータのオフセット部分に追加されるとき、その結果はユーザ データによって定義されるセグメント内に収まる必要があります。デフォルトの設 定で、この規則に対する違反はチェックされず、このような違反は適切に処理され ません。 次の表は、直接矩形チャンクディスクリプタ構造の例を示しています。 要素 サンプル値 長さ (バイト単位) サブファンクション 0x80000002 4 行数 3 4 オフセット 0x19 4 行のバイト数 0x04 4 行間隔 0x10 4 ユーザデータ 0 4 アプリケーションの行間隔 0 4 データ (行 0) N/A 4 データ (行 1) N/A 4 データ (行 2) N/A 4 Btrieve オペレーション 2-129 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 129 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 切り捨てディスクリプタの構造 切り捨てディスクリプタを使用すると、指定したオフセットでレコードを 切り捨てることができます。このタイプのチャンクディスクリプタを使用 するには、次の表を参考にして、データバッファ内に構造を作成する必要 があります。 表 2-27 切り捨てディスクリプタの構造 要素 長さ 説明 (バイト単位) サブファンクション 4 チャンクディスクリプタのタイプを示します。0x80000004 を指定し ます。 チャンクオフセット 4 切り捨てを開始する位置のレコード内でのバイトオフセットを指定 します。このバイトと、それ以降のバイトがすべて削除されます。 指定できる最小値は 4 です。また、最大値はレコード内の末尾のバ イトのオフセットです。 Next-in-Record サブファンクションバイアス これまでに述べたサブファンクションの値に 0x40000000 というバイアスを 加算すると、物理レコード内カレンシー (つまり、レコード内での物理カ レントポジション) に基づいて、サブファンクションのオフセット要素の 値が計算されます。 Next-in-Record サブファンクションを使用するとき、 チャンクディスクリプタのオフセット要素は無視されます。 Next-in-Record バイアスをランダムチャンクディスクリプタと組み合わせて 使用し、1 つの Update Chunk オペレーションで複数のチャンクを更新する 場合、プリビアスチャンクの長さにプリビアスチャンクのオフセットが加 算され、すべてのチャンク (先頭のチャンクを除く) に対するオフセット が自動的に計算されます。つまり、 Next-in-Record バイアスはオペレー ションの対象となるすべてのチャンクに適用されるということです。 Append サブファンクションバイアス ランダムチャンクディスクリプタのサブファンクションまたは矩形チャン クディスクリプタのサブファンクションの値に 0x20000000 というバイアス を加算すると、レコードの末尾の次のバイトとなるサブファンクションの オフセット要素の値が計算されます。 2-130 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 130 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 注意 このバイアスは Next-in-Record バイアスまたは切り捨てサブファンクションととも に使用しないでください。 このバイアスをランダムチャンクディスクリプタと組み合わせて使用し、1 つの Update Chunk オペレーションで複数のチャンクを更新する場合、プリ ビアスチャンクの追加後のレコードの長さに基づいて、すべてのチャンク (先頭のチャンクを除く) に対するオフセットが自動的に計算されます。 実行結果 Update Chunk オペレーションが正常に終了すると、データバッファのチャ ンクディスクリプタ部分でチャンクとして指定されたレコードの一部が更 新されます。チャンクの更新に使用する新しいデータは、チャンクディス クリプタそのもの (直接チャンクディスクリプタを使用した場合)、または 各チャンクのユーザデータ要素の 32 ビットポインタで指定されたメモリア ドレス (間接チャンクディスクリプタを使用した場合) に格納されていま す。Update Chunk オペレーションが完了すると、キー値の変更を反映して キーインデックスが調整され、必要な場合は、キーバッファパラメータが 更新されます。 さらに、更新するレコードにシングルレコードロックが設定されている場 合は、ロックが解除されます。しかし、Update Chunk オペレーションでマ ルチレコードロックを解除することはできません。 Update Chunk オペレーションが正常に実行されなかった場合は、主に次の ステータスコードのいずれかが返されます。 5 レコードのキーフィールドに重複キー値があります。 8 カレントポジションが不正です。 10 キー項目は変更できません。 22 データバッファパラメータが短すぎます。 58 圧縮バッファ長が短すぎます。 62 ディスクリプタが間違っています。 80 レコードレベルの矛盾が生じました。 83 トランザクション外で読み込んだレコードを変更しようとし ました。 Btrieve オペレーション 2-131 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 131 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 97 ポジショニング データバッファが小さすぎます。 103 チャンクのオフセットが大きすぎます。 106 Get Next Chunk オペレーションを実行できません。 Update Chunk オペレーションは物理カレンシーまたは論理カレントレコー ドを変更しません。 注意 Get オペレーションに続けて Update Chunk オペレーションを実行するときには、 直前の Get オペレーションで指定したキー番号とは異なる値を Update Chunk オペ レーションに渡さないでください。異なるキー番号を渡すと、MicroKernel によって 確立されるポジショニングが予期できないものになります。 2-132 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 132 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Version (26) ワークステーションアプリケーションの場合は、実行中のローカル MicroKernel のバージョンとリクエスタのバージョンが返されます。ワーク ステーションアプリケーションがサーバ上のファイルをオープンしていた り、キーバッファにサーバファイルのパス名を指定していると、そのサー バ上で実行されている MicroKernel のバージョンも返されます。サーバ ベースのアプリケーションの場合は、サーバベースの MicroKernel のバー ジョンおよびリビジョン番号が返されます。 パラメータ センド オペレーション ポジション データ コード ブロック バッファ × リターン 必要条件 データバッファ長 キーバッファ キー番号 × × × Version オペレーションを発行する前に、MicroKernel またはリクエスタの いずれかがロードされている必要があります。 手順 1. オペレーションコードに 26 を設定します。 2. データバッファ長に少なくとも 15 を設定します (詳細については、表 2-28 を参照してください)。 3. サーバベースの MicroKernel のバージョン番号を取得するには、その サーバ上にあるオープンファイルの有効なポジションブロックか有効な パス名をキーバッファに指定する必要があります。 実行結果 ワークステーション MicroKernel とリクエスタの両方がアクセスできるよ うに環境設定されていて、Version オペレーションが正常に終了すると、 ローカル MicroKernel、リクエスタ、およびサーバベースの MicroKernel の バージョン情報が返されます。15 バイトのデータバッファとデータバッ ファ長を指定してください。リクエスタとワークステーション MicroKernel が両方ともロードされていて、5 バイトのデータバッファとデータバッ ファ長しか指定していないと、リクエスタのバージョン情報だけが返され ます。 Btrieve オペレーション 2-133 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 133 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 第 2 章 デ ー タ バ ッ フ ァ に は 、 表 2-28 の フ ォ ー マ ッ ト に 従 っ て 、 そ れ ぞ れ の MicroKernel またはリクエスタに対する 5 バイトのバージョンブロックが返 されます。各ブロックの 5 番目のバイトは、それぞれの MicroKernel また はリクエスタを識別します。 表 2-28 バージョンブロック 要素 長さ 説明 (バイト単位) バージョン番号 2 Btrieve のバージョン番号を示します。 リビジョン番号 2 Btrieve のリビジョン番号を示します。 リクエスタまたはエンジンの タイプ 1 エンジンまたはリクエスタのタイプを識別します。 ◆ 9 (0x39) − Windows NT または Windows 95 ワークス テーション ◆ ケ (0x39+0x80) − Windows NT または Windows 95 ワー クステーション Developer Kit ◆ D (0x44) − DOS ワークステーション ◆ L (0x4C) − Warp Server ◆ O (0x4F) − OS/2 ワークステーション ◆ N (0x4E) − リクエスタ ◆ S (0x53) − NetWare サーバ ◆ T (0x54) − Windows NT サーバ ◆ W (0x57) − Windows v3.x ワークステーション ◆ ラ (0x57+0x80) − Windows v3.x ワークステーショ ン Developer Kit たとえば、Btrieve for NetWare v7.0 のみを実行している場合は、データバッ ファに次のような 16 進値が返されます。 07 00 00 00 53 適切にバイトの入れ替えを行うと、この 16 進値は次のようになります。 00 07 00 00 53 これらの値を 10 進に変換すると、バージョン番号は 7 で、リビジョン番号 は 0 となります。また、コンポーネントの識別文字は S となります (この 文字は ASCII 0x53 に相当します)。 2-134 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 134 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 Version オペレーションが正常に実行されなかった場合は、0 以外のステー タスコードが返されます。 ポジショニング Version オペレーションはポジショニングにまったく影響しません。 第 2 章 Btrieve オペレーション 2-135 TONBO: W 176 × H 227 FILE NAME: BT7R2B.DOC PAGE: 135 OF 67 LAST SAVED: 98/03/05 16:30 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:30 付録 A 言語インタフェース 表 A-1 は Btrieve Developer Kit で提供されている言語インタフェースソース モジュールの一覧を示しています。Pervasive Software では、それぞれの言 語インタフェースに対するソースコードを用意しています。最新の追加情 報については、実際のソースモジュールを参照してください。 すべてのモジュールがすべてのキットに含まれているわけではありません。 使用する Btrieve Developer Kit に含まれているモジュールは、アプリケー ションを開発する環境によって異なります。使用しているプログラミング 言語のインタフェースがない場合は、コンパイラがミックスドランゲージ 呼出しをサポートしているかどうかを確認してください。サポートされて いる場合は、C のインタフェースを使用できることがあります。 表 A-1 言語インタフェースソースモジュール 言語 コンパイラ ソースモジュール C/C++ ◆ Borland、Microsoft、WATCOM など、大 ◆ BLOBHDR.H (Borland または Phar Lap の みを使用する DOS エクステンダプラッ 部分の C/C++ コンパイラ。 トフォーム対応) このインタフェースではマルチプラット ◆ BMEMCOPY.OBJ (Borland ま た は Phar フォームがサポートされています。 Lap のみを使用する DOS エクステンダプ ラットフォーム対応) ◆ BMEMCOPY.ASM (BMEMCOPY.OBJ に 対するソース) ◆ BTITYPES.H (プラットフォームに依存し ないデータ型) ◆ BTRAPI.H (Btrieve 関数のプロトタイプ) ◆ BTRAPI.C (すべてのプラットフォームに 対応した Btrieve インタフェースコード) ◆ BTRCONST.H (コモン Btrieve 定数) ◆ BTRSAMP.C (サンプルプログラム) ◆ GENSTAT.H (Pervasive ステータスコード) 言語インタフェース A-1 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 1 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A 言語 コンパイラ ソースモジュール C/C++ ◆ Borland C++ Builder ◆ CBBTRV.CPP ◆ CBBTRV.MAK (つづき) ◆ CBBMAIN.CPP ◆ CBBMAIN.DFM ◆ CBBMAIN.H COBOL ◆ Micro Focus COBOL vx.x ◆ MFXBTRV.BIN (DOS Runtime for COBOL Animator, non-Intel byte-order integer) ◆ MFXBTRV.ASM (このバイナリに対する ソース) ◆ Microsoft COBOL v3.0 ◆ COBRBTRV.OBJ (DOS 16 ビット) ◆ COBPBTRV.OBJ (OS/2 16 ビット) ◆ COBBTRV.ASM (これらのオブジェクト に対するソース) ◆ MF2BTRV.BIN (DOS runtime for COBOL Animator, Intel byte-order integer) ◆ MF2BTRV.ASM (このバイナリに対する ソース) ◆ BTRSAMP.CBL (サンプルプログラム) Delphi ◆ Borland Delphi v1.x ◆ BTR16.DPR ◆ BTRSAM16.PAS (サンプルプログラム) ◆ BTRSAM16.DFM ◆ BTRAPI16.PAS ◆ BTRCONST.PAS (コモン Btrieve 定数) ◆ Borland Delphi v3.x ◆ BTR32.DPR ◆ BTR32.DOF ◆ BTRSAM32.DFM ◆ BTRSAM32.PAS (サンプルプログラム) ◆ BTRAPI32.PAS ◆ BTRCONST.PAS (コモン Btrieve 定数) Pascal ◆ Borland Turbo Pascal v5.x − 6.x ◆ BTRAPID.PAS ◆ Borland Pascal v7.0 for DOS ◆ BTRSAMPD.PAS (サンプルプログラム) ◆ Extended DOS Pascal for Turbo Pascal v7.0 ◆ BTRCONST.PAS (コモン Btrieve 定数) ◆ BLOBHDR.PAS A-2 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 2 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 言語 コンパイラ ソースモジュール Pascal ◆ Borland Turbo Pascal v1.5 ◆ BTRAPIW.PAS ◆ Borland Pascal v7.0 for Windows ◆ BTRSAMPW.PAS (サンプルプログラム) (つづき) ◆ BTRCONST.PAS (コモン Btrieve 定数) ◆ BLOBHDR.PAS Visual Basic ◆ Microsoft Visual Basic for Windows v3.1 ◆ BTSAMP16.VBP ◆ BTRSAM16.BAS (サンプルプログラム) ◆ BTRFRM16.FRM ◆ Microsoft Visual Basic for Windows NT and ◆ BTSAMP32.VBP Windows 95 ◆ BTRSAM32.BAS (サンプルプログラム) ◆ BTRFRM32.FRM 次の表は、Create や Stat などの Btrieve オペレーションのデータバッファで 使用される、いくつかのコモンデータ型の比較を示しています。 表 A-2 Btrieve のデータバッファで使用されるコモンデータ型 アセンブラ C COBOL doubleword long* PIC 9(4)COMP-5 longint* * word short int byte char PIC X byte unsigned char PIC X * Delphi PIC 9(2)COMP-5 smallint * Pascal Visual Basic longint* Long * integer Integer char char String byte byte Byte integer の値は開発を行う環境によって異なります。32 ビット環境では、integer は long integer と同じになります。また 16 ビット環境では、short または small integer と同じ になります。 言語インタフェース A-3 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 3 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A C/C++ C/C++ インタフェースは、プラットフォームに依存しないアプリケーショ ンの開発を容易にします。このインタフェースでは、DOS (DOS エクステ ンダを含む)、NetWare Loadable Module (NLM)、OS/2、Windows (32 ビット アプリケーションを含む)、Windows NT、Windows 95 の各オペレーティン グシステムがサポートされています。 インタフェースモジュール ここでは、C 言語インタフェースを構成するモジュールの詳細について説 明します。 BTRAPI.C BTRAPI.C ファイルは、C アプリケーションインタフェースの実際のインプ リメンテーションです。C アプリケーションインタフェースでは、BTRV および BTRVID を呼出すすべてのアプリケーションがサポートされていま す。ただし、NLM は例外で、NLM ではインタフェースコードをまったく 必要としません。この関数を使って Btrieve 呼出しを実行するときは、 BTRAPI.C をコンパイルし、そのオブジェクトをアプリケーション内の他 のモジュールとリンクしてください。 BTRAPI.C フ ァ イ ル に は 、 コ ン パ イ ラ に BTRAPI.H 、 BTRCONST.H 、 BLOBHDR.H、および BTITYPES.H をインクルードするように指示する #include 指令が含まれています。これらのファイルをインクルードする ことで、BTRAPI.C はインタフェースに関連したプラットフォームに依存 しないデータ型を利用できるようになります。 BTRAPI.H BTRAPI.H ファイルには、Btrieve 関数のプロトタイプが含まれています。 プロトタイプ定義は、BTITYPES.H で定義されているプラットフォームに 依存しないデータ型を使用します。BTRAPI.H は BTRV および BTRVID 関 数を呼出すすべてのアプリケーションをサポートします。 A-4 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 4 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 BTRCONST.H BTRCONST.H ファイルには、Btrieve に固有の便利な定数が含まれています。 これらの定数は Btrieve のオペレーションコード、ステータスコード、ファ イルフラグ、キーフラグなど、さまざまな項目の参照を標準化するのに役 立ちます。 BTRCONST.H を利用せずに C アプリケーションインタフェースを使用する ことも可能です。ただし、このファイルを利用することで、プログラミン 付 録 A グが容易になる場合があります。 BTITYPES.H BTITYPES.H ファイルはプラットフォームに依存しないデータ型を定義し ます。Btrieve 関数呼出しに BTITYPES.H のデータ型を使用することで、ア プリケーションを複数のオペレーティングシステム上で利用することが可 能になります。各オペレーティングシステムでどのようにデータ型が定義 されているかについては、BTITYPES.H ファイルそのものを参照してくだ さい。 言語インタフェース A-5 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 5 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 BTITYPES.H ファイルでは、アプリケーションを実行するオペレーティン グシステムを指定するために必要なスイッチについても説明されています。 表 A-3 に、これらのオペレーティングシステムスイッチの一覧を示します。 表 A-3 オペレーティングシステムスイッチ オペレーティング システム アプリケーションタイプ スイッチ DOS 16 ビット BTI_DOS 32 ビット + Tenberry Extender および BSTUB.EXE* BTI_DOS_32R 32 ビット + Phar Lap v6.0 BTI_DOS_32P 32 ビット + Borland PowerPack BTI_DOS_32B NetWare 32 ビット NLM BTI_NLM OS/2 16 ビット BTI_OS2 32 ビット BTI_OS2_32 Win16 16 ビット BTI_WIN Win32 32 ビット BTI_WIN_32 * 詳細については、「Tenberry DOS/4G Extender を使ったアプリケーション作成」を参 照してください。 BTRSAMP.C BTRSAMP.C ソースファイルは、表 A-3 に示されているすべてのオペレー ティングシステム上でコンパイル、リンク、および実行が可能なサンプル Btrieve プログラムです。 プログラミングの必要条件 C アプリケーションインタフェースを使って、アプリケーションをプラッ トフォームに依存しないようにする場合は、BTITYPES.H で定義されてい るデータ型を使用する必要があります。このデータ型の使い方については、 BTRSAMP.C ファイルを参照してください。 A-6 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 6 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 注意 また、プログラムが実行されるオペレーティングシステムを識別するコンパイラ指 令を指定する必要があります。コンパイラ指令で使用できる値の一覧は BTITYPES.H ヘッダーファイルに含まれています。コンパイラ指令を指定するには、 使用するコンパイラに対応した適切なコマンドラインオプションを使用します。 C によるサンプルプログラム 配布メディアに含まれている次のサンプルプログラムは、いくつかの一般 的な Btrieve オペレーションを実行する方法を示しています。また、このプ ログラムでは、MicroKernel が必要とする順序でオペレーションが実行され ています (たとえば、ファイルに対する I/O を実行する前に、そのファイ ルをオープンしておく必要があります)。 注意 Windows v3.x 開発者: このプログラムでは printf 関数を使って、ジェネリックウィ ンドウにテキストを表示しています。サポートされているすべての C/C++ コンパ イラでは、ジェネリックウィンドウを作成し、標準 I/O を使用する Windows プログ ラムの出力を表示することができます。標準 I/O を使用することで、このサンプル プログラムでは Btrieve アプリケーションのプログラミングに意識を集中すること ができます。 注意 16 ビット DOS 開発者: このサンプルプログラムをコンパイルするには、少なくと も 8K のスタックサイズが必要です。また、このサンプルプログラムを実行するに は、/T:1 フラグを使って DOS リクエスタをロードする必要があります。 言語インタフェース A-7 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 7 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A サンプル A-1 BTRSAMP.C /*********************************************************** ** ** Copyright 1982-1997 Pervasive Software Inc. ** All Rights Reserved ** ***********************************************************/ /*********************************************************** BTRSAMP.C This is a simple sample designed to allow you to confirm your ability to compile, link, and execute a Btrieve application for your target environment using your compiler tools. This program demonstrates the C/C++ interface for Btrieve for DOS, Extended DOS, OS2 (16 and 32-bit), MS Windows, NetWare NLM, MS Windows NT and Windows 95. This program does the following operations on the sample database: - gets the Microkernel Database Engine version - opens sample.btr - gets a record on a known value of Key 0 - displays the retrieved record - performs a stat operation - creates an empty 'clone' of sample.btr and opens it - performs a 'Get Next Extended' operation to extract a subset of the records in sample.btr - inserts those records into the cloned file - closes both files IMPORTANT: You must specify the complete path to the directory that contains the sample Btrieve data file, 'sample.btr'. See IMPORTANT, below. You can compile and run this program on any of the platforms supported by the interface modules. Platforms are indicated by the platform switches listed in 'btrapi.h'. For MS Windows you should make an application that allows standard output via printf(). Note that most C/C++ compilers support standard I/O Windows applications. For MS Windows NT or OS2, you should make a console application. See the prologue in 'btrapi.h' for information on how to select a target platform for your application. You must specify a target platform. ***********************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <btrapi.h> #include <btrconst.h> A-8 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 8 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 /*********************************************************** Constants ***********************************************************/ #define EXIT_WITH_ERROR 1 #define TRUE 1 #define FALSE 0 #define VERSION_OFFSET 0 #define REVISION_OFFSET 2 #define PLATFORM_ID_OFFSET 4 #define MY_THREAD_ID 50 /* Don't pad our structures */ #if defined(__BORLANDC__) #pragma option -a#else #if defined(_MSC_VER) || defined(__WATCOMC__) #pragma pack(1) #endif #endif /*********************************************************** Type definitions for Client ID and version Structures ***********************************************************/ typedef struct { BTI_CHAR networkAndNode[12]; BTI_CHAR applicationID[2]; BTI_WORD threadID; } CLIENT_ID; typedef struct { BTI_SINT Version; BTI_SINT Revision; BTI_CHAR MKDEId; } VERSION_STRUCT; /*********************************************************** Definition of record from 'sample.btr' ***********************************************************/ typedef struct { BTI_LONG ID; BTI_CHAR FirstName[16]; BTI_CHAR LastName[26]; BTI_CHAR Street[31]; BTI_CHAR City[31]; BTI_CHAR State[3]; BTI_CHAR Zip[11]; BTI_CHAR Country[21]; BTI_CHAR Phone[14]; } PERSON_STRUCT; /*********************************************************** Type definitions for Stat/Create structure 言語インタフェース A-9 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 9 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A ***********************************************************/ typedef struct { BTI_SINT recLength; BTI_SINT pageSize; BTI_SINT indexCount; BTI_CHAR reserved[4]; BTI_SINT flags; BTI_BYTE dupPointers; BTI_BYTE notUsed; BTI_SINT allocations; } FILE_SPECS; typedef struct { BTI_SINT position; BTI_SINT length; BTI_SINT flags; BTI_CHAR reserved[4]; BTI_CHAR type; BTI_CHAR null; BTI_CHAR notUsed[2]; BTI_BYTE manualKeyNumber; BTI_BYTE acsNumber; } KEY_SPECS; typedef struct { FILE_SPECS fileSpecs; KEY_SPECS keySpecs[5]; } FILE_CREATE_BUF; /*********************************************************** Structure type definitions for Get Next Extended operation ***********************************************************/ typedef struct { BTI_SINT descriptionLen; BTI_CHAR currencyConst[2]; BTI_SINT rejectCount; BTI_SINT numberTerms; } GNE_HEADER; typedef struct { BTI_CHAR fieldType; BTI_SINT fieldLen; BTI_SINT fieldOffset; BTI_CHAR comparisonCode; BTI_CHAR connector; BTI_CHAR value[3]; } TERM_HEADER; typedef struct { A-10 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 10 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 BTI_SINT maxRecsToRetrieve; BTI_SINT noFieldsToRetrieve; } RETRIEVAL_HEADER; typedef struct { BTI_SINT fieldLen; BTI_SINT fieldOffset; } FIELD_RETRIEVAL_HEADER; typedef struct { GNE_HEADER TERM_HEADER TERM_HEADER RETRIEVAL_HEADER FIELD_RETRIEVAL_HEADER } PRE_GNE_BUFFER; gneHeader; term1; term2; retrieval; recordRet; 付 録 A typedef struct { BTI_SINT recLen; BTI_LONG recPos; PERSON_STRUCT personRecord; } RETURNED_REC; typedef struct { BTI_SINT numReturned; RETURNED_REC recs[20]; } POST_GNE_BUFFER; typedef union { PRE_GNE_BUFFER preBuf; POST_GNE_BUFFER postBuf; } GNE_BUFFER, BTI_FAR* GNE_BUFFER_PTR; /* restore structure packing */ #if defined(__BORLANDC__) #pragma option -a. #else #if defined(_MSC_VER) || defined(__WATCOMC__) #pragma pack() #endif #endif /*********************************************************** Main ***********************************************************/ int main(void) { /* Btrieve function parameters */ BTI_BYTE posBlock1[128]; BTI_BYTE posBlock2[128]; 言語インタフェース A-11 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 11 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 BTI_BYTE BTI_WORD BTI_BYTE BTI_BYTE BTI_WORD dataBuf[255]; dataLen; keyBuf1[255]; keyBuf2[255]; keyNum = 0; BTI_BYTE BTI_LONG BTI_BYTE BTI_BYTE BTI_SINT BTI_SINT BTI_SINT BTI_SINT btrieveLoaded = FALSE; personID; file1Open = FALSE; file2Open = FALSE; status; getStatus = -1; i; posCtr; CLIENT_ID clientID; VERSION_STRUCT versionBuffer[3]; FILE_CREATE_BUF fileCreateBuf; GNE_BUFFER_PTR gneBuffer; PERSON_STRUCT personRecord; printf("**************** Btrieve C/C++ Interface Demo ****************¥n¥n"); /* set up the Client ID */ memset(clientID.networkAndNode, 0, sizeof(clientID.networkAndNode)); memcpy(clientID.applicationID, "MT", 2); /* must be greater than "AA" */ clientID.threadID = MY_THREAD_ID; memset(versionBuffer, 0, sizeof(versionBuffer)); dataLen = sizeof(versionBuffer); status = BTRVID( B_VERSION, posBlock1, &versionBuffer, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); if (status == B_NO_ERROR) { printf("Btrieve Versions returned are: ¥n"); for (i = 0; i < 3; i++) { if (versionBuffer[i].Version != 0) { printf(" %d.%d %c¥n", versionBuffer[i].Version, versionBuffer[i].Revision, versionBuffer[i].MKDEId); } } printf("¥n"); btrieveLoaded = TRUE; A-12 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 12 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 } else { printf("Btrieve B_VERSION status = %d¥n", status); if (status != B_RECORD_MANAGER_INACTIVE) { btrieveLoaded = TRUE; } } /* clear buffers */ if (status == B_NO_ERROR) { memset(dataBuf, 0, sizeof(dataBuf)); memset(keyBuf1, 0, sizeof(keyBuf1)); memset(keyBuf2, 0, sizeof(keyBuf2)); } /* open sample.btr */ if (status == B_NO_ERROR) { /******************************************************** IMPORTANT: You should modify the following to specify the complete path to 'sample.btr' for your environment. ********************************************************/ #ifdef BTI_NLM strcpy((BTI_CHAR *)keyBuf1, "sys:¥¥sample¥¥sample.btr"); #else strcpy((BTI_CHAR *)keyBuf1, "c:¥¥sample¥¥sample.btr"); #endif #ifdef BTI_NLM strcpy((BTI_CHAR *)keyBuf2, "sys:¥¥sample¥¥sample2.btr"); #else strcpy((BTI_CHAR *)keyBuf2, "c:¥¥sample¥¥sample2.btr"); #endif keyNum = 0; dataLen = 0; status = BTRVID( B_OPEN, posBlock1, dataBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_OPEN status (sample.btr) = %d¥n", status); if (status == B_NO_ERROR) { file1Open = TRUE; } 言語インタフェース A-13 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 13 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A } /* get the record with key 0 = 263512477 using B_GET_EQUAL */ if (status == B_NO_ERROR) { memset(&personRecord, 0, sizeof(personRecord)); dataLen = sizeof(personRecord); personID = 263512477; /* this is really a social security number */ *(BTI_LONG BTI_FAR *)&keyBuf1[0] = personID; keyNum = 0; status = BTRVID( B_GET_EQUAL, posBlock1, &personRecord, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_GET_EQUAL status = %d¥n", status); if (status == B_NO_ERROR) { printf("¥n"); printf("The retrieved record is:¥n"); printf("ID: %ld¥n", personRecord.ID); printf("Name: %s %s¥n", personRecord.FirstName, personRecord.LastName); printf("Street: %s¥n", personRecord.Street); printf("City: %s¥n", personRecord.City); printf("State: %s¥n", personRecord.State); printf("Zip: %s¥n", personRecord.Zip); printf("Country: %s¥n", personRecord.Country); printf("Phone: %s¥n", personRecord.Phone); printf("¥n"); } } /* perform a stat operation to populate the create buffer */ memset(&fileCreateBuf, 0, sizeof(fileCreateBuf)); dataLen = sizeof(fileCreateBuf); keyNum = (BTI_WORD)-1; status = BTRVID(B_STAT, posBlock1, &fileCreateBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); if (status == B_NO_ERROR) { /* create and open sample2.btr */ keyNum = 0; dataLen = sizeof(fileCreateBuf); A-14 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 14 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 status = BTRVID(B_CREATE, posBlock2, &fileCreateBuf, &dataLen, keyBuf2, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_CREATE status = %d¥n", status); } if (status == B_NO_ERROR) { keyNum = 0; dataLen = 0; status = BTRVID( B_OPEN, posBlock2, dataBuf, &dataLen, keyBuf2, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_OPEN status (sample2.btr) = %d¥n", status); if (status == B_NO_ERROR) { file2Open = TRUE; } } /* now extract data from the original file, insert into new one */ if (status == B_NO_ERROR) { /* getFirst to establish currency */ keyNum = 2; /* STATE-CITY index */ memset(&personRecord, 0, sizeof(personRecord)); memset(&keyBuf2[0], 0, sizeof(keyBuf2)); dataLen = sizeof(personRecord); getStatus = BTRVID( B_GET_FIRST, posBlock1, &personRecord, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_GET_FIRST status (sample.btr) = %d¥n¥n", getStatus); } 言語インタフェース A-15 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 15 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A gneBuffer = malloc(sizeof(GNE_BUFFER)); if (gneBuffer == NULL) { printf("Insufficient memory to allocate buffer"); return(EXIT_WITH_ERROR); } memset(gneBuffer, 0, sizeof(GNE_BUFFER)); memcpy(&gneBuffer->preBuf.gneHeader.currencyConst[0], "UC", 2); while (getStatus == B_NO_ERROR) { gneBuffer->preBuf.gneHeader.rejectCount = 0; gneBuffer->preBuf.gneHeader.numberTerms = 2; posCtr = sizeof(GNE_HEADER); /* fill in the first condition */ gneBuffer->preBuf.term1.fieldType = 11; gneBuffer->preBuf.term1.fieldLen = 3; gneBuffer->preBuf.term1.fieldOffset = 108; gneBuffer->preBuf.term1.comparisonCode = 1; gneBuffer->preBuf.term1.connector = 2; memcpy(&gneBuffer->preBuf.term1.value[0], "TX", 2); posCtr += sizeof(TERM_HEADER); /* fill in the second condition */ gneBuffer->preBuf.term2.fieldType = 11; gneBuffer->preBuf.term2.fieldLen = 3; gneBuffer->preBuf.term2.fieldOffset = 108; gneBuffer->preBuf.term2.comparisonCode = 1; gneBuffer->preBuf.term2.connector = 0; memcpy(&gneBuffer->preBuf.term2.value[0], "CA", 2); posCtr += sizeof(TERM_HEADER); /* fill in the projection header to retrieve whole record */ gneBuffer->preBuf.retrieval.maxRecsToRetrieve = 20; gneBuffer->preBuf.retrieval.noFieldsToRetrieve = 1; posCtr += sizeof(RETRIEVAL_HEADER); gneBuffer->preBuf.recordRet.fieldLen = sizeof(PERSON_STRUCT); gneBuffer->preBuf.recordRet.fieldOffset = 0; posCtr += sizeof(FIELD_RETRIEVAL_HEADER); gneBuffer->preBuf.gneHeader.descriptionLen = posCtr; dataLen = sizeof(GNE_BUFFER); getStatus = BTRVID( B_GET_NEXT_EXTENDED, posBlock1, gneBuffer, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_GET_NEXT_EXTENDED status = %d¥n", getStatus); A-16 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 16 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 /* Get Next Extended can reach end of file and still return some records */ if ((getStatus == B_NO_ERROR) || (getStatus == B_END_OF_FILE)) { printf("GetNextExtended returned %d records.¥n", gneBuffer->postBuf.numReturned); for (i = 0; i < gneBuffer->postBuf.numReturned; i++) { dataLen = sizeof(PERSON_STRUCT); memcpy(dataBuf, &gneBuffer ->postBuf.recs[i].personRecord, dataLen); status = BTRVID( B_INSERT, posBlock2, dataBuf, &dataLen, keyBuf2, -1, /* no currency change */ (BTI_BUFFER_PTR)&clientID); } printf("Inserted %d records in new file, status = %d¥n¥n", gneBuffer->postBuf.numReturned, status); } memset(gneBuffer, 0, sizeof(GNE_BUFFER)); memcpy(&gneBuffer->preBuf.gneHeader.currencyConst[0], "EG", 2); } free(gneBuffer); gneBuffer = NULL; /* close open files */ if (file1Open) { dataLen = 0; status = BTRVID( B_CLOSE, posBlock1, dataBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_CLOSE status (sample.btr) = %d¥n", status); } if (file2Open) { dataLen = 0; status = BTRVID( B_CLOSE, 言語インタフェース A-17 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 17 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A posBlock2, dataBuf, &dataLen, keyBuf2, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve B_CLOSE status (sample2.btr) = %d¥n", status); } /********************************************************** ISSUE THE BTRIEVE STOP OPERATION - For multi-tasking environments, such as MS Windows, OS2, and NLM, 'stop' frees all Btrieve resources for this client. In DOS and Extended DOS, it removes the Btrieve engine from memory, which we choose not to do in this example. In multi-tasking environments, the engine will not unload on 'stop' unless it has no more clients. **********************************************************/ #if !defined(BTI_DOS) && !defined(BTI_DOS_32R) && ¥ !defined(BTI_DOS_32B) && !defined(BTI_DOS_32P) if (btrieveLoaded) { dataLen = 0; status = BTRVID(B_STOP, posBlock1, dataBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); printf("Btrieve STOP status = %d¥n", status); if (status != B_NO_ERROR) { status = EXIT_WITH_ERROR; } } #endif return(status); } A-18 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 18 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 Tenberry DOS/4G Extender を使ったアプリケーション作成 32 ビット DOS エクステンダアプリケーションに Tenberry DOS エクステン ダスイッチを使用すると、パフォーマンスが最大限に向上します。これは、 MicroKernel にデータを渡すためにデータをリアルモードメモリにコピーす る必要がなくなるためです。 DOS エクステンダスイッチを使用するには、次の操作を行います。 1. 32 ビットアプリケーションをコンパイルし、C インタフェースをイン クルードします。使用するコンパイラで BTI_DOS_32R マクロが定義さ れていることを確認してください。 2. オブジェクトモジュールに対してコンパイラユーティリティを実行し、 それらを Tenberry リンカと互換性のあるものにします (WATCOM コン パイラの場合、このユーティリティは womp と呼ばれます。ただし、 v10.0 コンパイラは womp を必要としません)。 3. BTRSAMP.EXE サンプルプログラムを作成するために使用した次の例 を参考にして、.DEF ファイルを作成します。 LIBRARY btrsamp.dll DATA NONSHARED EXPORTS __ImportedFunctions_ 4. Tenberry リンカ (glu) を使ってアプリケーションをリンクし、次の例の ような Btrieve スタブを指定します。 glu -format lin -stack 40000 -stub bstub.exe -cod インタフェースを使用する Windows アプリケーションのリンク Windows アプリケーションと BTRAPI.C 両方 (BTRCALL、BTRCALLID、 BTRCALL32、または BTRCALLID32 関数を使用している場合はアプリケー ションのみ) のコンパイルが正常に終了した後は、生成されたオブジェク トモジュールを、次のインポートライブラリのいずれかとリンクする必要 があります。 ◆ WBTRV32.LIB 言語インタフェース A-19 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 19 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A ◆ WBTRV32X.LIB ◆ WBTRCALL.LIB これらのライブラリの使い方については、BTRAPI.H ファイルのプロロー グを参照してください。 C++ Builder アプリケーションのコンパイル 次のサンプルプログラムをコンパイルするには、Btrieve C/C++ interface ディレクトリにある次のファイルを IDE で使用できるようにする必要があ ります。 ◆ BTRAPI.C ◆ BTRAPI.H ◆ BTRCONST.H 次の C++ Builder サンプルプログラムは、いくつかの一般的な Btrieve オペ レーションを実行する方法を示しています。また、このプログラムでは、 MicroKernel が必要とする順序でオペレーションが実行されています (たと えば、ファイルに対する I/O を実行する前に、そのファイルをオープンし ておく必要があります)。 サンプル A-2 MAINFORM.CPP /********************************************************** ** ** Copyright 1982-1997 Pervasive Software Inc. All Rights ** Reserved ***********************************************************/ /*********************************************************** Mainform.cpp This is a simple sample designed to allow you to confirm your ability to compile, link, and execute a Btrieve application for your target environment using your compiler tools. This program demonstrates the C/C++ interface for Btrieve for MS Windows NT and Windows 95 with Borland's C++ Builder. This program does the following operations on the sample database: - gets the Microkernel Database Engine version - opens sample.btr - gets a record on a known value of Key 0 - displays the retrieved record - performs a stat operation A-20 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 20 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 - creates an empty 'clone' of sample.btr and opens it - performs a 'Get Next Extended' operation to extract a subset of the records in sample.btr - inserts those records into the cloned file - closes both files To compile this sample, you must make the following files from the Btrieve "C" interface directory available to the IDE: - btrapi.c - btrapi.h - btrconst.h IMPORTANT: You must specify the complete path to the directory that contains the sample Btrieve data file, 'sample.btr'. See IMPORTANT, below. ***********************************************************/ //---------------------------------------------------------#include <vcl¥vcl.h> #pragma hdrstop #include "mainform.h" #include <btrapi.h> #include <btrconst.h> //---------------------------------------------------------#pragma resource "*.dfm" /*********************************************************** Constants ***********************************************************/ #define EXIT_WITH_ERROR 1 #define TRUE 1 #define FALSE 0 #define VERSION_OFFSET 0 #define REVISION_OFFSET 2 #define PLATFORM_ID_OFFSET 4 #define MY_THREAD_ID 50 /* Don't pad our structures */ /* Borland's help says this is the default. Don't believe it. */ #pragma option -a1 /*********************************************************** Type definitions for Client ID and version Structures ***********************************************************/ typedef struct { BTI_CHAR networkAndNode[12]; BTI_CHAR applicationID[2]; BTI_WORD threadID; } CLIENT_ID; typedef struct 言語インタフェース A-21 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 21 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A { BTI_SINT Version; BTI_SINT Revision; BTI_CHAR MKDEId; } VERSION_STRUCT; /*********************************************************** Definition of record from 'sample.btr' ***********************************************************/ typedef struct { BTI_LONG ID; BTI_CHAR FirstName[16]; BTI_CHAR LastName[26]; BTI_CHAR Street[31]; BTI_CHAR City[31]; BTI_CHAR State[3]; BTI_CHAR Zip[11]; BTI_CHAR Country[21]; BTI_CHAR Phone[14]; } PERSON_STRUCT; /*********************************************************** Type definitions for Stat/Create structure ***********************************************************/ typedef struct { BTI_SINT recLength; BTI_SINT pageSize; BTI_SINT indexCount; BTI_CHAR reserved[4]; BTI_SINT flags; BTI_BYTE dupPointers; BTI_BYTE notUsed; BTI_SINT allocations; } FILE_SPECS; typedef struct { BTI_SINT position; BTI_SINT length; BTI_SINT flags; BTI_CHAR reserved[4]; BTI_CHAR type; BTI_CHAR null; BTI_CHAR notUsed[2]; BTI_BYTE manualKeyNumber; BTI_BYTE acsNumber; } KEY_SPECS; typedef struct { FILE_SPECS fileSpecs; KEY_SPECS keySpecs[5]; } FILE_CREATE_BUF; A-22 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 22 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 /*********************************************************** Structure type definitions for Get Next Extended operation ***********************************************************/ typedef struct { BTI_SINT descriptionLen; BTI_CHAR currencyConst[2]; BTI_SINT rejectCount; BTI_SINT numberTerms; } GNE_HEADER; typedef struct { BTI_CHAR fieldType; BTI_SINT fieldLen; BTI_SINT fieldOffset; BTI_CHAR comparisonCode; BTI_CHAR connector; BTI_CHAR value[3]; } TERM_HEADER; 付 録 A typedef struct { BTI_SINT maxRecsToRetrieve; BTI_SINT noFieldsToRetrieve; } RETRIEVAL_HEADER; typedef struct { BTI_SINT fieldLen; BTI_SINT fieldOffset; } FIELD_RETRIEVAL_HEADER; typedef struct { GNE_HEADER gneHeader; TERM_HEADER term1; TERM_HEADER term2; RETRIEVAL_HEADER retrieval; FIELD_RETRIEVAL_HEADER recordRet; } PRE_GNE_BUFFER; typedef struct { BTI_SINT recLen; BTI_LONG recPos; PERSON_STRUCT personRecord; } RETURNED_REC; typedef struct { BTI_SINT numReturned; RETURNED_REC recs[20]; } POST_GNE_BUFFER; 言語インタフェース A-23 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 23 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 typedef union { PRE_GNE_BUFFER preBuf; POST_GNE_BUFFER postBuf; } GNE_BUFFER, BTI_FAR* GNE_BUFFER_PTR; //---------------------------------------------------------// non-exported forward declarations void printLB(TListBox *LB, char *msg); TForm1 *Form1; //---------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------void __fastcall TForm1::ExitButtonClick(TObject *Sender) { Form1->Close(); } //---------------------------------------------------------void __fastcall TForm1::RunButtonClick(TObject *Sender) { runTest(); } /*********************************************************** Helper function to write to ListBox ***********************************************************/ void printLB(TListBox *LB, char *msg) { LB->Items->Add(msg); } /*********************************************************** This is where all the work gets done **********************************************************/ BTI_SINT runTest(void) { /* Btrieve function parameters */ BTI_BYTE posBlock1[128]; BTI_BYTE posBlock2[128]; BTI_BYTE dataBuf[255]; BTI_WORD dataLen; BTI_BYTE keyBuf1[255]; BTI_BYTE keyBuf2[255]; BTI_WORD keyNum = 0; BTI_BYTE BTI_LONG BTI_BYTE BTI_BYTE btrieveLoaded = FALSE; personID; file1Open = FALSE; file2Open = FALSE; A-24 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 24 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 BTI_SINT status; BTI_SINT getStatus; BTI_SINT i; BTI_SINT posCtr; CLIENT_ID clientID; VERSION_STRUCT versionBuffer[3]; FILE_CREATE_BUF fileCreateBuf; GNE_BUFFER_PTR gneBuffer; PERSON_STRUCT personRecord; BTI_CHAR tmpBuf[1024]; /********************************************************** Print the program title **********************************************************/ printLB(Form1->ListBox1, "**** Btrieve -- C++ Builder Sample ****" ); /* set up the Client ID */ memset(clientID.networkAndNode, 0, sizeof(clientID.networkAndNode)); memcpy(clientID.applicationID, "MT", 2); /* must be greater than "AA" */ clientID.threadID = MY_THREAD_ID; memset(versionBuffer, 0, sizeof(versionBuffer)); dataLen = sizeof(versionBuffer); status = BTRVID( B_VERSION, posBlock1, &versionBuffer, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); if (status == B_NO_ERROR) { strcpy(tmpBuf, "Btrieve Versions returned are: " ); printLB(Form1->ListBox1, tmpBuf); for (i = 0; i < 3; i++) { if (versionBuffer[i].Version != 0) { sprintf(tmpBuf, " %d.%d %c", versionBuffer[i].Version, versionBuffer[i].Revision, versionBuffer[i].MKDEId ); printLB(Form1->ListBox1, tmpBuf); } } printLB(Form1->ListBox1, ""); btrieveLoaded = TRUE; } else { 言語インタフェース A-25 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 25 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A sprintf(tmpBuf, "Btrieve B_VERSION status = %d", status ); printLB(Form1->ListBox1, tmpBuf); if ( status != B_RECORD_MANAGER_INACTIVE ) { btrieveLoaded = TRUE; } } /* clear buffers */ if (status == B_NO_ERROR) { memset(dataBuf, 0, sizeof(dataBuf)); memset(keyBuf1, 0, sizeof(keyBuf1)); memset(keyBuf2, 0, sizeof(keyBuf2)); } /* open sample.btr */ if (status == B_NO_ERROR) { /******************************************************** IMPORTANT: You should modify the following to specify the complete path to 'sample.btr' for your environment. ***********************************************************/ strcpy((BTI_CHAR *)keyBuf1, "c:¥¥sample¥¥sample.btr"); strcpy((BTI_CHAR *)keyBuf2, "c:¥¥sample¥¥sample2.btr"); keyNum = 0; dataLen = 0; status = BTRVID( B_OPEN, posBlock1, dataBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_OPEN status = %d", status ); printLB(Form1->ListBox1, tmpBuf); if (status == B_NO_ERROR) { file1Open = TRUE; } } /* get the record with key 0 = 263512477 using B_GET_EQUAL */ if (status == B_NO_ERROR) { memset(&personRecord, 0, sizeof(personRecord)); dataLen = sizeof(personRecord); personID = 263512477; /* this is really a social security number */ *(BTI_LONG BTI_FAR *)&keyBuf1[0] = personID; keyNum = 0; A-26 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 26 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 status = BTRVID( B_GET_EQUAL, posBlock1, &personRecord, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_GET_EQUAL status = %d", status ); printLB(Form1->ListBox1, tmpBuf); if (status == B_NO_ERROR) { sprintf(tmpBuf, "" ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "The retrieved record is:" ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "ID: %ld", personRecord.ID ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "Name: %s %s", personRecord.FirstName, personRecord.LastName ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "Street: %s", personRecord.Street ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "City: %s", personRecord.City ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "State: %s", personRecord.State ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "Zip: %s", personRecord.Zip ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "Country: %s", personRecord.Country ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "Phone: %s", personRecord.Phone ); printLB(Form1->ListBox1, tmpBuf); sprintf(tmpBuf, "" ); printLB(Form1->ListBox1, tmpBuf); } } /* perform a stat operation to populate the create buffer */ memset(&fileCreateBuf, 0, sizeof(fileCreateBuf)); dataLen = sizeof(fileCreateBuf); keyNum = (BTI_WORD)-1; status = BTRVID(B_STAT, posBlock1, &fileCreateBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); if (status == B_NO_ERROR) 言語インタフェース A-27 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 27 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A { /* create and open sample2.btr */ keyNum = 0; dataLen = sizeof(fileCreateBuf); status = BTRVID(B_CREATE, posBlock2, &fileCreateBuf, &dataLen, keyBuf2, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_CREATE status = %d", status ); printLB(Form1->ListBox1, tmpBuf); } if (status == B_NO_ERROR) { keyNum = 0; dataLen = 0; status = BTRVID( B_OPEN, posBlock2, dataBuf, &dataLen, keyBuf2, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_OPEN status = %d", status ); printLB(Form1->ListBox1, tmpBuf); if (status == B_NO_ERROR) { file2Open = TRUE; } } /* now extract data from the original file, insert into new one */ if (status == B_NO_ERROR) { /* getFirst to establish currency */ keyNum = 2; /* STATE-CITY index */ memset(&personRecord, 0, sizeof(personRecord)); memset(&keyBuf2[0], 0, sizeof(keyBuf2)); dataLen = sizeof(personRecord); getStatus = BTRVID( B_GET_FIRST, posBlock1, &personRecord, &dataLen, keyBuf1, keyNum, A-28 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 28 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_GET_FIRST status = %d", getStatus ); printLB(Form1->ListBox1, tmpBuf); } gneBuffer = (GNE_BUFFER_PTR)malloc(sizeof(GNE_BUFFER)); if (gneBuffer == NULL) { strcpy(tmpBuf, "Insufficient memory to allocate buffer" ); printLB(Form1->ListBox1, tmpBuf); return(EXIT_WITH_ERROR); } memset(gneBuffer, 0, sizeof(GNE_BUFFER)); memcpy(&gneBuffer->preBuf.gneHeader.currencyConst[0], "UC", 2); while (getStatus == B_NO_ERROR) { gneBuffer->preBuf.gneHeader.rejectCount = 0; gneBuffer->preBuf.gneHeader.numberTerms = 2; posCtr = sizeof(GNE_HEADER); /* fill in the first condition */ gneBuffer->preBuf.term1.fieldType = 11; gneBuffer->preBuf.term1.fieldLen = 3; gneBuffer->preBuf.term1.fieldOffset = 108; gneBuffer->preBuf.term1.comparisonCode = 1; gneBuffer->preBuf.term1.connector = 2; memcpy(&gneBuffer->preBuf.term1.value[0], "TX", 2); posCtr += sizeof(TERM_HEADER); /* fill in the second condition */ gneBuffer->preBuf.term2.fieldType = 11; gneBuffer->preBuf.term2.fieldLen = 3; gneBuffer->preBuf.term2.fieldOffset = 108; gneBuffer->preBuf.term2.comparisonCode = 1; gneBuffer->preBuf.term2.connector = 0; memcpy(&gneBuffer->preBuf.term2.value[0], "CA", 2); posCtr += sizeof(TERM_HEADER); /* fill in the projection header to retrieve whole record */ gneBuffer->preBuf.retrieval.maxRecsToRetrieve = 20; gneBuffer->preBuf.retrieval.noFieldsToRetrieve = 1; posCtr += sizeof(RETRIEVAL_HEADER); gneBuffer->preBuf.recordRet.fieldLen = sizeof(PERSON_STRUCT); gneBuffer->preBuf.recordRet.fieldOffset = 0; posCtr += sizeof(FIELD_RETRIEVAL_HEADER); gneBuffer->preBuf.gneHeader.descriptionLen = posCtr; dataLen = sizeof(GNE_BUFFER); getStatus = BTRVID( B_GET_NEXT_EXTENDED, posBlock1, 言語インタフェース A-29 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 29 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A gneBuffer, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_GET_NEXT_EXTENDED status = %d", getStatus ); printLB(Form1->ListBox1, tmpBuf); /* Get Next Extended can reach end of file and still return some records */ if ((getStatus == B_NO_ERROR) || (getStatus == B_END_OF_FILE)) { sprintf(tmpBuf, "GetNextExtended returned %d records.", gneBuffer->postBuf.numReturned); printLB(Form1->ListBox1, tmpBuf); for (i = 0; i < gneBuffer->postBuf.numReturned; i++) { dataLen = sizeof(PERSON_STRUCT); memcpy(dataBuf, &gneBuffer ->postBuf.recs[i].personRecord, dataLen); status = BTRVID( B_INSERT, posBlock2, dataBuf, &dataLen, keyBuf2, -1, /* no currency change */ (BTI_BUFFER_PTR)&clientID); } sprintf(tmpBuf, "Inserted %d records in new file, status = %d", gneBuffer->postBuf.numReturned, status); printLB(Form1->ListBox1, tmpBuf); } memset(gneBuffer, 0, sizeof(GNE_BUFFER)); memcpy(&gneBuffer->preBuf.gneHeader.currencyConst[0], "EG", 2); } free(gneBuffer); gneBuffer = NULL; /* close open files */ if (file1Open) { dataLen = 0; status = BTRVID( B_CLOSE, posBlock1, dataBuf, &dataLen, keyBuf1, A-30 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 30 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_CLOSE status (sample.btr) = %d", status ); printLB(Form1->ListBox1, tmpBuf); } if (file2Open) { dataLen = 0; status = BTRVID( B_CLOSE, posBlock2, dataBuf, &dataLen, keyBuf2, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_CLOSE status (sample2.btr) = %d", status ); printLB(Form1->ListBox1, tmpBuf); } /********************************************************** ISSUE THE BTRIEVE STOP OPERATION - For multi-tasking environments, such as MS Windows, OS2, and NLM, 'stop' frees all Btrieve resources for this client. In DOS and Extended DOS, it removes the Btrieve engine from memory. In multitasking environments, the engine will not unload on 'stop' unless it has no more clients. ***********************************************************/ if (btrieveLoaded) { dataLen = 0; status = BTRVID(B_STOP, posBlock1, dataBuf, &dataLen, keyBuf1, keyNum, (BTI_BUFFER_PTR)&clientID); sprintf(tmpBuf, "Btrieve B_STOP status = %d", status ); printLB(Form1->ListBox1, tmpBuf); if (status != B_NO_ERROR) { status = EXIT_WITH_ERROR; } } return(status); } 言語インタフェース A-31 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 31 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A COBOL アニメーティッド COBOL 開発者: ノンアニメーティッド COBOL インタ フェースではパラメータが右から左へ渡されますが、COBOL アニメータ は左から右に向かってスタックパラメータを渡します。ただし、アニメー ティッドおよびノンアニメーティッドアプリケーションいずれの場合も、 COBOL は整数を Inter high-low フォーマットで渡します。 また、オブジェクトモジュールの MF2BTRV.OBJ および CSUPPORT.OBJ は COBOL インタフェースには用意されていません。これらのモジュール の代わりに、COBRBTRV.OBJ モジュールを使用してください。 ノンアニメーティッド COBOL 開発者: MicroKernel にパラメータとして渡 す、すべての数値は Intel フォーマット (low-high バイト順) でなければな りません。このためには値を COMP-5 として定義します。 OS/2 ノンアニメーティッド開発者: OS/2 モジュールの場合、使用するアセ ンブラに OS2=1 を定義してください。そうしないと、アセンブルしたモ ジュールは DOS 用になってしまいます。 サンプルプログラム 配布メディアに含まれている次のサンプルプログラムは、いくつかの一般 的な Btrieve オペレーションを実行する方法を示しています。また、このプ ログラムでは、MicroKernel が必要とする順序でオペレーションが実行され ています (たとえば、ファイルに対する I/O を実行する前に、そのファイ ルをオープンしておく必要があります)。 サンプル A-3 BTRSAMP.CBL * * Copyright 1982-1997 Pervasive Software Inc. All Rights * Reserved * * BTRSAMP.CBL * This is a sample COBOL program that makes Btrieve calls from * an application using Micro Focus COBOL v3.x. * * IDENTIFICATION DIVISION. * PROGRAM-ID. TEST1. A-32 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 32 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 * * ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-PC. OBJECT-COMPUTER. IBM-PC. * * DATA DIVISION. * WORKING-STORAGE SECTION. * * BTRIEVE OP CODES * 01 B-OPEN PIC 9(4) COMP-5 VALUE 0. 01 B-INSERT PIC 9(4) COMP-5 VALUE 2. 01 B-GETFIRST PIC 9(4) COMP-5 VALUE 12. 01 B-UPDATE PIC 9(4) COMP-5 VALUE 3. 01 B-CLOSE PIC 9(4) COMP-5 VALUE 1. * 01 B-STATUS PIC 9(4) COMP-5 VALUE 0. 01 KEY-NUMBER PIC 9(4) COMP-5 VALUE 0. 01 BUF-LEN PIC 9(4) COMP-5 VALUE 0. 01 FILE-NAME PIC X(13) VALUE SPACES. 01 POSITION-BLOCK PIC X(128) VALUE SPACES. 01 DATA-BUFFER. 02 DECIMAL-FIELD PIC 9(6) COMP-3 VALUE 0. 02 STRING-FIELD PIC X(36) VALUE SPACES. 01 DSP-STATUS PIC 9(5) COMP-5. * * * PROCEDURE DIVISION. BEGIN. * * Open TEST.BTR * * MOVE 0 TO BUF-LEN. MOVE 0 TO KEY-NUMBER. MOVE 'TEST.BTR ' TO FILE-NAME. CALL "_BTRV" USING B-OPEN, B-STATUS, POSITION-BLOCK, DATA-BUFFER, BUF-LEN, FILE-NAME, KEY-NUMBER. IF B-STATUS NOT = 0 DISPLAY 'Error opening file. Status= ' B-STATUS ELSE DISPLAY 'File ' FILE-NAME ' successfully opened' END-IF. * * Insert into TEST.BTR * * MOVE 1 TO DECIMAL-FIELD. 言語インタフェース A-33 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 33 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A MOVE MOVE MOVE CALL 'Record 1' TO STRING-FIELD. 40 TO BUF-LEN. 0 TO KEY-NUMBER "_BTRV" USING B-INSERT, B-STATUS, POSITION-BLOCK, DATA-BUFFER, BUF-LEN, FILE-NAME, KEY-NUMBER. IF B-STATUS NOT = 0 DISPLAY 'Error inserting into file. Status= ' B-STATUS ELSE DISPLAY 'Inserted: ' DECIMAL-FIELD STRING-FIELD END-IF. * * GetFirst * * MOVE 40 TO BUF-LEN. MOVE 0 TO KEY-NUMBER CALL "_BTRV" USING B-GETFIRST, B-STATUS, POSITION-BLOCK, DATA-BUFFER, BUF-LEN, FILE-NAME, KEY-NUMBER. IF B-STATUS NOT = 0 DISPLAY 'Error Getting first record. Status= ' B-STATUS ELSE DISPLAY 'Retrieved: ' DECIMAL-FIELD STRING-FIELD END-IF. * * Update into TEST.BTR * * MOVE 2 TO DECIMAL-FIELD. MOVE 'Record 2' TO STRING-FIELD. MOVE 40 TO BUF-LEN. MOVE 0 TO KEY-NUMBER CALL "_BTRV" USING B-UPDATE, B-STATUS, POSITION-BLOCK, DATA-BUFFER, BUF-LEN, FILE-NAME, KEY-NUMBER. IF B-STATUS NOT = 0 DISPLAY 'Error updating file. Status= ' B-STATUS ELSE DISPLAY 'Updated to: ' DECIMAL-FIELD STRING-FIELD END-IF. * * Close TEST.BTR * * MOVE 0 TO BUF-LEN. MOVE 0 TO KEY-NUMBER CALL "_BTRV" USING B-CLOSE, B-STATUS, POSITION-BLOCK, DATA-BUFFER, BUF-LEN, FILE-NAME, KEY-NUMBER. IF B-STATUS NOT = 0 DISPLAY 'Error closing file. Status= ' B-STATUS ELSE A-34 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 34 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 DISPLAY 'Successfully closed TEST.BTR' END-IF. STOP RUN. 付 録 A 言語インタフェース A-35 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 35 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 Delphi 配布メディアに含まれている次のサンプルプログラムは、いくつかの一般 的な Btrieve オペレーションを実行する方法を示しています。また、このプ ログラムでは、MicroKernel が必要とする順序でオペレーションが実行され ています (たとえば、ファイルに対する I/O を実行する前に、そのファイ ルをオープンしておく必要があります)。 サンプル A-4 BTRSAM32.PAS Example A-4 BtrSam32.pas {*********************************************************** ** ** Copyright 1998 Pervasive Software Inc. ** All Rights Reserved ***********************************************************} {*********************************************************** BTRSAM32.DPR This is a simple sample designed to allow you to confirm your ability to compile, link, and execute a Btrieve application for your target 32-bit environment using your compiler tools. This program demonstrates the Delphi interface for Btrieve on 32-Bit MS Windows NT and Windows 95, for Delphi 2.0 and 3.0. This program does the following operations on the sample file: - gets the Microkernel Database Engine version using BTRVID - opens sample.btr - gets a record on a known value of Key 0 - displays the retrieved record - performs a stat operation - creates an empty ‘clone’ of sample.btr and opens it - performs a ‘Get Next Extended’ operation to extract a subset of the records in sample.btr - inserts those records into the cloned file - closes both files IMPORTANT: You must specify the complete path to the directory that contains the sample Btrieve data file, ‘sample.btr’. See IMPORTANT, below. Delphi 2.0/3.0 Btrieve projects must be compiled after selecting the following from the Delphi project environment pull-down menus: PROJECT OPTIONS... COMPILER CODE GENERATION ALIGNED RECORD FIELDS ( de-select this ) A-36 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 36 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 If you don’t do this step, when the record is printed out, it will seem ‘jumbled’ because the record structure is not byte-packed. You may, instead, use the (*A-*) compiler directive, or declare records as “packed,” as shown below. For more information, see the Delphi documentation. PROJECT FILES: - btr32.dpr - btr32.dof - btrsam32.dfm - btrsam32.pas - btrapi32.pas - btrconst.pas Borland project file Borland project file Borland project file Source code for the simple sample Delphi interface to Btrieve Btrieve constants file ***********************************************************} unit btrsam32; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, BtrConst, BtrAPI32; {*********************************************************** Program Constants ***********************************************************} const { program constants } MY_THREAD_ID = 50; EXIT_WITH_ERROR = 1; VERSION_OFFSET = 0; REVISION_OFFSET = 2; PLATFORM_ID_OFFSET = 4; {*********************************************************** Record type definitions for Version operation ***********************************************************} type CLIENT_ID = packed record networkandnode : array[1..12] of char; applicationID : array[1..3] of char; threadID : smallint; end; VERSION_STRUCT = packed record version : smallint; revision : smallint; MKDEId : char; end; {*********************************************************** Definition of record from ‘sample.btr’ ***********************************************************} 言語インタフェース A-37 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 37 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A {* Use ‘zero-based’ arrays of char for writeln() compatibility *} PERSON_STRUCT = packed record ID : longint; FirstName : array[0..15] of char; LastName : array[0..25] of char; Street : array[0..30] of char; City : array[0..30] of char; State : array[0..2] of char; Zip : array[0..10] of char; Country : array[0..20] of char; Phone : array[0..13] of char; end; {*********************************************************** Record type definitions for Stat and Create operations ***********************************************************} 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; 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; FILE_CREATE_BUF = packed record fileSpecs : FILE_SPECS; keySpecs : array[0..4] of KEY_SPECS; end; {*********************************************************** Record type definitions for Get Next Extended operation ***********************************************************} GNE_HEADER = packed record descriptionLen : smallint; currencyConst : array[0..1] of char; rejectCount : smallint; numberTerms : smallint; A-38 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 38 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 end; TERM_HEADER = packed record fieldType : byte; fieldLen : smallint; fieldOffset : smallint; comparisonCode : byte; connector : byte; value : array[0..2] of char; end; RETRIEVAL_HEADER = packed record maxRecsToRetrieve : smallint; noFieldsToRetrieve : smallint; end; 付 録 A FIELD_RETRIEVAL_HEADER = packed record fieldLen : smallint; fieldOffset : smallint; end; PRE_GNE_BUFFER = packed record gneHeader : GNE_HEADER; term1 : TERM_HEADER; term2 : TERM_HEADER; retrieval : RETRIEVAL_HEADER; recordRet : FIELD_RETRIEVAL_HEADER; end; RETURNED_REC = packed record recLen : smallint; recPos : longint; personRecord : PERSON_STRUCT; end; POST_GNE_BUFFER = packed record numReturned : smallint; recs : packed array[0..19] of RETURNED_REC; end; GNE_BUFFER_PTR = ^GNE_BUFFER; GNE_BUFFER = packed record case byte of 1 : (preBuf : PRE_GNE_BUFFER); 2 : (postBuf : POST_GNE_BUFFER); end; {*********************************************************** Delphi-generated form definition ***********************************************************} TForm1 = class(TForm) RunButton: TButton; ExitButton: TButton; ListBox1: TListBox; 言語インタフェース A-39 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 39 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 procedure FormCreate(Sender: TObject); procedure ExitButtonClick(Sender: TObject); procedure RunButtonClick(Sender: TObject); private { Private declarations } ArrowCursor, WaitCursor: HCursor; status: smallint; bufferLength: smallint; personRecord: PERSON_STRUCT; recordsRead: longint; procedure RunTest; public { Public declarations } end; var Form1: TForm1; {*********************************************************** Program starts here ***********************************************************} implementation {$R *.DFM} {*********************************************************** Program Variables ***********************************************************} var { Btrieve function parameters } posBlock1 : string[128]; posBlock2 : string[128]; dataBuffer : array[0..255] of char; dataLen : word; keyBuf1 : string[255]; keyBuf2 : string[255]; keyNum : smallint; btrieveLoaded personID file1Open file2Open status getStatus I posCtr : : : : : : : : boolean; longint; boolean; boolean; smallint; smallint; smallint; smallint; client versionBuffer fileCreateBuf gneBuffer personRecord : : : : : CLIENT_ID; array[1..3] of VERSION_STRUCT; FILE_CREATE_BUF; GNE_BUFFER_PTR; PERSON_STRUCT; A-40 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 40 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 {*********************************************************** A helper procedure to write to the ListBox ***********************************************************} procedure WritelnLB( LB: TListBox; Str: String); begin LB.Items.Add(Str); end; procedure TForm1.FormCreate(Sender: TObject); begin ArrowCursor := LoadCursor(0, IDC_ARROW); WaitCursor := LoadCursor(0, IDC_WAIT); end; {*********************************************************** This is the ‘main’ procedure of the sample ***********************************************************} procedure TForm1.RunTest; begin ListBox1.Clear; WritelnLB( ListBox1, ‘Test started ...’ ); { initialize variables } btrieveLoaded := FALSE; file1Open := FALSE; file2Open := FALSE; keyNum := 0; status := B_NO_ERROR; getStatus := B_NO_ERROR; { set up the Client ID } fillchar(client.networkAndNode, sizeof(client.networkAndNode), #0); client.applicationID := ‘MT’ + #0; { must be greater than “AA” } client.threadID := MY_THREAD_ID; fillchar(versionBuffer, sizeof(versionBuffer), #0); dataLen := sizeof(versionBuffer); status := BTRVID( B_VERSION, posBlock1, versionBuffer, dataLen, keyBuf1[1], keyNum, client); { set up the Client ID } fillchar(client.networkAndNode, sizeof(client.networkAndNode), #0); client.applicationID := ‘MT’ + #0; { must be greater than “AA” } 言語インタフェース A-41 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 41 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A client.threadID := MY_THREAD_ID; fillchar(versionBuffer, sizeof(versionBuffer), #0); dataLen := sizeof(versionBuffer); status := BTRVID( B_VERSION, posBlock1, versionBuffer, dataLen, keyBuf1[1], keyNum, client); if status = B_NO_ERROR then begin writelnLB( ListBox1, ‘Btrieve Versions returned are:’ ); for i := 1 to 3 do begin with versionBuffer[i] do begin if (version > 0) then begin writelnLB(ListBox1, intToStr(version) + ‘.’ + intToStr(revision) + ‘ ‘ + MKDEId); end end end; btrieveLoaded := TRUE; end else begin writelnLB(ListBox1, ‘Btrieve B_VERSION status = ‘ + intToStr(status)); if status <> B_RECORD_MANAGER_INACTIVE then begin btrieveLoaded := TRUE; end end; {* open sample.btr *} if status = B_NO_ERROR then begin fillchar(dataBuffer, sizeof(dataBuffer), #0); fillchar(keyBuf1, sizeof(keyBuf1), #0); keyNum := 0; dataLen := 0; {******************************************************** IMPORTANT: You should modify the following to specify the complete path to ‘sample.btr’ for your environment. ********************************************************} keyBuf1 := ‘c:¥sample¥sample.btr’ + #0; keyBuf2 := ‘c:¥sample¥sample2.btr’ + #0; status := BTRVID( B_OPEN, posBlock1, dataBuffer, dataLen, keyBuf1[1], keyNum, client); A-42 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 42 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 writelnLB(ListBox1, ‘Btrieve B_OPEN status = ‘ + intToStr(status)); if status = B_NO_ERROR then begin file1Open := TRUE; end end; {* get the record using key 0 = a known value using B_GET_EQUAL *} if status = B_NO_ERROR then begin fillchar(personRecord, sizeof(personRecord), #0); dataLen := sizeof(personRecord); personID := 263512477; {* this is really a social security number *} status := BTRVID( B_GET_EQUAL, posBlock1, personRecord, dataLen, personID, keyNum, client); writelnLB(ListBox1, ‘Btrieve B_GET_EQUAL status = ‘ + intToStr(status)); if status = B_NO_ERROR then with personRecord do begin writelnLB(ListBox1, ‘’); writelnLB(ListBox1, ‘Selected fields from the retrieved record are:’); writelnLB(ListBox1, ‘ID: ‘ + intToStr(ID)); writelnLB(ListBox1, ‘Name: ‘ + FirstName + ‘ ‘ + LastName); writelnLB(ListBox1, ‘Street: ‘ + Street); writelnLB(ListBox1, ‘City: ‘ + City); writelnLB(ListBox1, ‘State: ‘ + State); writelnLB(ListBox1, ‘Zip: ‘ + Zip); writelnLB(ListBox1, ‘Country: ‘ + Country); writelnLB(ListBox1, ‘Phone: ‘ + Phone); writelnLB(ListBox1, ‘’); end; end; { perform a stat operation to populate the create buffer } fillchar(fileCreateBuf, sizeof(fileCreateBuf), #0); dataLen := sizeof(fileCreateBuf); keyNum := -1; status := BTRVID(B_STAT, posBlock1, fileCreateBuf, dataLen, keyBuf1[1], keyNum, 言語インタフェース A-43 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 43 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A client); if (status = B_NO_ERROR) then begin { create and open sample2.btr } keyNum := 0; dataLen := sizeof(fileCreateBuf); status := BTRVID(B_CREATE, posBlock2, fileCreateBuf, dataLen, keyBuf2[1], keyNum, client); writelnLB(ListBox1, ‘Btrieve B_CREATE status = ‘ + intToStr(status)); end; if (status = B_NO_ERROR) then begin keyNum := 0; dataLen := 0; status := BTRVID( B_OPEN, posBlock2, dataBuffer, dataLen, keyBuf2[1], keyNum, client); writelnLB(ListBox1, ‘Btrieve B_OPEN status = ‘ + intToStr(status)); if (status = B_NO_ERROR) then begin file2Open := TRUE; end; end; { now extract data from the original file, insert into new one } if (status = B_NO_ERROR) then begin { getFirst to establish currency } keyNum := 2; { STATE-CITY index } fillchar(personRecord, sizeof(personRecord), #0); fillchar(keyBuf1, sizeof(keyBuf1), #0); dataLen := sizeof(personRecord); getStatus := BTRVID( B_GET_FIRST, posBlock1, personRecord, dataLen, keyBuf1[1], keyNum, client); A-44 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 44 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 writelnLB(ListBox1, ‘Btrieve B_GET_FIRST status = ‘ + intToStr(GETstatus)); writelnLB(ListBox1, ‘’); end; { Allocate memory on heap } gneBuffer := new(GNE_BUFFER_PTR); fillchar(gneBuffer^, sizeof(GNE_BUFFER), #0); strPCopy(gneBuffer^.preBuf.gneHeader.currencyConst, ‘UC’); while (getStatus = B_NO_ERROR) do begin gneBuffer^.preBuf.gneHeader.rejectCount := 0; gneBuffer^.preBuf.gneHeader.numberTerms := 2; posCtr := sizeof(GNE_HEADER); { fill in the first condition } gneBuffer^.preBuf.term1.fieldType := 11; gneBuffer^.preBuf.term1.fieldLen := 3; gneBuffer^.preBuf.term1.fieldOffset := 108; gneBuffer^.preBuf.term1.comparisonCode := 1; gneBuffer^.preBuf.term1.connector := 2; strPCopy(gneBuffer^.preBuf.term1.value, ‘TX’); inc(posCtr, (sizeof(TERM_HEADER))); { fill in the second condition } gneBuffer^.preBuf.term2.fieldType := 11; gneBuffer^.preBuf.term2.fieldLen := 3; gneBuffer^.preBuf.term2.fieldOffset := 108; gneBuffer^.preBuf.term2.comparisonCode := 1; gneBuffer^.preBuf.term2.connector := 0; strPCopy(gneBuffer^.preBuf.term2.value, ‘CA’); inc(posCtr, sizeof(TERM_HEADER)); { fill in the projection header to retrieve whole record } gneBuffer^.preBuf.retrieval.maxRecsToRetrieve := 20; gneBuffer^.preBuf.retrieval.noFieldsToRetrieve := 1; inc(posCtr, sizeof(RETRIEVAL_HEADER)); gneBuffer^.preBuf.recordRet.fieldLen := sizeof(PERSON_STRUCT); gneBuffer^.preBuf.recordRet.fieldOffset := 0; inc(posCtr, sizeof(FIELD_RETRIEVAL_HEADER)); gneBuffer^.preBuf.gneHeader.descriptionLen := posCtr; dataLen := sizeof(GNE_BUFFER); getStatus := BTRVID( B_GET_NEXT_EXTENDED, posBlock1, gneBuffer^, dataLen, keyBuf1, keyNum, 言語インタフェース A-45 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 45 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A client); writelnLB(ListBox1, ‘Btrieve B_GET_NEXT_EXTENDED status = ‘ + intToStr(getStatus)); { Get Next Extended can reach end of file and still return some records } if ((getStatus = B_NO_ERROR) or (getStatus = B_END_OF_FILE)) then begin writelnLB(ListBox1, ‘GetNextExtended returned ‘ + intToStr(gneBuffer^.postBuf.numReturned) + ‘¥par records.’); for i := 0 to gneBuffer^.postBuf.numReturned - 1 do begin dataLen := sizeof(PERSON_STRUCT); personRecord := gneBuffer^.postBuf.recs[i].personRecord; status := BTRVID( B_INSERT, posBlock2, personRecord, dataLen, keyBuf2, -1, { no currency change } client); if (status <> B_NO_ERROR) then begin writelnLB(ListBox1, ‘Btrieve B_INSERT status = ‘ + intToStr(status)); break; end; end; writelnLB(ListBox1, ‘Inserted ‘ + intToStr(gneBuffer^.postBuf.numReturned) + ‘ records in new file, status = ‘ + intToStr(status)); writelnLB(ListBox1, ‘’); end; fillchar(gneBuffer^, sizeof(GNE_BUFFER), #0); gneBuffer^.preBuf.gneHeader.currencyConst := ‘EG’; end; dispose(gneBuffer); { close open files } keyNum := 0; if file1Open = TRUE then begin dataLen := 0; status := BTRVID( B_CLOSE, posBlock1, dataBuffer, dataLen, keyBuf1[1], keyNum, A-46 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 46 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 client); writelnLB(ListBox1, ‘Btrieve B_CLOSE status (sample.btr) = ‘ + intToStr(status)); end; if file2Open = TRUE then begin dataLen := 0; status := BTRVID( B_CLOSE, posBlock2, dataBuffer, dataLen, keyBuf2[1], keyNum, client); writelnLB(ListBox1, ‘Btrieve B_CLOSE status (sample2.btr) = ‘ + intToStr(status)); end; end; procedure TForm1.ExitButtonClick(Sender: TObject); begin { FREE RESOURCES } dataLen := 0; status := BTRV( B_STOP, posBlock1, DataBuffer, dataLen, keyBuf1[1], 0 ); WritelnLB(ListBox1, ‘Btrieve B_STOP status = ‘ + intToStr(status) ); Close; end; procedure TForm1.RunButtonClick(Sender: TObject); begin SetCursor(WaitCursor); RunTest; SetCursor(ArrowCursor); end; end. 言語インタフェース A-47 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 47 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A Pascal Pascal インタフェースは次のソースモジュールから構成されます。 ◆ BTRAPID.PAS − 16 ビット DOS 対応の Btrieve 関数インタフェース ユニット ◆ BTRAPIW.PAS − Win16 対応の Btrieve 関数インタフェースユニット ◆ BTRCONST.PAS − コモン Btrieve 定数ユニット ◆ BTRSAMPD.PAS − 16 ビット DOS 対応のサンプル Btrieve プログラ ム ◆ BTRSAMPW.PAS − Win16 対応のサンプル Btrieve プログラム BTRAPID.PAS と BTRAPIW.PAS BTRAPID.PAS および BTRAPIW.PAS ファイルには、16 ビット DOS および Win16 対応の Pascal アプリケーションインタフェースのソースコードイン プリメンテーションが含まれています。これらのファイルでは、Btrieve 関 数を呼出すアプリケーションがサポートされています。 Turbo Pascal を使って、適切に Btrieve インタフェースをコンパイルし、ア プリケーション内の他のモジュールとリンクするため、BTRAPID.PAS また は BTRAPIW.PAS をコンパイルし、アプリケーションのソースコードの uses 節の中にリストする Turbo Pascal ユニットを作成することができます。 BTRCONST.PAS BTRCONST.PAS ファイルには、Btrieve に固有の便利な定数が含まれてい ます。これらの定数は Btrieve のオペレーションコード、ステータスコード、 ファイルフラグ、キーフラグなど、さまざまな項目の参照を標準化するの に役立ちます。 BTRCONST.PAS を使用するため、これをコンパイルし、アプリケーション のソースコードの uses 節の中にリストする Turbo Pascal ユニットを作成す ることができます。 A-48 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 48 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 BTRCONST.PAS を利用せずに Pascal アプリケーションインタフェースを使 用することも可能です。ただし、このファイルを利用することで、プログ ラミングが容易になる場合があります。 BTRSAMPD.PAS と BTRSAMPW.PAS ソースファイルの BTRSAMPD.PAS および BTRSAMPW.PAS は、コンパイ ル、リンク、および実行が可能なサンプル Btrieve プログラムです。 付 録 A プログラミングの必要条件 Btrieve オペレーションを呼出すと、ステータスコードに対応する整数値が 常に返されます。Btrieve 呼出しの後、アプリケーションではこのステータ スコードの値をチェックしてください。ステータスコード 0 はオペレー ションが正常に実行されたことを示します。アプリケーションでは、0 以 外のステータスを認識し、適切な解決を行うことができなければなりませ ん。 それぞれの呼出しには、すべてのパラメータを指定する必要がありますが、 すべてのオペレーションですべてのパラメータが使用されるわけではあり ません。それぞれのオペレーションで意味を持つパラメータについては、 第 2 章「Btrieve オペレーション」を参照してください。 注意 アプリケーションでバリアント文字列を含む Pascal のレコード構造を使用している 場合は、Pascal レコード内の奇数長の要素が 1 バイトの余分な記憶容量を必要とす る (レコードがパックされていない場合でも) ということを考慮に入れておいてく ださい。これは、Create (14) オペレーションでレコード長を定義するときに重要な 問題になります。レコード型の詳細については、Pascal のリファレンスマニュアル を参照してください。 インタフェースを使用したコンパイルとリンク アプリケーションのコンパイルについては、コンパイラに添付されている マニュアルを参照してください。 言語インタフェース A-49 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 49 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 サンプルプログラム 配布メディアに含まれている次のサンプルプログラムは、いくつかの一般 的な Btrieve オペレーションを実行する方法を示しています。また、このプ ログラムでは、MicroKernel が必要とする順序でオペレーションが実行され ています (たとえば、ファイルに対する I/O を実行する前に、そのファイ ルをオープンしておく必要があります)。 サンプル A-5 BTRSAMPW.PAS {*********************************************************** ** ** Copyright 1982-1997 Pervasive Software Inc. All Rights ** Reserved ***********************************************************} {*********************************************************** BTRSAMPW.PAS This program demonstrates the Btrieve Interface using Borland Pascal for MS Windows. This program does the following operations on the sample file: - gets the Microkernel Database Engine version using BTRVID - opens sample.btr - gets a record on a known value of Key 0 - displays the retrieved record - performs a stat operation - creates an empty 'clone' of sample.btr and opens it - performs a 'Get Next Extended' operation to extract a subset of the records in sample.btr - inserts those records into the cloned file - closes both files IMPORTANT: You must specify the complete path to the directory that contains the sample Btrieve data file, 'sample.btr'. See IMPORTANT, below. ***********************************************************} program btrsampw; uses WinCrt, { text mode I/O library for Windows } Strings, { Pascal System functions } btrapiw, { Btrieve Interface Unit } btrconst; { Btrieve Constants Unit } const { program constants } MY_THREAD_ID = 50; EXIT_WITH_ERROR = 1; VERSION_OFFSET = 0; REVISION_OFFSET = 2; PLATFORM_ID_OFFSET = 4; {*********************************************************** A-50 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 50 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 Record type definitions for Version operation ***********************************************************} type CLIENT_ID = packed record networkandnode : array[1..12] of char; applicationID : array[1..22] of char; threadID : integer; end; VERSION_STRUCT = packed record version : integer; revision : integer; MKDEId : char; end; {*********************************************************** Definition of record from 'sample.btr' ***********************************************************} {* Use 'zero-based' arrays of char for writeln() compatibility *} PERSON_STRUCT = packed record ID : longint; FirstName : array[0..15] of char; LastName : array[0..25] of char; Street : array[0..30] of char; City : array[0..30] of char; State : array[0..2] of char; Zip : array[0..10] of char; Country : array[0..20] of char; Phone : array[0..13] of char; end; {*********************************************************** Record type definitions for Stat and Create operations ***********************************************************} FILE_SPECS = packed record recLength : integer; pageSize : integer; indexCount : integer; reserved : array[0..3] of char; flags : integer; dupPointers : byte; notUsed : byte; allocations : integer; end; KEY_SPECS = position : length : flags : reserved : keyType : nullChar : notUsed : packed record integer; integer; integer; array [0..3] of char; char; char; array[0..1] of char; 言語インタフェース A-51 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 51 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A manualKeyNumber : byte; acsNumber : byte; end; FILE_CREATE_BUF = packed record fileSpecs : FILE_SPECS; keySpecs : array[0..4] of KEY_SPECS; end; {************************************************************** Record type definitions for Get Next Extended operation **************************************************************} GNE_HEADER = packed record descriptionLen : integer; currencyConst : array[0..1] of char; rejectCount : integer; numberTerms : integer; end; TERM_HEADER = packed record fieldType : byte; fieldLen : integer; fieldOffset : integer; comparisonCode : byte; connector : byte; value : array[0..2] of char; end; RETRIEVAL_HEADER = packed record maxRecsToRetrieve : integer; noFieldsToRetrieve : integer; end; FIELD_RETRIEVAL_HEADER = packed record fieldLen : integer; fieldOffset : integer; end; PRE_GNE_BUFFER = packed record gneHeader : GNE_HEADER; term1 : TERM_HEADER; term2 : TERM_HEADER; retrieval : RETRIEVAL_HEADER; recordRet : FIELD_RETRIEVAL_HEADER; end; RETURNED_REC = packed record recLen : integer; recPos : longint; personRecord : PERSON_STRUCT; end; POST_GNE_BUFFER = packed record numReturned : integer; recs : packed array[0..19] of RETURNED_REC; A-52 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 52 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 end; GNE_BUFFER_PTR = ^GNE_BUFFER; GNE_BUFFER = packed record case byte of 1 : (preBuf : PRE_GNE_BUFFER); 2 : (postBuf : POST_GNE_BUFFER); end; {*********************************************************** Variables ***********************************************************} var { Btrieve function parameters } posBlock1 : string[128]; posBlock2 : string[128]; dataBuffer : array[0..255] of char; dataLen : word; keyBuf1 : string[255]; keyBuf2 : string[255]; keyNum : integer; btrieveLoaded : boolean; personID : longint; file1Open : boolean; file2Open : boolean; status : integer; getStatus : integer; I : integer; posCtr : integer; client : CLIENT_ID; versionBuffer : array[1..3] of VERSION_STRUCT; fileCreateBuf : FILE_CREATE_BUF; gneBuffer : GNE_BUFFER_PTR; personRecord : PERSON_STRUCT; {*********************************************************** Program starts here ***********************************************************} begin { btrsamp } { initialize variables } btrieveLoaded := FALSE; file1Open := FALSE; file2Open := FALSE; keyNum := 0; status := B_NO_ERROR; getStatus := B_NO_ERROR; writeln; writeln('************ Btrieve Pascal Interface for Windows Demo ************'); writeln; { set up the Client ID } fillchar(client.networkAndNode, sizeof(client.networkAndNode), #0); 言語インタフェース A-53 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 53 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A client.applicationID := 'MT' + #0; { must be greater than "AA" } client.threadID := MY_THREAD_ID; fillchar(versionBuffer, sizeof(versionBuffer), #0); dataLen := sizeof(versionBuffer); status := BTRVID( B_VERSION, posBlock1, versionBuffer, dataLen, keyBuf1[1], keyNum, client); if status = B_NO_ERROR then begin writeln('Btrieve Versions returned are:'); for i := 1 to 3 do begin with versionBuffer[i] do begin if (version > 0) then begin writeln(version, '.', revision, ' ', MKDEId); end end end; btrieveLoaded := TRUE; end else begin writeln('Btrieve B_VERSION status = ', status); if status <> B_RECORD_MANAGER_INACTIVE then begin btrieveLoaded := TRUE; end end; {* open sample.btr *} if status = B_NO_ERROR then begin fillchar(dataBuffer, sizeof(dataBuffer), #0); fillchar(keyBuf1, sizeof(keyBuf1), #0); keyNum := 0; dataLen := 0; {******************************************************** IMPORTANT: You should modify the following to specify the complete path to 'sample.btr' for your environment. ***********************************************************} keyBuf1 := 'c:¥sample¥sample.btr' + #0; keyBuf2 := 'c:¥sample¥sample2.btr' + #0; status := BTRVID( B_OPEN, posBlock1, dataBuffer, dataLen, keyBuf1[1], keyNum, client); A-54 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 54 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 writeln('Btrieve B_OPEN status = ', status); if status = B_NO_ERROR then begin file1Open := TRUE; end end; {* get the record using key 0 = a known value using B_GET_EQUAL *} if status = B_NO_ERROR then begin fillchar(personRecord, sizeof(personRecord), #0); dataLen := sizeof(personRecord); personID := 263512477; {* this is really a social security number *} 付 録 A status := BTRVID( B_GET_EQUAL, posBlock1, personRecord, dataLen, personID, keyNum, client); writeln('Btrieve B_GET_EQUAL status = ', status); if status = B_NO_ERROR then with personRecord do begin writeln; writeln('Selected fields from the retrieved record are:'); writeln('ID: ', ID); writeln('Name: ', FirstName, ' ', LastName); writeln('Street: ', Street); writeln('City: ', City); writeln('State: ', State); writeln('Zip: ', Zip); writeln('Country: ', Country); writeln('Phone: ', Phone); writeln; end; end; { perform a stat operation to populate the create buffer } fillchar(fileCreateBuf, sizeof(fileCreateBuf), #0); dataLen := sizeof(fileCreateBuf); keyNum := -1; status := BTRVID(B_STAT, posBlock1, fileCreateBuf, dataLen, keyBuf1[1], keyNum, client); if (status = B_NO_ERROR) then begin { create and open sample2.btr } 言語インタフェース A-55 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 55 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 keyNum := 0; dataLen := sizeof(fileCreateBuf); status := BTRVID(B_CREATE, posBlock2, fileCreateBuf, dataLen, keyBuf2[1], keyNum, client); writeln('Btrieve B_CREATE status = ', status); end; if (status = B_NO_ERROR) then begin keyNum := 0; dataLen := 0; status := BTRVID( B_OPEN, posBlock2, dataBuffer, dataLen, keyBuf2[1], keyNum, client); writeln('Btrieve B_OPEN status (sample2.btr) = ', status); if (status = B_NO_ERROR) then begin file2Open := TRUE; end; end; { now extract data from the original file, insert into new one } if (status = B_NO_ERROR) then begin { getFirst to establish currency } keyNum := 2; { STATE-CITY index } fillchar(personRecord, sizeof(personRecord), #0); fillchar(keyBuf1, sizeof(keyBuf1), #0); dataLen := sizeof(personRecord); getStatus := BTRVID( B_GET_FIRST, posBlock1, personRecord, dataLen, keyBuf1[1], keyNum, client); writeln('Btrieve B_GET_FIRST status (sample.btr) = ', getStatus); writeln; end; if maxavail < SizeOf(GNE_BUFFER) then begin writeln('Insufficient memory to allocate buffer'); A-56 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 56 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 halt(EXIT_WITH_ERROR); end else begin { Allocate memory on heap } gneBuffer := new(GNE_BUFFER_PTR); end; fillchar(gneBuffer^, sizeof(GNE_BUFFER), #0); strPCopy(gneBuffer^.preBuf.gneHeader.currencyConst, 'UC'); while (getStatus = B_NO_ERROR) do begin gneBuffer^.preBuf.gneHeader.rejectCount := 0; gneBuffer^.preBuf.gneHeader.numberTerms := 2; posCtr := sizeof(GNE_HEADER); { fill in the first condition } gneBuffer^.preBuf.term1.fieldType := 11; gneBuffer^.preBuf.term1.fieldLen := 3; gneBuffer^.preBuf.term1.fieldOffset := 108; gneBuffer^.preBuf.term1.comparisonCode := 1; gneBuffer^.preBuf.term1.connector := 2; strPCopy(gneBuffer^.preBuf.term1.value, 'TX'); inc(posCtr, (sizeof(TERM_HEADER))); { fill in the second condition } gneBuffer^.preBuf.term2.fieldType := 11; gneBuffer^.preBuf.term2.fieldLen := 3; gneBuffer^.preBuf.term2.fieldOffset := 108; gneBuffer^.preBuf.term2.comparisonCode := 1; gneBuffer^.preBuf.term2.connector := 0; strPCopy(gneBuffer^.preBuf.term2.value, 'CA'); inc(posCtr, sizeof(TERM_HEADER)); { fill in the projection header to retrieve whole record } gneBuffer^.preBuf.retrieval.maxRecsToRetrieve := 20; gneBuffer^.preBuf.retrieval.noFieldsToRetrieve := 1; inc(posCtr, sizeof(RETRIEVAL_HEADER)); gneBuffer^.preBuf.recordRet.fieldLen := sizeof(PERSON_STRUCT); gneBuffer^.preBuf.recordRet.fieldOffset := 0; inc(posCtr, sizeof(FIELD_RETRIEVAL_HEADER)); gneBuffer^.preBuf.gneHeader.descriptionLen := posCtr; dataLen := sizeof(GNE_BUFFER); getStatus := BTRVID( B_GET_NEXT_EXTENDED, posBlock1, gneBuffer^, dataLen, keyBuf1, keyNum, client); writeln('Btrieve B_GET_NEXT_EXTENDED status = ', getStatus); { Get Next Extended can reach end of file and still 言語インタフェース A-57 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 57 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A return some records } if ((getStatus = B_NO_ERROR) or (getStatus = B_END_OF_FILE)) then begin writeln('GetNextExtended returned ', gneBuffer^.postBuf.numReturned, ' records.'); for i := 0 to gneBuffer^.postBuf.numReturned - 1 do begin dataLen := sizeof(PERSON_STRUCT); personRecord := gneBuffer^.postBuf.recs[i].personRecord; status := BTRVID( B_INSERT, posBlock2, personRecord, dataLen, keyBuf2, -1, { no currency change } client); if (status <> B_NO_ERROR) then begin writeln('Btrieve B_INSERT status = ', status); break; end; end; writeln('Inserted ', gneBuffer^.postBuf.numReturned, ' records in new file, status = ', status); writeln; end; fillchar(gneBuffer^, sizeof(GNE_BUFFER), #0); gneBuffer^.preBuf.gneHeader.currencyConst := 'EG'; end; dispose(gneBuffer); { close open files } keyNum := 0; if file1Open = TRUE then begin dataLen := 0; status := BTRVID( B_CLOSE, posBlock1, dataBuffer, dataLen, keyBuf1[1], keyNum, client); writeln('Btrieve B_CLOSE status (sample.btr) = ', status); end; if file2Open = TRUE then begin dataLen := 0; status := BTRVID( B_CLOSE, posBlock2, A-58 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 58 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 dataBuffer, dataLen, keyBuf2[1], keyNum, client); writeln('Btrieve B_CLOSE status (sample2.btr) = ', status); end; { FREE RESOURCES } dataLen := 0; status := BTRVID(B_STOP, posBlock1, DataBuffer, dataLen, keyBuf1[1], 0, client); writeln('Btrieve B_STOP status = ', status) end. 言語インタフェース A-59 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 59 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A Visual Basic ここでは、次のトピックについて説明します。 ◆ サンプルプログラム ◆ 32 ビットアプリケーションの作成 サンプルプログラム 次のサンプルプログラムは、いくつかの一般的な Btrieve オペレーションを 実行する方法を示しています。また、このプログラムでは、MicroKernel が 必要とする順序でオペレーションが実行されています (たとえば、ファイ ルに対する I/O を実行する前に、そのファイルをオープンしておく必要が あります)。 サンプル A-6 BTRSAM32.BAS Attribute VB_Name = "BtrSam32" Rem ********************************************************* Rem Rem Copyright 1994-1997 Pervasive Software Inc. Rem All Rights Reserved. Rem ********************************************************* Rem BTSAMP32.VBP Rem BTRFRM32.FRM Rem BTRSAM32.BAS Rem This is an example program that demonstrates the Visual Rem Basic interface to Btrieve. A Visual Basic program must Rem use the Windows-specific interface WBTRV32.DLL for 32 bit Rem applications and WBTRCALL.DLL for 16 bit applications. Rem Rem You can run this program with Visual Basic 4.0 under Rem Windows 3.1, Windows NT, or Windows 95. Rem Rem This example program creates a Btrieve file with 2 keys Rem and then does some insert and read operations on that file. Rem Rem Note about the Btrieve key buffer size: your key buffer Rem should always be at least as large as the key buffer length Rem parameter that you supply to Btrieve. If you indicate that Rem your key buffer is 10 bytes long and it is only 8, Btrieve Rem may write past the end of your key buffer when updating Rem the key buffer with a key value. Rem Note that Btrieve returns a key value in the key buffer Rem after an 'insert' operation. Rem Rem ********************************************************* A-60 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 60 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem Rem This sample code shows a workaround to the Visual Basic Long variable type alignment problem. This problem, which manifests itself as a status 29 on BCREATE operations with more than one index, as an incorrect value for the total number of records in a BSTAT operation, and as incorrect values for data being returned as Long variable types, is a design limitation of Visual Basic. We workaround this structure member alignment issue by using a User Defined Type. This workaround breaks the data into four (4) units. Each unit is one (1) byte. Once the data has been returned from the DLL (on BSTAT and in data), we use byte swapping and conversion from hexadecimal to decimal to return the correct value. For more information about the Structure Member Alignment issue, contact Microsoft or consult the VB4DLL.TXT file included with Visual Basic. ******************************************************** DefInt Global Global Global Global Global Global Global Global Global Global Global Global Global Global A-Z Const Const Const Const Const Const Const Const Const Const Const Const Const Const BOPEN = 0 BCLOSE = 1 BINSERT = 2 BUPDATE = 3 BDELETE = 4 BGETEQUAL = 5 BGETNEXT = 6 BGETGREATEROREQUAL = 9 BGETFIRST = 12 BCREATE = 14 BSTAT = 15 BSTOP = 25 BVERSION = 26 BRESET = 28 Global Const KEY_BUF_LEN = 255 Rem Key Flags Global Const DUP = 1 Global Const MODIFIABLE = 2 Global Const BIN = 4 Global Const NUL = 8 Global Const SEGMENT = 16 Global Const SEQ = 32 Global Const DEC = 64 Global Const SUP = 128 Rem Key Types Global Const EXTTYPE = 256 Global Const MANUAL = 512 Global Const BSTRING = 0 Global Const BINTEGER = 1 Global Const BFLOAT = 2 Global Const BDATE = 3 言語インタフェース A-61 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 61 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A Global Global Global Global Global Const Const Const Const Const BTIME = 4 BDECIMAL = BNUMERIC = BZSTRING = BAUTOINC = 5 8 11 15 Declare Function BTRCALL Lib "wbtrv32.dll" (ByVal OP, ByVal Pb$, Db As Any, DL As Integer, Kb As Any, ByVal Kl, ByVal Kn) As Integer Rem ********************************************************* Rem Structures to overcome problems within Visual Basic. Rem This User Defined Type allows us to convert the data coming Rem in from (or going to) our interface. By treating the data Rem as a byte we can concatenate the data back into a Long Rem variable type without conversion problems. Type typ_byte4 fld_Field1 As Byte fld_Field2 As Byte fld_Field3 As Byte fld_Field4 As Byte End Type Rem ********************************************************* Rem Btrieve Structures Type KeySpec KeyPos KeyLen KeyFlags KeyTot KeyType Reserved End Type As As As As As As Integer Integer Integer typ_byte4 String * 1 String * 5 Type FileSpec RecLen PageSize IndxCnt NotUsed FileFlags Reserved Allocation KeyBuf0 KeyBuf1 End Type As As As As As As As As As Rem Rem Rem Rem Rem Rem Rem Rem As KeySpec As KeySpec Note that due to the way Visual Basic 4.0 handles arrays of user-defined types, the above type uses KeyBuf0 KeyBuf1 rather than A-62 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 62 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 Integer Integer Integer String * 4 Integer String * 2 Integer KeySpec KeySpec Rem KeyBuf(0 To 1) As KeySpec Rem Rem Each Key description must be a separate entry in the Rem FileSpec. Rem KeyBuf is treated similarly in 'StatFileSpecs', below. Rem Type StatFileSpecs RecLen PageSize IndexTot RecTot FileFlags Reserved UnusedPages KeyBuf0 KeyBuf1 End Type Type RecordBuffer Number Dummy End Type As As As As As As As As As Integer Integer Integer typ_byte4 Integer String * 2 Integer KeySpec KeySpec 付 録 A As Double As String * 26 Type VersionBuf Major As Integer Minor As Integer Engine As String * 1 End Type Global Global Global Global Global Global FileBuf As FileSpec DataBuf As RecordBuffer StatFileBuffer As StatFileSpecs PosBlk$ BufLen As Integer DBLen As Integer Sub PrintLB(Item As String) BtrFrm32.List1.AddItem Item End Sub Sub RunTest() PrintLB ("Btrieve Sample Test Started") PrintLB ("") Rem Dim Dim Dim Dim Dim Dim Rem Local variables needed for conversion from byte to long. loc_RecTot As Long h_field1 As String h_field2 As String h_field3 As String h_field4 As String h_total As String ************************** 言語インタフェース A-63 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 63 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 filename$ = "XFACE.BTR" PosBlk$ = Space$(128) KeyBuffer$ = Space$(KEY_BUF_LEN) Rem Rem ***************** Btrieve Create ********************* Rem Rem ************* SET UP FILE SPECS FileBuf.RecLen = 34 FileBuf.PageSize = 1024 FileBuf.IndxCnt = 2 FileBuf.FileFlags = 0 Rem ************* SET UP KEY SPECS FileBuf.KeyBuf0.KeyPos = 1 FileBuf.KeyBuf0.KeyLen = 8 FileBuf.KeyBuf0.KeyFlags = EXTTYPE + MODIFIABLE FileBuf.KeyBuf0.KeyType = Chr$(BFLOAT) FileBuf.KeyBuf1.KeyPos = 9 FileBuf.KeyBuf1.KeyLen = 26 FileBuf.KeyBuf1.KeyFlags = EXTTYPE + MODIFIABLE + DUP FileBuf.KeyBuf1.KeyType = Chr$(BSTRING) BufLen = Len(FileBuf) KeyBufLen = Len(filename$) KeyBuffer$ = filename$ Status = BTRCALL(BCREATE, PosBlk$, FileBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error Creating File. Status = " + Str$(Status) PrintLB (Msg$) Else Msg$ = "File XFACE.BTR Created Successfully!" PrintLB (Msg$) End If 'Open File KeyBufLen = KEY_BUF_LEN KeyBuffer$ = filename$ BufLen = Len(DataBuf) KeyNum = 0 Status = BTRCALL(BOPEN, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, KeyNum) If Status <> 0 Then Msg$ = "Error Opening file! " + Str$(Status) PrintLB (Msg$) GoTo Fini Else Msg$ = "File Opened Successfully!" A-64 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 64 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 PrintLB (Msg$) End If 'Insert First Record yr = 1992 mo = 1 dy = 1 DataBuf.Number = DateSerial(yr, mo, dy) BufLen = Len(DataBuf) KeyBuffer$ = Space$(KEY_BUF_LEN) KeyBufLen = KEY_BUF_LEN DataBuf.Dummy = "first record" Status = BTRCALL(BINSERT, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error on Insert. " + Str$(Status) PrintLB (Msg$) Else Msg$ = "Insert Record #1 Successful!" PrintLB (Msg$) End If 'Insert Second Record yr = 1993 mo = 1 dy = 1 DataBuf.Number = DateSerial(yr, mo, dy) BufLen = Len(DataBuf) KeyBuffer$ = Space$(KEY_BUF_LEN) KeyBufLen = KEY_BUF_LEN DataBuf.Dummy = "second record" Status = BTRCALL(BINSERT, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error on Insert. " + Str$(Status) PrintLB (Msg$) Else Msg$ = "Insert Record #2 Successful!" PrintLB (Msg$) End If 'Insert Third Record yr = 1994 mo = 1 dy = 1 DataBuf.Number = DateSerial(yr, mo, dy) BufLen = Len(DataBuf) KeyBuffer$ = Space$(KEY_BUF_LEN) KeyBufLen = KEY_BUF_LEN DataBuf.Dummy = "third record" Status = BTRCALL(BINSERT, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then 言語インタフェース A-65 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 65 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A Msg$ = "Error on Insert. " + Str$(Status) PrintLB (Msg$) Else Msg$ = "Insert Record #3 Successful!" PrintLB (Msg$) End If 'Get First Record BufLen = Len(DataBuf) KeyBuffer$ = Space$(255) KeyBufLen = KEY_BUF_LEN Status = BTRCALL(BGETFIRST, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error on BGETFIRST. " + Str$(Status) PrintLB (Msg$) Else Msg$ = "BGETFIRST okay for : " + Str$(Year(DataBuf.Number)) + DataBuf.Dummy PrintLB (Msg$) End If 'Get Next Record BufLen = Len(DataBuf) KeyBuffer$ = Space$(KEY_BUF_LEN) KeyBufLen = KEY_BUF_LEN Status = BTRCALL(BGETNEXT, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error on BGETNEXT. " + Str$(Status) PrintLB (Msg$) Else Msg$ = "BGETNEXT okay for: " + Str$(Year(DataBuf.Number)) + DataBuf.Dummy PrintLB (Msg$) End If 'Get Next Record BufLen = Len(DataBuf) KeyBuffer$ = Space$(KEY_BUF_LEN) KeyBufLen = KEY_BUF_LEN Status = BTRCALL(BGETNEXT, PosBlk$, DataBuf, BufLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error on BGETNEXT. " + Str$(Status) PrintLB (Msg$) Else Msg$ = "BGETNEXT okay for: " + Str$(Year(DataBuf.Number)) + DataBuf.Dummy A-66 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 66 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 PrintLB (Msg$) End If 'Get Equal BufLen = Len(DataBuf) KBuf# = 33604 KeyBufLen = 8 Status = BTRCALL(BGETEQUAL, PosBlk$, DataBuf, BufLen, KBuf#, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error on Get Equal. Status = " + Str$(Status) PrintLB (Msg$) Else PrintLB ("BGETEQUAL okay on following key: " + Str$(DataBuf.Number)) End If 'Stat Call DBLen = Len(StatFileBuffer) KeyBuffer$ = Space$(KEY_BUF_LEN) KeyBufLen = KEY_BUF_LEN Status = BTRCALL(BSTAT, PosBlk$, StatFileBuffer, DBLen, ByVal KeyBuffer$, KeyBufLen, 0) If Status <> 0 Then Msg$ = "Error in Stat Call. Status = " + Str$(Status) PrintLB (Msg$) GoTo Fini Else Rem ********************************** Rem Code to work around problems with Visual Basic's "Double Rem Word" alignment. This code converts the byte data Rem hexadecimal, concatenates each byte, and converts it Rem to decimal for display. h_field1 = Hex(StatFileBuffer.RecTot.fld_Field1) h_field2 = Hex(StatFileBuffer.RecTot.fld_Field2) h_field3 = Hex(StatFileBuffer.RecTot.fld_Field3) h_total = "&H" & h_field4 & h_field3 & h_field2 & h_field1 loc_RecTot = Val(h_total) Rem ********************************** Msg$ = "Number of Records = " & loc_RecTot PrintLB (Msg$) End If Fini: Status = BTRCALL(BRESET, PosBlk$, PatientVar, BufLen, KeyBuffer$, KeyBufLen, KeyNum) If Status Then Msg$ = "Error on B-Reset!" + Str$(Status) PrintLB (Msg$) Else 言語インタフェース A-67 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 67 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A Msg$ = "BRESET okay." PrintLB (Msg$) End If Status = BTRCALL(BSTOP, PosBlk$, PatientVar, BufLen, KeyBuffer$, KeyBufLen, KeyNum) If Status Then Msg$ = "Error on B-Stop!" + Str$(Status) PrintLB (Msg$) Else Msg$ = "BSTOP okay." PrintLB (Msg$) End If PrintLB ("") PrintLB ("Btrieve Sample Test Completed") End Sub A-68 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 68 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 32 ビットアプリケーションの作成 Visual Basic 4.0 以上を使って 32 ビットアプリケーションを開発するとき、 構造体アラインメントの問題が Btrieve 呼出しのトラブルの原因になること があります。パフォーマンスを最適化するため、Visual Basic は構造体に余 分なバイトを追加し、構造体に含まれるいくつかのフィールドでダブル ワードアラインメントを実行します。たとえば次のように、構造体に Long (4 バイト) 整数や、単精度 (4 バイト) または倍精度 (8 バイト) 浮動小数 点数フィールドが含まれているとき、このような処理が普通に行われます。 Type DataBuffer Fld1 As String * 2 Fld2 As Long End Type この構造体は実際には 6 バイトではなく 8 バイトを占有します。これは、 Fld2 をダブルワード境界に移動するために、2 バイトの「ダミー」が余分 に構造体に挿入されるためです。この問題は C/C++ や Pascal など、大部分 のコンパイラにも存在しています。ただし、Visual Basic 以外のコンパイラ では、コンパイラに使用させる構造体アラインメントのタイプを指定する 環境設定オプションが用意されています。Visual Basic には、このような環 境設定オプションは用意されていません。 Btrieve 呼出しのデータバッファパラメータとして Visual Basic の Type 構造 体を使用するとき、Btrieve ではこのような余分なバイトを認識できません。 たとえば、前述のように定義されている構造体を対象に Get First を使って ファイルから 6 バイトのレコードを読み込むとき、Btrieve は構造体の先頭 6 バイトに含まれている 6 バイトのデータを返します。Btrieve が余分なバ イトを追加することはありません。このため、Fld2 へのその後アクセスで は正しいデータが得られません。 開発する Visual Basic アプリケーションでこの問題を避けるには、いくつか の対処方法があります。対処方法の一例については、BTRSAM32.BAS の コードを参照してください。次に、レコードを読み込むときに使用できる 別の対処方法の概要を示します。この方法では中間 Type 構造体を使用しま す。 1. 後で使用することになる数値フィールドと同じサイズの文字列フィール ドを使ってすべての Type バッファを宣言します。 言語インタフェース A-69 TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 69 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 付 録 A 2. 2 つの中間 Type バッファを宣言します。1 つは 4 バイトの文字列フィー ルドのみから構成され、もう 1 つは 4 バイトの長整数または浮動小数点 数フィールドのみから構成されます。 3. 操作手順 1 で作成した Type バッファを使って、Btrieve ファイルからレ コードを読み込みます。 4. Btrieve のデータバッファから文字列フィールドのみを含む中間バッ ファに 4 バイトの文字列をコピーします。 5. Visual Basic の Lset オペレーションを使って、数値型の中間バッファが 文字列型の中間バッファと等しくなるように設定します (これは、C 言 語の memmove 関数に相当します。この関数では、構造体に含まれる下 層のフィールドデータ型に関係なくバイトがコピーされます)。 挿入または更新オペレーションを実行するときにも、同様の方法を使って 問題を回避することができます。 A-70 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-RA.DOC PAGE: 70 OF 70 LAST SAVED: 98/03/05 16:33 BY: JUNKO OKUMURA PRINTED: 98/03/05 16:34 索引 数字 Btrieve API 概要 1-1 32 ビットアプリケーションの作成 A-69 Btrieve オペレーション 2-1 概要 1-14 A Abort Transaction (21) 2-2 Btrieve 関数 オペレーションコード 1-6 ACS 2-19, 2-102 概要 1-2 ロケール固有 ACS 2-20 キー長 1-12 ユーザ定義 ACS 2-19 キーバッファ 1-9 ACS 番号 2-19 キー番号 1-10 ACS 名 クライアント ID 1-10 フォーマット 2-24 ステータスコード 1-7 Append サブファンクションバイアス 2-130 データバッファ 1-8 データバッファ長 1-8 B パラメータ 1-6 Begin Transaction (1019) 2-3 ポジションブロック 1-7 Begin Transaction (19) 2-3 BTRSAMP.C A-6 BTITYPES.H A-5 BTRSAMPD.PAS A-49 BTRAPI.C A-4 BTRSAMPW.PAS A-49 BTRAPI.H A-4 BTRVID 関数 1-3 BTRAPID.PAS A-48 BTRV 関数 1-3 BTRAPIW.PAS A-48 BTRCALL32 関数 1-4 BTRCALLBACK 関数 1-5 BTRCALLID32 関数 1-4 BTRCALLID 関数 1-4 BTRCALL 関数 1-4 BTRCONST.H A-5 BTRCONST.PAS A-48 C C/C++ A-1, A-4 サンプルプログラム A-7 C++ Builder アプリケーション コンパイル A-20 Clear Owner (30) 2-5 Close (1) 2-6 索引 1 TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 1 OF 8 LAST SAVED: 98/03/09 12:24 BY: M PRINTED: 98/03/09 12:25 COBOL A-2, A-32 サンプルプログラム A-32 Get Previous (7) 2-78 Get Previous Extended (37) 2-80 Continuous Operation (42) 2-8 Continuous オペレーションモード 2-8 I Create (14) 2-12 Insert (2) 2-82 Create Index (31) 2-23 Insert Extended (40) 2-84 ISR 2-20 D Delete (4) 2-28 N Delphi A-2, A-36 NCC Insert Extended オペレーション 2-85 サンプルプログラム A-36 Drop Index (32) 2-30 NCC Insert オペレーション 2-83 NCC Update オペレーション 2-121 Next-in-Record サブファンクションバイアス 2-45, E 2-130 End Transaction (20) 2-32 O F Open (0) 2-88 Find Percentage (45) 2-33 P G Pascal A-2, A-48 サンプルプログラム A-50 Get By Percentage (44) 2-36 Get Direct/Chunk (23) 2-39 Get Direct/Record (23) 2-48 R Get Directory (18) 2-50 Reset (28) 2-94 Get Equal (5) 2-51 Get First (12) 2-53 Get Greater (8) 2-55 Get Greater Than or Equal (9) 2-57 Get Key (+50) 2-59 Get Last (13) 2-61 Get Less Than (10) 2-63 Get Less Than or Equal (11) 2-65 Get Next (6) 2-67 Get Next Extended (36) 2-69 Get Position (22) 2-77 2 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 2 OF 8 LAST SAVED: 98/03/09 12:24 BY: M PRINTED: 98/03/09 12:25 S Set Directory (17) 2-95 Set Owner (29) 2-96 Stat (15) 2-98 Stat Extended (65) 2-103 Step First (33) 2-106 Step Last (34) 2-107 Step Next (24) 2-108 Step Next Extended (38) 2-110 Step Previous (35) 2-113 インタフェース Visual Basic A-3, A-60 Step Previous Extended (39) 2-115 Stop (25) 2-117 インタフェースモジュール A-4 インプリメント T スクロールバー 2-33, 2-36 Tenberry DOS/4G Extender A-19 オ U オーナネーム Unlock (27) 2-118 削除 2-5 Update (3) 2-120 割当て 2-96 Update Chunk (53) 2-123 オープン アクセラレイティドモード 2-89 エクスクルーシブモード 2-89 V シングルエンジンファイル共有バイアス 2-90 Version (26) 2-133 Visual Basic A-3, A-60 サンプルプログラム A-60 ノーマルモード 2-89 ファイル 2-88 ベリファイモード 2-89 マルチエンジンファイル共有バイアス 2-90 W リードオンリーモード 2-89 Windows アプリケーション リンク A-19 オープンモード 2-89 オペレーション Abort Transaction 1-14 ア Begin Transaction 1-14 アクセス制限コード 2-97 Btrieve オペレーション 1-14, 2-1 アクセラレイティドモード 2-89 Clear Owner 1-15 Close 1-15 イ Continuous Operation 1-16 イベント シーケンス 1-19 インターナショナルソート規則 2-20 インタフェース A-1 C/C++ A-1, A-4 COBOL A-2, A-32 Delphi A-2, A-36 Pascal A-2, A-48 Create 1-15 Create Index 1-16 Delete 1-18 Drop Index 1-16 End Transaction 1-14 Find Percentage 1-16, 1-17 Get By Percentage 1-16, 1-17 Get Direct/Chunk 1-17 Get Direct/Record 1-17 索引 3 TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 3 OF 8 LAST SAVED: 98/03/05 15:37 BY: MARIKO WATANABE PRINTED: 98/03/05 15:38 オペレーション オペレーション Get Directory 1-14 セッション固有 1-14 Get Equal 1-16 データ取得 1-15 Get First 1-16 データ操作 1-15 Get Greater 1-16 名前 2-1 Get Greater Than or Equal 1-16 ノーウェイトページロック 1-17 Get Key 1-16 パラメータ 2-1 Get Last 1-16 ファイルアクセス 1-15 Get Less Than 1-16 ファイル固有 1-15 Get Less Than or Equal 1-16 ポジショニング 2-1 Get Next 1-16 マルチレコードウェイトロック 1-17 Get Next Extended 1-16 マルチレコードノーウェイトロック 1-17 Get Position 1-16 オペレーションコード 1-6 Get Previous 1-16 オペレーティングシステムスイッチ A-6 Get Previous Extended 1-16 オルタネートコレーティングシーケンス 2-19 Insert 1-18 ユーザ定義 ACS 2-19 Insert Extended 1-18 ロケール固有 ACS 2-20 Open 1-15 Reset 1-14 カ Set Directory 1-14 開始 Set Owner 1-15 Stat 1-15 トランザクション 2-3 解除 Step First 1-17 ロック 2-118 Step Last 1-17 拡張キータイプ 2-17 Step Next 1-17 拡張ファイルディスクリプタ 2-103 Step Next Extended 1-17 拡張ファイルリターンバッファ 2-104 Step Previous 1-17 カレントディレクトリ Step Previous Extended 1-17 取得 2-50 Stop 1-14 Unlock 1-16 設定 2-95 関数 Update 1-18 BTRCALL32 関数 1-4 Update Chunk 1-18 BTRCALLBACK 関数 1-5 Version 1-14 BTRCALLID32 関数 1-4 実行結果 2-1 BTRCALLID 関数 1-4 シングルレコードウェイトロック 1-17 BTRCALL 関数 1-4 シングルレコードノーウェイトロック 1-17 Btrieve 関数 1-2 4 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 4 OF 8 LAST SAVED: 98/03/09 12:24 BY: M PRINTED: 98/03/09 12:25 コ 関数 BTRVID 関数 1-3 コンパイル BTRV 関数 1-3 キ C++ Builder アプリケーション A-20 サ キー 削除 削除 2-30 オーナネーム 2-5 追加 2-23 キー 2-30 キースペック 2-13, 2-16, 2-99, 2-102 ACS 番号 2-19 レコード 2-28 作成 手動割当てキー番号 2-18 ヌル値 2-18 32 ビットアプリケーション A-69 サンプルプログラム キー長 1-12 C/C++ A-7 キーバッファ 1-9 COBOL A-32 キー番号 1-10, 2-21 Delphi A-36 キーフラグ 2-16 Pascal A-50 キーポジション 2-16 Visual Basic A-60 切り捨てディスクリプタ 2-130 シ ク システムデータディスクリプタ 2-104 矩形チャンクディスクリプタ 2-42, 2-127 構造 2-43 システムデータリターンバッファ 2-105 実行 クライアント ID 1-10 クローズ 終了ルーチン 2-117 終了 ファイル 2-6 トランザクション 2-2, 2-32 終了ルーチン ケ 実行 2-117 言語インタフェース A-1 C/C++ A-1, A-4 手動割当てキー番号 2-18 取得 COBOL A-2, A-32 カレントディレクトリ 2-50 Delphi A-2, A-36 情報 2-98, 2-103 Pascal A-2, A-48 チャンク 2-39 Visual Basic A-3, A-60 バージョン情報 2-133 フィールド 2-73 検索 レコード 2-69, 2-80, 2-110, 2-115 物理ポジション 2-77 索引 5 TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 5 OF 8 LAST SAVED: 98/03/09 12:24 BY: M PRINTED: 98/03/09 12:25 ツ 取得 レコード 2-48, 2-51, 2-53, 2-55, 2-57, 2-61, 2- 追加 63, 2-65, 2-67, 2-78, 2-106, 2-107, 2-108, 2113 情報 キー 2-23 テ データ オペレーション 1-15 取得 1-15 取得 2-98, 2-103 変更 2-120 操作 1-15 データ型 シングルエンジンファイル共有バイアス 2-90 拡張キータイプ 2-17 データ検索 ス インデックスベース(論理) 1-16 スイッチ オペレーティングシステムスイッチ A-6 スクロールバー インプリメント 2-33, 2-36 非インデックスベース(物理) 1-16 データ取得オペレーション 1-16 データ操作オペレーション 1-18 データバッファ 1-8 ステータスコード 1-7 キースペック 2-13, 2-16 ファイルスペック 2-13, 2-14 セ データバッファ長 1-8, 2-21 生成 デルタファイル 2-10 ファイル 2-12 ト 設定 カレントディレクトリ 2-95 トランザクション 開始 2-3 ソ 終了 2-2, 2-32 挿入 レコード 2-82, 2-84 ニ 入力データバッファ チ 構造 2-70 チャンク 矩形チャンクディスクリプタ 2-42, 2-127 ヌ 取得 2-39 ヌル値 2-18 変更 2-123 ラ ン ダ ム チ ャ ン ク デ ィ ス ク リ プ タ 2-40, 2-124 6 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 6 OF 8 LAST SAVED: 98/03/09 12:24 BY: M PRINTED: 98/03/09 12:25 ノ ノーマルモード 2-89 ハ ホ バージョン情報 ポジションブロック 1-7 取得 2-133 本書について ix バージョンブロック 2-134 本書の構成 x バイアス 2-59 本書の読者 x 並行トランザクション 1-17 マ ヒ マルチエンジンファイル共有バイアス 2-90 表記の規則 xi ユ フ ACS ファイル ユーザ定義 ACS 2-19 オープン 2-88 クローズ 2-6 ラ 生成 2-12 ランダムチャンクディスクリプタ 2-40, 2-124 ファイルアクセス 1-15 構造 2-41 オペレーション 1-15 ファイルスペック 2-13, 2-14, 2-99, 2-101 フィールド 取得 2-73 フォーマット リ リードオンリーモード 2-89 リソース 解放 2-94 ACS 名 2-24 (物理) データ検索 リターンデータバッファ 構造 2-73 非インデックスベース 1-16 物理ポジション リンク Windows アプリケーション A-19 取得 2-77 レ ヘ 並行トランザクション バイアス 1-17 ベリファイモード 2-89 レコード 検索 2-69, 2-80, 2-110, 2-115 削除 2-28 取得 2-48, 2-51, 2-53, 2-55, 2-57, 2-61, 2-63, 2- 変更 情報 2-120 チャンク 2-123 65, 2-67, 2-78, 2-106, 2-107, 2-108, 2-113 挿入 2-82, 2-84 索引 7 TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 7 OF 8 LAST SAVED: 98/03/09 12:24 BY: M PRINTED: 98/03/09 12:25 ロ ロケール固有 ACS 2-20 ロック 解除 2-118 8 Btrieve Programmer's Reference TONBO: W 176 × H 227 FILE NAME: BT7-PROREF 索引.DOC PAGE: 8 OF 8 LAST SAVED: 98/03/05 15:37 BY: MARIKO WATANABE PRINTED: 98/03/05 15:38
© Copyright 2024 Paperzz