Текущее время: Чт, июн 26 2025, 17:06

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Сортировка данных в таблице
СообщениеДобавлено: Пн, янв 18 2016, 17:35 
Начинающий
Начинающий

Зарегистрирован:
Пн, янв 18 2016, 16:16
Сообщения: 6
Здравствуйте уважаемые форумчане! Просьба не кидаться плохими комментариями по поводу глупого вопроса, я начинающий в SAP/ABAP, поэтому прошу понять и простить :D
Суть задачи - есть такой код:
Code:
REPORT  z_salv_simple_list5.

DATA: gd_alv               TYPE REF TO cl_salv_table,  "Data for ALV
      gv_error_message     TYPE REF TO cx_salv_msg, "Error message
      gd_layout_settings   TYPE REF TO cl_salv_layout, "Layout
      gs_layout_key        TYPE salv_s_layout_key.

DATA: gt_filetable  TYPE filetable, "File selection
      gv_rc         TYPE i. "Error holder

TYPES:
  BEGIN OF ts_userdata,
    name      TYPE pd_vorna,
    lastname  TYPE pad_nachn,
  END OF ts_userdata,
  tt_userdata TYPE TABLE OF ts_userdata.


DATA: gt_userdata TYPE tt_userdata,
      iv_file_str   TYPE string.


*** IMPORT FILE ***
cl_gui_frontend_services=>file_open_dialog(
        CHANGING
          file_table              = gt_filetable
          rc                      = gv_rc
        EXCEPTIONS
          file_open_dialog_failed = 1
          cntl_error              = 2
          error_no_gui            = 3
          not_supported_by_gui    = 4
          OTHERS                  = 5
      ).

IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

IF lines( gt_filetable ) > 0.
  READ TABLE gt_filetable INDEX 1 INTO iv_file_str.

ENDIF.
*** /END OF FILE IMPORTING ***


*** READ & SEPARATE FILE DATA ***
CALL METHOD cl_gui_frontend_services=>gui_upload
  EXPORTING
    filename            = iv_file_str
    has_field_separator = 'X'
  CHANGING
    data_tab            = gt_userdata.
*** /END OF FILE READING ***

SORT gt_userdata BY lastname. "Sort data in table


*** IMPORT DATA IN SALV ***
TRY.
    cl_salv_table=>factory(
    IMPORTING
      r_salv_table = gd_alv
    CHANGING
      t_table      = gt_userdata ).
  CATCH cx_salv_msg INTO gv_error_message.
    MESSAGE 'Sorry, error appeard.' TYPE 'E'.
ENDTRY.
*** /END OF DATA IMPORTING IN SALV ***


* Layout settings *
gd_layout_settings = gd_alv->get_layout( ).
gs_layout_key-report = sy-repid.
gd_layout_settings->set_key( gs_layout_key ).
gd_layout_settings->set_save_restriction( if_salv_c_layout=>restrict_none ).
* /End of Layout Settings *


gd_alv->display( ).  "Display SALV


Программа даёт возможность загрузить csv файл, в котором написаны "Имя" и "Фамилия". Программа делит значения на 2 столбика.
Мне надо сделать так, чтобы я мог отсортировать фамилии в своём порядке. Не просто по алфавиту, а скажем А, Г, И, Д и дальше уже остальные по алфавиту.

Как это можно реализовать? Весь мозг переломал и инет перерыл.
Спасибо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Пн, янв 18 2016, 17:42 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Создать таблицу перекодировки, типа А->А, Г->Б, И->В, Д->Г... Перекодировать фамилию, положить в какое-нибудь техническое поле таблицы и уже отсортировать обычным Sort.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Пн, янв 18 2016, 17:47 
Начинающий
Начинающий

Зарегистрирован:
Пн, янв 18 2016, 16:16
Сообщения: 6
Спасибо за столь скорый ответ!
Извиняюсь, что значит "таблица перекодировки"? Это какая-то особая таблица или обычная таблица, которую вручную надо создать?
Благодарю за ответ.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Пн, янв 18 2016, 17:58 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Vlad-T написал(а):
Спасибо за столь скорый ответ!
Извиняюсь, что значит "таблица перекодировки"? Это какая-то особая таблица или обычная таблица, которую вручную надо создать?
Благодарю за ответ.

Под таблицей можно понимать любой массив данных, к отдельным элементам которого есть прямой доступ. Например, обычная строка с индексом смещения:
Code:
  Data:
    lv_Sym(1),
    lv_Str type string 'АБВГД....'.
   
    lv_Sym = lv_Str+3(1). "получаем 3-й знак в строке

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Пн, янв 18 2016, 18:55 
Начинающий
Начинающий

Зарегистрирован:
Пн, янв 18 2016, 16:16
Сообщения: 6
Как то мне ABAP упорно не даётся. Попробую дома ещё раз.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Пн, янв 18 2016, 19:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Vlad-T написал(а):
Как то мне ABAP упорно не даётся. Попробую дома ещё раз.

Дело не в ABAP-е, во всех языках похожие приёмы решения задач. Даже у микропроцессора 8086 (IBM PC) есть специальная команда XLAT для перекодировки, использующая способ смещения в таблице перекодировки, т.е. символьной строке. Суть сводится к следующему. Каждый символ (например, исходный) представлен в памяти неким числом, которое можно использовать в качестве адреса в таблице (массиве) для поиска другого (результат).
Например, порядковый номер буквы "И" в русском алфавите 10. Ищем в заранее подготовленной строке (таблице перекодировки) 10-й символ - в вашем случае там должна быть буква "В".
Code:
  lv_Sym = lv_Str+9(1).

+9 потому что в ABAP-е указывается не номер символа, а смещение от начала, т.е. для 1-го символа смещение 0.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Ср, янв 20 2016, 12:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 18:21
Сообщения: 1613
Проще сделать новое поле

TRANSLATE text USING 'А1Г2И3Д4'.

и по нему сортировать

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сортировка данных в таблице
СообщениеДобавлено: Ср, янв 20 2016, 15:34 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Kengur написал(а):
Проще сделать новое поле

TRANSLATE text USING 'А1Г2И3Д4'.

и по нему сортировать

Ну, или так! :)
Только цифр на весь алфавит не хватит, поэтому лучше всё же делать замещение буквы на букву.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сортировка данных в таблице  Тема решена
СообщениеДобавлено: Вт, фев 02 2016, 18:07 
Начинающий
Начинающий

Зарегистрирован:
Пн, янв 18 2016, 16:16
Сообщения: 6
Наверное никому это и не надо, но решил скинуть свой вариант решения данной задачи:

Code:
METHOD compare_char.

  DATA: lv_num1 TYPE i,
        lv_num2 TYPE i,
        lv_str  TYPE string VALUE 'AEIOUBCDFGHJKLMNPQRSTVWXYZ'.

  IF iv_char1 IS INITIAL AND iv_char2 IS NOT INITIAL.  "If first char is empty ' ', than lv_num1 gets value -1, otherwise 1
    ev_result = -1.
  ELSEIF iv_char2 IS INITIAL AND iv_char1 IS NOT INITIAL.
    ev_result = 1.
  ELSEIF iv_char2 IS INITIAL AND iv_char1 IS INITIAL.
    ev_result = 0.
  ELSE.
    FIND FIRST OCCURRENCE OF iv_char1 IN lv_str MATCH OFFSET lv_num1. "Get positions number for first imported char
    FIND FIRST OCCURRENCE OF iv_char2 IN lv_str MATCH OFFSET lv_num2. "Get positions number for second imported char

    IF lv_num1 = lv_num2.   "Compares chars depending on number (0 - comes first, 25 - last char)
      ev_result = 0.        "0: chars are the same. -1: first char comes first. +1: first char is bigger than second.
    ELSEIF lv_num1 < lv_num2.
      ev_result = -1.
    ELSE.
      ev_result = +1.
    ENDIF.
  ENDIF.

ENDMETHOD.


Суть в чём - создал метод, куда вбил свой алфавит. Программа смотрит, на каком месте стоит буква и присваивает номер этой буквы. По итогу получаем значение 0 / -1 либо +1, на основании чего можно делать сортировку дальше.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB