Age: 41 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Tue Mar 08, 2011 7:19 pm Post subject: Найдите 2 отличия
Вот код из стандартного ФМ-а FI
Code:
* I?iaa?ea aiionoeiinoe ei??aniiiaaioee ii J_3RKKRN
CLEAR CHECK.
LOOP AT ZKRN_N.
if tbl_deb-hkont cp zkrn_n-debet and
TBL_KRE-HKONT CP ZKRN_N-KREDIT.
CHECK = 'N'. EXIT.
ENDIF.
ENDLOOP.
IF NOT CHECK IS INITIAL. EXIT. ENDIF.
* I?iaa?yai ei??aniiiaaioee ia ?ac?aoaiiua
LOOP AT ZKRN_N.
if tbl_deb-hkont cp zkrn_n-debet and
TBL_KRE-HKONT CP ZKRN_N-KREDIT.
CHECK = 'N'. EXIT.
ENDIF.
ENDLOOP.
IF NOT CHECK IS INITIAL. CLEAR CHECK. EXIT. ENDIF.
Не могу найти отличие?
Думаю, что кто то польлзовался Сtrl + С и Ctrl + V и перестарался.
Это в LJ3RKKRPF01 FORM CHECK_KRP. _________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Age: 190 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Wed Mar 09, 2011 12:32 pm Post subject:
А в целом - эта подпрограмма достойный образец говно-кода.
Code:
FORM CHECK_KRP
USING TBL_DEB STRUCTURE J_3RKTBL_D_K
TBL_KRE STRUCTURE J_3RKTBL_D_K
CHANGING CHECK.
CLEAR CHECK.
LOOP AT ZKRN_N.
if tbl_deb-hkont cp zkrn_n-debet and
TBL_KRE-HKONT CP ZKRN_N-KREDIT.
CHECK = 'N'. EXIT.
ENDIF.
ENDLOOP.
IF NOT CHECK IS INITIAL. EXIT. ENDIF.
LOOP AT ZKRN_N.
if tbl_deb-hkont cp zkrn_n-debet and
TBL_KRE-HKONT CP ZKRN_N-KREDIT.
CHECK = 'N'. EXIT.
ENDIF.
ENDLOOP.
IF NOT CHECK IS INITIAL. CLEAR CHECK. EXIT. ENDIF.
IF CHECK IS INITIAL.
ELSE.
EXIT.
ENDIF.
ENDFORM. " CHECK_KRP
_________________ Молитва - это запрос разработчику на изменение кода программы.
*&---------------------------------------------------------------------*
*& Form simple_select
*&---------------------------------------------------------------------*
* First we get documents using a select statement that is
* fully qualified on the primary key. Because buffering may be an issue,
* the first select will be disregarded in this test. However, in real
* life, this would be the important time.
*----------------------------------------------------------------------*
FORM simple_select.
* Do an initial select of the documents we intend to get. Due to
* buffering, the first select may take much longer then the next one.
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
WHERE bukrs IN s_bukrs
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
IF sy-subrc <> 0.
MESSAGE ID '00' TYPE 'E' NUMBER '001' WITH
'No Data meets selection criteria'.
ENDIF.
* Next we get the same document using the same fully qualified select
* statement. We will use this in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
WHERE bukrs IN s_bukrs
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for first SELECT (fully qualified)',
055 ':', dif, 'microseconds'.
ENDFORM. " simple_select
*&---------------------------------------------------------------------*
*& Form nested_select
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM nested_select.
* Use the same fully qualified SELECT, but this time nested. As usual,
* Ignore the first SELECT and use the subsequent ones for comparison.
REFRESH: bkpf_int.
SELECT bukrs FROM t001
INTO t001_wa
WHERE bukrs IN s_bukrs.
SELECT bukrs belnr gjahr
FROM bkpf
INTO bkpf_wa
WHERE bukrs EQ t001_wa-bukrs
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
APPEND bkpf_wa TO bkpf_int.
ENDSELECT.
ENDSELECT.
* Next we get the same document using the same fully qualified select
* statement. We will use this in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
REFRESH: bkpf_int.
SELECT bukrs FROM t001
INTO t001_wa
WHERE bukrs IN s_bukrs.
SELECT bukrs belnr gjahr
FROM bkpf
INTO bkpf_wa
WHERE bukrs EQ t001_wa-bukrs
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
APPEND bkpf_wa TO bkpf_int.
ENDSELECT.
ENDSELECT.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for second SELECT (nested)',
055 ':', dif, 'microseconds'.
ENDFORM. " nested_select
*&---------------------------------------------------------------------*
*& Form for_all_entries
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM for_all_entries .
* Use the same fully qualified SELECT, but this time with
* FOR ALL ENTRIES.
* Ignore the first set of SELECTs
SELECT bukrs
FROM t001
INTO TABLE t001_int
WHERE bukrs IN s_bukrs.
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
FOR ALL ENTRIES IN t001_int
WHERE bukrs EQ t001_int-bukrs
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
* Use these SELECTs in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
SELECT bukrs
FROM t001
INTO TABLE t001_int
WHERE bukrs IN s_bukrs.
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
FOR ALL ENTRIES IN t001_int
WHERE bukrs EQ t001_int-bukrs
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for third SELECT (using FOR ALL ENTRIES)',
055 ':', dif, 'microseconds'.
ENDFORM. " for_all_entries
*&---------------------------------------------------------------------*
*& Form inner_join
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM inner_join .
* Use the same fully qualified SELECT, but this time with an INNER JOIN.
SELECT t001~bukrs bkpf~belnr bkpf~gjahr
FROM bkpf
INNER JOIN t001 ON
t001~bukrs EQ bkpf~bukrs
INTO TABLE bkpf_int
WHERE t001~bukrs IN s_bukrs
AND bkpf~belnr IN s_belnr
AND bkpf~gjahr EQ p_gjahr.
* Use this select in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
SELECT t001~bukrs bkpf~belnr bkpf~gjahr
FROM bkpf
INNER JOIN t001 ON
t001~bukrs EQ bkpf~bukrs
INTO TABLE bkpf_int
WHERE t001~bukrs IN s_bukrs
AND bkpf~belnr IN s_belnr
AND bkpf~gjahr EQ p_gjahr.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for fourth SELECT (using an INNER JOIN)',
055 ':', dif, 'microseconds'.
ENDFORM. " inner_join
*&---------------------------------------------------------------------*
*& Form outer_join
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM outer_join .
* Use the same fully qualified SELECT, but this time with an OUTER JOIN.
SELECT t001~bukrs bkpf~belnr bkpf~gjahr
FROM bkpf
LEFT OUTER JOIN t001 ON
t001~bukrs EQ bkpf~bukrs
INTO TABLE bkpf_int
WHERE bkpf~bukrs IN s_bukrs
AND bkpf~belnr IN s_belnr
AND bkpf~gjahr EQ p_gjahr.
* Use this select in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
SELECT t001~bukrs bkpf~belnr bkpf~gjahr
FROM bkpf
LEFT OUTER JOIN t001 ON
t001~bukrs EQ bkpf~bukrs
INTO TABLE bkpf_int
WHERE bkpf~bukrs IN s_bukrs
AND bkpf~belnr IN s_belnr
AND bkpf~gjahr EQ p_gjahr.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for fifth SELECT (using an OUTER JOIN)',
055 ':', dif, 'microseconds'.
ENDFORM. " outer_join
*&---------------------------------------------------------------------*
*& Form sub_query
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM sub_query .
* And a sub-query
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
WHERE bukrs IN
( SELECT bukrs
FROM t001
WHERE bukrs IN s_bukrs )
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
* Use this select in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
WHERE bukrs IN
( SELECT bukrs
FROM t001
WHERE bukrs IN s_bukrs )
AND belnr IN s_belnr
AND gjahr EQ p_gjahr.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for sixth SELECT (using a sub-query)',
055 ':', dif, 'microseconds'.
ENDFORM. " sub_query
*&---------------------------------------------------------------------*
*& Form unqualified_select
*&---------------------------------------------------------------------*
* Compare the above results with a SELECT that is only partially
* qualified.
*----------------------------------------------------------------------*
FORM unqualified_select.
* Ignore the first SELECT
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
WHERE belnr IN s_belnr
AND gjahr EQ p_gjahr.
* Use this select in comparisons.
GET RUN TIME FIELD start.
DO p_loop2 TIMES.
SELECT bukrs belnr gjahr
FROM bkpf
INTO TABLE bkpf_int
WHERE belnr IN s_belnr
AND gjahr EQ p_gjahr.
ENDDO.
GET RUN TIME FIELD end.
dif = end - start.
WRITE: /001 'Time for seventh SELECT (partially qualified)',
055 ':', dif, 'microseconds'.
ENDFORM. " unqualified_select
Продолжая тему русского аддона - вчера ковырялся со стандартным PDF формуляром счета-фактуры, был несколько озадачен - формуляр выводился на печать нормально, но в тр. SFP самого оформления не было - девственно чистая страница. Оказалось нужно было зайти в систему на английском (!) чтобы увидеть формуляр из российского аддона... у меня на тот момент слов нормальных не оставалось, все в голове непотребщина какая то крутилась
Age: 41 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Thu Mar 10, 2011 1:03 pm Post subject:
Armann wrote:
Продолжая тему русского аддона - вчера ковырялся со стандартным PDF формуляром счета-фактуры, был несколько озадачен - формуляр выводился на печать нормально, но в тр. SFP самого оформления не было - девственно чистая страница. Оказалось нужно было зайти в систему на английском (!) чтобы увидеть формуляр из российского аддона... у меня на тот момент слов нормальных не оставалось, все в голове непотребщина какая то крутилась
Ну таких формуляров гораздо больше чем "правильных". Первый раз заходим на английском, нажимаем перевод. Копируем все содержимое из англ. версии в русскую. сохраняем, активируем и можно работать под родным языком. Это такой привычный косячек, что считаю его фичей. _________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
В J_3R_AO1_CONTEXT, помимо уже сказанного есть ещё фичи: американский формат Letter, а часть элементов формы является нерабочей. Как я понимаю, PDF из русского аддона у нас вообще классика жанра... _________________ ABAP/4 You
Age: 41 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Tue Feb 14, 2012 3:26 pm Post subject:
Еще один пример классного стандартного кода встретился...
ФМ TRIP_CREATE_INTERACTIVE_PR05 - создание командировок.
Code:
CALL TRANSACTION 'PR05'
USING BDCDATA
* MODE D_MODE "WKUK033260
* UPDATE D_UPDATE. "WKUK033260
OPTIONS FROM OPTIONS. "WKUK033260
IF SY-MSGTY IS INITIAL.
* execution was canceled by the user
PERFORM SET_RETURN USING 'S' '00' 359
SPACE SPACE SPACE SPACE
RETURN.
ELSE.
IF ( SY-MSGTY EQ 'S' )
AND ( SY-MSGID EQ '56' )
AND ( SY-MSGNO EQ 185 ).
* trip sucessful created, tripnumber is in sy-msgv1
TRIPNUMBER = SY-MSGV1.
ELSE.
CLEAR TRIPNUMBER.
ENDIF.
Как видите номер созданной командировки берется из сообщения. Верх надежности. Учитывая, что сам стандарт выдает это сообщение совсем не в конце процесса сохранения, а в середине, а потом начинает менять еще кучу данных, где стоит куча проверок и соответственно сообщений. . Пока поищу ноты, не найду напишу в САП. Молодцы блин... Ну а RETURN конечно пустой.
Есть еще BAPI_TRIP_CREATE_FROM_DATA, но получение номера командировки точно также. Один и тот же криворукий писал. _________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Age: 41 Joined: 01 Feb 2008 Posts: 387 Location: Воронеж
Posted: Wed Nov 28, 2012 5:01 pm Post subject:
Продолжаем парад...
Может конечно кто знает другой подход.
Задача взять логи после SM35. Фиг его знает как его брать, поэтому полез смотреть как это делает стандарт. За это отвечает отчет RSBDC_PROTOCOL. Логи тут читаются нормально из БД. Но хранятся они не в очевидном виде к сожалению. Разбор кода происходит просто в одной из подпрограмм этого отчета. Эта подпрограмма вызывает другие и т.д. Везде работа идет с глобальными переменными. Сам отчет это портянка без разделения на инклуды.
Пришлось в цикле разбора этого лога делать такую конструкцию. Вроде работает.
Code:
AT FIRST.
*Inizialisation rsbdc_protocol
PERFORM check_temse_date
IN PROGRAM rsbdc_protocol IF FOUND
USING ls_logtable-enterdate.
ENDAT.
*transfer parameter in rsbdc_protocol
*author of rsbdc_protocol - moron
ASSIGN ('(RSBDC_PROTOCOL)BDCLM') TO <fs_bdclm>.
<fs_bdclm> = ls_bdclm.
PERFORM get_text IN PROGRAM rsbdc_protocol IF FOUND.
*transfer parameter-text from rsbdc_protocol
ASSIGN '(RSBDC_PROTOCOL)MTEXT' TO <fs_mtext>.
ls_bdclm-longtext = <fs_mtext>.
_________________ Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
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.