画面・帳票サポートシステム XMAP3 プログラミングガイド 帳票編

[目次][用語][索引][前へ][次へ]

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;
}