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

Техническая часть ФС


Goto page 1, 2  Next
 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Talks | Беседка
View previous topic :: View next topic  
Author Message
XXX_:)
Аналитик
Аналитик


Age: 34
Joined: 01 Feb 2008
Posts: 386
Location: Воронеж

PostPosted: Mon Feb 04, 2013 10:08 pm    Post subject: Техническая часть ФС Reply with quote

Всем привет, интересно насколько часто вам приходится заполнять техническую часть документации. И присутствуют ли в ней разделы с созданными объектами, запросами и тому подобной ..эээээ... штукой Question

Из тех кто работает с этой документацией, хоть раз пригодился список объектов или список запросов?
не теоретически, а практически имею ввиду.

ЗЫ: почему спросил, меня недавно это запарило, я написал прогу, которая выгружает эти вещи более менее автоматически. Если вещь нужная, может я ее чуть подправлю, и выложу? По большому счету хрень, но экономит много времени, особенно когда нужно обновить десятки спек быстро.

19.03.2013 выкладываю код в 1 пост
Есть 2 таблицы
2 таблицы ZHR_REQUEST_TAB - для уменьшения объектов выборки
ZHR_PROG_MASK - более специфична

Так же прога, таблицы, и пример их заполнения прикрепляю к сообщению
Code:
*&---------------------------------------------------------------------*
*& Report  Z_REQUEST_N
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  Z_REQUEST_N.

TABLES: e071, e070a, e070,tadir.

PARAMETERS: p_text TYPE as4text DEFAULT '*'.
*            ,p_stat  TYPE trstatus
SELECT-OPTIONS so_strk  for e070-strkorr.
PARAMETERS: p_num   TYPE text4
            .
SELECT-OPTIONS:  so_pgmid FOR e071-pgmid.
*--------------------------------------------------------------------*

DATA: BEGIN OF gt_data OCCURS 0
        ,trkorr     TYPE trkorr
        ,trfunction TYPE trfunction
        ,trstatus   TYPE trstatus
        ,as4date    TYPE as4date
        ,as4text    TYPE as4text
        ,pgmid      TYPE pgmid
        ,object     TYPE trobjtype
        ,obj_name   TYPE trobj_name
        ,objfunc    TYPE objfunc
        ,devclass   TYPE devclass
*        ,reference  TYPE trvalue
      ,END OF gt_data
      ,BEGIN OF gt_table1 OCCURS 0
        ,type TYPE OBJ_TYP
        ,name TYPE trobj_name
        ,action TYPE devclass
        ,prim  TYPE as4text
      ,END OF gt_table1

      ,BEGIN OF gt_table2 OCCURS 0
        ,n TYPE INT4"(5)
        ,date TYPE as4date "(10)
        ,request  TYPE trkorr"(50)
        ,request_name TYPE as4text"(200)
      ,END OF gt_table2

      ,gt_object_table TYPE TABLE OF ko100
      ,gt_cust         TYPE TABLE OF zhr_request_tab
      ,gt_mask         TYPE TABLE OF zhr_prog_mask
      ,gv_num_text  TYPE as4text
.
*--------------------------------------------------------------------*
INITIALIZATION.

  so_pgmid = 'EEQ'.
  so_pgmid-low = '*'.
  APPEND so_pgmid.
  so_pgmid-low = 'CORR'.
  APPEND so_pgmid.
  so_pgmid-low = 'LANG'.
  APPEND so_pgmid.


START-OF-SELECTION.

*Выборка из БД
  PERFORM get_data.

END-OF-SELECTION.

  SORT gt_data BY trkorr.

*Подготовка таблицы с запросами для выгрузки
  PERFORM create_table_1.

*Подготовка таблицы с запросами для выгрузки
  PERFORM create_table_2.

*Выгрузка в ворд
  "PERFORM show_word.
*Выгрузка в ALV
  PERFORM show_alv.


*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM get_data .

*--select values for pgmid/object/text from database--------------------
  CALL FUNCTION 'TR_OBJECT_TABLE'
    TABLES
      wt_object_text = gt_object_table.

  TRANSLATE p_text USING '*%'.

  SELECT * FROM zhr_request_tab INTO TABLE gt_cust.

  SELECT * FROM zhr_prog_mask INTO TABLE gt_mask.

    SELECT "DISTINCT
           e070~trkorr e070~trfunction e070~trstatus
           e070~as4date e07t~as4text e071~object
           e071~obj_name e071~objfunc e071~pgmid
           tadir~devclass
          INTO CORRESPONDING FIELDS OF TABLE gt_data
    FROM ( e070
           INNER JOIN e07t
           ON  e07t~trkorr = e070~trkorr
           INNER JOIN e071
           ON  e071~trkorr = e070~trkorr
           INNER JOIN tadir
           ON  tadir~obj_name = e071~obj_name )
      BYPASSING BUFFER "(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
         WHERE e07t~as4text LIKE p_text
           AND e070~strkorr in so_strk
           AND e071~pgmid   IN so_pgmid
      GROUP BY  e070~trkorr e070~trfunction e070~trstatus
           e070~as4date e07t~as4text e071~object
           e071~obj_name e071~objfunc e071~pgmid
           tadir~devclass
      .

  gv_num_text = p_num.

ENDFORM. " GET_DATA

*&---------------------------------------------------------------------*
*&      Form  CREATE_TABLE_1
*&---------------------------------------------------------------------*
FORM create_table_1 .

  CONSTANTS:  lc_prog TYPE trobjtype VALUE 'PROG'
             ,lc_reps TYPE trobjtype VALUE 'REPS'
             .

  DATA:  lr_obj_name TYPE RANGE OF trobj_name
        ,lv_off      TYPE i
        ,lv_num_text  TYPE as4text
        ,lv_lenght   TYPE i
        ,ls_cust     TYPE zhr_request_tab
        ,lv_objid    TYPE hr_sobjid
        ,lv_otype    TYPE hr_sotype
        ,lv_clsname  TYPE seoclsname
        ,lv_cmpname  TYPE seocmpname
        ,lv_sotr_key TYPE sotr_key
        ,lv_shorttextid TYPE enhdocuobject
        ,lv_entry    TYPE sotr_text
        ,lv_tabclass TYPE tabclass
        ,lv_prog     TYPE progname
        ,lv_dynr     TYPE dynpronr
        .

  RANGES: lr_object FOR ls_cust-object.

  FIELD-SYMBOLS:  <fs_table1>   LIKE LINE OF gt_table1
                 ,<fs_data>     LIKE LINE OF gt_data
                 ,<fs_object_table> LIKE LINE OF gt_object_table
                 ,<fs_obj_name> LIKE LINE OF lr_obj_name
                 ,<fs_cust>     LIKE LINE OF gt_cust
                 ,<fs_mask>     LIKE LINE OF gt_mask
                 .

  LOOP AT gt_cust INTO ls_cust WHERE sign = 'E'.

    lr_object = 'EEQ'.
    lr_object-low = ls_cust-object.
    APPEND lr_object.

  ENDLOOP.

  REPLACE ALL OCCURRENCES OF lc_reps IN TABLE gt_data WITH lc_prog.


"(Основной цикл по таблице,хранящей всю инф-ю об объектах)

  LOOP AT gt_data ASSIGNING <fs_data> WHERE object IN lr_object.

      APPEND INITIAL LINE TO gt_table1 ASSIGNING <fs_table1>.
      <fs_table1>-name = <fs_data>-obj_name.

      READ TABLE gt_object_table ASSIGNING <fs_object_table>
        WITH KEY object = <fs_data>-object.
      IF sy-subrc IS INITIAL.
        <fs_table1>-type = <fs_object_table>-text.
      ENDIF.
      IF <fs_data>-object = 'W3MI'.
        <fs_table1>-type = 'Формуляр'.
      ENDIF.

      IF <fs_data>-objfunc = 'D'.
        APPEND INITIAL LINE TO lr_obj_name ASSIGNING <fs_obj_name>.
        <fs_obj_name> = 'IEQ'.
        <fs_obj_name>-low = <fs_data>-obj_name.
      ENDIF.


  "(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
  "(Имя пакета,которому принадлежит объект)

      "<fs_table1>-action = 'Реализация'.
      <fs_table1>-action = <fs_data>-devclass.



      LOOP AT gt_cust ASSIGNING <fs_cust> WHERE sign <> 'E'
                                            AND object = <fs_data>-object.
        <fs_table1>-prim   = <fs_cust>-prim.
      ENDLOOP.

      FIND '&N' IN <fs_table1>-prim .

      IF sy-subrc IS INITIAL.

        IF gv_num_text IS INITIAL.

          lv_lenght = strlen( <fs_data>-obj_name ).

          CLEAR: lv_off.
          DO lv_lenght TIMES.

*  Ищем номер разработки в имени объекта

            IF <fs_data>-obj_name+lv_off(1) CA '0987654321'.
              lv_num_text = <fs_data>-obj_name+lv_off(4).
              EXIT.
            ENDIF.
            ADD 1 TO lv_off.
          ENDDO.

        ELSE.
          lv_num_text = gv_num_text.
        ENDIF.

        REPLACE '&N' INTO <fs_table1>-prim WITH lv_num_text.

      ENDIF.

      IF <fs_data>-object = lc_prog.

        LOOP AT gt_mask ASSIGNING <fs_mask>.

          IF <fs_data>-obj_name CS <fs_mask>-mask.
            <fs_table1>-prim   = <fs_mask>-prim.
            <fs_table1>-type   = 'Include'.
            EXIT.
          ENDIF.

*          IF <fs_data>-obj_name CP <fs_mask>-mask.
*            <fs_table1>-prim   = <fs_mask>-prim.
*            <fs_table1>-type   = 'Include'.
*            REPLACE '++++' INTO <fs_table1>-prim WITH <fs_data>-obj_name+2(4).
*            EXIT.
*          ENDIF.

        ENDLOOP.

      ENDIF.

"(--------------CASE-----------------------------------------------------)

      CASE <fs_data>-object.

"(--------Проверки по типу объекта---------------------------)
"(--------------WHEN-------------------------)

        WHEN 'PDTS' OR 'PDWS' OR 'PDAC'.
          IF <fs_data>-object = 'PDTS'.
            lv_otype = 'TS'.
          ELSEIF <fs_data>-object = 'PDWS'.
            lv_otype = 'WS'.
          ELSEIF <fs_data>-object = 'PDAC'.
            lv_otype = 'AC'.
          ENDIF.

          lv_objid = <fs_data>-obj_name.

          SELECT SINGLE stext FROM hrs1000 INTO <fs_table1>-prim "(Тащим имя объекта из таблицы с инфотипами)
                WHERE objid = lv_objid
                  AND otype = lv_otype
                  AND langu = sy-langu.


          "IF <fs_table1>-prim IS INITIAL.
            SELECT SINGLE witext FROM hrs1206 INTO <fs_table1>-prim "(Тащим пометку/указание из таблицы с инфотипами)
             WHERE objid = lv_objid                                 
               AND otype = lv_otype
               AND langu = sy-langu.
          "ENDIF.
          IF <fs_table1>-prim IS INITIAL.
            SELECT SINGLE stext FROM hrs1000 INTO <fs_table1>-prim
                  WHERE objid = lv_objid
                    AND otype = lv_otype.
          ENDIF.
          IF <fs_table1>-prim IS INITIAL.
            SELECT SINGLE witext FROM hrs1206 INTO <fs_table1>-prim
             WHERE objid = lv_objid
               AND otype = lv_otype.
          ENDIF.

"(--------------WHEN-------------------------)

        WHEN 'METH'.
          SPLIT <fs_data>-obj_name AT space INTO lv_clsname lv_cmpname.
          CONDENSE lv_cmpname.

          SELECT SINGLE descript FROM seocompotx INTO <fs_table1>-prim
            WHERE clsname = lv_clsname
              AND cmpname = lv_cmpname
              AND langu = sy-langu.

          IF sy-subrc IS INITIAL.
            SELECT SINGLE descript FROM seocompotx INTO <fs_table1>-prim
              WHERE clsname = lv_clsname
                AND cmpname = lv_cmpname.
          ENDIF.

"(--------------WHEN-------------------------)

        WHEN 'ENHC' OR 'ENHO' OR 'ENHS' OR 'ENSC'.
          IF <fs_data>-object = 'ENHC'.
            SELECT SINGLE shorttextid FROM enhcompheader INTO lv_shorttextid
            WHERE enhcomposite = <fs_data>-obj_name
              AND version = 'A'.
          ELSEIF <fs_data>-object = 'ENHO'.
            SELECT SINGLE shorttext_id FROM enhheader INTO lv_shorttextid
            WHERE enhname = <fs_data>-obj_name
              AND version = 'A'.
          ELSEIF <fs_data>-object = 'ENHS'.
            SELECT SINGLE shorttextid FROM enhspotheader INTO lv_shorttextid
              WHERE enhspot = <fs_data>-obj_name
                AND version = 'A'.
          ELSEIF <fs_data>-object = 'ENSC'.
            SELECT SINGLE shorttextid FROM enhspotcomphead INTO lv_shorttextid
              WHERE enhspotcomposite = <fs_data>-obj_name
                AND version = 'A'.
          ENDIF.

"(--------------WHEN-------------------------)

        WHEN 'DYNP'.
          lv_lenght = strlen( <fs_data>-obj_name ) - 4.
          lv_prog = <fs_data>-obj_name(lv_lenght).
          lv_dynr = <fs_data>-obj_name+lv_lenght(4).

          SELECT SINGLE dtxt FROM d020t INTO <fs_table1>-prim
                  WHERE prog = lv_prog
                    AND dynr = lv_dynr
                    AND lang = sy-langu.

          IF sy-subrc IS INITIAL.
            SELECT SINGLE dtxt FROM d020t INTO <fs_table1>-prim
                    WHERE prog = lv_prog
                      AND dynr = lv_dynr.
          ENDIF.

"(--------------WHEN-------------------------)

        WHEN 'CMOD'.
          PERFORM get_text USING 'MODTEXT' 'MODTEXT'
                         'NAME' <fs_data>-obj_name
                         'SPRSL'
                CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'TRAN'.
          PERFORM get_text USING 'TTEXT' 'TSTCT'
                         'TCODE' <fs_data>-obj_name
                         'SPRSL'
                CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'FUGR'.
          PERFORM get_text USING 'AREAT' 'TLIBT'
                                 'AREA' <fs_data>-obj_name
                                 'SPRAS'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'CLAS' OR 'INTF'.
          PERFORM get_text USING 'DESCRIPT' 'SEOCLASSTX'
                                 'CLSNAME' <fs_data>-obj_name
                                 'LANGU'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'VIEW' OR 'VIED' OR 'ENQU'.
          PERFORM get_text USING 'DDTEXT' 'DD25T'
                                 'VIEWNAME' <fs_data>-obj_name
                                 'DDLANGUAGE'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'VCLS'.
          PERFORM get_text USING 'TEXT' 'VCLDIRT'
                                 'VCLNAME' <fs_data>-obj_name
                                 'SPRAS'
                       CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'SHLP' OR 'SHLD'.
          PERFORM get_text USING 'DDTEXT' 'DD30T'
                                 'SHLPNAME' <fs_data>-obj_name
                                 'DDLANGUAGE'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'TABL'.
          PERFORM get_text USING 'DDTEXT' 'DD02T'
                                 'TABNAME' <fs_data>-obj_name
                                 'DDLANGUAGE'
                        CHANGING <fs_table1>-prim.

          SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass
                WHERE tabname = <fs_data>-obj_name.
          IF lv_tabclass = 'INTTAB'.
            <fs_table1>-type = 'Структура'.
          ENDIF.

"(--------------WHEN-------------------------)

        WHEN 'DTEL'.
          PERFORM get_text USING 'DDTEXT' 'DD04T'
                                 'ROLLNAME' <fs_data>-obj_name
                                 'DDLANGUAGE'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'DOMA'.
          PERFORM get_text USING 'DDTEXT' 'DD01T'
                                 'DOMNAME' <fs_data>-obj_name
                                 'DDLANGUAGE'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'TTYP'.
          PERFORM get_text USING 'DDTEXT' 'DD40T'
                                 'TYPENAME' <fs_data>-obj_name
                                 'DDLANGUAGE'
                        CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'PROG' OR 'REPS'.
          IF <fs_table1>-prim IS INITIAL.
            PERFORM get_text USING 'TEXT' 'TRDIRT'
                                   'NAME' <fs_data>-obj_name
                                   'SPRSL'
                        CHANGING <fs_table1>-prim.
          ENDIF.

"(--------------WHEN-------------------------)

        WHEN 'FUNC'.
          PERFORM get_text USING 'STEXT' 'TFTIT'
                                 'FUNCNAME' <fs_data>-obj_name
                                 'SPRAS'
                      CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'SXCI'.
          PERFORM get_text USING 'TEXT' 'SXC_ATTRT'
                                 'IMP_NAME' <fs_data>-obj_name
                                 'SPRSL'
                      CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'SFPF'.
          PERFORM get_text USING 'TEXT' 'FPCONTEXTT'
                                 'NAME' <fs_data>-obj_name
                                 'LANGUAGE'
                      CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'SFPI'.
          PERFORM get_text USING 'TEXT' 'FPINTERFACET'
                                 'NAME' <fs_data>-obj_name
                                 'LANGUAGE'
                      CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'WDYN' OR 'WDYC'.
          PERFORM get_text USING 'DESCRIPTION' 'WDY_COMPONENTT'
                                 'COMPONENT_NAME' <fs_data>-obj_name
                                 'LANGU'
                      CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'WDYA'.
          PERFORM get_text USING 'DESCRIPTION' 'WDY_APPLICATIONT'
                                 'APPLICATION_NAME' <fs_data>-obj_name
                                 'LANGU'
                      CHANGING <fs_table1>-prim.

"(--------------WHEN-------------------------)

        WHEN 'MSAG'.
          PERFORM get_text USING 'STEXT' 'T100A'
                            'ARBGB' <fs_data>-obj_name
                            'MASTERLANG'
                 CHANGING <fs_table1>-prim.
      ENDCASE.

  ENDLOOP.

  SORT gt_table1 BY type name.
  DELETE ADJACENT DUPLICATES FROM gt_table1.
  IF lr_obj_name[] IS NOT INITIAL.
    DELETE gt_table1 WHERE name IN lr_obj_name.
  ENDIF.

ENDFORM. " CREATE_TABLE_1

*&---------------------------------------------------------------------*
*&      Form  CREATE_TABLE_2
*&---------------------------------------------------------------------*
FORM create_table_2 .

  DATA:  lv_new_trkorr(1)
        .

  FIELD-SYMBOLS:  <fs_table2> LIKE LINE OF gt_table2
                 ,<fs_data>   LIKE LINE OF gt_data.

  LOOP AT gt_data ASSIGNING <fs_data>.

    CLEAR: lv_new_trkorr.

    AT NEW trkorr.
      lv_new_trkorr = 'X'.
    ENDAT.

    IF lv_new_trkorr IS NOT INITIAL.
      APPEND INITIAL LINE TO gt_table2 ASSIGNING <fs_table2>.
      WRITE <fs_data>-as4date TO <fs_table2>-date.
      <fs_table2>-request      = <fs_data>-trkorr.
      <fs_table2>-request_name = <fs_data>-as4text.
    ENDIF.

  ENDLOOP.

  LOOP AT gt_table2 ASSIGNING <fs_table2>.
    <fs_table2>-n = sy-tabix.
  ENDLOOP.

ENDFORM. " CREATE_TABLE_2
*&---------------------------------------------------------------------*
*&      Form  SHOW_WORD
*&---------------------------------------------------------------------*
FORM show_word .

*  DATA:
*    lv_xml_content    TYPE xstring
*,   lv_bintab         TYPE sdokcntbins
*,   lv_size           TYPE i
*    .
*
**     трансформация
*  CALL TRANSFORMATION Z_REQUEST
*  SOURCE
*    TABLE = gt_table1
*  RESULT XML lv_xml_content.
*
*  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
*    EXPORTING
*      buffer        = lv_xml_content
*    IMPORTING
*      output_length = lv_size
*    TABLES
*      binary_tab    = lv_bintab.
*
*  CALL FUNCTION 'GUI_DOWNLOAD'
*    EXPORTING
*      bin_filesize = lv_size
*      filename     = 'C:\Proj_Request\REQ.doc'
*      filetype     = 'BIN'
*    IMPORTING
*      filelength   = lv_size
*    TABLES
*      data_tab     = lv_bintab
*    EXCEPTIONS
*      OTHERS       = 4.
*
*  CALL METHOD cl_gui_frontend_services=>execute
*    EXPORTING
*      document               = 'C:\Proj_Request\REQ.doc'
*      maximized              = 'X'
*    EXCEPTIONS
*      cntl_error             = 1
*      error_no_gui           = 2
*      bad_parameter          = 3
*      file_not_found         = 4
*      path_not_found         = 5
*      file_extension_unknown = 6
*      error_execute_failed   = 7
*      synchronous_failed     = 8
*      not_supported_by_gui   = 9
*      OTHERS                 = 10.



ENDFORM. " SHOW_WORD

*&---------------------------------------------------------------------*
*&      Form  SHOW_ALV
*&---------------------------------------------------------------------*
FORM show_alv .

  DATA:  lr_alv_table TYPE REF TO cl_salv_table
        ,lr_functions TYPE REF TO cl_salv_functions.

  cl_salv_table=>factory( IMPORTING r_salv_table = lr_alv_table
                           CHANGING t_table = gt_table1[] ).
                           "CHANGING t_table = gt_data[] ).
                           "CHANGING t_table = gt_table2[] ).

  lr_functions = lr_alv_table->get_functions( ).
  lr_functions->set_all( abap_true ).

  lr_alv_table->display( ).

ENDFORM. " SHOW_ALV


*&---------------------------------------------------------------------*
*&      Form  GET_TEXT
*&---------------------------------------------------------------------*
FORM get_text USING value(pv_text)
                    value(pv_tab)
                    value(pv_cond)
                    pv_obj_name
                    value(pv_langu)
               CHANGING cv_prim.

  DATA: cond_syntax TYPE string.

  CONCATENATE pv_cond '=' 'PV_OBJ_NAME'
              'AND' pv_langu '=' 'SY-LANGU'
              INTO cond_syntax SEPARATED BY space.

  SELECT SINGLE (pv_text) FROM (pv_tab) INTO cv_prim
      WHERE (cond_syntax).

  IF cv_prim IS INITIAL.
    CONCATENATE pv_cond '=' 'PV_OBJ_NAME'
                INTO cond_syntax SEPARATED BY space.
    SELECT SINGLE (pv_text) FROM (pv_tab) INTO cv_prim
        WHERE (cond_syntax).
  ENDIF.

ENDFORM. " GET_TEXT




z_request_n.zip
 Description:

Download
 Filename:  z_request_n.zip
 Filesize:  28.11 KB
 Downloaded:  507 Time(s)


_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем


Last edited by XXX_:) on Tue Mar 19, 2013 11:11 am; edited 4 times in total
Back to top
View user's profile Send private message Blog
bimit
Специалист
Специалист



Joined: 11 Jul 2011
Posts: 56

PostPosted: Tue Feb 05, 2013 7:03 am    Post subject: Re: Техническая часть ФС Reply with quote

XXX_:) wrote:
Всем привет, интересно насколько часто вам приходится заполнять техническую часть документации. И присутствуют ли в ней разделы с созданными объектами, запросами и тому подобной ..эээээ... штукой Question

Из тех кто работает с этой документацией, хоть раз пригодился список объектов или список запросов?
не теоретически, а практически имею ввиду.

ЗЫ: почему спросил, меня недавно это запарило, я написал прогу, которая выгружает эти вещи более менее автоматически. Если вещь нужная, может я ее чуть подправлю, и выложу? По большому счету хрень, но экономит много времени, особенно когда нужно обновить десятки спек быстро.


Конечно выкладывай, уже подобное юзаем, но для истории лишним не будет Smile
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 49
Joined: 04 Oct 2007
Posts: 1218
Location: Питер

PostPosted: Tue Feb 05, 2013 1:15 pm    Post subject: Reply with quote

Заполняем конечно, на мой вгляд, много не нужного.
Но, список юзер-ехитов может пригодиться, далеко не всегда очевидно, что вызывается. История транспортов, тоже штука полезная.

Если отдельно не используется система change management,
полезно в спеке вести историю ошибок и примеры их тестирования. Часто будущие исправления приводят к возврату ошибок.

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


Age: 40
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Feb 06, 2013 9:27 am    Post subject: Reply with quote

Нужно детально описывать. Все созданные объекты и, обязательно, логику.
У меня был негативный опыт. Принимали от "внедренцев" документацию по одному отчету. В ней указано, что создана программа и транзакция, для вывода используется ALV Grid, алгоритм указан в функциональной спецификации. Формально все ок. На деле - указанная программа содержит 30 строк, в которых оформлен вызов стат.метода какого-то самописного класса. А внутри этого метода, еще 10 различных вызовов других методов других классов. И как это дерьмище потом сопровождать - одному богу известно.

_________________
FunCoding.ru
KicksCollector.ru
Back to top
View user's profile Send private message Blog
John Doe
Модератор
Модератор


Age: 40
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Feb 06, 2013 9:32 am    Post subject: Reply with quote

Добавлю еще пару строк банальных.
Хорошо сформулированная функциональная спецификация (ТЗ) - это 80% успеха при разработке. В свою очередь хорошо оформленная техническая спецификация - те же проценты успеха, но уже при сопровождении + 10 в карму оформителю + звание "Спаситель пустоши".

_________________
FunCoding.ru
KicksCollector.ru
Back to top
View user's profile Send private message Blog
vga
Мастер
Мастер


Age: 49
Joined: 04 Oct 2007
Posts: 1218
Location: Питер

PostPosted: Wed Feb 06, 2013 10:40 am    Post subject: Reply with quote

John Doe wrote:
На деле - указанная программа содержит 30 строк, в которых оформлен вызов стат.метода какого-то самописного класса. А внутри этого метода, еще 10 различных вызовов других методов других классов. И как это дерьмище потом сопровождать - одному богу известно.


Чувствуется, любишь ты классы в абап Laughing
Я лично "тащусь" от их сопровождения и удобств навигации.

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


Age: 34
Joined: 01 Feb 2008
Posts: 386
Location: Воронеж

PostPosted: Wed Feb 06, 2013 2:47 pm    Post subject: Reply with quote

прогу мою стажер проверит на предмет явных косяков, потом выложу.
А насчет вызова класса и т.д. то видимо этот класс был написал для другой разработки, а в этой лишь использовался, смысла по нескольку раз копипастить смысла не вижу (хотя сам так не далал вроде бы).

Если пакет и все объекты содержат номер разработки, все объекты лежат в своих пакетах. Если в описании запросов всегда есть номер запроса и либо порядковый номер либо дата, то поиск любой инфы не составляет труда. Что касается логики работы программы, то я вообще не люблю ничего описывать в тех.части. Немного пишу в комментариях что именно сейчас ищу или обрабатываю. Если нужно реализую какую то часть логики из спеки, то переношу ее копипастом из спеки в комментарии к данному участку кода.

Мне так кажется удобнее. А описывать что то отдельно от кода очень сложно, и читается потом неудобно. Что касается реализации юзер-екзитов, то внутрь него кладу инклуд в имени которого номер разработки, сам инклуд в пакет с номером разработки. В общем после этого его искать не составит большого труда. Близкая по духу технология передачи параметров в память в одном коде и чтение в другом. Делаем статический класс в название номер разработки. У него 2 метода set и get соответсвенно, в которых записываем значения в память и читаем из нее же, таким образом весь код легко отследить(Спасибо моему другу Юре за эту идею с классами).

Embarassed сам сейчас делал разработки 4 программы. Они почти полностью состоят из классов. Хотя писал так не по моему желанию, а т.к. там много алв и их надо обрабатвать, много схожего кода, а вызов подпрограмм из обработчиков алв не красиво, вот и пришел у "класс"ной программе Embarassed

ЗЫ: я видел несколько программ написанных на классах, которые по другому было нельзя описать, там и наследование и т.д. ))) очень сложно было по началу, но когда программа реально сложная, то нужно подбирать оптимальную реализацию и пользоваться классами, если это улучшит код и убережет его от ошибок.

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


Age: 40
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Feb 06, 2013 3:40 pm    Post subject: Reply with quote

Такой подход, может быть, не составит большого труда в поисках лично этому же разработчику через 3-4 года, к примеру. А вот другому очень даже составит, по моему мнению.
Плохая документация, по факту, ничем не лучше ее отсутствия вообще.

Документация не должна облегчать поиск изменений, это заблуждение. Наоборот, она должна отражать изменение в логике, вызванное изменением программы. Т.е. любое изменение должно быть отражено и в функциональной, и в технической документации.

А по поводу "крутости" реализации, я считаю, что это либо детство, либо глупость. Программисты меряются друг перед другом своими программами, как приматы длиной достоинства. По личному опыту скажу - всем остальным "непрограммистам" глубоко похрену на то, что у программы внутри. Все оценки делаются на основании функциональности и удобства работы. Часто программисты напрочь забывают, что результаты их работы предназначены для мейнстрим пользователей, а не для ценителей раритетов.

_________________
FunCoding.ru
KicksCollector.ru
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 34
Joined: 01 Feb 2008
Posts: 386
Location: Воронеж

PostPosted: Wed Feb 06, 2013 4:13 pm    Post subject: Reply with quote

John Doe wrote:

Документация не должна облегчать поиск изменений, это заблуждение. Наоборот, она должна отражать изменение в логике, вызванное изменением программы. Т.е. любое изменение должно быть отражено и в функциональной, и в технической документации.


Андрей, я не видел ни одной технической спецификации, которая бы нормально отражала то что твориться в коде. Если ты имеешь ввиду, что туда просто пишется, что алгоритм по проверке был по таблице такой то стал по такой то, то не уверен, что кому то будет интересно через месяц какая раньше тут была проверка, тем более что всегда можно через версии посмотреть что именно поменяли. А со временем за многочисленными исправлениями становиться уже не понятно что было в самом начале, да и так ли это важно спустя год-другой?

Если у тебя есть пример такой спецификации, вышли, я посмотрю, возможно мне просто не попадались такие экземпляры, и я наконец то буду писать более правильно.

John Doe wrote:

А по поводу "крутости" реализации...
Ну я вообще то не то имел ввиду. Я имел ввиду нормальный стиль программирования, чтобы не было копипаста, чтобы локальные данные не становились глобальными, чтобы когда нужно было поправить какую то проверку или выборку не нужно было делать это во многих местах. Код должен быть написан таким образом, чтобы новый разработчик мог достаточно быстро понять логику программы и найти нужное место для ее модификации. Мериться то зачем ))).
Программу, мы конечно пишем для пользователя, и ему конечно глубоко на то что внутри, но нужно ведь подумать и о тех кто потом будет этот код читать. Если код го"№;но(а его навалом), то никакое описание не поможет, его бывает зачастую лучше переписать, чем поддерживать. Если программу пишешь, как для себя любимого, то и другому в ней не сложно разобраться, если он конечно не стажер какой нибудь.
John Doe wrote:

Плохая документация, по факту, ничем не лучше ее отсутствия вообще.
+1

а по поводу того что требуют писать запросы и объекты, так я искренне считаю, что это мусор, т.к. он не отражает сути, но т.к. это требуется, то и была написана соответствующая программа.

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


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

PostPosted: Wed Feb 06, 2013 8:42 pm    Post subject: Reply with quote

XXX_:) wrote:
прогу мою стажер проверит на предмет явных косяков, потом выложу

Правильно, не барское это дело! У меня вообще недавно сама архитектор тестировала.Laughing

А разве абапу не глубоко без разницы объектная (ну экранчики только дорисовать) или функциональная направленность реализации проектного ABAP-концепта? Само по себе важно его наличие не только в виртуальном разрозненном виде в головах исполнителей, а еще и в материальном воплощении: файл, ватман там. А у нас что? Регламент... А по-хорошему надо отдельно по функциональным (если требуется), общим (WF, DMS, CA-CL и т.п.), замещениям и прочим, требующим концептуального описания. А уже потом регламенты, наименования. И, самое главное, выстроить все в иерархию с перекрестными ссылками. Зашел в ТС, перешел в ФС процесса - используемые расширения - список где еще используется какое-либо расширение и т.д. Покликали, вернулись, курим ТС дальше, в других окнах подсматриваем нужную инфу.

Надеюсь, что доживу до такого счастья: полномасштабной проект с реализацией ИНФОСИСТЕМЫ документации, как жизненно необходимой части внедряемой системы. А не "так, все срочно пишем ФС/ТС, завтра последний день проекта, банкет и улетаем".

А по поводу классов я солидарен с Андреем. Тоже не люблю классы, вот их перечень:
1) первый раз в первый класс (самый первый класс);
2) я у мамы дурачок, напишу-ка косячок (второй класс);
3) попробую-ка я ... (cl_salv_table, RTTS etc);
4) вся остальная хрень репозитария, внутри методов которой вызовы ФМ дат, вариантов, нет/брут (обертка стандарта), чаще всего под 1, максимум 2 небольших разработки очередного мудака, дорвавшегося до системы;
Здесь никакая документация не спасет...

_________________
ABAP/4 You


Last edited by Dmitriy on Thu Feb 07, 2013 1:33 am; edited 3 times in total
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 34
Joined: 01 Feb 2008
Posts: 386
Location: Воронеж

PostPosted: Wed Feb 06, 2013 10:02 pm    Post subject: Reply with quote

Дима, сколько горечи ))) и нелюбви к классам. )) не удержался, улыбнуло ).
Просто лишь хотел сказать что есть разработки которые без использования классов реализовать очень сложно, код превращается в какую то кашу. Если у вас не было таких разработок, то не смогу объяснить. Но если не писать, то хотя бы свободно читать надо всем нам уметь. Вообще остановиться в нашей профессии почти значит уступить свое место более молодым и амбициозным, а не хотелось бы.

ЗЫ: очень ушли от первоначальной темы и свалились в негативные какие то высказывания. Это я виноват в общем то. Embarassed

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


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

PostPosted: Wed Feb 06, 2013 11:39 pm    Post subject: Reply with quote

XXX_:) wrote:
Дима, сколько горечи ))) и нелюбви к классам. )) не удержался, улыбнуло ).
Просто лишь хотел сказать что есть разработки которые без использования классов реализовать очень сложно, код превращается в какую то кашу. Если у вас не было таких разработок, то не смогу объяснить. Но если не писать, то хотя бы свободно читать надо всем нам уметь. Вообще остановиться в нашей профессии почти значит уступить свое место более молодым и амбициозным, а не хотелось бы.

ЗЫ: очень ушли от первоначальной темы и свалились в негативные какие то высказывания. Это я виноват в общем то. Embarassed

Верно, но это не горечь, а банальный стёб над ООП. Просто забыл дописать, что всё остальное меня устраивает, а тот же RTTS + cl_salv даже чем-то нравится. Это как раз к вопросу о молодых, которым уступить. Зачем же, наш метод - изучать и использовать. Там не сложно, больше поводов потом у тех, кто любит программами мерятся. Wink

Всё, что считаешь нужным записать в ТС - пиши. Список запросов и объектовх, вменяемые описания классов (отдельно), ГФ (кроме автогенер.), блоков обработки и т.п. Приносит уважение и благодарность уже в этой жизни, с возможностью полной отработки своей и частично чужой негативной кармы (всяких балбесов), а не + 10 к карме и медальку, как тебе тут John Doe расписывает, дескать умрешь и в зачет этих "+" в следующей жизни будешь директором у заказчика. Он просто руководитель, а ты посмотри какая подпись у шефа. Думаешь, просто так? Cool

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



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Thu Feb 07, 2013 9:51 am    Post subject: Reply with quote

Наверное буду проклят, но я как раз предпочитаю оборачивать громоздкие вызовы стандарта в более компактную форму (естесственно если эти вызовы часто нужны). Если нужно только в одной программе - то в подпрограмму, если нужно не в одной - то в статический метод глобального класса. И не только сам пишу - но и сопровождаю написанное другими, и если имена классов и методов выбраны с умом - все достаточно понятно и прозрачно.
А по теме - заполняем техническую часть, всегда. Правда вместо списка запросов обычно шаблон наименования, у нас на это регламент плюс проверка при создании запроса
Back to top
View user's profile Send private message Blog
Dmitriy
Аналитик
Аналитик


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

PostPosted: Thu Feb 07, 2013 10:52 am    Post subject: Reply with quote

Armann wrote:
Наверное буду проклят, но я как раз предпочитаю...

Это нормально, мы просто ждали.

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



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Thu Feb 07, 2013 11:02 am    Post subject: Reply with quote

Dmitriy wrote:
Armann wrote:
Наверное буду проклят, но я как раз предпочитаю...

Это нормально, мы просто ждали.

Хочу добавить что полный ООПец осуждаю Smile
Как пример - тр. MIRO, когда копался - временами хотелось сделать разработчику этого что нибудь неприятное и болезненное Smile
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 -> Talks | Беседка All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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.