SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Найдите 2 отличия



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Tue Mar 08, 2011 7:19 pm    Post subject: Найдите 2 отличия Reply with quote

Вот код из стандартного ФМ-а 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) С.Лем
Back to top
View user's profile Send private message Blog
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Tue Mar 08, 2011 8:22 pm    Post subject: Reply with quote

двойная надежность Wink
Back to top
View user's profile Send private message Blog
vga
Мастер
Мастер


Age: 180
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Wed Mar 09, 2011 12:32 pm    Post subject: Reply with quote

А в целом - эта подпрограмма достойный образец говно-кода. Smile

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

_________________
Молитва - это запрос разработчику на изменение кода программы.
Back to top
View user's profile Send private message Blog Visit poster's website
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Wed Mar 09, 2011 12:56 pm    Post subject: Reply with quote

Мда, и этот код написали для российского адд-она.. Mad
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 47
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Wed Mar 09, 2011 10:23 pm    Post subject: Reply with quote

Главное, что вы не можете себе такого позволить.
А вот ещё образец (того самого) ацкого кода:
Code:
REPORT ztest_0x01 LINE-SIZE 80 MESSAGE-ID 00.

DATA: t001      TYPE t001,
      bkpf      TYPE bkpf.

SELECT-OPTIONS: s_bukrs FOR  bkpf-bukrs MEMORY ID buk OBLIGATORY.

SELECT-OPTIONS: s_belnr FOR  bkpf-belnr MEMORY ID bln OBLIGATORY.
PARAMETERS:     p_gjahr LIKE bkpf-gjahr MEMORY ID gjr OBLIGATORY.

SELECTION-SCREEN ULINE.

PARAMETERS:     p_loop1 TYPE i                             OBLIGATORY
                        DEFAULT 5,
                p_loop2 TYPE i                             OBLIGATORY
                        DEFAULT 10.

TYPES: BEGIN OF t001_type,
         bukrs  TYPE t001-bukrs,
       END   OF t001_type,

       BEGIN OF bkpf_type,
         bukrs  TYPE bkpf-bukrs,
         belnr  TYPE bkpf-belnr,
         gjahr  TYPE bkpf-gjahr,
       END   OF bkpf_type.

DATA: t001_int  TYPE TABLE OF t001_type,
      t001_wa   TYPE          t001_type,
      bkpf_int  TYPE TABLE OF bkpf_type,
      bkpf_wa   TYPE          bkpf_type.

DATA: start     TYPE i,
      end       TYPE i,
      dif       TYPE i.

START-OF-SELECTION.

  DO p_loop1 TIMES.
    PERFORM simple_select.
    PERFORM nested_select.
    PERFORM for_all_entries.
    PERFORM inner_join.
    PERFORM outer_join.
    PERFORM sub_query.
    PERFORM unqualified_select.
    SKIP 1.
  ENDDO.

*&---------------------------------------------------------------------*
*&      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

_________________
ABAP/4 You
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Thu Mar 10, 2011 7:54 am    Post subject: Reply with quote

Продолжая тему русского аддона - вчера ковырялся со стандартным PDF формуляром счета-фактуры, был несколько озадачен - формуляр выводился на печать нормально, но в тр. SFP самого оформления не было - девственно чистая страница. Оказалось нужно было зайти в систему на английском (!) чтобы увидеть формуляр из российского аддона... у меня на тот момент слов нормальных не оставалось, все в голове непотребщина какая то крутилась
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Thu Mar 10, 2011 1:03 pm    Post subject: Reply with quote

Armann wrote:
Продолжая тему русского аддона - вчера ковырялся со стандартным PDF формуляром счета-фактуры, был несколько озадачен - формуляр выводился на печать нормально, но в тр. SFP самого оформления не было - девственно чистая страница. Оказалось нужно было зайти в систему на английском (!) чтобы увидеть формуляр из российского аддона... у меня на тот момент слов нормальных не оставалось, все в голове непотребщина какая то крутилась


Ну таких формуляров гораздо больше чем "правильных". Первый раз заходим на английском, нажимаем перевод. Копируем все содержимое из англ. версии в русскую. сохраняем, активируем и можно работать под родным языком. Это такой привычный косячек, что считаю его фичей. Smile

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Dmitriy
Аналитик
Аналитик


Age: 47
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Thu Mar 10, 2011 1:24 pm    Post subject: Reply with quote

Code:
<medium long="11in" short="8.5in" stock="letter"/>

В J_3R_AO1_CONTEXT, помимо уже сказанного есть ещё фичи: американский формат Letter, а часть элементов формы является нерабочей. Как я понимаю, PDF из русского аддона у нас вообще классика жанра... Wink

_________________
ABAP/4 You
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 47
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Tue Mar 15, 2011 6:30 pm    Post subject: Забавный ФМ Reply with quote

FM 'STFC_XSTRING'. Smile
Code:
FUNCTION STFC_XSTRING.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(QUESTION) TYPE  XSTRING
*"  EXPORTING
*"     VALUE(MYANSWER) TYPE  XSTRING
*"----------------------------------------------------------------------

myanswer = 'DEAD MEET'.



ENDFUNCTION.

_________________
ABAP/4 You
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Wed Mar 16, 2011 1:04 pm    Post subject: Reply with quote

Dmitriy, это потому что этот ФМ в группе функций STFE Examples of Simple RFC Functions Wink[/quote]
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 47
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Wed Mar 16, 2011 1:15 pm    Post subject: Reply with quote

Удав wrote:
Dmitriy, это потому что этот ФМ в группе функций STFE Examples of Simple RFC Functions Wink

Понятно, буду теперь для POPUP_TO_CONFIRM "Fire!" писать вместо "Да". Заняться им как будто нечем! Smile

_________________
ABAP/4 You
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Tue Feb 14, 2012 3:26 pm    Post subject: Reply with quote

Еще один пример классного стандартного кода встретился...
ФМ 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.

    PERFORM SET_RETURN USING SY-MSGTY SY-MSGID SY-MSGNO
                             SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
                             RETURN.
  ENDIF.


Как видите номер созданной командировки берется из сообщения. Верх надежности. Учитывая, что сам стандарт выдает это сообщение совсем не в конце процесса сохранения, а в середине, а потом начинает менять еще кучу данных, где стоит куча проверок и соответственно сообщений. Evil or Very Mad . Пока поищу ноты, не найду напишу в САП. Молодцы блин... Ну а RETURN конечно пустой.

Есть еще BAPI_TRIP_CREATE_FROM_DATA, но получение номера командировки точно также. Один и тот же криворукий писал.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Wed Nov 28, 2012 5:01 pm    Post subject: Reply with quote

Продолжаем парад...
Может конечно кто знает другой подход.

Задача взять логи после SM35. Фиг его знает как его брать, поэтому полез смотреть как это делает стандарт. За это отвечает отчет RSBDC_PROTOCOL. Логи тут читаются нормально из БД. Но хранятся они не в очевидном виде к сожалению. Разбор кода происходит просто в одной из подпрограмм этого отчета. Эта подпрограмма вызывает другие и т.д. Везде работа идет с глобальными переменными. Сам отчет это портянка без разделения на инклуды. Crying or Very sad

Пришлось в цикле разбора этого лога делать такую конструкцию. Вроде работает.

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) С.Лем
Back to top
View user's profile Send private message Blog
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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.