Текущее время: Ср, июн 25 2025, 23:24

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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