SAPфорум.RU https://sapboard.ru/forum/ |
|
Особенности работы с таблицей РА0293 https://sapboard.ru/forum/viewtopic.php?f=13&t=95495 |
Страница 1 из 1 |
Автор: | boreich [ Вт, сен 26 2017, 10:43 ] |
Заголовок сообщения: | Особенности работы с таблицей РА0293 |
Коллеги, добрый день. Код, представленный ниже, осуществляет следующее: 1. Получаем в переменные si_first_year, si_second_year значение двух лет, предшествующих заданному. Например, если задан 2017, то si_first_year = SI16 2. В таблице РА0293 поля от lga01до lga20 могут содержать значение вида переменной si_first_year (si_second_year) и, если содержат, то соответствующие им поля bet01 - bet20 будут содержать сумму, которую потребуется сложить с соответствующей ей из следующей строки таблицы и т.д. 3. По ключу - таб. номеру можно получить нужные строки, но дальше надо анализировать в каком из этих lga лежит значение вида SI14 (например, для заработков за 2014 год)... Code: CALL FUNCTION 'CCM_GO_BACK_MONTHS' EXPORTING currdate = current_bollist-begda backmonths = 12 IMPORTING newdate = one_year_before. CALL FUNCTION 'CCM_GO_BACK_MONTHS' EXPORTING currdate = current_bollist-begda backmonths = 24 IMPORTING newdate = two_years_before. si_second_year = |SI{ two_years_before+2(2) }|. si_first_year = |SI{ one_year_before+2(2) }|. SELECT * FROM pa0293 INTO TABLE lt_pa0293 WHERE pernr EQ gs_head-pernr. LOOP AT lt_pa0293 INTO wa_pa0293. DO 20 TIMES. IF sy-index LT 10. pa0293_bet_condition = |wa_pa0293-bet0{ sy-index }|. pa0293_lga_condition = |wa_pa0293-lga0{ sy-index }|. ELSE. pa0293_bet_condition = |wa_pa0293-bet{ sy-index }|. pa0293_lga_condition = |wa_pa0293-lga{ sy-index }|. ENDIF. CASE ( pa0293_lga_condition ). WHEN si_first_year. one_year_all = one_year_all + ( pa0293_bet_condition ). WHEN si_second_year. two_years_all = two_years_all + ( pa0293_bet_condition ). ENDCASE. ENDDO. ENDLOOP. На строке CASE ( pa0293_lga_condition ). выдаётся ошибка Синтаксис для спецификации метода: "objref->method" или "class=>method". Вероятно, с кейсом так нельзя делать, но иначе придётся писать слишком уж много кода для такой простой операции. Подозреваю, что можно как то проще получить информацию о заработках за 2 года, но не знаю как. Прошу знающих подсказать. |
Автор: | Kuranov.Dmitry [ Вт, сен 26 2017, 10:51 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
boreich написал(а): Коллеги, добрый день. Код, представленный ниже, осуществляет следующее: 1. Получаем в переменные si_first_year, si_second_year значение двух лет, предшествующих заданному. Например, если задан 2017, то si_first_year = SI16 2. В таблице РА0293 поля от lga01до lga20 могут содержать значение вида переменной si_first_year (si_second_year) и, если содержат, то соответствующие им поля bet01 - bet20 будут содержать сумму, которую потребуется сложить с соответствующей ей из следующей строки таблицы и т.д. 3. По ключу - таб. номеру можно получить нужные строки, но дальше надо анализировать в каком из этих lga лежит значение вида SI14 (например, для заработков за 2014 год)... Code: CALL FUNCTION 'CCM_GO_BACK_MONTHS' EXPORTING currdate = current_bollist-begda backmonths = 12 IMPORTING newdate = one_year_before. CALL FUNCTION 'CCM_GO_BACK_MONTHS' EXPORTING currdate = current_bollist-begda backmonths = 24 IMPORTING newdate = two_years_before. si_second_year = |SI{ two_years_before+2(2) }|. si_first_year = |SI{ one_year_before+2(2) }|. SELECT * FROM pa0293 INTO TABLE lt_pa0293 WHERE pernr EQ gs_head-pernr. LOOP AT lt_pa0293 INTO wa_pa0293. DO 20 TIMES. IF sy-index LT 10. pa0293_bet_condition = |wa_pa0293-bet0{ sy-index }|. pa0293_lga_condition = |wa_pa0293-lga0{ sy-index }|. ELSE. pa0293_bet_condition = |wa_pa0293-bet{ sy-index }|. pa0293_lga_condition = |wa_pa0293-lga{ sy-index }|. ENDIF. CASE ( pa0293_lga_condition ). WHEN si_first_year. one_year_all = one_year_all + ( pa0293_bet_condition ). WHEN si_second_year. two_years_all = two_years_all + ( pa0293_bet_condition ). ENDCASE. ENDDO. ENDLOOP. На строке CASE ( pa0293_lga_condition ). выдаётся ошибка Синтаксис для спецификации метода: "objref->method" или "class=>method". Вероятно, с кейсом так нельзя делать, но иначе придётся писать слишком уж много кода для такой простой операции. Подозреваю, что можно как то проще получить информацию о заработках за 2 года, но не знаю как. Прошу знающих подсказать. do varing не подходит? |
Автор: | boreich [ Вт, сен 26 2017, 10:56 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
Kuranov.Dmitry написал(а): do varing не подходит? Загуглил, выглядит подходящим. Прямо сейчас не проверю, но, думаю, то, что надо. Спасибо! |
Автор: | Кодер [ Вт, сен 26 2017, 10:59 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
Хм? а зачем в CASE в условии скобки? Я вот про это Code: CASE ( pa0293_lga_condition ) Я что-то пропустил, и можно обратится таким образом к переменной где-то кроме ASSIGN? |
Автор: | Kuranov.Dmitry [ Вт, сен 26 2017, 11:05 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
boreich написал(а): Kuranov.Dmitry написал(а): do varing не подходит? Загуглил, выглядит подходящим. Прямо сейчас не проверю, но, думаю, то, что надо. Спасибо! как-то так: Code: LOOP AT lt_pa0293 INTO wa_pa0293. DO 20 TIMES VARING lga from wa_pa0293-lga01 next wa_pa0293-lga02 VARING bet from wa_pa0293-bet01 next wa_pa0293-bet02 . CASE lga . WHEN si_first_year. one_year_all = one_year_all + ( bet ). WHEN si_second_year. two_years_all = two_years_all + ( bet ). ENDCASE. ENDDO. ENDLOOP. p.s. И я бы все таки читал ИТ через ФМ, а не на прямую. |
Автор: | boreich [ Вт, сен 26 2017, 11:38 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
В итоге остановился на таком варианте: Code: LOOP AT lt_pa0293 INTO wa_pa0293. DO 20 TIMES VARYING pa0293_lga FROM wa_pa0293-lga01 NEXT wa_pa0293-lga02 VARYING pa0293_bet FROM wa_pa0293-bet01 NEXT wa_pa0293-bet02. BREAK-POINT. CASE pa0293_lga. WHEN si_first_year. one_year_all = one_year_all + pa0293_bet. WHEN si_second_year. two_years_all = two_years_all + pa0293_bet. ENDCASE. ENDDO. ENDLOOP. Спасибо за ответы. А про ФМ можно подробней? Какой ФМ, что на вход, что на выходе? |
Автор: | boreich [ Вт, сен 26 2017, 11:40 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
Кодер написал(а): Хм? а зачем в CASE в условии скобки? Я вот про это Code: CASE ( pa0293_lga_condition ) Я что-то пропустил, и можно обратится таким образом к переменной где-то кроме ASSIGN? В select"ах можно задавать условия таким образом. Я думал, что и в кейсе можно, но ошибся. |
Автор: | Kuranov.Dmitry [ Вт, сен 26 2017, 11:45 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
boreich написал(а): В итоге остановился на таком варианте: Code: LOOP AT lt_pa0293 INTO wa_pa0293. DO 20 TIMES VARYING pa0293_lga FROM wa_pa0293-lga01 NEXT wa_pa0293-lga02 VARYING pa0293_bet FROM wa_pa0293-bet01 NEXT wa_pa0293-bet02. BREAK-POINT. CASE pa0293_lga. WHEN si_first_year. one_year_all = one_year_all + pa0293_bet. WHEN si_second_year. two_years_all = two_years_all + pa0293_bet. ENDCASE. ENDDO. ENDLOOP. Спасибо за ответы. А про ФМ можно подробней? Какой ФМ, что на вход, что на выходе? Code: CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING * TCLAS = 'A' pernr = табельный номер infty = номер инфотипа * BEGDA = '18000101' начало периода выборки записей * ENDDA = '99991231' конец периода выборки записей * BYPASS_BUFFER = ' ' * LEGACY_MODE = ' ' * IMPORTING * SUBRC = tables infty_tab = куда класть данные * EXCEPTIONS * INFTY_NOT_FOUND = 1 * OTHERS = 2 . пример для вашего случая Code: DATA lt_p0293 TYPE p0293. CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING pernr = gs_head-pernr infty = '0293' * BEGDA = '18000101' * ENDDA = '99991231' tables infty_tab = p0293 EXCEPTIONS INFTY_NOT_FOUND = 1 OTHERS = 2 . он так же проверит полномочия пользователя на получение данных для ТН |
Автор: | Bimit [ Вт, сен 26 2017, 11:45 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
Думаю как то так ФМ RH_READ_INFTY Смотрите группу функций RHDB З.Ы. Этот ФМ больше для орг единиц Дмитрий написал нужный ФМ |
Автор: | boreich [ Вт, сен 26 2017, 11:48 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
Kuranov.Dmitry написал(а): Code: DATA lt_p0293 TYPE p0293. CALL FUNCTION 'HR_READ_INFOTYPE' EXPORTING pernr = gs_head-pernr infty = '0293' * BEGDA = '18000101' * ENDDA = '99991231' tables infty_tab = p0293 EXCEPTIONS INFTY_NOT_FOUND = 1 OTHERS = 2 . он так же проверит полномочия пользователя на получение данных для ТН Но в итоге по р0293 нам потом всё равно таким же циклом надо будет идти? Т.е. разница только в проверке полномочий? |
Автор: | Kuranov.Dmitry [ Вт, сен 26 2017, 11:49 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
boreich написал(а): Но в итоге по р0293 нам потом всё равно таким же циклом надо будет идти? Т.е. разница только в проверке полномочий? да, просто привык работать с PAXXXX таблицами через функциональники, чтение напрямую еще безопасно, но вот обновление чревато обходом проверок на корректность данных |
Автор: | boreich [ Вт, сен 26 2017, 11:51 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
Ладно, всем большое спасибо за помощь. Тема исчерпана. |
Автор: | RoustR [ Ср, сен 27 2017, 11:10 ] |
Заголовок сообщения: | Re: Особенности работы с таблицей РА0293 |
boreich написал(а): Т.е. разница только в проверке полномочий? ФМ еще умеет буфферизовать чтение данных. То есть, если по этому ТН данный ИТ уже был зачитан, то повторное чтение из ФМ зачитает данные из буффера, а не из БД. Существенно, если код является частью какой-то большой программы, где требуемые данные уже могли быть зачитаны в каком-то другом месте программы. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |