3

したがって、mmddyyyy (01012000) の日付を pic x (8) に読み取り、以前の変数情報を使用して新しい変数を yyyymmdd (20000101) 形式で作成する方法を考えています。部分文字列でこれを行う方法があるに違いないと確信していますか?

4

3 に答える 3

4

@ScottNelson は、回答の「部分文字列を使用する」部分を提供しました。以下は、回答の「またはそうでない」部分です。

01  mmddyyyy.
    05  mm     pic xx.
    05  dd     pic xx.
    05  yyyy   pic xxxx.

01  yyyymmdd.
    05  yyyy   pic xxxx.
    05  mm     pic xx.
    05  dd     pic xx.

move corresponding mmddyyyy to yyyymmdd
于 2016-04-05T19:52:52.673 に答える
2
   01  a-name-to-describe-the-source-date.
       05  antdtsd-dd                      PIC XX.
       05  antdtsd-mm                      PIC XX.
       05  antdtsd-yyyy                    PIC XXXX.

   01  a-name-to-describe-the-destination-date.
       05  antdtdd-yyyy                    PIC XXXX.
       05  antdtdd-mm                      PIC XX.
       05  antdtdd-dd                      PIC XX.

または

   01  a-name-to-describe-the-source-date  PIC X(8).
   01  FILLER 
       REDEFINES a-name-to-describe-the-source-date.
       05  antdtsd-dd                      PIC XX.
       05  antdtsd-mm                      PIC XX.
       05  antdtsd-yyyy                    PIC XX.

   01  a-name-to-describe-the-destination-date.
   01  FILLER 
       REDEFINES a-name-to-describe-the-destination-date.
       05  antdtdd-yyyy                    PIC XX.
       05  antdtdd-mm                      PIC XX.
       05  antdtdd-dd                      PIC XX.

それで

       MOVE antdtsd-dd                     TO antdtdd-dd
       MOVE antdtsd-mm                     TO antdtdd-mm
       MOVE antdtsd-yyyy                   TO antdtdd-yyyy

まず、これを「変換」と呼ぶのは誇張です。単純なデータの再配置です。

第二に、これを行うには多くの方法があります。どのようにしますか?COBOL は「チーム」によってコーディングされる傾向があり、仕事のためにこれを行う場合は、チームの他のメンバーが行うように行うのが最善の方法です。

参照変更と CORRESPONDING の使用の 2 つの方法を示しました (実際のコードで見ると、CORR と省略されることがよくあります。あまり入力するつもりがないのに、誰が CORRESPONDING と入力するのでしょうか...?) .

そうでなければ、それらの中からどのように選択しますか?パフォーマンス?それらはおそらく同一のコードを生成します。したがって、コンパイラはそれから外れています。人間の読者への理解可能性? 私にとって、これは COBOL (または任意の言語) において非常に重要です。

参照変更に関する 2 つの問題。打ち間違え?問題ありません。コードはコンパイルおよび実行されます。そして、あなたはそれをテストで見つけるでしょう。そうしませんか?ある時点で?そして、あなたがそれを見つけるまでに費やされたすべての時間を無駄にします. 2 つ目は、(5:4) とはどういう意味ですか? 誰かが「そのプログラムは年に関して奇妙なことをしている」と言った場合、最初に年が (5:4) のように偽装されていることを確認する必要があります。ああ、そして (1:4)。プログラムの問題をまだ探し始めていないので、位置と長さが正しいことを確認する必要があります。わかりました、日付は些細な例ですが、参照変更ユーザーはおそらくそれを可能な限りすべてに適用します (そうでない場合、なぜ日付に適用するのですか)? それでは、楽しく読んでください。

ああ、COBOL には「文字列」がなく、固定長フィールドがあります。参照変更はフィールドを作成します

CORR。これを使用すると、多くのタイピングを節約できます (これが存在する理由は、おそらくパンチカードと、多くの COBOL プログラムが入力データを処理して新しい出力データを作成する方法によるものです。パンチカード上のプログラムなので、タイピングを減らす本当の理由 -パンチカード プログラムの場合)。

さて、今は現代です。

年が 2005 年の月名を取得するために、「月」を添え字として使用するとします。

IF yy OF yyyymmdd EQUAL TO "2005"
    MOVE month-name-in-table ( mm OF yyyymmdd ) TO ...
END_IF

(これは、mm OF yyyymmdd が数値として定義されていることを前提としています)。

CORR を使用できるようにするためだけに、プログラム全体に「修飾」 (OF または IN を使用して、名前が属するものを参照することによって名前を一意にすること) を分散させたいですか?

于 2016-04-07T12:17:13.697 に答える