レコードデータ領域とは、入出力処理を行うときに利用者プログラムとMeFtとの間でデータを受け渡す領域をいいます。ここでは、このレコードデータ領域をCで記述する場合の方法について述べます。
利用者プログラムは、MeFtを使って画面やプリンタ装置との入出力を行うとき、レコードデータ領域を用意し、プログラムの先頭でその領域を空白で初期化する必要があります。
利用者プログラムは画面またはプリンタ装置に出力する際に、必要に応じて、出力の対象となるレコードデータ項目に出力データを設定します。また、オペレータからの入力が完了すると、入力データはレコードデータ項目に通知されます。利用者プログラムは、レコードデータ項目へのデータの設定や参照を項目長の範囲内で行えます。
ここでは、レコードデータ領域について以下の内容を説明します。
レコードデータ領域は、1つの構造体として宣言します。この構造体には、定義体に定義してあるすべての入出力項目および出力項目に対応した入出力領域と、項目ごとに属性情報を保持する領域が宣言されます。
レコードデータ領域の構造体は、定義体の作成時に“FORMインクルード生成”機能により、インクルードファイル“定義体ファイル名.h”として自動生成されます。また、その中に宣言するレコードデータ領域の構造体名は定義体ファイル名となります。利用者プログラムでは、この構造体をレコードデータ領域として定義します。
また、インクルードファイルには、レコードデータ領域長が定数として#defineで宣言されています。レコードデータ領域を動的に獲得する場合のサイズや定義体名とレコードデータ領域長の設定のlSizeには、その定数を使います。定数は、“s_定義体ファイル名”となります。
項目の指定
利用者プログラム内でレコードデータ項目は、レコードデータ領域の構造体のメンバとして指定します。
例
レコードデータ領域の構造体SAMPLEの中の英数字項目名R001のレコードデータ項目にデータ"ABC"を設定する場合、次のように指定します。
※R001は項目長が3の英数字項目です。
SAMPLE rec; /* レコードデータ領域の定義 */
~ 中略 ~
memcpy(rec.R001,"ABC",3); /* "ABC"を設定します。 */
集団項目の指定
定義体作成時に集団項目を定義した場合、定義した集団項目は構造体として生成され、集団項目名が構造体名となります。その集団項目に含まれる項目は、集団項目の構造体のメンバとして指定します。
例
1.で説明した項目R001が集団項目MAS001に含まれる場合は、次のようになります。
memcpy(rec.MAS001.R001,"ABC",3);
繰り返しの指定
定義体作成時に繰り返しを定義した場合、繰り返し指定は配列として自動生成されます。繰り返しを定義した項目は、添字を付けて指定します。
集団項目に繰り返しを定義したときは、その集団項目の構造体名に添字を付けます。
例
2.で説明した集団項目MAS001に繰り返しを定義した場合のR001の2番目のレコードデータ項目の指定は、次のようになります。
memcpy(rec.MAS001[1].R001,"ABC",3);
基本項目に繰り返しを定義したときは、その項目だけをメンバとする構造体が自動生成されます。生成した構造体には、項目名の前に‘_'を付けた構造体名を付けます。基本項目に繰り返しを定義したときは、その構造体名に添字を付けます。
例
1.で説明したR001に繰り返しを定義した場合のR001の2番目のレコードデータ項目の指定は、次のようになります。
memcpy(rec._R001[1].R001,"ABC",3);
伝票形式ボディ部の扱い
伝票形式の定義体は、レコード定義をしなかった場合、ボディ部の項目を含む集団項目が自動生成され、通常の集団項目と同様にそれに対応する構造体も生成されます。構造体名は、BODYになります。ボディ部に含むレコードデータ項目は、必ずBODYのメンバとして指定します。さらに、伝票形式のボディ部は1以上の繰り返しなので、BODYには添字を付けます。
例
2番目のボディ部の項目R001のレコードデータ項目の指定は、次のようになります。
memcpy(rec.BODY[1].R001,"ABC",3);
レコードデータ項目へのデータ設定または参照は、memcpy関数などのメモリ操作関数を使います。ただし、数字項目は、MeFtが提供する数字データ変換関数を使用します。
レコードデータ項目で、項目データ種別ごとに扱えるデータおよびデータの格納形式については、レコードとはを参照してください。
英数字日本語混在項目を扱う場合、レコードデータ項目の先頭2バイトにデータの有効データ長を設定し、3バイト以降にデータを設定します。英数字日本語混在項目の先頭2バイトに有効データ長を設定するかどうかは、ウィンドウ情報ファイルのMIXLENG(英数字日本語混在項目のデータ長の有無) およびプリンタ情報ファイルのMIXLENG(英数字日本語混在項目のデータ長の有無)を参照してください。
以下にレコードデータ項目へのデータ設定と参照の記述例を示します。
例
例で使用するレコード名はRECDSPで、項目名はR001、R002、R003、およびR004です。
各項目のデータ種別と項目長は以下のとおりです。
R001:英数字項目 項目長は10 R002:符号なし数字項目 項目長は8 R003:日本語項目 項目長は20 R004:英数字日本語混在項目 項目長は32
項目名R001、R002、R003およびR004にデータを設定してから出力を行う。
#include "recdsp.h" RECDSP rec; union { PSUSHORT len; PSUCHAR chr[2]; } mixlen; ~ 中略 ~ memcpy(rec.R001, "JAPAN ",sizeof(rec.R001)); ps_ulongtodec(19920701,0,rec.R002,sizeof(rec.R002)); memcpy(rec.R003,"○×商店",sizeof(rec.R003)); mixlen.len = 20; rec.R004[0] = mixlen.chr[0]; rec.R004[1] = mixlen.chr[1]; memcpy(&rec.R004[2],"神奈川県横浜市1-2-3",20); ~ 中略 ~ ps_write(psfile,PS_WRITE_NORMAL,"SCREEN",&rec,0); ~ 中略 ~
入力が完了してから、項目名R001、R002、R003およびR004への入力データを獲得する。
#include "recdsp.h" RECDSP rec; PSCHAR nationality[10]; PSCHAR company[20]; PSCHAR address[32]; PSULONG date; union { PSUSHORT len; PSUCHAR chr[2]; } mixlen; ~ 中略 ~ ps_read(psfile,PS_READ_NOERASE,"SCREEN",&rec,0); memcpy(nationality,rec.R001,sizeof(rec.R001)); date = ps_dectoulong(0,rec.R002,sizeof(rec.R002)); memcpy(company,rec.R003,sizeof(rec.R003)); mixlen.chr[0] = rec.R004[0]; mixlen.chr[1] = rec.R004[1]; memcpy(address,&rec.R004[2],mixlen.len); ~ 中略 ~