• ベストアンサー

[COBOL]日付比較 その2

http://oshiete1.goo.ne.jp/qa4201503.htmlと同様の質問です。 受付日と今日の日付を比較して1ヶ月経過したデータと振り分ける。  1ヶ月経過したものは、削除分のデータとしてディスクに保存  1ヶ月経過していないものは、保存分のデータとしてディスクに保存 ただし、入力データは、受付日(6桁)に書かれているのは6桁(例:080524) 本日の日付は、システム時間で8桁(例:20080824) 入力データに記載されている受付日は2000年以降のものしかないため、受付日の先頭に20を追加します。 なお、判定日の1ヶ月前年月はサブモジュールで実装しています。 振り分けの条件では、年月のみで比較します。 (例)  受付日 080629   →200806 ('20')を追加  判定日 20080806  →200808   また、Copy句ファイル(BSCP10A)には、  10 'XXX-KEY-KOMOKU'   15 'XXX'-RIYOU-YMD PIC X(06).   15 'XXX'-RIYOU-ZIKOKU PIC X(06).   と定義されています。 以下のように実装してみました。(抜粋) WORKING-STORAGE SECTION. 01 DATA-IN. COPY BS10A SUPPRESS PREPLACING =='XXX'==BY==BS10A==. 01 DATA-OUT1. COPY BS10A SUPPRESS PREPLACING =='XXX'==BY==BS10A==. 01 DATA-OUT2. COPY BS10A SUPPRESS PREPLACING =='XXX'==BY==BS10A==. 01 WORK-AREA. //ここに受付日を8桁にする方法を記述? 05 WK-DATA-RIYOBI. PROCEDURE DIVISION. *--<主処理>-- MOVE BS10A-RIYOU-YMD TO WK-DATA-RIYOBI. //以下に振り分け条件記述 6桁にした受付日と判定日の1ヶ月前年月を比較 入力データの受付日に20を追加して6桁にする方法を教えてください。どうか皆様のお力を貸してください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tetsu-k
  • ベストアンサー率46% (196/426)
回答No.5

#2様の方法のほかに REDEFINES を使用する方法もあります。 01 WORK-AREA. 05 FILLER PIC X(2) VALUE '20'. 05 WK-DATA-RIYOBI PIC X(6). 01 WORK-AREA-R REDEFINES WORK-AREA. 05 WK-DATA-RIYOBI-YM PIC X(6). 05 FILLER PIC X(2). MOVE BS10A-RIYOU-YMD OF DATA-IN TO WK-DATA-RIYOBI. このあと WK-DATA-RIYOBI-YM が年月部分になります。

その他の回答 (4)

回答No.4

#2です。失礼しました。 01 WORK-AREA. 05 FILLER PIC X(2) VALUE '20'. 05 WK-DATA-RIYOBI PIC X(6). MOVE BS10A-RIYOU-YMD TO WK-DATA-RIYOBI. 部分参照が可能なら、WORK-AREA(1:6)で参照すると、yyyymmの形式で得られます。

  • saburo0
  • ベストアンサー率35% (76/216)
回答No.3

#1です。 「MOVE '20' TO WK-DATA-RIYOBI(1:2).」の部分はコンパイルエラーにならなかったのですね? BS10A-RIYOU-YMDを複数定義されている為だと思います。 質問の内容を拝見致しますと、COPY句を3箇所使われていて、REPLACING =='XXX'==BY==BS10A==. も同一内容となっております。 DATA-IN以外のREPLACINGの変換後の文字列を「BS10B」「BS10C」のように修正して頂くか、 「MOVE BS10A-RIYOU-YMD OF DATA-IN TO WK-DATA-RIYOBI.」 のように、OF修飾を付けて頂くかのどちらかで対応出来ると思います。

回答No.2

01 WORK-AREA. 05 FILLER PIC X(2) VALUE '20'. 05 WK-DATA-RIYOBI PIC X(6). MOVE BS10A-RIYOU-YMD TO WK-DATA-RIYOBI. 以上で、WORK-AREAで参照すると、8桁の日付になります。

lovelace
質問者

補足

chukenkenkouさん、回答していただきありがとうございます。 8桁の日付にするのではなく、6桁にしたいのです。 (例 080729 → 200807) よろしくお願いします。

  • saburo0
  • ベストアンサー率35% (76/216)
回答No.1

入力データの受付年月日(YYMMDD)が「BS10A-RIYOU-YMD」、 変換後の受付年月(YYYYMM)が「WK-DATA-RIYOBI」という前提ですが、 MOVE '20' TO WK-DATA-RIYOBI(1:2). MOVE BS10A-RIYOU-YMD(1:4) TO WK-DATA-RIYOBI(3:4). ではいかがでしょうか。

lovelace
質問者

補足

saburo0さん、回答していただきありがとうございます。 追加で質問なのですが、TSOにて開発しています。 しかし、コンパイル(COBOLII)すると、 MOVE BS10A-RIYOU-YMD TO WK-DATA-RIYOBI. の部分で、「BS10A WAS NOT A UNIQUELY DEFINED NAME.」 というメッセージが出てしまいます。 これを解決するにはどうすればよいでしょうか?

関連するQ&A

  • [COBOL]日付比較

    現在COBOLで以下のようなプログラムを作成しています。 受付日と今日の日付を比較して1ヶ月経過したデータと振り分ける。  1ヶ月経過したものは、削除分のデータとしてディスクに保存  1ヶ月経過していないものは、保存分のデータとしてディスクに保存 ただし、入力データは、受付日(6桁)に書かれているのは6桁(例:080524) 本日の日付は、システム時間で8桁(例:20080824) このままでは、桁数が違うので、比較することができないため、受付日を8桁にしたいと考えています。 つまり、「'20'+受付日」としたいのです。 この場合、どのようにすればよろしいのでしょうか? よろしくお願いします。

  • COBOL・全角判定

    以前こちらで質問したものです。 http://oshiete1.goo.ne.jp/qa2553484.html 例題を参考に詳細設計書を作成中ですが、 お客様の要望で「漢字項目は前後に漢字制御コード(前に‘0A42’後に‘0A41’)を付加する」というのがあり、わからなくなってしまい質問です。 漢字項目もX(40)というようにCOPY句で設定されています。 どの項目が漢字項目なのかは資料をいただいてわかっています。 例題をもとにすると IF DATA-AREA NOT = ' '   PERFORM TEST BEFORE VARYING I FROM DATA-LEN BY -1       UNTIL (I < 1) OR (DATA-AREA(I:1) NOT = ' ')       CONTINUE    END-PERFORM 【1】    MOVE I TO DATA-LEN    STRING DATA-AREA ','      DELIMITED SIZE      INTO OUT-REC      WITH POINTER DATA-POS    END-STRING 【1】にIF文でデータが全角かどうか判定するのだと思うのですが どう判定したらよいのでしょうか。マニュアルをみたのですが探せませんでした。またもし全角データだった場合STRINGはどのように記入すればよいのでしょうか。

  • ファイル自動保存マクロ  件名「A1」+日付 作動

    エクセル 2007を使っています。 請求書管理で。ファイル自動保存マクロを作りましたが、問題があります。 「A1」セルを件名+日付でマクロにて、実行しますと、「A1」セルに「あいう」と手入力しますと問題なく作動します。          ファイル名 C*・・・・・¥あいう2009-10-19 何が原因かわかりませんので、お尋ねします。 A2;A4にセルの結合で顧客名を入力規則で表示してありそのデーターを 「A1」に(+A2)と数式をいれて、動かしても、止まってしまいます。 ・・・A1をコピー&値貼り付けをしても動きません    その後、手入力で作動しますと作動します。 何が原因でしょうか、 教えてください。 マクロ文を添付しております。 ボタン2は (コピー&値貼り付けです) ボタン3が、問題のわからない部分です。 よろしくお願いいたします、 Private Sub CommandButton2_Click() Range("A1:D58").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 ' End Sub Private Sub CommandButton3_Click() Dim wk, wk2 As String wk2 = Date wk2 = Replace(wk2, "/", "-") wk = "C:\Users\fukushima\Documents\○○○\△△△\" & Cells(1, 1) & wk2 & ".xls" ActiveWorkbook.SaveAs fileName:=wk Application.Quit End Sub

  • SQL文 数値型(日付)の10日後までのデータを判定したい

    VB6.0+ORACLE10g、WIN2003Server環境です。 データベースに数値型の日付(6桁)があるのですが、 日付データの今日から数えて10日後以降のデータを抽出したいのと もう一つ条件で、 日付データの今日から数えて10日後までのデータは△、 今日を過ぎているデータは×を表示したいのですが (DECODE()で判定はいけると思うのですが…)ご教授よろしくお願いします。 数値型日付データ 80624→2008/06/24 215 →2000/02/15 A01 A02  A03  A04 A05  A06 キー 品名  個数 単価 金額  納入予定日 001 パン  1  100  100  80620 002 菓子  2  120  240  80720 003 プリン 3  150  450  80610 004 饅頭  2  200  400  80611 最終的に(2008/06/24現在) × 001 パン  1  100  100  80620 △ 002 菓子  2  120  240  80701 △ 003 プリン 3  150  450  80630 × 004 饅頭  2  200  400  80611 ~2008/06/23 ― 2008/06/24~2008/07/04 ― 2008/07/25~    ×          △         表示なし

  • COBOL プログラミング

    課題で「DBからデータを取得する際、それぞれの項目から登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  SKA_SAKI_CD --出荷先        ,SKA_TYPE --出荷タイプ INTO :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' AND INS_DATE =(SELECT MAX(INS_DATE) FROM テーブル名 END-EXEC END-IF 上記の処理だとテーブルの中で登録日(INS_DATE)の最大値であるデータ1件だけしか取得できません。 私が実現したい機能はたとえば Aという項目とBという項目があったとして      登録日 A    2011/9/9 A 2011/9/11 A 2011/9/10 B 2011/8/9 B 2011/8/18 B 2011/9/20 Aの中で登録日が最新(最大)である A 2011/9/11 Aの中で登録日が最新(最大)である B 2011/9/20 を取得する処理を実現したいです!! これを実現するにはORDER BY して降順に並べた後に、ROWNUMを使うらしいのですが よくわかりません。どなたかプログラムで書いていただけますかか?? ヒントや考え方でもかまいません よろしくお願いいたします。

  • EXCELでの日付表示の変更(西暦→和暦)について教えてください。

    EXCELでの日付表示の変更(西暦→和暦)について教えてください。 EXCELでデータ整理をしている中で、 西暦の日付を指す8桁の数字を和暦に表示変更しています。 普段は、 「区切り位置」にて「日付(YMD)」を指定    ↓ 「セルの書式設定」の「表示形式」にて、「日付」の「H13.3.14」を選択 という方法で表示形式を変更しているのですが、 8桁の数字の中には月末日を表す意味で 7・8桁目に「32」という数字が入っているものもあるので(下記参照)、 区切り位置指定のできないものが出てきてしまいます。 (例) 日付A     日付B 20050632   0 20060932   20060932 20071201   20081201 20080515   0 20061232   0   ↓ これを以下のようにしたい。 日付A     日付B H17.6.32   0 H18.9.32   H18.9.32 H19.12.1   H20.12.1 H20.5.15   0 H18.12.32   0 自分で思い浮かんだ方法としては、 区切り位置を指定する前に、 5・6桁目が01,03,05,07,08,10,12なら32→31に置換、02なら(以下略) というのがあるのですが、月末日かどうか分からなくなってしまうのと、 それを許容したとしても、手作業でできるデータ量ではないため、 気が遠い作業になってしまいます。。 何かもっと他に良い方法はありませんでしょうか? なお、MS EXCEL2003を使用していますが、 別PCでEXCEL2007も使っているので、どちらの方法でも構いません。 また和暦の表示形式は、和暦と分かるものであれば表示形式は問いません。 以上、よろしくお願い致します。

  • 文字列として入力した日付を日付データに変換したい

    OS=Windowds7 エクセルバージョン MicroOffice Home and Buisiness 2010 の中のエクセル です A列に下記のように文字列としての日付が入力されています。 例) 2014年1月5日(日) (セルの属性も”文字列”です) ここから、日付データを取り出したいです。 なお、年は4ケタ固定 プラス 漢字の”年”ですが、 月、日は十の位はゼロ表示していないので、一桁表示、二桁表示、とばらつきがあります。 また曜日表示は全角のカッコの間に漢字一文字で曜日表記してあります。 ま、文字列の日付表示から日付データさえ取り出せれば、あとは曜日のデータ取出しは簡単にできますからこれは後回しにします。 とりあえず無い知恵を絞ってこんなことをやってみました。 =LEFT(A14,LEN(A14)-3) 結果はこうなります。 計算結果 2014年1月5日 これで文字列表記の日付データが何月何日であっても(つまり、月、日が一桁表示でも二桁表示でも、どっちでも)「YYYY年M月D日」の形式での年月日表示にすることはできました。 しかし、この状態ではまだ計算結果として表示している「2014年1月5日」は依然、文字列データのままです。これでは加工ができません。 私は 2014年1月5日(日) という文字列データを日付データに変換して、例えば H26.1.5 平成26年01月05日 1/5 (それを基にして別ののセルに)sunday、日曜日、日曜、日 などなどなどの多彩に曜日表記する など「日付データとしての表記の加工」を自由に行いたいのです。 どなたか、やり方を教えてください。 なお、データ加工の為の作業用セル、作業用列を作るのは構いませんがなるべく少ない領域で お願いします。 また私が無い知恵を絞って作成した計算式 =LEFT(A14,LEN(A14)-3) が無意味ならば(多分、無意味でしょう)、全く無視していただいて構いません。 よろしくお願いします

  • Excelにおける日付

    仕事用に他部署からデータをExcelでいただいたのですが、1万件近くのデータが入っており、このデータの日付が全て7桁の数値として入力されているため、活用できず困っています。 Excelに詳しい方のお知恵を拝借したく、質問に参りました。 行いたい処理は、Excelのあるセルに「20050301」という7桁の数字が入力されている場合、これを別の1つのセル内に「2005年3月1日」という日付として認識させたいのです。 そういったことはできるのでしょうか? セルの書式で、表示形式をユーザー定義・####年##月##日とすれば、「2005年03月01日」と表示させることは簡単にできますが、そうではなく、7桁の数字を日付として認識させ、日付関数を使って日数の計算をしたいのです。 A1セルに「20040301」、B1セルに「20050301」と入力されているとしたら、これをそれぞれ「2004年3月1日」、「2005年3月1日」と認識させ、その間の日数が365日という結果を算出するのが目的です。 ダイレクトにできなければ、途中にいくつかの列を経由しても構いません。 よろしくお願いします。

  • SQLを教えてください

    ORACLE更新する際のSQLで困ってますので、SQLを教えてください。 TABLE1の中に項目MEMO(15桁)が存在します。 このMEMOに入っているデータは以下のとおりです。 MEMO 090-XXXX-XXX1 090-XXXX-XXX2 090-XXXX-XXX3 A B C 090-XXXX-XXX4 090-XXXX-XXX5 090-XXXX-XXX6 このデータの中で、上3行のデータ(090-XXXX-XXX1~090-XXXX-XXX3)のデータを 下3行のデータ( 090-XXXX-XXX4~ 090-XXXX-XXX6)のように 1桁目をスペースする形で統一したいと思います。 更新後のデータは以下のとおりです。 MEMO 090-XXXX-XXX1 090-XXXX-XXX2 090-XXXX-XXX3 A B C 090-XXXX-XXX4 090-XXXX-XXX5 090-XXXX-XXX6 このような場合のSQL作成方法はどのようにしたらいいのでしょうか? WHERE文については、 WHERE SUBSTR(MEMO,1,1) <> 'A' AND SUBSTR(MEMO,1,1) <> 'B' AND SUBSTR(MEMO,1,1) <> 'C' AND SUBSTR(MEMO,1,1) <> ' ' これでいいのかなと思うのですが、 作成方法について教えて頂きたく思います。 よろしくお願いします。

  • SQL。項目内のフラグを判断して、SUMしたい。

    やりたいこととしては、ymdとnoとidで一つにデータをまとめ、 各レコードの持つフラグ(a,b)の状態次第(両方trueならば)で、 SUMする項目(num1,num2)を適切に変更したいです。 下記みたいな感じでやってみたものの、まとめ方が悪いらしく期待した答えが出せません。 (何だかんだいじってみても同様、そして、張り付けたSQLは多分エラー。) 考え方が悪いのか、やり方が悪いのか、どなたかご教示いただきたく、よろしくお願いします。 ---------------------------------------- 実行SQL select ymd,no,id, SUM(   case     when max(a) and max(b)       then         num1   else     num2   end ) abc from (   select     '20180423' ymd,1 no,1 id,true a,true b,100 num1,300 num2   union   select     '20180423' ymd,1 no,1 id,false a,true b,200 num1,400 num2   union   select     '20180424' ymd,1 no,1 id,false a,false b,300 num1,500 num2   union   select     '20180424' ymd,1 no,1 id,true a,true b,400 num1,600 num2   union   select     '20180424' ymd,1 no,2 id,false a,true b,500 num1,700 num2 )table_1 group by ymd,no,id ---------------------------------------- 期待している答え ymd,no,id,abc 20180423,1,1,500 20180424,1,1,900 20180424,1,2,700 ----------------------------------------

専門家に質問してみよう