0

我需要在 ABAP 中创建一个 2 列数组,以便程序可以查找记录项(由字母 A - ZZZ 定义),然后返回与其关联的数字。

例如:

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

请你能建议我如何编码。

有比写数组更好的选择吗?

谢谢。

4

4 回答 4

4

您不需要在表中查找值。这可以计算:

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.

我没有测试这个程序,它肯定有一些语法错误。但它背后的算法应该可以工作。

于 2010-04-22T19:47:11.200 回答
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.

执行后使用此代码。

于 2011-08-26T05:55:46.670 回答
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 中不存在数组,但哈希表是为这种查找设计的(快速访问、唯一键)。

于 2010-04-22T14:43:33.513 回答
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中使用了原始算法,现在找不到任何链接。

于 2014-07-15T12:00:22.030 回答