Program Lock

Program adı ve tablodaki elemanlar için kilit oluşturma örneğidir.
Özellikle asenkron çalışmalarda programın/fonksiyonun bir kaç yüz milisaniye içinde bir kaç kez çalışarak çakışmasının önüne geçmek içindir. Program Adı & Sipariş numarası ile kilit kaydı oluşturularak bunun önüne geçilebilir.
Tablo Lock`ı da kullanılabilir fakat benim örneğimde SUBMIT komutu ile çağırılan program içinde de Tabloya UPDATE yapılıyordu.
JOB kullanımlarında da iş görür, fonksiyon tetiklendikten sonra  aynı fonksiyonu JOB da kullanıyorsa çakışma olasılığı düşük olsa bile yeterince vardır.

  perform enqueue_program    using IT_SIPR_H
                            changing lv_locked_func
                                     lt_db_sipr_e.


  if lv_locked_func `X`.
"Kilitleme işlemi başarılı
else.
"Kilitleme işlemi başarısız  
endif.

  perform dequeue_program USING   IT_SIPR_H changing  lt_db_sipr_e.

 


form enqueue_program    using prt_sipr_h  type  ztr_t_toplu_spr_h
                        changing chn_lock type c
                                 cht_errlog_db type tty_db_sipr_e.

  datalv_program like trdir-name.
  datals_spr_h type ztr_s_toplu_spr_h.

  loop at prt_sipr_h into ls_spr_h.
    concatenate sy-repid `_` ls_spr_h-bstnk into lv_program.
    call function `ENQUEUE_E_DSVAS_TRDIR`
      exporting
        mode_trdir     `X`
        name           lv_program
        x_name         ` `
        _scope         `2`
        _wait          ` `
        _collect       ` `
      exceptions
        foreign_lock   1
        system_failure 2
        others         3.
    if sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.


      perform f_add_error_e1   using     ls_spr_h-bstnk `000000`
                              `006`  "& Sipariş kilitli, değiştirilemez
                              ls_spr_h-bstnk
                   changing   cht_errlog_db  .

      chn_lock space.
    else.
      chn_lock `X`.
    endif.

  endloop.

endform.                    " ENQUEUE_PROGRAM





 
  form dequeue_program using  prt_sipr_h  type  ztr_t_toplu_spr_h
                              cht_errlog_db type tty_db_sipr_e.

  datalv_program like trdir-name.
  datals_spr_h type ztr_s_toplu_spr_h.



  loop at prt_sipr_h into ls_spr_h.

    concatenate sy-repid `_` ls_spr_h-bstnk into lv_program.
    call function `DEQUEUE_E_DSVAS_TRDIR`
      exporting
        mode_trdir `X`
        name       lv_program
        x_name     ` `
        _scope     `3`
        _synchron  ` `
        _collect   ` `.
  endloop.
endform.                    " DEQUEUE_PROGRAM