fix(core): byte-accurate A-group (ConvUtil padRight/safeSub), B-group FileIo convergence, E1 HIGH sentinels (ZAN03/04/05, KYU09), E3 NUL guard; sync docs (trans-rule/test-rule/checklist)

This commit is contained in:
qiuqiuqiu
2026-09-08 22:26:17 +08:00
parent ec126286bc
commit 8ed39c9664
33 changed files with 405 additions and 481 deletions
+3 -3
View File
@@ -47,10 +47,10 @@
| J1 | 退出码 | 有两条ABEND路径:① 文件I/O异常(IOException)→UncheckedIOException→JVM默认退出码1;② 业务逻辑ABENDSUB01DAT失败等)→abendPara()→System.exit(999)→Windows实际231 | 路径①期望退出码1;路径②期望231+ABEND CODE消息 |
| J2 | 行分隔符 | println在Windows输出CRLF\\r\\n | 期望文件须同方式生成后fc比对 |
| J3 | BOM | OutputStreamWriter("UTF-8")不写BOM | fc /b首字节应为记录内容 |
| J4 | 字符vs字节 | Java substring/padRight按char计;PIC X(n)按byte计 | 全角混入时定长记录字节数会变(数据限半角方针VF-A002单独验证行为) |
| J4 | 字符vs字节 | A组收敛后 ConvUtil.padRight/safeSub 按 UTF-8 字节计数(对齐 COBOL PIC X(n) 字节宽):截断回退到完整字界并以空格字节补足,定长记录输出恒等于 len 字节;外部 0xFF(ÿ) 等合法多字节字节直接透传(E1 已把排序哨兵由 \u00FF 改 \uFFFF,不再误当 EOF);仅在 safeSub 读取被切开的多字节字符时产生 U+FFFD(异常输入残余);记录内嵌 \r 会被 BufferedReader.readLine() 提前断行(数据限半角方针,禁止内容含 CR) | 全角混入时定长记录仍保持 len 字节VF-A002单 |
| J5 | 数值溢出 | int溢出静默绕回≠COBOL高位截断 | NP-A004必测 |
| J6 | SIZE ERROR | Java无自动ON SIZE ERROR分支,转换时须显式实现 | NP-N003必查实现存在性 |
| J7 | WRITE异常 | PrintWriter吞IOExceptioncheckError | 磁盘满等异常无法检测COM-A005适用理由之一 |
| J7 | WRITE异常 | (历史)PrintWriter吞IOExceptioncheckError;B组FileIo收敛后全程序写句柄统一 BufferedWriter,写异常→UncheckedIOException | 磁盘满等异常现可检测COM-A005适用性以现状为准) |
| J8 | 输出覆盖 | FileOutputStream已有输出时覆盖写入 | 幂等性RR-N001天然满足;主机侧再执行需先删文件 |
| J9 | BigDecimal精度 | BigDecimal运算的scale/precision须与式样书指定的PIC(n)V9(m)完全一致 | NP-N002必查:scale=m、intLen=n、ROUNDING=HALF_UP,三者缺一不可 |
@@ -283,7 +283,7 @@
| 编号 | 区分 | 项目 | 内容 | 优先级 | 适用 | Java确认方法 |
|---|---|---|---|---|---|---|
| J-K004 | 异常 | 全角/半角混用 | 混用数据处理 | ◎ | ✅ | 结合J4:全角占2-3字节,定长记录字节数超长;须明确转换语义 |
| J-K004 | 异常 | 全角/半角混用 | 混用数据处理 | ◎ | ✅ | 结合J4:输入全角字节>字段宽时按字节截断回退完整字界+空格补齐,输出严格 len 字节(内容可能被截断) |
| J-S001 | 正常 | 全角空格TRIM | TRIM对全角空格 | ◎ | ⚠️ | Java trim()仅去半角空格;全角空格须正则替换(转换规则决定) |
| J-D001~004 | 正常 | Shift-JIS 5C/7C | 特殊字节处理 | ◎ | | 本工程统一UTF-8无SJIS处理 |
| J-X系列 | 正常/异常 | EBCDIC↔SJIS转换 | 编码转换 | ◎ | | 本工程统一UTF-8 |
+4 -4
View File
@@ -70,11 +70,11 @@
| COBOL | Java |
|---|---|
| PIC X(n) | StringpadRight 定长化) |
| PIC X(n) | StringpadRight 定长化A组收敛:padRight/safeSub 均按 UTF-8 字节计数,对齐 COBOL PIC X(n) 字节宽,截断回退完整字界+空格补足 |
| PIC 9(n) | int / longpadLeftZero |
| PIC 9(n)V99 | BigDecimaltoDecimal / formatZoned |
| COMPUTE … ROUNDED | setScale(…, RoundingMode.HALF_UP) |
| 固定长记录拆分 | substring位置注释对应 05 层定义) |
| 固定长记录拆分 | ConvUtil.safeSub(字节边界切片,COBOL 参照変更 WRK(m:n) 相当;位置注释对应 05 层定义) |
### 3.3 语句·结构映射
@@ -90,8 +90,8 @@
| EVALUATE … WHEN OTHER | switch / default |
| DISPLAY | System.out.println |
| READ … AT END | readLine() == null |
| OPEN / CLOSE | 同段落→try-with-resources;跨段落→字段保持+显式 close(参照标准例 FileSample |
| WRITE | writer.println / write |
| OPEN / CLOSE | 统一经 FileIo.openReader/openWriterB组收敛;UTF-8 BufferedReader/BufferedWriter);同段落→try-with-resources;跨段落→字段保持+显式 close(参照标准例 FileSample |
| WRITE | writer.write(x) + newLine()(统一 BufferedWriterIOException→UncheckedIOException |
| CALL 子程序 | 子程序独立类的方法调用(参数按引用→返回值或可变对象承载) |
| EXEC SQL(游标/单行/COMMIT/ROLLBACK/WHENEVER SQLERROR | JDBC PreparedStatement / commit / rollback / try-catch(见 DbSample |
| OCCURS | 数组 / List |
+3 -1
View File
@@ -13,7 +13,9 @@ import java.nio.charset.StandardCharsets;
* ============================================================
* JDK8 FileReader/FileWriter (String, Charset) コンストラクタを持たないため
* InputStreamReader/OutputStreamWriter 経由で UTF-8 固定長処理を提供する
* デフォルトパッケージに配置し ZAN メインから import 不要で利用可能
* デフォルトパッケージに配置し全メインFileSample / Kin* / Kyu* / Zan*から
* import 不要で利用可能各メインが直書きしていた同型構築をここへ統一した
* B 内联 OPEN 收敛読み書き内容バイト出力は変更なし
*/
public final class FileIo {
+12 -15
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.math.BigDecimal;
import java.util.ArrayList;
@@ -20,11 +16,11 @@ import util.ConvUtil;
* COBOL Java 的对应关系
* SELECT EMPFILE ASSIGN TO SYS001 文件路径常量 INP_FILE
* FD EMPFILE. 01 EMPREC. EmpRec DTO + substring 拆分
* OPEN INPUT EMPFILE new BufferedReader(...)
* OPEN INPUT EMPFILE FileIo.openReader(...)
* READ EMPFILE AT END MOVE 'Y' TO EOF-FLG line = br.readLine(); line == null AT END
* CLOSE EMPFILE try-with-resources 自动 close
* OPEN OUTPUT REPFILE new PrintWriter(...)
* WRITE REP-REC pw.println(...)
* OPEN OUTPUT REPFILE FileIo.openWriter(...)BufferedWriter
* WRITE REP-REC bw.write(...) + bw.newLine()
*
* 文件编码统一为 UTF-8 COBOL 为系统代码页时转换时需确认
*/
@@ -50,8 +46,7 @@ public class FileSample {
*/
private static List<EmpRec> readFilePara() {
List<EmpRec> list = new ArrayList<EmpRec>();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(INP_FILE), "UTF-8"))) {
try (BufferedReader br = FileIo.openReader(INP_FILE)) {
String line;
while ((line = br.readLine()) != null) { // AT END readLine() == null
list.add(parseRec(line));
@@ -91,21 +86,23 @@ public class FileSample {
private static void writeFilePara(final List<EmpRec> list) {
BigDecimal wsTotal = BigDecimal.ZERO; // 05 WS-TOTAL PIC 9(7)V99.
int wsCnt = 0; // 05 WS-CNT PIC 9(3).
try (PrintWriter pw = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(OUT_FILE), "UTF-8"))) {
pw.println("*** EMP SALARY REPORT ***");
try (BufferedWriter bw = FileIo.openWriter(OUT_FILE)) {
bw.write("*** EMP SALARY REPORT ***");
bw.newLine();
for (EmpRec r : list) {
// WRITE REP-RECPIC 编辑padRight 对应 X(20) 定长化
pw.println(ConvUtil.padRight(r.getEmpId(), 6)
bw.write(ConvUtil.padRight(r.getEmpId(), 6)
+ ConvUtil.padRight(r.getEmpName(), 20)
+ ConvUtil.padRight(r.getEmpDept(), 4)
+ r.getEmpSalary().setScale(2).toPlainString());
bw.newLine();
// ADD EMP-SALARY TO WS-TOTAL. / ADD 1 TO WS-CNT.
wsTotal = wsTotal.add(r.getEmpSalary());
wsCnt++;
}
pw.println("CNT=" + ConvUtil.padLeftZero(wsCnt, 3)
bw.write("CNT=" + ConvUtil.padLeftZero(wsCnt, 3)
+ " TOTAL=" + wsTotal.setScale(2).toPlainString());
bw.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
+20 -17
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -175,8 +171,8 @@ public class Kin01InpMain {
// フィールド保持termPara()で明示 close を採用OPEN/CLOSE 対応を優先
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
/** FD R01INNFIL の 01 R01INNREC. 03 R01LINE PIC X(80).(現在レコードバッファ) */
private String r01Line = "";
@@ -600,12 +596,9 @@ public class Kin01InpMain {
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), "UTF-8"));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), "UTF-8"));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), "UTF-8"));
r01InnFil = FileIo.openReader(r01InnFile);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -613,13 +606,23 @@ public class Kin01InpMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
/** WRITE W02OUTREC.ADD 1 TO CUN-W02OUT. */
private void writeW02() {
w02OutFil.println(w02.toRecordLine());
try {
w02OutFil.write(w02.toRecordLine());
w02OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW02Out++;
}
@@ -637,8 +640,8 @@ public class Kin01InpMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+13 -14
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -137,7 +133,7 @@ public class Kin02UpdMain {
// ==================== ファイルDBハンドル ====================
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private BufferedWriter w01OutFil;
private Connection conn;
/** FD R01INNFIL の 01 R01INNREC(現在レコードバッファ)。 */
@@ -488,13 +484,11 @@ public class Kin02UpdMain {
// ==================== ファイル操作補助OPEN/CLOSE/WRITE 相当 ====================
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL.autoFlush で ABEND 前でも書込が失われない) */
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), "UTF-8"));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), "UTF-8"), true);
r01InnFil = FileIo.openReader(r01InnFile);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -502,7 +496,12 @@ public class Kin02UpdMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
@@ -520,8 +519,8 @@ public class Kin02UpdMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
} else if (handle instanceof Connection) {
((Connection) handle).close();
}
+11 -11
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -120,7 +116,7 @@ public class Kin03ExpMain {
private ResultSet rsC1;
private PreparedStatement psC2;
private ResultSet rsC2;
private PrintWriter w01OutFil;
private BufferedWriter w01OutFil;
// ==================== PROCEDURE DIVISION ====================
@@ -212,8 +208,7 @@ public class Kin03ExpMain {
/** W01 OPENFILE STATUS 異常時は ABEND 999)。 */
private void openW01() {
try {
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), "UTF-8"), true);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
} catch (IOException e) {
abendPara(); // IF WS-W01-STATUS NOT = '00' ABEND
}
@@ -379,7 +374,12 @@ public class Kin03ExpMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
@@ -405,8 +405,8 @@ public class Kin03ExpMain {
((ResultSet) handle).close();
} else if (handle instanceof PreparedStatement) {
((PreparedStatement) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
} else if (handle instanceof Connection) {
((Connection) handle).close();
}
+20 -17
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -138,8 +134,8 @@ public class Kin04ChkMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
/** FD R01INNFIL の 01 R01INNREC. 03 R01LINE PIC X(80).(現在レコードバッファ) */
private String r01Line = "";
@@ -474,12 +470,9 @@ public class Kin04ChkMain {
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), "UTF-8"));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), "UTF-8"));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), "UTF-8"));
r01InnFil = FileIo.openReader(r01InnFile);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -487,13 +480,23 @@ public class Kin04ChkMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
/** WRITE W02OUTREC.ADD 1 TO CUN-W02OUT. */
private void writeW02() {
w02OutFil.println(w02.toRecordLine());
try {
w02OutFil.write(w02.toRecordLine());
w02OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW02Out++;
}
@@ -511,8 +514,8 @@ public class Kin04ChkMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+13 -15
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -145,7 +141,7 @@ public class Kin05MatMain {
private BufferedReader r01InnFil;
private BufferedReader r02InnFil;
private PrintWriter w01OutFil;
private BufferedWriter w01OutFil;
/** 入力ファイルパス(R01/R02/W01)。引数で上書き可。 */
private final String r01InnFile;
@@ -522,12 +518,9 @@ public class Kin05MatMain {
/** OPEN INPUT R01INNFIL/R02INNFIL / OUTPUT W01OUTFIL(失敗時は STATUS='99'→ABEND)。 */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), "UTF-8"));
r02InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r02InnFile), "UTF-8"));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(w01OutFile), "UTF-8"));
r01InnFil = FileIo.openReader(r01InnFile);
r02InnFil = FileIo.openReader(r02InnFile);
w01OutFil = FileIo.openWriter(w01OutFile);
} catch (IOException e) {
// OPEN失敗相当FILE STATUS '00'後続の OPENチェックで ABEND 999
wsR01Status = "99";
@@ -538,7 +531,12 @@ public class Kin05MatMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
@@ -556,8 +554,8 @@ public class Kin05MatMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+1 -5
View File
@@ -4,9 +4,6 @@ import dto.ZanmsgacPar;
import util.ConvUtil;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -117,8 +114,7 @@ public class Kin06CldMain {
// 出力ファイルOPEN
try {
outrecFil = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(OUTREC_FILE), StandardCharsets.UTF_8));
outrecFil = FileIo.openWriter(OUTREC_FILE);
} catch (Exception e) {
throw new RuntimeException("出力ファイルOPEN失敗: " + e.getMessage(), e);
}
+5 -15
View File
@@ -10,11 +10,6 @@ import util.ConvUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@@ -110,16 +105,14 @@ public class Kin07DaiMain {
// 出力ファイルOPEN
try {
w01OutFil = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(W01_FILE), StandardCharsets.UTF_8));
w01OutFil = FileIo.openWriter(W01_FILE);
} catch (Exception e) {
throw new RuntimeException("出力ファイルOPEN失敗: " + e.getMessage(), e);
}
// W02(ERROR-LOG) OPEN設計書使用ファイル一覧 No.5
try {
w02OutFil = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(W02_FILE), StandardCharsets.UTF_8));
w02OutFil = FileIo.openWriter(W02_FILE);
} catch (Exception e) {
throw new RuntimeException("W02出力ファイルOPEN失敗: " + e.getMessage(), e);
}
@@ -358,8 +351,7 @@ public class Kin07DaiMain {
private List<Kin06Rec> readR01() {
List<Kin06Rec> list = new ArrayList<>();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(R01_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader br = FileIo.openReader(R01_FILE)) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty()) {
@@ -377,8 +369,7 @@ public class Kin07DaiMain {
private List<Kin03Rec> readR02() {
List<Kin03Rec> list = new ArrayList<>();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(R02_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader br = FileIo.openReader(R02_FILE)) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty()) {
@@ -396,8 +387,7 @@ public class Kin07DaiMain {
private List<Kin02Rec> readR03() {
List<Kin02Rec> list = new ArrayList<>();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(R03_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader br = FileIo.openReader(R03_FILE)) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty()) {
+3 -11
View File
@@ -6,11 +6,6 @@ import util.ConvUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -125,8 +120,7 @@ public class Kin08DbuMain {
// 入出力ファイルOPEN
try {
w01OutFil = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(W01_FILE), StandardCharsets.UTF_8));
w01OutFil = FileIo.openWriter(W01_FILE);
} catch (Exception e) {
throw new RuntimeException("出力ファイルOPEN失敗: " + e.getMessage(), e);
}
@@ -136,8 +130,7 @@ public class Kin08DbuMain {
// SYSIN 読込解析1199-SYSIN-LOOP / 1110/1120/1130
// *****************************************************************
private void readSysin() {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(SYSIN_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader br = FileIo.openReader(SYSIN_FILE)) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty()) {
@@ -188,8 +181,7 @@ public class Kin08DbuMain {
if (resetMode) {
resetDelete();
}
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(R01_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader br = FileIo.openReader(R01_FILE)) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty()) {
+3 -17
View File
@@ -1,10 +1,9 @@
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import util.ConvUtil;
public class Kin09CsvMain {
@@ -37,8 +36,7 @@ public class Kin09CsvMain {
Class.forName("org.sqlite.JDBC");
try (Connection conn = DriverManager.getConnection("jdbc:sqlite:data/kin.db")) {
try (BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(OUTPUT_FILE), "UTF-8"))) {
try (BufferedWriter out = FileIo.openWriter(OUTPUT_FILE)) {
long w01out = 0;
@@ -193,7 +191,7 @@ public class Kin09CsvMain {
}
private static void writeRec(BufferedWriter out, String content) throws Exception {
out.write(padRight(content, REC_LEN));
out.write(ConvUtil.padRight(content, REC_LEN));
out.newLine();
}
@@ -203,16 +201,4 @@ public class Kin09CsvMain {
}
writeRec(out, content);
}
private static String padRight(String s, int len) {
if (s == null) s = "";
StringBuilder sb = new StringBuilder(s);
while (sb.length() < len) {
sb.append(' ');
}
if (sb.length() > len) {
sb.setLength(len);
}
return sb.toString();
}
}
+23 -20
View File
@@ -1,10 +1,6 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
@@ -121,8 +117,8 @@ public class Kyu01CvtMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
/** 入力ファイルパス。デフォルトは SELECT ASSIGN 対応の R01INN_FILE。 */
private final String r01InnFile;
@@ -321,8 +317,8 @@ public class Kyu01CvtMain {
if (t.isEmpty()) {
// 空項目は UNSTRING で受信されなかったのと同等INITIALIZE 済の SPACE
out[i] = ConvUtil.padRight("", FLD_WIDTH[i]);
} else if (t.length() > FLD_WIDTH[i]) {
out[i] = t.substring(0, FLD_WIDTH[i]); // 受信領域 PIC 幅で切捨
} else if (t.getBytes(StandardCharsets.UTF_8).length > FLD_WIDTH[i]) {
out[i] = ConvUtil.padRight(t, FLD_WIDTH[i]); // 受信領域 PIC 幅で切捨
} else {
out[i] = t;
}
@@ -361,7 +357,7 @@ public class Kyu01CvtMain {
private void errorCsvPara(final String logical) {
w02.reset();
w02.setErrCategory("CSV-ERR ");
final String detail = (logical.length() > 80) ? logical.substring(0, 80) : logical;
final String detail = ConvUtil.safeSub(logical, 0, 80);
w02.setErrDetail(detail);
writeW02();
}
@@ -421,12 +417,9 @@ public class Kyu01CvtMain {
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), StandardCharsets.UTF_8));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), StandardCharsets.UTF_8));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), StandardCharsets.UTF_8));
r01InnFil = FileIo.openReader(r01InnFile);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -434,13 +427,23 @@ public class Kyu01CvtMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
/** WRITE W02OUTREC.ADD 1 TO CUN-W02OUT. */
private void writeW02() {
w02OutFil.println(w02.toRecordLine());
try {
w02OutFil.write(w02.toRecordLine());
w02OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW02Out++;
}
@@ -458,8 +461,8 @@ public class Kyu01CvtMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+12 -14
View File
@@ -1,12 +1,7 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -152,7 +147,7 @@ public class Kyu02RegMain {
/** R02INNFIL 読取ハンドル(OPEN/CLOSE はフィールド保持、finally でクローズ) */
private BufferedReader r02InnFil;
/** W03OUTFIL 書込ハンドル(同上) */
private PrintWriter w03OutFil;
private BufferedWriter w03OutFil;
/** DB2 接続(EXEC SQL CONNECT TO … END-EXEC 相当) */
private Connection conn;
@@ -295,7 +290,12 @@ public class Kyu02RegMain {
w03.reset();
w03.setErrCategory("DB-ERR"); // MOVE 'DB-ERR' TO W03ERR-CATEGORYPIC X(008)
w03.setErrDetail(dbvEmpId); // MOVE DBV-EMP-ID TO W03ERR-DETAILPIC X(192)
w03OutFil.println(w03.toRecordLine());
try {
w03OutFil.write(w03.toRecordLine());
w03OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW03Out++;
}
@@ -437,10 +437,8 @@ public class Kyu02RegMain {
/** OPEN INPUT R02INNFIL / OUTPUT W03OUTFIL. */
private void openFiles() {
try {
r02InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(R02INN_FILE), StandardCharsets.UTF_8));
w03OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W03OUT_FILE), StandardCharsets.UTF_8));
r02InnFil = FileIo.openReader(R02INN_FILE);
w03OutFil = FileIo.openWriter(W03OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -458,8 +456,8 @@ public class Kyu02RegMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序も FILE STATUS 未管理
+14 -17
View File
@@ -1,13 +1,8 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import dto.Kyu02Rec;
import dto.Kyu99Rec;
@@ -134,8 +129,8 @@ public class Kyu03AggMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
/** 入力ファイルパス。デフォルトは SELECT ASSIGN 対応の R01INN_FILE。 */
private final String r01InnFile;
@@ -291,7 +286,12 @@ public class Kyu03AggMain {
// MOVE WRK-ABSENT-COUNT TO W01ABSENT-COUNT.
w01.setAbsentCount(wrkAbsentCount);
// WRITE W01OUTREC.ADD 1 TO CUN-W01OUT.
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
@@ -352,12 +352,9 @@ public class Kyu03AggMain {
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), StandardCharsets.UTF_8));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), StandardCharsets.UTF_8));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), StandardCharsets.UTF_8));
r01InnFil = FileIo.openReader(r01InnFile);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -377,8 +374,8 @@ public class Kyu03AggMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+21 -20
View File
@@ -1,14 +1,9 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -203,8 +198,8 @@ public class Kyu04CalMain {
// ==================== ファイルハンドル / DB接続OPEN/CLOSE 相当 ====================
private BufferedReader r02InnFil;
private PrintWriter w03OutFil;
private PrintWriter w04OutFil;
private BufferedWriter w03OutFil;
private BufferedWriter w04OutFil;
private Connection conn;
// ==================== PROCEDURE DIVISION ====================
@@ -497,7 +492,12 @@ public class Kyu04CalMain {
+ ConvUtil.padRight(wrkAttendType, 1) // MOVE WRK-ATTEND-TYPE
+ ConvUtil.padRight(wrkAllowanceType, 3) // MOVE WRK-ALLOWANCE-TYPE
+ ConvUtil.padRight("", 131); // FILLER X(131)
w03OutFil.println(line);
try {
w03OutFil.write(line);
w03OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW03Out++;
}
@@ -509,7 +509,12 @@ public class Kyu04CalMain {
w04.reset();
w04.setErrCategory("DB-ERR");
w04.setErrDetail(r02EmpId);
w04OutFil.println(w04.toRecordLine());
try {
w04OutFil.write(w04.toRecordLine());
w04OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW04Out++;
}
@@ -559,12 +564,9 @@ public class Kyu04CalMain {
/** OPEN INPUT R02INNFIL / OUTPUT W03OUTFIL W04OUTFIL. */
private void openFiles() {
try {
r02InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(R02INN_FILE), StandardCharsets.UTF_8));
w03OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W03OUT_FILE), StandardCharsets.UTF_8));
w04OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W04OUT_FILE), StandardCharsets.UTF_8));
r02InnFil = FileIo.openReader(R02INN_FILE);
w03OutFil = FileIo.openWriter(W03OUT_FILE);
w04OutFil = FileIo.openWriter(W04OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -586,8 +588,8 @@ public class Kyu04CalMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
} else if (handle instanceof Connection) {
((Connection) handle).close();
}
@@ -598,8 +600,7 @@ public class Kyu04CalMain {
/** PAY-PARAM(R03) 読込:OPEN INPUT / READ INTO WRK-PARAM-BASE / CLOSE. */
private void readParam() {
try (BufferedReader r03 = new BufferedReader(
new InputStreamReader(new FileInputStream(R03INN_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader r03 = FileIo.openReader(R03INN_FILE)) {
final String line = r03.readLine();
wrkParamBase = (line == null) ? "" : line;
} catch (IOException e) {
+20 -18
View File
@@ -1,14 +1,9 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -174,8 +169,8 @@ public class Kyu05DedMain {
// ==================== ファイルハンドル / DB接続OPEN/CLOSE 相当 ====================
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
private Connection conn;
/** 入力ファイルパス。デフォルトは SELECT ASSIGN 対応の R01INN_FILE。 */
@@ -492,12 +487,9 @@ public class Kyu05DedMain {
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), StandardCharsets.UTF_8));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), StandardCharsets.UTF_8));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), StandardCharsets.UTF_8));
r01InnFil = FileIo.openReader(r01InnFile);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -505,13 +497,23 @@ public class Kyu05DedMain {
/** WRITE W01OUTREC.ADD 1 TO CUN-W01OUT. */
private void writeW01() {
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
/** WRITE W02OUTREC.ADD 1 TO CUN-W02OUT. */
private void writeW02() {
w02OutFil.println(w02.toRecordLine());
try {
w02OutFil.write(w02.toRecordLine());
w02OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW02Out++;
}
@@ -529,8 +531,8 @@ public class Kyu05DedMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序も FILE STATUS 未管理
+12 -14
View File
@@ -1,12 +1,7 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -147,7 +142,7 @@ public class Kyu06UpdMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private BufferedReader r02InnFil;
private PrintWriter w03OutFil;
private BufferedWriter w03OutFil;
/** EXEC SQL CONNECT で取得したコネクション */
private Connection conn;
@@ -411,10 +406,8 @@ public class Kyu06UpdMain {
/** OPEN INPUT R02INNFIL / OUTPUT W03OUTFIL. */
private void openFiles() {
try {
r02InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(R02INN_FILE), StandardCharsets.UTF_8));
w03OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W03OUT_FILE), StandardCharsets.UTF_8));
r02InnFil = FileIo.openReader(R02INN_FILE);
w03OutFil = FileIo.openWriter(W03OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -422,7 +415,12 @@ public class Kyu06UpdMain {
/** WRITE W03OUTREC.ADD 1 TO CUN-W03OUT. */
private void writeW03() {
w03OutFil.println(w03.toRecordLine());
try {
w03OutFil.write(w03.toRecordLine());
w03OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW03Out++;
}
@@ -438,8 +436,8 @@ public class Kyu06UpdMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+21 -20
View File
@@ -1,12 +1,7 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import dto.Kyu07R01Rec;
import dto.Kyu99Rec;
@@ -167,8 +162,8 @@ public class Kyu07DivMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private BufferedReader r01InnFil;
private PrintWriter w99OutFil;
private PrintWriter deptOutFil;
private BufferedWriter w99OutFil;
private BufferedWriter deptOutFil;
/** 現在OPEN中の部署コード(1ファイルのみOPENを管理)。 */
private String openDeptCode = "";
@@ -229,10 +224,8 @@ public class Kyu07DivMain {
// *** OPEN INPUT R01INNFIL / OPEN OUTPUT W99OUTFIL.
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(r01InnFile), StandardCharsets.UTF_8));
w99OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W99OUT_FILE), StandardCharsets.UTF_8));
r01InnFil = FileIo.openReader(r01InnFile);
w99OutFil = FileIo.openWriter(W99OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -246,8 +239,7 @@ public class Kyu07DivMain {
* OPENREAD AT END(全部署対象) / カードありは "DEPT=01,02,05,10" 形式をパース
*/
private void sysInPara() {
try (BufferedReader sysIn = new BufferedReader(
new InputStreamReader(new FileInputStream(SYSIN_FILE), StandardCharsets.UTF_8))) {
try (BufferedReader sysIn = FileIo.openReader(SYSIN_FILE)) {
final String line = sysIn.readLine();
if (line == null) {
// *** AT END: SET WRK-ALL-DEPTS TO TRUE制御カードなし全部署対象
@@ -397,8 +389,7 @@ public class Kyu07DivMain {
}
// *** WHEN '01' '50': OPEN OUTPUT DEPTnn-FILE
try {
deptOutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(getDeptPath(deptCode)), StandardCharsets.UTF_8));
deptOutFil = FileIo.openWriter(getDeptPath(deptCode));
openDeptCode = deptCode;
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
@@ -437,7 +428,12 @@ public class Kyu07DivMain {
if (k >= 0) {
// *** WHEN '01' '50': WRITE DEPTnn-REC FROM R01INNREC
if (deptOutFil != null) {
deptOutFil.println(r01.toRecordLine());
try {
deptOutFil.write(r01.toRecordLine());
deptOutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
// *** ADD 1 TO CUN-DEPT-OUTWHEN OTHER 含む全レコードをカウント
@@ -520,7 +516,12 @@ public class Kyu07DivMain {
/** WRITE W99OUTREC.ADD 1 TO CUN-W99OUT. */
private void writeW99() {
w99OutFil.println(w99.toRecordLine());
try {
w99OutFil.write(w99.toRecordLine());
w99OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW99Out++;
}
@@ -539,8 +540,8 @@ public class Kyu07DivMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+26 -19
View File
@@ -1,12 +1,7 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import dto.Kyu04Rec;
import dto.Kyu05Rec;
@@ -133,8 +128,8 @@ public class Kyu08PriMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private BufferedReader r01InnFil;
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
// ==================== PROCEDURE DIVISION ====================
@@ -241,7 +236,12 @@ public class Kyu08PriMain {
// *** ヘッダ出力BEFORE ADVANCING PAGE
// WRITE W01OUTREC FROM HEADER-LINE BEFORE ADVANCING PAGE.
w01OutFil.println(buildHeaderLine(wrkPageCounter));
try {
w01OutFil.write(buildHeaderLine(wrkPageCounter));
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
// *** 明細行編集DETAIL-LINE KYU05REC 布局PAGE-TITLE=SPACE
// MOVE R01EMP-ID TO DL-EMP-ID.
@@ -258,13 +258,23 @@ public class Kyu08PriMain {
// WRITE W01OUTREC FROM DETAIL-LINE BEFORE ADVANCING 1 LINE
// AT END-OF-PAGE WRITE W01OUTREC FROM FOOTER-LINE BEFORE ADVANCING PAGE.
// 1社員1ページのため AT END-OF-PAGE は発動しない
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
// ADD 1 TO CUN-W01OUT.
cunW01Out++;
// *** フッタ出力BEFORE ADVANCING PAGE
// WRITE W01OUTREC FROM FOOTER-LINE BEFORE ADVANCING PAGE.
w01OutFil.println(buildFooterLine());
try {
w01OutFil.write(buildFooterLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
// *** 次レコード読込1100R01INNSOR
readR01Para();
@@ -378,12 +388,9 @@ public class Kyu08PriMain {
/** OPEN INPUT R01INNFIL / OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
r01InnFil = new BufferedReader(
new InputStreamReader(new FileInputStream(R01INN_FILE), StandardCharsets.UTF_8));
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), StandardCharsets.UTF_8));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), StandardCharsets.UTF_8));
r01InnFil = FileIo.openReader(R01INN_FILE);
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN失敗 ABEND
}
@@ -403,8 +410,8 @@ public class Kyu08PriMain {
try {
if (handle instanceof BufferedReader) {
((BufferedReader) handle).close();
} else if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
} else if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (IOException e) {
// CLOSE異常は無視原程序もFILE STATUS未管理
+21 -19
View File
@@ -1,12 +1,7 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@@ -74,7 +69,7 @@ public class Kyu09MrgMain {
private static final String CST_PAY_TYPE_TOTAL = "T";
/** 88 WRK-MERGE-EOF-Y の HIGH-VALUESPIC X(008) の最大値)相当。 */
private static final String HIGH_VALUES_EMP_ID = "\u00FF\u00FF\u00FF\u00FF\u00FF\u00FF\u00FF\u00FF";
private static final String HIGH_VALUES_EMP_ID = "\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF";
// ==================== ファイル定義SELECT ASSIGN 相当 ====================
@@ -138,8 +133,8 @@ public class Kyu09MrgMain {
// ==================== ファイルハンドルOPEN/CLOSE 相当 ====================
private PrintWriter w01OutFil;
private PrintWriter w02OutFil;
private BufferedWriter w01OutFil;
private BufferedWriter w02OutFil;
// ==================== PROCEDURE DIVISION ====================
@@ -211,8 +206,7 @@ public class Kyu09MrgMain {
/** 入力ファイル読込(OPEN INPUT / READ AT END 相当)。 */
private List<Kyu04Rec> readFile(final String path) {
final List<Kyu04Rec> list = new ArrayList<>();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8))) {
try (BufferedReader br = FileIo.openReader(path)) {
String line;
while ((line = br.readLine()) != null) {
if (line.isEmpty()) {
@@ -349,7 +343,12 @@ public class Kyu09MrgMain {
// MOVE WRK-ACCOUNT-NO TO W01ACCOUNT-NO.
w01.setAccountNo(wrkAccountNo);
// WRITE W01OUTREC. ADD 1 TO CUN-W01OUT.
w01OutFil.println(w01.toRecordLine());
try {
w01OutFil.write(w01.toRecordLine());
w01OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW01Out++;
}
@@ -412,7 +411,12 @@ public class Kyu09MrgMain {
w02.reset();
w02.setErrDetail("DIRECT ENTRY");
// WRITE W02OUTREC. ADD 1 TO CUN-W02OUT.
w02OutFil.println(w02.toRecordLine());
try {
w02OutFil.write(w02.toRecordLine());
w02OutFil.newLine();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
cunW02Out++;
}
@@ -421,10 +425,8 @@ public class Kyu09MrgMain {
/** OPEN OUTPUT W01OUTFIL W02OUTFIL. */
private void openFiles() {
try {
w01OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W01OUT_FILE), StandardCharsets.UTF_8));
w02OutFil = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(W02OUT_FILE), StandardCharsets.UTF_8));
w01OutFil = FileIo.openWriter(W01OUT_FILE);
w02OutFil = FileIo.openWriter(W02OUT_FILE);
} catch (IOException e) {
throw new UncheckedIOException(e); // OPEN 失敗 ABEND
}
@@ -440,8 +442,8 @@ public class Kyu09MrgMain {
private static void closeQuiet(final Object handle) {
try {
if (handle instanceof PrintWriter) {
((PrintWriter) handle).close();
if (handle instanceof BufferedWriter) {
((BufferedWriter) handle).close();
}
} catch (Exception e) {
// CLOSE 異常は無視原程序も FILE STATUS 未管理
+2 -7
View File
@@ -175,7 +175,7 @@ public class Zan01ChkMain {
// 绀惧摗鐣彿銉併偋銉冦偗
c01.reset();
c01.setC01ChkTyp("EMPID");
c01.setC01ChkDat(pad8(csvEmpId));
c01.setC01ChkDat(ConvUtil.padRight(csvEmpId, 8));
Sub04ChkSub.execute(c01);
if (c01.getC01ChkRrc() != 0) {
writeW03("01", "EMP-ID ERROR:" + csvEmpId);
@@ -184,7 +184,7 @@ public class Zan01ChkMain {
// 鏃ヤ粯銉併偋銉冦偗
c01.reset();
c01.setC01ChkTyp("DATE");
c01.setC01ChkDat(pad8(csvApplDate));
c01.setC01ChkDat(ConvUtil.padRight(csvApplDate, 8));
Sub04ChkSub.execute(c01);
if (c01.getC01ChkRrc() != 0) {
writeW03("01", "DATE ERROR:" + csvEmpId);
@@ -341,9 +341,4 @@ public class Zan01ChkMain {
e01.setE01AbdCod(CNS_ABD999);
Sub03EndSub.execute(e01);
}
/** EMPID/鏃ヤ粯绛夈伄銉併偋銉冦偗鐢ㄣ伀8妗佸彸瑭般倎(宸﹀煁銈佹枃瀛楀垪闀峰悎銈忋仜). */
private String pad8(final String s) {
return ConvUtil.padRight(s, 8);
}
}
+7 -4
View File
@@ -14,10 +14,13 @@ import java.nio.charset.StandardCharsets;
/**
* ============================================================
* 銆怌OBOL鈫扟ava銆慞ROGRAM-ID. ZAN02CHK ??Zan02ChkMain
* COBOLJavaPROGRAM-ID. ZAN02CHK クラス Zan02ChkMain
* ============================================================
* 鏅傞枔甯噸瑜囥儊銈с儍銈? OVT-VSORT(R01) 悓涓绀惧摗銉诲悓涓鏃ヤ粯鍐呫仹
* 鍓嶃儸銈炽兗銉夌祩浜嗘檪鍒?> 鐝鹃枊濮嬫檪鍒? ERROR-LOG(W02) 嚭鍔涖? * 銇濄倢浠ュ?OVT-NODUP(W01) 銇稿嚭鍔涖? * 鈥昏ō瑷堟浉婧栨嫚銆侰OBOL 銇ㄦ暣鍚堛? */
* 時間帯重複チェック OVT-VSORT(R01) の同一社員かつ同一日付内で
* 前レコード終了時刻 > 現レコード開始時刻 の場合 ERROR-LOG(W02) に出力
* それ以外は OVT-NODUP(W01) に出力
* 設計書準拠COBOL と整合
*/
public class Zan02ChkMain {
private static final String PRGIDX = "ZAN02CHK";
@@ -87,7 +90,7 @@ public class Zan02ChkMain {
throw new RuntimeException("FILE OPEN ERROR", e);
}
readR01();
// 1浠剁洰: W01鍑哄姏 + 鍓嶃儸銈炽兗銉夊垵鏈熷寲
// 1件目: W01出力 + 前レコード初期化
if (!"1".equals(wrkR01Eof)) {
r01Rec.fromRecordLine(r01Line);
prevRec.fromRecordLine(r01Line);
+24 -47
View File
@@ -1,6 +1,7 @@
import dto.Zan01Rec;
import dto.Zan05Rec;
import dto.ZanmsgacPar;
import util.ConvUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -13,9 +14,14 @@ import java.util.List;
/**
* ============================================================
* 銆怌OBOL鈫扟ava銆慞ROGRAM-ID. ZAN03CHK ??Zan03ChkMain
* COBOLJavaPROGRAM-ID. ZAN03CHK クラス Zan03ChkMain
* ============================================================
* 鎵撳埢鏅傞枔鐓у悎: OVT-NODUP(R01) ?PUNCH(R02) 銈掋偔銉?绀惧摗+鐢宠珛鏃?銇х獊鍚堛? * 鑷淬仐鏅傞枔甯亴鍑哄嫟銆滈鍕ょ瘎鍥插唴 ?OVT-TYPE浠樺姞銇椼仸 OVT-CHECKED(W01)? * 绡勫洸澶栥伨銇熴伅涓嶄竴鑷??ERROR-LOG(W02) 儐銈淬儶03銆? * 浼戞棩鍒ゅ畾銇?R03(浼戞棩銉曘偂銈ゃ儷) 銇ц銇嗐? * 鈥籞AN03 ?SUB01DAT 娇鐢?FUNCTION CURRENT-DATE)銆傝ō瑷堟浉婧栨嫚銆? */
* 打刻時間照合 OVT-NODUP(R01) PUNCH(R02) を社員番号+申請日で突合
* 一致し申請時間帯が出勤退勤の範囲内 OVT-TYPE付加で OVT-CHECKED(W01)
* 範囲外または不一致 ERROR-LOG(W02) に出力
* 休日判定は R03(休日テーブル) で行う
* ZAN03 SUB01DAT 未使用FUNCTION CURRENT-DATE設計書準拠
*/
public class Zan03ChkMain {
private static final String PRGIDX = "ZAN03CHK";
@@ -28,7 +34,7 @@ public class Zan03ChkMain {
private static final int CNS_ERR_CAT03 = 3;
private static final String OVT_W = "W";
private static final String OVT_H = "H";
private static final String HIGH = "zzzzzzzzzzzzzzzz"; // 16脳'z' = HIGH-VALUE
private static final String HIGH = "\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF"; // 16×'\uFFFF' = HIGH-VALUE
private static final String R01_PATH = "data/ZAN03R01.txt";
private static final String R02_PATH = "data/ZAN03R02.txt";
@@ -56,13 +62,13 @@ public class Zan03ChkMain {
private Zan01Rec r01Rec = new Zan01Rec();
// R02 銈ゃ兂銉偆銉抽爡鐩? // R02 インライン項目
// R02 インライン項目
private String r02EmpId = "";
private String r02Date = "";
private String r02TimeIn = "";
private String r02TimeOut = "";
// 浼戞棩銉嗐兗銉栥儷
// 休日テーブル
private final List<String[]> holidayTable = new ArrayList<>();
private BufferedReader r01In;
@@ -107,7 +113,7 @@ public class Zan03ChkMain {
} catch (IOException e) {
throw new RuntimeException("FILE OPEN ERROR", e);
}
// 浼戞棩銉曘偂銈ゃ儷瑾
// 休日ファイル読込
holidayLoad();
readR01();
readR02();
@@ -118,8 +124,8 @@ public class Zan03ChkMain {
String line;
while ((line = r03In.readLine()) != null) {
cunR03Inn++;
String date = line.length() >= 8 ? line.substring(0, 8).trim() : "";
String flg = line.length() >= 9 ? line.substring(8, 9) : " ";
String date = ConvUtil.safeSub(line, 0, 8).trim();
String flg = ConvUtil.safeSub(line, 8, 9);
holidayTable.add(new String[]{date, flg});
}
wrkR03Eof = "1";
@@ -136,7 +142,7 @@ public class Zan03ChkMain {
} else {
r01Line = line;
r01Rec.fromRecordLine(line);
wrkR01Key = pad8(r01Rec.getEmpId()) + pad8(r01Rec.getApplDate());
wrkR01Key = ConvUtil.padRight(r01Rec.getEmpId(), 8) + ConvUtil.padRight(r01Rec.getApplDate(), 8);
cunR01Inn++;
}
} catch (IOException e) {
@@ -152,11 +158,11 @@ public class Zan03ChkMain {
wrkR02Key = HIGH;
} else {
r02Line = line;
r02EmpId = line.length() >= 8 ? line.substring(0, 8).trim() : "";
r02Date = line.length() >= 16 ? line.substring(8, 16).trim() : "";
r02TimeIn = line.length() >= 20 ? line.substring(16, 20).trim() : "";
r02TimeOut = line.length() >= 24 ? line.substring(20, 24).trim() : "";
wrkR02Key = pad8(r02EmpId) + pad8(r02Date);
r02EmpId = ConvUtil.safeSub(line, 0, 8).trim();
r02Date = ConvUtil.safeSub(line, 8, 16).trim();
r02TimeIn = ConvUtil.safeSub(line, 16, 20).trim();
r02TimeOut = ConvUtil.safeSub(line, 20, 24).trim();
wrkR02Key = ConvUtil.padRight(r02EmpId, 8) + ConvUtil.padRight(r02Date, 8);
cunR02Inn++;
}
} catch (IOException e) {
@@ -191,10 +197,10 @@ public class Zan03ChkMain {
}
private void matchProc() {
int r01Start = parseInt(r01Rec.getStartTime(), 0);
int r01End = parseInt(r01Rec.getEndTime(), 0);
int punchIn = parseInt(r02TimeIn, 0);
int punchOut = parseInt(r02TimeOut, 0);
int r01Start = ConvUtil.parseIntSafe(r01Rec.getStartTime(), 0);
int r01End = ConvUtil.parseIntSafe(r01Rec.getEndTime(), 0);
int punchIn = ConvUtil.parseIntSafe(r02TimeIn, 0);
int punchOut = ConvUtil.parseIntSafe(r02TimeOut, 0);
if (r01Start >= punchIn && r01End <= punchOut) {
setOvtProc();
try {
@@ -305,33 +311,4 @@ public class Zan03ChkMain {
m00.setM00Umkdats2205(PRGIDX);
Sub02MsgSub.execute(m00);
}
private String pad8(final String s) {
if (s == null) {
return " ";
}
if (s.length() >= 8) {
return s.substring(0, 8);
}
StringBuilder sb = new StringBuilder(s);
while (sb.length() < 8) {
sb.append(' ');
}
return sb.toString();
}
private int parseInt(final String s, final int def) {
if (s == null) {
return def;
}
String t = s.trim();
if (t.isEmpty()) {
return def;
}
try {
return Integer.parseInt(t);
} catch (NumberFormatException e) {
return def;
}
}
}
+12 -19
View File
@@ -5,6 +5,7 @@ import dto.Zan05Rec;
import dto.ZandatacPar;
import dto.ZanendacPar;
import dto.ZanmsgacPar;
import util.ConvUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -15,9 +16,15 @@ import java.nio.charset.StandardCharsets;
/**
* ============================================================
* 銆怌OBOL鈫扟ava銆慞ROGRAM-ID. ZAN04MAT ??Zan04MatMain
* COBOLJavaPROGRAM-ID. ZAN04MAT クラス Zan04MatMain
* ============================================================
* 鍙栨秷銉炪儍銉併兂銈? OVT-SORTED(R01) ?OVT-CSORT(R02) 銈掔敵璜嬬暘鍙?APPL-ID)? * 1:1 銉炪儍銉併兂銈般仐銆佺祼鏋溿倰鎸倞鍒嗐亼銈嬨? * ? ?鍙栨秷娓堛伩鐢宠珛銈?ERROR-LOG(W03) 嚭鍔涳紙鐩f熁瑷艰贰锛? * R01銇 ?鏈夊姽鐢宠珛銈?OVT-MATCHED(W01) 嚭鍔? * R02銇 ?鍙栨秷鐢宠珛銈?OVT-DBCLEAN(W02) 嚭鍔? * 鈥昏ō瑷堟浉婧栨嫚銆侰OBOL 銇ㄦ暣鍚堛傘偔銉笺伅 APPL-ID (8B)? */
* 取消マッチング OVT-SORTED(R01) OVT-CSORT(R02) を申請番号(APPL-ID)
* 1:1 マッチングし結果を振り分ける
* 一致(取消済) 取消済み申請を監査証跡として ERROR-LOG(W03) に出力
* R01のみ 有効申請 OVT-MATCHED(W01) に出力
* R02のみ 取消申請 OVT-DBCLEAN(W02) に出力DB削除用
* 設計書準拠COBOL と整合キーは APPL-ID (8B)
*/
public class Zan04MatMain {
private static final String PRGIDX = "ZAN04MAT";
@@ -31,7 +38,7 @@ public class Zan04MatMain {
private static final int CNS_ABD999 = 999;
private static final int CNS_ERR_CAT04 = 4;
private static final int CNS_PROC_SEQ01 = 1;
private static final String HIGH = "zzzzzzzz"; // 8脳'z' = HIGH-VALUE
private static final String HIGH = "\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF"; // 8×'\uFFFF' = HIGH-VALUE
private static final String R01_PATH = "data/ZAN04R01.txt";
private static final String R02_PATH = "data/ZAN04R02.txt";
@@ -114,7 +121,7 @@ public class Zan04MatMain {
r01Key = HIGH;
} else {
r01Rec.fromRecordLine(line);
r01Key = pad8(r01Rec.getApplId());
r01Key = ConvUtil.padRight(r01Rec.getApplId(), 8);
cunR01Inn++;
}
} catch (IOException e) {
@@ -129,7 +136,7 @@ public class Zan04MatMain {
r02Key = HIGH;
} else {
r02Rec.fromRecordLine(line);
r02Key = pad8(r02Rec.getApplId());
r02Key = ConvUtil.padRight(r02Rec.getApplId(), 8);
cunR02Inn++;
}
} catch (IOException e) {
@@ -260,18 +267,4 @@ public class Zan04MatMain {
e01.setE01AbdCod(CNS_ABD999);
Sub03EndSub.execute(e01);
}
private String pad8(final String s) {
if (s == null) {
return " ";
}
if (s.length() >= 8) {
return s.substring(0, 8);
}
StringBuilder sb = new StringBuilder(s);
while (sb.length() < 8) {
sb.append(' ');
}
return sb.toString();
}
}
+11 -35
View File
@@ -4,6 +4,7 @@ import dto.ZandatacPar;
import dto.ZanendacPar;
import dto.ZanmsgacPar;
import dto.ZantimacPar;
import util.ConvUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -14,9 +15,13 @@ import java.nio.charset.StandardCharsets;
/**
* ============================================================
* 銆怌OBOL鈫扟ava銆慞ROGRAM-ID. ZAN05CAL ??Zan05CalMain
* COBOLJavaPROGRAM-ID. ZAN05CAL クラス Zan05CalMain
* ============================================================
* 娈嬫キ鏅傞枔闆嗚: OVT-SORTED2(R01, APPL-ID+PROC-SEQ 鏄囬爢) 銈掋偔銉笺儢銉偆銈泦瑷堛仐銆? * 鍚屼竴 APPL-ID 鍐呫伄鍏ㄦ槑绱般伄鍔犵彮鏅傞枔銈掔绠椼仐銇?OVT-SUMMARY(W01) ?1 偝銉笺儔鍑哄姏銆? * 绌嶇畻鍒嗏啋鏅傚埢涓搞倎銇?SUB05TIM(mode=2: 0.1h 鍗樹綅鍒囨崹) 銈掍娇鐢ㄣ? * 鈥昏ō瑷堟浉婧栨嫚銆侰OBOL 銇ㄦ暣鍚堛? */
* 残業時間集約 OVT-SORTED2(R01, APPL-ID+PROC-SEQ 昇順) をキーブレイク集約し
* 同一 APPL-ID 内の全明細の残業時間を積算しOVT-SUMMARY(W01) 1 レコード出力
* 積算分類時刻計算は SUB05TIM(mode=2: 0.1h 単位切捨) を使用
* 設計書準拠COBOL と整合
*/
public class Zan05CalMain {
private static final String PRGIDX = "ZAN05CAL";
@@ -29,7 +34,7 @@ public class Zan05CalMain {
private static final int CNS_KN0002 = 2;
private static final int CNS_TIMMODE02 = 2;
private static final int CNS_ABD999 = 999;
private static final String HIGH = "zzzzzzzz"; // 8脳'z' = HIGH-VALUE
private static final String HIGH = "\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF"; // 8×'\uFFFF' = HIGH-VALUE
private static final String R01_PATH = "data/ZAN05R01.txt";
private static final String W01_PATH = "data/ZAN05W01.txt";
@@ -133,7 +138,7 @@ public class Zan05CalMain {
r01Key = HIGH;
} else {
r01Rec.fromRecordLine(line);
r01Key = pad8(r01Rec.getApplId());
r01Key = ConvUtil.padRight(r01Rec.getApplId(), 8);
cunR01Inn++;
}
} catch (IOException e) {
@@ -142,8 +147,8 @@ public class Zan05CalMain {
}
private void accumProc() {
int start = parseInt(r01Rec.getStartTime(), 0);
int end = parseInt(r01Rec.getEndTime(), 0);
int start = ConvUtil.parseIntSafe(r01Rec.getStartTime(), 0);
int end = ConvUtil.parseIntSafe(r01Rec.getEndTime(), 0);
int sh = start / 100;
int sm = start % 100;
int eh = end / 100;
@@ -243,33 +248,4 @@ public class Zan05CalMain {
e01.setE01AbdCod(CNS_ABD999);
Sub03EndSub.execute(e01);
}
private String pad8(final String s) {
if (s == null) {
return " ";
}
if (s.length() >= 8) {
return s.substring(0, 8);
}
StringBuilder sb = new StringBuilder(s);
while (sb.length() < 8) {
sb.append(' ');
}
return sb.toString();
}
private int parseInt(final String s, final int def) {
if (s == null) {
return def;
}
String t = s.trim();
if (t.isEmpty()) {
return def;
}
try {
return Integer.parseInt(t);
} catch (NumberFormatException e) {
return def;
}
}
}
+7 -3
View File
@@ -22,10 +22,14 @@ import java.sql.SQLException;
/**
* ============================================================
* 銆怌OBOL鈫扟ava銆慞ROGRAM-ID. ZAN06UPD ??Zan06UpdMain
* COBOLJavaPROGRAM-ID. ZAN06UPD クラス Zan06UpdMain
* ============================================================
* 娈嬫キ绲辫DB鏇存柊: OVT-SUMMARY(R01) ?OVT_APPLICATIONS ?INSERT(閲嶈?UPDATE)
* 銇椼丱VT-MONTHLY 湀娆泦瑷堛倰鍙嶆槧銆侽VT-DBCLEAN(R02) 褰撶敵璜嬨倰鍙栨秷鐘舵厠銇? * 鏇存柊銇椼丱VT-MONTHLY 銇嬨倝鍔犵彮鏅傞枔銈掓笡绠椼仚銈嬨? * 鎺ョ稓鍏? data/OVERTIME.DB (SQLite)銆傘儐銉笺儢銉笉鍦ㄦ檪銇?CREATE TABLE IF NOT EXISTS 銇ц嚜鍕曟绡夈? * 鈥昏ō瑷堟浉婧栨嫚銆侰OBOL 銇ㄦ暣鍚堛? */
* 残業統計DB更新 OVT-SUMMARY(R01) OVT_APPLICATIONS INSERT(重複時 UPDATE)
* OVT-MONTHLY に月次集計を反映OVT-DBCLEAN(R02) は該当申請を取消状態へ
* 更新しOVT-MONTHLY から残業時間を減算する
* 接続先: data/OVERTIME.DB (SQLite)テーブル不在時は CREATE TABLE IF NOT EXISTS で自動作成
* 設計書準拠COBOL と整合
*/
public class Zan06UpdMain {
private static final String PRGIDX = "ZAN06UPD";
+9 -12
View File
@@ -161,17 +161,14 @@ public class Kin01Rec {
public void fromRecordLine(final String line) {
reset();
String s = (line == null) ? "" : line;
while (s.length() < 80) {
s = s + " ";
}
applId = Integer.parseInt(s.substring(0, 9).trim());
empId = s.substring(9, 17);
leaveType = s.substring(17, 19);
startDate = Integer.parseInt(s.substring(19, 27).trim());
startTime = Integer.parseInt(s.substring(27, 31).trim());
endDate = Integer.parseInt(s.substring(31, 39).trim());
endTime = Integer.parseInt(s.substring(39, 43).trim());
status = s.substring(43, 44);
filler = s.substring(44, 80);
applId = Integer.parseInt(ConvUtil.safeSub(s, 0, 9).trim());
empId = ConvUtil.safeSub(s, 9, 17);
leaveType = ConvUtil.safeSub(s, 17, 19);
startDate = Integer.parseInt(ConvUtil.safeSub(s, 19, 27).trim());
startTime = Integer.parseInt(ConvUtil.safeSub(s, 27, 31).trim());
endDate = Integer.parseInt(ConvUtil.safeSub(s, 31, 39).trim());
endTime = Integer.parseInt(ConvUtil.safeSub(s, 39, 43).trim());
status = ConvUtil.safeSub(s, 43, 44);
filler = ConvUtil.safeSub(s, 44, 80);
}
}
+7 -10
View File
@@ -67,16 +67,13 @@ public class Kin02Rec {
*/
public void fromRecordLine(final String line) {
String s = (line == null) ? "" : line;
if (s.length() < 80) {
s = ConvUtil.padRight(s, 80);
}
empId = s.substring(0, 8); // EMP-ID X(008) [1..8]
date = Integer.parseInt(s.substring(8, 16)); // DATE 9(008) [9..16]
leaveType = s.substring(16, 18); // LEAVE-TYPE X(002) [17..18]
startTime = Integer.parseInt(s.substring(18, 22)); // START-TIME 9(004) [19..22]
endTime = Integer.parseInt(s.substring(22, 26)); // END-TIME 9(004) [23..26]
applId = Integer.parseInt(s.substring(26, 35)); // APPL-ID 9(009) [27..35]
filler = s.substring(35, 80); // FILLER X(045) [36..80]
empId = ConvUtil.safeSub(s, 0, 8); // EMP-ID X(008) [1..8]
date = Integer.parseInt(ConvUtil.safeSub(s, 8, 16)); // DATE 9(008) [9..16]
leaveType = ConvUtil.safeSub(s, 16, 18); // LEAVE-TYPE X(002) [17..18]
startTime = Integer.parseInt(ConvUtil.safeSub(s, 18, 22)); // START-TIME 9(004) [19..22]
endTime = Integer.parseInt(ConvUtil.safeSub(s, 22, 26)); // END-TIME 9(004) [23..26]
applId = Integer.parseInt(ConvUtil.safeSub(s, 26, 35)); // APPL-ID 9(009) [27..35]
filler = ConvUtil.safeSub(s, 35, 80); // FILLER X(045) [36..80]
}
public String getEmpId() {
+6 -9
View File
@@ -68,15 +68,12 @@ public class Kin04Rec {
*/
public void fromRecordLine(final String line) {
String s = (line == null) ? "" : line;
if (s.length() < 80) {
s = ConvUtil.padRight(s, 80);
}
empId = s.substring(0, 8); // EMP-ID X(008) [1..8]
workDate = s.substring(8, 16); // WORK-DATE 9(008) [9..16]
strTime = s.substring(16, 20); // STR-TIME 9(004) [17..20]
endTime = s.substring(20, 24); // END-TIME 9(004) [21..24]
deptId = s.substring(24, 28); // DEPT-ID X(004) [25..28]
terminal = s.substring(28, 34); // TERMINAL X(006) [29..34]
empId = ConvUtil.safeSub(s, 0, 8); // EMP-ID X(008) [1..8]
workDate = ConvUtil.safeSub(s, 8, 16); // WORK-DATE 9(008) [9..16]
strTime = ConvUtil.safeSub(s, 16, 20); // STR-TIME 9(004) [17..20]
endTime = ConvUtil.safeSub(s, 20, 24); // END-TIME 9(004) [21..24]
deptId = ConvUtil.safeSub(s, 24, 28); // DEPT-ID X(004) [25..28]
terminal = ConvUtil.safeSub(s, 28, 34); // TERMINAL X(006) [29..34]
}
public String getEmpId() {
+13 -21
View File
@@ -119,29 +119,21 @@ public class Kyu04Rec {
public long getR01PayAmount() { return payAmount; }
// ---------- 固定長レコード解析 ----------
private static String sub(final String s, final int a, final int b) {
String x = (s == null) ? "" : s;
if (x.length() < b) {
x = ConvUtil.padRight(x, b);
}
return x.substring(a, b);
}
/** 200B 固定長 SALARY-NET レコードを解析(COPY KYU04REC 05層順)。 */
public void fromRecordLine(final String line) {
empId = sub(line, 0, 8);
recType = sub(line, 8, 9);
empName = sub(line, 9, 49);
deptCode = sub(line, 49, 51);
regionCode = sub(line, 51, 53);
categoryCode = sub(line, 53, 56);
grossPayment = ConvUtil.parseIntSafe(sub(line, 56, 65), 0);
incomeTax = ConvUtil.parseIntSafe(sub(line, 65, 74), 0);
insurance = ConvUtil.parseIntSafe(sub(line, 74, 83), 0);
residentTax = ConvUtil.parseIntSafe(sub(line, 83, 92), 0);
netPayment = ConvUtil.parseIntSafe(sub(line, 92, 101), 0);
taxableIncome = ConvUtil.parseIntSafe(sub(line, 101, 110), 0);
payAmount = ConvUtil.parseIntSafe(sub(line, 110, 119), 0);
empId = ConvUtil.safeSub(line, 0, 8);
recType = ConvUtil.safeSub(line, 8, 9);
empName = ConvUtil.safeSub(line, 9, 49);
deptCode = ConvUtil.safeSub(line, 49, 51);
regionCode = ConvUtil.safeSub(line, 51, 53);
categoryCode = ConvUtil.safeSub(line, 53, 56);
grossPayment = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 56, 65), 0);
incomeTax = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 65, 74), 0);
insurance = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 74, 83), 0);
residentTax = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 83, 92), 0);
netPayment = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 92, 101), 0);
taxableIncome = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 101, 110), 0);
payAmount = ConvUtil.parseIntSafe(ConvUtil.safeSub(line, 110, 119), 0);
}
/** parseRecord は fromRecordLine と等価(PGM間の命名差を吸収)。 */
+26 -8
View File
@@ -2,6 +2,7 @@ package util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
/**
* ============================================================
@@ -28,14 +29,30 @@ public final class ConvUtil {
*/
public static String padRight(final String val, final int len) {
String s = (val == null) ? "" : val;
if (s.length() >= len) {
return s.substring(0, len);
byte[] b = s.getBytes(StandardCharsets.UTF_8);
if (b.length > len) {
// 干净 UTF-8 截断落到 len 字节若末字节是多字节字符的续字节则回退到
// 完整字符边界余下空间以空格字节补足 重编码后总字节数恒 = len
int cut = len;
while (cut > 0 && (b[cut] & 0xC0) == 0x80) {
cut--;
}
byte[] out = new byte[len];
System.arraycopy(b, 0, out, 0, cut);
for (int i = cut; i < len; i++) {
out[i] = ' ';
}
return new String(out, StandardCharsets.UTF_8);
}
StringBuilder sb = new StringBuilder(s);
while (sb.length() < len) {
sb.append(' ');
if (b.length == len) {
return s;
}
return sb.toString();
byte[] out = new byte[len];
System.arraycopy(b, 0, out, 0, b.length);
for (int i = b.length; i < len; i++) {
out[i] = ' ';
}
return new String(out, StandardCharsets.UTF_8);
}
/**
@@ -118,12 +135,13 @@ public final class ConvUtil {
if (line == null) {
return "";
}
byte[] b = line.getBytes(StandardCharsets.UTF_8);
int s = Math.max(0, start);
int e = Math.min(line.length(), end);
int e = Math.min(b.length, end);
if (s >= e) {
return "";
}
return line.substring(s, e);
return new String(b, s, e - s, StandardCharsets.UTF_8);
}
/**