2014-01-07 72 views
1

我需要將四字節字段的兩個字節移動到兩個字節的新字段中。移動4字節字段的最後2個字節?

代碼我想使用:

MOVE C-SERVICE-CYE TO S-CYE. 

我需要在今年的最後兩位數字。防爆時間:2014年將是14

數據結構:

02 S-DATE.        
    10 S-MME PIC X(02).    
    10 FILLER PIC X(01) VALUE '/'. 
    10 S-DDE PIC X(02).    
    10 FILLER PIC X(01) VALUE '/'. 
    10 S-CYE PIC X(02).    

第二數據結構:

02 C-SERVICE-DATE-E.    
    10 C-SERVICE-CYE PIC X(04). 
    10 C-SERVICE-MME PIC X(02). 
    10 C-SERVICE-DDE PIC X(02). 

回答

5

有兩個相當簡單的這樣做的方法。

一是細分源變量聲明:

02 C-SERVICE-DATE-E.    
    10 C-SERVICE-CYE. 
     15 C-SERVICE-CYE-CC PIC X(02). 
     15 C-SERVICE-CYE-YY PIC X(02). 
    10 C-SERVICE-MME PIC X(02). 
    10 C-SERVICE-DDE PIC X(02). 

然後修改MOVE聲明:MOVE C-SERVICE-CYE-YY TO S-CYE

另一種方法是使用參考修改:MOVE C-SERVICE-CYE (3:2) TO S-CYE

這一切工作,因爲您在此引用的數據項目爲DISPLAY類型。如果他們 是數字(例如COMP),這種技術是行不通的。

+0

兩者都是很好的答案。我永遠無法弄清楚如何挑選出最佳答案。最多困難。 –

+0

@DougHauf不要擔心。如果你Upvote有什麼幫助和接受什麼對特定問題最有幫助,我們不介意。我們非常感謝迴應,我們經常沒有得到任何答覆:-) –

1

雖然我會使用NealB的第一種方法作爲您的實際示例,並避免引用修改(我認爲它會遮擋代碼,因此下一個人必須先查明(3:2)是什麼,然後才能「讀取「代碼 - 下一個人可能會在幾個月內),還有其他方法。

10 S-CYE PIC 9(02). 

現在,當您執行MOVE時,編譯器將生成右對齊和左截斷的代碼。使用字母數字到字母數字,您可以左對齊截斷。

如果您的源字段是「計算」(二進制或壓縮十進制),那麼您可以從當前年份獲得「14」。

如果源字段碰巧按照需要顯示的順序,並且包含相同的數據(而不是您的示例),則整個事件可以一次完成。

01 EDITED-DATE-1 PIC XX/XX/XXXX. 
01 EDITED-DATE-2 PIC XXXX/XX/XX. 

現在,當你移動一個PIC X(8)日上述任一項的(具體情況取決於一年),你會得到的斜線。如果源是「計算」,則PIC中的X可以更改爲9。

+0

這比參考mod更清晰? –

+0

@詹姆斯·安德森特別是你不清楚的是什麼?我很高興擴大。如果全部是這樣,請指出,否則您感覺的特定部分不清楚。 –

+0

我可能比你知道更多的COBOL,我只是參考修改要清楚得多,而且需要的COBOL知識要少一些,而不是從編譯器到編譯器的工作存儲定義。 –

1

你可以使用: MOVE C-SERVICE-CYE(3:2),S-CYE

+0

NealB已經覆蓋了。 –