From baa5be54d25eb46c90d54b37982b1d05f23cc715 Mon Sep 17 00:00:00 2001 From: qiuqiuqiu Date: Tue, 30 Jun 2026 21:22:15 +0800 Subject: [PATCH] =?UTF-8?q?KIN03EXP:=20SELECT=20INTO=20=E2=86=92=20CURSOR(?= =?UTF-8?q?DECLARE/OPEN/FETCH/CLOSE)=20pattern;=20SUB01DAT:=20COPY=20ZANDA?= =?UTF-8?q?TAC;=20=E5=9F=BA=E6=9C=AC=E8=A8=AD=E8=A8=88=E6=9B=B8A:=20KIN08D?= =?UTF-8?q?BU/KIN09CSV=20specs=20updated;=20=E5=93=81=E8=B3=AA=E7=AE=A1?= =?UTF-8?q?=E7=90=86:=20coverage=20stats,=20keyword=20docs,=20test=20crite?= =?UTF-8?q?ria?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/KIN01INP.exe | Bin 162871 -> 162871 bytes bin/KIN02UPD.exe | Bin 159427 -> 160065 bytes bin/KIN03EXP.exe | Bin 166022 -> 166704 bytes bin/KIN04CHK.exe | Bin 159978 -> 159978 bytes bin/KIN05MAT.exe | Bin 155207 -> 155207 bytes bin/KIN06CLD.exe | Bin 162693 -> 162899 bytes bin/KIN07DAI.exe | Bin 160555 -> 160555 bytes bin/KIN08DBU.exe | Bin 178792 -> 178792 bytes bin/KIN09CSV.exe | Bin 178344 -> 178344 bytes bin/SUB01DAT.dll | Bin 106354 -> 106354 bytes bin/SUB02MSG.dll | Bin 107595 -> 107595 bytes bin/SUB03END.dll | Bin 106324 -> 106324 bytes bin/SUB04CHK.dll | Bin 116489 -> 116489 bytes bin/SUB05TIM.dll | Bin 110532 -> 110532 bytes bin/ZAN01CHK.exe | Bin 163870 -> 163358 bytes bin/ZAN02CHK.exe | Bin 154048 -> 154048 bytes bin/ZAN03CHK.exe | Bin 156654 -> 156654 bytes bin/ZAN04MAT.exe | Bin 157352 -> 157352 bytes bin/ZAN05CAL.exe | Bin 157206 -> 157206 bytes bin/ZAN06UPD.exe | Bin 171482 -> 172304 bytes cpy/KIN01REC.cpy | 12 + cpy/KIN02REC.cpy | 10 + cpy/KIN03REC.cpy | 16 + cpy/KIN08REC.cpy | 11 + cpy/KIN09REC.cpy | 4 + src/KIN03EXP.cbl | 141 +- sub/SUB01DAT.cbl | 4 +- sub/SUB02MSG.cbl | 13 +- sub/SUB03END.cbl | 3 +- sub/SUB04CHK.cbl | 11 +- sub/SUB05TIM.cbl | 5 +- 使用資源一覧/KIN03EXP_使用資源一覧.md | 16 +- 品質管理/COBOLキーワード網羅定義書.md | 354 ++++ 品質管理/COBOL言語解説書_IBM_zOS_V65.md | 1426 +++++++++++++++++ 品質管理/カバレッジ統計.md | 476 +++--- 品質管理/测试基准说明.md | 569 +++++++ 品質管理/程序分类说明.md | 90 ++ ...勤怠休暇管理システム_設計書(サブシステムA).md | 153 +- 詳細設計書/詳細設計書_KIN08DBU.md | 211 +++ 詳細設計書/詳細設計書_KIN09CSV.md | 207 +++ 40 files changed, 3382 insertions(+), 350 deletions(-) create mode 100644 cpy/KIN01REC.cpy create mode 100644 cpy/KIN02REC.cpy create mode 100644 cpy/KIN03REC.cpy create mode 100644 cpy/KIN08REC.cpy create mode 100644 cpy/KIN09REC.cpy create mode 100644 品質管理/COBOLキーワード網羅定義書.md create mode 100644 品質管理/COBOL言語解説書_IBM_zOS_V65.md create mode 100644 品質管理/测试基准说明.md create mode 100644 品質管理/程序分类说明.md create mode 100644 詳細設計書/詳細設計書_KIN08DBU.md create mode 100644 詳細設計書/詳細設計書_KIN09CSV.md diff --git a/bin/KIN01INP.exe b/bin/KIN01INP.exe index 2a966902a9add1cf3b1bb46336b09dc6ef8eb73d..6fda3aa32cd2b968ff88bec9046fc80f2b52deba 100644 GIT binary patch delta 10374 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 diff --git a/bin/KIN03EXP.exe b/bin/KIN03EXP.exe index 01f96a8c4a71c20b0804259b13dedf5e1b99a5e8..70931bc7aee3782ee5bfbba560597d60f7faf3ad 100644 GIT binary patch delta 35965 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 BjK=@~ delta 34653 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 BBTN7Q diff --git a/bin/KIN05MAT.exe b/bin/KIN05MAT.exe index 049c84743e97eac7d6d071a4c095dec06d93ed1f..bd59ac56775c9f2100e5ebb2537414266da0386d 100644 GIT binary patch delta 110 zcmX@Uhx7Oz&IujNm)AQ@?Dl24Qor$5r#_#Ux+$Yax2wQ$hm1>>44VrLjw)~%8yFax zSQr>hwhJr~Fg8#yGB7ezFfg<-v9JOPUi6dO{2)+83}jF}8Bz005xuCG`LR delta 110 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 delta 29910 zcmc(I3tUvy+V@@?1{o9?6$H7+a8dC#4mc=y9Taf9;~mWcQA|CksAyE?j41^ohAwMa zc?z_PT~3iysK*qmlcr{4Wm#DV%Q~1=*wsqo`>(y%?3rzy^YVS~`~JT9wddLE|2*q? zp7pF}-S!^r-K)m3pN-Y!#&fUQmq@P@>5i>iLy2kY6Mc;}vLppa(o-F_el(z8qa?W{ zeDF0rnBRy`wInq|PW!Y-Qa^SiRu124^(SUJg+%zji(2e_kQ}zv8o-*qC4sVi9Nk8G z5)<7|dXYeSp4=8t69N@=TjRRY61fv;r1!|Zh?_o#?&Y@lXdy!%~0^im33;jw{fCkzjty^+v6T~kzS`U$kfW-UI4XW=z5)$nD>8q) z>L_bmeRO{yZ(S9zkl0K#KQnPy^SxO#+}KOb&Z2f>*T^T(3V3-R$b^dibvq$G6ynXF zrqE)exyw$}y2yC&tAeWs0`EJ7?l$&~e1mH{()=?>^+H9rW5eYnM4^l}8)Ksj3wdAg zPxG(8wYFAQJ2t$Y^jb))bn)R#nh9P*hjS%}Tj?hNI#OSTQ@Q!Vb;lEjAnm$=JuuI26I3|4t_d_m>+-&~?FGiG$uB zoECbjC%WYow@H#Nhm@T};bO;L^n7r?PJib{${I_8_O;@3(b|i4@3@d0pk*D$$*FdF zx?_YKWv7=qM*4p{Qj+MTzTwmyLZhdk0MkD*ZkmsZ17_8J^Wc&6?U2Yp?Nx!p5P+wt zbGTf0A@c1A1#Cftp=0(e5XJGM`)RCcRP=6zZRnur_D7uqR#CBH1ii}?5xra$`1}E` zG~QQW#t8a?DPqu2RiNJvE>P|3U7X6<^&sc)8AH?EZUk*L^_Poh(kbEN>Fu5RTAs}1 zLZ~erz$JVfia@uz9TkRmpd7t)f|IJS7iZ9SI!z}HbbYTu^ybd_UB(RKxFL76r{cnw zsk?KSX&G9Zv5&V3ZEhyR=#QP_$jdam%iZ%1&*ZEi!OB9%^RdE*rlT_JER5Ve%A?Hv zlHx^W*uC2XR|#N+fEDTKkoHZBjW5w(yOj68V+d+gg?*pFiQyzCO5Jg4-73R}8Wj5y zeLgf%jvGSHgx(XjHJv-OdcYfo&M=yMsVAzxMT^72NIktLYzR3=kA&S8-go++1ntRs zI=SnRochV!SXMF2C)v6AtbEn>sCuP2N3-&Imq4!@6FMXp;dY(3QWssN;ClLD*95Yc zUhmoq-#x9&Q~$(;h`sdF@Hd@xYPyG%J*5~5GjQ!yhTn&CdwkSgQzU#k z{7zA&7~hs90d4NyXX z9CGl#nM;Y5;g?~wN93CD_Ykx{42;a@>E6h`^2lMz_~{eXH$36b#5O%g zi=tM~PQWaRmQF{K!_U7>@c4P@Z%QUqh0Rep^&022;26xDqq#IyEtRVdCJv=}vEyl3 zbl>pzC;o|(1O7&jMptxtR%AiNF16Y)Ixi-SJVS4bsgxtrl?F`i-Z%XB@qePC@EN+b z`|8=h4^SE~AWdmN`B+Z_-gsIxAXVjT(Kycvj^Ve#z76QlDDFYjaUFz?>?ksp}qyt^ZXTi~<9!pEsKv1`QRii?$5O;EB)W2QY$ zZ%OQWvtZ6>Qfe#JK6%Wif`g~N0{BK0fNz?F#DqZoa z*H)#kf`A(o%v70GVf{0erhln9zwwWnGJG|igQRd}sN#GFh5Lpf`EE(F!qBGx^I%AHS~+#kCR7~y~L3| zvC)Z%ir}%e+&A53D=3j(>l11FG=U3*Ir}Se<$RB$c=qxm!n1!U32zv|1r*NCN3hjO zpiBG4%B2Z(OWz3dEvk+ocPToq-pOrY2ypr46!4U--zR-DqyMf9T*G!w6kU7&s#-A| z>8Hf8ykFn&^H`t$5XXLhrN{d%?zoeSR~ian>0)po&FF6?J841x9w7>2zhbn~5V(^* z&_7l_+^)W%zaJqF)4yAyoJZAFq4jpIJy3XOG%GHD2M|H{8$`UGe;upvK2&-4>v*SC zUZcvpOUHXjTXl?RpmNxoZ7bfbgk{Qs2X~ zt2~3s`vLngZ@om7cj*qL-lsZVpvpU~@(wz6%*)*sFB(+l6FQz-<^5IVZPf8zRCyaz z-Xa}uhss;5@}}x|YrA8khh|S!nN}S$U#*y`@*;J-OqCa<@~)=)wmzvlJ!Op;+g%lT z6v0;`qixdtRnF>Ou&w0Y_t<`8J6>hjwwencLrNS#Iw;-rK@1&`95LvX7{$>(Yq&r= zUxD2!CtTsga}K5qrD{bCy(<|94OPIko>%4Rrs;M zjoEfFv=vpqj#k_{RLXTrP_F5ISLHnB;v9dj6qn-G{%ATeCBpfrDp2!Bfijg7;C0y3 zqQ9t|Yf2p>^l6?>Q90lJkuzB3xNn0a`%#5EiVt1ar@ix~2b9298lD9gDc-1TYD`!o zA69|KUEJp!oa+q_;r51(d_M}@O2cwhwq}qb%WL1PBBy#NNCc4a964$?!!oZjOes3; zIXP;%zsk-P#qMg6H=9d`p!kNph~N4vw@V3be?gDGVPD44ZjJ_o&j-!^O#cP+k#E^i(qW!P*qrpwm`d7PL*M#S~rK2O2b&K>SRyV zL2A_xQn(GSG|N-P zEVTBX&YLyyZ zMR9nI!gU-qQ~(m(0*#yN;g0um6E*G-4>wqF6}R}l#&9pD4@c!oJ4_&bttE!$uHneR zszEW%uBqH~4$>yegys)ai^v(JILoGR&7x>miq$QO*NQ;(2mEPT4xZO2#Rt`*RVf~| z^L&C`g*B{LQI*S!NA3B7(;4>*LVKkmqd2^1s7GUG05HQ!$Yz_4T!=k3fdt z{tCaxA~G8z8%}?=mJUlZkK$`PmxzSKK_T%2CKN>TDHK(UhKGElwg{=8RH-}ZBWbI%G|^b$oJ1a&=H5Bk?ComnK5* zLV9?}EpqGaGGy?ENpecgJE7aNAqq6{x ziwGPL^l3pK5_FTGcL=&f&^dyR6Lg3|Lt;0oU93Kee2Fhal}d8;Sy;Vrp+)fN;bHAe z$|8k1y3!u#s0b^Mq3;h%ko^YI--eBl{Z7%L!v}Xdj%gE#8Gz@Onb>t3UZxv{XUknu z=!xM;#@<7D4yDEqrPqd+cI!6)rTPAMJBYirDJ0gVBwAIB$wI3}^p_7<=)n<#Cskk% zdg%c#_d{O3$6J01<%_G3F(I*b=#DX3P@eBCpXU5&D1(<^p&27b$ippk{mAstpH{6W~VxfwTS+>()Z^J_;9GwHO9 zo^iX;N=IePvz+vP{iq=U71Z!$CR!a8hA8?_MuwbhssALyK;lnfTE`i6%M@;=a`@-v zcpmpL9zctZuQa?s{YNK~a@u>eRj%(>f79p$B6saWU73;H``{?h{I_3u{DNQZjr&^M zWOO9&)3NH#=H;tOHYfE}n)Zg$^Dw*12;T9{5)TPN=X4wub$416LWg z2$-WXGcgHXt>yQ8TCXrn!EI~U_mH`?NqInhsca$lHL21t0xZ6MB{zDWs#i=vsH%d8 zD|PNw^ah)_uCg~vES1v}ty#&9mx344)-k=h|Fo1VE`^Y&?~PuCVL#1u#N|E;5d?YT z+vta*hANc!N~)X>8p0xeAa{2Zi z^!{<{$S*W>{789!BAqdQot&OX&x{|zu?hFdixcV}pCFSiFU6r_%P~9e$A#<-dn}F~ zm>6ez@GflpjQ&z1R-o3fkME+GmWPauhe)OL8rChmqNp_VzM*W?mHDiKfcAo*l`fq$ zGOWeS9eszdIh8T*a#9ucFM4EBsI>#`m1J=EOb5ZQDe`|;1>GocU*1J$@1Tasu?g+@ zBrHC#ar>>3giwpjt~lnn7pusa$>W`KpnxwQ9$FyE{}o*+8FcBhf#IewC9rbsgYKCom$1Iq>>z7`mqjNb5W3lKHs7a2n<~(qwiR`MZ!Q zT=)@BuL*kbxBdK`m-eYop4mt`;Q*(6PQM`8`FOI^Y{(X&RSI#&->!qI|DVzPBp)3;1@?)5`r7<-XJOSW-um@!d$L;M+};XAGb< z(*uo-uc+3W=#}Z=#(K?{(~zqshX0Tpi`90H14J`#l&a|wluEVIc}VWi zBsg6?BW*y0Z~n= z$v{Di4yom)^+JYL`v=!I-keAxcbsl*oq+3tyS23lbS9yl)<1$-B6ZR>-qUNXlZ&+&o`aX zmm_W{yF>tlJ*Tut4@e7cDCgf$ZoHvvy`h|TL%H~{-l2WE2I4T;r~@SF*bQa(4dvn+ z4A^fd*WFNVny7ccI>x7LKpb)o)qhsdv0YHzY?Wc1gE5}nfu|9lrd*zM!Z7@uP*QZS zvvi~+?WmC?PMhtL^epaMK$9~h=|$Xgx*1m^?m7Jy*Gb%Sx^0vsoy9$;w~dyh3%KX> z8(b~8=d^34BwfS3D@&4I#T8hKU$B6V!mA8Zt>lz)aI+j&G#JI8t8kfd4_~GGaV6p& z{!39~Bq<5^X3zv&Hr%8AQj$ZG()c~-7F_(Pcs1yEVSn02m(L&tUfClAA(staNKp(;N7{@_-PeFumZv{=6iU{G}4mujwLEPtn zuEo`edl#r1*Xy|Fbm2541n!GLTX3DleTx$}y{5wx6s(}n;A+Bs9q5<1E^r~x+h_1S zE|h`}nu*^(@O#ixxLR=YTH9H4OL2Iw@|BBwd9= zR#5(XiAN^$JI2kerEA= zeg)_F@2T)9ZB*+A;+|hgC_8X1!o?GnCmc^wo`gIpTkLA0{?L_gf{`D%9>i6P>v>!U zaJ`D_L}UHJl84Dex1@a>=g_`)Ve+&FNjrc!-b48vFBbXNkPvFdRb8EtZFDi&?G^J2|8WSMGD2}S}Oog#L7jvM$mnNo)q+)pe=&RAF4IG z3pzy5se%>=>JqeE(4CyZzVx&J4hrgVGs=6M{Y`=srPT74)Q_?+e-_=vRXNAn5OcdKwt?v1(t6{8)uj z1a$~HN6;mLt`l^NppOXpqM#ndZBJ^Y{TM?cOaF(my6s8r6j}Q}o7HVkYUlq-R-+%< znAA?`ewmrTgu%(@{Qr-alN&EuTrhumL4TWN zK@pypV1)+u-?_$TO`ViAVPJ|!UlR2Fo6Gs{82``s(p78buPjkb4};^ARq?9SP}Xm|1Ma_HR$t%}CS z&5tKNZhbuM@y0#wJxzOB_DD~eo-#jWeacQR-qX9YYz$Y5Kl$ZS)7{!O3Tlw!cn(`$QMr8NlK zPetZSKmOzIoJu$&PWF?y=9)^A(Q`6b!2ve_w~(*{*tXeZ#4b|N(O&Td0Je}`ARhqs zkzSx005+2faFkbR+-x$K__?1Q>8u8&h1U^J0=jY$bCt=MBY;>$_UPU%zx0${S@plY zXfnv=Lp1n6-)=Y;C`w}yO8y}`-!({5m*v@X%7Iwfokdq3NbiClTq#1EzzQQ%jef2y zdgwqjbkTDM@c5(t+JPSosnf+l({Ko49m0)%IUZmEfZ%wepXa1!xEnx6lhMz5i1s+L zRkk0Z`;M%Wi?i#~UX3Q8bmnV2D_2WVCKd}*Oj-n5?PyxCQ5UQZXj+1uzj1-WVd&Vm`d(!y5vNz z95sf%euB!yhw5jaoJ+cS&a~W##qco5iexwXx!2QEZzXo~9Emx1KDZs0D%{5PwEd~u zWb2svji-`jP}<-g)w@a@Uza09*KzrgsU$_}{IY;E6=;glFPFxjeiP5qE}woxb{(Rd z-&rSH9rYdF-O@qcaft5xr&->9sQ%DDYl$q4qw~%u$<>Ew<@tE|u5tAF^To1z0*(7@ z1Sj)88x;BR1T|$I3&R*UNs>&a%2=n`U!Fi;_$)hlgBXgz;R?&>x92uhUM9I*PU_JQ z6{E%rFlsza`rO{$Q}#!B)#rmEdkQ``(zBD-$l&oX5=lS#+$dL%r_G;_;3Vn7Ao3qChrhVzxDjiV-V^V!KfBbNI#^dG8>(XUiAR%-8=lC(J3JuGR+BB*T~Pw)P+ zzuXFkzw9E999RFwm)nS3?Vxj-bLHZ(^u=b&qQ}OnQ5qR6NqJql8?)tAcqH(g!21Ai ze^3-OLlK%GV~dz5>mXR8D441!h!J&m05@igrQ_!~Y5nE?VA9Vnm&$KWq;tRCF4rBR z-+jGK#<6$hH*16CM$9w6<)BDMU0dfIHc4%PAAI>37auKYeq;)h3xXHx!KI*UKH@_KEc6G3O_u1$>)qsjlj)r6kx8S(T6B*P8!C00 zC7=gAHKm}xOr|@pM-Fic4)^=C#~gPfSqh>)ysteqRbKBMlWEKK^>WSR`c=RC8D!}& zEA=Dsa`Pd!(~mgirb7)e{-isRty9==1G!m#a0=ULAZckwrl@gxCIEB$*P<{V1q96K zCuz^{;>z&|VX5GgrBhgk01`E4tpM_ZFi7ILh)W>yGeF2a?ec(yJ&mt`FtOY!vH{nH z+)Qq_zhISl?XvX&q)4vGVc!OjStH-fQN3(}zbSzk&KNZ`VKMB%Lr^oB-5QA4 zyC<{CKw`f6J<)B0;ZVSbq7aWluS=c|#jIL_cy)Y90KA>w|G|6`9<(XL(#JdtG?M#B zG23B8FWaZGZb2lL(;-3Rc{$@SyA(uhvi&fNYfo;IbEY;t)Shf_FS}+iYdG1=>7j7a zTi!N_(#HxEZXV z8<{EBO=kzXkwi|Lx{;nijnhSN?5c2LBuSR7)7h*@Qq1X_k))@bF`ZqBMEhH&v8*UE znA3Gps4RIZ2dR}`jUq$k;%Tfkir6{Lh=$*;X{;!kq{+3@*b~v@CfPle`Nfcx@|RQD zZ84;G`@m_!gTQI*nHVxSvPopx8+he-x-({1SYC~um@?!2aqm zbM_#~L$ysRGKhc3&i1PpOC-wl8w&E)q7G-p^X>al{U=;-1F#evFo#|0K{m+lnXI@c zxsp&VHhQuJLhbVwFI!wvQn+$yUZErp3VRF6Ah@v?`A9a+V);qrCQ`!=CL!HW{3MC2 zm(75ClRQ$#8hevCUi`c_VCyWlun$>48rg|H7#1jg+Xt|HR>R7^q}d?54zsz*B$>F` zmSnO~cFkg;DI~*r&n&gk^7HV9#B?dca1D7tfDd7Sv{SaQq66^!^(n#o7`(?I+>T)R zsr2w;jtKUCg*8=~^-X64_;=Jft1^s!+jyM_9?FpOJ~|bB&z7>wDWsn)<+8|u$b@#e zEOQ`9Kx^3Ifyl_Yv)J~5WRGmhZ5UxAeGPK;VfL4FGD>cq&z?_5W;M-c-=rhYO}VVs z5Hd_Q=d!{fWI+3bT(!AULN0rB2>F+6&1L07$+7k=qF4L_4Q$G@qzhX%41dT9Zs{Tlf>}UKp}?No#b|&AAfg}Si&Q9&V|H4lMB{kaHGlZuP3AY&=wY1M!Ms8 z!-kZRK}PKm#4;*LLa+;YqZ~NVk$wu)y$+D)#EEU0@|l2djw1kHm61ur%xcR>FP47~ zkMbC{M8j;>In zwqm#yD~;#y+D};HRydCLD2kOFfoBRF?^G200XC(abZ1XikT@sattgmF$a-|(eT#w* zz5&N87X`ob1{|+n6nxMPI9|mlc*PAkUdwP?mR@F8HX;-`7<|Z+m7B;Qo+nRlBH7-9 zHjj8H3$Ek~_$)T0l2~}oEa4RC@(`yOd&etDPoql=))k`8W)j86X`ju+(oH#J!w+TsR z_3I=M)8UaAIf~!=vwg3Vu1HJ;`090%gDF;H8VYz)`;;qDuJ$R{^W^rH13pH%C6ML+ zgLF6W<)GNhGjzqmlf$;YO=1n0<0Pwc8^F(&Zc(FHfxXtZqij}dJdInEa*MhC(Kj$F zo|V~_w@JL=dvGL$BOCpg>mMYZtvO2eVc)_{$pwDQdX#i;Sau9Sl&gc7DMU_aSbm(0 zCURpC%m08xvA0i3@{sPXVclz24yB8t~0sP$-0w&ip4 zc3((wJKq;k+;;gQN;lT|B8t~d8p5^C#Z#pme^%F14rO)6NC1296uFx$XS3cW3E}I( zT#20nk<1cm;Zq5u$vdW;&!Sud9J8E|cp1nZ4JpVQoN7rOtSmyROhI1CKuhW%sR?cN zAgL)9{CO$Q3KdzHH#p6bs&);;pt&H=Hpr5S?t>d%TmNvv*bZDCMbLwQ)@TUoN@uu3 z8nQ4i73QsI5TB&EJ|H%WEnTwvB54-eV9Di+47S+Pq-hqrWMN)8y2Op)?6^XMhiN|sz2!Zk-j^Hog`97?gIq)AQ_9?*C^g6b3u7Y#uVSS=}or5a5U z(q^C~Wsqd{k>NP39GWHbXj+5vIu+flzBJ7bfBtA{TBPZ2` zTk}?xEG@xiNke#;mLLKq4JlZex4gJ;nbcxs`N5bN&6pUS0OuDiUsZ^1kobfsOF#-s z3+GFleUTNb3s>I$t%h*rYoL4^0-@I8$a)~RAy{7IJ|N#{h^3^k6h6WME`!LCo^0#; zq#Lob_1|FcA$4T#_sJ5u#h(rP02_|ICvdWOG+1sYn{9042Y5i8WMiLlYPGSnv!H1< zwvAJ}ja}x{VPn}Jg67y*4X3#__A96PHa7hu&_y=(9H+%L7Wgq}sf`tI>awweoR-^I z*K?rNHdf5(4jVhpX^o8~egeA3#@2CKXJcnM-DhJdpMo~p*k(?T+1Qtyx^2wacnLDykpF`H#HrYllo7Ohj5f>n9Z=38v$g*=EkoHmk z$t8ykBs>FxCA#4g{uCMS|Cufj04+KSg42D^o zDm)_bH95;}`2a(l9~4LdOUE3b)*WN8E5fiOgpYkg zUSta{tMeaO$7;XDd{HbK&~lt~!ZR#A{AT>g+*yM?|BBd9WIN#d%oy=zEXz`5o^+hZNxvW|==AMViG*&=e&b zjH9PcPt2V#y2%G)Z~cG(O6<%JXqUt?ek5`JnHg6*vF<;jn_Cnb=a+F-xru66|05Ys zSPo*rT7E)nn^@S-sAy%U(Rn<6J=Cu9M*p#&5&d)DA+XnEw(cqt!YhmvS94nRZ1kMQ zPORfEu)9w&XZ9aE$F1JA8=G;A2Zp`yBZ*}@e}T@EKZzcVW~+Zik6OJ!2_b{opBJ2j;IMurfUd)3pe)z{DpD|_jh(u&%vYAb?Rz;zPIy|Z_a<5}i)*vt79l9?># zcTExr$JZW%OP2?M?AhNTUUW^kw~CduA|aB{Z`L&BSYdMT4pu(=EkU)4+9qh|M4;Qb zQpos8C5sC4Ru#@)wL?RA)!Cdm#5)SZS8-K3k#$_edo(dTkFtrE6G__r+cB{y{wETi zGx2gwz{^D5MA+5qp4dDm%ZWX=!z=X=j#u(4m(GJXD_8P!xcHpoW{0bDN~zX@?||0m zoRM&9a;tKT=WR&!aL-CU0jm7&ua(2#(0M-0Iw_O2Lx&3f&y;{QNYZZ4K>LvP}8}ie2r~_HI@=0Cz{exQOzB$;8Z)-7$AqrIjRTD^$kf3 zvU?&<(VvNdeHj98x(37P+u30gBL5j8fNF|2!xeA1!XJUU1Ugbf{qZEvt)d+= zG_+eFYck0ZA)_^95ae1|Ua%Zy%F@6|0Iiv-p)ndd4``i=vgl57P{0aaR{(YnYyp4= z)ZW0r+oaBzI(Q@5srN|`8`44|8@6?p7ZKJG!C~D)*5@I)oWeX1_$p33!nCd{3NFYC`3XvRgFkcO!xUwL$FVA4%7MBXFZ` zEPJk-+?~A5-s*;0pRz06M_fT_z-Q5-XtxE?;rV2b8bOC4Ne)A@YZf!!V>#~OZt5))e=B}d_(6*c(d-E%&lFB4?b z7}h-=eeg(#9OSEr<#b2Jheq)x#6nLWc7H7Nm{HTL>FJMBj;aUmTNFLVP(%2_ip)@9 zg%@md98d>)Ar30WqmorqF&ibjI&}*Tf!)0t%HyG70_?Lr2|$;#w-OMMQeJ0_GF`<_ z#CAmelmT^l2Au*?j;L~`$%@>{dCL~$@dJUw8&4UkiW3onM6--_J4BhH*++>;0{%E% z$s965OM>hkaA^_R!xr|G6MJljUhhoMga3d)_jwdPnAnvBIV`?JabXc$C@NejRqI@R zjf<&Hh43?^`uPl~S*dI))xZGQF#Gr)Vsd!$Aqv%GzTPlHMDY2fs6bSiM$4(0j{zBS_m4(Q<1G#{Svf2*fDFfL-l_zNus}ebG06 zLA@Mry^bszo?vJ5ZH(Lv+pw*@k*~aZgS#*H=Ufu%hxUg<#hzAZr#KU)DZZb?xD}_k znht~jY1?GaaamW}Wan7gE_;^CmbXps%mI+CZkz0TTy{s>WT#poThlgKH<#Vh zHrYwZZI?aye<3?A1$yh+=EE^AyRU7s*#jZl*f!bMx$LpF$&Ru?*4;MQMlO4{ZL%X$ zA=}h8*@IlRxoxsT20^x^ZL<5g?A5l(4jK$uX{?xG{`1&;k;?|QO*SPBvZl7l)^XX0 zw#i!3A!}}%?6X`psco`-hRC_{g8|x;jDE6pth#%t?v1H7FbEGgFt5e%hZvKw>2VIl zM3>VGtbL(i-5{hq!00$kF5)7_nExEsnqhD=t!-|09}Zc2+hligSx4JsBS%0sr){!3 zxNL6QWV?=pY<}Bhw{zJ=ZIkV6hiq}%WUIMsY1?EwWMI0!{I^?C!M)AN(eWtY&(v8?Op}w*!k))S_xO6gSfbd_hcxBFW z8+b+LMXm#>#-@^MRW*m;M|@2{yfQt3xScvh>45mhTg?GvkIwuoAQ8G+3xIe=qH4?q z#EiE&{P?3Hn}8&tHZv z;(b7hm1b}~cn-<`Tthmmi{f9o3^wOZ{@g=t+4F#^74shCAP{}uyMb6WV|nunOBds{ zj=DqR#`x!J$mApPt@!PSiWu;AOfvZ*-8q6!0RJU|Dr5uXa`?8M|F|A~0=iJR zdku(H7cC>61u0KCHJKO$L0HSZe6d*2L16DWz@hQ_=Z6lCHx`cWN zh+SuFFA)9#D4c!;h*gUOa&CU{?RaLbi~8G;$Ja6K3sTkhyd{cAob=30gBUHo<#Isvak@G-!mil<~Eg-kfp&(?pex&pVqR;s( zAo;plxj^i?2o(WYq-*^>K+2uEw%!k@MHl?XfaGee=gvM4BwycFAd=4fhd|18dRl-K z>$<~;QIgO5-`gMYfX-^h@Y}9DK64f8Tug_ILz{xQL*sz(KXT%?Fiaw)&Ja1W4p~r#b>x}IOQm$+3dq5g>@!;eCs?MR`fD|hkuo0|pd?)+Vu0wAcOa1I zn(Fyte5uDwPawua#tc1P)iZ$Tn|&(~m(Es67i3o>>Ug6?Ary#&Q<2+NE-opAKkB*K zW9(7L6zdc{3nWPwvxD3iI#qQDPrw&1D_JP1XIPJ(kGkOB1u4}jYDP8n1u+-m-NAo6 zu}G)-I%Gn1T^tpPw(6QOkR?x*!v$E93KP{%I7XGR1au}uG&c;p8dOO>=Ph0nBvqSkM)xO zF{I?ynZF2`9JJQ!A_=>3`RfFv#t8dr{JGaDfRdCf=Aq@EkwDZVj0c&`WpwRW0mQ7- z^2DP8$Ua>&9t6^;8-)!(a{RR&7B}_|pdu~Qs}|q7Y+eyUtqdZM`A;B|rpfSHKLFXM zwSHB}%4PGH7E5Mbt$?oTkMg{cjsa4PW;nf23Lt$iW&knkyq*W7T$hf^cr9I9?*WpV z>bq5XfXnETZ!eH)u9^408tQieEz$+{Dmh{)GL8-aqr%-3`nWY>Bl+Z@NIoPN0jdH*m?^H zKYySlPGSCYKn|VxZ-CTkfkj*S`!Oj{*RQ`rrde03Qv`yq)#6T@fgIDx3<6Rk5dKR& ze6j$c89ptW1EfjUvL!$qI@PxUNz(SXGGVOfmlopg^6E$AR#V znx4w87^A#J%X7~Ag#9v8PH=t;(H%NZJ9SeRMYS>)?E$1z=ldWaE{_*nM9Ko9Kg>-7 za!jkGOf@*F=y%ccoe(P5b@)mkH9CjZ0a>IOgQEHT%;O!k+&qQMRb8#8f$)XSn{Kah z8C?v{bVCO7AbQ*SGlURuQ7vyFpTUtzx=F(jiJ0k}HUX*AnUCi(n$z4B8<4ZQzML9~ z46fEGnhznXZrGFn$&zztS)hyJa3FSm`tfc*#{z2BDVhT$ zLWisbA}NE!(^eNpU<^K?^?Az*Z{wYoqtmx@Kx(|t2snEnpd7?mZ3joj0de5S?RD{HAj+F* zaMhk(0%VV_J6u5cVbmMf2Y}@39NGhfFIP_0n0nU7MnD&$0}yJ0fVcJk1j0++*8c{C zf4oQ+{QEU-T`e<^7F{Q%0#W8Z?+P{zP_xd*LLd%Z%kJWevPXcixs676n+DSkrUB-S4WRIfSBXb3aevR*fe^RwY*Vg_(?7C)* z1d^+3{VX7o>Y`@_TL`F5*Va3L=x3`%go@nHHN(lUII`Y#ErQ0SgOD u<}bpSE-kU(|1scEduw3{w%0|LfmQ|TkjHhUOq@2xl02}Xwm{z7?f(G4fWXTD diff --git a/bin/KIN07DAI.exe b/bin/KIN07DAI.exe index a1a6bd2daaa60c9bcdcfa71d225c476702d81615..0c3abcc62fb6a177e6e865d0b3a84a551b9c8ba7 100644 GIT binary patch delta 110 zcmZ4ejC1uf&IujNSJpdC?Dl1j-NLl-c7Pe5n7S#WN4KlMafgg6mJFLM&DSb%7#kQE znphZ^Onw(ROTgGb!N|bKOu@j=%EZD7DA>rNvH3uhizvvXX7+;Z>;;T>!#Ru$OyUjn Nk{PzYInHRm8US{2C5-?8 delta 110 zcmZ4ejC1uf&IujNcMmyC?Dl28tiZhSc7Pe5h`K4GN4KlMafb|B6Q<3U=4+KWj4TXI zfWUO}yU1ArMivT221aHIh9*`fKx8_(kws(kfhZSIkV(z#1>4yR81II2m>3xv#T)1) LZ+~-~(S9`mQNkrt diff --git a/bin/KIN08DBU.exe b/bin/KIN08DBU.exe index 1f066c210cd74226794482ca9a1a147f0133c5e0..2e0e08856100ab2591c78e8f22b60c18c580782b 100644 GIT binary patch delta 110 zcmaFyh3mx^t_dB?SJyjD?Dl1{>fLy2eJr1tx+$Yax2wQ$hm0$h44bFN_3LvO8yFax zSQwa0*6Uj*U~HgZWME{bU|?uvVqpaoY-BOntkC~N3}jF<`?Brq%NXxOa~c^K7{nXs NB{OV)!^l*#0|57LCcgjx delta 110 zcmaFyh3mx^t_dB?suqqDyM39moi^TDAIm4AZp!G}$5OuVK6!$zft*5O1KD M%&`3pE7P7$0EK)eH~;_u delta 109 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 delta 5272 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 diff --git a/bin/SUB02MSG.dll b/bin/SUB02MSG.dll index ebb8af962b9bb1a68baf9b8703be3c11a48af035..3e12e9081a94b0fc84a5ac82ab7cad9cdae41972 100644 GIT binary patch delta 7224 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 delta 7239 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 m(2KhutGHe diff --git a/bin/SUB03END.dll b/bin/SUB03END.dll index 8db214357dda1a8b698cae67cfe96b7d89ef0b02..b15f4a42f6959fabd1b0ad1f4a0090af03a998ec 100644 GIT binary patch delta 6545 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

  • mapW>O+&bq!}Ba^uRNg4az~2E z>bU_cvrNy5aIdh!v}tG6V)gz~s-P5ylrIh^24?M#JJ(>>TqB-V`5+C^_)bpOwh;QV zHj20Q`kp1!+Vs6?X`V#EciJ7GwziVu4~*Zx%m{fTQZHm4XZ`(t57h?&V37H@B2}_+%hyX z<2IQTub^Er7k}$YWtwweu>NERSS=Gi#>CojhiV0S5pG19>0n|k8cV>EA(8F{`ON^?T1 z#Kp(rh&**{tjFtIq1AhAG6{Y-#;54Y<70{2b-a+szaO7MB=UsUC`=fYo_K%+&z{I4 z^2rJQVi|Tajkvs%i-;UPN%uu9xO==znl}_V9)|aD=7nH?*JHomBk{rR zx5;YNDek}P6!-tdslOoTI{K%F`MLPD=M`dKIUTQ%?&mIhxIIU-3J(-xIpYKa^q|?# z#H|+mN_i|?qQQe<4+ zXFlXPHl0nR+|HkkmeuY>l^^ksc2h?Mv(BH0;&0DxBdy2X-w;`Ij&F|Ea~~n+T6z8^ zpAGXaa!(BxxvHf%+jD2RfZiY~un`Z&@E>I&2XSkf=nYqvBlixoS>naxb(Fn;$|fpp ztw$aeBgN;rs8D?#3YjfMf-j@ZH6gI5)xste<7NNGC->KeGVMn1Bn8RvKK^>1+BcfG z(muX9TKbM6=bHTLF5aKlU*lE%^cwv}qS;^HM8ZG3-ol0BFXa8sV3{u49qzcY`)k^5JuR{oRExE;|u6O?{)Q9*lzCFOVb;A!Qh)w)4gKvY%U#LaetzURE zn(rPV&hft=l8)t9g$Jenqx6vmpk1YB z7=Q+qUM^{yL0G(PfCPCrn8Z`UgNgJSWhw7k1rpDbcmd-2BqL0h2dhrXJ$6;{ayn%Q z-XrlRhv1GeqA96E@G6P748a-Ba!T*4{*4jntmu&@NFX}f1az^}8%!{r=-ZM8nMLs# zW=NIoG4a0oQD5uu%+e22`U_@wQ1&-U#-t_fMLGRIrQbz!bn8yGz@-Qu`pV({H4gfG z3F~vf7km?)oD65duHQ(8XhSbrJNTo1BpE`WPQVsi$SQgqtt;tZH>4n6z(vX|(5q%a ztX`1<@n93`Cs54jF{0~(6i}3QRj(?ASohCUAP$<*N5XQZ zZg`m$uOyJOR#9AJSyVhM!lo&Ny&%1x7AmkA;JGQdx{EnMhzX<&9cGGLAhJ?<@; z@EKqsF*6~;U6&1e01Aj1t*7Ne1$64D5EaJ1gRx@V{Int}X)J!>|!f?_j>hTr)eTu_uO$$eY^t3avZT)4Ze5IzQ_)1cp82BY0e zAI7N4RUxCLaew^?WT?RO%2Mp$>=L+(IpcE#7gj8U9>6wmVb)@7uU+q63~w0hI677R zbP;CQlL|iiz9n!C+TEy!?r(dS&@7~PoG9((Ufe&H!Oy5-bYnjFt9F@tXE{XEdY;~b z&Tdb^l&-Eo6NVBFCP>rOt+;CW`Zyvz`Ya;xdL@xGUE2yJ zL0MiO6ohWb{mQ;=_$2{-EZl}ZnEv55NC{juD4FN+mRYPvH=y7uwT>r24(@Ql$_6M2 ztQzF`5xi7&>hF`F4)q2sj-jAf&uqkRWf<~cBWxlX+62>a<(y4C;cZQjf-ODY1SR;g z2;2@cg8K30Kj1{euVA+o{ju%XoL>F%cK8MR{aQ0xnf3o660hIif+SR5(Sja}^_CX= zeKkveUKkZz_LO5kK={0 L*uA+8J`DIjn28Si diff --git a/bin/SUB04CHK.dll b/bin/SUB04CHK.dll index bff4aaa4aa273ffbd20700f3de4997f726df641f..29439388fc5090df3d2b74f1a4ed4141db908202 100644 GIT binary patch delta 16890 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 delta 16830 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 THk>(02Yb-L4R>CrAwmBS=B5!f diff --git a/bin/SUB05TIM.dll b/bin/SUB05TIM.dll index 0bde1dc30a3cc6be93897a080b2141c916f12cb9..42500f6f8db5545cad530b6f42b082ac2314cc2d 100644 GIT binary patch delta 6817 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 delta 6834 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 OI9i)rFYkfnLH`SdeIwQY diff --git a/bin/ZAN01CHK.exe b/bin/ZAN01CHK.exe index 6bd3d5a3933b71e6dbad77e35d8cab374a71f173..6c747a5218a0d706e1d40837f3ba2b13b7ad3170 100644 GIT binary patch delta 10390 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 Trl-k%GccGY$LJaSMA-iTQCss} diff --git a/bin/ZAN02CHK.exe b/bin/ZAN02CHK.exe index f8aa4659756d9206a59daf69cc3165788746b113..92f9309dcda1a80d4e90bd2ffc40484d81eb3e7e 100644 GIT binary patch delta 9425 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 bMSN=ix|_oMObm8fx{ILg@O)at&&B*V7yQ|H delta 9496 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 diff --git a/bin/ZAN04MAT.exe b/bin/ZAN04MAT.exe index 4d12394ced44a8e4baf1bb1417e1bb725fe6982c..93ddb4b5cfcc077ea143e6ebee01306dcd987a04 100644 GIT binary patch delta 9491 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 delta 9325 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 diff --git a/bin/ZAN06UPD.exe b/bin/ZAN06UPD.exe index d2ddbafa19cacfd9a11c2e8218e7e79c9d8faff8..c3e5eb230aeb70e8ff31320e0b228b0193f20620 100644 GIT binary patch delta 38746 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 z z+**9a)|HiJ^7NfrSGw>HIr~PfD;+;>qLX|+kVVDoa9~~TO3Ms}kUII=@vhX=AdogT PZ;UHt=rfxYdzb$Yu7Z#* diff --git a/cpy/KIN01REC.cpy b/cpy/KIN01REC.cpy new file mode 100644 index 0000000..e37f46c --- /dev/null +++ b/cpy/KIN01REC.cpy @@ -0,0 +1,12 @@ + * + * 勤怠: 休暇申請中間レコード WORK-LEAVE 80B + * + 03 (A)APPL-ID PIC 9(009). + 03 (A)EMP-ID PIC X(008). + 03 (A)LEAVE-TYPE PIC X(002). + 03 (A)START-DATE PIC 9(008). + 03 (A)START-TIME PIC 9(004). + 03 (A)END-DATE PIC 9(008). + 03 (A)END-TIME PIC 9(004). + 03 (A)STATUS PIC X(001). + 03 (A)FILLER PIC X(036). diff --git a/cpy/KIN02REC.cpy b/cpy/KIN02REC.cpy new file mode 100644 index 0000000..4bb3fc7 --- /dev/null +++ b/cpy/KIN02REC.cpy @@ -0,0 +1,10 @@ + * + * 勤怠: 日別展開休暇レコード LEAVE-DAILY 80B + * + 03 (A)EMP-ID PIC X(008). + 03 (A)DATE PIC 9(008). + 03 (A)LEAVE-TYPE PIC X(002). + 03 (A)START-TIME PIC 9(004). + 03 (A)END-TIME PIC 9(004). + 03 (A)APPL-ID PIC 9(009). + 03 (A)FILLER PIC X(045). diff --git a/cpy/KIN03REC.cpy b/cpy/KIN03REC.cpy new file mode 100644 index 0000000..9523a9c --- /dev/null +++ b/cpy/KIN03REC.cpy @@ -0,0 +1,16 @@ + * + * 勤怠: 打刻休暇照合レコード KIN-LEAVE 160B + * + 03 (A)EMP-ID PIC X(008). + 03 (A)WORK-DATE PIC 9(008). + 03 (A)STR-TIME PIC 9(004). + 03 (A)END-TIME PIC 9(004). + 03 (A)DEPT-ID PIC X(004). + 03 (A)TERMINAL PIC X(006). + 03 (A)FILLER-1 PIC X(046). + 03 (A)LEAVE-TYPE PIC X(002). + 03 (A)LEAVE-STR-TIME PIC 9(004). + 03 (A)LEAVE-END-TIME PIC 9(004). + 03 (A)LEAVE-HOURS PIC 9(004)V9(001). + 03 (A)APPLICATION-ID PIC 9(009). + 03 (A)FILLER-2 PIC X(056). diff --git a/cpy/KIN08REC.cpy b/cpy/KIN08REC.cpy new file mode 100644 index 0000000..cfc3409 --- /dev/null +++ b/cpy/KIN08REC.cpy @@ -0,0 +1,11 @@ + * + * 勤怠: 欠勤集計中間ファイル ABSENCE-SUMMARY 80B + * + 03 (A)EMP-ID PIC X(008). + 03 (A)YEAR-MONTH PIC X(006). + 03 (A)ANNUAL-LEAVE-H PIC 9(004)V9(001). + 03 (A)PERSONAL-LEAVE-H PIC 9(004)V9(001). + 03 (A)OFFICIAL-LEAVE-H PIC 9(004)V9(001). + 03 (A)SICK-LEAVE-H PIC 9(004)V9(001). + 03 (A)ABSENT-H PIC 9(004)V9(001). + 03 (A)FILLER PIC X(041). diff --git a/cpy/KIN09REC.cpy b/cpy/KIN09REC.cpy new file mode 100644 index 0000000..03dcf20 --- /dev/null +++ b/cpy/KIN09REC.cpy @@ -0,0 +1,4 @@ + * + * 勤怠: CSV出力レコード CSV-OUTPUT 200B + * + 03 (A)CSV-LINE PIC X(200). diff --git a/src/KIN03EXP.cbl b/src/KIN03EXP.cbl index 7ea3d14..3e17a29 100644 --- a/src/KIN03EXP.cbl +++ b/src/KIN03EXP.cbl @@ -208,72 +208,61 @@ 1000ITTSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(1.1) * - * サブモジュール名:C1初回FETCH処理 * - * 処理概要 : LEAVE_RECORDSをSELECT INTO(初回のみ) * + * サブモジュールNO:(1.1) * + * サブモジュール名:C1 OPEN + 初回FETCH処理 * + * 機能概要 : C1(CURSOR FOR LEAVE_RECORDS)のOPEN+FETCH * ***************************************************************** 1100C1INITSOR SECTION. * - MOVE SPACES TO SQL-APPL-ID. - EXEC SQL - SELECT APPLICATION_ID, EMP_ID, LEAVE_TYPE, - START_DATE, START_TIME, - END_DATE, END_TIME - FROM LEAVE_RECORDS - WHERE STATUS = '1' - ORDER BY EMP_ID, START_DATE - INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE, - :SQL-START-DATE, :SQL-START-TIME, - :SQL-END-DATE, :SQL-END-TIME - END-EXEC. + *** C1 DECLARE + EXEC SQL + DECLARE C1 CURSOR FOR + SELECT APPLICATION_ID, EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, + END_DATE, END_TIME + FROM LEAVE_RECORDS + WHERE STATUS = '1' + ORDER BY EMP_ID, START_DATE + END-EXEC. * - IF SQLCODE = 0 - ADD 1 TO CUN-R01INN - ELSE - MOVE '1' TO WRK-R01EOF - END-IF. + *** C1 OPEN + EXEC SQL + OPEN C1 + END-EXEC. * - 1100C1INITSOR-EXT. + *** C1 初回FETCH + IF SQLCODE = 0 + EXEC SQL + FETCH C1 + INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE, + :SQL-START-DATE, :SQL-START-TIME, + :SQL-END-DATE, :SQL-END-TIME + END-EXEC + IF SQLCODE = 0 + ADD 1 TO CUN-R01INN + ELSE + MOVE '1' TO WRK-R01EOF + END-IF + ELSE + MOVE '1' TO WRK-R01EOF + END-IF. + * + 1100C1INITSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(1.2) * - * サブモジュール名:C1次回FETCH処理 * - * 処理概要 : br_fetch_nextで次行を読込(2回目以降) * + * サブモジュールNO:(1.2) * + * サブモジュール名:C1の FETCH処理 * + * 機能概要 : C1のFETCH(2回目以降) * ***************************************************************** 1100C1FETCHSOR SECTION. * - CALL 'br_fetch_next' USING SQLCODE. - * - IF SQLCODE = 0 - MOVE SPACES TO SQL-APPL-ID - MOVE 0 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-APPL-ID, WS-COL-LEN - MOVE 1 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-EMP-ID, WS-COL-LEN - MOVE 2 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-LEAVE-TYPE, WS-COL-LEN - MOVE 3 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-START-DATE, WS-COL-LEN - MOVE 4 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-START-TIME, WS-COL-LEN - MOVE 5 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-END-DATE, WS-COL-LEN - MOVE 6 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-END-TIME, WS-COL-LEN + EXEC SQL + FETCH C1 + INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE, + :SQL-START-DATE, :SQL-START-TIME, + :SQL-END-DATE, :SQL-END-TIME + END-EXEC. + IF SQLCODE = 0 ADD 1 TO CUN-R01INN ELSE MOVE '1' TO WRK-R01EOF @@ -282,31 +271,38 @@ 1100C1FETCHSOR-EXT. EXIT. ***************************************************************** - * サブモジュールNO:(1.3) * - * サブモジュール名: 休日カレンダー読込処理 * - * 処理概要 : HOLIDAY_CALENDARをWORKING-STORAGEに格納 * + * サブモジュールNO:(1.3) * + * サブモジュール名: HOLIDAY_CALENDARの読込み * + * 機能概要 : HOLIDAY_CALENDARをWORKING-STORAGEに読込 * ***************************************************************** 1200HDINNSOR SECTION. * - *** C2初回FETCH(SELECT INTO) + *** C2 DECLARE EXEC SQL + DECLARE C2 CURSOR FOR SELECT HOLIDAY_DATE FROM HOLIDAY_CALENDAR ORDER BY HOLIDAY_DATE + END-EXEC. + * + *** C2 OPEN + 初回FETCH + EXEC SQL + OPEN C2 + END-EXEC. + * + EXEC SQL + FETCH C2 INTO :SQL-HD-DATE END-EXEC. * - *** 休日テーブルに全件読込 + *** HOLIDAY_CALENDARの読込み PERFORM UNTIL SQLCODE NOT = 0 ADD 1 TO WRK-HD-COUNT MOVE SQL-HD-DATE TO WRK-HD-DATE(WRK-HD-COUNT) - CALL 'br_fetch_next' USING SQLCODE - IF SQLCODE = 0 - MOVE 0 TO WS-COL-IDX - MOVE 256 TO WS-COL-LEN - CALL 'br_get_col' USING - WS-COL-IDX, SQL-HD-DATE, WS-COL-LEN - END-IF + EXEC SQL + FETCH C2 + INTO :SQL-HD-DATE + END-EXEC END-PERFORM. * 1200HDINNSOR-EXT. @@ -461,6 +457,15 @@ ***************************************************************** 3000STPSOR SECTION. * + *** CURSOR CLOSE + EXEC SQL + CLOSE C1 + END-EXEC. + * + EXEC SQL + CLOSE C2 + END-EXEC. + * *** 出力ファイルCLOSE CLOSE W01OUTFIL. * diff --git a/sub/SUB01DAT.cbl b/sub/SUB01DAT.cbl index 45322fb..4f46bd4 100644 --- a/sub/SUB01DAT.cbl +++ b/sub/SUB01DAT.cbl @@ -34,9 +34,7 @@ ***************************************************************** LINKAGE SECTION. * - 01 D01UBSPAR. - 03 D01FKICOD PIC S9(004) COMP. - 03 D01UBSUDATE PIC 9(008). + COPY ZANDATAC. * PROCEDURE DIVISION USING D01UBSPAR. ***************************************************************** diff --git a/sub/SUB02MSG.cbl b/sub/SUB02MSG.cbl index da735b7..880f4c6 100644 --- a/sub/SUB02MSG.cbl +++ b/sub/SUB02MSG.cbl @@ -33,18 +33,7 @@ ***************************************************************** LINKAGE SECTION. * - 01 M00MHOPAR. - 03 M00MSGCOD PIC 9(003). - 03 M00UMKDATS22-01 PIC X(030). - 03 M00UMKDATS22-02 PIC X(030). - 03 M00UMKDATS22-03 PIC X(030). - 03 M00UMKDATS22-04 PIC X(030). - 03 M00UMKDATS22-05 PIC X(030). - 03 M00UMKDATS22-06 PIC X(030). - 03 M00UMKDATS22-07 PIC X(030). - 03 M00UMKDATS22-08 PIC X(030). - 03 M00UMKDATS22-09 PIC X(030). - 03 M00UMKDATS22-10 PIC X(030). + COPY ZANMSGAC. * PROCEDURE DIVISION USING M00MHOPAR. ***************************************************************** diff --git a/sub/SUB03END.cbl b/sub/SUB03END.cbl index 3467ca0..37a899c 100644 --- a/sub/SUB03END.cbl +++ b/sub/SUB03END.cbl @@ -33,8 +33,7 @@ ***************************************************************** LINKAGE SECTION. * - 01 E01ABDPAR. - 03 E01ABDCOD PIC 9(003). + COPY ZANENDAC. * PROCEDURE DIVISION USING E01ABDPAR. ***************************************************************** diff --git a/sub/SUB04CHK.cbl b/sub/SUB04CHK.cbl index 2fbe4b3..222e389 100644 --- a/sub/SUB04CHK.cbl +++ b/sub/SUB04CHK.cbl @@ -27,7 +27,8 @@ ***************************************************************** 01 WRKARA. 03 WRK-RETURN-CODE PIC 9(004). - 03 WRK-SIGN PIC S9(004). + * 03 WRK-SIGN PIC S9(004). + 03 WRK-NN PIC 9(004). 03 WRK-DIGIT PIC 9(004). 03 WRK-ALPHA PIC 9(004). @@ -37,10 +38,7 @@ ***************************************************************** LINKAGE SECTION. * - 01 C01CHKPAR. - 03 C01CHKTYP PIC X(008). - 03 C01CHKDAT PIC X(080). - 03 C01CHKRRC PIC 9(004). + COPY ZANCHKAC. * PROCEDURE DIVISION USING C01CHKPAR. ***************************************************************** @@ -141,7 +139,8 @@ GO TO 3000CHKNUM-EXT END-IF. *** 数字(0-9)とスペースのみをカウント - INSPECT C01CHKDAT + MOVE ZERO TO WRK-NN. + INSPECT C01CHKDAT TALLYING WRK-NN FOR ALL "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" diff --git a/sub/SUB05TIM.cbl b/sub/SUB05TIM.cbl index 5266721..2d8dcb4 100644 --- a/sub/SUB05TIM.cbl +++ b/sub/SUB05TIM.cbl @@ -34,10 +34,7 @@ ***************************************************************** LINKAGE SECTION. * - 01 T01TIMPAR. - 03 T01TIMHRS PIC 9(004)V9(001). - 03 T01TIMOUT PIC 9(004)V9(001). - 03 T01TIMRRC PIC 9(004). + COPY ZANTIMAC. * PROCEDURE DIVISION USING T01TIMPAR. ***************************************************************** diff --git a/使用資源一覧/KIN03EXP_使用資源一覧.md b/使用資源一覧/KIN03EXP_使用資源一覧.md index b545324..8a662fe 100644 --- a/使用資源一覧/KIN03EXP_使用資源一覧.md +++ b/使用資源一覧/KIN03EXP_使用資源一覧.md @@ -28,8 +28,6 @@ | SUB01DAT | 運用日付取得 | 1000ITTSOR | | SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | | SUB03END | ABEND処理 | 9999ABDSOR | -| br_fetch_next | SQLカーソル次行FETCH(bridge) | 1100C1FETCHSOR, 1200HDINNSOR | -| br_get_col | SQLカラム値取得(bridge) | 1100C1FETCHSOR, 1200HDINNSOR | ## 使用DB2テーブル @@ -43,14 +41,20 @@ | SQL種別 | 処理 | 実行条件 | 使用箇所 | |---------|------|---------|---------| | CONNECT | TO 'data/kin.db' | 常時 | 1000ITTSOR | -| SELECT | HOLIDAY_DATE FROM HOLIDAY_CALENDAR | 常時(初回のみ) | 1200HDINNSOR | -| SELECT | LEAVE_RECORDS(全件) | 常時(初回のみ) | 1100C1INITSOR | +| DECLARE C1 CURSOR | SELECT FROM LEAVE_RECORDS | 常時 | 1100C1INITSOR | +| OPEN C1 | CURSOR OPEN | SQLCODE=0 | 1100C1INITSOR | +| FETCH C1 | INTO 変数(初回+次回) | SQLCODE=0 | 1100C1INITSOR, 1100C1FETCHSOR | +| DECLARE C2 CURSOR | SELECT FROM HOLIDAY_CALENDAR | 常時 | 1200HDINNSOR | +| OPEN C2 | CURSOR OPEN | 常時 | 1200HDINNSOR | +| FETCH C2 | INTO :SQL-HD-DATE(全件) | SQLCODE=0 | 1200HDINNSOR | +| CLOSE C1 | CURSOR CLOSE | 常時 | 3000STPSOR | +| CLOSE C2 | CURSOR CLOSE | 常時 | 3000STPSOR | ## 処理フロー 1. 初期処理(開始メッセージ→DB接続→運用日付取得) 2. 休日カレンダー全件読込(WORKING-STORAGEに格納) 3. 出力ファイルOPEN -4. DB初回FETCH(LEAVE_RECORDS:STATUS='1'、ORDER BY EMP_ID, START_DATE) +4. C1 DECLARE/OPEN/初回FETCH(LEAVE_RECORDS:STATUS='1'、ORDER BY EMP_ID, START_DATE) 5. 社員番号キーブレイクループ - 社員別に期間内を日別展開 - 週末判定(MOD(INTEGER-OF-DATE,7)=0/6)→除外 @@ -58,4 +62,4 @@ - 非週末・非休日 → LEAVE-DAILY出力 - 日付加算(月跨ぎ/閏年対応) - キーブレイク時:社員別小計メッセージ出力 -6. 終了処理(CLOSE→件数出力→終了メッセージ) +6. 終了処理(CURSOR CLOSE→出力CLOSE→件数出力→終了メッセージ) diff --git a/品質管理/COBOLキーワード網羅定義書.md b/品質管理/COBOLキーワード網羅定義書.md new file mode 100644 index 0000000..7634bae --- /dev/null +++ b/品質管理/COBOLキーワード網羅定義書.md @@ -0,0 +1,354 @@ +# COBOLキーワード網羅定義書 + +## 凡例 +- ◎: 使用中 / 対象 +- ○: 定義あり・未使用 +- △: 未定義 +- 出典: COBOL言語解説書_IBM_zOS_V65.md / IBM Enterprise COBOL 標準予約語 / 実装時の実績フィードバック + +--- + +## 1. COBOL予約語一覧(全205語) + +### A + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 1 | ACCEPT | 高頻度 | 予約語(文) | システム日付・時刻・ユーザ入力の受取り。DATE/DAY/TIME/DAY-OF-WEEK等のFROM句でシステム情報を取得。 | PROCEDURE DIVISION | ACCEPT文(FROM DATE/TIME/DAY/DAY-OF-WEEK) | +| 2 | ACCESS | 低頻度 | 予約語(句) | ファイルのアクセスモード指定(ACCESS MODE IS SEQUENTIAL/RANDOM/DYNAMIC)。 | ENVIRONMENT DIVISION, FILE-CONTROL | ACCESS MODE句 | +| 3 | ADD | 高頻度 | 予約語(文) | 加算。ROUNDED、SIZE ERROR、CORRESPONDING句をサポート。`ADD identifier TO identifier [ROUNDED]` 等。 | PROCEDURE DIVISION | ADD文(TO/GIVING/CORRESPONDING/ROUNDED/SIZE ERROR) | +| 4 | AFTER | 高頻度 | 予約語(句) | WRITE文の改行制御(AFTER ADVANCING)。INSPECT文の位置指定(AFTER identifier)。 | PROCEDURE DIVISION | WRITE文(AFTER ADVANCING句)、INSPECT文 | +| 5 | ALL | 高頻度 | FIGURATIVE CONSTANT / 予約語 | FIGURATIVE CONSTANTとしてリテラル文字列の繰り返し。INSPECT文のALL指定。関数ALL組み込み指定。 | PROCEDURE DIVISION, DATA DIVISION | INSPECT文、REPLACING句、FIGURATIVE CONSTANT | +| 6 | ALPHABETIC | 高頻度 | 予約語(クラス条件) | クラス条件で使用。英字(A-Z, a-z, スペース)のみで構成されているかの判定。 | PROCEDURE DIVISION | クラス条件(IF ALPHABETIC) | +| 7 | ALPHABETIC-UPPER | 高頻度 | 予約語(クラス条件) | クラス条件で使用。大文字英字(A-Z, スペース)のみで構成されているかの判定。 | PROCEDURE DIVISION | クラス条件 | +| 8 | ALSO | 高頻度 | 予約語(句) | EVALUATE文の複数条件指定(ALSO subject)。 | PROCEDURE DIVISION | EVALUATE文 | +| 9 | AND | 高頻度 | 予約語(論理演算子) | 複合条件の論理積(AND条件)。 | PROCEDURE DIVISION | 条件式 | +| 10 | ANY | 高頻度 | 予約語 | SEARCH ALLのWHEN条件内での使用等。 | PROCEDURE DIVISION | SEARCH文 | +| 11 | APPLY | 高頻度 | 予約語(句) | I-O-CONTROL段落でWRITE-ONLY等の適用を指定。`APPLY WRITE-ONLY ON file-name`。 | ENVIRONMENT DIVISION, I-O-CONTROL | I-O-CONTROL段落 | +| 12 | ASCENDING | 高頻度 | 予約語(句) | SORT/MERGEの昇順キー指定。OCCURSのASCENDING KEY指定。 | PROCEDURE DIVISION, DATA DIVISION | SORT文、MERGE文、OCCURS句 | +| 13 | ASSIGN | 高頻度 | 予約語(句) | SELECT文でファイルと外部名を関連付け。`SELECT file-name ASSIGN TO assignment-name`。 | ENVIRONMENT DIVISION, FILE-CONTROL | SELECT文 | +| 14 | AT | 高頻度 | 予約語(句) | READ文のAT END句。WRITE文のAT END-OF-PAGE句。SEARCH文のAT END句。 | PROCEDURE DIVISION | READ文、WRITE文、SEARCH文 | +| 15 | AUTHOR | 低頻度 | 予約語(段落) | IDENTIFICATION DIVISIONの段落(ドキュメント用)。現行COBOLでは省略可能。 | IDENTIFICATION DIVISION | IDENTIFICATION DIVISION段落 | +| 16 | BINARY | 高頻度 | USAGE句 / 予約語 | 2進形式の内部表現(COMP/COMP-4/BINARY)。`USAGE BINARY`または`COMP`。 | DATA DIVISION | USAGE句、PICTURE句 | + +### B + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 17 | BLOCK | 高頻度 | 予約語(句) | FDの物理ブロックサイズ指定。`BLOCK CONTAINS integer RECORDS/CHARACTERS`。 | DATA DIVISION, FILE SECTION | FD句(BLOCK CONTAINS) | +| 18 | BY | 高頻度 | 予約語(句) | PERFORM VARYINGの増分指定(BY identifier)。CALL文の引数渡し(BY REFERENCE/CONTENT/VALUE)。MULTIPLY/DIVIDE文の演算子。 | PROCEDURE DIVISION | PERFORM文、CALL文、MULTIPLY文、DIVIDE文 | + +### C + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 19 | CALL | 高頻度 | 予約語(文) | サブプログラム呼出。`CALL literal/identifier USING data-name RETURNING identifier [ON EXCEPTION imperative]`。 | PROCEDURE DIVISION | CALL文(USING/RETURNING/ON EXCEPTION/ON OVERFLOW) | +| 20 | CHARACTER | 低頻度 | 予約語 | OBJECT-COMPUTER段落のMEMORY SIZE単位指定。特殊文字語。 | ENVIRONMENT DIVISION | OBJECT-COMPUTER段落 | +| 21 | CHARACTERS | 高頻度 | 予約語(句) | BLOCK/RECORD CONTAINSの単位。INSPECT文の対象指定(CHARACTERS)。 | DATA DIVISION, PROCEDURE DIVISION | FD句、INSPECT文 | +| 22 | CLOSE | 高頻度 | 予約語(文) | ファイルのクローズ。`CLOSE file-name [WITH LOCK/NO REWIND/REEL/FOR REMOVAL]`。 | PROCEDURE DIVISION | CLOSE文(WITH LOCK/NO REWIND/REEL/FOR REMOVAL) | +| 23 | COMP | 高頻度 | USAGE句 | 2進形式内部表現(USAGE COMP = USAGE BINARY = USAGE COMP-4)。 | DATA DIVISION | USAGE句 | +| 24 | COMP-3 | 高頻度 | USAGE句 | パック10進形式内部表現。`USAGE COMP-3`。 | DATA DIVISION | USAGE句 | +| 25 | COMP-4 | 低頻度 | USAGE句 | COMPと同義(2進形式)。環境によってCOMP(2進)とCOMP-4(ネイティブ2進)が異なる場合あり。 | DATA DIVISION | USAGE句 | +| 26 | COMPUTE | 高頻度 | 予約語(文) | 計算代入。複数の算術演算を組合せ可能。`COMPUTE identifier [ROUNDED] = arithmetic-expression [ON SIZE ERROR]`。 | PROCEDURE DIVISION | COMPUTE文(ROUNDED/SIZE ERROR) | +| 27 | CONDITION | 低頻度 | 予約語 | 条件名(Condition-name)の定義内で使用。 | DATA DIVISION | 条件名(88レベル) | +| 28 | CONFIGURATION | 高頻度 | 予約語(節) | ENVIRONMENT DIVISIONの構成節。`CONFIGURATION SECTION.`。 | ENVIRONMENT DIVISION | CONFIGURATION SECTION | +| 29 | CONTAINS | 高頻度 | 予約語(句) | FDのBLOCK CONTAINS/RECORD CONTAINS句で使用。 | DATA DIVISION, FILE SECTION | FD句 | +| 30 | CONTINUE | 高頻度 | 予約語(文) | 無操作(no operation)文。条件文の何もしない分岐に使用。 | PROCEDURE DIVISION | CONTINUE文 | +| 31 | CONVERTING | 低頻度 | 予約語(句) | INSPECT文の文字変換指定。`INSPECT identifier CONVERTING identifier TO identifier`。 | PROCEDURE DIVISION | INSPECT文 | +| 32 | COPY | 高頻度 | 予約語(文) | COPYライブラリからソーステキストを組み込み。疑似テキストによる置換機能。 | ソース記述(任意の場所) | COPY文(コンパイラ指示文) | +| 33 | CORR | 高頻度 | 予約語(CORRESPONDINGの短縮形) | CORRESPONDING句の短縮形。ADD CORR / MOVE CORR / SUBTRACT CORR。 | PROCEDURE DIVISION | ADD文、MOVE文、SUBTRACT文 | +| 34 | COUNT | 低頻度 | 予約語(句) | UNSTRING文のCOUNT IN句で使用。文字数の計数。 | PROCEDURE DIVISION | UNSTRING文 | +| 35 | CURSOR | 高頻度 | 予約語 | SQLのカーソル操作(DECLARE CURSOR, OPEN CURSOR, FETCH, CLOSE CURSOR)。EXEC SQL内で使用。 | PROCEDURE DIVISION(EXEC SQL内) | SQL文 | + +### D + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 36 | DATA | 高頻度 | 予約語(区分) | DATA DIVISIONヘッダ。データ区分の開始。 | DATA DIVISION | DATA DIVISION | +| 37 | DATE | 低頻度 | 予約語(句)/ 特殊レジスタ関連 | ACCEPT文のFROM DATE句(PIC 9(6) YYMMDD)。特殊レジスタではないがシステム日付情報。 | PROCEDURE DIVISION | ACCEPT文 | +| 38 | DATE-COMPILED | 低頻度 | 予約語(段落) | IDENTIFICATION DIVISIONの段落(ドキュメント用)。 | IDENTIFICATION DIVISION | IDENTIFICATION DIVISION段落 | +| 39 | DATE-WRITTEN | 低頻度 | 予約語(段落) | IDENTIFICATION DIVISIONの段落(ドキュメント用)。 | IDENTIFICATION DIVISION | IDENTIFICATION DIVISION段落 | +| 40 | DECLARATIVES | 低頻度 | 予約語(宣言部) | 例外処理やデバッグ処理を記述する特殊な手続き領域。`DECLARATIVES. ... END DECLARATIVES.`。 | PROCEDURE DIVISION | DECLARATIVES | +| 41 | DELETE | 高頻度 | 予約語(文) | 索引ファイル/相対ファイルからのレコード削除。`DELETE file-name RECORD [INVALID KEY imperative]`。 | PROCEDURE DIVISION | DELETE文(INVALID KEY) | +| 42 | DELIMITED | 高頻度 | 予約語(句) | STRING文(DELIMITED BY)およびUNSTRING文(DELIMITED BY)で区切り文字指定。 | PROCEDURE DIVISION | STRING文、UNSTRING文 | +| 43 | DELIMITER | 低頻度 | 予約語(句) | UNSTRING文のDELIMITER IN句で使用。実際の区切り文字を格納。 | PROCEDURE DIVISION | UNSTRING文 | +| 44 | DEPENDING | 高頻度 | 予約語(句) | OCCURS DEPENDING ON(可変長表)。GO TO DEPENDING ON(条件付制御移行)。 | DATA DIVISION, PROCEDURE DIVISION | OCCURS句、GO TO文 | +| 45 | DESCENDING | 低頻度 | 予約語(句) | SORT/MERGEの降順キー指定。OCCURSのDESCENDING KEY。 | PROCEDURE DIVISION, DATA DIVISION | SORT文、MERGE文、OCCURS句 | +| 46 | DISPLAY | 高頻度 | USAGE句 / 予約語(文) | USAGE DISPLAY(標準表示形式)。DISPLAY文(出力装置への転送)。`DISPLAY identifier UPON mnemonic-name WITH NO ADVANCING`。 | DATA DIVISION, PROCEDURE DIVISION | USAGE句、DISPLAY文(UPON/WITH NO ADVANCING) | +| 47 | DISPLAY-1 | 高頻度 | USAGE句 | DBCSデータの内部表現。USAGE DISPLAY-1は2バイトDBCS文字用。 | DATA DIVISION | USAGE句 | +| 48 | DIVIDE | 高頻度 | 予約語(文) | 除算。商と余りを計算。`DIVIDE identifier INTO identifier [REMAINDER identifier]`。 | PROCEDURE DIVISION | DIVIDE文(INTO/BY/GIVING/REMAINDER/ROUNDED) | +| 49 | DIVISION | 高頻度 | 予約語 | IDENTIFICATION/ENVIRONMENT/DATA/PROCEDURE各DIVISIONヘッダで使用。 | 各DIVISIONヘッダ | 区分ヘッダ | +| 50 | DOWN | 高頻度 | 予約語(句) | SET文の索引値減少。`SET index-name DOWN BY integer`。 | PROCEDURE DIVISION | SET文 | +| 51 | DYNAMIC | 低頻度 | 予約語(句) | ACCESS MODE DYNAMIC(動的アクセスモード)。 | ENVIRONMENT DIVISION, FILE-CONTROL | ACCESS MODE句 | + +### E + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 52 | EJECT | 高頻度 | 予約語(コンパイラ指示文) | ソース一覧の改ページ指示。`EJECT`。 | ソース記述 | EJECT文 | +| 53 | ELSE | 高頻度 | 予約語(句) | IF文の否定分岐。`IF condition THEN ... ELSE ... END-IF`。条件付きコンパイルの>>ELSE。 | PROCEDURE DIVISION | IF文、条件付きコンパイル | +| 54 | END | 高頻度 | 予約語 | 各種END-xxx文の構成要素。END-IF, END-PERFORM, END-EVALUATE等。 | PROCEDURE DIVISION | END-xxxスコープターミネータ | +| 55 | END-ADD | 低頻度 | 予約語(スコープターミネータ) | ADD文の明示的終端。`END-ADD`。 | PROCEDURE DIVISION | ADD文 | +| 56 | END-CALL | 高頻度 | 予約語(スコープターミネータ) | CALL文の明示的終端。`END-CALL`。 | PROCEDURE DIVISION | CALL文 | +| 57 | END-COMPUTE | 高頻度 | 予約語(スコープターミネータ) | COMPUTE文の明示的終端。`END-COMPUTE`。 | PROCEDURE DIVISION | COMPUTE文 | +| 58 | END-DIVIDE | 低頻度 | 予約語(スコープターミネータ) | DIVIDE文の明示的終端。`END-DIVIDE`。 | PROCEDURE DIVISION | DIVIDE文 | +| 59 | END-EVALUATE | 高頻度 | 予約語(スコープターミネータ) | EVALUATE文の明示的終端。`END-EVALUATE`。 | PROCEDURE DIVISION | EVALUATE文 | +| 60 | END-EXEC | 高頻度 | 予約語 | EXEC SQL / EXEC CICSの終端。`END-EXEC.`。 | PROCEDURE DIVISION | EXEC SQL / EXEC CICS | +| 61 | END-IF | 高頻度 | 予約語(スコープターミネータ) | IF文の明示的終端。`END-IF`。 | PROCEDURE DIVISION | IF文 | +| 62 | END-PERFORM | 高頻度 | 予約語(スコープターミネータ) | インラインPERFORM文の明示的終端。`END-PERFORM`。 | PROCEDURE DIVISION | PERFORM文 | +| 63 | END-READ | 高頻度 | 予約語(スコープターミネータ) | READ文の明示的終端。`END-READ`。 | PROCEDURE DIVISION | READ文 | +| 64 | END-SEARCH | 高頻度 | 予約語(スコープターミネータ) | SEARCH文の明示的終端。`END-SEARCH`。 | PROCEDURE DIVISION | SEARCH文 | +| 65 | END-STRING | 低頻度 | 予約語(スコープターミネータ) | STRING文の明示的終端。`END-STRING`。 | PROCEDURE DIVISION | STRING文 | +| 66 | END-SUBTRACT | 低頻度 | 予約語(スコープターミネータ) | SUBTRACT文の明示的終端。`END-SUBTRACT`。 | PROCEDURE DIVISION | SUBTRACT文 | +| 67 | END-UNSTRING | 低頻度 | 予約語(スコープターミネータ) | UNSTRING文の明示的終端。`END-UNSTRING`。 | PROCEDURE DIVISION | UNSTRING文 | +| 68 | ENVIRONMENT | 高頻度 | 予約語(区分) | ENVIRONMENT DIVISIONヘッダ。環境区分の開始。 | ENVIRONMENT DIVISION | ENVIRONMENT DIVISION | +| 69 | ERROR | 高頻度 | 予約語(句) | 例外処理指定。SIZE ERROR句、ON ERROR句、USE AFTER ERROR。 | PROCEDURE DIVISION | ADD/COMPUTE等のSIZE ERROR句、CALL ON ERROR句、USE文 | +| 70 | EVALUATE | 高頻度 | 予約語(文) | 多分岐(COBOLのswitch/case相当)。`EVALUATE subject ALSO subject WHEN condition imperative END-EVALUATE`。 | PROCEDURE DIVISION | EVALUATE文(ALSO/WHEN/WHEN OTHER) | +| 71 | EXEC | 高頻度 | 予約語 | EXEC SQL / EXEC CICSの開始。埋込みSQL/CICS文。2用法:`EXEC SQL ... END-EXEC`(DB2アクセス)、`EXEC CICS ... END-EXEC`(CICSオンラインコマンド)。 | PROCEDURE DIVISION | EXEC SQL文、EXEC CICS文 | +| 72 | EXCEPTION | 低頻度 | 予約語(句) | CALL文のON EXCEPTION句。USE AFTER EXCEPTION。 | PROCEDURE DIVISION | CALL文、USE文 | +| 73 | EXECUTE | 低頻度 | 予約語(文) | 他言語プログラム呼出し(非推奨/IBM拡張)。 | PROCEDURE DIVISION | EXECUTE文 | +| 74 | EXIT | 高頻度 | 予約語(文) | 手続きの共通終了点。6形態:`EXIT`(段落/節の共通終点。最も伝統的な用法)、`EXIT PROGRAM`(呼出元復帰)、`EXIT METHOD`(メソッド終了)、`EXIT PARAGRAPH`(段落終了)、`EXIT SECTION`(節終了)、`EXIT PERFORM [CYCLE]`(PERFORM脱出)。 | PROCEDURE DIVISION | EXIT文, EXIT PROGRAM文, EXIT PARAGRAPH文, EXIT SECTION文, EXIT PERFORM文, EXIT METHOD文 | + +### F + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 75 | FALSE | 低頻度 | 予約語(条件値) | 条件の偽値。SET condition-name TO FALSEの形で使用可能(ただしTRUEの方が一般的)。 | PROCEDURE DIVISION | SET文(条件名) | +| 76 | FD | 高頻度 | レベル指示子 | ファイル記述(File Description)のレベル指示子。DATA DIVISION FILE SECTIONでファイル構造を定義。`FD file-name ...`。 | DATA DIVISION, FILE SECTION | FD(ファイル記述) | +| 77 | FILE | 高頻度 | 予約語(節) | FILE SECTION(ファイル節)、FILE-CONTROL(ファイル制御段落)で使用。 | DATA DIVISION, ENVIRONMENT DIVISION | FILE SECTION、FILE-CONTROL | +| 78 | FILE-CONTROL | 高頻度 | 予約語(段落) | ENVIRONMENT DIVISIONのファイル制御段落。`FILE-CONTROL. SELECT ... ASSIGN ...`。 | ENVIRONMENT DIVISION, INPUT-OUTPUT SECTION | FILE-CONTROL段落 | +| 79 | FILLER | 高頻度 | 予約語(データ名代替) | データ項目の未使用領域の定義。プログラムからは直接参照できない。 | DATA DIVISION | データ記述項目 | +| 80 | FIRST | 高頻度 | 予約語(句) | INSPECT文のFIRST指定(最初の出現のみ処理)。 | PROCEDURE DIVISION | INSPECT文 | +| 81 | FOR | 高頻度 | 予約語(句) | PERFORM VARYINGのFROM ... BY ... UNTIL ... の一部。PERFORM ... TIMESの一部。 | PROCEDURE DIVISION | PERFORM文 | +| 82 | FROM | 高頻度 | 予約語(句) | ACCEPT ... FROM句(システム情報取得元指定)。PERFORM VARYING FROM句(初期値指定)。READ ... INTO句の対。STRING/UNSTRING文。 | PROCEDURE DIVISION | ACCEPT文、PERFORM文、READ文、WRITE文、STRING文 | + +### G + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 83 | GET | 低頻度 | 予約語(句) | データ取得を示す予約語。COBOLファイル処理では主にREAD文を使用。GETは特定のIBM環境で使用。 | PROCEDURE DIVISION | — | +| 84 | GIVING | 高頻度 | 予約語(句) | ADD/DIVIDE/MULTIPLY/SUBTRACTのGIVING句(結果格納先指定)。SORT/MERGEのGIVING句(出力ファイル指定)。 | PROCEDURE DIVISION | ADD文、DIVIDE文、MULTIPLY文、SUBTRACT文、SORT文、MERGE文 | +| 85 | GO | 高頻度 | 予約語(文) | GO TO文(制御移行)。`GO TO procedure-name`。 | PROCEDURE DIVISION | GO TO文(DEPENDING ON) | +| 86 | GOBACK | 高頻度 | 予約語(文) | プログラム/メソッドの論理的終了。呼出元に復帰。`GOBACK`。サブプログラムの終了に推奨。 | PROCEDURE DIVISION | GOBACK文 | +| 87 | GREATER | 低頻度 | 予約語(関係演算子) | 関係条件の「大なり」。`IF A IS GREATER THAN B`。START文のKEY IS GREATER THAN句。 | PROCEDURE DIVISION | 条件式、START文 | + +### H + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 88 | HIGH-VALUE | 高頻度 | FIGURATIVE CONSTANT | 使用中の照合順序で最上位の文字。`HIGH-VALUE` / `HIGH-VALUES`。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、VALUE句、条件式 | + +### I + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 89 | I-O-CONTROL | 高頻度 | 予約語(段落) | ENVIRONMENT DIVISIONの入出力制御段落。`I-O-CONTROL.` RERUN/SAME AREA/APPLY等。 | ENVIRONMENT DIVISION, INPUT-OUTPUT SECTION | I-O-CONTROL段落 | +| 90 | ID | 低頻度 | 予約語 | プログラム識別子の一部。PROGRAM-ID内で使用。 | IDENTIFICATION DIVISION | PROGRAM-ID段落 | +| 91 | IDENTIFICATION | 高頻度 | 予約語(区分) | IDENTIFICATION DIVISIONヘッダ。識別区分の開始。 | IDENTIFICATION DIVISION | IDENTIFICATION DIVISION | +| 92 | IF | 高頻度 | 予約語(文) | 条件分岐。`IF condition THEN statement-1 ELSE statement-2 END-IF`。 | PROCEDURE DIVISION | IF文(THEN/ELSE/END-IF) | +| 93 | IN | 高頻度 | 予約語(句) | SEARCH IN/INTO句。関数の引数内のIN。COPY文のIN library-name。 | PROCEDURE DIVISION, DATA DIVISION | SEARCH文、COPY文 | +| 94 | INDEXED | 高頻度 | 予約語(句) | OCCURS INDEXED BY句(索引定義)。ファイルのORGANIZATION INDEXED。 | DATA DIVISION, ENVIRONMENT DIVISION | OCCURS句、ORGANIZATION句 | +| 95 | INITIAL | 低頻率 | 予約語(句) | PROGRAM-IDのINITIAL属性(プログラム呼出毎に初期化)。データ項目のINITIAL VALUE。 | IDENTIFICATION DIVISION, DATA DIVISION | PROGRAM-ID句、VALUE句 | +| 96 | INITIALIZE | 高頻度 | 予約語(文) | データ項目のカテゴリ別初期化。`INITIALIZE identifier [REPLACING category BY identifier]`。 | PROCEDURE DIVISION | INITIALIZE文(REPLACING/WITH FILLER/ALL) | +| 97 | INPUT | 高頻度 | 予約語(句) | OPEN文の入力モード(OPEN INPUT)。INPUT-OUTPUT SECTION。INPUT PROCEDURE(SORT文)。 | PROCEDURE DIVISION, ENVIRONMENT DIVISION | OPEN文、SORT文、INPUT-OUTPUT SECTION | +| 98 | INPUT-OUTPUT | 高頻度 | 予約語(節) | ENVIRONMENT DIVISION INPUT-OUTPUT SECTION。 | ENVIRONMENT DIVISION | INPUT-OUTPUT SECTION | +| 99 | INSERT | 高頻度 | 予約語(コンパイラ指示文) | ソース一覧への行挿入(INSERT文)。EXEC SQLのINSERT文。 | ソース記述, PROCEDURE DIVISION(EXEC SQL内) | INSERT文(コンパイラ指示文)、SQL INSERT文 | +| 100 | INSPECT | 高頻度 | 予約語(文) | 文字列の検査/置換/変換。TALLYING/REPLACING/CONVERTING句。 | PROCEDURE DIVISION | INSPECT文(TALLYING/REPLACING/CONVERTING/CHARACTERS/ALL/LEADING/FIRST/BEFORE/AFTER) | +| 101 | INTO | 高頻度 | 予約語(句) | READ ... INTO句(レコード読込+データ移動)。STRING ... INTO句(連結結果格納)。UNSTRING ... INTO句(分解結果格納)。 | PROCEDURE DIVISION | READ文、STRING文、UNSTRING文 | +| 102 | INVALID | 低頻度 | 予約語(句) | ファイル操作の異常時処理。READ/WRITE/DELETE/REWRITE/START文のINVALID KEY句。 | PROCEDURE DIVISION | READ文、WRITE文、DELETE文、REWRITE文、START文 | +| 103 | IS | 高頻度 | 予約語(句) | 関係条件(IS [NOT] GREATER THAN等)。ACCESS MODE IS。ORGANIZATION IS。KEY IS。 | PROCEDURE DIVISION, DATA DIVISION, ENVIRONMENT DIVISION | 条件式、FILE-CONTROL句、データ記述句 | + +### K + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 104 | KEY | 高頻度 | 予約語(句) | レコードキー。RECORD KEY(主キー)、ALTERNATE RECORD KEY(代替キー)、RELATIVE KEY(相対キー)。ASCENDING/DESCENDING KEY(ソートキー)。 | ENVIRONMENT DIVISION, DATA DIVISION, PROCEDURE DIVISION | FILE-CONTROL句、OCCURS句、SORT文、SEARCH文 | + +### L + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 105 | LABEL | 高頻度 | 予約語(句) | FDのLABEL RECORDS句。`LABEL RECORDS ARE STANDARD/OMITTED`。 | DATA DIVISION, FILE SECTION | FD句 | +| 106 | LENGTH | 高頻度 | 特殊レジスタ(LENGTH OF)/ 組み込み関数 | 特殊レジスタ`LENGTH OF data-name`でデータ項目のバイト長を返す。関数`FUNCTION LENGTH`で文字位置長を返す。 | PROCEDURE DIVISION | LENGTH OF特殊レジスタ、FUNCTION LENGTH | +| 107 | LINKAGE | 高頻度 | 予約語(節) | LINKAGE SECTION。他プログラムから受け渡されるデータの定義。`LINKAGE SECTION.`。 | DATA DIVISION | LINKAGE SECTION | +| 108 | LOW-VALUE | 高頻度 | FIGURATIVE CONSTANT | 使用中の照合順序で最下位の文字。`LOW-VALUE` / `LOW-VALUES`。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、VALUE句、条件式 | + +### M + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 109 | MODE | 高頻度 | 予約語(句) | ACCESS MODE句。RECORDING MODE句(F/V/U/S)。 | ENVIRONMENT DIVISION, DATA DIVISION | FILE-CONTROL句、FD句 | +| 110 | MOVE | 高頻度 | 予約語(文) | 代入。基本項目移動、グループ移動、編集。`MOVE identifier TO identifier` / `MOVE CORRESPONDING`。 | PROCEDURE DIVISION | MOVE文(TO/CORRESPONDING) | +| 111 | MULTIPLY | 低頻度 | 予約語(文) | 乗算。`MULTIPLY identifier BY identifier [ROUNDED] [GIVING identifier]`。 | PROCEDURE DIVISION | MULTIPLY文(BY/GIVING/ROUNDED) | + +### N + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 112 | NEXT | 低頻度 | 予約語(句) | NEXT SENTENCE文(旧式の次文へ移動)。READ NEXT RECORD(順次読込み)。 | PROCEDURE DIVISION | READ文、NEXT SENTENCE文 | +| 113 | NOT | 高頻度 | 予約語(論理演算子) | 否定条件。`IF NOT condition`。NOT ON ERROR / NOT AT END / NOT ON OVERFLOW等。 | PROCEDURE DIVISION | 条件式、例外処理句 | +| 114 | NUMERIC | 高頻度 | 予約語(クラス条件) | クラス条件で使用。数字(0-9, 符号, 小数点)のみで構成されているかの判定。 | PROCEDURE DIVISION | クラス条件 | + +### O + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 115 | OBJECT-COMPUTER | 高頻度 | 予約語(段落) | ENVIRONMENT DIVISIONの目的計算機段落。`OBJECT-COMPUTER. computer-name MEMORY SIZE ...`。 | ENVIRONMENT DIVISION, CONFIGURATION SECTION | OBJECT-COMPUTER段落 | +| 116 | OCCURS | 高頻度 | 予約語(句) | 表定義(配列)。固定長/可変長/無制限。`OCCURS integer TIMES` / `OCCURS DEPENDING ON`。 | DATA DIVISION | OCCURS句 | +| 117 | OF | 高頻度 | 予約語(句) | 修飾(data-name OF group-name)。ADDRESS OF特殊レジスタ。LENGTH OF特殊レジスタ。 | PROCEDURE DIVISION, DATA DIVISION | データ参照修飾、特殊レジスタ | +| 118 | OMITTED | 低頻度 | 予約語(句) | CALL文の引数省略。`CALL prog USING OMITTED`。IS OMITTED条件(省略引数条件)。 | PROCEDURE DIVISION | CALL文、条件式 | +| 119 | ON | 高頻度 | 予約語(句) | 例外処理句(ON SIZE ERROR, ON EXCEPTION等)。OCCURS DEPENDING ON。SORT ON ASCENDING/DESCENDING KEY。 | PROCEDURE DIVISION, DATA DIVISION | 各種例外処理句、OCCURS句、SORT文 | +| 120 | OPEN | 高頻度 | 予約語(文) | ファイルのオープン。`OPEN INPUT/OUTPUT/I-O/EXTEND file-name`。 | PROCEDURE DIVISION | OPEN文(INPUT/OUTPUT/I-O/EXTEND/WITH NO REWIND) | +| 121 | OPTIONS | 低頻率 | 予約語(句) | コンパイラオプションの指定に関連。CBL/PROCESS文中。 | ソース記述 | CBL文、PROCESS文 | +| 122 | OR | 高頻度 | 予約語(論理演算子) | 複合条件の論理和(OR条件)。UNSTRING文のDELIMITED BY ... OR ...。 | PROCEDURE DIVISION | 条件式、UNSTRING文 | +| 123 | ORDER | 高頻度 | 予約語(句) | SORT文のDUPLICATES IN ORDER。特殊な整列順序指定。 | PROCEDURE DIVISION | SORT文 | +| 124 | ORGANIZATION | 低頻度 | 予約語(句) | ファイル編成の指定。`ORGANIZATION IS SEQUENTIAL/INDEXED/RELATIVE`。 | ENVIRONMENT DIVISION, FILE-CONTROL | ORGANIZATION句 | +| 125 | OTHER | 高頻度 | 予約語(句) | EVALUATE文のWHEN OTHER句(デフォルト分岐)。 | PROCEDURE DIVISION | EVALUATE文 | +| 126 | OUTPUT | 高頻度 | 予約語(句) | OPEN文の出力モード(OPEN OUTPUT)。OUTPUT PROCEDURE(SORT文)。 | PROCEDURE DIVISION | OPEN文、SORT文 | + +### P + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 127 | PACKED-DECIMAL | 高頻度 | USAGE句 | パック10進形式。COMP-3と同義。`USAGE PACKED-DECIMAL`。 | DATA DIVISION | USAGE句 | +| 128 | PAGE | 高頻度 | 予約語(句) | WRITE文のAFTER/BEFORE ADVANCING PAGE。FDのLINAGE句(PAGE FOOTING等)。 | PROCEDURE DIVISION, DATA DIVISION | WRITE文、FD句 | +| 129 | PAGE-COUNTER | 高頻度 | 特殊レジスタ | ページ番号を保持する特殊レジスタ。FDのLINAGE句使用時に生成。 | PROCEDURE DIVISION | 特殊レジスタ | +| 130 | PERFORM | 高頻度 | 予約語(文) | 繰り返し処理。6形態:基本(外部段落呼出)、回数指定(TIMES)、条件指定(UNTIL)、変数変化付(VARYING ... FROM ... BY ... UNTIL ... [AFTER ...])、インライン(END-PERFORM)、TEST BEFORE/TEST AFTER。 | PROCEDURE DIVISION | PERFORM文(外部段落/THRU/TIMES/UNTIL/VARYING/AFTER/インライン/TEST BEFORE/AFTER) | +| 131 | PIC | 高頻度 | 予約語(句) | PICTURE句の短縮形。データ項目の特性と編集要件を指定。`PIC X(10).`。 | DATA DIVISION | PICTURE句 | +| 132 | POINTER | 高頻度 | USAGE句 / 予約語 | USAGE POINTER(アドレスポインタ)。STRING/UNSTRING文のWITH POINTER句。 | DATA DIVISION, PROCEDURE DIVISION | USAGE句、STRING文、UNSTRING文 | +| 133 | PROCEDURE | 高頻度 | 予約語(区分) | PROCEDURE DIVISION。手続き区分の開始。`PROCEDURE DIVISION USING ... RETURNING ...`。 | PROCEDURE DIVISION | PROCEDURE DIVISION | +| 134 | PROGRAM-ID | 高頻度 | 予約語(段落) | IDENTIFICATION DIVISIONのプログラム識別段落。`PROGRAM-ID. program-name [INITIAL] [GLOBAL]`。 | IDENTIFICATION DIVISION | PROGRAM-ID段落 | + +### R + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 135 | RANDOM | 低頻度 | 予約語(句) | ACCESS MODE RANDOM(ランダムアクセスモード)。 | ENVIRONMENT DIVISION, FILE-CONTROL | ACCESS MODE句 | +| 136 | READ | 高頻度 | 予約語(文) | ファイルからの読込。`READ file-name [INTO identifier] [KEY IS data-name] [AT END imperative]`。 | PROCEDURE DIVISION | READ文(INTO/KEY IS/AT END/NEXT/PREVIOUS/NOT AT END/WITH WAIT/LOCK/IGNORE LOCK) | +| 137 | RECORD | 高頻度 | 予約語(句) | FDのRECORD CONTAINS句。RECORD KEY句。DELETE/Rewrite文のRECORD句。 | DATA DIVISION, ENVIRONMENT DIVISION, PROCEDURE DIVISION | FD句、FILE-CONTROL句、DELETE文、REWRITE文 | +| 138 | RECORDING | 高頻度 | 予約語(句) | FDのRECORDING MODE句(F固定/V可変/U不定/Sスパン)。 | DATA DIVISION, FILE SECTION | FD句 | +| 139 | RECORDS | 高頻度 | 予約語(句) | BLOCK CONTAINS ... RECORDS。LABEL RECORDS句。 | DATA DIVISION, FILE SECTION | FD句 | +| 140 | REDEFINES | 高頻度 | 予約語(句) | 同一ストレージ領域の再定義。`level-number data-name REDEFINES data-name ...`。 | DATA DIVISION | REDEFINES句 | +| 141 | REMAINDER | 高頻度 | 予約語(句) | DIVIDE文の余り格納指定。`DIVIDE ... [REMAINDER identifier]`。 | PROCEDURE DIVISION | DIVIDE文 | +| 142 | REMOVAL | 高頻度 | 予約語(句) | CLOSE文のFOR REMOVAL句(テープファイルのリール取外し)。 | PROCEDURE DIVISION | CLOSE文 | +| 143 | REPLACING | 高頻度 | 予約語(句) | COPY文の疑似テキスト置換。INSPECT文の文字置換。INITIALIZE文のREPLACING句。 | ソース記述, PROCEDURE DIVISION | COPY文、INSPECT文、INITIALIZE文 | +| 144 | RERUN | 低頻度 | 予約語(句) | I-O-CONTROL段落のチェックポイント指定。`RERUN ON assignment-name EVERY integer RECORDS`。 | ENVIRONMENT DIVISION, I-O-CONTROL | I-O-CONTROL段落 | +| 145 | RETURN-CODE | 高頻度 | 特殊レジスタ | 呼出元へのリターンコード。PIC S9(4) BINARY GLOBAL。`MOVE n TO RETURN-CODE`。 | PROCEDURE DIVISION | 特殊レジスタ | +| 146 | ROUNDED | 高頻度 | 予約語(句) | 算術演算の丸め指定。ADD/DIVIDE/MULTIPLY/SUBTRACT/COMPUTE文の[ROUNDED]句。 | PROCEDURE DIVISION | ADD文、DIVIDE文、MULTIPLY文、SUBTRACT文、COMPUTE文 | +| 147 | RUN | 高頻度 | 予約語(句) | STOP RUN文(プログラム終了、制御をOSに戻す)。 | PROCEDURE DIVISION | STOP RUN文 | + +### S + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 148 | SEARCH | 高頻度 | 予約語(文) | 内部表の探索。シリアルサーチ(SEARCH)とバイナリサーチ(SEARCH ALL)。`SEARCH table-name [VARYING index-name] AT END imperative WHEN condition`。 | PROCEDURE DIVISION | SEARCH文(ALL/VARYING/AT END/WHEN) | +| 149 | SECTION | 高頻度 | 予約語(節) | 節の定義。`section-name SECTION.`。各DIVISION内の節区切り。 | PROCEDURE DIVISION, DATA DIVISION, ENVIRONMENT DIVISION | SECTION | +| 150 | SELECT | 高頻度 | 予約語(句) | ファイル宣言。`SELECT file-name ASSIGN TO assignment-name ...`。EXEC SQL内のSELECT文(問合せ)。 | ENVIRONMENT DIVISION, PROCEDURE DIVISION(SQL内) | FILE-CONTROL段落、SQL SELECT文 | +| 151 | SENTENCE | 低頻度 | 予約語 | NEXT SENTENCE文(旧式COBOL)。区切りピリオドで終わる文の単位。 | PROCEDURE DIVISION | — | +| 152 | SET | 高頻度 | 予約語(文) | インデックス/アドレス/条件名/ポインタの設定。`SET index-name UP BY integer` / `SET condition-name TO TRUE`。 | PROCEDURE DIVISION | SET文(TO TRUE/FALSE/UP BY/DOWN BY/TO ADDRESS) | +| 153 | SHIFT-IN | 低頻度 | 特殊レジスタ | EBCDIC DBCSのシフトイン制御文字。PIC X(1) DISPLAY。 | PROCEDURE DIVISION | 特殊レジスタ | +| 154 | SHIFT-OUT | 低頻度 | 特殊レジスタ | EBCDIC DBCSのシフトアウト制御文字。PIC X(1) DISPLAY。 | PROCEDURE DIVISION | 特殊レジスタ | +| 155 | SIZE | 高頻度 | 予約語(句) | 算術演算のSIZE ERROR句。OBJECT-COMPUTERのMEMORY SIZE句。 | PROCEDURE DIVISION, ENVIRONMENT DIVISION | ADD/COMPUTE等のON SIZE ERROR句、OBJECT-COMPUTER段落 | +| 156 | SKIP2 | 高頻度 | 予約語(コンパイラ指示文) | ソース一覧で2行送り。`SKIP2`(SKIP1/SKIP2/SKIP3)。 | ソース記述 | SKIP文 | +| 157 | SOURCE-COMPUTER | 高頻度 | 予約語(段落) | ENVIRONMENT DIVISIONの元源計算機段落。`SOURCE-COMPUTER. computer-name [WITH DEBUGGING MODE]`。 | ENVIRONMENT DIVISION, CONFIGURATION SECTION | SOURCE-COMPUTER段落 | +| 158 | SPACE | 高頻度 | FIGURATIVE CONSTANT / 予約語 | FIGURATIVE CONSTANTとして1つ以上のブランク(空白)。`SPACE` / `SPACES`。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、VALUE句、条件式 | +| 159 | SPACES | 低頻度 | FIGURATIVE CONSTANT | SPACEの複数形(同義)。`SPACES`。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、VALUE句、条件式 | +| 160 | SQL | 高頻度 | 予約語 | EXEC SQL(埋込みSQL)の開始を示す。`EXEC SQL ... END-EXEC.`。 | PROCEDURE DIVISION | EXEC SQL文 | +| 161 | STANDARD | 高頻度 | 予約語(句) | LABEL RECORDS ARE STANDARD。RECORD DELIMITER IS STANDARD-1。標準ラベル/標準区切り。 | DATA DIVISION, ENVIRONMENT DIVISION | FD句、FILE-CONTROL句 | +| 162 | STOP | 高頻度 | 予約語(文) | 実行停止。`STOP RUN`(プログラム終了)。`STOP literal`(一時停止)。 | PROCEDURE DIVISION | STOP文(RUN/literal) | +| 163 | STRING | 高頻度 | 予約語(文) | 文字列の連結。`STRING identifier DELIMITED BY identifier/literal/SIZE INTO identifier [WITH POINTER]`。 | PROCEDURE DIVISION | STRING文(DELIMITED BY/INTO/POINTER/ON OVERFLOW) | +| 164 | SUBTRACT | 高頻度 | 予約語(文) | 減算。`SUBTRACT identifier FROM identifier [ROUNDED]` / `SUBTRACT CORRESPONDING`。 | PROCEDURE DIVISION | SUBTRACT文(FROM/GIVING/CORRESPONDING/ROUNDED) | + +### T + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 165 | TABLE | 高頻度 | 予約語(句) | SEARCH文の探索対象(内部表)。OCCURSで定義された表データ。 | PROCEDURE DIVISION, DATA DIVISION | SEARCH文、OCCURS句 | +| 166 | TALLYING | 低頻度 | 予約語(句) | INSPECT文の計数指定。`INSPECT identifier TALLYING count FOR CHARACTERS/ALL/LEADING`。UNSTRING文のTALLYING IN句。 | PROCEDURE DIVISION | INSPECT文、UNSTRING文 | +| 167 | TEST | 低頻度 | 予約語(句) | PERFORM文のTEST BEFORE/TEST AFTER(条件判定のタイミング指定)。 | PROCEDURE DIVISION | PERFORM文 | +| 168 | THEN | 高頻度 | 予約語(句) | IF文のTHEN(条件成立時の処理)。EVALUATE文のWHEN ... THEN。 | PROCEDURE DIVISION | IF文、EVALUATE文 | +| 169 | THRU | 高頻度 | 予約語(句) | 範囲指定。VALUE句のTHRU(値の範囲)。PERFORM THRU(段落範囲)。 | DATA DIVISION, PROCEDURE DIVISION | VALUE句、PERFORM文 | +| 170 | TIME | 高頻度 | 予約語(句)/ 特殊レジスタ | ACCEPT FROM TIME句(PIC 9(8) HHMMSShh)。CURRENT-DATE関数に含まれる時刻情報。 | PROCEDURE DIVISION | ACCEPT文 | +| 171 | TIMES | 高頻度 | 予約語(句) | PERFORM文の回数指定。OCCURS TIMES(表の要素数)。 | PROCEDURE DIVISION, DATA DIVISION | PERFORM文、OCCURS句 | +| 172 | TO | 高頻度 | 予約語(句) | 代入先指定(MOVE ... TO ...)。範囲指定(FROM ... TO ...)。PERFORM VARYING FROM ... TO ...。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、ADD文、PERFORM文、VALUE句 | +| 173 | TRUE | 高頻度 | 予約語(条件値) | 条件の真値。SET condition-name TO TRUE。EVALUATE文のTRUE条件。 | PROCEDURE DIVISION | SET文(条件名)、EVALUATE文 | +| 174 | TYPE | 低頻度 | 予約語(句) | ユーザ定義型(TYPEDEF/TYPE句)。`TYPE type-name`で定義済み型を参照。 | DATA DIVISION | TYPE句、TYPEDEF句 | + +### U + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 175 | UNSTRING | 低頻度 | 予約語(文) | 文字列の分解。`UNSTRING identifier DELIMITED BY identifier INTO identifier [WITH POINTER] [TALLYING]`。 | PROCEDURE DIVISION | UNSTRING文(DELIMITED BY/INTO/POINTER/TALLYING/DELIMITER IN) | +| 176 | UNTIL | 高頻度 | 予約語(句) | PERFORM UNTIL(条件成立まで繰返し)。PERFORM VARYING UNTIL。 | PROCEDURE DIVISION | PERFORM文 | +| 177 | UP | 高頻度 | 予約語(句) | SET文の索引値増加。`SET index-name UP BY integer`。 | PROCEDURE DIVISION | SET文 | +| 178 | UPON | 高頻度 | 予約語(句) | DISPLAY文の出力先指定。`DISPLAY ... UPON mnemonic-name`。 | PROCEDURE DIVISION | DISPLAY文 | +| 179 | USAGE | 高頻度 | 予約語(句) | データ項目の内部表現指定。`USAGE DISPLAY/COMP/COMP-3/BINARY/POINTER/INDEX/NATIONAL`。 | DATA DIVISION | USAGE句 | +| 180 | USE | 低頻度 | 予約語(文) | 例外処理・デバッグ宣言。`USE AFTER EXCEPTION/ERROR ON file-name` / `USE FOR DEBUGGING`。 | PROCEDURE DIVISION(DECLARATIVES内) | USE文 | +| 181 | USING | 高頻度 | 予約語(句) | PROCEDURE DIVISION USING(引数定義)。CALL文のUSING(引数渡し)。SORT文のUSING(入力ファイル)。 | PROCEDURE DIVISION, DATA DIVISION | PROCEDURE DIVISIONヘッダ、CALL文、SORT文 | + +### V + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 182 | VALUE | 高頻度 | 予約語(句) | データ項目の初期値指定。`VALUE literal` / `VALUE IS literal`。88条件名の値定義。 | DATA DIVISION | VALUE句 | +| 183 | VALUES | 高頻度 | 予約語(句) | VALUE句の複数形(88条件名の複数値指定)。 | DATA DIVISION | VALUE句(88レベル) | +| 184 | VARYING | 高頻度 | 予約語(句) | PERFORM VARYING(変数変化付繰返し)。SEARCH VARYING(探索時索引変更)。 | PROCEDURE DIVISION | PERFORM文、SEARCH文 | + +### W + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 185 | WHEN | 高頻度 | 予約語(句) | EVALUATE文のWHEN条件。SEARCH文のWHEN条件。 | PROCEDURE DIVISION | EVALUATE文、SEARCH文 | +| 186 | WHEN-COMPILED | 高頻度 | 特殊レジスタ / 組み込み関数 | コンパイル開始日時。PIC X(16) DISPLAY(MM/DD/YYhh.mm.ss)。関数`FUNCTION WHEN-COMPILED`はYYYYMMDDhhmmsshh+00形式。 | PROCEDURE DIVISION | 特殊レジスタ、FUNCTION WHEN-COMPILED | +| 187 | WITH | 高頻度 | 予約語(句) | OPEN WITH NO REWIND。CLOSE WITH LOCK。DISPLAY WITH NO ADVANCING。INITIALIZE WITH FILLER。SORT WITH DUPLICATES IN ORDER。 | PROCEDURE DIVISION, ENVIRONMENT DIVISION | OPEN文、CLOSE文、DISPLAY文、INITIALIZE文、SORT文 | +| 188 | WORKING-STORAGE | 高頻度 | 予約語(節) | WORKING-STORAGE SECTION。作業格納節。プログラムの内部データ領域。`WORKING-STORAGE SECTION.`。 | DATA DIVISION | WORKING-STORAGE SECTION | +| 189 | WRITE | 高頻度 | 予約語(文) | ファイルへの書出し。`WRITE record-name [FROM identifier] [AFTER/BEFORE ADVANCING PAGE/LINE identifier/literal] [END-OF-PAGE imperative] [INVALID KEY imperative]`。FROM句(データ移動+書出)、ADVANCING句(改行/改ページ制御)、END-OF-PAGE句(ページ終了処理)。 | PROCEDURE DIVISION | WRITE文(FROM/ADVANCING/END-OF-PAGE/INVALID KEY) | +| 190 | WRITE-ONLY | 高頻度 | 予約語(句) | I-O-CONTROL段落のAPPLY WRITE-ONLY句(書出し専用最適化)。 | ENVIRONMENT DIVISION, I-O-CONTROL | I-O-CONTROL段落 | + +### Z + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 191 | ZERO | 高頻度 | FIGURATIVE CONSTANT | 数値0、または文字'0'の1回以上の出現。`ZERO` / `ZEROS` / `ZEROES`。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、VALUE句、条件式 | +| 192 | ZEROS | 高頻度 | FIGURATIVE CONSTANT | ZEROの複数形(同義)。`ZEROS`。 | PROCEDURE DIVISION, DATA DIVISION | MOVE文、VALUE句、条件式 | + +### 補足:A-Z節に含まれない予約語(13語) + +以下はIBM COBOL予約語一覧に含まれるが、上記A-Z節のアルファベット順一覧に記載されていないものを補足としてまとめる。 + +| # | キーワード | カテゴリ | 区分 | 説明 | 使用可能なコンテキスト | 対応するCOBOL節/文 | +|---|-----------|---------|------|------|---------------------|------------------| +| 193 | ALTER | 低頻度 | 予約語(文) | GO TO文の分岐先を実行時に変更(非推奨、COBOL 2002で削除)。`ALTER procedure-name TO PROCEED TO procedure-name`。 | PROCEDURE DIVISION | ALTER文(TO PROCEED TO) | +| 194 | CANCEL | 高頻度 | 予約語(文) | プログラムの解放。`CANCEL program-name`。次回CALL時に初期状態で再ロード。 | PROCEDURE DIVISION | CANCEL文(ON EXCEPTION/NOT ON EXCEPTION) | +| 195 | ENTRY | 低頻度 | 予約語(文) | プログラム内の別エントリポイント定義。他言語からの呼出用。`ENTRY entry-name [USING data-name]`。 | PROCEDURE DIVISION | ENTRY文(USING) | +| 196 | MERGE | 高頻度 | 予約語(文) | 2つ以上のファイルのマージ。`MERGE file-name ON ASCENDING/DESCENDING KEY data-name USING file1 file2 GIVING file3`。 | PROCEDURE DIVISION | MERGE文(ON KEY/USING/GIVING/OUTPUT PROCEDURE) | +| 197 | RELEASE | 高頻度 | 予約語(文) | SORT文へのレコード引渡し(INPUT PROCEDURE内で使用)。`RELEASE record-name [FROM identifier]`。 | PROCEDURE DIVISION(SORT INPUT PROCEDURE内) | RELEASE文(FROM) | +| 198 | RETURN | 高頻度 | 予約語(文) | SORT文からのレコード受取(OUTPUT PROCEDURE内で使用)。`RETURN file-name [INTO identifier] AT END imperative`。 | PROCEDURE DIVISION(SORT OUTPUT PROCEDURE内) | RETURN文(INTO/AT END/NOT AT END) | +| 199 | REWRITE | 高頻度 | 予約語(文) | レコードの書換え(索引/相対ファイル)。`REWRITE record-name [FROM identifier] [INVALID KEY imperative]`。 | PROCEDURE DIVISION | REWRITE文(FROM/INVALID KEY) | +| 200 | SORT | 高頻度 | 予約語(文) | ファイルの整列。`SORT file-name ON ASCENDING/DESCENDING KEY data-name [INPUT/USING] [OUTPUT/GIVING]`。 | PROCEDURE DIVISION | SORT文(ON KEY/USING/INPUT PROCEDURE/OUTPUT PROCEDURE/GIVING/DUPLICATES) | +| 201 | START | 高頻度 | 予約語(文) | ファイルの開始位置指定(ランダム読込の基点設定)。`START file-name KEY IS condition [INVALID KEY imperative]`。 | PROCEDURE DIVISION | START文(KEY IS/INVALID KEY) | +| 202 | SAME | 高頻度 | 予約語(句) | レコード領域/ソート領域の共有指定。SAME RECORD AREA / SAME SORT AREA。 | ENVIRONMENT DIVISION, I-O-CONTROL | I-O-CONTROL段落 +| 203 | FUNCTION | 高頻度 | 予約語(関数) | 組み込み関数の呼出。FUNCTION MOD, FUNCTION INTEGER-OF-DATE, FUNCTION NUMVAL, FUNCTION WHEN-COMPILED, FUNCTION TRIM, FUNCTION LENGTH等。 | PROCEDURE DIVISION | FUNCTION文(組み込み関数) +| 204 | BEFORE | 高頻度 | 予約語(句) | INSPECT文のBEFORE句、WRITE文のBEFORE ADVANCING句、PERFORM文のTEST BEFORE句。BEFORE identifier / BEFORE ADVANCING。 | PROCEDURE DIVISION | INSPECT文、WRITE文、PERFORM文 +| 205 | ADDRESS | 高頻度 | 特殊レジスタ | ADDRESS OF特殊レジスタ(データ項目のアドレス取得)。ADDRESS OF data-name。 | PROCEDURE DIVISION, DATA DIVISION | SET文(ADDRESS OF) +--- + +## 2. TYPE定義(PICTURE句) + +### 2.1 PICTURE記号一覧 + +| # | 記号 | 名称 | 意味 | サイズ算定 | 使用シーン | +|---|-----|------|------|-----------|----------| +| 1 | X | 英数字文字 | 任意の英数字文字(1バイト) | 1文字位置 | 名前、コード、備考などの英数字データ。`PIC X(10)` | +| 2 | G | DBCS文字 | DBCS(2バイト)文字位置。日本語文字 | 1文字位置(2バイト) | 日本語表示文字。`PIC G(5)` | +| 3 | N | ナショナル/DBCS文字 | DBCS/ナショナル(UTF-16)文字位置 | 1文字位置(2バイト) | ナショナル文字(NSYMBOL(NATIONAL)時はUTF-16)。`PIC N(10)` | +| 4 | 9 | 数字 | 数字1桁(0-9) | 1桁 | 数値データ。`PIC 9(4)`で4桁の数値 | +| 5 | 9(m)V9(n) | 固定小数点数 | m桁整数部 + n桁小数部。Vは仮定小数点 | カウントされない(Vは位置のみ) | 小数点以下の精度が必要な数値。`PIC 9(3)V9(2)`でXXX.YY | +| 6 | S9(m)V9(n) | 符号付き固定小数点数 | 符号(S) + m桁整数部 + n桁小数部 | Sはカウントされない(SEPARATE時は1) | 符号付きの精密集計値。`PIC S9(7)V9(2)` | +| 7 | S9(m)V9(n) COMP-3 | パック10進符号付き固定小数 | COMP-3形式の符号付きパック10進数 | COMP-3(1バイトに2桁、符号は別ニブル) | 基幹業務の集計・金額データ。DB2のDECIMAL相当 | +| 8 | S9(m) COMP-3 | パック10進符号付き整数 | COMP-3形式の符号付き整数パック10進数 | COMP-3同上 | 整数のみのパック10進数。`PIC S9(9) COMP-3` | +| 9 | S9(m) COMP | 2進符号付き整数 | 2進形式(BINARY)の符号付き整数。COMP = BINARY | 2/4/8バイト(精度依存) | 索引、カウンタ、フラグ。`PIC S9(9) COMP` | +| 10 | S9(m) BINARY | 2進符号付き整数 | BINARY形式の符号付き整数(COMPと同義) | 同上 | COMPと同じ。可搬性重視の場合はBINARY指定 | +| 11 | ZZZ9 | ゼロ抑制編集 | 先頭ゼロをスペースに置換。Zの個数は可変(1~8) | 1文字位置 | 帳票出力時の数値編集。`PIC ZZZ,ZZ9.99` | + +*作成日: 2026-06-26* diff --git a/品質管理/COBOL言語解説書_IBM_zOS_V65.md b/品質管理/COBOL言語解説書_IBM_zOS_V65.md new file mode 100644 index 0000000..7c1bb14 --- /dev/null +++ b/品質管理/COBOL言語解説書_IBM_zOS_V65.md @@ -0,0 +1,1426 @@ +# COBOL言語解説書 + +## ドキュメント情報 + +- **タイトル**: Enterprise COBOL for z/OS 6.5 Language Reference +- **出版番号**: SC27-8713-04 +- **ページ数**: 916 +- **日本語訳題**: COBOL言語解説書 +- **ベース**: IBM Enterprise COBOL for z/OS V6.5 (プログラム番号 5655-EC6) + +--- + +# 第1部: COBOL言語構造 + +## 1.1 文字セットとコードページ + +### 基本COBOL文字セット + +COBOLの基本文字セットは、ラテンアルファベットの大文字・小文字、数字、および特殊文字で構成される。 + +| 文字 | 意味 | 使用例 | +|------|------|--------| +| スペース | 区切り文字 | `01 WS-A PIC X(10).` | +| `+` | 算術演算子、編集文字 | `COMPUTE WS-A = B + C.` | +| `-`(ハイフン) | 算術演算子、編集文字、継続文字、COBOL語要素 | `COMPUTE WS-A = B - C.` | +| `*`(アスタリスク) | 算術演算子、編集文字、注釈文字 | `* THIS IS COMMENT` | +| `/`(スラッシュ) | 算術演算子、編集文字、継続文字 | `PIC 99/99/99.` | +| `=` | 代入文字、関係文字 | `COMPUTE A = B.` | +| `$` | 通貨記号(編集文字) | `PIC $$99.` | +| `,`(カンマ) | 編集文字、区切り文字 | `PIC 99,999.` | +| `;`(セミコロン) | 区切り文字 | `MOVE 10 TO A; B.` | +| `:`(コロン) | 関係文字、修飾演算子 | `MOVE VAR(1:10) TO V.` | +| `.`(ピリオド) | 小数点、区切り文字 | `MOVE 10 TO A, B.` | +| `"`(引用符) | 英数字リテラルの区切り | `VALUE "HELLO".` | +| `'`(アポストロフィ) | 英数字リテラルの区切り | `VALUE 'HELLO'.` | +| `(` `)` | 括弧(区切り文字) | `IF (A = 10) AND (B = 5)` | +| `>` `<` | 関係文字 | `IF A > 10` | +| `_`(アンダースコア) | ユーザ定義語要素 | `01 WS_VAR PIC X(10).` | +| `A-Z` / `a-z` | アルファベット(英字) | | +| `0-9` | 数字 | | + +### コードページ + +コードページ(コード化文字セット)とは、各文字に数値位置(コードポイント)を割り当てた符号化表現のこと。IBMの各コードページはコードページ名(例:IBM-1252)とCCSID(例:1252)で識別される。 + +**Enterprise COBOLのコードページ関連機能**: + +- `CODEPAGE`コンパイラオプションで使用するコードページを指定 +- デフォルトのコードページは IBM-1140(CCSID 1140) +- ナショナルリテラルおよびUSAGE NATIONALのデータは UTF-16BE(CCSID 1200)で符号化 +- UTF-8リテラルおよびUSAGE UTF-8のデータは UTF-8(CCSID 1208)で符号化 + +**文字符号化単位(エンコーディングユニット)**: + +| USAGE / カテゴリ | エンコーディング単位 | +|-----------------|---------------------| +| DISPLAY(英数字) | 1バイト | +| DISPLAY-1(DBCS) | 2バイト | +| NATIONAL | 2バイト | +| UTF-8 | 1バイト | + +**ランタイムコードページの種類**: +- シングルバイトEBCDIC +- EBCDIC DBCS(Shift-Out/Shift-Inで区切られた2バイト文字) +- Unicode UTF-16 +- Unicode UTF-8 + +--- + +## 1.2 文字列(COBOL語とリテラル) + +文字列(character-string)とは、COBOL語、リテラル、PICTURE文字列、または注釈項目を形成する連続した文字のこと。文字列は区切り文字(separator)によって区切られる。 + +### COBOL予約語 + +予約語はCOBOLソースユニット内で事前定義された意味を持つ文字列。6つのタイプがある: + +1. **キーワード** — 特定の句、項目、文で必須の語 +2. **オプション語** — 可読性向上のための省略可能な語 +3. **FIGURATIVE CONSTANT( figurative constants)** — ZERO, SPACE等 +4. **特殊文字語** — 算術演算子(+ - / * **)、関係演算子(< > = <= >=)、浮動注釈指示子(\*>)、疑似テキスト区切り(==)、コンパイラ指示子指示記号(>>) +5. **特殊オブジェクト識別子** — SELF, SUPER +6. **特殊レジスタ** — ADDRESS OF, RETURN-CODE等 + +### ユーザ定義語 + +ユーザが指定するCOBOL語。最大30バイト。以下の文字を使用可能: +- ラテン大文字 A~Z +- ラテン小文字 a~z +- 数字 0~9 +- ハイフン(-):先頭・末尾不可 +- アンダースコア(_):先頭不可 + +**ユーザ定義語の種類とDBCS許容**: + +| 種類 | DBCS許容 | +|------|----------| +| Alphabet-name(アルファベット名) | 可 | +| Class-name(クラス名) | 可 | +| Condition-name(条件名) | 可 | +| Data-name(データ名) | 可 | +| File-name(ファイル名) | 可 | +| Function-name(関数名) | 不可 | +| Index-name(インデックス名) | 可 | +| Level-number(レベル番号01-49, 66, 77, 88) | 不可 | +| Library-name(ライブラリ名) | 不可 | +| Mnemonic-name(ニモニック名) | 可 | +| Paragraph-name(段落名) | 可 | +| Program-name(プログラム名) | 不可 | +| Record-name(レコード名) | 可 | +| Section-name(節名) | 可 | +| Symbolic-character(記号文字) | 可 | +| Text-name(テキスト名) | 不可 | +| Type-name(型名) | 可 | +| XML-schema-name(XMLスキーマ名) | 可 | + +### システム名 + +システムに対して特定の意味を持つ文字列。3タイプ: +- Computer-name(計算機名) +- Language-name(言語名) +- Implementor-name(実装者名):Environment-name, External-class-name, External-fileid, Assignment-name + +### FIGURATIVE CONSTANTS( figurative定数) + +| 定数 | 意味 | +|------|------| +| ZERO, ZEROS, ZEROES | 数値0、または文字'0'の1回以上の出現 | +| SPACE, SPACES | 1つ以上のブランク(空白) | +| HIGH-VALUE, HIGH-VALUES | 使用中の照合順序で最上位の文字 | +| LOW-VALUE, LOW-VALUES | 使用中の照合順序で最下位の文字 | +| QUOTE, QUOTES | 引用符文字またはアポストロフィ文字 | +| ALL literal | リテラルの文字列を1回以上繰り返したもの | +| NULL, NULLS | POINTER/PROCEDURE-POINTER等の無効アドレスを示す値 | +| symbolic-character | SYMBOLIC CHARACTERS句で定義された文字 | + +### 特殊レジスタ一覧 + +特殊レジスタは、コンパイラが生成するストレージ領域を名前で参照するための予約語。 + +| 特殊レジスタ | 暗黙定義 | 用途 | +|-------------|----------|------| +| ADDRESS OF | USAGE POINTER | LINKAGE/LOCAL/WORKING-STORAGE項目のアドレス参照 | +| DEBUG-ITEM | 01グループ(6サブフィールド) | デバッグ宣言手続きへの情報提供 | +| IGY-JAVAIOP-CALL-EXCEPTION | PIC 9(9)/9(18) COMP-5 | Java静的メソッド呼出時の例外オブジェクト参照 | +| JNIENVPTR | USAGE POINTER | JNI環境ポインタ参照 | +| JSON-CODE | PIC S9(9) BINARY | JSON GENERATE/PARSEの成功/例外コード | +| JSON-STATUS | PIC S9(9) BINARY | JSON PARSEの非例外状態コード | +| LENGTH OF | PIC 9(9)/9(18) BINARY | データ項目の現在バイト長 | +| LINAGE-COUNTER | 可変(LINAGE句依存) | 現在ページ内の行番号 | +| RETURN-CODE | PIC S9(4) BINARY GLOBAL | 呼出元へのリターンコード | +| SHIFT-OUT / SHIFT-IN | PIC X(1) DISPLAY | EBCDICシフトアウト/シフトイン制御文字 | +| SORT-CONTROL | PIC X(8) DISPLAY | ソート制御文のDD名 | +| SORT-CORE-SIZE | PIC S9(8) BINARY | ソートユーティリティが使用可能なストレージ量 | +| SORT-FILE-SIZE | PIC S9(8) BINARY | ソート入力ファイルの推定レコード数 | +| SORT-MESSAGE | PIC X(8) DISPLAY | ソートメッセージ出力先DD名 | +| SORT-MODE-SIZE | PIC S9(5) BINARY | 可変長レコードの最頻長 | +| SORT-RETURN | PIC S9(4) BINARY | ソート/マージ完了コード(0=成功, 16=失敗) | +| TALLY | PIC 9(5) BINARY GLOBAL | 計数用(参照・変更可能) | +| WHEN-COMPILED | PIC X(16) DISPLAY | コンパイル開始日時(MM/DD/YYhh.mm.ss) | +| XML-CODE | PIC S9(9) BINARY | XML GENERATE/PARSEのステータスコード | +| XML-EVENT | PIC X(30) DISPLAY | XMLパースイベント名 | +| XML-INFORMATION | PIC S9(9) BINARY | XMLイベントの追加情報 | +| XML-NAMESPACE / XML-NNAMESPACE | 英数字/ナショナル | XML名前空間識別子 | +| XML-NAMESPACE-PREFIX / XML-NNAMESPACE-PREFIX | 英数字/ナショナル | XML名前空間プレフィックス | +| XML-NTEXT | ナショナル | XML文書断片(NATIONAL) | +| XML-TEXT | 英数字(可変長) | XML文書断片(DISPLAY) | + +### リテラル + +リテラルは、その構成文字またはFIGURATIVE CONSTANTの使用によって値が指定される文字列。 + +**英数字リテラル(Alphanumeric Literals)**: +- 基本形式: `"文字列"` または `'文字列'` +- 最大長: 160バイト、最小長: 1バイト +- 16進表記: `X"hex"` または `X'hex'` +- NULL終端: `Z"文字列"` または `Z'文字列'` +- DBCS文字を含む英数字リテラルは継続不可 + +**DBCSリテラル**: +- 形式: `G""` または `G''` +- 最大長: 28文字 +- 継続不可 + +**UTF-8リテラル**: +- 基本形式: `U"文字データ"` または `U'文字データ'` +- Unicodeエスケープシーケンス対応: `\uhhhh` (BMP), `\U00hhhhh` (追加面) +- 16進表記: `UX"hex"` または `UX'hex'` + +**数値リテラル**: +- 数字0-9、符号(+/-)、小数点で構成 +- 整数: 1~18桁(ARITH(COMPAT)時)または1~31桁(ARITH(EXTEND)時) +- 浮動小数点: 仮数部に小数点必須、指数部はE+/-nn + +**ナショナルリテラル**: +- NSYMBOL(NATIONAL)時: `N"文字データ"` または `N'文字データ'` +- 最大長: 80文字位置 +- 16進表記: `NX"hex"` または `NX'hex'` +- UTF-16(ビッグエンディアン)に自動変換 + +--- + +## 1.3 区切り文字(Separators) + +| 区切り文字 | 意味 | +|-----------|------| +| スペース(b) | 語の区切り | +| `,b`(カンマ+スペース) | 区切りカンマ | +| `.b`(ピリオド+スペース) | 区切りピリオド(文の終端) | +| `;b`(セミコロン+スペース) | 区切りセミコロン | +| `:` | コロン | +| `::` | 修飾演算子 | +| `(` `)` | 括弧 | +| `"..."` | 引用符(英数字リテラル区切り) | +| `'...'` | アポストロフィ(英数字リテラル区切り) | +| `==...==` | 疑似テキスト区切り | +| `U"` / `U'` | UTF-8リテラル開始区切り | +| `UX"` / `UX'` | UTF-8 16進リテラル開始区切り | +| `X"` / `X'` | 英数字16進リテラル開始区切り | +| `Z"` / `Z'` | NULL終端英数字リテラル開始区切り | +| `N"` / `N'` | ナショナル/DBCSリテラル開始区切り | +| `NX"` / `NX'` | ナショナル16進リテラル開始区切り | +| `G"` / `G'` | DBCSリテラル開始区切り | + +--- + +## 1.4 参照形式(Reference Format) + +COBOLソーステキストは72桁の行内で以下の領域に分けられる: + +| 領域 | 桁 | 内容 | +|------|-----|------| +| Sequence number area | 1~6 | 行番号(任意) | +| Indicator area | 7 | 指示子 | +| Area A | 8~11 | 特定の要素の開始位置 | +| Area B | 12~72 | エントリ、文、句など | + +**Area Aに記述するもの**: +- 区分ヘッダ(IDENTIFICATION/ENVIRONMENT/DATA/PROCEDURE DIVISION.) +- 節ヘッダ +- 段落ヘッダ、段落名 +- レベル指示子(FD, SD)、レベル番号01、77 +- DECLARATIVES / END DECLARATIVES +- プログラム/クラス/メソッド終了マーカ + +**Area Bに記述するもの**: +- エントリ、文、句 +- 継続行 + +**指示子領域(Column 7)の用途**: +- `-`(ハイフン): 継続行 +- `*`(アスタリスク): 注釈行 +- `/`(スラッシュ): 改ページ+注釈行 +- `D` / `d`: デバッグ行 + +--- + +# 第2部: COBOLプログラム構造 + +## 2.1 4つのDIVISION + +COBOLソースプログラムは以下の4つの区分(division)から構成される: + +### IDENTIFICATION DIVISION(識別区分) + +プログラムの識別情報を定義する必須区分。 + +**主要な段落**: +- `PROGRAM-ID. program-name.` — プログラム名(必須) +- `CLASS-ID. class-name INHERITS class-name.` — クラス定義 +- `FUNCTION-ID. function-name.` — ユーザ定義関数 +- `METHOD-ID. "method-name".` — メソッド定義 + +### ENVIRONMENT DIVISION(環境区分) + +プログラムの実行環境に依存する側面を記述する。 + +**CONFIGURATION SECTION**: +- SOURCE-COMPUTET. source-computer-name +- OBJECT-COMPUTER. object-computer-name +- SPECIAL-NAMES.(特殊名) +- REPOSITORY.(リポジトリ) + +**INPUT-OUTPUT SECTION**: +- FILE-CONTROL.(ファイル制御) +- I-O-CONTROL.(入出力制御) + +### DATA DIVISION(データ区分) + +プログラムで処理されるすべてのデータを構造化して記述する。 + +**FILE SECTION**(ファイル節) — データファイルの構造を定義 +**WORKING-STORAGE SECTION**(作業格納節) — 内部データ +**LOCAL-STORAGE SECTION**(局所格納節) — 呼出毎に再割当てされるデータ +**LINKAGE SECTION**(連絡節) — 他プログラムから受け渡されるデータ + +### PROCEDURE DIVISION(手続き区分) + +実行可能な処理を記述する。 + +--- + +## 2.2 ネストプログラム + +COBOLプログラムは他のCOBOLプログラムを内部に含むことができる。これらを含まれるプログラムをネストプログラムと呼ぶ。 + +- 直接含まれる(directly contained): プログラムBがプログラムA内に直接ある場合 +- 間接的に含まれる(indirectly contained): プログラムBがプログラムA内の別のプログラムCに含まれる場合 +- 兄弟プログラム(sibling): 同じプログラムに直接含まれるプログラム同士 +- COMMON属性: ネストプログラムで指定でき、それを含むプログラムとその兄弟から参照可能 + +--- + +## 2.3 クラス定義/メソッド定義/ユーザ定義関数 + +### クラス定義 + +オブジェクト指向COBOLのための構造。Javaとの相互運用を目的とする。 + +``` +IDENTIFICATION DIVISION. +CLASS-ID. class-name INHERITS superclass. +ENVIRONMENT DIVISION. +...(CONFIGURATION SECTIONのみ) +FACTORY.(ファクトリ定義:静的メソッド+静的データ) +OBJECT.(オブジェクト定義:インスタンスメソッド+インスタンスデータ) +END CLASS class-name. +``` + +### メソッド定義 + +クラス内のメソッドは独立した`METHOD-ID`で識別される。`GOBACK`で終了。 + +### ユーザ定義関数 + +`FUNCTION-ID`で定義。`RETURNING`句で戻り値を指定。 + +--- + +# 第3部: ENVIRONMENT DIVISION詳細 + +## 3.1 CONFIGURATION SECTION(構成節) + +### SOURCE-COMPUTER段落 +``` +SOURCE-COMPUTER. computer-name WITH DEBUGGING MODE. +``` + +### OBJECT-COMPUTER段落 +``` +OBJECT-COMPUTER. computer-name + MEMORY SIZE integer WORDS/CHARACTERS/MODULES + PROGRAM COLLATING SEQUENCE IS alphabet-name + SEGMENT-LIMIT IS priority-number. +``` + +### SPECIAL-NAMES段落 + +``` +SPECIAL-NAMES. + implementor-name IS mnemonic-name + alphabet-name IS ... + CLASS class-name IS ... + CURRENCY SIGN IS literal + DECIMAL-POINT IS COMMA + SYMBOLIC CHARACTERS ... + XML-SCHEMA ... +``` + +**主な句**: + +| 句 | 機能 | +|----|------| +| ALPHABET句 | 文字セット/照合順序の定義(EBCDIC, ASCII, STANDARD-1/2, ユーザ定義) | +| CLASS句 | 文字の分類定義(例:CLASS VALID-CHAR IS 'A' THRU 'Z') | +| CURRENCY SIGN句 | 通貨記号の変更 | +| DECIMAL-POINT IS COMMA | ピリオドとカンマの機能交換 | +| SYMBOLIC CHARACTERS句 | ユーザ定義FIGURATIVE CONSTANTの作成 | +| XML-SCHEMA句 | XMLスキーマファイルの指定 | + +### REPOSITORY段落 + +クラス名とその外部クラス名の対応付け、ユーザ定義関数のプロトタイプ参照を行う。 + +``` +REPOSITORY. + CLASS class-name IS external-class-name + FUNCTION function-name + FUNCTION ALL INTRINSIC. +``` + +--- + +## 3.2 INPUT-OUTPUT SECTION(入出力節) + +### FILE-CONTROL段落 + +``` +FILE-CONTROL. + SELECT file-name ASSIGN TO assignment-name + ORGANIZATION IS SEQUENTIAL/INDEXED/RELATIVE + ACCESS MODE IS SEQUENTIAL/RANDOM/DYNAMIC + RECORD KEY IS data-name + ALTERNATE RECORD KEY IS data-name + RELATIVE KEY IS data-name + FILE STATUS IS data-name + RESERVE integer AREAS + PADDING CHARACTER IS data-name + RECORD DELIMITER IS STANDARD-1. +``` + +| 句 | 機能 | +|----|------| +| SELECT / ASSIGN | ファイルと外部名の関連付け | +| ORGANIZATION | ファイル編成(SEQUENTIAL/INDEXED/RELATIVE) | +| ACCESS MODE | アクセスモード(SEQUENTIAL/RANDOM/DYNAMIC) | +| RECORD KEY | 索引ファイルの主レコードキー | +| ALTERNATE RECORD KEY | 代替レコードキー | +| RELATIVE KEY | 相対ファイルのキー | +| FILE STATUS | ファイルステータスを受け取るデータ項目 | +| RESERVE | バッファ領域数 | + +### I-O-CONTROL段落 + +``` +I-O-CONTROL. + RERUN ON assignment-name EVERY integer RECORDS + SAME AREA FOR file-name + SAME RECORD AREA FOR file-name + SAME SORT AREA FOR file-name + MULTIPLE FILE TAPE CONTAINS file-name + APPLY WRITE-ONLY ON file-name. +``` + +--- + +# 第4部: DATA DIVISION詳細 + +## 4.1 ファイル記述(FD) + +``` +FD file-name + BLOCK CONTAINS integer-1 TO integer-2 RECORDS/CHARACTERS + RECORD CONTAINS integer-1 TO integer-2 CHARACTERS + LABEL RECORDS ARE STANDARD/OMITTED + VALUE OF data-name IS literal + DATA RECORDS ARE record-name + LINAGE IS data-name/integer LINES + WITH FOOTING AT data-name/integer + LINES AT TOP data-name/integer + LINES AT BOTTOM data-name/integer + RECORDING MODE IS F/V/U/S + CODE-SET IS alphabet-name + EXTERNAL / GLOBAL. +``` + +| 句 | 機能 | +|----|------| +| BLOCK CONTAINS | 物理ブロックサイズ | +| RECORD CONTAINS | 論理レコードサイズ | +| LABEL RECORDS | ラベル処理(STANDARD/OMITTED) | +| VALUE OF | ラベル内の識別情報 | +| LINAGE | ページ行数制御(帳票出力用) | +| CODE-SET | コードページ変換の指定 | + +**LINAGE句**: +- LINAGE-COUNTER特殊レジスタが自動生成される +- `WRITE`文実行時に自動更新 +- 初期値は1 + +--- + +## 4.2 データ記述項目 + +### レベルの概念 + +| レベル番号 | 用途 | +|-----------|------| +| 01 | レコード自体(Area Aに記述) | +| 02~49 | グループ項目、基本項目 | +| 66 | RENAMES句用 | +| 77 | 独立項目(WORKING-STORAGE等、Area Aに記述) | +| 88 | 条件名(VALUE句と共に使用) | + +### PICTURE句 + +PICTURE文字列でデータ項目の特性と編集要件を指定する。 + +**PICTURE記号一覧**: + +| 記号 | 意味 | サイズ算定 | +|------|------|-----------| +| A | 英字またはスペースのみ | 1文字位置 | +| B | スペース挿入 | 1文字位置 | +| E | 外部浮動小数点の指数開始 | 1文字位置 | +| G | DBCS文字位置 | 1文字位置 | +| N | DBCS/ナショナル文字位置 | 1文字位置 | +| P | 仮定小数点スケーリング位置 | カウントされない | +| S | 符号の存在 | カウントされない(SEPARATE時は1) | +| U | UTF-8文字位置 | 1文字位置 | +| V | 仮定小数点の位置 | カウントされない | +| X | 任意の英数字文字 | 1文字位置 | +| Z | 先頭ゼロ置換(スペース) | 1文字位置 | +| 9 | 数字 | 1桁 | +| 0 | ゼロ挿入 | 1文字位置 | +| / | スラッシュ挿入 | 1文字位置 | +| , | カンマ挿入 | 1文字位置 | +| . | 実小数点(編集) | 1文字位置 | +| + / - | 編集符号制御 | 1文字位置 | +| CR / DB | 編集符号制御 | 2文字位置 | +| * | チェックプロテクト | 1文字位置 | +| cs | 通貨記号 | 1+文字位置 | + +**データカテゴリ**: + +| カテゴリ | PICTURE記号 | +|---------|-------------| +| Alphabetic | Aのみ | +| Alphanumeric | X、またはA/X/9の組合せ | +| Alphanumeric-edited | A X 9 B 0 /(少なくとも1つのA/Xと1つのB/0//) | +| DBCS | G、G B、N(NSYMBOL(DBCS)時) | +| External floating-point | +9.9E+99形式 | +| National | N(NSYMBOL(NATIONAL)時) | +| National-edited | N B 0 / | +| Numeric | 9 S V P | +| Numeric-edited | 数値編集記号 | +| UTF-8 | U | + +**編集の種類**: +- 単純挿入編集: B, 0, / +- 特殊挿入編集: .(実小数点) +- 固定挿入編集: +, -, CR, DB, cs(通貨記号) +- 浮動挿入編集: +, -, cs(複数回指定) +- ゼロ抑制/置換編集: Z, * + +--- + +### OCCURS句(表定義) + +固定長表: +``` +05 item OCCURS integer TIMES + ASCENDING/DESCENDING KEY IS data-name + INDEXED BY index-name + PIC X(10). +``` + +可変長表(ODO: OCCURS DEPENDING ON): +``` +05 item OCCURS integer-1 TO integer-2 TIMES + DEPENDING ON data-name + PIC X(10). +``` + +無制限表(UNBOUNDED): +``` +05 item OCCURS 1 TO UNBOUNDED TIMES + DEPENDING ON data-name + PIC X(10). +``` + +### REDEFINES句 + +同一ストレージ領域の再定義。レベル番号が同じでなければならない。 + +``` +01 WS-EMPLOYEE. + 05 WS-EMP-NAME PIC X(30). + 05 WS-EMP-SALARY PIC 9(5)V99. +01 WS-EMP-ALT REDEFINES WS-EMPLOYEE. + 05 WS-EMP-CODE PIC X(10). + 05 WS-EMP-DEPT PIC X(25). +``` + +### RENAMES句(レベル66) + +既存データ項目の再グループ化。レベル66で指定。 + +``` +66 WS-RENAME-EMP RENAMES WS-FIRST-NAME THRU WS-LAST-NAME. +``` + +### USAGE句 + +データ項目の内部表現を指定。 + +| USAEGE句 | 説明 | +|---------|------| +| DISPLAY | ディスプレイ形式(標準) | +| DISPLAY-1 | DBCSデータ | +| COMP / COMP-4 / BINARY | 2進形式 | +| COMP-1 | 内部浮動小数点(短精度) | +| COMP-2 | 内部浮動小数点(長精度) | +| COMP-3 | 内部10進形式(パック10進) | +| INDEX | インデックスデータ項目 | +| POINTER | アドレスポインタ | +| POINTER-32 | 32ビットアドレスポインタ | +| PROCEDURE-POINTER | 手続きポインタ | +| FUNCTION-POINTER | 関数ポインタ | +| OBJECT REFERENCE | オブジェクト参照 | +| NATIONAL | ナショナル文字(UTF-16) | +| UTF-8 | UTF-8文字 | +| NATIVE | ネイティブ2進表現 | + +### VALUE句 + +データ項目の初期値を指定。 + +``` +01 WS-COUNT PIC 9(4) VALUE 0. +88 WS-ZERO VALUE 0. +88 WS-POSITIVE VALUE 1 THRU 9999. +``` + +### その他の句 + +| 句 | 機能 | +|----|------| +| BLANK WHEN ZERO | 値がゼロのとき項目を空白にする | +| JUSTIFIED RIGHT | 右詰め指定 | +| SYNCHRONIZED | 自然境界への位置合わせ(SYNC) | +| EXTERNAL | 実行単位全体で共有される外部データ | +| GLOBAL | ネストプログラムから参照可能な大域データ | +| SIGN IS LEADING/TRALLING SEPARATE | 符号の表現方法 | +| GROUP-USAGE NATIONAL/UTF-8 | グループ全体の使用法 | +| TYPEDEF / TYPE | ユーザ定義型 | +| DYNAMIC LENGTH | 動的長さ基本項目 | +| VOLATILE | 揮発性データの指定 | + +--- + +# 第5部: PROCEDURE DIVISION詳細 + +## 5.1 手続き部構造 + +### PROCEDURE DIVISIONヘッダ + +``` +PROCEDURE DIVISION USING data-name-1 ... + RETURNING data-name. +``` + +- USING句: LINKAGE SECTIONの項目を引数として受け取る +- RETURNING句: 戻り値を指定 + +### 宣言部(DECLARATIVES) + +例外処理やデバッグ処理を記述する特殊な手続き領域。 + +``` +DECLARATIVES. +section-name SECTION. USE AFTER EXCEPTION/ERROR ON file-name. +... +END DECLARATIVES. +``` + +### 算術式 + +算術演算子: `+`(加算), `-`(減算), `*`(乗算), `/`(除算), `**`(べき乗) + +演算優先順位: `**` → `*` / `/` → `+` / `-` + +### 条件式 + +**関係条件**: +``` +operand-1 IS [NOT] GREATER THAN / LESS THAN / EQUAL TO operand-2 +operand-1 > / < / = / >= / <= operand-2 +``` + +**クラス条件**: +``` +identifier IS [NOT] NUMERIC / ALPHABETIC / ALPHABETIC-LOWER / + ALPHABETIC-UPPER / DBCS / KANJI / class-name +``` + +**条件名条件**: +``` +condition-name (88レベルで定義された条件名) +``` + +**符号条件**: +``` +operand IS [NOT] POSITIVE / NEGATIVE / ZERO +``` + +**スイッチ状態条件**: +``` +condition-name (SPECIAL-NAMESで定義されたUPSIスイッチ) +``` + +**省略引数条件**: +``` +data-name IS [NOT] OMITTED +``` + +**複合条件**: +``` +condition-1 AND/OR condition-2 +NOT condition +``` + +--- + +## 5.2 手続き文一覧 + +### ACCEPT文 + +システム日付・時刻・ユーザ入力の受取り。 + +``` +ACCEPT identifier FROM DATE/DAY/TIME/DAY-OF-WEEK/ + DATE YYYYMMDD/DAY YYYYDDD +ACCEPT identifier (SYSINからの入力) +``` + +- DATE: PIC 9(6) — YYMMDD +- DATE YYYYMMDD: PIC 9(8) — YYYYMMDD +- DAY: PIC 9(5) — YYDDD +- DAY YYYYDDD: PIC 9(7) — YYYYDDD +- DAY-OF-WEEK: PIC 9(1) — 1=月曜~7=日曜 +- TIME: PIC 9(8) — HHMMSShh(時分秒ミリ秒) + +### ADD文 + +加算。ROUNDED、SIZE ERROR、CORRESPONDING句をサポート。 + +``` +ADD identifier/literal TO identifier [ROUNDED] + [ON SIZE ERROR imperative] [NOT ON SIZE ERROR imperative] +ADD identifier/literal GIVING identifier [ROUNDED] +ADD CORRESPONDING identifier-1 TO identifier-2 +``` + +### CALL文 + +サブプログラム呼出。 + +``` +CALL literal/identifier USING [BY REFERENCE/CONTENT/VALUE] data-name + RETURNING identifier + ON EXCEPTION imperative + NOT ON EXCEPTION imperative +``` + +- BY REFERENCE: アドレス渡し(デフォルト) +- BY CONTENT: 内容のコピーを渡す +- BY VALUE: 値を渡す + +### CANCEL文 + +プログラムの解放。次回CALL時に初期状態で再ロードされる。 + +``` +CANCEL program-name +``` + +### CLOSE文 + +ファイルのクローズ。 + +``` +CLOSE file-name [WITH LOCK/NO REWIND/REEL/FOR REMOVAL] +``` + +### COMPUTE文 + +計算代入。複数の算術演算を組合せ可能。 + +``` +COMPUTE identifier [ROUNDED] = arithmetic-expression + [ON SIZE ERROR imperative] [NOT ON SIZE ERROR imperative] +``` + +### CONTINUE文 + +無操作(no operation)文。 + +``` +CONTINUE +``` + +### DELETE文 + +索引ファイルまたは相対ファイルからのレコード削除。 + +``` +DELETE file-name RECORD + [INVALID KEY imperative] [NOT INVALID KEY imperative] +``` + +### DISPLAY文 + +オペランドの内容を出力装置へ転送。 + +``` +DISPLAY identifier/literal + UPON mnemonic-name/environment-name + WITH NO ADVANCING +``` + +### DIVIDE文 + +除算。商と余りを計算。 + +``` +DIVIDE identifier INTO identifier [ROUNDED] + [REMAINDER identifier] +DIVIDE identifier BY identifier GIVING identifier [ROUNDED] + [REMAINDER identifier] +``` + +### EVALUATE文 + +多分岐。COBOLのswitch/case相当。 + +``` +EVALUATE subject ALSO subject + WHEN object ALSO object imperative + WHEN OTHER imperative +END-EVALUATE +``` + +### EXIT文 + +手続きの共通終了点。プログラム/メソッド/PARAGRAPH/SECTIONの終了。 + +``` +EXIT PROGRAM (呼出元に復帰) +EXIT METHOD (メソッド終了) +EXIT PARAGRAPH (段落終了) +EXIT SECTION (節終了) +EXIT PERFORM [CYCLE] (インラインPERFORMからの脱出) +``` + +### GOBACK文 + +プログラム/メソッドの論理的終了。呼出元に復帰。 + +``` +GOBACK +``` + +### GO TO文 + +制御の移動。 + +``` +GO TO procedure-name (無条件) +GO TO procedure-name DEPENDING ON identifier (条件付) +``` + +### IF文 + +条件分岐。 + +``` +IF condition THEN statement-1 ELSE statement-2 END-IF +``` + +### INITIALIZE文 + +データ項目のカテゴリ別初期化。 + +``` +INITIALIZE identifier [WITH FILLER] [ALL] + [REPLACING category BY identifier/literal] + [THEN TO DEFAULT] +``` + +カテゴリ: ALPHABETIC, ALPHANUMERIC, NUMERIC, ALPHANUMERIC-EDITED, +NUMERIC-EDITED, DBCS, NATIONAL, NATIONAL-EDITED, UTF-8等 + +### INSPECT文 + +文字列の検査/置換/変換。 + +``` +INSPECT identifier TALLYING count FOR CHARACTERS/ALL/LEADING/FIRST + identifier/literal [BEFORE/AFTER identifier/literal] +INSPECT identifier REPLACING CHARACTERS/ALL/LEADING/FIRST + identifier/literal BY identifier/literal +INSPECT identifier CONVERTING identifier TO identifier +``` + +### MERGE文 + +2つ以上のファイルのマージ。 + +``` +MERGE file-name ON ASCENDING/DESCENDING KEY data-name + USING file-name-1 file-name-2 + GIVING file-name-3 +``` + +### MOVE文 + +代入。基本項目移動、グループ移動、編集をサポート。 + +``` +MOVE identifier/literal TO identifier +MOVE CORRESPONDING identifier-1 TO identifier-2 +``` + +### MULTIPLY文 + +乗算。 + +``` +MULTIPLY identifier BY identifier [ROUNDED] +MULTIPLY identifier BY identifier GIVING identifier [ROUNDED] +``` + +### OPEN文 + +ファイルのオープン。 + +``` +OPEN INPUT/OUTPUT/I-O/EXTEND file-name +``` + +### PERFORM文 + +繰り返し処理。 + +``` +PERFORM procedure [THRU procedure] (基本) +PERFORM procedure integer TIMES (回数指定) +PERFORM procedure UNTIL condition (条件指定) +PERFORM procedure VARYING identifier FROM ... BY ... UNTIL ... +PERFORM inline-statement END-PERFORM (インライン) +``` + +### READ文 + +ファイルからの読込。 + +``` +READ file-name [INTO identifier] [KEY IS data-name] + [AT END imperative] [INVALID KEY imperative] + [NOT AT END/INVALID KEY imperative] +``` + +### RELEASE文 + +SORT文へのレコード引き渡し。 + +``` +RELEASE record-name FROM identifier +``` + +### RETURN文 + +SORT文からのレコード受取。 + +``` +RETURN file-name INTO identifier + AT END imperative [NOT AT END imperative] +``` + +### REWRITE文 + +レコードの書換え。 + +``` +REWRITE record-name [FROM identifier] + [INVALID KEY imperative] [NOT INVALID KEY imperative] +``` + +### SEARCH文 + +内部表の探索。 + +- **シリアルサーチ(SEARCH)**: 逐次探索。INDEXED BY必須。 +- **バイナリサーチ(SEARCH ALL)**: 二分探索。ASCENDING/DESCENDING KEY必須。 + +``` +SEARCH table-name [VARYING index-name] + AT END imperative + WHEN condition imperative +SEARCH ALL table-name + AT END imperative + WHEN KEY condition imperative +``` + +### SET文 + +インデックス、アドレス、条件名、ポインタの設定。 + +``` +SET index-name UP BY/DOWN BY integer (索引値の増減) +SET index-name TO integer (索引値設定) +SET condition-name TO TRUE (条件名真設定) +SET address TO pointer (アドレス設定) +SET procedure-pointer TO entry (手続きポインタ設定) +SET object-reference TO object (オブジェクト参照設定) +``` + +### SORT文 + +ファイルの整列。 + +``` +SORT file-name ON ASCENDING/DESCENDING KEY data-name + [WITH DUPLICATES IN ORDER] + INPUT PROCEDURE section [THRU section] + USING file-name + OUTPUT PROCEDURE section [THRU section] + GIVING file-name +``` + +### START文 + +VSAMファイルの開始位置指定。 + +``` +START file-name KEY IS GREATER THAN/EQUAL TO/LESS THAN data-name + [INVALID KEY imperative] [NOT INVALID KEY imperative] +``` + +### STOP文 + +実行停止。 + +``` +STOP RUN (プログラム終了、制御をOSに戻す) +STOP literal (一時停止、オペレータ介入待ち) +``` + +### STRING文 + +文字列の連結。 + +``` +STRING identifier/literal DELIMITED BY identifier/literal/SIZE + INTO identifier + [WITH POINTER identifier] + [ON OVERFLOW imperative] +END-STRING +``` + +### SUBTRACT文 + +減算。 + +``` +SUBTRACT identifier/literal FROM identifier [ROUNDED] +SUBTRACT identifier/literal FROM identifier GIVING identifier +SUBTRACT CORRESPONDING identifier-1 FROM identifier-2 +``` + +### UNSTRING文 + +文字列の分解。 + +``` +UNSTRING identifier + DELIMITED BY [ALL] identifier/literal [OR ...] + INTO identifier [DELIMITER IN identifier] [COUNT IN identifier] + [WITH POINTER identifier] + [TALLYING IN identifier] + [ON OVERFLOW imperative] [NOT ON OVERFLOW imperative] +END-UNSTRING +``` + +### WRITE文 + +ファイルへの書出し。 + +``` +WRITE record-name [FROM identifier] + [AFTER/BEFORE ADVANCING PAGE/LINE identifier/literal] + [END-OF-PAGE imperative] + [INVALID KEY imperative] [NOT INVALID KEY imperative] +``` + +--- + +# 第6部: 組み込み関数 + +## 関数の呼出し形式 + +``` +FUNCTION function-name ( argument ... ) +``` + +## 関数一覧 + +| 関数名 | 型 | 説明 | +|--------|-----|------| +| ABS | 数値 | 絶対値 | +| ACOS | 数値 | 逆余弦(アークコサイン) | +| ANNUITY | 数値 | 年金係数 | +| ASIN | 数値 | 逆正弦(アークサイン) | +| ATAN | 数値 | 逆正接(アークタンジェント) | +| BIT-OF | 整数 | 2進数文字列表現 | +| BIT-TO-CHAR | 英数字 | 2進文字列を文字に変換 | +| BYTE-LENGTH | 整数 | バイト長 | +| CHAR | 英数字 | コードポイントから文字 | +| COMBINED-DATETIME | 整数 | 日時を結合した整数値 | +| CONTENT-OF | 英数字/ナショナル | ファイル内容の読取り | +| COS | 数値 | 余弦(コサイン) | +| CURRENT-DATE | 英数字 | 現在日時(YYYYMMDDhhmmssss+hhmm) | +| DATE-OF-INTEGER | 整数 | 整数日付→YYYYMMDD変換 | +| DATE-TO-YYYYMMDD | 整数 | 2桁年→4桁年変換 | +| DAY-OF-INTEGER | 整数 | 整数日付→YYYYDDD変換 | +| DAY-TO-YYYYDDD | 整数 | 2桁年→4桁年(ユリウス日)変換 | +| DISPLAY-OF | 英数字 | ナショナル/UTF-8→指定コードページ変換 | +| E | 数値 | 自然対数の底(約2.71828) | +| EXP | 数値 | eのべき乗 | +| EXP10 | 数値 | 10のべき乗 | +| FACTORIAL | 整数 | 階乗 | +| FORMATTED-CURRENT-DATE | 英数字/ナショナル/UTF-8 | 書式指定現在日時 | +| FORMATTED-DATE | 英数字/ナショナル/UTF-8 | 書式指定日付変換 | +| FORMATTED-DATETIME | 英数字/ナショナル/UTF-8 | 書式指定日時変換 | +| FORMATTED-TIME | 英数字/ナショナル/UTF-8 | 書式指定時刻変換 | +| HEX-OF | 英数字 | 16進文字列表現 | +| HEX-TO-CHAR | 英数字 | 16進文字列→バイト変換 | +| INTEGER | 整数 | 切捨て整数化 | +| INTEGER-OF-DATE | 整数 | YYYYMMDD→整数日付変換 | +| INTEGER-OF-DAY | 整数 | YYYYDDD→整数日付変換 | +| INTEGER-OF-FORMATTED-DATE | 整数 | 書式指定日付→整数日付変換 | +| INTEGER-PART | 整数 | 整数部 | +| LENGTH | 整数 | 文字位置長(キャラクタ長) | +| LOG | 数値 | 自然対数 | +| LOG10 | 数値 | 常用対数 | +| LOWER-CASE | 英数字 | 英字小文字変換 | +| MAX | 可変 | 最大値 | +| MEAN | 数値 | 平均値 | +| MEDIAN | 数値 | 中央値 | +| MIDRANGE | 数値 | ミッドレンジ | +| MIN | 可変 | 最小値 | +| MOD | 整数 | 剰余(モジュロ) | +| NATIONAL-OF | ナショナル | 英数字→ナショナル変換 | +| NUMVAL | 数値 | 英数字→数値変換 | +| NUMVAL-C | 数値 | 通貨記号付き文字列→数値変換 | +| NUMVAL-F | 数値 | 浮動小数点文字列→数値変換 | +| ORD | 整数 | 文字の序数位置 | +| ORD-MAX | 整数 | 最大値の引数の序数 | +| ORD-MIN | 整数 | 最小値の引数の序数 | +| PI | 数値 | 円周率(約3.14159) | +| PRESENT-VALUE | 数値 | 現在価値 | +| RANDOM | 数値 | 乱数 | +| RANGE | 数値 | 範囲(最大値-最小値) | +| REM | 数値 | 剰余(REM = 被除数 - 除数 * 商) | +| REVERSE | 英数字/ナショナル | 文字列反転 | +| SECONDS-FROM-FORMATTED-TIME | 数値 | 書式指定時刻→秒数 | +| SECONDS-PAST-MIDNIGHT | 数値 | 現在時刻の正午からの経過秒数 | +| SIGN | 整数 | 符号(-1, 0, 1) | +| SIN | 数値 | 正弦(サイン) | +| SQRT | 数値 | 平方根 | +| STANDARD-DEVIATION | 数値 | 標準偏差 | +| SUM | 数値 | 合計 | +| TAN | 数値 | 正接(タンジェント) | +| TEST-DATE-YYYYMMDD | 整数 | YYYYMMDD日付の妥当性検証 | +| TEST-DAY-YYYYDDD | 整数 | YYYYDDD日付の妥当性検証 | +| TEST-FORMATTED-DATETIME | 整数 | 書式指定日時の妥当性検証 | +| TEST-NUMVAL | 整数 | 数値変換可能性の検証 | +| TEST-NUMVAL-C | 整数 | 通貨数値変換可能性の検証 | +| TEST-NUMVAL-F | 整数 | 浮動小数点変換可能性の検証 | +| TRIM | 英数字/ナショナル | 先頭/末尾スペース除去 | +| ULENGTH | 整数 | ナショナル文字の長さ(コードポイント単位) | +| UPOS | 整数 | ナショナル文字列内の部分文字位置 | +| UPPER-CASE | 英数字/ナショナル | 英字大文字変換 | +| USUBSTR | ナショナル | ナショナル部分文字列 | +| USUPPLEMENTARY | 整数 | 補助文字サロゲート有無判定 | +| UUID4 | 英数字 | UUID v4生成 | +| UVALID | 整数 | UTF-16文字列の妥当性検証 | +| UWIDTH | 整数 | UTF-16符号化単位数 | +| VARIANCE | 数値 | 分散 | +| WHEN-COMPILED | 英数字 | コンパイル日時(YYYYMMDDhhmmsshh+00) | +| YEAR-TO-YYYY | 整数 | 2桁年→4桁年変換 | + +--- + +# 第7部: コンパイラ指示文とコンパイラ指令 + +## コンパイラ指示文(Compiler-Directing Statements) + +### BASIS文 + +別のソーステキストを現在のソースユニットに組み込む。 + +``` +BASIS "basis-name" +``` + +### CBL(PROCESS)文 + +コンパイラオプションをソース内で指定。 + +``` +CBL option-name +PROCESS option-name +``` + +### *CBL(*CONTROL)文 + +ソースコード一覧の制御。 + +``` +*CBL SOURCE/NOSOURCE MAP/NOMAP LIST/NOLIST +``` + +### COPY文 + +COPYライブラリからソーステキストを組み込む。テキスト操作(置換)可能。 + +``` +COPY text-name [IN library-name] + [REPLACING ==pseudo-text== BY ==pseudo-text== ...] +``` + +- 疑似テキストによる置換機能 +- ライブラリ検索順序: 指定ライブラリ → SYSLIB + +### DELETE文 + +ソース一覧からの行削除指示(コーディングシート用)。 + +``` +DELETE line-number +``` + +### EJECT文 + +ソース一覧の改ページ。 + +``` +EJECT +``` + +### ENTER文 + +他言語(COBOL以外)のプログラムの呼出し(非推奨)。 + +``` +ENTER language-name routine-name +``` + +### INSERT文 + +ソース一覧への行挿入。 + +``` +INSERT line-number +``` + +### READY/RESET TRACE文 + +トレースの開始・停止。 + +``` +READY TRACE +RESET TRACE +``` + +### REPLACE文 + +ソーステキストの置換を指定。 + +``` +REPLACE ==pseudo-text== BY ==pseudo-text== ... +REPLACE OFF +``` + +### SERVICE LABEL文 + +サービストレースのラベル設定。 + +``` +SERVICE LABEL label-name +``` + +### SERVICE RELOAD文 + +サービスの再ロード。 + +``` +SERVICE RELOAD +``` + +### SKIP文 + +ソース一覧での行送り。 + +``` +SKIP1 / SKIP2 / SKIP3 +``` + +### TITLE文 + +ソース一覧のタイトル指定。 + +``` +TITLE "title-text" +``` + +### USE文 + +例外処理・デバッグ宣言。 + +``` +USE AFTER EXCEPTION/ERROR ON file-name/INPUT/OUTPUT/I-O/EXTEND +USE FOR DEBUGGING ON procedure-name +``` + +--- + +## コンパイラ指令(Compiler Directives) + +コンパイラ指令は `>>` で始まり、Area Bに記述する。 + +### CALLINTERFACE + +Javaとの相互運用のための呼出しインターフェース指定。 + +``` +>>CALLINTERFACE DLL +``` + +### DATA + +WORKING-STORAGEの割当て場所指定。 + +``` +>>DATA 24 / 31 +``` + +### 条件付きコンパイル(Conditional Compilation) + +`>>DEFINE`, `>>EVALUATE`, `>>IF` 等で条件付きコンパイルを実現。 + +``` +>>DEFINE variable = value +>>IF condition +...source text... +>>ELSE +...source text... +>>END-IF +``` + +**事前定義コンパイル変数**: +- COBOL, COBOL2002, ENTERPRISE_COBOL, IBM_ARCHITECTURE, +OS_FLAVOR, LOCALE, LANGUAGE 等 + +### JAVA-CALLABLE + +Javaから呼出し可能なCOBOLプログラムの指定。 + +``` +>>JAVA-CALLABLE program-name +``` + +### JAVA-SHAREABLE + +COBOLプログラムがJavaと共有可能なデータを持つことを指定。 + +``` +>>JAVA-SHAREABLE +``` + +--- + +## IBM拡張機能(主要なもの) + +Enterprise COBOL for z/OS V6.5は多くのIBM拡張機能を提供する: + +- 特殊レジスタ: ADDRESS OF, LENGTH OF, RETURN-CODE, JSON-CODE, XML-CODE等 +- 16進リテラル表記: X"...", NX"...", UX"..." +- NULL終端リテラル: Z"..." +- 日本語処理のためのDBCSサポート: Gリテラル、USAGE DISPLAY-1、PICTURE G/N +- 条件付きコンパイル: >>DEFINE, >>IF, >>EVALUATE +- CALL文のJava静的メソッド呼出し +- JSON GENERATE/PARSE文 +- XML GENERATE/PARSE文 +- ALLOCATE/FREE文による動的記憶管理 +- 動的長さ基本項目(DYNAMIC LENGTH) +- 無制限表(OCCURS UNBOUNDED) +- 全関数のALL下标指定 +- 64ビットアドレッシング(LP(64)) + +--- + +## ファイルステータスキー値 + +| コード | 意味 | +|--------|------| +| 00 | 正常終了 | +| 02 | 正常終了(重複レコード) | +| 04 | 正常終了(レコード長不整合) | +| 05 | 正常終了(参照オプショナルファイル未存在) | +| 10 | ファイル終了 | +| 14 | 相対ファイルの範囲外レコード | +| 21 | シーケンスエラー | +| 22 | 重複キー | +| 23 | レコード未存在 | +| 24 | バッファ不足 | +| 30 | 恒久的エラー | +| 34 | ファイル編成の境界違反 | +| 35 | ファイル未存在(OPEN) | +| 37 | アクセスモード違反 | +| 38 | クローズ前のOPEN | +| 39 | 属性矛盾 | +| 41 | OPEN時のファイル未存在 | +| 42 | クローズ済ファイルのOPEN | +| 43 | 書込み禁止ファイルの書込み | +| 44 | 読込み専用ファイルの書換え/削除 | +| 46 | 読込み専用(順次) | +| 47 | OPEN時のファイル読込み不可 | +| 48 | ファイル編成とアクセスモード矛盾 | +| 49 | OPEN時のファイル属性不整合 | +| 90 | 論理エラー該当せず | +| 91 | ファイル機構のアベンド | +| 92 | ストレージ不足 | +| 93 | リソースアクセス不可 | +| 94 | ファイルの位置指定不整合 | +| 95 | ファイル宣言の不整合 | +| 96 | 入出力制御の矛盾 | +| 97 | ファイルの編成/モード矛盾 | +| 98 | ボリューム処理エラー | +| 99 | レコードロック競合 | + +--- + +*本ドキュメントは IBM Enterprise COBOL for z/OS V6.5 Language Reference (SC27-8713-04) の内容に基づいて作成されました。* diff --git a/品質管理/カバレッジ統計.md b/品質管理/カバレッジ統計.md index f43f018..339c88d 100644 --- a/品質管理/カバレッジ統計.md +++ b/品質管理/カバレッジ統計.md @@ -1,7 +1,7 @@ # カバレッジ統計 > 本ファイルは全コードベース(KIN + ZAN + SUB)を統合したカバレッジ状況を集計する。 -> 定義ファイル(COBOLキーワード網羅定義書.md)の Part 1(予約語一覧)・Part 3.1(カテゴリ定義)を参照して集計する。 +> 定義ファイル(COBOLキーワード網羅定義書.md)の ## 1.(予約語一覧)・## 2.(TYPE定義)を参照して集計する。 > 凡例:◎=使用済、○=使用あり(一部構文のみ)、×=未使用、△=調査中 --- @@ -62,204 +62,256 @@ --- -## 2. カテゴリカバレッジ +## 2. TYPE定義カバレッジ(PICTURE句) -### 2.1 カテゴリ別使用状況 +> COBOLキーワード網羅定義書.mdの ## 2.1 PICTURE記号一覧(11種)に基づき、コードベースでの使用状況を集計する。 -| カテゴリ | 全文数 | 使用文数 | 使用文一覧 | 未使用文 | カバレッジ率 | -|---------|:-----:|:-------:|-----------|---------|:----------:| -| 入出力(ファイル) | 7 | 6 | READ, WRITE, OPEN, CLOSE, WRITE FROM, WRITE ADVANCING | DELETE(SEQ), REWRITE, START | 85.7% | -| 入出力(ソート) | 4 | 0 | — | SORT, MERGE, RELEASE, RETURN | 0.0% | -| 入出力(画面/システム) | 3 | 2 | ACCEPT, DISPLAY | STOP RUN(SUB03END使用), STOP literal | 66.7% | -| 算術演算 | 5 | 5 | ADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTE | —(CORRESPONDING/REMAINDERは一部使用) | 100% | -| 制御(条件分岐) | 4 | 4 | IF, EVALUATE, SEARCH, CONTINUE | — | 100% | -| 制御(繰返し) | 1 | 1 | PERFORM(UNTIL/VARYING/THRU/TEST AFTER) | — | 100% | -| 制御(分岐/呼出) | 7 | 4 | CALL, GOBACK, EXIT, GO TO | CANCEL, ENTRY, ALTER, EXIT PROGRAM | 57.1% | -| 文字操作 | 4 | 4 | STRING, UNSTRING, INSPECT, INITIALIZE | —(MOVE含む) | 100% | -| 埋込み言語 | 1 | 1 | EXEC SQL ... END-EXEC | —(EXEC CICS未使用) | 100% | -| **合計** | **38** | **27** | **(上記参照)** | **11件(ALTER,CANCEL,ENTRY,EXEC CICS,EXIT PROGRAM,MERGE,RELEASE,RETURN,REWRITE,SORT,START)** | **71.1%** | +### 2.1 PICTURE記号別使用状況 -### 2.2 未カバーカテゴリ +| No. | 記号 | 名称 | 使用状況 | 使用例 | +|:---:|:----|:-----|:-------:|:------| +| 1 | X | 英数字文字 | ◎ | PIC X(1)~X(303) 全プログラム(19種の長さ) | +| 2 | G | DBCS文字 | × | 未使用(日本語項目は全てPIC Xで定義) | +| 3 | N | ナショナル/DBCS文字 | × | 未使用 | +| 4 | 9 | 数字 | ◎ | PIC 9(1)~9(9) 全プログラム(カウンタ・フラグ・集計) | +| 5 | 9(m)V9(n) | 固定小数点数 | ◎ | PIC 9(4)V9(1)(WRK-ACCUM-HOURS等) | +| 6 | S9(m)V9(n) | 符号付き固定小数点数 | ○ | PIC S9(5)V9(1)(ZAN03CHK) | +| 7 | S9(m)V9(n) COMP-3 | パック10進符号付き固定小数 | ◎ | PIC S9(7)V9(1) COMP-3(DB-OVT-HOURS) | +| 8 | S9(m) COMP-3 | パック10進符号付き整数 | ◎ | PIC S9(9) COMP-3(CUN-*計数項目 計15変数) | +| 9 | S9(m) COMP | 2進符号付き整数 | ◎ | PIC S9(9) COMP(索引・カウンタ) | +| 10 | S9(m) BINARY | 2進符号付き整数(COMP同義) | × | COMPで代用、BINARY表記は不使用 | +| 11 | ZZZ9 | ゼロ抑制編集 | × | 未使用(Z(3)9.9は補足形式として使用中) | -| カテゴリ | 未使用文 | 備考 | -|---------|---------|------| -| 入出力(ソート) | SORT, MERGE, RELEASE, RETURN | JCL PGM=SORTに委譲。COBOL SORT不使用 | -| 制御(分岐/呼出) | CANCEL, ENTRY, ALTER, EXIT PROGRAM | GOBACKで代用。ALTERは非推奨 | -| 入出力(ファイル) | REWRITE, START | VSAM/INDEXED非対応。DELETEはEXEC SQLのみ | +### 2.2 未使用PICTURE記号 + +| 記号 | 名称 | 備考 | +|:----:|:-----|:-----| +| G | DBCS文字 | 日本語項目はPIC Xで十分 | +| N | ナショナル/DBCS文字 | NSYMBOL(NATIONAL)設定時のみ必要 | +| BINARY | 2進符号付き整数 | COMPで代用可 | +| ZZZ9 | ゼロ抑制編集 | 現在不使用 | + +### 2.3 補足:特殊編集形式 + +コードベースでは上記11種に加え、以下の編集形式が使用されている: + +| 形式 | 使用先 | +|:----|:-------| +| +9(009) | WS-DISP-HV-SICK-H等(符号付き表示編集) | +| Z(3)9.9 | WS-DISP-HV-ANNUAL-H等(ゼロ抑制編集・小数点明示) | +| S9 DISPLAY | WS-DISP-CUN-DBXUPD等(COMP-3→DISPLAY変換用) | +| 9(004).9(001) | 編集出力時の小数点明示形式 | --- -## 3. 予約語・構文パターンカバレッジ +## 3. 予約語カバレッジ一覧 -> 定義ファイル(COBOLキーワード網羅定義書.md Part 1)の「対応するCOBOL節/文」列に基づき、各構文パターンの使用状況を記録する。 -> 優先度:高=当該プログラムタイプで必須、中=使用頻度高い、低=特殊用途 -> 凡例:◎=使用済(複数PGM)、○=使用あり(単一PGM)、×=未使用 +> 全201予約語(COBOLキーワード網羅定義書.md Part1 192語 + 補足9語)をアルファベット順に一覧する。 +> 凡例:◎=複数PGMで使用、○=単一PGMのみ、×=未使用 -### 3.1 入出力(ファイル) - -#### READ - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| READ INTO | レコード読込+データ移動 | ◎ | 高 | 全ファイル読込PGM(KIN03EXP/KIN06CLDを除く) | -| READ KEY IS | キー指定読込 | × | 高 | 逐次読込のみ、キー指定不要 | -| READ AT END | 終了条件処理 | ◎ | 高 | READ AT END / NOT AT END / END-READ | -| READ NEXT | 順次読込 | ◎ | 高 | 全READ文は順次読込 | -| READ PREVIOUS | 逆方向読込 | × | 低 | 動的アクセス時のみ | -| READ NOT AT END | 終了条件否定処理 | ○ | 中 | ZAN01CHKなど | -| READ WITH WAIT | ファイル解放待ち | × | 低 | | -| READ LOCK/IGNORE LOCK | ロック制御 | × | 低 | | - -#### WRITE - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| WRITE FROM | 転記書出 | ○ | 高 | KIN04CHK(2050NORMSOR)のみ | -| WRITE ADVANCING | 改行・改ページ制御 | ○ | 中 | KIN09CSV(PAGE/2 LINES/1 LINE) | -| WRITE END-OF-PAGE | ページ終了処理 | × | 低 | | -| WRITE INVALID KEY | キー異常処理 | × | 中 | 索引ファイル時 | - -#### OPEN - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| OPEN INPUT | 入力オープン | ◎ | 高 | 全ファイル入力PGM | -| OPEN OUTPUT | 出力オープン | ◎ | 高 | 全ファイル出力PGM | -| OPEN I-O | 入出力オープン | × | 高 | VSAM非対応 | -| OPEN EXTEND | 追加オープン | × | 中 | | -| OPEN WITH NO REWIND | 巻戻しなし | × | 低 | テープ時のみ | - -#### CLOSE - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| CLOSE WITH LOCK | ロック付きクローズ | × | 低 | | -| CLOSE FOR REMOVAL | テープリール取外し | × | 低 | | - -#### DELETE, REWRITE, START - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| DELETE(SEQ FILE) | 逐次ファイル削除 | × | 中 | EXEC SQL DELETEはKIN02UPDで使用 | -| REWRITE FROM | 書換え+転記 | × | 中 | | -| REWRITE INVALID KEY | 書換え+キー異常処理 | × | 中 | | -| START KEY IS | 開始位置指定 | × | 中 | | -| START INVALID KEY | 位置指定+異常処理 | × | 中 | | - -### 3.2 入出力(ソート) - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| SORT ON KEY | 整列キー指定 | × | 低 | 現状未使用 | -| SORT USING | 入力ファイル指定 | × | 低 | | -| SORT GIVING | 出力ファイル指定 | × | 低 | | -| SORT INPUT PROCEDURE | 入力手続き | × | 低 | | -| SORT OUTPUT PROCEDURE | 出力手続き | × | 低 | | -| MERGE ON KEY | 結合キー指定 | × | 低 | | -| RELEASE FROM | SORTへの引渡し | × | 低 | | -| RETURN INTO | SORTからの受取り | × | 低 | | - -### 3.3 入出力(画面/システム) - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| ACCEPT FROM DATE/DAY/TIME | システム日付時刻取得 | ○ | 高 | KIN06CLDでACCEPT FROM COMMAND-LINE使用(DATE系はSUB01DAT委譲) | -| DISPLAY UPON | 出力先指定表示 | × | 高 | DISPLAYはあるがUPON句不使用 | -| DISPLAY WITH NO ADVANCING | 改行なし表示 | × | 中 | | -| STOP RUN | プログラム終了 | ○ | 高 | SUB03ENDのみ(STOP RUN RETURN-CODE) | -| STOP literal | 一時停止 | × | 低 | | - -### 3.4 算術演算 - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| ADD TO/GIVING | 加算 | ◎ | 高 | ADD 1 TO CUN-xxx(全メインプログラム) | -| ADD CORRESPONDING | 対応項目加算 | × | 中 | 未使用 | -| SUBTRACT FROM/GIVING | 減算 | ◎ | 高 | KIN07DAI(6100/6300)、ZAN06UPD | -| SUBTRACT CORRESPONDING | 対応項目減算 | × | 中 | 未使用 | -| MULTIPLY BY/GIVING | 乗算 | ◎ | 中 | KIN07DAI、ZAN06UPD(時間→分変換) | -| DIVIDE INTO/BY | 除算 | ◎ | 中 | ZAN01CHK、ZAN05CAL、SUB05TIM、KIN07DAI | -| DIVIDE REMAINDER | 商と余り | ◎ | 中 | DIVIDE...GIVING...REMAINDER(ZAN01, ZAN05, SUB05, KIN07) | -| COMPUTE | 計算代入 | ◎ | 高 | ZAN01, ZAN03, ZAN05, KIN03, KIN06, SUB05 | -| ROUNDED | 丸め指定 | ◎ | 中 | COMPUTE ROUNDED(上記PGM) | -| SIZE ERROR | サイズ異常処理 | ○ | 中 | COMPUTE ON SIZE ERROR(ZAN01, ZAN03) | - -### 3.5 制御(条件分岐) - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| IF THEN/ELSE/END-IF | 条件分岐 | ◎ | 高 | 全メインプログラム + SUB04CHK, SUB05TIM | -| EVALUATE ALSO/WHEN/OTHER | 多分岐 | ◎ | 高 | 12本中11本(KIN04/KIN06以外) | -| SEARCH ALL | バイナリサーチ | ◎ | 中 | KIN03EXP(休日), ZAN03CHK(休日) | -| SEARCH VARYING | 変数変化付探索 | × | 中 | SEARCH(非ALL)はKIN01INPのみ | -| CONTINUE | 無操作 | ◎ | 低 | SEARCH ALL AT END, EVALUATE WHEN OTHER | - -### 3.6 制御(繰返し) - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| PERFORM 外部段落 | 段落呼出 | ◎ | 高 | 全メインプログラム | -| PERFORM THRU | 段落範囲呼出 | ○ | 中 | KIN03EXP(2100 THRU ...-EXIT) | -| PERFORM TIMES | 回数指定 | × | 中 | 未使用 | -| PERFORM UNTIL | 条件指定 | ◎ | 高 | 全メインプログラム | -| PERFORM VARYING/AFTER | 変数変化付 | ◎ | 高 | ZAN06UPD, KIN06CLD(線形探索) | -| PERFORM インライン | インライン記述 | × | 高 | 全PERFORMは外部段落呼出し | -| PERFORM TEST BEFORE/AFTER | 判定タイミング指定 | ○ | 中 | ZAN06UPD(PERFORM TEST AFTER VARYING) | - -### 3.7 制御(分岐/呼出) - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| CALL USING | 引数付呼出 | ◎ | 高 | 全メインプログラム(CALL SUB01-05) | -| CALL RETURNING | 戻値付呼出 | × | 中 | RETURN-CODEは使用するがCALL RETURNING不使用 | -| CALL ON EXCEPTION | 呼出異常処理 | × | 中 | | -| GOBACK | プログラム終了 | ◎ | 高 | 全14プログラム | -| EXIT(plain) | 段落・節の共通終点 | ◎ | 中 | 全14プログラム(xxx-EXT. EXIT.) | -| EXIT PROGRAM | 呼出元復帰 | × | 高 | GOBACKで代用 | -| EXIT PARAGRAPH/SECTION | 段落・節終了 | × | 低 | | -| EXIT PERFORM/CYCLE | PERFORM脱出 | × | 低 | | -| GO TO | 制御移行 | ○ | 中 | ZAN01CHK, KIN01INP, KIN04CHK, SUB04CHK, KIN08DBU(DEPENDING ON) | -| CANCEL ON EXCEPTION | プログラム解放 | × | 低 | | -| ALTER TO PROCEED TO | 分岐先変更 | × | 低 | 廃止予定 | -| ENTRY USING | 別エントリポイント | × | 低 | | - -### 3.8 文字操作 - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| STRING DELIMITED BY/INTO | 文字列連結 | ◎ | 高 | KIN01,02,04,06, ZAN01-04,06, SUB02MSG | -| STRING WITH POINTER | 位置指定連結 | ○ | 中 | KIN09CSV(2000MAJSOR/2500-SHORT-MODE) | | -| UNSTRING DELIMITED BY/INTO | 文字列分解 | ◎ | 高 | KIN01INP, KIN04CHK, ZAN01CHK | -| UNSTRING WITH POINTER | 位置指定分解 | × | 中 | | -| UNSTRING TALLYING | 分解数計数 | ○ | 中 | KIN01INP, KIN04CHK, ZAN01CHK(TALLYING IN CNT) | -| INSPECT TALLYING | 文字計数 | ◎ | 中 | ZAN01CHK, KIN04CHK, SUB04CHK | -| INSPECT REPLACING | 文字置換 | ○ | 中 | KIN09CSV(CSVカンマ・改行サニタイズ) | | -| INSPECT CONVERTING | 文字変換 | × | 中 | | -| INITIALIZE REPLACING | カテゴリ別初期化 | × | 中 | 全PGMでINITIALIZE(plain)を使用。REPLACING句未使用 | -| MOVE TO | 基本代入 | ◎ | 高 | 全14プログラム | -| MOVE CORRESPONDING | 対応項目代入 | × | 中 | | - -### 3.9 埋込み言語 - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| EXEC SQL ... END-EXEC | DB2アクセス | ◎ | 高 | KIN02UPD, KIN03EXP, KIN08DBU, KIN09CSV, ZAN06UPD | -| EXEC CICS ... END-EXEC | CICSコマンド | × | 低 | 現状バッチのみ | - -### 3.10 組込み関数 - -| 構文パターン | 説明 | 使用状況 | 優先度 | 備考 | -|-------------|------|:-------:|:------:|------| -| FUNCTION WHEN-COMPILED | コンパイル日時取得 | ◎ | 高 | 全14メインプログラム(MSG033出力) | -| FUNCTION TRIM | 文字列前後空白除去 | ◎ | 中 | KIN08DBU(1130-MODESOR), KIN09CSV | -| FUNCTION MOD | 剰余算 | ◎ | 中 | KIN03EXP(曜日/うるう年), KIN06CLD(うるう年) | -| FUNCTION INTEGER-OF-DATE | 日付→整数変換 | ◎ | 中 | KIN03EXP, KIN06CLD | -| FUNCTION NUMVAL | 文字→数値変換 | ◎ | 中 | KIN03EXP, SUB04CHK | -| FUNCTION CURRENT-DATE | 現在日時取得 | ◎ | 高 | SUB01DAT(基本日付取得) | -| FUNCTION MIN/MAX | 最小/最大値 | ○ | 中 | KIN07DAI(FUNCTION MIN/MAX) | -| FUNCTION LENGTH/REVERSE/UPPER-CASE/LOWER-CASE | その他汎用関数 | × | 低 | 未使用 | -| FUNCTION RANDOM | 乱数生成 | × | 低 | 未使用 | -| FUNCTION SUBSTITUTE | 文字列置換 | × | 中 | INSPECT REPLACINGで代用 | +| No. | 予約語 | 使用状況 | 使用プログラム/備考 | +|:---:|--------|:-------:|-------------------| +| 1 | ACCEPT | ◎ | ACCEPT FROM COMMAND-LINE(KIN06CLD,KIN08DBU)、DATE/DAY/TIME系SUB01DAT委譲 | +| 2 | ACCESS | × | | +| 3 | ADD | ◎ | ADD TO/GIVING 全メインプログラム | +| 4 | AFTER | ◎ | WRITE AFTER ADVANCING(KIN09CSV)、INSPECT AFTER(KIN09CSV)、PERFORM VARYING AFTER(ZAN06UPD) | +| 5 | ALL | ◎ | SEARCH ALL(KIN03EXP,ZAN03CHK)、INSPECT ALL(ZAN01CHK) | +| 6 | ALPHABETIC | × | | +| 7 | ALPHABETIC-UPPER | × | | +| 8 | ALSO | ◎ | EVALUATE ALSO(11プログラム) | +| 9 | AND | ◎ | 条件式 全プログラム | +| 10 | ANY | × | | +| 11 | APPLY | × | | +| 12 | ASCENDING | ◎ | OCCURS ASCENDING KEY(KIN01INP,SUB04CHK)、SEARCH ALL | +| 13 | ASSIGN | ◎ | SELECT ASSIGN TO 全プログラム | +| 14 | AT | ◎ | READ AT END、WRITE AT END-OF-PAGE、SEARCH AT END | +| 15 | AUTHOR | ◎ | IDENTIFICATION DIVISION 全プログラム | +| 16 | BINARY | × | COMP使用、BINARY表記不使用 | +| 17 | BLOCK | ◎ | FD BLOCK CONTAINS 全ファイル入出力PGM | +| 18 | BY | ◎ | PERFORM VARYING BY、MULTIPLY BY、DIVIDE BY、CALL BY REFERENCE | +| 19 | CALL | ◎ | CALL SUB01-05 全メインプログラム | +| 20 | CHARACTER | × | | +| 21 | CHARACTERS | ◎ | INSPECT CHARACTERS(ZAN01CHK,KIN04CHK,SUB04CHK) | +| 22 | CLOSE | ◎ | CLOSE 全ファイル入出力PGM | +| 23 | COMP | ◎ | USAGE COMP カウンタ/フラグ | +| 24 | COMP-3 | ◎ | USAGE COMP-3 集計/金額項目 | +| 25 | COMP-4 | × | COMPと同義だが不使用 | +| 26 | COMPUTE | ◎ | COMPUTE ROUNDED(ZAN01,ZAN03,ZAN05,KIN03,KIN06,SUB05) | +| 27 | CONDITION | × | | +| 28 | CONFIGURATION | ◎ | CONFIGURATION SECTION 全プログラム | +| 29 | CONTAINS | ◎ | FD BLOCK CONTAINS / RECORD CONTAINS | +| 30 | CONTINUE | ◎ | 全プログラム(SEARCH AT END、EVALUATE OTHER) | +| 31 | CONVERTING | × | | +| 32 | COPY | ◎ | COPY 全プログラム(C書式取込み) | +| 33 | CORR | × | MOVE CORR/ADD CORR未使用 | +| 34 | COUNT | × | UNSTRING COUNT IN未使用 | +| 35 | CURSOR | ◎ | DECLARE/OPEN/FETCH/CLOSE CURSOR(KIN02UPD,KIN09CSV) | +| 36 | DATA | ◎ | DATA DIVISION 全プログラム | +| 37 | DATE | ◎ | ACCEPT FROM DATE(SUB01DAT委譲) | +| 38 | DATE-COMPILED | ◎ | IDENTIFICATION DIVISION 全プログラム | +| 39 | DATE-WRITTEN | ◎ | IDENTIFICATION DIVISION 全プログラム | +| 40 | DECLARATIVES | × | | +| 41 | DELETE | × | COBOL DELETE(SEQ FILE)未使用。EXEC SQL DELETEはKIN02UPD | +| 42 | DELIMITED | ◎ | STRING/UNSTRING DELIMITED BY | +| 43 | DELIMITER | × | UNSTRING DELIMITER IN未使用 | +| 44 | DEPENDING | ◎ | GO TO DEPENDING ON(KIN08DBU)、OCCURS DEPENDING ON | +| 45 | DESCENDING | × | | +| 46 | DISPLAY | ◎ | DISPLAY文(MSG出力) 5プログラム | +| 47 | DISPLAY-1 | × | | +| 48 | DIVIDE | ◎ | DIVIDE GIVING REMAINDER(ZAN01,ZAN05,SUB05,KIN07) | +| 49 | DIVISION | ◎ | IDENTIFICATION/ENVIRONMENT/DATA/PROCEDURE DIVISION 全プログラム | +| 50 | DOWN | × | SET DOWN未使用 | +| 51 | DYNAMIC | × | | +| 52 | EJECT | × | | +| 53 | ELSE | ◎ | IF ELSE END-IF 全プログラム | +| 54 | END | ◎ | END-IF、END-READ、END-PERFORM等スコープターミネータ | +| 55 | END-ADD | × | | +| 56 | END-CALL | ◎ | END-CALL(CALL使用PGM) | +| 57 | END-COMPUTE | ◎ | END-COMPUTE(COMPUTE使用PGM) | +| 58 | END-DIVIDE | × | | +| 59 | END-EVALUATE | ◎ | END-EVALUATE(EVALUATE使用11PGM) | +| 60 | END-EXEC | ◎ | END-EXEC(EXEC SQL使用5PGM) | +| 61 | END-IF | ◎ | END-IF 全プログラム | +| 62 | END-PERFORM | ◎ | END-PERFORM 全プログラム | +| 63 | END-READ | ◎ | END-READ(READ使用PGM) | +| 64 | END-SEARCH | ◎ | END-SEARCH(SEARCH使用PGM) | +| 65 | END-STRING | ◎ | END-STRING(STRING使用PGM) | +| 66 | END-SUBTRACT | × | | +| 67 | END-UNSTRING | ◎ | END-UNSTRING(UNSTRING使用PGM) | +| 68 | ENVIRONMENT | ◎ | ENVIRONMENT DIVISION 全プログラム | +| 69 | ERROR | ◎ | ON SIZE ERROR(COMPUTE:ZAN01,ZAN03) | +| 70 | EVALUATE | ◎ | EVALUATE ALSO WHEN OTHER END-EVALUATE 11プログラム | +| 71 | EXEC | ◎ | EXEC SQL END-EXEC(KIN02UPD,KIN03EXP,KIN08DBU,KIN09CSV,ZAN06UPD) | +| 72 | EXCEPTION | × | CALL ON EXCEPTION未使用 | +| 73 | EXECUTE | × | | +| 74 | EXIT | ◎ | 段落共通終点 EXIT 全14プログラム | +| 75 | FALSE | × | | +| 76 | FD | ◎ | FILE DESCRIPTION 全ファイル入出力PGM | +| 77 | FILE | ◎ | FILE SECTION、FILE-CONTROL 全プログラム | +| 78 | FILE-CONTROL | ◎ | FILE-CONTROL SELECT ASSIGN 全プログラム | +| 79 | FILLER | ◎ | FILLER 全プログラム(DATA DIVISION) | +| 80 | FIRST | ◎ | INSPECT FIRST(ZAN01CHK,KIN04CHK,SUB04CHK) | +| 81 | FOR | ◎ | PERFORM VARYING FOR、INSPECT FOR | +| 82 | FROM | ◎ | ACCEPT FROM、STRING FROM、PERFORM VARYING FROM | +| 83 | GET | × | | +| 84 | GIVING | ◎ | ADD/DIVIDE/MULTIPLY/SUBTRACT GIVING | +| 85 | GO | ◎ | GO TO(ZAN01CHK,KIN01INP,KIN04CHK,SUB04CHK,KIN08DBU(DEPENDING ON)) | +| 86 | GOBACK | ◎ | GOBACK 全14プログラム | +| 87 | GREATER | × | | +| 88 | HIGH-VALUE | × | | +| 89 | I-O-CONTROL | × | I-O-CONTROL段落不使用 | +| 90 | ID | × | | +| 91 | IDENTIFICATION | ◎ | IDENTIFICATION DIVISION 全プログラム | +| 92 | IF | ◎ | IF ELSE END-IF 全プログラム | +| 93 | IN | ◎ | INSPECT TALLYING IN、SEARCH IN | +| 94 | INDEXED | ◎ | OCCURS INDEXED BY(KIN01INP,KIN03EXP,ZAN03CHK) | +| 95 | INITIAL | × | PROGRAM-ID INITIAL不使用 | +| 96 | INITIALIZE | ◎ | INITIALIZE 全プログラム(REPLACING句は×) | +| 97 | INPUT | ◎ | OPEN INPUT、INPUT-OUTPUT SECTION | +| 98 | INPUT-OUTPUT | ◎ | INPUT-OUTPUT SECTION 全プログラム | +| 99 | INSERT | ◎ | EXEC SQL INSERT(KIN02UPD,KIN08DBU) | +| 100 | INSPECT | ◎ | INSPECT TALLYING/REPLACING(ZAN01CHK,KIN04CHK,SUB04CHK,KIN09CSV) | +| 101 | INTO | ◎ | READ INTO、STRING INTO、UNSTRING INTO | +| 102 | INVALID | × | COBOL INVALID KEY未使用 | +| 103 | IS | ◎ | 条件式IS、ACCESS MODE IS等 | +| 104 | KEY | ◎ | ASCENDING/DESCENDING KEY、SEARCH KEY、OCCURS KEY | +| 105 | LABEL | ◎ | FD LABEL RECORDS STANDARD | +| 106 | LENGTH | × | FUNCTION LENGTH未使用 | +| 107 | LINKAGE | ◎ | LINKAGE SECTION サブプログラム(SUB01-05)+CALL有PGM | +| 108 | LOW-VALUE | × | | +| 109 | MODE | ◎ | RECORDING MODE F | +| 110 | MOVE | ◎ | MOVE TO 全14プログラム | +| 111 | MULTIPLY | ◎ | MULTIPLY BY/GIVING(KIN07DAI,ZAN06UPD) | +| 112 | NEXT | × | | +| 113 | NOT | ◎ | NOT AT END、NOT ON ERROR、IF NOT 全プログラム | +| 114 | NUMERIC | ◎ | IF NUMERIC(SUB04CHK) | +| 115 | OBJECT-COMPUTER | ◎ | OBJECT-COMPUTER 全プログラム | +| 116 | OCCURS | ◎ | OCCURS TIMES/DEPENDING ON/INDEXED BY | +| 117 | OF | ◎ | データ参照修飾(全プログラム) | +| 118 | OMITTED | × | | +| 119 | ON | ◎ | ON SIZE ERROR、OCCURS DEPENDING ON | +| 120 | OPEN | ◎ | OPEN INPUT/OUTPUT 全ファイル入出力PGM | +| 121 | OPTIONS | × | | +| 122 | OR | ◎ | 条件式 OR、UNSTRING DELIMITED BY OR | +| 123 | ORDER | × | | +| 124 | ORGANIZATION | × | | +| 125 | OTHER | ◎ | EVALUATE WHEN OTHER | +| 126 | OUTPUT | ◎ | OPEN OUTPUT | +| 127 | PACKED-DECIMAL | × | COMP-3使用、PACKED-DECIMAL表記不使用 | +| 128 | PAGE | ◎ | WRITE ADVANCING PAGE(KIN09CSV) | +| 129 | PAGE-COUNTER | × | | +| 130 | PERFORM | ◎ | PERFORM 全14プログラム(VARYING/UNTIL/THRU/TEST AFTER) | +| 131 | PIC | ◎ | PICTURE句 全プログラム | +| 132 | POINTER | ◎ | STRING WITH POINTER(KIN09CSV) | +| 133 | PROCEDURE | ◎ | PROCEDURE DIVISION 全プログラム | +| 134 | PROGRAM-ID | ◎ | PROGRAM-ID 全プログラム | +| 135 | RANDOM | × | | +| 136 | READ | ◎ | READ INTO AT END 全ファイル読込PGM | +| 137 | RECORD | ◎ | FD RECORD CONTAINS | +| 138 | RECORDING | ◎ | FD RECORDING MODE F | +| 139 | RECORDS | ◎ | FD LABEL RECORDS STANDARD、BLOCK CONTAINS RECORDS | +| 140 | REDEFINES | ◎ | REDEFINES(各種PGM WORKING-STORAGE) | +| 141 | REMAINDER | ◎ | DIVIDE GIVING REMAINDER(ZAN01,ZAN05,SUB05,KIN07) | +| 142 | REMOVAL | × | | +| 143 | REPLACING | ◎ | COPY REPLACING、INSPECT REPLACING(KIN09CSV)。INITIALIZE REPLACINGは× | +| 144 | RERUN | × | | +| 145 | RETURN-CODE | ◎ | RETURN-CODE 全プログラム(SUB03ENDでMOVE→STOP RUN) | +| 146 | ROUNDED | ◎ | COMPUTE ROUNDED(ZAN01,ZAN03,ZAN05,KIN03,KIN06,SUB05) | +| 147 | RUN | ○ | STOP RUN RETURN-CODE(SUB03ENDのみ) | +| 148 | SEARCH | ◎ | SEARCH ALL(KIN03EXP,ZAN03CHK)、SEARCH(KIN01INP) | +| 149 | SECTION | ◎ | CONFIGURATION/INPUT-OUTPUT/WORKING-STORAGE/LINKAGE/PROCEDURE SECTION | +| 150 | SELECT | ◎ | SELECT ASSIGN(FILE-CONTROL)全プログラム、EXEC SQL SELECT | +| 151 | SENTENCE | × | | +| 152 | SET | ◎ | SET condition-name TO TRUE(条件名設定) | +| 153 | SHIFT-IN | × | | +| 154 | SHIFT-OUT | × | | +| 155 | SIZE | ◎ | ON SIZE ERROR(COMPUTE:ZAN01CHK,ZAN03CHK) | +| 156 | SKIP2 | × | | +| 157 | SOURCE-COMPUTER | ◎ | SOURCE-COMPUTER IBM-ZSERIES 全プログラム | +| 158 | SPACE | ◎ | SPACE/SPACES INITIALIZE後、VALUE、MOVE | +| 159 | SPACES | ◎ | SPACES(SPACEと同義) | +| 160 | SQL | ◎ | EXEC SQL(KIN02UPD,KIN03EXP,KIN08DBU,KIN09CSV,ZAN06UPD) | +| 161 | STANDARD | ◎ | FD LABEL RECORDS STANDARD | +| 162 | STOP | ○ | STOP RUN(SUB03ENDのみ) | +| 163 | STRING | ◎ | STRING DELIMITED BY INTO(KIN01,02,04,06,ZAN01-04,06,SUB02MSG) | +| 164 | SUBTRACT | ◎ | SUBTRACT FROM/GIVING(KIN07DAI,ZAN06UPD) | +| 165 | TABLE | × | | +| 166 | TALLYING | ◎ | INSPECT TALLYING、UNSTRING TALLYING IN | +| 167 | TEST | ◎ | PERFORM TEST AFTER(ZAN06UPD) | +| 168 | THEN | ◎ | IF THEN(一部PGMで明示的THEN使用) | +| 169 | THRU | ◎ | PERFORM THRU(KIN03EXP)、VALUE THRU | +| 170 | TIME | ◎ | ACCEPT FROM TIME(SUB01DAT経由) | +| 171 | TIMES | ◎ | OCCURS TIMES | +| 172 | TO | ◎ | MOVE TO、ADD TO、GO TO 全プログラム | +| 173 | TRUE | ◎ | EVALUATE TRUE、SET condition TO TRUE | +| 174 | TYPE | × | | +| 175 | UNSTRING | ◎ | UNSTRING DELIMITED BY INTO(KIN01INP,KIN04CHK,ZAN01CHK) | +| 176 | UNTIL | ◎ | PERFORM UNTIL 全プログラム | +| 177 | UP | × | SET UP未使用 | +| 178 | UPON | × | DISPLAY UPON未使用 | +| 179 | USAGE | ◎ | USAGE DISPLAY/COMP/COMP-3 | +| 180 | USE | × | | +| 181 | USING | ◎ | PROCEDURE DIVISION USING、CALL USING 全プログラム | +| 182 | VALUE | ◎ | VALUE 全プログラム(88条件名、初期値) | +| 183 | VALUES | ◎ | VALUES(88条件名複数値) | +| 184 | VARYING | ◎ | PERFORM VARYING(ZAN06UPD,KIN06CLD)、SEARCH VARYING(KIN01INP) | +| 185 | WHEN | ◎ | EVALUATE WHEN、SEARCH WHEN | +| 186 | WHEN-COMPILED | ◎ | FUNCTION WHEN-COMPILED 全14プログラム | +| 187 | WITH | ◎ | STRING WITH POINTER、WRITE WITH ADVANCING | +| 188 | WORKING-STORAGE | ◎ | WORKING-STORAGE SECTION 全プログラム | +| 189 | WRITE | ◎ | WRITE FROM/ADVANCING 全ファイル出力PGM | +| 190 | WRITE-ONLY | × | | +| 191 | ZERO | ◎ | ZERO/ZEROS VALUE 0、MOVE ZERO | +| 192 | ZEROS | ◎ | ZEROS(ZEROと同義) | +| 193 | ALTER | × | 非推奨 | +| 194 | CANCEL | × | | +| 195 | ENTRY | × | | +| 196 | MERGE | × | JCL PGM=SORTに委譲 | +| 197 | RELEASE | × | COBOL SORT未使用 | +| 198 | RETURN | × | COBOL RETURN文未使用(RETURN-CODEは特殊レジスタ) | +| 199 | REWRITE | × | VSAM非対応 | +| 200 | SORT | × | JCL PGM=SORTに委譲 | +| 201 | START | × | 順次読込のみ | --- @@ -275,20 +327,16 @@ | カバレッジ率(◎/35) | 45.7% | | カバレッジ率(◎+○/35) | 48.6% | | 実装対象限定(1-9,13-15,24-26,28,30-31)= 20種中 | 17件 = 85.0% | -| **カテゴリカバレッジ(9カテゴリ)** | | -| 全カテゴリ数 | 9 | -| カバー済カテゴリ(使用文あり) | 8 / 9 | -| 未カバーカテゴリ | 入出力(ソート)(4文すべて未使用) | -| カテゴリカバレッジ率 | 88.9% | -| **ステートメントカバレッジ(45ユニーク)** | | -| 全ステートメント数 | 45 | -| 使用済ステートメント | 37 | -| 未使用ステートメント | 8 | -| カバレッジ率 | 82.2% | -| **予約語カバレッジ** | | -| 全予約語数(COBOLキーワード網羅定義書.md準拠) | 193 | -| 使用予約語数 | 137 | -| カバレッジ率 | 71.0% | +| **PICTURE記号カバレッジ(Section 2.1)** | | +| 全記号数(11種) | 11 | +| 使用済記号(◎+○) | 7 | +| 未使用記号(×) | 4 | +| カバレッジ率 | 63.6% | +| **予約語カバレッジ(Section 3)** | | +| 全予約語数(COBOLキーワード網羅定義書.md Part1 + 補足9語) | 201 | +| 使用予約語数(◎+○) | 137 | +| 未使用予約語数(×) | 64 | +| カバレッジ率 | 68.2% | | **TYPE定義カバレッジ(11種)** | | | 全TYPE定義数 | 11 | | 使用済TYPE | 7(X, 9, 9V9, S9V9, S9V9 COMP-3, S9 COMP-3, S9 COMP) | @@ -296,23 +344,5 @@ | 未使用TYPE | 4(G, N, BINARY, ZZZ9) | | TYPEカバレッジ率 | 63.6%(特殊含め90.9%) | -## 5. サブシステムA プログラム実装状況 - -| No. | プログラムID | プログラム名 | プログラムタイプ | 実装 | 備考 | -|:---:|:-----------:|:------------|:----------------:|:----:|------| -| 1 | KIN01INP | 休暇申請CSV取込・検証処理 | 振り分け(IF) + CSV→FB | ◎ | 実装済 | -| 2 | KIN02UPD | 休暇申請DB更新処理 | DB更新(INSERT/DELETE/SELECT) | ◎ | 実装済 | -| 3 | KIN03EXP | 休暇日別展開処理 | キーブレイク + DB検索 | ◎ | 実装済 | -| 4 | KIN04CHK | 打刻項目チェック処理 | 項目チェック(重複無) | ◎ | 実装済 | -| 5 | KIN05MAT | 打刻休暇照合処理 | マッチング(1:N) + キーブレイク | ◎ | 実装済 | -| 6 | KIN06CLD | 出勤日カレンダー生成処理 | GETPUT + DB検索 | ◎ | 実装済 | -| 7 | KIN07DAI | 日別勤怠計算処理 | マッチング(1:N) + EVALUATE分岐 | ◎ | 実装済 | -| 8 | KIN08DBU | 勤怠DB更新処理 | DB更新 + SYSIN読込 | ◎ | 実装済 | -| 9 | KIN09CSV | 勤怠CSV出力処理 | 編集出力(WRITE AFTER ADVANCING) | ◎ | 実装済 | - -**サブシステムA全9プログラム実装完了** - ---- - > 本ファイルは全コードベース(KIN01-09 + ZAN01-06 + SUB01-05 = 20プログラム)を統合したカバレッジ状況。 -> サブシステムA 全9プログラム実装済。定義ファイル(COBOLキーワード網羅定義書.md)と合わせて参照すること。 +> 定義ファイル(COBOLキーワード網羅定義書.md)と合わせて参照すること。 diff --git a/品質管理/测试基准说明.md b/品質管理/测试基准说明.md new file mode 100644 index 0000000..90b51c6 --- /dev/null +++ b/品質管理/测试基准说明.md @@ -0,0 +1,569 @@ +# 测试基准说明 + +> 出典: 程序分类及测试基准.pdf (第2部:测试基准) + +## 凡例 + +| 記号 | 意味 | +|------|------| +| ◎ | 必須テスト | +| ○ | 推奨テスト | + +--- + +## 2.1 通用测试基准 + +### 2.1.1 正常系通用(8项) + +| 编号 | 项目 | 内容 | 优先级 | +|------|------|------|--------| +| COM-N001 | 最小数据(1条) | 各输入文件1条 | ◎ | +| COM-N002 | 标准数据(多条) | 正常业务量 | ◎ | +| COM-N003 | 最大数据(上限) | 定义上限(含性能) | ○ | +| COM-N004 | 全部输出文件存在 | 期望输出文件全部生成 | ◎ | +| COM-N005 | 输出文件内容确认 | 与期望值完全一致 | ◎ | +| COM-N006 | 输出记录长度确认 | 与规格一致 | ◎ | +| COM-N007 | 输出排序确认 | 键序正确 | ◎ | +| COM-N008 | JOBLOG确认 | 日期/件数/结束码 | ◎ | + +### 2.1.2 异常系通用(8项) + +| 编号 | 项目 | 内容 | 期望结果 | 优先级 | +|------|------|------|---------|--------| +| COM-A001 | 文件不存在 | 不存在文件 | OPEN STATUS 35 ABEND | ◎ | +| COM-A002 | 全部0件 | 所有输入为空 | 正常结束 输出0条 | ◎ | +| COM-A003 | 部分0件 | 部分文件为空 | 正常结束 | ◎ | +| COM-A004 | 记录长度不一致 | LRECL不匹配 | ABEND/STATUS错误 | ◎ | +| COM-A005 | 磁盘满 | 容量不足 | 顺序文件STATUS 34,VSAM文件STATUS 24 | ○ | +| COM-A006 | OPEN模式违反 | 只读文件WRITE | STATUS 37 | ◎ | +| COM-A007 | 再OPEN | OPEN中再OPEN | STATUS 41 | ◎ | +| COM-A008 | 异常结束码 | Uxxxx确认 | 与期望一致 | ◎ | + +### 2.1.3 确认项通用(8项) + +| 编号 | 确认项 | 确认内容 | 确认方法 | +|------|--------|---------|---------| +| COM-C001 | 程序开始 | 程序名/日時/版本 | JOBLOG | +| COM-C002 | OPEN确认 | 各文件OPEN正常 | JOBLOG | +| COM-C003 | 输入件数 | READ件数 | JOBLOG/CSV | +| COM-C004 | 输出件数 | WRITE件数 | JOBLOG/CSV | +| COM-C005 | 正常结束 | RETURN-CODE=0 | JOBLOG | +| COM-C006 | 异常结束 | 错误码输出 | JOBLOG | +| COM-C007 | 处理时间 | 作业经过时间 | JOBLOG时刻 | +| COM-C008 | SYSOUT | 报表输出确认 | SYSOUT文件 | + +--- + +## 2.2 类型别测试基准 + +### 匹配基础测试(1:1 / 1:N / N:1) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| MT-N001 | 正常 | 1:1 主键完全匹配 | 双方各N件,全部匹配成功 | ◎ | +| MT-N002 | 正常 | 1:N 主1件从N件 | 主件1件对应从件N件 | ◎ | +| MT-N003 | 正常 | N:1 从1件主N件 | 从件1件对应主件N件 | ◎ | +| MT-N004 | 正常 | 主件有剩余键 | 从件读完,主件剩余→WRITE W03 | ◎ | +| MT-N005 | 正常 | 从件有剩余键 | 主件读完,从件剩余→WRITE W02 | ◎ | +| MT-N006 | 异常 | 主键值重复 | 主件内同键出现2次 | ◎ | +| MT-N007 | 异常 | 键值未排序 | 升序前提被违反→误匹配 | ◎ | +| MT-R001 | 确认 | 匹配件数合计 | 正常/剩余件数之和与输入一致 | ◎ | + +### 匹配系不平衡测试 + +| 编号 | 项目 | 内容 | 优先级 | +|------|------|------|--------| +| MT-N009 | R01=1条 R02=N条 | 1:N 极端不平衡 | ◎ | +| MT-N010 | R01=N条 R02=1条 | N:1 极端不平衡 | ◎ | +| MT-N011 | R01=100万条 R02=0条 | 极大量仅存测试 | ○ | +| MT-N012 | R01全部匹配 R02全部匹配 | 完美匹配(实务中很少见) | ○ | + +### 条件分支系测试(IF / EVALUATE) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| B-N001 | 正常 | IF 2路分支(ELSE) | IF条件成立/不成立各处理 | ◎ | +| B-N002 | 正常 | IF 3路分支(ELSE IF) | ELSE IF 链式分支 | ◎ | +| B-N003 | 正常 | IF 复合条件 AND/OR | 多个条件组合 | ◎ | +| B-N004 | 正常 | IF 88-level 条件名 | 88条件直接判断 | ◎ | +| B-N005 | 正常 | IF 嵌套3层 | 内部IF引用外部IF变量 | ◎ | +| B-N006 | 正常 | EVALUATE WHEN 多值 | 多个WHEN分支 | ◎ | +| B-N007 | 正常 | EVALUATE ALSO | 多条件组合判断 | ◎ | +| B-N008 | 正常 | EVALUATE TRUE/FALSE | 条件表达式判定 | ◎ | +| B-N009 | 正常 | EVALUATE WHEN OTHER | 默认分支覆盖 | ◎ | +| B-N010 | 正常 | CONTINUE / NEXT SENTENCE | 空分支处理 | ○ | +| B-A001 | 异常 | IF 未闭合(缺少END-IF) | 编译错误,非运行时测试(属代码审查范畴) | ◎ | +| B-A002 | 异常 | EVALUATE 无WHEN OTHER | 全不匹配→无操作 | ○ | +| B-R001 | 确认 | COBOL 85 条件表达式 | 关系运算符全部覆盖 | ◎ | + +### 内部表检索测试(SEARCH / SEARCH ALL) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| T-N001 | 正常 | SEARCH ALL 等值查找(找到) | KEY等于目标存在 | ◎ | +| T-N002 | 正常 | SEARCH ALL 等值查找(未找到) | KEY等于目标不存在 | ◎ | +| T-N003 | 正常 | SEARCH ALL 多键查找 | 主键+副键组合 | ◎ | +| T-N004 | 正常 | SEARCH 顺序查找 | KEY条件不唯一用SEARCH | ○ | +| T-N005 | 正常 | OCCURS 1件表 | 表只有1条时检索 | ◎ | +| T-N006 | 正常 | OCCURS DEPENDING ON | 可变长表边界检索 | ◎ | +| T-N007 | 正常 | INDEXED BY 索引操作 | SET/SEARCH ALL 使用 INDEX | ◎ | +| T-A001 | 异常 | SEARCH ALL 未排序表 | 二进制查找未排序→误命中 | ◎ | +| T-A002 | 异常 | INDEX 越界 | OCCURS范围外访问 | ◎ | +| T-A003 | 异常 | OCCURS DEPENDING ON = 0 | 空表检索 | ◎ | +| T-R001 | 确认 | SEARCH ALL 后INDEX位置 | 找到后INDEX指向正确位置 | ◎ | + +### 子程序调用测试(CALL / LINKAGE) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| C-N001 | 正常 | CALL 字面量名 | CALL 'SUBPGM' USING ... | ◎ | +| C-N002 | 正常 | CALL USING 参数传递 | CALL侧+LINKAGE侧参数对应 | ◎ | +| C-N003 | 正常 | CALL 变量名(动态CALL) | CALL WS-PGM-NAME USING ... | ◎ | +| C-N004 | 正常 | CALL + RETURN-CODE | RETURN-CODE设置和检查 | ◎ | +| C-N005 | 正常 | CALL + EXIT PROGRAM | 子程序正常返回 | ◎ | +| C-N006 | 正常 | CALL + GOBACK | GOBACK返回(含RETURN-CODE) | ◎ | +| C-N007 | 正常 | IS INITIAL 指定程序 | 每次CALL时WS初始化确认 | ◎ | +| C-N008 | 正常 | 非IS INITIAL 程序 | CALL跨调用WS值保持 | ◎ | +| C-N009 | 正常 | CALL 多层嵌套(A→B→C) | 3层CALL传递参数 | ○ | +| C-A001 | 异常 | CALL 不存在的程序 | 未加载→ABEND | ◎ | +| C-A002 | 异常 | CALL USING 参数长度不匹配 | CALL侧与LINKAGE侧长度不同 | ◎ | +| C-A003 | 异常 | CALL CANCEL 后再CALL | CANCEL→INITIAL状态 | ◎ | +| C-A004 | 异常 | CALL 递归调用自身 | 需RECURSIVE编译选项(实务罕见),无RECURSIVE→ABEND | ○ | +| C-R001 | 确认 | CALL 前STOP RUN | CALL前正常结束 | ◎ | +| C-R002 | 确认 | CALL 后RETURN-CODE检查 | 子程序的返回码正确传递 | ◎ | + +### SYSIN读取测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| SY-N001 | 正常 | SYSIN正常参数读取 | 标准参数卡片→正确解析 | ◎ | +| SY-N002 | 正常 | SYSIN多卡连续读取 | 多张参数卡片全部正确读取 | ◎ | +| SY-N003 | 正常 | SYSIN结束处理 | SYSIN读到文件尾后正常继续 | ◎ | +| SY-A001 | 异常 | SYSIN参数格式错误 | 非法参数→错误处理/ABEND | ◎ | +| SY-A002 | 异常 | SYSIN空(0件) | 无参数卡片→默认值处理 | ◎ | +| SY-A003 | 异常 | SYSIN文件不存在 | OPEN STATUS 35 | ◎ | +| SY-R001 | 确认 | 参数解析结果 | 确认解析后的参数值与预期一致 | ◎ | + +### 分割系测试(50分割 / 25分割 / 100分割) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| S-N001 | 正常 | 50分割(正好50件) | 1件ずつ50ファイル出力 | ◎ | +| S-N002 | 正常 | 50分割(51件→余1件) | 余数文件处理 | ◎ | +| S-N003 | 正常 | 50分割(49件→1件不足) | 最终文件不满 | ◎ | +| S-N004 | 正常 | 25分割(25件→正好) | 整数倍 | ◎ | +| S-N005 | 正常 | 100分割(100件→正好) | 整数倍 | ◎ | +| S-N006 | 正常 | 分割数=1(50分割1件) | 1件入力→1ファイルのみ出力 | ◎ | +| S-N007 | 正常 | 分割数>记录数(50分割3件) | 出力ファイル仅少数 | ○ | +| S-A001 | 异常 | 分割文件OPEN失败 | 途中文件OPEN STATUS 35 | ◎ | +| S-A002 | 异常 | 分割文件磁盘满 | 途中文件WRITE STATUS 34 | ○ | +| S-R001 | 确认 | 分割文件命名规则 | 规则通りのファイル名确认 | ◎ | +| S-R002 | 确认 | 各文件件数合计=入力件数 | 总件数一致确认 | ◎ | + +### key切测试(汇总 / 聚合 / 非汇总) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| KB-N001 | 正常 | 汇总型(ADD累加) | 同键多件→金额合计正确 | ◎ | +| KB-N002 | 正常 | 聚合型(件数/最大值等) | 同键多件→件数/最大/最小正确 | ◎ | +| KB-N003 | 正常 | 非汇总型(键变化做标记) | 键切换时仅变化检测,无累加 | ◎ | +| KB-N004 | 正常 | 单键组(全部同键) | 全体1个键值→1次中断 | ◎ | +| KB-N005 | 正常 | 多键组(N个不同键) | 键值变化N-1次→N组输出 | ◎ | +| KB-N006 | 正常 | 单条记录单键组 | 1件1组→自身就是汇总值 | ◎ | +| KB-A001 | 异常 | 前键值字段未初始化 | WS-PREV-KEY初始空格→首次误中断 | ◎ | +| KB-A002 | 异常 | 累加器溢出 | 金额超PIC定义→SIZE ERROR | ○ | +| KB-R001 | 确认 | 各组小计=合计 | 各组累加值之和与全局合计一致 | ◎ | + +### SORT 类型测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| SR-N001 | 正常 | SORT USING/GIVING(升序) | 简单升序排序 | ◎ | +| SR-N002 | 正常 | SORT DESCENDING | 降序 | ◎ | +| SR-N003 | 正常 | 多键SORT | 第1键+第2键 | ◎ | +| SR-N004 | 正常 | 重复键顺序维持 | 稳定排序确认 | ◎ | +| SR-N005 | 正常 | 0条SORT | 空文件 | ◎ | +| SR-N006 | 正常 | 1条SORT | 1件 | ○ | +| SR-N007 | 正常 | INPUT PROCEDURE | 排序前筛选 | ◎ | +| SR-N008 | 正常 | OUTPUT PROCEDURE | 排序后汇总 | ◎ | +| SR-N009 | 正常 | INPUT PROCEDURE(编辑) | 排序前字段编辑 | ○ | +| SR-N010 | 正常 | OUTPUT PROCEDURE(报表) | 排序后报表 | ○ | +| SR-A001 | 异常 | SORT区不足 | 超大量 → RC=20 | ○ | +| SR-A002 | 异常 | INPUT内未RELEASE | 数据丢失 | ◎ | +| SR-A003 | 异常 | OUTPUT内未RETURN | 死循环 | ○ | +| SR-R001 | 确认 | RC=0 | 正常结束 | ◎ | +| SR-R002 | 确认 | RC=16 | SORT语法错误 | ○ | +| SR-R003 | 确认 | RC=20 | 工作区不足 | ○ | + +### MERGE 类型测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| MR-N001 | 正常 | 2文件MERGE | 两个已排序文件合并 | ◎ | +| MR-N002 | 正常 | 3文件MERGE | 三个 | ○ | +| MR-N003 | 正常 | 重复键MERGE | 同键顺序 | ◎ | +| MR-A001 | 异常 | 输入未排序文件 | 未排序→误合并 | ◎ | + +### 校验测试(含重复 / 不含重复 / 半角) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| VF-N001 | 正常 | 字段校验通过 | 输入值在允许范围内→正常输出 | ◎ | +| VF-N002 | 正常 | 字段校验拒绝 | 输入值异常→错误输出文件 | ◎ | +| VF-N003 | 正常 | 重复检测(正常) | 首次出现该键→通过 | ◎ | +| VF-N004 | 正常 | 重复检测(重复) | 同一键第二次出现→错误输出 | ◎ | +| VF-N005 | 正常 | 半角长度20桁 | 半角20桁以内→通过 | ◎ | +| VF-N006 | 正常 | 半角长度4桁 | 半角4桁以内→通过 | ◎ | +| VF-A001 | 异常 | 半角超长(21桁) | 半角21桁→截断/错误 | ◎ | +| VF-A002 | 异常 | 全角混入 | 半角字段全角文字进入PIC X(半角)域 | ◎ | +| VF-R001 | 确认 | 错误件数计数 | 正常件+错误件=输入件数 | ◎ | + +### 编辑输出测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| ED-N001 | 正常 | WRITE AFTER ADVANCING | 改页/改行的编辑输出 | ◎ | +| ED-N002 | 正常 | 编辑字段(PIC Z,9,*) | ゼロサプレス/編集文字 | ◎ | +| ED-N003 | 正常 | HEADING/FOOTING输出 | 报表头尾正确 | ◎ | +| ED-N004 | 正常 | 明细行连续输出 | N条明细行正确排序 | ◎ | +| ED-N005 | 正常 | 改页(AFTER PAGE) | 改页时HEADING重复 | ◎ | +| ED-A001 | 异常 | 编辑字段长度不足 | 数值超PIC编辑域→*溢出 | ◎ | +| ED-A002 | 异常 | 改页中改行 | AFTER PAGE + AFTER n 组合 | ○ | +| ED-R001 | 确认 | 输出行数确认 | HEADING+明细+FOOTING合计 | ◎ | + +### CSV→FB转换测试(无换行 / 有换行) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| CF-N001 | 正常 | 无换行(STRING合并) | 複数項目を1レコードに連結 | ◎ | +| CF-N002 | 正常 | 有换行(改行展开) | 1行入力→複数行出力(改行位置) | ◎ | +| CF-N003 | 正常 | 項目内カンマ引用符付き | カンマ区切り | ◎ | +| CF-N004 | 正常 | 引用符付き文字列 | "..."内のカンマ/改行を保持 | ◎ | +| CF-N005 | 正常 | 空項目連続カンマ→空文字列処理 | ○ | +| CF-N006 | 正常 | 全項目最大長 | 各項目がPIC定義ギリギリ | ◎ | +| CF-A001 | 异常 | 改行位置がRECORD長超過 | 改行展開後1行が定義長超え | ◎ | +| CF-A002 | 异常 | 引用符未閉じ | 閉じ"がない→残り全部1項目 | ◎ | + +### ASCII→EBCDIC编码转换测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| AE-N001 | 正常 | ASCII→EBCDIC 全文字 | 印字可能文字全种正确转换 | ◎ | +| AE-N002 | 正常 | EBCDIC→ASCII 全文字 | 逆方向一致确认 | ◎ | +| AE-N003 | 正常 | 制御文字保持 | 改行/タブ等制御文字保持 | ◎ | +| AE-A001 | 异常 | 変換表にない文字 | 未定義文字→替代文字/エラー | ◎ | +| AE-A002 | 异常 | 往復一致性(ラウンドトリップ) | ASCII→EBCDIC→ASCII 一致 | ◎ | +| AE-A003 | 异常 | 全角/半角混在の変換 | 全角文字がPIC X領域で化ける | ◎ | +| AE-R001 | 确认 | 変換後レコード長 | 変換前後でレコード長一致 | ◎ | + +### online/CICS测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| OL-N001 | 正常 | DFHCOMMAREA受信 | CALL側渡したデータを正しく受信 | ◎ | +| OL-N002 | 正常 | MAP入出力 | MAPの送受信(SEND/RECEIVE MAP) | ◎ | +| OL-N003 | 正常 | 画面入力→DB検索 | 画面入力値をキーにDB検索→結果表示 | ◎ | +| OL-N004 | 正常 | 複数画面遷移 | 画面A→B→Cのデータ引継ぎ | ◎ | +| OL-A001 | 异常 | DFHCOMMAREA長不一致 | CALL側と受信側の長さが異なる | ◎ | +| OL-A002 | 异常 | トランザクションABEND | 異常発生時のROLLBACK確認 | ◎ | +| OL-A003 | 异常 | MAP未定義項目参照 | MAPにない項目へのアクセス | ○ | +| OL-R001 | 确认 | 応答時間 | オンライン処理の応答時間測定 | ◎ | + +### DB操作/检索/SELECT条件测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| DB-N001 | 正常 | SELECT 1件 | WHERE条件で1件取得 | ◎ | +| DB-N002 | 正常 | SELECT 複数件 | 条件に合う全件FETCH | ◎ | +| DB-N003 | 正常 | INSERT(1件追加) | 新規レコードINSERT→SELECT確認 | ◎ | +| DB-N004 | 正常 | UPDATE(更新) | 条件に合うレコード更新 | ◎ | +| DB-N005 | 正常 | DELETE(削除) | 条件に合うレコード削除 | ◎ | +| DB-N006 | 正常 | SELECT 0件 | 条件に合うレコードなし | ◎ | +| DB-A001 | 异常 | キー重複INSERT | 一意キー違反→SQLCODEエラー | ◎ | +| DB-A002 | 异常 | 存在しないテーブル | SELECT FROM 存在しない表 | ◎ | +| DB-A003 | 异常 | NULL値処理 | NULL項目のMOVE/FETCH | ◎ | +| DB-R001 | 确认 | SQLCODE確認 | 各SQL実行後のSQLCODE確認 | ◎ | + +### 高级匹配测试(二级 / M:N组合 / 混合) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| AM-N001 | 正常 | 二级1:1→1:1 | 第一段匹配后→中间ファイル→第二段匹配 | ◎ | +| AM-N002 | 正常 | 二级N:1→N:1 | 两段均为N:1匹配 | ◎ | +| AM-N003 | 正常 | M:N→M条(主件对应) | 组合匹配输出M件 | ◎ | +| AM-N004 | 正常 | M:N→N条(从件对应) | 组合匹配输出N件 | ◎ | +| AM-N005 | 正常 | M:N→M×N条(笛卡尔积) | 组合匹配输出全组合 | ◎ | +| AM-N006 | 正常 | 1:N+同key切(混合) | 匹配分支内有同键值key切 | ◎ | +| AM-N007 | 正常 | 1:N+异key切(混合) | 匹配分支内有异键值key切 | ◎ | +| AM-N008 | 正常 | 二级M:N→M:N | 第一段M:N匹配→中间文件→第二段M:N匹配 | ◎ | +| AM-A001 | 异常 | 中间文件OPEN失败 | 第二段匹配时中间文件STATUS 35 | ◎ | +| AM-A002 | 异常 | 二级匹配键不一致 | 第一段与第二段的键字段不同 | ◎ | +| AM-R001 | 确认 | 各段匹配件数 | 第一段/第二段各自输出件数确认 | ◎ | + +### 文件编成测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| FO-N001 | 正常 | SEQUENTIAL順次読書 | 先頭→最終まで全件正常READ | ◎ | +| FO-N002 | 正常 | INDEXED(KSDS)キー指定READ | 主キーで特定レコードREAD | ◎ | +| FO-N003 | 正常 | KSDS START命令 | STARTでキー位置指定→READ | ◎ | +| FO-N004 | 正常 | RELATIVE(RRDS)RRN指定 | RELATIVE KEYで番号指定READ | ◎ | +| FO-N005 | 正常 | LINE SEQUENTIAL読書 | 改行区切りテキストファイルREAD | ◎ | +| FO-A001 | 异常 | VSAM OPEN STATUS 95 | ファイル状態不一致 | ◎ | +| FO-A002 | 异常 | KSDSキー重複WRITE | 既存キーでWRITE→STATUS 22 | ◎ | +| FO-A003 | 异常 | RRDS範囲外 | RRN定義済みRRN範囲外アクセス | ◎ | +| FO-A004 | 异常 | ファイル編成不一致OPEN | 順次プログラムでVSAMをOPEN | ◎ | +| FO-R001 | 确认 | FILE STATUS確認 | 各I/O後のSTATUS値確認 | ◎ | + +--- + +## 2.3 横跨功能测试基准 + +### 2.3.1 可变长入出力 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| VL-N001 | 正常 | RECORD IS VARYING(可变长记录) | 定义可变长记录,正常读写 | ◎ | +| VL-N002 | 正常 | OCCURS DEPENDING ON(可变长表) | ODO表正常读写,DEPENDING值变化 | ◎ | +| VL-N003 | 正常 | LINE SEQUENTIAL 文件读写 | 行可変长文件(LF结尾)一行ずつREAD | ◎ | +| VL-N004 | 正常 | 固定长→可变长转换 | 固定长记录WRITE到可变长文件 | ◎ | +| VL-N005 | 正常 | 可变长→固定长转换 | 可变长记录READ到固定长记录域 | ◎ | +| VL-N006 | 正常 | RECORD VARYING FROM 1 TO 99 | 最小~最大件数之间的任意长度 | ◎ | +| VL-A001 | 异常 | ODO最大值超限 | OCCURS DEPENDING ON超定义值 | ◎ | +| VL-A002 | 异常 | 可变长记录截断 | WRITE时记录长度超文件定义 | ◎ | +| VL-A003 | 异常 | LINE SEQUENTIAL 改行缺失 | 文件末尾无LF | ○ | +| VL-A004 | 异常 | 可变长文件STATUS 47 | 记录长度与文件定义不一致 | ◎ | +| VL-R001 | 确认 | RECORD LENGTH 确认 | WRITE后文件LRECL与定义一致 | ◎ | +| VL-R002 | 确认 | ODO表件数确认 | DEPENDING ON值与实际件数一致 | ◎ | + +### 2.3.2 循环处理 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| LP-N001 | 正常 | PERFORM VARYING(计数循环) | VARYING I FROM 1 BY 1 UNTIL I > N | ◎ | +| LP-N002 | 正常 | PERFORM UNTIL(条件循环) | 条件达到后退出 | ◎ | +| LP-N003 | 正常 | PERFORM TIMES(固定次数) | N回执行 | ◎ | +| LP-N004 | 正常 | PERFORM THRU(段落跨入) | THRU指定多个段落 | ○ | +| LP-N005 | 正常 | 内联PERFORM(END-PERFORM) | COBOL85内联循环 | ◎ | +| LP-N006 | 正常 | 嵌套PERFORM(3层) | 内层PERFORM完整执行后外层继续 | ◎ | +| LP-N007 | 正常 | EXIT PERFORM / EXIT PERFORM CYCLE | 中途退出/跳过本次循环 | ◎ | +| LP-A001 | 异常 | PERFORM VARYING 0回 | 初始值已超终值→0回执行 | ◎ | +| LP-A002 | 异常 | 无限循环(条件永不满足) | UNTIL条件永不成立→超时 | ○ | +| LP-A003 | 异常 | PERFORM嵌套越界 | 内层PERFORM THRU跨入外层段落 | ◎ | +| LP-A004 | 异常 | EXIT SECTION/GOBACK误用 | 循环内意外退出程序 | ◎ | +| LP-R001 | 确认 | 循环回数确认 | 实际执行回数与期望一致 | ◎ | + +### 2.3.3 数值精度 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| NP-N001 | 正常 | COMP-3小数位对齐 | PIC S9(7)V99与S9(9)V9的ADD对齐 | ◎ | +| NP-N002 | 正常 | ROUNDED选项 | 计算结果四舍五入到指定小数位 | ◎ | +| NP-N003 | 正常 | ON SIZE ERROR | 结果超过PIC定义域时触发 | ◎ | +| NP-N004 | 正常 | 除算余数(REMAINDER) | DIVIDE...REMAINDER | ◎ | +| NP-N005 | 正常 | COMP(二进制)符号处理 | S9(4) COMP的符号位正确 | ◎ | +| NP-N006 | 正常 | COMPUTE中间精度 | 中间结果精度确保最终结果正确 | ◎ | +| NP-N007 | 正常 | 符号付/符号なし混算 | S9(5)与9(5)的ADD/SUBTRACT | ○ | +| NP-A001 | 异常 | 超过PIC定义域(无SIZE ERROR) | 高位截断→数据错误 | ◎ | +| NP-A002 | 异常 | COMP-3符号误判 | 符号ニブル('C'/'D')不一致 | ◎ | +| NP-A003 | 异常 | 除算0除 | DIVIDE BY ZERO→ABEND | ◎ | +| NP-A004 | 异常 | COMP赋值溢出 | 超范围的数值MOVE到COMP字段 | ◎ | +| NP-R001 | 确认 | 演算结果精度一致 | 同一演算反复执行→结果一致 | ◎ | +| NP-R002 | 确认 | 小数点位置一致 | 编辑字段(PIC Z,9等)十进制位正确 | ◎ | + +### 2.3.4 日文文字处理 + +#### 2.3.4.1 PIC N 全角字段 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| J-N001 | 正常 | PIC N全角转记 | 全角英数/汉字正确存储 | ◎ | +| J-N002 | 正常 | PIC N比较(等值) | 同全角字符串→EQUAL | ◎ | +| J-N003 | 正常 | PIC N比较(异值) | 异→NOT EQUAL | ◎ | +| J-N004 | 正常 | PIC N→PIC X转记 | 全角→半角域(防乱码) | ◎ | +| J-N005 | 正常 | PIC N DISPLAY-1 | I/O确认 | ○ | + +#### 2.3.4.2 半角假名 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| J-K001 | 正常 | 半角假名转记 | アイウエオ正确转记 | ◎ | +| J-K002 | 正常 | 半角假名比较 | アイウエオ比较 | ○ | +| J-K003 | 正常 | 半角假名排序 | 排序顺序确认 | ◎ | +| J-K004 | 异常 | 全角/半角混用 | 混用数据处理 | ◎ | +| J-K005 | 异常 | 半角假名排序顺序差异 | EBCDIC顺序 vs SJIS顺序 vs 五十音顺序 | ◎ | + +#### 2.3.4.3 外字(厂商别) + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| J-G001 | 正常 | JEF外字(日立) | JEF外字领域读写 | ◎ | +| J-G002 | 正常 | KEIS外字(富士通) | KEIS外字领域 | ◎ | +| J-G003 | 正常 | IBM外字 | IBM扩展文字 | ◎ | +| J-G004 | 异常 | 外字转换(SJIS→EBCDIC) | 厂商间外字差异 | ◎ | +| J-G005 | 异常 | 未定义外字 | 未定义→替代文字 | ○ | +| J-G006 | 异常 | 中文汉字与日文外字冲突 | 中日混在环境 | ○ | + +#### 2.3.4.4 Shift-JIS 5C/7C + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| J-D001 | 正常 | 第2字节5C | 「ソ」「噂」「能」 | ◎ | +| J-D002 | 正常 | 第2字节7C | 「本」「問」 | ◎ | +| J-D003 | 正常 | 5C/7C字符串长度 | 字节长度≠字符数 | ◎ | +| J-D004 | 异常 | 5C/7C误转换 | 误转成\或\| | ◎ | + +#### 2.3.4.5 编码转换 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| J-X001 | 正常 | EBCDIC→SJIS转换 | 全字符正确 | ◎ | +| J-X002 | 正常 | SJIS→UTF-8转换 | UTF8转换 | ◎ | +| J-X003 | 正常 | 3段转换一致性 | 往返对比 | ○ | +| J-X004 | 异常 | 不可转换字符 | 替代字符/错误 | ◎ | +| J-X005 | 异常 | 全角半角转换精度 | 全角数字→半角数字等业务数据 | ◎ | +| J-X006 | 正常 | CODEPAGE指定转换(IBM-930→SJIS) | CODEPAGE经由的文字转换 | ◎ | +| J-X007 | 异常 | CODEPAGE未定义文字 | 转换表中不存在的文字→替代文字 | ◎ | +| J-X008 | 异常 | ASCII→EBCDIC映射误差 | UNISYS等ASCII系主机 | ○ | + +#### 2.3.4.6 全角空格/编辑 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| J-S001 | 正常 | 全角空格TRIM | TRIM对全角空格 | ◎ | +| J-S002 | 正常 | 全角空格INSPECT | INSPECT计数 | ○ | +| J-S003 | 异常 | 含全角空格比较 | "ABC" vs "A BC" | ○ | + +### 2.3.5 日期处理 + +#### 2.3.5.1 西历日期 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| D-N001 | 正常 | 通常日期(YYYYMMDD) | 正常日期处理 | ◎ | +| D-N002 | 正常 | 闰年判定 | 2000/2004/2100年 | ◎ | +| D-N003 | 正常 | 月末日 | 1月31日/2月28日/2月29日 | ◎ | +| D-N004 | 正常 | 日期计算(±日) | FUNCTION INTEGER-OF-DATE | ◎ | +| D-N005 | 正常 | 日期比较 | 日期前后比较 | ○ | +| D-A001 | 异常 | 日期逻辑异常 | 2月30日/4月31日 | ◎ | +| D-A002 | 异常 | 西历/和历混在 | YYYYMMDD与RYYMMDD混用 | ◎ | +| D-A003 | 异常 | 2桁年(YYMMDD) | 2000年区分问题(YYMMDD不能区分2000/1900) | ◎ | +| D-A004 | 异常 | 闰年边界 | 2000/02/28→29→03/01 | ◎ | + +#### 2.3.5.2 和历(元号)处理 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| D-W001 | 正常 | 令和→西历 | R010501 = 2019/05/01 | ◎ | +| D-W002 | 正常 | 平成→西历 | H010108 = 1989/01/08 | ◎ | +| D-W003 | 正常 | 昭和→西历 | S611231 = 1986/12/31 | ◎ | +| D-W004 | 正常 | 大正→西历 | T011231 = 1912/12/31 | ○ | +| D-W005 | 正常 | 明治→西历 | M450129 = 1912/01/29 | ○ | +| D-W006 | 正常 | 元号边界(令和初日) | 平成年末日→令和初日 2019/04/30→05/01 | ◎ | +| D-W007 | 正常 | 元号边界(平成年初日) | 昭和的末日→平成年初日 1989/01/07→01/08 | ◎ | +| D-W008 | 异常 | 不存在的和历日期 | R元年度(R元年)扱い | ○ | + +#### 2.3.5.3 日期格式转换 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| D-F001 | 正常 | YYYYMMDD→YYMMDD | 4桁→2桁 | ◎ | +| D-F002 | 正常 | YYYYMMDD→和历 | 西历→RYYMMDD | ◎ | +| D-F003 | 正常 | 和历→西历 | RYYMMDD→YYYYMMDD | ◎ | +| D-F004 | 异常 | 日期编辑文字 | 元号混じりの編集出力 | ○ | + +### 2.3.6 RERUN / RESTART 测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| RR-N001 | 正常 | 同一数据再执行 | 幂等性确认(不重复更新) | ◎ | +| RR-A001 | 异常 | 输出文件未删除 | 再执行STATUS 95 | ◎ | +| RR-A002 | 异常 | 中间ABEND→RESTART | 中间状态重新开始 | ◎ | +| RR-A003 | 异常 | ABEND时输出文件状态 | 中途废弃/部分输出 | ◎ | + +### 2.3.7 排他/竞争测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| EX-N001 | 正常 | 同时READ | 多个JOB同时READ(DISP=SHR),正常读取,不报STATUS 47 | ◎ | +| EX-A001 | 异常 | 同时WRITE冲突 | STATUS 48 | ◎ | +| EX-A002 | 异常 | DISP=SHR违反 | STATUS 95 | ◎ | +| EX-A003 | 异常 | OPEN中他JOB DELETE | STATUS 95/97 | ○ | + +### 2.3.8 性能/容量测试 + +| 编号 | 区分 | 项目 | 内容 | 优先级 | +|------|------|------|------|--------| +| PV-N001 | 正常 | 10万件处理 | 批量处理性能 | ○ | +| PV-N002 | 正常 | SORT 100万件 | SORT RC确认 | ○ | +| PV-N003 | 正常 | VSAM大量READ | CI/CA分割性能 | ○ | +| PV-A001 | 异常 | SORT领域不足 | RC=20 | ○ | + +--- + +## 2.4 测试用例详细清单(部分代表性用例) + +### SORT 用例 + +| 编号 | 目标类型 | 测试名 | 输入 | 期望结果 | +|------|---------|-------|------|---------| +| TC-N035 | SORT | SORT USING/GIVING | 10件升序 | 升序排序确认 | +| TC-N036 | SORT | SORT INPUT PROCEDURE | 10件→筛选5件 | 筛选后仅5件排序 | +| TC-N037 | SORT | SORT OUTPUT PROCEDURE | 10件→汇总 | 汇总值正确 | +| TC-A041 | SORT | SORT区不足 | 100万件 | RC=20 | +| TC-A042 | SORT | INPUT未RELEASE | 数据不RELEASE | 数据丢失 | + +### MERGE 用例 + +| 编号 | 目标类型 | 测试名 | 输入 | 期望结果 | +|------|---------|-------|------|---------| +| TC-N044 | MERGE | MERGE 2文件合并 | 2个排序后文件 | 正确合并输出 | +| TC-N045 | MERGE | MERGE 重复键 | 同键2件来自不同文件 | 同键顺序保持 | +| TC-A048 | MERGE | 输入未排序 | MERGE未排序文件 | 误合并结果 | + +### 分支/内部表/CALL/分割 用例 + +| 编号 | 目标类型 | 测试名 | 输入 | 期望结果 | +|------|---------|-------|------|---------| +| TC-N046 | IF分支 | IF 2路分支 | IF条件成立/不成立 | 各自处理正确 | +| TC-N047 | IF分支 | IF 88-level条件名 | 88条件直接判断 | 正确分支 | +| TC-N048 | EVALUATE | EVALUATE多值 | 多个WHEN覆盖 | 正确分支 | +| TC-N049 | EVALUATE | EVALUATE WHEN OTHER | 未匹配→OTHER | 默认处理 | +| TC-N050 | 内部表 | SEARCH ALL等值查找(找到) | KEY等于目标存在 | 找到→INDEX定位 | +| TC-N051 | 内部表 | SEARCH ALL等值查找(未找到) | KEY等于目标不存在 | 未找到→INDEX超限 | +| TC-N052 | CALL | CALL USING参数传递 | CALL 'SUBPGM' USING A B | 参数正确传递 | +| TC-N053 | CALL | IS INITIAL指定 | CALL后WS值 | 每次初始状态 | +| TC-N054 | 分割 | 50分割(正好50件) | 50件输入 | 各1文件1件 | +| TC-A049 | IF分支 | IF未闭合 | 缺少END-IF | 语法错误编译错误 | +| TC-A050 | 内部表 | INDEX越界 | OCCURS范围外访问 | ABEND | +| TC-A051 | CALL | CALL不存在程序 | CALL 'NOPGM' | ABEND | +| TC-A052 | 编码转换 | CODEPAGE未定义文字 | 转换表中不存在的文字 | 替代文字输出 | + +### 日期处理 用例 + +| 编号 | 目标类型 | 测试名 | 输入 | 期望结果 | +|------|---------|-------|------|---------| +| TC-N038 | 日期 | 闰年判定 | 2000/02/29 | 正常处理 | +| TC-N039 | 日期 | 非闰年判定 | 2100/02/29 | 错误 | +| TC-N040 | 日期 | 和历转换(令和初日) | 2019/05/01 → R010501 | 正确转换 | +| TC-N041 | 日期 | 和历转换(平成年末日) | 2019/04/30 → H310430 | 正确转换 | +| TC-A043 | 日期 | 不存在的日期 | 2月30日 | 错误 | +| TC-A044 | 日期 | 日期逻辑异常 | 4月31日 | 错误 | + +### SYSIN/高级匹配 用例 + +| 编号 | 目标类型 | 测试名 | 输入 | 期望结果 | +|------|---------|-------|------|---------| +| TC-N055 | SYSIN读取 | SYSIN正常参数读取 | 标准参数卡5张 | 全部正确解析 | +| TC-N056 | 二级M:N→M:N | 二级M:N匹配 | M:N第一段→中间文件→M:N第二段 | 正确匹配 | +| TC-A053 | SYSIN读取 | SYSIN参数格式错误 | 非法参数 | 格式错误处理 | + +### 不平衡/排他/RERUN 用例 + +| 编号 | 目标类型 | 测试名 | 输入 | 期望结果 | +|------|---------|-------|------|---------| +| TC-N042 | 匹配 | 1:N不平衡(1 vs 100万) | R01=1 R02=100万 | 正常处理 | +| TC-N043 | 匹配 | N:1不平衡(100万 vs 1) | R01=100万 R02=1 | 正常处理 | +| TC-A045 | 排他 | 同时WRITE | 2JOB同时WRITE同文件 | STATUS 48 | +| TC-A046 | 排他 | 再执行(文件未删除) | 同一文件再WRITE | STATUS 95 | +| TC-A047 | RESTART | 中途ABEND→RESTART | ABEND→再执行 | 正常RESTART | diff --git a/品質管理/程序分类说明.md b/品質管理/程序分类说明.md new file mode 100644 index 0000000..55fc7de --- /dev/null +++ b/品質管理/程序分类说明.md @@ -0,0 +1,90 @@ +# 程序分类说明 + +> 出典: 程序分类及测试基准.pdf (第1部:HINA 分类与识别方法) + +## 凡例(記号意味) + +| 記号 | 意味 | +|------|------| +| ◎ | 必須テスト | +| ○ | 推奨テスト | +| △ | 条件付き | +| — | 該当せず | + +## 1.1 HINA 类型一览(基准33类型) + +| No. | 名称(日) | 名称(中) | 分類 | +|-----|-----------|-----------|------| +| 01 | マッチング(1:1) | 1:1匹配 | 匹配 | +| 02 | マッチング(1:N) | 1:N匹配 | 匹配 | +| 03 | マッチング(N:1) | N:1匹配 | 匹配 | +| 04 | レイアウト編集のみ(GETPUT) | 编辑输出 | 编辑 | +| 05 | 振り分け(IF文) | IF分支 | 分支 | +| 06 | 振り分け(EVALUATE文) | EVALUATE分支 | 分支 | +| 07 | キーブレイク(集計) | key切汇总 | key切 | +| 08 | キーブレイク(集約) | key切聚合 | key切 | +| 09 | DB更新 | 数据库更新 | 数据库 | +| 10 | 50分割 | 50分割 | 分割 | +| 11 | 25分割 | 25分割 | 分割 | +| 12 | 100分割 | 100分割 | 分割 | +| 13 | 項目チェック(重複含まず) | 字段校验(不含重复) | 校验 | +| 14 | オンラインPGM | online程序 | online | +| 15 | CSV→FB変換(改行なし) | CSV→FB(无换行) | 文件转换 | +| 16 | 2段階マッチング(1:1⇒1:1) | 二级1:1→1:1 | 匹配 | +| 17 | 2段階マッチング(N:1⇒N:1) | 二级N:1→N:1 | 匹配 | +| 18 | マッチングM:N⇒出力M件 | 组合M:N→M条 | 匹配 | +| 19 | マッチングM:N⇒出力N件 | 组合M:N→N条 | 匹配 | +| 20 | マッチングM:N⇒出力M×N件 | 组合M:N→M×N条 | 匹配 | +| 21 | CSV→FB変換(改行あり) | CSV→FB(有换行) | 文件转换 | +| 22 | 2段階マッチング(M:N⇒M:N) | 二级M:N→M:N | 匹配 | +| 23 | SELECT条件 | SELECT条件 | 数据库 | +| 24 | 内部テーブル検索 | 内部表检索 | 内部处理 | +| 25 | サブプログラム使用 | 子程序调用 | 内部处理 | +| 26 | DB検索 | 数据库检索 | 数据库 | +| 27 | 項目チェック(半角20桁/4桁) | 半角校验 | 校验 | +| 28 | SYSIN読込 | SYSIN读取 | 内部处理 | +| 29 | ASCII→EBCDIC変換 | ASCII→EBCDIC转换 | 文件转换 | +| 30 | キーブレイク(集計集約以外) | key切非汇总 | key切 | +| 31 | 項目チェック(重複含む) | 字段校验(含重复) | 校验 | +| 32 | 1:N+キーブレイク(同キー) | 1:N+同key切 | 混合 | +| 33 | 1:N+キーブレイク(異キー) | 1:N+异key切 | 混合 | + +## 追加类型(HINA 未覆盖但实务必须) + +| No. | 名称(日) | 名称(中) | 分類 | 追加理由 | +|-----|-----------|-----------|------|---------| +| 34 | SORT(INPUT/OUTPUT PROCEDURE) | 排序处理 | 排序 | 批处理70%使用,独立程序类型 | +| 35 | MERGE(複数ファイル結合) | 合并处理 | 排序 | 多文件合并,SORT不同 | + +## 1.2 关键字可识别的类型(无需结构解析) + +| 类型 | 确认方法 | 准确度 | 注意 | +|------|---------|--------|------| +| DB操作 | grep EXEC SQL | 95% | SQL嵌入程序,关键字独占 | +| 子程序调用 | grep CALL + grep LINKAGE SECTION | 90% | CALLER/CALLEE是同一类型的两个角色 | +| IS INITIAL | grep IS INITIAL | 99% | PROGRAM-ID行直接判定 | +| SYSIN | grep SYSIN | 90% | 需确认SELECT或ASSIGN | +| 编码转换 | grep ALPHABETIC/ASCII/EBCDIC | 85% | 需确认有转换表定义 | +| online | grep DFHCOMMAREA/MAP | 95% | CICS程序特征 | +| SORT | grep SORT ON KEY | 95% | SORT语句独占 | +| MERGE | grep MERGE ON KEY | 95% | MERGE语句独占 | +| 编辑输出 | grep WRITE AFTER ADVANCING | 80% | 其他类型也可能有WRITE | +| 文件编成 | grep ORGANIZATION | 99% | 直接判定VSAM/相对/顺序 | +| 替代索引 | grep ALTERNATE RECORD KEY | 99% | KSDS替代索引 | + +## 分類一覧 + +| 分類 | 含まれるタイプ | +|------|---------------| +| 匹配 | 01,02,03,16,17,18,19,20,22 | +| 编辑 | 04 | +| 分支 | 05,06 | +| key切 | 07,08,30 | +| 数据库 | 09,23,26 | +| 分割 | 10,11,12 | +| 校验 | 13,27,31 | +| online | 14 | +| 文件转换 | 15,21,29 | +| 内部处理 | 24,25,28 | +| 混合 | 32,33 | +| 排序 | 34,35 | diff --git a/基本設計書/01_勤怠休暇管理システム_設計書(サブシステムA).md b/基本設計書/01_勤怠休暇管理システム_設計書(サブシステムA).md index 4b144bb..88a454f 100644 --- a/基本設計書/01_勤怠休暇管理システム_設計書(サブシステムA).md +++ b/基本設計書/01_勤怠休暇管理システム_設計書(サブシステムA).md @@ -543,28 +543,75 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT |------|------| | **PGMパターン** | DB更新 + **SYSIN読込(P28)** | | **JCL前処理** | なし | -| **入力** | DAILY-RECORD(200B)、**SYSIN(集計対象社員指定)** | +| **入力** | DAILY-RECORD(200B)、**SYSIN(制御カード)** | | **出力** | DAILY_RECORDS / MONTHLY_ABSENCE(DB2)、ABSENCE_SUMMARY(80B)| +**SYSIN制御カード(3種):** + +``` +* コメント行(先頭*) +T 社員番号,社員番号,... ← TARGET: 集計対象社員指定(省略時=全社員) +P YEARMONTH=YYYYMM ← PERIOD: 処理対象年月(必須) +M MODE=RESET|NORMAL ← MODE: RESET=再実行(既存削除後に再INSERT), NORMAL=通常(UPSERT) +``` + +カード種別('T','P','M')を第1桁で識別。**GO TO DEPENDING ON** で処理分岐する。 + **機能:** -1. **SYSIN読込(パターン28)**:集計対象の社員番号一覧をSYSINから読み込む(省略時は全社員が対象)。 +1. **SYSIN読込(パターン28)**:制御カードをSYSINから順次読み込み、カード種別で**GO TO DEPENDING ON**分岐 + - `T`カード → 対象社員一覧をWORKING-STORAGEの内部テーブルに保持 + - `P`カード → YEARMONTHを解析(`UNSTRING` + `INSPECT TALLYING`でカンマ区切り数検証) + - `M`カード → MODEを判定。未指定ならNORMAL + - `*`カード → コメント行としてスキップ(`CONTINUE`) + - 不明カード → `DISPLAY`で警告表示 2. DAILY-RECORDを1レコードずつ読込み、DAILY_RECORDSに**EXEC SQL INSERT** + - 各INSERT前に`INSPECT TALLYING`で社員番号の有効性チェック → 空または無効値は`DISPLAY`で警告表示 3. 社員別・月別の集計値を**PERFORM VARYING**で積算(全社員ループ) -4. 全件処理後、MONTHLY_ABSENCEを**EXEC SQL UPDATE / INSERT**(UPSERT) -5. **INSPECT TALLYING**で社員番号の有効性チェック → 空または無効値は**DISPLAY**で警告表示 + - **COMPUTE ROUNDED ON SIZE ERROR** で時間計算(桁あふれ時に警告表示) +4. MODE=RESETの場合:**EXEC SQL DELETE**で該当月の既存レコードを削除 +5. MONTHLY_ABSENCEに対して**EXEC SQL SELECT COUNT(*) → IF >0 → UPDATE ELSE INSERT**(UPSERT) 6. 病欠時間はSICK_LEAVE_RATEテーブルを参照し、控除前時間として保持 7. 集計後データをABSENCE_SUMMARYファイルに出力 +**GO TO DEPENDING ON ロジック:** + +```cobol + READ SYSINFILE INTO WS-SYSIN-REC + AT END SET SYSIN-EOF TO TRUE + END-READ. + IF NOT SYSIN-EOF + MOVE WS-SYSIN-REC(1:1) TO WS-CARD-TYPE + IF WS-CARD-TYPE = 'T' OR 'P' OR 'M' + IF WS-CARD-TYPE = 'T' MOVE 1 TO WS-DISP-IDX + IF WS-CARD-TYPE = 'P' MOVE 2 TO WS-DISP-IDX + IF WS-CARD-TYPE = 'M' MOVE 3 TO WS-DISP-IDX + GO TO DEPENDING ON WS-DISP-IDX + 2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR + . + ELSE + IF WS-CARD-TYPE = '*' + DISPLAY 'COMMENT: ' WS-SYSIN-REC + ELSE + DISPLAY 'WARNING: Unknown SYSIN card type [' + WS-CARD-TYPE ']' + END-IF + END-IF + END-IF. +``` + **新規カバレッジ構文:** | 構文 | 用途 | |------|------| -| **READ SYSIN**(パターン28) | 対象社員一覧の読込 ← 新規パターン | +| **READ SYSIN(パターン28)** | 制御カード読込 ← 新規パターン | +| **GO TO DEPENDING ON** | カード種別による3分岐 ← 新規 | | DISPLAY | 警告メッセージ表示 ← 新規 | -| INSPECT TALLYING | 社員番号の空チェック ← 新規 | +| INSPECT TALLYING | 社員番号の空チェック、カンマ区切り数検証 | +| **COMPUTE ON SIZE ERROR** | 時間計算の桁あふれ処理 ← 新規 | +| **EXEC SQL DELETE** | RESETモード時既存レコード削除 ← 新規(メインPGM) | | PERFORM VARYING | 社員別月次集計ループ | -| EXEC SQL INSERT / UPDATE | DB更新(INSERT+UPDATEでUPSERT) | +| EXEC SQL SELECT / INSERT / UPDATE | DB操作(UPSERTパターン) | --- @@ -572,24 +619,27 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT | 項目 | 内容 | |------|------| -| **PGMパターン** | GETPUT | +| **PGMパターン** | GETPUT(編集出力) | | **JCL前処理** | なし | | **入力** | DAILY_RECORDS / MONTHLY_ABSENCE(DB2)、**COMMAND-LINE PARM** | | **出力** | CSVファイル(社員確認用)| **PARM解析:** - `YEARMONTH=202605` — 必須。対象年月。 -- `MODE=FULL` — オプション。`FULL`=全項目出力, `SUMMARY`=集計のみ。 +- `MODE=FULL` — オプション。`FULL`=全項目出力(日別+月次), `SHORT`=月次集計のみ。 **機能:** -1. **ACCEPT FROM COMMAND-LINE** でPARM解析(対象年月・出力モード) -2. DAILY_RECORDSから当月の全レコードをCURSOR SELECT -3. **STRING** でCSV行を編集(DELIMITED BY SIZE) -4. **WRITE AFTER ADVANCING PAGE** でページヘッダー制御 ← **新カバレッジ** - - 100行ごとにヘッダー行を出力 - - WRITE header-record AFTER ADVANCING PAGE -5. CSVフォーマット: +1. **ACCEPT FROM COMMAND-LINE** でPARM解析(`INSPECT TALLYING`でカンマ区切り数チェック) +2. DAILY_RECORDSから当月の全レコードをCURSOR SELECT(ORDER BY EMP_ID, TARGET_DATE) +3. **INSPECT REPLACING** でCSV危険文字をサニタイズ(カンマ→セミコロン、改行→スペース) +4. **STRING WITH POINTER** でCSV行を位置指定編集 ← **新カバレッジ** +5. **WRITE AFTER ADVANCING 3種** でページ制御 ← **新カバレッジ** + - 先頭ページ:`WRITE header-rec AFTER ADVANCING PAGE` + - セクション区切り:`WRITE section-rec AFTER ADVANCING 2 LINES` + - データ行:`WRITE data-rec AFTER ADVANCING 1 LINE` +6. MODE=FULL時:100行ごとにヘッダー行を再出力 +7. CSVフォーマット: ``` 社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間 @@ -599,14 +649,54 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT 00000101,20260504,0000,0000,99,0.0,0.0,0.0,0.0,8.0 ``` -6. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99' +8. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99' + +**INSPECT REPLACING によるCSVサニタイズ:** + +```cobol +MOVE WS-FIELD TO WS-SAFE-FIELD. +INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';' + ALL X"0D" BY SPACE + ALL X"0A" BY SPACE. +``` + +**STRING WITH POINTER によるCSV行編集:** + +```cobol +MOVE 1 TO WS-PTR. +STRING WS-EMP-ID DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-DATE DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-TIME-IN DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-TIME-OUT DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-LEAVE-TYPE DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-ANNUAL-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-PERSONAL-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-OFFICIAL-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-SICK-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-ABSENT-H DELIMITED BY SIZE + INTO WS-CSV-LINE WITH POINTER WS-PTR +END-STRING. +``` **新規カバレッジ構文:** | 構文 | 用途 | |------|------| -| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)← 新規 | -| **WRITE AFTER ADVANCING PAGE** | ページ制御出力 ← 新規 | +| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)| +| **INSPECT REPLACING** | CSV危険文字置換 ← 新規 | +| **STRING WITH POINTER** | 位置指定CSV行編集 ← 新規 | +| **WRITE AFTER ADVANCING PAGE** | ページヘッダー制御 ← 新規 | +| **WRITE AFTER ADVANCING 2 LINES** | セクション区切り ← 新規 | +| **WRITE AFTER ADVANCING 1 LINE** | データ行出力 ← 新規 | | STRING | CSV行編集(DELIMITED BY SIZE) | | EXEC SQL SELECT(CURSOR) | DB読込 | @@ -677,15 +767,26 @@ SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT |---------------|:----:|----------------| | SEARCH(非ALL) | × | KIN01INP | | DELETE FROM(DB2) | × | KIN02UPD | -| GO TO DEPENDING ON | × | — (KIN07DAIはフォールスルー問題のためEVALUATE+PERFORMに変更) | +| **GO TO DEPENDING ON** | **×** | **KIN08DBU(← 新規)** | | PERFORM THRU | × | KIN03EXP | | WRITE FROM | × | KIN04CHK, KIN06CLD | -| WRITE AFTER ADVANCING PAGE | × | KIN09CSV | -| **MULTIPLY** | **○(ZAN06UPDのみ)** | **KIN07DAI** | -| **SUBTRACT** | **○(ZAN06UPDのみ)** | **KIN07DAI** | -| **ACCEPT FROM COMMAND-LINE** | **◎(ZAN05CAL,KIN06CLD)** | **KIN09CSV** | -| **DISPLAY** | **△(SUB02MSG,SUB03ENDのみ)** | **KIN08DBU** | -| **INSPECT** | **◎** | **KIN08DBU** | +| **WRITE AFTER ADVANCING(PAGE/1/2)** | **×** | **KIN09CSV(← 新規)** | +| **INSPECT REPLACING** | **×** | **KIN09CSV(← 新規)** | +| **STRING WITH POINTER** | **×** | **KIN09CSV(← 新規)** | +| **COMPUTE ON SIZE ERROR** | **○(ZAN系のみ)** | **KIN08DBU(← 新規)** | +| MULTIPLY | ○(ZAN06UPDのみ) | KIN07DAI | +| SUBTRACT | ○(ZAN06UPDのみ) | KIN07DAI | +| ACCEPT FROM COMMAND-LINE | ◎(ZAN05CAL,KIN06CLD) | KIN09CSV | +| DISPLAY | △(SUB02MSG,SUB03ENDのみ) | KIN08DBU | +| INSPECT TALLYING | ◎ | KIN08DBU | + +### 全体カバレッジ目標 + +| カテゴリ | 現状 | 追加後(目標) | +|---------|:---:|:-------------:| +| プログラムタイプ(35種) | 14使用(40.0%) | 15使用(42.9%) | +| ステートメント(45ユニーク) | 33使用(73.3%) | 36使用(80.0%) | +| カテゴリ(9種) | 8/9カバー(88.9%) | 9/9カバー(100%) | --- diff --git a/詳細設計書/詳細設計書_KIN08DBU.md b/詳細設計書/詳細設計書_KIN08DBU.md new file mode 100644 index 0000000..28cf6df --- /dev/null +++ b/詳細設計書/詳細設計書_KIN08DBU.md @@ -0,0 +1,211 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN08DBU | +| 3 | プログラム名 | 勤怠DB更新処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | DB更新 + SYSIN読込(P28) | +| 6 | 機能概要 | DAILY-RECORDを読込み、DAILY_RECORDSにINSERT。社員別月次集計後、MONTHLY_ABSENCEにUPSERT。集計結果をABSENCE_SUMMARYファイルに出力する。SYSIN制御カード(T/P/Mの3種)をGO TO DEPENDING ONで分岐処理する。 | + +### 前提条件 + +| NO | 対象ファイル/DB | 条件 | +|----|----------------|------| +| 1 | DAILY-RECORD | KIN07DAIが出力した日別勤怠計算結果が存在すること | +| 2 | DAILY_RECORDS | 同一日付のレコードが既に存在してもMODE=NORMALではUPSERT動作 | +| 3 | MONTHLY_ABSENCE | 集計対象月の統計レコードが未作成でもINSERTできること | +| 4 | SYSIN | 省略時は全社員対象、NORMALモードで動作 | + +### SYSIN制御カード仕様 + +| カード種別 | 第1桁 | フォーマット | 説明 | +|-----------|:-----:|-------------|------| +| TARGET | T | `T 社員番号,社員番号,...` | 集計対象社員指定。省略時=全社員 | +| PERIOD | P | `P YEARMONTH=YYYYMM` | 処理対象年月。必須 | +| MODE | M | `M MODE=RESET\|NORMAL` | RESET=既存削除後再INSERT、NORMAL=UPSERT | +| コメント | * | `* 任意コメント` | 読み飛ばし | +| 不明 | 他 | — | DISPLAYで警告表示 | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------| +| 1 | DAILY-RECORD | INREC | KIN08R01 | I | KIN07REC | FB | | 200 | PS | +| 2 | ABSENCE-SUMMARY | OUTREC | KIN08W01 | O | KIN08REC | FB | | 80 | PS | +| 3 | SYSIN | SYSIN | KIN08S01 | I | — | FB | | 80 | PS | + +### 使用DBテーブル + +| NO | テーブル名 | 処理内容 | +|----|-----------|---------| +| 1 | DAILY_RECORDS | INSERT(MODE=NORMAL時) / DELETE+INSERT(MODE=RESET時) | +| 2 | MONTHLY_ABSENCE | SELECT COUNT(*) → IF >0 UPDATE ELSE INSERT(UPSERT) | +| 3 | SICK_LEAVE_RATE | SELECT DEDUCTION_RATE WHERE LEAVE_TYPE='04' | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 2 | ABEND処理SUB | SUB03END | ZANENDAC | +| 3 | 運用日付取得SUB | SUB01DAT | ZANDATAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリア初期化 + 1-4.DB接続(EXEC SQL CONNECT TO 'data/kin.db') + 1-5.SYSINファイルOPEN + 1-6.SYSIN読込ループ(EOFまで) + READ SYSINFILE INTO WS-SYSIN-REC + AT END SET SYSIN-EOF TO TRUE + END-READ. + カード種別判定(WS-SYSIN-REC(1:1)): + 'T' → MOVE 1 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX + 2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR + 'P' → MOVE 2 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX + 2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR + 'M' → MOVE 3 TO WS-DISP-IDX → GO TO DEPENDING ON WS-DISP-IDX + 2100-TARGETSOR 2200-PERIODSOR 2300-MODESOR + '*' → コメント行としてDISPLAY表示後スキップ(CONTINUE) + 他 → DISPLAY 'WARNING: Unknown card type [x]' + 1-7.必須パラメータ未設定チェック + Pカード未読込 → ABEND(CALL SUB03END) + 1-8.集計対象社員テーブル設定(Tカード省略時は全社員フラグON) + 1-9.入力ファイルOPEN(DAILY-RECORD) + 1-10.出力ファイルOPEN(ABSENCE-SUMMARY) + +2.主処理(2000MAJSOR)(R01 EOFまで下記を繰り返す) + 2-1.DAILY-RECORD読込(READ INTO) + 【ガード】社員番号の有効性チェック + INSPECT WS-EMP-ID TALLYING WS-ZERO-CNT FOR LEADING '0' + 空文字判定 → DISPLAY警告 + 2-2.DAILY_RECORDS INSERT + EXEC SQL INSERT INTO DAILY_RECORDS (...) VALUES (:WS-...) + IF SQLCODE NOT = 0 → DISPLAY警告 + 9100DBERRSOR + 2-3.社員別月次集計(PERFORM VARYING 内部テーブル) + 該当社員の集計行を線形探索 + 集計計算(COMPUTE ROUNDED ON SIZE ERROR) + COMPUTE WS-TOTAL-HOURS ROUNDED = + WS-ANNUAL-H + WS-PERSONAL-H + WS-OFFICIAL-H + + WS-SICK-H + WS-ABSENT-H + ON SIZE ERROR + DISPLAY 'WARNING: Total hours overflow ' + WS-EMP-ID ' date ' WS-DATE + MOVE ZERO TO WS-TOTAL-HOURS + END-COMPUTE + +3.終了処理(3000STPSOR) + 3-1.MODE判定 + MODE=RESETの場合: + EXEC SQL DELETE FROM MONTHLY_ABSENCE + WHERE YEAR_MONTH = :WS-YEAR-MONTH + 3-2.集計結果のMONTHLY_ABSENCE書出(PERFORM VARYING 集計テーブル) + 各社員・月ごとに: + EXEC SQL SELECT COUNT(*) INTO WS-CNT + FROM MONTHLY_ABSENCE + WHERE EMP_ID = :WS-EMP-ID + AND YEAR_MONTH = :WS-YEAR-MONTH + IF WS-CNT > 0 + EXEC SQL UPDATE MONTHLY_ABSENCE SET ... + ELSE + EXEC SQL INSERT INTO MONTHLY_ABSENCE (...) + END-IF + IF SQLCODE NOT = 0 → 9100DBERRSOR + 3-3.ABSENCE_SUMMARYファイル出力 + STRINGで編集後 WRITE + 3-4.EXEC SQL COMMIT + 3-5.全CURSOR/ファイルCLOSE + 3-6.出力件数メッセージ出力 + 【メッセージ編集】 + メッセージ番号:6(出力件数) + PARM1:'DAILY_RECORDS' + PARM2:CUN-DBXINS(INSERT件数) + 3-7.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +### SYSINカード処理詳細 + +``` +2100-TARGETSOR SECTION. + UNSTRING WS-SYSIN-REC(3:) DELIMITED BY ',' + INTO WS-TARGET-EMP(1) WS-TARGET-EMP(2) ... + TALLYING IN WS-EMP-COUNT + END-UNSTRING. + DISPLAY 'TARGET EMPLOYEES: ' WS-EMP-COUNT ' persons'. + EXIT. + GO TO 2000-EXIT. + +2200-PERIODSOR SECTION. + UNSTRING WS-SYSIN-REC(3:) DELIMITED BY '=' + INTO WS-PARM-NAME WS-PARM-VALUE + END-UNSTRING. + MOVE WS-PARM-VALUE TO WS-YEAR-MONTH. + DISPLAY 'PERIOD: ' WS-YEAR-MONTH. + EXIT. + GO TO 2000-EXIT. + +2300-MODESOR SECTION. + INSPECT WS-SYSIN-REC + REPLACING ALL 'MODE=' BY SPACES. + MOVE WS-SYSIN-REC(3:) TO WS-MODE-VALUE. + IF WS-MODE-VALUE = 'RESET' + SET RESET-MODE TO TRUE + ELSE + SET NORMAL-MODE TO TRUE + END-IF. + DISPLAY 'MODE: ' WS-MODE-VALUE. + EXIT. + GO TO 2000-EXIT. +``` + +--- + +## 出力レコード定義 + +### ABSENCE-SUMMARY(OUTREC/KIN08REC)80B FB + +| No | 項目名 | 設定元 | 属性 | 備考 | +|----|--------|--------|------|------| +| 1 | EMP-ID | MONTHLY_ABSENCE.EMP_ID | X(8) | 社員番号 | +| 2 | YEAR-MONTH | MONTHLY_ABSENCE.YEAR_MONTH | X(6) | YYYYMM | +| 3 | ANNUAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 年休使用合計 | +| 4 | PERSONAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 事假合計 | +| 5 | OFFICIAL-LEAVE-H | 集計結果 | 9(4)V9(1) | 因公特批假合計 | +| 6 | SICK-LEAVE-H | 集計結果 | 9(4)V9(1) | 病欠合計 | +| 7 | UNAPPROVED-ABSENT-H | 集計結果 | 9(4)V9(1) | 未申請欠勤合計 | +| 8 | FILLER | SPACE | X(24) | | + +--- + +## カバレッジ構文一覧 + +| 構文 | 用途 | +|------|------| +| READ SYSIN(パターン28) | 制御カード読込 ← 新規パターン | +| GO TO DEPENDING ON | カード種別による3分岐 ← 新規 | +| DISPLAY | 警告メッセージ表示 ← 新規 | +| INSPECT TALLYING | 社員番号空チェック、カンマ区切り数検証 | +| COMPUTE ROUNDED ON SIZE ERROR | 時間計算桁あふれ処理 ← 新規 | +| EXEC SQL DELETE | RESETモード既存削除 ← 新規 | +| EXEC SQL INSERT / UPDATE / SELECT | DB操作 | +| PERFORM VARYING | 社員別集計ループ | +| UNSTRING | SYSINカード値解析 | +| STRING | メッセージ編集 | diff --git a/詳細設計書/詳細設計書_KIN09CSV.md b/詳細設計書/詳細設計書_KIN09CSV.md new file mode 100644 index 0000000..046444c --- /dev/null +++ b/詳細設計書/詳細設計書_KIN09CSV.md @@ -0,0 +1,207 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN09CSV | +| 3 | プログラム名 | 勤怠CSV出力処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | GETPUT(編集出力) | +| 6 | 機能概要 | DAILY_RECORDSをDBからSELECTし、STRING WITH POINTERでCSV行を編集、WRITE AFTER ADVANCING(PAGE/2 LINES/1 LINE)で出力する。INSPECT REPLACINGでCSV危険文字をサニタイズする。 | + +### 前提条件 + +| NO | 対象ファイル/DB | 条件 | +|----|----------------|------| +| 1 | DAILY_RECORDS | KIN08DBUにより当月勤怠データが登録済みであること | +| 2 | MONTHLY_ABSENCE | KIN08DBUにより当月集計が完了していること | +| 3 | PARM | YEARMONTH=YYYYMM は必須。省略時はABEND | + +### PARM引数 + +コマンドラインで以下の形式で指定。 + +``` +YEARMONTH=202605,MODE=FULL +``` + +| パラメータ | 必須 | デフォルト | 説明 | +|-----------|:---:|:--------:|------| +| YEARMONTH | ○ | — | 処理対象年月(YYYYMM形式) | +| MODE | ○ | FULL | FULL=日別+月次全項目出力, SHORT=月次集計のみ | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------| +| 1 | CSV-OUTPUT | OUTREC | KIN09W01 | O | KIN09REC | FB | | 200 | PS | + +### 使用DBテーブル + +| NO | テーブル名 | 処理内容 | +|----|-----------|---------| +| 1 | DAILY_RECORDS | SELECT WHERE TARGET_DATE LIKE 'YYYYMM%' ORDER BY EMP_ID, TARGET_DATE | +| 2 | MONTHLY_ABSENCE | SELECT WHERE YEAR_MONTH = :WS-YEAR-MONTH ORDER BY EMP_ID | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 2 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.PARM解析(ACCEPT FROM COMMAND-LINE) + INSPECT WS-PARM TALLYING WS-COMMA-CNT FOR ALL ',' + IF WS-COMMA-CNT < 1 + DISPLAY 'WARNING: Missing MODE, using FULL' + END-IF + UNSTRING WS-PARM DELIMITED BY ',' + INTO WS-PARM1 WS-PARM2 + END-UNSTRING + UNSTRING WS-PARM1 DELIMITED BY '=' + INTO WS-KEY1 WS-VALUE1 + END-UNSTRING + UNSTRING WS-PARM2 DELIMITED BY '=' + INTO WS-KEY2 WS-VALUE2 + END-UNSTRING + YEARMONTH設定、MODE設定(FULL/SHORT判定) + 必須チェック:YEARMONTH未設定 → ABEND(CALL SUB03END) + 1-4.ワークエリア初期化 + 1-5.DB接続(EXEC SQL CONNECT TO 'data/kin.db') + 1-6.出力ファイルOPEN(KIN09W01) + 1-7.ヘッダー行書出(WRITE AFTER ADVANCING PAGE) + 社員番号,日付,出勤時刻,退勤時刻,休暇種別, + 年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間 + +2.主処理(2000MAJSOR)(FETCH EOFまで下記を繰り返す) + 2-1.CURSOR FETCH(DAILY_RECORDS) + 2-2.CSV危険文字サニタイズ(INSPECT REPLACING) + MOVE 各項目を退避 → WS-SAFE-FIELD + INSPECT WS-SAFE-FIELD REPLACING ALL ',' BY ';' + ALL X"0D" BY SPACE + ALL X"0A" BY SPACE + 2-3.CSV行編集(STRING WITH POINTER) + MOVE 1 TO WS-PTR + STRING + WS-EMP-ID DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-DATE DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-TIME-IN DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-TIME-OUT DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-LEAVE-TYPE DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-ANNUAL-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-PERSONAL-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-OFFICIAL-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-SICK-H DELIMITED BY SIZE + ',' DELIMITED BY SIZE + WS-ABSENT-H DELIMITED BY SIZE + INTO WS-CSV-LINE WITH POINTER WS-PTR + END-STRING + 2-4.行数カウンタ加算 + 2-5.100行ごとにヘッダー再出力(WRITE AFTER ADVANCING 2 LINES + ヘッダー行) + 100件毎 → WRITE WS-SEC-REC AFTER ADVANCING 2 LINES + WRITE WS-HDR-REC AFTER ADVANCING 1 LINE + 2-6.データ行出力(WRITE AFTER ADVANCING 1 LINE) + WRITE WS-OUT-REC FROM WS-CSV-LINE AFTER ADVANCING 1 LINE + +3.MODE=SHORT時のみ追加処理(2500-SHORT-MODE) + 3-1.MONTHLY_ABSENCE CURSOR OPEN + 3-2.STRINGで集計行編集 + 3-3.セクション区切り出力 + WRITE WS-SEC-REC AFTER ADVANCING 2 LINES + 3-4.集計行出力 + WRITE WS-OUT-REC AFTER ADVANCING 1 LINE + +4.終了処理(3000STPSOR) + 4-1.CURSOR CLOSE + 4-2.DB切断 + 4-3.出力ファイルCLOSE + 4-4.出力件数メッセージ出力 + 【メッセージ編集】 + メッセージ番号:6(出力件数) + PARM1:'CSV-OUTPUT' + PARM2:CUN-W01OUT(出力行数) + 4-5.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +### WRITE AFTER ADVANCING 3種の使い分け + +| タイミング | 構文 | 説明 | +|-----------|------|------| +| ファイル先頭 | WRITE header-rec AFTER ADVANCING PAGE | 改ページ(最初のヘッダー) | +| 100行ごと | WRITE sep-rec AFTER ADVANCING 2 LINES | セクション区切り(空行2行) | +| 100行ごと | WRITE header-rec AFTER ADVANCING 1 LINE | 再ヘッダー出力 | +| データ行 | WRITE data-rec AFTER ADVANCING 1 LINE | 通常データ行 | + +--- + +## 出力レコード定義 + +### CSV-OUTPUT(OUTREC/KIN09REC)200B FB + +| No | 項目名 | 設定元 | 属性 | 備考 | +|----|--------|--------|------|------| +| 1 | CSV-LINE | STRING編集結果 | X(200) | CSV1行分の文字列データ | + +--- + +## CSVフォーマット + +ヘッダー行(WRITE AFTER ADVANCING PAGEで出力): +``` +社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間 +``` + +データ行: +``` +00000101,20260501,0900,1800,99,0.0,0.0,0.0,0.0,0.0 +00000101,20260502,0900,1300,02,0.0,4.0,0.0,0.0,4.0 +``` + +MODE=SHORT時の集計行(WRITE AFTER ADVANCING 2 LINESで区切り): +``` +社員番号,年月,年休計,事假計,因公特批假計,病欠計,未申請欠勤計 +00000101,202605,8.0,4.0,0.0,0.0,4.0 +``` + +--- + +## カバレッジ構文一覧 + +| 構文 | 用途 | +|------|------| +| ACCEPT FROM COMMAND-LINE | PARM解析 | +| INSPECT TALLYING | カンマ区切り数チェック | +| INSPECT REPLACING | CSV危険文字置換 ← 新規 | +| STRING WITH POINTER | 位置指定CSV行編集 ← 新規 | +| WRITE AFTER ADVANCING PAGE | ページヘッダー制御 ← 新規 | +| WRITE AFTER ADVANCING 2 LINES | セクション区切り ← 新規 | +| WRITE AFTER ADVANCING 1 LINE | データ行出力 ← 新規 | +| STRING | CSV行編集(DELIMITED BY SIZE) | +| EXEC SQL SELECT(CURSOR) | DB読込 | +| DISPLAY | 警告メッセージ表示 |