コンテンツにスキップ

$ps.file.writeAllText

概要

サーバスクリプトで$ps.fileを使用してファイル書き込みをする際に使用します。引数で渡した文字列を全てファイルに保存します。同名のファイルがあった場合には上書き更新します。同名のファイルがない場合にはファイルを新規作成します。

構文

$ps.file.writeAllText(section, path, data, encode=null)

パラメータ

パラメータ 型 必須 説明
section string ○ セクション名。セクションについては$ps.fileの「セクションについて」を参照ください。
path string ○ ファイル名。ディレクトリの区切り文字はWindow、Linux共に「/」を利用する。
data string ○ 出力する文字列
encode string ファイルのエンコーディングの指定(※1)省略時は"utf-8"

※1
.NETライブラリのSystem.Text.Encoding.GetEncoding のパラメータで指定できるコードページ名を指定します。

戻り値

ファイルを出力できた場合は true、出力できなかった場合は false を返却します。

例外

C#内で例外が発生した場合はサーバスクリプト内に例外クラス名とエラーメッセージをErrorオブジェクトに入れて例外を発生させます。

使用例

以下の例では、Webサーバ内に指定したファイル名でファイルを書き込みます。

JavaScript
$ps.file.writeAllText('01_develop', 'parts/01_parts.txt', 'write data');

文字コード:Shift-JIS の例

$ps.file.writeAllText('01_develop', 'parts/01_parts.txt', 'write data','shift-jis');

サンプルコード

Note

コード内の【 ... 】は適宜修正してください。

1. 承認済みの支払明細から、固定長の振込データを書き出す

支払バッチでプロセス「振込データ作成」を実行すると、そのバッチに紐づく承認済みの支払明細から、ヘッダ・データ・トレーラの3種類の行からなる固定長の振込データを組み立て、$ps.file.writeAllTextでShift-JISのファイルに書き出します。書き出した明細は「振込データ作成済み」にして、次のバッチで二重に出力しないようにします。

実務での使いどころ

経費精算・買掛金の支払・給与振込などで、承認済みの支払を金融機関の決まった形式のファイルにまとめる業務に使えます。標準のエクスポートは、CSVまたはJSONで、項目の順番や区切り文字を選べるのみです。複数種類の行が混ざる固定長の形式や、Shift-JISでの出力はできません。

事前準備

1:Script.jsonのDisableServerScriptFileをfalseにし、ServerScriptFilePathに書き出し先のフォルダを設定して、プリザンターを再起動してください($ps.fileの前提条件)。ファイルは、このフォルダの下のセクション(このサンプルではtransfer)に書き出します。

2:「支払バッチ」テーブル(期限付きテーブル)で、以下を設定してください。

項目コード 内容
日付A(DateA) 振込指定日。エディタに表示する
状況(Status) 「100,未実行」「900,作成済み」

プロセス「振込データ作成」(現在の状況:未実行、変更後の状況:作成済み、アクション種別:保存)を作成してください。

3:「支払明細」テーブル(記録テーブル)で、以下の項目を設定してください。

項目コード 内容
分類A(ClassA) 支払バッチ。選択肢一覧に[[支払バッチのサイトID]]
状況(Status) 「200,承認済み」「900,振込データ作成済み」など
分類B(ClassB) 振込先金融機関コード(4桁)
分類C(ClassC) 振込先支店コード(3桁)
分類D(ClassD) 預金種目(1:普通、2:当座)
分類E(ClassE) 口座番号(7桁)
分類F(ClassF) 受取人名(半角カナ)
数値A(NumA) 振込金額

4:「支払バッチ」テーブルにサーバスクリプトを登録します。

4-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 4-2:タイトル: 任意の名前(例:writeTransferFile)
 4-3:スクリプト: 下記サンプルコードを貼り付け
 4-4:条件: 「更新前」にチェック

JavaScript
// 支払明細のサイトID
const DETAIL_SITE_ID = 【支払明細のサイトID】;
// 状況の値
const BATCH_CREATED = 900;    // 支払バッチ:作成済み
const DETAIL_APPROVED = 200;  // 支払明細:承認済み
const DETAIL_EXPORTED = 900;  // 支払明細:振込データ作成済み
// 出力先のセクション(Script.json の ServerScriptFilePath の下のフォルダ)と、ファイルの文字コード
const SECTION = 'transfer';
const ENCODING = 'shift-jis';

// 数字を左から0で埋める
const zeroPad = (value, length) => String(value ?? '').padStart(length, '0').slice(-length);
// 文字を右に空白で埋める(受取人名は半角カナで入力しておく)
const spacePad = (value, length) => String(value ?? '').padEnd(length, ' ').slice(0, length);
// 日付を YYYYMMDD にする
const yyyymmdd = (date) => `${date.getFullYear()}${zeroPad(date.getMonth() + 1, 2)}${zeroPad(date.getDate(), 2)}`;

// 支払明細のうち、このバッチの「承認済み」の明細を取得する
function approvedDetails() {
    // 分類項目の絞り込みは、配列形式+ExactMatchMultipleでないと完全一致にならない
    const view = {
        View: {
            ColumnFilterHash: { ClassA: `["${model.IssueId}"]`, Status: `["${DETAIL_APPROVED}"]` },
            ColumnFilterSearchTypes: { ClassA: 'ExactMatchMultiple' },
            // 明細を登録した順に出力する
            ColumnSorterHash: { ResultId: 'asc' },
        },
    };
    return Array.from(items.Get(DETAIL_SITE_ID, JSON.stringify(view)));
}

// ヘッダ(H)・データ(D)・トレーラ(T)の固定長の行を組み立てる
function buildLines(details) {
    const lines = [`H${yyyymmdd(model.DateA)}`];
    let total = 0;
    for (const d of details) {
        lines.push(`D${zeroPad(d.ClassB, 4)}${zeroPad(d.ClassC, 3)}${zeroPad(d.ClassD, 1)}`
            + `${zeroPad(d.ClassE, 7)}${spacePad(d.ClassF, 30)}${zeroPad(d.NumA, 10)}`);
        total += d.NumA;
    }
    lines.push(`T${zeroPad(details.length, 6)}${zeroPad(total, 12)}`);
    return lines;
}

// プロセス「振込データ作成」で、状況が「作成済み」に変わる更新のときに、振込データを書き出す
function writeTransferFile() {
    // saved は更新前の値。作成済みのバッチを保存し直したときは何もしない
    if (model.Status !== BATCH_CREATED || Number(saved.Status) === BATCH_CREATED) {
        return;
    }
    // 日付が空のとき、model では 1899/12/30 になる
    if (!model.DateA || model.DateA.getFullYear() < 1900) {
        context.Error('振込指定日を入力してください。');
        return;
    }
    const details = approvedDetails();
    if (details.length === 0) {
        context.Error('承認済みの支払明細がありません。');
        return;
    }
    const fileName = `transfer_${model.IssueId}_${yyyymmdd(model.DateA)}.txt`;
    const text = buildLines(details).join('\r\n') + '\r\n';
    // 書き出せなかったときは、バッチの状況を変えずに止める(ファイルが無いのに作成済みにしない)
    if (!$ps.file.writeAllText(SECTION, fileName, text, ENCODING)) {
        context.Error(`振込データ(${fileName})を書き出せませんでした。`);
        return;
    }
    // 書き出した明細は、次のバッチで二重に出力しないよう「振込データ作成済み」にする
    for (const d of details) {
        d.Status = DETAIL_EXPORTED;
        d.Update();
    }
    logs.LogInfo(`[writeTransferFile] ${fileName} に ${details.length} 件を書き出しました`, 'main');
}

writeTransferFile();

出力の例(transfer/transfer_1203_20260925.txt)

H20260925
D000100111234567ヤマダ タロウ                      0000100000
D000200227654321スズキ ハナコ                      0000250000
T000002000000350000

1文字目が行の種類(H:ヘッダ、D:データ、T:トレーラ)です。ヘッダは振込指定日、データは金融機関コード・支店コード・預金種目・口座番号・受取人名(30桁)・金額(10桁)、トレーラは件数(6桁)と合計金額(12桁)です。

注記

  • 状況が「作成済み」に変わる更新のときのみ書き出します。プロセスのボタンでも、APIで状況を変えたときでも動きます。作成済みのバッチを保存し直したときは書き出しません。
  • 承認済みの明細が無いとき、振込指定日が空のとき、書き出しに失敗したときは、context.Errorで止めます。バッチの状況は未実行のままです。
  • writeAllTextの4つ目の引数で文字コードを指定します(省略時はUTF-8)。セクションのフォルダが無いときは作られます。
  • 受取人名は半角カナで入力してください。全角の文字はShift-JISで2バイトになり、桁がずれます。
  • 全銀協の形式を簡略にしたものです。実際に金融機関へ送るときは、金融機関の仕様に合わせてください。
  • 同じバッチの「更新前」で明細を更新するため、明細の更新のあとにバッチの保存が失敗すると、明細のみが「振込データ作成済み」に変わります。

対応バージョン

対応バージョン 内容
1.4.12.0 以降 機能追加

関連情報