2 Массив столбцов в SAP ABAP A = 1, B = 2 ... ZZZ =? - PullRequest
0 голосов
/ 22 апреля 2010

Мне нужно создать массив из 2 столбцов в ABAP, чтобы программа могла искать элемент записи (определенный буквами A - ZZZ) и затем возвращать связанный с ним номер.

Например:

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

Подскажите, пожалуйста, как я могу это кодировать.

Есть ли лучший вариант, чем написать массив?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 22 апреля 2010

вам не нужно искать значение в таблице. это можно рассчитать:

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.

Я не тестировал программу, и в ней есть некоторые ошибки синтаксиса. но алгоритм должен работать.

1 голос
/ 26 августа 2011
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.

Используйте этот код после выполнения.

1 голос
/ 22 апреля 2010

возможно, я неправильно понимаю, но разве вы не хотите что-то подобное?

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 массивов не существует, но для этого вида поиска предназначена хэшированная таблица (быстрый доступ, уникальные ключи).

0 голосов
/ 15 июля 2014

Я сделал похожую реализацию некоторое время назад. Проверьте это, это работает для вас.

      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, сейчас не могу найти никаких ссылок.

...