ページプリンタのグラフィック帳票を利用した,帳票の出力例について説明します。
帳票を使用したユーザAP例として,マニュアル「XMAP3 入門」で紹介している帳票入門例題をC言語で作成した場合について説明します。
コーディング例を次に示します。マップ名は,「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;
}