9.3.3 C言語でのグラフィック帳票出力例(帳票入門例題

ページプリンタのグラフィック帳票を利用した,帳票の出力例について説明します。

帳票を使用したユーザAP例として,マニュアル「XMAP3 入門」で紹介している帳票入門例題をC言語で作成した場合について説明します。

(a) 出力例

[図データ]

物理マップサイズの目安は,約2KBです。
(b) コーディング例

コーディング例を次に示します。マップ名は,「JYU1PH」です。

プログラムサイズは約29KBです。

/********************************************************/
/* <ページプリンタ けい線帳票用入門例題>                    */
/********************************************************/
#include <windows.h>
#include <stdio.h>

/* XMAP3が生成した論理マップの取り込み    */
#include "JYU1PHO.h"

/* 動的変更テーブル,インタフェーステーブルの取り込み          */
/*     (XMAP3インストール先¥INCLUDEに入っています)          */
#include "x3modtbl.h"
#include "jsvwatbl.h"

/* 変数宣言 */
char map_name[9];                               /* 帳票マップ名 */
char term_name[9];                              /* 帳票端末名 */
long rtn_code;                                  /* リターンコード */

XMAP_COM com;                                   /* 共通インタフェース領域 */

long  goukei = 0;                               /* 合計 */

/* 帳票印刷用商品情報 */
typedef struct tagSYOHIN_DB {
   char    *scode;
   char    *sname;
   int            tanka;
   int            suuryo;
   int            waribiki;
} SYOHIN_DB;
SYOHIN_DB        syohin_db[] = {
   "V0001",    "BS/CSチューナー付S-VHSビデオ",
                115000,    17,   1,        /* 商品名 ビデオ1 */
   "T0002",    "35型高精細テレビ",
                238000,     8,   0,        /* 商品名 テレビ  */
   "V0002",    "8ミリビデオ",
                 95980,    24,   0,        /* 商品名 ビデオ2 */
   "A0001",    "再生専用MDプレーヤー",
                 47000,    51,   1,        /* 商品名 オーディオ */
    NULL,       NULL,
                     0,     0,   0};       /* 終了値 */

/* 関数宣言 */
/* ファイル読み込み処理 */
static void read_file();
/* 数字編集処理 */
static void numedit(int                in,
                   char               *out,
                   int                outsize);
/* 仮想端末オープン処理 */
static long xmap_open(XMAP_COM    *cp,
                                   char           *termname,
                                   char           datacode,
                                   char           devkind);
/* 仮想端末クローズ処理 */
static long xmap_close(XMAP_COM   *cp);
/* 帳票出力処理 */
static long xmap_send(XMAP_COM    *cp,
                                   char           *mapname,
                                   char           *outlmap);


/* マクロ定義 */
#define NORMAL    0                                       /* 正常   */
#define ABNORMAL 12                                       /* 異常   */

/* 納品伝票印刷プログラム開始 */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{

   /* 仮想端末名の設定 */
   strcpy(term_name, "PRT001");

   /* 物理マップ名の設定 */
   strcpy(map_name, "JYU1PH6G");

   /* 出力論理マップの初期化 */
   memset(&JYU1PHO, XMAP_PRT_NODATA, sizeof(JYU1PHO));
   JYU1PHO.JYU1PHL = JYU1PHT;
   memset(JYU1PHO.JYU1PHZ, 0x00, sizeof(JYU1PHO.JYU1PHZ));

   /* 出力データの格納 */
   read_file();

   numedit(goukei, JYU1PHO.JYU1PH_FIELD0008_O,
           sizeof(JYU1PHO.JYU1PH_FIELD0008_O));

   /* オープン要求 */
   rtn_code = xmap_open(&com, term_name, XMAP_PRT_NODATA, 1);

   /* 結果確認 */
   if (NORMAL != rtn_code) {
   return (ABNORMAL);
   }

   /* 出力要求 */
   rtn_code = xmap_send(&com, map_name, (char *)&JYU1PHO);

   /* 結果確認 */
   if (NORMAL != rtn_code) {
       /* クローズ要求 */
       xmap_close(&com);
       return (ABNORMAL);
       }

   /* クローズ要求 */
   rtn_code = xmap_close(&com);

   /* 結果確認 */
   if (NORMAL != rtn_code) {
       return (ABNORMAL);
   } else {
       return (NORMAL);
   }
}

/* read_file : ファイルからデータを読み込みます */
static void read_file()
{
   SYOHIN_DB            *sdp;
   char                 wk[5];
   int                 i, syoukei, tanka_work;
   /* ここでは実際にファイル入力せず,                           */
   /* 固定データを設定しています                                 */
   memcpy(JYU1PHO.JYU1PH_FIELD0001_O, "SD004040", 8);
   memcpy(JYU1PHO.JYU1PH_FIELD0002_O, "D商事", 6);
   for (i = 0, sdp = syohin_db; NULL != sdp->scode; i++, sdp++) {
       memcpy(JYU1PHO.JYU1PH_FIELD0003_O[i], sdp->scode,
              strlen(sdp->scode));

       memcpy(JYU1PHO.JYU1PH_FIELD0004_O[i],
              sdp->sname, strlen(sdp->sname));

       numedit(sdp->tanka, JYU1PHO.JYU1PH_FIELD0006_O[i],
                    sizeof(JYU1PHO.JYU1PH_FIELD0006_O[i]));
       tanka_work = sdp->tanka;

       sprintf(wk, "%04d", sdp->suuryo);
       memcpy(JYU1PHO.JYU1PH_FIELD0005_O[i], wk, 4);

       /* 受注データ中の割引特典が「特典あり」ならば1割引き */
       /* として金額を計算します                                  */
       if (1 == sdp->waribiki) {
           tanka_work  = tanka_work * 90 / 100;
       }
       syoukei = tanka_work * sdp->suuryo;
       numedit(syoukei, JYU1PHO.JYU1PH_FIELD0007_O[i],
                 sizeof(JYU1PHO.JYU1PH_FIELD0007_O[i]));

       goukei += syoukei;
   }

   return;
}

/* xmap_open : 仮想端末をオープンします                             */
/*   dev_kind  0:画面                                          */
/*             1:帳票                                          */
static long xmap_open(XMAP_COM        *cp,
                                       char            *termname,
                                       char            datacode,
                                       char            devkind)
{
   XMAP_REQ        xmap_req;
   XMAP_OPN        xmap_opn;

   long            rc;

   memset(cp, 0x00, sizeof(XMAP_COM));
   memcpy(cp->xmap_com_id, "*XP ", 4);
   cp->xmap_com_itype = 'I';
   memcpy(cp->xmap_com_tname, termname, strlen(termname));
   if (devkind == 0)
       memcpy(cp->xmap_com_msg, "BWS ", 4);            /* 画面 */
       
       else
       memcpy(cp->xmap_com_msg, "OWS ", 4);            /* 帳票 */
       memset(&xmap_req, ' ', sizeof(XMAP_REQ));
       memcpy(xmap_req.xmap_req_type, "OPEN", 4);
       memset(&xmap_opn, ' ', sizeof(XMAP_OPN));
       xmap_opn.xmap_opn_dcode_set = '1';
       xmap_opn.xmap_opn_dcode = datacode;

       rc = jsvwadrv(cp, &xmap_req, &xmap_opn, 0L);

       return (rc);
}
/* xmap_close : 仮想端末をクローズします */
static long xmap_close(XMAP_COM                *cp)
{
       XMAP_REQ        xmap_req;
       long            rc;

       memset(&xmap_req, ' ', sizeof(XMAP_REQ));
       memcpy(xmap_req.xmap_req_type, "CLOS", 4);
       rc = jsvwadrv(cp, &xmap_req, 0L, 0L);

       return (rc);
}

/* xmap_send : 帳票の出力を行います */
static long xmap_send(XMAP_COM        *cp,
                                       char            *mapname,
                                       char            *outlmap)
{
   XMAP_REQ        xmap_req;
   long            rc;

   /** 帳票の出力 **/
   memset(cp->xmap_com_mapname, ' ', sizeof(cp->xmap_com_mapname));
   memcpy(cp->xmap_com_mapname, mapname, strlen(mapname));
   memset(&xmap_req, ' ', sizeof(XMAP_REQ));
   memcpy(xmap_req.xmap_req_type, "SEND",
          sizeof(xmap_req.xmap_req_type));
   xmap_req.xmap_req_opt2 = '1';
   rc = jsvwadrv(cp, &xmap_req, outlmap, 0L);

   return (rc);
}

/* numedit : 数字編集処理                                    */
/*           数値を右寄せの¥999,999形式に変換します。*/
static void numedit(int           in,
                                 char    *out,
                                 int      outsize)
{
   int                           i, j, k, len;
   char                          wk[40], wkedit[40], *pout;

   sprintf(wk, "%d", in);
   wkedit[0] = '¥¥';

   for (i=0, j=1, k=strlen(wk); k; i++, j++, k--) {
       wkedit[j] = wk[i];
       if ((k / 3) && (1 == k % 3)) wkedit[++j] = ',';
   }
   wkedit[j] = 0x00;

   memset(out, ' ', outsize);
   len = strlen(wkedit);
   pout = out + outsize - len;
   memcpy(pout, wkedit, len);

   return;
}