リスト8-1は、COBOLコピーブックの例です。
* customer.cpy
01 CUSTOMER.
05 name PIC X(10).
05 balance PIC S9(9) COMP-5.
05 address PIC X(80).
cpy2record customer.cpy
を使用して、バイナリ形式のRECORD記述ファイルcustomer.R
を生成します。このRECORD記述ファイルは、cpy2record
によってCOBOLコピーブック・ファイルから生成され、実行時にアプリケーション・プログラムで使用されます。
リスト8-2およびリスト8-3は、RECORDを使用してCOBOLレコードをRECORDバッファにマップする例です。「RECORDの環境設定」で説明した環境変数を正しく設定する必要があります。
#include <stdio.h>
#include <atmi.h>
#include <fml32.h>
int main()
{
/* declare needed program variables */
struct RECORD *pRec;
int bal = 0;
int rtn;
long len;
/* attach to System/T as a client process */
if (tpinit((TPINIT *) NULL) == -1) {
(void) fprintf(stderr, "Tpinit failed\n");
exit(1);
}
/* allocate memory to store the RECORD data buffer */
len = Frneeded("CUSTOMER");
pRec = (struct RECORD *)tpalloc("RECORD", "CUSTOMER", len);
/* initialize buffer */
Rinit(pRec, NULL, 0, 0);
/* set the value in the RECORD */
Rset(pRec, "name", "Michael", C_STRING, 0, 0);
/* call service */
tpcall("CUSTSVC", (char *)pRec, 0, (char **)&pRec, &len, (long)0);
/* get item from reply */
rtn = Rget(pRec, "balance", &bal, C_INT, NULL, 0);
if( rtn < 0) {
userlog("Rget failed. %d %s\n",Ferror32, Fstrerror32(Ferror32));
}
userlog("The balance is %d\n", bal);
return 0;
}
#include <stdio.h>
#include <atmi.h>
void CUSTSVC(TPSVCINFO *rqst)
{
/* declare needed program variables */
struct RECORD *pRec;
char name[20];
int balance = 12345;
int len = sizeof(name);
int rtn;
/* retrieve RECORD buffer */
pRec = (struct RECORD *)rqst->data;
/* get data from RECORD buffer */
rtn = Rget(pRec, "name", name, C_STRING, &len, 0);
if( rtn < 0) {
userlog("Rget failed. %d %s\n",Ferror32, Fstrerror32(Ferror32));
}
userlog("customer name: %s", name);
/* set data to RECORD buffer */
Rset(pRec, "balance", &balance, C_INT, 0, 0);
if( rtn < 0) {
userlog("Rset failed. %d %s\n",Ferror32, Fstrerror32(Ferror32));
}
tpreturn(TPSUCCESS, 0, (char *)pRec, 0L, 0);
}
『Oracle Tuxedoコマンド・リファレンス』のcpy2recordに関する項