2010-04-22 13 views
0

J'ai besoin de créer un tableau de 2 colonnes dans ABAP afin qu'un programme puisse rechercher un article d'enregistrement (défini par les lettres A - ZZZ), puis retourner le numéro qui lui est associé.2 Colonne dans SAP ABAP A = 1, B = 2 ... ZZZ =?

Par exemple:

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

S'il vous plaît pouvez-vous suggérer comment je peux coder cela.

Existe-t-il une meilleure option que l'écriture d'un tableau?

Merci.

+0

Ce code golf récent vous montrera de nombreuses façons de le faire (bien que dans plusieurs langues vous fassiez attention à ...) http://stackoverflow.com/questions/2634427/code-golf-numeric-equivalent- of-an-excel-column-name/2634463 # 2634463 –

+0

C'est très utile. Je vous remercie! :-) – Techboy

Répondre

3

Vous n'avez pas besoin de rechercher la valeur dans une table. cela peut être calculé:

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. 

Je n'ai pas testé le programme et il a quelques erreurs de syntaxe. mais l'algorithme derrière devrait fonctionner.

+0

Bonne logique - merci beaucoup :-) – Techboy

+0

+1 pour SY-ABCDE. Je ne savais pas celui-ci ... –

1

peut-être que je suis malentendu, mais ne voulez-vous pas quelque chose comme ça?

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. 

puis une fois qu'il est rempli, relire

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

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

malheureusement, les tableaux n'existent pas dans ABAP, mais une table de hachage est conçu pour ce type de recherche (accès rapide, clés uniques) .

+1

Vous devez utiliser READ TABLE ... WITH TABLE KEY ... au lieu de ... WITH KEY ...parce que ce dernier effectue toujours une recherche linéaire. – vwegert

+1

merci, vwgert, toujours demandé quelle était la différence. mais je vois de la prochaine réponse j'ai mal compris la question de toute façon. – wise

+0

+1 pour toujours fournir la seule "représentation" du concept de tableau dans ABAP – Esti

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. 

Utilisez ce code après l'exécution.

0

J'ai fait une implémentation similaire il y a quelque temps. Vérifiez que cela fonctionne pour vous.

 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. 

Ici L'algorithme utilise une logique récursive pour déterminer l'indice de colonne en nombres. Ce n'est pas mon algorithme, mais j'ai adapté pour être utilisé dans ABAP.

L'algorithme original est utilisé dans Open Excel, je ne peux pas trouver de liens maintenant.