2010-04-22 55 views
0

我需要在ABAP中創建一個2列數組,以便程序可以查找記錄項(由字母A - ZZZ定義),然後返回與其關聯的數字。2 SAP ABAP中的列數組A = 1,B = 2 ... ZZZ =?

例如:

A = 1
B = 2
C = 3
...
Z = 26
AA = 27
AB = 28
...
AZ =
BA =
...
BZ =
CA =
...
...
ZZZ =

請你可以建議我如何可以代碼這一點。

有沒有比寫入數組更好的選擇?

謝謝。

+0

這個最近的代碼高爾夫將告訴你很多方法來做到這一點(雖然在你不關心的幾種語言...)http://stackoverflow.com/questions/2634427/code-golf-numeric-equivalent- excel-column-name/2634463#2634463 – 2010-04-22 11:01:46

+0

這是非常有用的。謝謝! :-) – Techboy 2010-04-22 11:13:50

回答

3

您不需要查找表中的值。這可以計算出來:

parameters: p_input(3) type c value 'AAA'. 

data: len type i value 0, 
     multiplier type i value 1, 
     result type i value 0, 
     idx type i. 

* how many characters are there? 
len = strlen(p_input). 
idx = len. 

* compute the value for every char starting at the end 
* in 'ABC' the C is multiplied with 1, the B with 26 and the A with 26^2 
do len times. 

* p_input+idx(1) should be the actual character and we look it up in sy-abcde 
    search p_input+idx(1) in SY-ABCDE. 

* if p_input+idx(1) was A then sy-fdpos should now be set to 0 that is s why we add 1 
    compute result = result + (sy-fdpos + 1) * multiplier. 

    idx = idx - 1. 
    multiplier = multiplier * 26. 
enddo. 

write:/result. 

我沒有測試程序,它確實有一些語法錯誤。但它背後的算法應該工作。

+0

良好的邏輯 - 非常感謝:-) – Techboy 2010-04-23 08:28:21

+0

對於SY-ABCDE而言+1。不知道這個... – 2010-04-25 15:53:02

1

也許我是誤解,但你不想要這樣的東西?

type: begin of t_lookup, 
     rec_key type string, 
     value type i, 
     end of t_lookup. 

data: it_lookup type hashed table of t_lookup with unique key rec_key. 

那麼一旦它的稀少,讀回

read table it_lookup with key rec_key = [value] assigning <s>. 

if sy-subrc eq 0. 
    " got something 
else. 
    " didn't 
endif. 

不幸的是,數組不ABAP存在,但哈希表是專爲這種查找(快速訪問,獨特的鍵) 。

+1

您必須使用READ TABLE ... WITH TABLE KEY ...而不是... WITH KEY ...因爲後者總是執行線性搜索。 – vwegert 2010-04-22 18:26:19

+1

謝謝,vwgert,總是想知道有什麼不同。但是我從下一個答案中看到,無論如何我都誤解了這個問題。 – wise 2010-04-23 03:55:11

+0

+1仍爲ABAP提供陣列概念的唯一「代表」 – Esti 2010-05-03 01:39:56

1
DATA: STR TYPE STRING, I TYPE I, J TYPE I, K TYPE I, CH TYPE C, RES 
TYPE INT2, FLAG TYPE I. 

PARAMETERS: S(3). 

START-OF-SELECTION. 

    I = STRLEN(S). 
    STR = S. 
    DO I TIMES. 
    I = I - 1. 
    CH = S. 
    IF CH CO '1234567890.' OR CH CN SY-ABCDE. 
     FLAG = 0. 
     EXIT. 
    ELSE. 
     FLAG = 1. 
    ENDIF. 

    SEARCH SY-ABCDE FOR CH. 

    J = I. 
    K = 1. 
    WHILE J > 0. 
     K = K * 26. 
     J = J - 1. 
    ENDWHILE. 
    K = K * (SY-FDPOS + 1). 

    RES = RES + K. 

    REPLACE SUBSTRING CH IN S WITH ''. 

    ENDDO. 
* RES = RES + SY-FDPOS. 

    IF FLAG = 0. 
    MESSAGE 'String is not valid.' TYPE 'S'. 
    ELSE. 
    WRITE: /, RES . 
    ENDIF. 

執行後使用此代碼。

0

有段時間我做了類似的實現。 檢查它它適用於你。

 DATA: 
    lv_char    TYPE char1, 
    lv_len     TYPE i, 
    lv_len_minus_1   TYPE i, 
    lv_partial_index1  TYPE i, 
    lv_partial_index2  TYPE i, 
    lv_number    TYPE i, 
    result_tab    TYPE match_result_tab, 
    lv_col_index_substr TYPE string, 
    lv_result    TYPE i. 

    FIELD-SYMBOLS: 
       <match> LIKE LINE OF result_tab. 

    lv_len = strlen(iv_col_index) . 
    lv_char = iv_col_index(1). 

    FIND FIRST OCCURRENCE OF lv_char IN co_char RESULTS result_tab. 

    READ TABLE result_tab ASSIGNING <match> INDEX 1. 
    lv_number = <match>-offset . 
    lv_number = lv_number + 1 . 


    IF lv_len EQ 1. 
    ev_col = ((26 ** (lv_len - 1)) * lv_number) . 
    ELSE. 
    lv_len_minus_1 = lv_len - 1. 
    lv_col_index_substr = iv_col_index+1(lv_len_minus_1) . 
    CALL METHOD get_col_index 
     EXPORTING 
     iv_col_index = lv_col_index_substr 
     IMPORTING 
     ev_col  = lv_partial_index2. 

    lv_partial_index1 = ((26 ** (lv_len - 1)) * lv_number) + lv_partial_index2 . 
    ev_col = lv_partial_index1 . 

    ENDIF. 

這裏該算法使用遞歸邏輯來確定數字中的列索引。 這不是我的算法,而是適用於ABAP。

在Open Excel中使用原始算法,現在無法找到任何鏈接。

相關問題