SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Преобразование цифр в буквы, столбцы EXCEL



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Tue Jul 05, 2011 5:06 pm    Post subject: Преобразование цифр в буквы, столбцы EXCEL Reply with quote

Коллеги, есть необходимость для чисел искать буквенное соответствие, которое есть у столбцов EXCEL
т.е. 1 это A.... 26 это Z, 27 это АА и т.д.

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

Да можно к столбцам обращаться по номеру, я так и сделал, но спортивный интерес остался Smile. Так что задачка интересная.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Tue Jul 05, 2011 5:29 pm    Post subject: Reply with quote

Тут парнишка, за 10 мин решил Smile последний курс МГУ. Старею. Его код не привожу, давайте сами Smile.
_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Tue Jul 05, 2011 5:40 pm    Post subject: Reply with quote

А в чем проблема?
DIV 26, MOD 26, и строка с 26 символами Wink
Можно конечно вместо строки преобразование типов делать - но с юникодом неохота заморачиваться Laughing

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Tue Jul 05, 2011 5:46 pm    Post subject: Reply with quote

Ну если есть время Удав попробуйте Smile. Я не говорю что сложно, или что тут много подходов. Но одно дело знать куда идти, и другое дойти, вот стажер сделал быстрее меня, и красивее.


ЗЫ: Вопрос надо было поставить так, кто красивее, время 10-15 мин.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Tue Jul 05, 2011 6:36 pm    Post subject: Reply with quote

1.Можно было обойтись без подпрограммы, но мне кажется что так красивее Rolling Eyes
2.Константу можно вынести в глобальные данные
Code:
REPORT  z_test_sh.

PARAMETERS: p_cnt TYPE i DEFAULT 256.

DATA: idx TYPE i,
      result TYPE string.

END-OF-SELECTION.

  DO p_cnt TIMES.
    idx = sy-index.
    CLEAR result.
    WHILE idx > 0.
      PERFORM make_str USING idx result.
    ENDWHILE.
    WRITE: / sy-index, '-', result.
  ENDDO.

FORM make_str  USING p_idx TYPE i
                     p_result TYPE string.
  DATA: str(26) TYPE c VALUE 'ZABCDEFGHIJKLMNOPQRSTUVWXY',
        code TYPE i.

  code = p_idx MOD 26.
  p_idx = p_idx DIV 26.
  IF code = 0.
    p_idx = p_idx - 1.
  ENDIF.
  CONCATENATE str+code(1) p_result INTO p_result.
ENDFORM.                    " MAKE_STR


Код - 7 мин., отладка~3 мин Wink

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Wed Jul 06, 2011 11:24 am    Post subject: Reply with quote

свой код приводить не буду, т.к. есть более изящный, предложенный стажером
Code:

REPORT  zzzztemp.

DATA:  lv_col        TYPE i
           ,lv_from(2)
           ,lv_div TYPE i
           ,lv_mod TYPE i
           ,lv_alf(26).

CONCATENATE 'Z' sy-abcde INTO lv_alf.

DO 100 TIMES.

  clear: lv_from.

  lv_mod = lv_col MOD 26.
  lv_from+1(1) = lv_alf+lv_mod(1).

  lv_div = lv_col DIV 26.

    IF lv_mod IS INITIAL.
      lv_div = lv_div - 1.
    ENDIF.

  IF lv_div > 0 .

    lv_mod = lv_div MOD 26.
    lv_from(1) = lv_alf+lv_mod(1).

  ENDIF.

  WRITE: / lv_col, lv_from.

ENDDO.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Wed Jul 06, 2011 11:44 am    Post subject: Reply with quote

Ну это частный случай решения задачи, для Excel 97.
В Excel 2010 обозначения столбцов могут иметь 3-х значные буквенные обозначения Wink
К тому же в случае смены цепочки символов для кодировки у меня достаточно вместо 26 подставить strlen( str) Smile

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Wed Jul 06, 2011 12:20 pm    Post subject: Reply with quote

да только для 2 букв, но у нас больше и не предвидится. Просто очень понравился такой подход, мне даже в голову такое не приходило Smile. Удав спасибо за интересную беседу.
_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Roronoa Zoro
Участник
Участник



Joined: 14 Jan 2010
Posts: 18

PostPosted: Tue Jul 12, 2011 12:24 pm    Post subject: Reply with quote

В примере кода, который привел стажер пропущена инициализация
переменной lv_col.

тобишь рабочий код будет выглядеть так


Code:

report zalg.

DATA:  lv_col        TYPE i
           ,lv_from(2)
           ,lv_div TYPE i
           ,lv_mod TYPE i
           ,lv_alf(26).

CONCATENATE 'Z' sy-abcde INTO lv_alf.

DO 100 TIMES.

  clear: lv_from.

* пропущенная инициализация
  lv_col = sy-index.

  lv_mod = lv_col MOD 26.
  lv_from+1(1) = lv_alf+lv_mod(1).

  lv_div = lv_col DIV 26.

    IF lv_mod IS INITIAL.
      lv_div = lv_div - 1.
    ENDIF.

  IF lv_div > 0 .

    lv_mod = lv_div MOD 26.
    lv_from(1) = lv_alf+lv_mod(1).

  ENDIF.

  WRITE: / lv_col, lv_from.

ENDDO.
[/code]
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.