sophieデータ出力機構マニュアル
last update: Tue, 13 Aug 2024 04:30:12 GMT ( 8 months ago )

      第1世代

      第1世代は、画面にインプリメントされた帳票系の初期方式で作られているものです。
      例)
       ・受発注入力画面(受発注確認書、注文書)
       ・受発注残一覧画面(一括注文書、注残一覧表等)

      • 記述例

        画面側
        ・fn.async.loadReport の呼び出し
        ・printCntData 関数(件数取得)の定義
        ・printGetData 関数(データ取得)の定義
        ・printCnvData 関数(データ表示加工)の定義
        を記述します。
        帳票RSD側
        ・レイアウト定義
        ・出力処理
        を記述します。

        • 画面側

          fn.async.loadReport
                  var report_mode = $e.altKey ? 'layout' : null,
          keep = $e.shiftKey ? true : false;
          var report_keys = [];
          if (flg.printKakunin) {
          report_keys.push('hankan_odr_ipt_print_kakunin');
          }
          // 印刷を選んでいなくても、充当データでなければデータ生成する
          if (flg.printOrder) { // || (skipPrint && !noPO)) {
          report_keys.push('hankan_odr_ipt_print_po');
          }
          if (flg.printNaiji) {
          report_keys.push('hankan_odr_ipt_print_po_naiji');
          }
          var entry_no = [get("odr_no"), get("odr_line_id")].join('-');
          return fn.async.loadReport(report_keys, {
          'hankan_odr_ipt_print_kakunin': {
          page: NULL,
          font: NULL,
          onePageData: one,
          cntData: cnt,
          getData: printGetData,
          cnvData: printCnvData,
          onNextPage: function(target) {
          var t = fn.fin("STATIC.ODR_IPT.PRT_KAKUNIN.true");
          DispLock.notify(t + fn.fin("INFO.printing"));
          }
          },
          'hankan_odr_ipt_print_po': {
          page: "標準_縦",
          font: "標準_社外",
          onePageData: one,
          cntData: cnt,
          getData: printGetData,
          cnvData: printCnvData,
          reprint: isReprintPO,
          onNextPage: function(target) {
          var t = fn.fin("STATIC.ODR_IPT.PRT_ORDER.true");
          DispLock.notify(t + fn.fin("INFO.printing"));
          }
          },
          'hankan_odr_ipt_print_po_naiji': {
          naiji: true,
          page: "標準_縦",
          font: "標準_社外",
          onePageData: one,
          cntData: cnt,
          getData: printGetData,
          cnvData: printCnvData,
          onNextPage: function(target) {
          var t = fn.fin("STATIC.ODR_IPT.PRT_NAIJI.true");
          DispLock.notify(t + fn.fin("INFO.printing"));
          }
          }
          }, {
          use: version || 'v1',
          prt_entry_no: entry_no,
          // 引き継ぐ resources があれば、ここで反映
          resources: makeReport.resources || {
          cnt: cnt,
          dtl_odr_zan: dtlOdrZan,
          flg: flg,
          },
          REPORT_MODE: report_mode,
          keep: keep,
          }); // <-- return fn.async.loadReport( ... ) <--
          });
          printCntData
             // 帳票用データの取得
          function printCntData() {
          return Promise.resolve().then(()=>{
          return 1;
          });
          }
          printGetData
              // 帳票用データの取得
          function printGetData() {
          return Promise.resolve().then(()=>{
          return this.resources.dtl_odr_zan;
          });
          }
          printCnvData
              // 帳票用データの加工
          function printCnvData(obj) {
          if (!obj) return {};
          return Promise.resolve().then(function() {
          // 税区分はマスタの最新値で表示値を洗い替える
          return fn.async.renewData(obj, {
          "s_odr.zei_kbn": "s_odr.zei_kbn_nm=nm",
          "p_odr.zei_kbn": "p_odr.zei_kbn_nm=nm",
          "shain.cd": ["shain.nm=nm", "shain.ex_nm.s=ex_nm.s"]
          });
          }).then(function(obj) {
          var dispcg = calcGaku(obj, TRUE);
          obj.s_odr_zan_suryo = dispcg.s_suryo;
          obj.p_odr_zan_suryo = dispcg.p_suryo;
          obj.p_odr.zeigaku = fn.sync.calcNumber(obj.p_odr.gaku_inc, "-", obj.p_odr.gaku_exc, {
          decimalDigits: fn.fin("Data.KETASUU.gaku")
          });
          if (isEDI && obj.edi != NULL) {
          obj.edi.test_report_nm = fn.fin("STATIC.TEST_REPORT." + obj.edi.test_report);
          }
          return fn.report.convForReportDisp(obj);
          }).then(function(res) {
          return res;
          })['catch'](function(e) {
          dbg("printCnvData:", e);
          throw e;
          });
          }
        • 帳票RSD側

          PDFタイトルの加工
                // 外からの定義の受け入れ
          $.extend(def, params);
          debugger
          // 余白対応
          // param.page が本来、options.page はすべての帳票に対して1つしかない
          let page = params.page || options.page;
          let p_margin = fn.fin("Default.report_page." + page + ".margin");
          let d_left = 15 - +(p_margin.left.replace("mm", ""));
          let d_right = 15 - +(p_margin.right.replace("mm", ""));
          widSp = d_left + d_right;
          wid100per = wid100per + widSp;
          debugger;
          // title 変更
          let addStr = def.naiji ? "(内示手配書)": "(注文書)";
          options.title = options.title + addStr;

          // システム設定にファイル名用のコマンドがある場合のみ続行
          if (!fn.sync.hasValue(fn.fin("FILE_NM_COMMAND.po"))) return;
          // データからタイトル生成する場合ここで
          return Promise.resolve().then(()=>{
          // このgetDataは一件のデータしか返さない。
          return def.getData();
          }).then((obj)=>{
          return fn.async.requireCommand(
          fn.fin("FILE_NM_COMMAND.po"),
          { execArgs: [{def: def, data: obj}] }
          ).then((title)=>{
          options.title = title;
          })['catch'](function(e) {
          // コマンドが見つからなかった場合やコマンドのエラーは無視
          console.log("ファイル名定義用のコマンドがないかタイトルが生成できませんでした。", e);
          });
          });
          レイアウトの定義(一部抜粋)
            // --------------------------------------------------------------------------------- //
          // パートの定義 //
          // --------------------------------------------------------------------------------- //
          // ヘッダー、年月日、宛先、本文、三昌商事、金額欄、印鑑欄、商品明細、摘要、フッター
          var head, sendto, body, sansho, gaku, stamp, shohin, tekiyo, foot;
          var cnt, one;
          var XLSH = 4; //3.5; // エクセル1行に相当する高さ => matrix:126mm margin:30mm header/footer:20mm sum:5mm ぐらいとなる。
          rpt.XLSH(XLSH);
          // ----------------------------------------------- //
          // <ページヘッダー部分> //
          // ----------------------------------------------- //
          var title = def.naiji ? '内 示 手 配 書' :'注 文 書';
          if (def.reprint) title += "(再)";// (2021.12.9 naoi)再印刷対応(システム設定)
          head = rpt.createOutsideReportHeader(pr, 'hankan.odr_ipt_po', title, true);
          // ----------------------------------------------- //
          // <宛先エリア部分>     //
          // ----------------------------------------------- //
          sendto = pr.createBlockPart('send_to', '100% ' + (XLSH*4+1)
          , { font: 'large', border: '1px solid #444' });
          var pat = [];
          // 1行目
          var line1 = [["",8],["〒",4,"center"],["=p_odr.maker.zip_no",16,"center",null,{"overflow": "hidden", "text-wrap": "none"}]];
          SetLineNonBDR(pat, line1, 0, 0);
          // 2行目〜5行目(住所)
          pat.push(["text", "=p_odr.maker.adr", L(8, 1, 82, "left", "top")]);
          // 6行目
          pat.push(["text", "=p_odr.maker.nm", L(8, 5, 82)]);
          // 7行目
          var line3 = [["",90],["御中",10]];
          SetLineNonBDR(pat, line3, 0, 6);
          // 8行目(TEL/ FAx)
          var line4 = [["",8],["TEL",7,"center"],["=p_odr.maker.phone_no",34,null,null,{"overflow": "hidden", "text-wrap": "none"}],["FAX",7,"center"],["=p_odr.maker.fax_no",34,null,null,{"overflow": "hidden", "text-wrap": "none"}]];
          SetLineNonBDR(pat,line4, 0, 8);
          // 下行罫線
          pat.push(Line(0,9.5,"100%",9.5));
          sendto.pattern(pat);
          // ----------------------------------------------- //
          // <本文エリア部分>     //
          // ----------------------------------------------- //
          body = pr.createBlockPart('mes_body', '100% ' + (XLSH*4+1)
          , { font: 'large', border: '1px solid #444' });
          var pat = [];
          // 1行目
          var mes1 = def.naiji ? "下記の通り内示手配いたします。" :"下記の通り注文いたします。";
          pat.push(["text", mes1, L(0, 0, 82)]);
          if(def.naiji){
          pat.push(["text", "当、内示手配は確定注文では御座いません。", L(0, 0.9, 76, "left", "top")]);
          pat.push(["text", "後日正式注文書を発行させて頂きます。", L(0, 1.8, 76, "left", "top")]);
          }
          // 2行目〜5行目(住所)
          var line2 = [["件名 :",16],["=anken_nm",69]];
          SetLineNonBDR(pat, line2, 0, 3);
          // 3行目
          pat.push(["text", "引渡先:", L(0, 4, 16)]);
          // 4-5行目
          pat.push(["text", "=hwatashi.nm", L(0, 5, 95, "left", "top")]);
          // 6行目
          var line6 = [["〒",4,"center"],["=hwatashi.zip_no",16, "center",null,{"overflow": "hidden", "text-wrap": "none"}]];
          SetLineNonBDR(pat, line6, 0, 7);
          // 7-10行目
          pat.push(["text", "=hwatashi.adr", L(0, 8, 95, "left", "top")]);
          // 11行目
          var line11 = [["TEL",7,"center"],["=hwatashi.phone_no",34,null,null,{"overflow": "hidden", "text-wrap": "none"}],["FAX",7,"center"],["=hwatashi.fax_no",34,null,null,{"overflow": "hidden", "text-wrap": "none"}]];
          SetLineNonBDR(pat, line11, 0, 12);
          body.pattern(pat);
          出力処理+出力定義
            // --------------------------------------------------------------------------------- //
          // 印刷実行処理        //
          // --------------------------------------------------------------------------------- //
          return Promise.resolve().then(function(){
          var cntData = isFunction(def.cntData) ? def.cntData(): def.cntData;
          return Promise.resolve(cntData).then(function(n){
          return cnt = n;
          });
          }).then(function(){
          var onePageData = isFunction(def.onePageData) ? def.onePageData(): def.onePageData;
          return Promise.resolve(onePageData).then(function(n){
          return one = n;
          });
          }).then(function(){
          // データ取得
          return def.getData(1, { one: one, cnt: cnt });
          }).then(function(res){
          //データの加工
          return def.cnvData(res);
          }).then(function(res){
          //出力
          if(isFunction(def.onNextPage)) { def.onNextPage.call("注文書"); }
          pr.write(head, '0 -10');
          // 宛先エリア
          var posi = 8; // y起点位置
          pr.write(sendto, '0 '+posi, res);
          // 本文 エリア
          pr.write(body, '0 '+(posi+XLSH*13), res);
          // 三昌商事 エリア
          pr.write(sansho, '100 '+(posi+XLSH*13), res);
          // 金額 エリア
          pr.write(gaku, '0 '+(posi+XLSH*27), res);
          // 印鑑 エリア
          pr.write(stamp, '100 '+(posi+XLSH*28), res);
          // 商品 エリア
          pr.write(shohin, '0 '+(posi+XLSH*37), res);
          // 摘要 エリア
          // pr.write(tekiyo, '0 '+(posi+XLSH*44), res);
          // フッターの描画
          //pr.write(foot, '0 175');
          });
          });