2012-08-07 48 views
0

問:子字符串使用MOVEL功能RPG文本

是將它保存到獲得使用其採取文本長度爲X,並將其存儲到容量n中的變量MOVEL功能從RPG文本串n個字符?

或者獲得第一個n字符的唯一方法是使用SUBST?

問題的背景是我的一個同事從數據庫中獲得前30個字符的長度爲30個字符的字符串正在使用MOVEL作爲長度只有3個字符的變量(如截斷其餘部分)。奇怪的方式,有時接收變量顯示減號字符(' - '),有時不會。所以我認爲使用MOVEL不是一種安全的方式。我想像C中總是以'\ 0'結尾的字符串,你需要使用strcpy函數來獲得拷貝保存,而不是使用=運算符賦值。

誰知道RPG熟悉這個問題?

回答

3

MOVEL應該工作。 RPG允許多個character data types。一般來說,使用MOVEL的人不會處理空終止的字符串,因爲MOVEL是一種古老的技術,空終止的字符串是較新的數據類型。您可以閱讀RPG手冊中的MOVEx operationsstring operations。爲了得到更好的答案,請張貼您的代碼,包括涉及變量的定義。

編輯:MOVEL如何處理符號的示例。

dcl-s long char(20) inz('CORPORATION'); 
    dcl-s short char(3) inz('COR'); 
    dcl-s numb packed(3: 0); 

    // 369 
c     movel  long   numb 
    dsply numb; 

    // -369 
c     movel  short   numb 
    dsply numb; 


    *inlr = *on; 
+0

Hi Buck,稍後會發布。有趣的是,數據庫中有7000條記錄數據。其中一個字段包含30個字符的數據。所有數據都以三位數字開頭(123 xxxxxxx ...,345 yyyyyyyy ...等)。我們聲明瞭兩個變量,x和y。我們運行movel到字段中的每個記錄到一個包含3個字符的變量並保存到x。之後,我們爲每條記錄運行subst到相同的字段並將其保存到y。在7000中有19個記錄movel返回正確的數字,但帶有減號,而subst返回100%正確的數字。 – WishKnew 2012-08-07 16:30:57

+0

MOVEL在字符和數字之間做了明確的轉換。如果您有像JKL xxxxxx而不是123 xxxxxx這樣的字符,那麼JKL將轉換爲數字-123。 MOVEL參考http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frzasd%2Fsc092508972。htm解釋了原因。 – 2012-08-07 17:15:17

1

對於RPG中的帶符號數字字段,符號被保存在字段最後一個字節的區域中。所以123是X'F1F2F3',但-123是X'F1F2D3'。如果你將這些字段看作字符串,它們將有123和12L。

在您的程序中,您將類似「123 AAAAAL」的內容轉換爲3位數字字段,以便獲得X'F1F2F3',但由於最終字符爲X'D3',因此將結果更改爲具有D區域X'F1F2D3' 您的異常取決於第30個字符包含的內容。如果它是或者任何大寫字母J到R,那麼你會得到一個負面結果。 [前3個字符是數字還是字母並不重要,因爲它只是字節的後半部分,在本例中很重要。]

IBM手冊說: 如果因子2是字符和結果字段是數字,如果因子2的最右邊位置的區域是十六進制D(負區域),則負區域會移動到結果字段的最右邊位置。但是,如果因子2的最右邊位置的區域不是十六進制D,則正區域會移動到結果區域的最右邊位置。其他結果字段位置僅包含數字字符。

Don

+0

是的,標誌被保存在字段的最後一個字節中。不,MOVEL目標的符號不取決於信號源的最後一個字符。它取決於目標的最後一個字符。我編輯了我的答案來提供一個例子。 – 2015-02-06 15:47:37