C/400

118. 外部記述レコードの読取り

C/400 であっても外部記述で記述することができる。
RPG で DDS記述がインクルードされて参照することができるのと
同じように C/400 でもユーザーが自分で記述することなく
インクルード記述を利用することができる。
ただし ゾーン10進数の記述はインクルードの定義では
char として定義されているので自分で数値に atoi などで
変換してやる必要がある。

正確なインクルード記述を調べたいのであれば
コンパイル・リストで *PRINT を指定して出力するようにしておき
コンパイル・オプションで *SHOWINC を指定すればよい。

【SAMPLE: TESTEXREC】
0001.00 #include                                                       
0002.00 #include                                                      
0003.00 #include                                                      
0004.00 #include                                                       
0005.00                                                                         
0006.00 #define TRUE         0                                                  
0007.00 #define FALSE       -1                                                  
0008.00 #define MAX_LEN     45                                                  
0009.00 /*****************************************/                             
0010.00 /*      外部記述ファイルの定義           */                             
0011.00 /*****************************************/                             
0012.00 #pragma mapinc("shohin", "QTRFIL/SHOHIN(SHOHINR)", "input key", "d",,"" 
0013.00   #include "shohin"                                                     
0014.00 SHOHINR_i_t shohin_rec; /* SHOHIN レコード・バッファー */               
0015.00                                                                         
0016.00 void main(void){                                                        
0017.00      _RFILE *fp;                                                        
0018.00      _RIOFB_T *iofb;                                                    
0019.00      int shtank;                                                        
0020.00      char buff[256];                                                    
0021.00                                                                        
0022.00      printf("** TESTEXREC: 外部記述のレコード単位の読取り **\n");      
0023.00      getchar();                                                        
0024.00      fp = _Ropen("QTRFIL/SHOHIN", "rr");                               
0025.00      if(fp == NULL){                                                   
0026.00           printf("Open failed for open file\n");getchar();             
0027.00      }                                                                 
0028.00      while(1){/*while*/                                                
0029.00           iofb = _Rreadn(fp, &shohin_rec, MAX_LEN, __DFT);             
0030.00           if(iofb->num_bytes == EOF) break;                            
0031.00           sprintf(buff, "%07.07s", shohin_rec.SHTANK);                 
0032.00           shtank = atoi(buff);                                         
0033.00           printf("%10.10s %24.24s %7d %04.04s\n",                      
0034.00              shohin_rec.SHCODE, shohin_rec.SHNAME, shtank, shohin_rec.SHSCOD);
0035.00      }/*while*/                                                        
0036.00      _Rclose(fp);                                                      
0037.00     getchar();                                                         
0038.00 }
【解説】
#pragma mapinc("shohin", "QTRFIL/SHOHIN(SHOHINR)", "input key", "d",,"" 

によってファイル QTRFIL/SHOHIN のレコード名 SHOHINR をキー順に読取ることを
定義しておいて

013.00   #include "shohin"

でインクルードを宣言して

014.00 SHOHINR_i_t shohin_rec; /* SHOHIN レコード・バッファー */ 

によってインクルードを定義する。
入出力用に定義したいのであれば

SHOHINR_both_t

と定義し、出力用であれば

SHOHINR_o_t

として定義する。
この名前の書き方は一意でありこの形式に従うものとする。

この入出力バッファー SHOHIN_i_t は、コンパイラーによって
次のように定義されている。

typedef   struct { 
   char SHCODE[10];
   char SHNAME[24];
   char SHTANK[7]; 
  char SHSCOD[4];
}  SHOHINR_i_t;

typedef   struct { 
   char SHCODE[10];
}  SHOHINR_key_t; 

つまり 単価: SHTANK 7S 0 は数字ではなく 7桁の文字列(CHAR)として
定義されている。
従って

0019.00      int shtank;
0020.00      char buff[256]
  :
0031.00           sprintf(buff, "%07.07s", shohin_rec.SHTANK);                 
0032.00           shtank = atoi(buff);

の演算による数字としての取出しが必要となる。