基本情報技術者 2017年 春期 午後 問10
次のCOBOLプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
八つの支店をもつZ社は4月〜翌年3月を事業年度としており、毎年4月に前年度の売上データを集計して売上マスタファイルに格納する。このプログラムは、売上伝票ファイルに格納された前年度の売上データを集計して、売上マスタファイルに格納する。
(1) 売上伝票ファイルは、図1に示すレコード様式の順ファイルである。

① 売上伝票ファイルには、前年度の全支店の売上データが、順不同で格納されている。レコード件数がゼロの月はない。
② 支店番号には、各支店に対応する01〜08の番号が格納されている。支店1は01、支店2は02、…、支店8は08である。
③ 伝票番号には、各支店で一意となる6桁の数字が格納されている。
④ 売上日には、西暦の年、月、日が、それぞれ4桁、2桁、2桁で格納されている。
(2) 売上マスタファイルは、図2に示すレコード様式の索引ファイルである。主キーは売上年月である。

① 売上年月には、西暦の年、月が、それぞれ4桁、2桁で格納される。
② 支店別売上金額には、当該年月における各支店の売上金額が格納される。各支店の月間の売上金額が9桁を超えることはない。
③ 売上金額合計には、当該年月における全支店の売上金額の合計が格納される。
④ 売上マスタファイルには、このプログラムを実行する時点で、2000年度から前々年度までのデータが格納されている。

設問1:
問題文を見る プログラム中のに入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア:SRT-AMOUNT
イ:SRT-BRANCH
ウ:SRT-DATE
エ:SRT-NO
bに関する解答群
ア:MST-YYYYMM = SRT-YYYYMM
イ:MST-YYYYMM NOT = SRT-YYYYMM
ウ:MST-YYYYMM = ZERO
エ:SRT-YYYYMM = ZERO
c, dに関する解答群
ア:ADD MST-BRANCH(CNT) TO MST-AMOUNT
イ:ADD MST-BRANCH(SRT-BRANCH) TO MST-AMOUNT
ウ:ADD SRT-AMOUNT TO MST-BRANCH(CNT)
エ:ADD SRT-AMOUNT TO MST-BRANCH(SRT-BRANCH)
オ:MOVE SRT-AMOUNT TO MST-BRANCH(SRT-BRANCH)
模範解答
a:ウ、b:イ、c:エ、d:ア
解説
解答の導き方
このプログラムは、売上伝票を年月ごとにまとめ、支店別の売上金額と全支店の合計を売上マスタに書き込みます。まず、入力データの並べ替え、次に年月の切替え、最後に金額の集計、という順に考えます。
-
a:売上伝票を年月順に並べる項目売上伝票ファイルには「前年度の全支店の売上データが、順不同で格納」とあります。そのため、同じ年月の伝票をまとめて処理できるよう、最初に並べ替える必要があります。SRT-DATEは、SRT-YYYYMMとSRT-DDを含む日付全体の項目です。これを昇順に並べれば、売上日が年月日の順になり、同じ年月の伝票が連続して並びます。したがって、aには SRT-DATE が入ります。
-
b:年月が変わったかを判定する条件MST-YYYYMMには、現在集計している年月が入ります。SRT-YYYYMMには、これから処理する伝票の年月が入ります。この二つが異なるときは、集計対象の月が切り替わったことを意味します。そのときは、これまでの月の集計結果を書き込み、次の月のために初期化してから、新しい年月を設定します。したがって、bには MST-YYYYMM NOT = SRT-YYYYMM が入ります。最初の伝票を処理するときは、MST-RECが初期化されているため、MST-YYYYMMはゼロです。最初の年月とは一致しないので、この条件が成立します。ただし、WRI-PROCには「MST-YYYY NOT = ZERO」の判定があり、まだ年月が設定されていない最初の書込みは行われません。
-
c:伝票の金額を該当支店の欄に加えるMST-BRANCHは、8支店それぞれの売上金額を格納する項目です。OCCURS 8は、同じ形式の項目を8個並べて使う指定です。括弧内の数値は、どの項目を使うかを示す添字です。問題文には「支店番号には、各支店に対応する01〜08の番号が格納」とあります。SRT-BRANCHの番号を添字にすれば、伝票の支店に対応する欄を選べます。そこへ伝票の売上金額SRT-AMOUNTを加えるため、cには ADD SRT-AMOUNT TO MST-BRANCH(SRT-BRANCH) が入ります。たとえば支店番号が03の伝票なら、MST-BRANCHの3番目の金額に、伝票の金額を加えます。MOVEでは値を置き換えてしまいますが、同じ支店の複数の伝票を合計する必要があるため、ADDを使います。
-
d:支店別の金額を全支店の合計に加えるWRI-PROCでは、CNTを1から8まで変えながら、8支店分の金額を順に処理します。各支店の金額はMST-BRANCH(CNT)にあります。これらをMST-AMOUNTに加えると、全支店の売上金額合計になります。したがって、dには ADD MST-BRANCH(CNT) TO MST-AMOUNT が入ります。支店別の金額を持つ各項目から全体の合計を作る処理なので、cとは加算の向きが反対です。年月が切り替わるときの処理と、最後の伝票を読み終えたときの処理を並べると、次のようになります。
誤りやすいポイント
-
aでSRT-YYYYMMを選びたくなる点
月単位の集計ですが、選択肢にはSRT-YYYYMMがありません。SRT-DATEは年月日を含み、日付順に並べれば同じ年月の伝票が連続するため、月単位の集計に使えます。 -
bで「等しい」とする点
処理を切り替えるのは、現在の年月と伝票の年月が異なるときです。年月が同じなら、同じ月の集計を続けます。 -
cでMOVEを選ぶ点
MOVEは値を移す処理で、すでに入っている金額を置き換えます。複数の伝票を合計するには、金額を加えるADDが必要です。 -
cとdで添字を取り違える点
cは伝票の支店番号で対象の支店を選ぶため、SRT-BRANCHを使います。dはCNTを1から8まで変えて全支店を順番に処理するため、CNTを使います。
FAQ
Q: なぜ売上日全体で並べ替えるのですか?
A: 同じ年月の伝票を連続させるためです。日付全体を昇順に並べると、年月の順にも並ぶので、月が変わったタイミングを判定できます。
A: 同じ年月の伝票を連続させるためです。日付全体を昇順に並べると、年月の順にも並ぶので、月が変わったタイミングを判定できます。
Q: 最後の月の集計結果は、どこで書き込まれますか?
A: ファイルの終端に達したときにWRI-PROCが呼び出され、最後に処理していた月の集計結果が書き込まれます。月の切替えが起きないまま処理が終わる場合にも、結果を残すための処理です。
A: ファイルの終端に達したときにWRI-PROCが呼び出され、最後に処理していた月の集計結果が書き込まれます。月の切替えが起きないまま処理が終わる場合にも、結果を残すための処理です。
Q: WRI-PROCで、なぜ支店別金額を合計に加えてから書き込むのですか?
A: MST-BRANCHには支店ごとの金額が入っています。MST-AMOUNTには全支店の合計を入れる必要があるため、書込みの前に各支店の金額を加算します。
A: MST-BRANCHには支店ごとの金額が入っています。MST-AMOUNTには全支店の合計を入れる必要があるため、書込みの前に各支店の金額を加算します。
関連キーワード: 順ファイル、索引ファイル、ソートキー、配列、添字、累積計算
設問2:
問題文を見る 前年度の売上データを集計して、売上マスタファイルに格納する際に、第1四半期から第4四半期の順に、当該四半期における全支店の売上金額の合計を表示するようにプログラムを変更する。第1四半期から第4四半期は、それぞれ4月〜6月、7月〜9月、10月〜12月、1月〜3月である。表示例を図3に示す。表1中のに入れる正しい答えを、解答群の中から選べ。


eに関する解答群
ア:行番号30と31の間
イ:行番号40と41の間
ウ:行番号47と48の間
エ:行番号52と53の間
fに関する解答群
ア:1 THRU 12
イ:4 THRU 3
ウ:4, 7, 10, 1
エ:6, 9, 12, 3
gに関する解答群
ア:ADD 1 TO CR-QUART
イ:ADD 3 TO CR-QUART
ウ:MOVE CNT TO CR-QUART
エ:MOVE ZERO TO CR-QUART
模範解答
e:エ、f:エ、g:ア
解説
解答の導き方
この変更では、月ごとに集計した売上金額を四半期ごとに足し合わせ、四半期が終わるたびに表示します。COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)の処理の流れに沿って考えます。
-
四半期の合計を作る場所を考えます。
プログラムでは、月ごとの支店別売上金額を行番号50〜52の繰返しで集計し、その後に行番号53で売上マスタファイルへ書き込みます。したがって、四半期の合計に加える時点では、当月の全支店分を集計し終えている必要があります。表1の処理は、月合計である「MST-AMOUNT」を四半期合計の「QUART-AMOUNT」に加えます。この処理を支店ごとの繰返しの中に入れると、同じ月の合計を繰返し加えてしまいます。繰返しが終わった直後なら、当月分を1回だけ加えられます。そのため、追加位置は行番号52と53の間です。これは eのエ に当たります。 -
四半期の終わりとなる月を決めます。
問題文では、年度は「4月〜翌年3月」で、四半期は「4月〜6月、7月〜9月、10月〜12月、1月〜3月」とされています。各四半期の最後の月は、順に6月、9月、12月、3月です。行番号17の「MST-MM」は月を表します。その直後に追加する88レベルの条件名は、直前の項目が決められた値かどうかを判定するための名前です。四半期の終わりに当たる月を条件として指定するので、値は「6, 9, 12, 3」です。これは fのエ です。この判定が四半期の終わりの月だけで行われるため、4月からの月合計を順に加えた後、6月の処理で第1四半期分を表示できます。問題文には「レコード件数がゼロの月はない」とあるので、四半期の最後の月も処理されます。 -
表示する四半期番号を進めます。
「CR-QUART」は初期値が1です。四半期の合計を表示するとき、この値を使って四半期番号と「QUART-NO(CR-QUART)」の表示文字を選びます。「QUART-STR」の「STNDRDTH」は、2文字ずつ分けると「ST」「ND」「RD」「TH」となり、第1四半期から第4四半期の表示に使われます。表示後には、次の四半期の番号に進める必要があります。そこで「ADD 1 TO CR-QUART」とします。これは gのア です。たとえば、第1四半期を表示した後に番号が2になり、次は第2四半期として表示できます。また、表示後に「QUART-AMOUNT」をゼロに戻すことで、次の四半期の合計に前の四半期の金額が混ざらなくなります。
誤りやすいポイント
- 四半期の開始月である「4, 7, 10, 1」を条件にすると、四半期の合計がまだそろっていない時点で表示してしまいます。判定するのは各四半期の最後の月です。
- 「MST-AMOUNT」を支店ごとの繰返しの中で加えると、月の合計を複数回加えてしまいます。月の集計が終わった後に、1回だけ加えます。
- 「MOVE CNT TO CR-QUART」とすると、四半期番号ではなく支店の繰返し回数を使うことになります。支店の処理回数と四半期の番号は別の値です。
- 四半期の合計を表示した後に「QUART-AMOUNT」をゼロに戻さないと、次の四半期の表示に前の四半期の金額も含まれます。
FAQ
Q: なぜ3月も四半期の終わりとして判定するのですか?
A: 事業年度が4月から翌年3月までだからです。1月〜3月が第4四半期なので、3月に第4四半期の合計を表示します。
A: 事業年度が4月から翌年3月までだからです。1月〜3月が第4四半期なので、3月に第4四半期の合計を表示します。
Q: 四半期の合計を作るとき、支店ごとの金額を直接足さないのですか?
A: このプログラムでは、まず月ごとの全支店の合計を「MST-AMOUNT」に作ります。その月合計を「QUART-AMOUNT」に1回ずつ加えれば、四半期の全支店分の合計になります。
A: このプログラムでは、まず月ごとの全支店の合計を「MST-AMOUNT」に作ります。その月合計を「QUART-AMOUNT」に1回ずつ加えれば、四半期の全支店分の合計になります。
Q: 4回目の表示後にも四半期番号を増やしてよいのですか?
A: 第4四半期を表示した後は、次の四半期を表示する処理がありません。そのため、このプログラムでは表示後に番号を1増やす処理で問題ありません。
A: 第4四半期を表示した後は、次の四半期を表示する処理がありません。そのため、このプログラムでは表示後に番号を1増やす処理で問題ありません。
関連キーワード: COBOL、ソート、月次集計、四半期集計、条件名、配列



