4Dの親コンポーネントのテーブルとフィールドをポインタで参照する

親コンポーネントのテーブルとフィールドをポインタで参照する

テーブルに値を保存するような処理をコンポーネント化する場合は、ホストデータベースのテーブルをコンポーネント側で参照するのにポインタを使います。自分のテーブルではないためテーブル名を記述することができないからです。4Dのデザインリファレンスに「ホストデータベースとコンポーネントはポインターを使用して通信を行うことができます。」とあります。

http://doc.4d.com/4Dv16/4D/16.3/Interaction-between-components-and-host-databases.300-3670869.ja.html

ここではホストデータベースのテーブルを「親のテーブル」と呼びます。親のテーブルはポインターで参照します。次のように記述します。これはHBデータベースのIDと名前を配列に取得する例です。まずポインタ変数をプロセス変数として宣言、テーブル名とフィールド名のポインタを取得します。

  //HB_DefInit
  //20171228 wat
  //テーブルとフィールドのポインタをプロセス変数に取得
  //本文 テーブル

  //テーブル
C_POINTER(vHBptr)
vHBptr:=JCL_tbl_GetPtr_byName ("HONBUN")

  //フィールド
C_POINTER(vHB_IDptr)
C_POINTER(vHB_NAMEptr)
vHB_IDptr:=JCL_tbl_GetFldPtr (vHBptr;"HB_ID")
vHB_NAMEptr:=JCL_tbl_GetFldPtr (vHBptr;"HB_NAME")

次にそれぞれのテーブルから値を取得、プロセス変数の配列に格納しておきます。

  //HB_cache_make
  //20171228 wat
  //本文 テーブルをキャシュ配列に取得

ARRAY LONGINT(vAryHB_ID;0)
ARRAY TEXT(vAryHB_NAME;0)

READ ONLY(vHBptr->)
ALL RECORDS(vHBptr->)
SELECTION TO ARRAY(vHB_IDptr->;varyHB_ID)
SELECTION TO ARRAY(vHB_NAMEptr->;vAryHB_NAME)

このようにして配列にキャッシュしておき、あとでHB_cache_findを使って参照します。

$hb_id:=HB_cache_find ($name)

HB_cache_findは次のように記述しておきます。

  //HB_cache_find
  //20171228 wat
  // hbのキャッシュからファイル名を探して、あればIDを返す。なければゼロ

C_TEXT($1;$filename)
$filename:=$1
C_LONGINT($0;$hb_id)
$hb_id:=0
C_LONGINT($index)

$index:=Find in array(vAryHB_NAME;$filename)
If ($index>0)
 $hb_id:=vAryHB_ID{$index}
End if 

$0:=$hb_id

このようにして親テーブルの値を参照します。保存するときも同じ要領でいけます。たとえば次のように記述します。

CREATE RECORD(vMDptr->)
vMD_NAMAEptr->:=""
vMD_IDptr->:=$md_id
SAVE RECORD(vMDptr->)

コンポーネントから親テーブルを参照する場合は、上記のような記述をしておけば内部テーブルと同様にデータを保存することができます。