Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Mon Dec 10, 2007 2:55 pm Post subject:
Не совсем понятно, что нужно... Может это?
Code:
DATA: LT_SFLIGHT TYPE TABLE OF SFLIGHT WITH HEADER LINE.
DATA: R_CONNID TYPE RANGE OF S_CONN_ID,
RANGE_NAME TYPE FIELDNAME.
START-OF-SELECTION.
RANGE_NAME = 'R_CONNID'.
PERFORM CREATE_RANGE USING RANGE_NAME.
SELECT * FROM SFLIGHT INTO TABLE LT_SFLIGHT
WHERE CONNID IN R_CONNID.
*&---------------------------------------------------------------------*
*& Form CREATE_RANGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_RANGE_NAME text
*----------------------------------------------------------------------*
FORM CREATE_RANGE USING P_RANGE_NAME TYPE FIELDNAME.
DATA: HEADER TYPE APPL_RANGE.
FIELD-SYMBOLS: <T_RANGE> TYPE TABLE.
ASSIGN (P_RANGE_NAME) TO <T_RANGE>.
CHECK SY-SUBRC IS INITIAL.
Вот такой код не универсален, потому что в параметрах функции явно определен тип ranges r_hkont. Хотел от него избавиться.
Сейчас попробую через assign, но это тоже не очень красиво.
PS: В мой системе нет TYPE APPL_RANGE.
Code:
DEFINE RANGE_COPY.
*&1 range source.
*&2 range target.
REFRESH &2.
LOOP AT &1.
MOVE-CORRESPONDING &1 TO &2.
APPEND &2.
ENDLOOP.
END-OF-DEFINITION.
DATA: g_range TYPE RANGE OF SETVAL WITH HEADER LINE.
CONSTANTS:
c_set_hkont LIKE rgsbm-shortname VALUE 'Z_EXCL_HKONT'.
RANGES: r_hkont FOR bseg-hkont.
PERFORM f_get_set_single_type
USING c_set_hkont.
RANGE_COPY g_range r_hkont.
*---------------------------------------------------------------------*
* FORM f_get_set_single_type *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> SHORTNAME *
*---------------------------------------------------------------------*
FORM f_get_set_single_type
USING shortname.
REFRESH g_range. CLEAR: g_range.
DATA setnr LIKE rgsbs-setnr.
DATA:
loc_set_lines_basic LIKE rgsbv OCCURS 0 WITH HEADER LINE,
loc_set_lines_single LIKE rgsb1 OCCURS 0 WITH HEADER LINE.
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Mon Dec 10, 2007 5:33 pm Post subject:
Сергей wrote:
Типы header и <T_RANGE> не совпадают и при добавлении параметр high портится.
Они не могут не совпадать, при условии что диапазон правильно объявлен. Структура HEADER должна быть такая же как у диапазона, т.е. всего 4 поля: sign(1), option(2), low и high - должны быть типизированы под нужный элемент (в конкретном случае тип HKONT). Структуру можно сделать самому...
Типы header и <T_RANGE> не совпадают и при добавлении параметр high портится.
Они не могут не совпадать, при условии что диапазон правильно объявлен. Структура HEADER должна быть такая же как у диапазона, т.е. всего 4 поля: sign(1), option(2), low и high - должны быть типизированы под нужный элемент (в конкретном случае тип HKONT). Структуру можно сделать самому...
Так такая задача стояла изначально, отказаться от какой либо статической типизации внутри подпрограммы. В крайнем случае передавать тип в качестве агрумента, как ты предложил.
Побился, побился, динамически создать range в подпрограмме на основе передаваемого в строке имени range, не получилось. Поэтому решил через макросы. В подпрограмме заполнил range с заведомо длинными low, high а при выходе перекопирую через макрос.
Код исправил в сообщении выше.
Хотя вопрос динамического создания range остается открытым, решение найти все равно хочется. На sapforum был подобный вопрос, но вроде тоже остался без решения.
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Tue Dec 11, 2007 12:41 pm Post subject:
Последний вариант:
Code:
DATA: LT_SFLIGHT TYPE TABLE OF SFLIGHT WITH HEADER LINE.
DATA: R_CONNID TYPE RANGE OF S_CONN_ID,
R_CARRID TYPE RANGE OF S_CARR_ID,
RANGE_NAME TYPE FIELDNAME.
START-OF-SELECTION.
RANGE_NAME = 'R_CONNID'.
PERFORM CREATE_RANGE USING RANGE_NAME.
RANGE_NAME = 'R_CARRID'.
PERFORM CREATE_RANGE USING RANGE_NAME.
SELECT * FROM SFLIGHT INTO TABLE LT_SFLIGHT
WHERE CONNID IN R_CONNID
AND CARRID IN R_CARRID.
*&---------------------------------------------------------------------*
*& Form CREATE_RANGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_RANGE_NAME text
*----------------------------------------------------------------------*
FORM CREATE_RANGE USING P_RANGE_NAME TYPE FIELDNAME.
DATA: RANGE LIKE RANGE OF P_RANGE_NAME WITH HEADER LINE.
FIELD-SYMBOLS: <T_RANGE> TYPE TABLE.
* Create dynamic values
ASSIGN (P_RANGE_NAME) TO <T_RANGE>.
CHECK SY-SUBRC IS INITIAL.
* Create range
CASE P_RANGE_NAME.
WHEN 'R_CONNID'.
RANGE-SIGN = 'I'.
RANGE-OPTION = 'EQ'.
RANGE-LOW = '0820'.
WHEN 'R_CARRID'.
RANGE-SIGN = 'I'.
RANGE-OPTION = 'EQ'.
RANGE-LOW = 'AC'.
ENDCASE.
John Doe, последний вариант самый интересный, но есть вопрос по строке:
DATA: RANGE LIKE RANGE OF P_RANGE_NAME WITH HEADER LINE.
У меня система 4.7. НЕзависимо от того, какой бы range не указавал в качестве аргумента в P_RANGE_NAME, создается всегда одинаковый с длиной low и high = 30 символам. Соотественно APPEND правильно не работает. У тебя точно динамически тип range меняется?
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Tue Dec 11, 2007 2:59 pm Post subject:
У меня этот текст программы в erp2005 отрабатывает корректно. Автоматически типизация char30 присваивается, но после апенда все нормально выравнивается. В примере, я на вход подаю один тип char2, а другой numc4 - и все работает.
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.