refactor(KIN09/KIN08): align Java to COBOL

- KIN09CSV: FULL outputs daily detail only; SHORT additionally emits monthly summary (matches cbl:160)
- KIN08DBU: RESET deletes MONTHLY_ABSENCE only; DAILY_RECORDS preserved via plain INSERT (matches cbl:486-497)
- Design docs updated to reflect COBOL-correct behavior
- COBOL investigation record: remove the two design self-contradiction items (KIN09 #1, KIN08 #2) and related references
This commit is contained in:
qiuqiuqiu
2026-08-30 10:53:24 +08:00
parent cf016287ac
commit 8853c7a536
6 changed files with 45 additions and 67 deletions
+4 -12
View File
@@ -183,8 +183,8 @@ public class Kin08DbuMain {
// 主処理 2000MAJSOR
// *****************************************************************
private void majProc() {
// 設計書(使用DBテーブル): RESET = DELETE + INSERT
// DAILY_RECORDS 挿入前に既存レコードを削除(stpProc 後だと PK 違反
// COBOL 通り: RESET は MONTHLY_ABSENCE のみ DELETEDAILY_RECORDS は削除せず通常 INSERT
// ※RESET 再実行時に DAILY_RECORDS 既存行は PK 違反の可能性(COBOL も同様/運用上は事前クリア想定
if (resetMode) {
resetDelete();
}
@@ -293,17 +293,8 @@ public class Kin08DbuMain {
return null;
}
/** RESET 時の既存レコード削除(DAILY_RECORDS + MONTHLY_ABSENCE、対象年月のみ. */
/** RESET 時の既存レコード削除(COBOL 通り MONTHLY_ABSENCE のみ。DAILY_RECORDS は削除せず通常 INSERT. */
private void resetDelete() {
try (PreparedStatement ps = conn.prepareStatement(
"DELETE FROM DAILY_RECORDS WHERE TARGET_DATE LIKE ?")) {
ps.setString(1, yearMonth + "%");
int n = ps.executeUpdate();
cunDbxDel += n;
} catch (Exception e) {
dbError(e);
return;
}
try (PreparedStatement ps = conn.prepareStatement(
"DELETE FROM MONTHLY_ABSENCE WHERE YEAR_MONTH = ?")) {
ps.setString(1, yearMonth);
@@ -311,6 +302,7 @@ public class Kin08DbuMain {
cunDbxDel += n;
} catch (Exception e) {
dbError(e);
return;
}
}
+31 -35
View File
@@ -42,13 +42,11 @@ public class Kin09CsvMain {
long w01out = 0;
boolean fullMode = !shortMode;
// 日別明細: FULL/SHORT 両方出力(COBOL 2000MAJSOR はモードに関わらず日別を出力)
writeRec(out, DAILY_HEADER);
w01out++;
if (fullMode) {
writeRec(out, DAILY_HEADER);
w01out++;
int lineCount = 0;
int lineCount = 0;
String dSql = "SELECT EMP_ID, TARGET_DATE, TIME_IN, TIME_OUT, "
+ "ANNUAL_LEAVE_H, PERSONAL_LEAVE_H, OFFICIAL_LEAVE_H, "
@@ -95,40 +93,38 @@ public class Kin09CsvMain {
}
}
}
}
// 月次サマリ(FULL / SHORT 両方出力)。FULL は日別との区切り空白を挿入。
if (fullMode) {
writeAdvancing(out, 2, "");
// 月次サマリ: SHORT のみ出力(COBOL 2500-SHORT-MODE は MODE=SHORT 時のみ追加)
if (shortMode) {
writeAdvancing(out, 2, ""); // COBOL: AFTER ADVANCING 2 LINES (セクション区切り)
w01out++;
}
writeRec(out, SUMMARY_HEADER);
w01out++;
writeRec(out, SUMMARY_HEADER);
w01out++;
String mSql = "SELECT EMP_ID, YEAR_MONTH, ANNUAL_LEAVE_H, "
+ "PERSONAL_LEAVE_H, OFFICIAL_LEAVE_H, SICK_LEAVE_H, "
+ "UNAPPROVED_ABSENT_H "
+ "FROM MONTHLY_ABSENCE WHERE YEAR_MONTH = ? ORDER BY EMP_ID";
try (PreparedStatement ps = conn.prepareStatement(mSql)) {
ps.setString(1, yearMonth);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
String empId = sanitize(getStr(rs, "EMP_ID"));
String ym = getStr(rs, "YEAR_MONTH");
double annual = rs.getDouble("ANNUAL_LEAVE_H");
double personal = rs.getDouble("PERSONAL_LEAVE_H");
double official = rs.getDouble("OFFICIAL_LEAVE_H");
double sick = rs.getDouble("SICK_LEAVE_H");
double absent = rs.getDouble("UNAPPROVED_ABSENT_H");
String mSql = "SELECT EMP_ID, YEAR_MONTH, ANNUAL_LEAVE_H, "
+ "PERSONAL_LEAVE_H, OFFICIAL_LEAVE_H, SICK_LEAVE_H, "
+ "UNAPPROVED_ABSENT_H "
+ "FROM MONTHLY_ABSENCE WHERE YEAR_MONTH = ? ORDER BY EMP_ID";
try (PreparedStatement ps = conn.prepareStatement(mSql)) {
ps.setString(1, yearMonth);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
String empId = sanitize(getStr(rs, "EMP_ID"));
String ym = getStr(rs, "YEAR_MONTH");
double annual = rs.getDouble("ANNUAL_LEAVE_H");
double personal = rs.getDouble("PERSONAL_LEAVE_H");
double official = rs.getDouble("OFFICIAL_LEAVE_H");
double sick = rs.getDouble("SICK_LEAVE_H");
double absent = rs.getDouble("UNAPPROVED_ABSENT_H");
String line = empId + "," + ym + ","
+ editHours(annual) + "," + editHours(personal) + ","
+ editHours(official) + "," + editHours(sick) + ","
+ editHours(absent);
String line = empId + "," + ym + ","
+ editHours(annual) + "," + editHours(personal) + ","
+ editHours(official) + "," + editHours(sick) + ","
+ editHours(absent);
writeRec(out, line);
w01out++;
writeRec(out, line);
w01out++;
}
}
}
}