пятница, 12 декабря 2014 г.

Экраны. Форма запуска цепочки с фильтрами. Часть 1.

Небольшая заготовка для транзакции запуска цепочки и передачей в неё фильтров. 
Есть возможность просмотра лога цепочки, проверка и просмотр фильтров перед запуском. Навигация в стандартном стиле SAP.

Когда продуктив закрыт, а загрузиться что-то очень хочется :)

Только сразу не кидайте камни, часть функционала переделал, а часть пришлось оставить как есть...

В фильтры можно добавлять столько же значений, сколько добавляем в фильтры dtp.


Внешний вид:



Код основной программы слишком длинный, пришлось завернуть в файл.

Структура таблиц:
/bic/anoekran00:

/bic/pnefilter:

/bic/pncfilt:

ZNMENU:



ZNF_SET_EKRAN_PARAM:
function znf_set_ekran_param.*"----------------------------------------------------------------------*"*"Локальный интерфейс:*"  IMPORTING*"     REFERENCE(EKRAN) TYPE  I*"     REFERENCE(NUM_FILT) TYPE  C*"     REFERENCE(VALPAR) TYPE  C*"     REFERENCE(TXT) TYPE  STRING OPTIONAL*"  EXPORTING*"     REFERENCE(RES) TYPE  I*"----------------------------------------------------------------------   data:         type_filtr  type /bic/oincfilt,         all_filt    like /bic/pnefilter,         id_rec      type /bic/oinefilter.*-----------------------------------------------------------------------   select single /bic/ncfilt
    into type_filtr
    from /bic/pncfilt
   where txtlg num_filt.
*"  Определяем ID записи в таблице   select max/bic/nefilter )     into id_rec
    from /bic/pnefilter
   where objvers 'A'.
  id_rec id_rec + 1.
  clear all_filt.
*"  Запихиваем значения   all_filt-/bic/nefilter  id_rec.   all_filt-/bic/ncnumekr  ekran.   all_filt-/bic/ncfilt    type_filtr.   all_filt-/bic/ncvalpar  valpar.   all_filt-objvers        'A'.   all_filt-txtlg          txt.
  insert into /bic/pnefilter values all_filt.
*"  Проверка записи в таблицу   select count)     into res
    from /bic/pnefilter
   where objvers 'A'      and /bic/nefilter  id_rec.
  if res > 0.     res 0.   else.     res 1.   endif.*"----------------------------------------------------------------------endfunction.

ZNF_SETPLANING:
function znf_setplaning.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(JOBNAME) TYPE  C
*"     REFERENCE(JOBDATE) TYPE  DATS
*"     REFERENCE(JOBTIME) TYPE  TIMS
*"  EXPORTING
*"     REFERENCE(JOBCOUNT) TYPE  C
*"----------------------------------------------------------------------
  data:
        jobnumber           like tbtcjob-jobcount,
        jobnames            like tbtcjob-jobname,
        startdate           like tbtcjob-sdlstrtdt,
        starttime           like tbtcjob-sdlstrttm,
        laststartdate       like tbtcjob-laststrtdt,
        laststarttime       like tbtcjob-laststrttm,
        job_released        like btch0000-char1,

        user_print_params   like pri_params,
        user_arc_params     like arc_params,

        g_report            like  rsvar-report value 'ZN_JOB_AGENT',
        g_variant           like  rsvar-variant,
        g_vari_desc         like  varid,

        it_rsparams         type standard table of  rsparams,
        wa_rsparams         like line of it_rsparams,
        it_vari_text        type standard table of varit,
        wa_vari_text        like line of it_vari_text,

        param               type tvarv_val.
*"----------------------------------------------------------------------
  move jobname to jobnames.
  move jobdate to startdate.
  move jobtime to starttime.

  laststartdate startdate + 1.
  laststarttime starttime.
*-----------------------------------------------------------------------
*"  Создание задания
  call function 'JOB_OPEN'
    exporting
      jobname          jobnames
    importing
      jobcount         jobnumber
    exceptions
      cant_create_job  01
      invalid_job_data 02
      jobname_missing  03
      others           99.

  if sy-subrc > 0.
    jobcount '0'.
    exit.
  endif.
*-----------------------------------------------------------------------
*"  Создание варианта к заданию
*"  Определяем имя варианта
  concatenate 'V' jobnumber into g_variant.

  move jobnumber to param.

*"  Удаляем ранее созданный вариант для этого джоба
  call function 'RSAQ_DELETE_ONE_VARIANT'
    exporting
      report              g_report
      variant             g_variant
    exceptions
      not_authorized      1
      not_executed        2
      no_report           3
      report_not_existent 4
      report_not_supplied 5
      variant_locked      6
      others              7.

  commit work.

*"  Текст к варианту
  wa_vari_text-langu     =  sy-langu.
  wa_vari_text-report    =  g_report.
  wa_vari_text-variant   =  g_variant.
  wa_vari_text-vtext     =  'NeoAgent'.
  append wa_vari_text to it_vari_text.
  clear wa_vari_text.

*"  Связь с программой и задание имя варианта
  g_vari_desc-report     g_report.
  g_vari_desc-variant    g_variant.
  g_vari_desc-environmnt 'A'.
  g_vari_desc-aedat      sy-datum.
  g_vari_desc-aetime     sy-uzeit.

*"  Параметры варианта
  wa_rsparams-selname    'PVARIANT'.
  wa_rsparams-kind       'P'.
  wa_rsparams-sign       'I'.
  wa_rsparams-option     'EQ'.
  wa_rsparams-low        param .
  append wa_rsparams to it_rsparams.

  clear wa_rsparams.

  call function 'RS_CREATE_VARIANT'
    exporting
      curr_report   g_report
      curr_variant  g_variant
      vari_desc     g_vari_desc
    tables
      vari_contents it_rsparams
      vari_text     it_vari_text.

  commit work.
*-----------------------------------------------------------------------
*"  Связываем задание с вариантом
  call function 'JOB_SUBMIT'
    exporting
      authcknam               sy-uname
      jobcount                jobnumber
      jobname                 jobnames
      report                  g_report
      variant                 g_variant
      priparams               user_print_params
      arcparams               user_arc_params
    exceptions
      bad_priparams           01
      invalid_jobdata         02
      jobname_missing         03
      job_notex               04
      job_submit_failed       05
      lock_failed             06
      program_missing         07
      prog_abap_and_extpg_set 08
      others                  99.

  if sy-subrc > 0.
*"  Удалили созданный вариант
    call function 'RSAQ_DELETE_ONE_VARIANT'
      exporting
        report              g_report
        variant             g_variant
      exceptions
        not_authorized      1
        not_executed        2
        no_report           3
        report_not_existent 4
        report_not_supplied 5
        variant_locked      6
        others              7.

    commit work.

    jobcount '0'.
    exit.
  endif.
*-----------------------------------------------------------------------
*"  Завершение планирования, связь с временем и типом запуска
  call function 'JOB_CLOSE'
    exporting
      jobcount          jobnumber
      jobname           jobnames
      sdlstrtdt         startdate
      sdlstrttm         starttime
      laststrtdt        laststartdate
      laststrttm        laststarttime
      prdmonths         '1'
      prdweeks          '1'
      prddays           '1'
      prdhours          '1'
      prdmins           '1'
    importing
      job_was_released  job_released
    exceptions
      invalid_startdate 01
      jobname_missing   02
      job_close_failed  03
      job_nosteps       04
      job_notex         05
      lock_failed       06
      others            99.

  if sy-subrc > 0.
*"  Удалили созданный вариант
    call function 'RSAQ_DELETE_ONE_VARIANT'
      exporting
        report              g_report
        variant             g_variant
      exceptions
        not_authorized      1
        not_executed        2
        no_report           3
        report_not_existent 4
        report_not_supplied 5
        variant_locked      6
        others              7.

    jobcount '0'.
    exit.
  endif.

  jobcount jobnumber.
*-----------------------------------------------------------------------
endfunction.


ZNF_SET_MESSPLANING:
function znf_set_messplaning.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(JOBNUM) TYPE  C
*"     REFERENCE(JOBNAME) TYPE  C
*"     REFERENCE(JOBDATE) TYPE  DATS
*"     REFERENCE(JOBTIME) TYPE  TIMS
*"     REFERENCE(EKRAN) TYPE  I
*"     REFERENCE(NUM_FILT) TYPE  C
*"     REFERENCE(VALPAR) TYPE  C
*"     REFERENCE(TXT) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     REFERENCE(RES) TYPE  I
*"----------------------------------------------------------------------
  data:
        all_filt    like /bic/pnejobs,
        type_filtr  type /bic/oincfilt,
        id_rec      type /bic/oinejobs.
*-----------------------------------------------------------------------
  select single /bic/ncfilt
    into type_filtr
    from /bic/pncfilt
   where txtlg num_filt.

*"  Определяем ID записи в таблице
  select max/bic/nejobs )
    into id_rec
    from /bic/pnejobs
   where objvers 'A'.

  id_rec id_rec + 1.

  clear all_filt.

*"  Запихиваем значения
  all_filt-/bic/nejobs    id_rec.
  all_filt-/bic/ncjobnum  jobnum.
  all_filt-/bic/ncjobname jobname.
  all_filt-/bic/ncdate    jobdate.
  all_filt-/bic/nctime    jobtime.
  all_filt-/bic/ncnumekr  ekran.
  all_filt-/bic/ncfilt    type_filtr.
  all_filt-/bic/ncvalpar  valpar.
  all_filt-objvers        'A'.
  all_filt-txtlg          txt.

  insert into /bic/pnejobs values all_filt.

*"  Проверка записи в таблицу
  select count)
    into res
    from /bic/pnejobs
   where objvers 'A'
     and /bic/nejobs  id_rec.

  if res > 0.
    res 0.
  else.
    res 1.
  endif.
endfunction.

В цепочке ставим\снимаем флаги через абапину ZN_EKRAN_FLAG:
*&---------------------------------------------------------------------*
*& Report  ZN_EKRAN_FLAG
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*"----------------------------------------------------------------------
report  zn_ekran_flag.

parameters:
    num_ekr   type default 0,
    set_flag  type default 0.
*-----------------------------------------------------------------------
if set_flag <> 0.
  set_flag 1.
endif.

update /bic/pncflstate
   set /bic/ekrstate  set_flag
       /bic/ncdt      sy-datum
       /bic/nctime    sy-uzeit
 where /bic/ncnumekr  num_ekr
   and objvers 'A'.
*"----------------------------------------------------------------------

Фильтры читаем так (у нас загрузка из инфо-набора):
* -------------------------------------------------------------------
*     Fieldname       = F1
*     data type       = CHAR
*     length          = 000030
* -------------------------------------------------------------------
form c_f1
  tables l_t_range structure rssdlrange
  using i_r_request type ref to if_rsbk_request_admintab_view
        i_fieldnm type rsfieldnm
  changing p_subrc like sy-subrc.
*       Insert source code to current selection field
*$*$ begin of routine - insert your code only below this line        *-*
*-----------------------------------------------------------------------
  types:
        begin of param_all,
            ncvalpar type /bic/oincvalpar,
          end of param_all.

  data:
        l_idx   like sy-tabix,
        counts  type i,

        t_table type table of param_all,
        wa      like line of t_table,
        bufers  type /bic/oincvalpar.
*-----------------------------------------------------------------------
*"  Загрузка фильтров по Бухгалтерской проводке вo времeнную таблицу
  select /bic/ncvalpar
    into table t_table
    from /bic/pnefilter
   where objvers 'A'
     and /bic/ncnumekr 11041000
     and /bic/ncfilt
         in select /bic/ncfilt
                from /bic/pncfilt
               where objvers 'A'
                 and txtlg '13' ).

*"  Определение количества установленных фильтров
  counts 0.
  loop at t_table into wa.
    counts counts + 1.
    exit.
  endloop.

  if counts > 0.
*"  Есть фильтры, перетаскиваем их
    loop at t_table into wa.

      l_t_range-iobjnm    'F1'.
      l_t_range-fieldname 'F1'.

      move wa-ncvalpar to l_t_range-low.

      l_t_range-sign    'I'.
      l_t_range-option  'EQ'.

      append l_t_range.
    endloop.

  else.
*"  нет фильтров, должны быть любыми
    l_t_range-iobjnm    'F1'.
    l_t_range-fieldname 'F1'.
    l_t_range-low       'XXX'.
    l_t_range-sign      'I'.
    l_t_range-option    'NE'.
    append l_t_range.
  endif.

  p_subrc 0.
*-----------------------------------------------------------------------

CP, если нужно в фильтре указать маску *

* -------------------------------------------------------------------
*     Fieldname       = F5
*     data type       = DATS
*     length          = 000008
* -------------------------------------------------------------------
form c_f5
  tables l_t_range structure rssdlrange
  using i_r_request type ref to if_rsbk_request_admintab_view
        i_fieldnm type rsfieldnm
  changing p_subrc like sy-subrc.
*       Insert source code to current selection field
*$*$ begin of routine - insert your code only below this line        *-*
*-----------------------------------------------------------------------
  data:
        l_idx   like sy-tabix,
        bufers  type /bic/oincvalpar,
        d1      type d,
        d2      type d.
*-----------------------------------------------------------------------
  select single /bic/ncvalpar
    into bufers
    from /bic/pnefilter
   where objvers 'A'
     and /bic/ncnumekr 11041000
     and /bic/ncfilt
         in select /bic/ncfilt
                from /bic/pncfilt
               where objvers 'A'
                 and txtlg '0' ).

  move bufers to d1.

  clear bufers.

  select single /bic/ncvalpar
    into bufers
    from /bic/pnefilter
   where objvers 'A'
     and /bic/ncnumekr 11041000
     and /bic/ncfilt
         in select /bic/ncfilt
                from /bic/pncfilt
               where objvers 'A'
                 and txtlg '1' ).

  move bufers to d2.

  if d1 is initial or d2 is initial.
*"  нет фильтров, сводим на пусто
    l_t_range-iobjnm    'F5'.
    l_t_range-fieldname 'F5'.
    l_t_range-low       '10000101'.
    l_t_range-sign      'I'.
    l_t_range-option    'EQ'.
    append l_t_range.
  else.
    l_t_range-iobjnm    'F5'.
    l_t_range-fieldname 'F5'.
    move d1 to l_t_range-low.
    move d2 to l_t_range-high.
    l_t_range-sign      'I'.
    l_t_range-option    'BT'.
    append l_t_range.
  endif.

  p_subrc 0.
*-----------------------------------------------------------------------



Комментариев нет:

Отправить комментарий