sexta-feira, 22 de julho de 2022

Rotina gravação / visualização de LOG (SLG1)

Nova forma de fazer.

*============ LEITURA DE LOG 

METHOD get_log.


    TRY.

        DATA(lo_filter) = cl_bali_log_filter=>create(

                                          )->set_create_info( user = sy-uname

                                          )->set_descriptor( object = 'ZSD_INDINT'

                                                             subobject = 'LOG_PROC'

                                                             external_id = CONV balnrext( iv_id ) ).


        DATA(lv_data_final) = utclong_current( ).

        DATA(lv_data_inicio) = utclong_add( val = lv_data_final

                                                       days = '30-' ).

        lo_filter->set_time_interval( start_time = lv_data_inicio

                                      end_time = lv_data_final ).


        lo_filter->set_maximum_log_number( max_log_number = 5 ).


        DATA(lo_log_table) = cl_bali_log_db=>get_instance( )->load_logs_w_items_via_filter( filter = lo_filter ).


      CATCH cx_bali_runtime INTO DATA(l_exception).

        RETURN.


    ENDTRY.


    LOOP AT lo_log_table INTO DATA(lr_log).


      " Get log header and output attributes of the header

      DATA(lv_header) = lr_log->get_header( ).


      APPEND INITIAL LINE TO rt_return ASSIGNING FIELD-SYMBOL(<lf_return>).

      <lf_return> = VALUE #( id = 'ZSD' type = 'I' number = '000'

                             message_v1 = |Data/hora log:|

                             message_v2 = lv_header->log_timestamp ).



      " Get all items and output some data which exist in all item categories

      DATA(lt_item_table) = lr_log->get_all_items( ).

      LOOP AT lt_item_table INTO DATA(lr_item_entry).


        " Output attributes which are specific for messages and exceptions

        IF lr_item_entry-item->category = if_bali_constants=>c_category_message.


          DATA(lo_message_ref) = CAST if_bali_message_getter( lr_item_entry-item ).

          APPEND INITIAL LINE TO rt_return ASSIGNING <lf_return>.

          <lf_return> = VALUE #( id = lo_message_ref->id

                                 type = lo_message_ref->severity

                                 number = lo_message_ref->number

                                 message_v1 = lo_message_ref->variable_1

                                 message_v2 = lo_message_ref->variable_2

                                 message_v3 = lo_message_ref->variable_3

                                 message_v4 = lo_message_ref->variable_4

                                 message = lo_message_ref->get_message_text( ) ).


        ENDIF.


      ENDLOOP.


    ENDLOOP.


  ENDMETHOD.





==========================================================
>>>>>>>>>>>>>>   GRAVAÇÃO
==========================================================

 FORM f_grava_log USING fu_bapiret2 TYPE bapiret2_t

              CHANGING fc_lognum TYPE balognr.

  DATA:
    l_log_handle   TYPE balloghndl,
    ls_log         TYPE bal_s_log,
    ls_log_message TYPE bal_s_msg,
    lt_log_handle  TYPE bal_t_logh,
    lt_log_num     TYPE bal_t_lgnm.

  CLEAR:
    lt_log_handle,
    lt_log_num.

  FIELD-SYMBOLS <lt_ldat> TYPE ANY TABLE.

  IF fc_lognum IS NOT INITIAL.
    PERFORM f_delete_log USING fc_lognum.
  ENDIF.

*--------------------------------------------------------------------*
* Set BAL LOG object
*--------------------------------------------------------------------*
  ls_log-object    gc_log_obj.
  ls_log-subobject gc_log_subobj.
  ls_log-aldate    sy-datum.
  ls_log-altime    sy-uzeit.
  ls_log-aluser    sy-uname.

*--------------------------------------------------------------------*
* Create new BAL LOG
*--------------------------------------------------------------------*
  CALL FUNCTION 'BAL_LOG_CREATE'
    EXPORTING
      i_s_log                 ls_log
    IMPORTING
      e_log_handle            l_log_handle
    EXCEPTIONS
      log_header_inconsistent 1
      OTHERS                  2.

*--------------------------------------------------------------------*
* Add messages to the LOG
*--------------------------------------------------------------------*
  LOOP AT fu_bapiret2 INTO DATA(ls_return)
                      WHERE type 'E'.

    ls_log_message-msgty ls_return-type.
    ls_log_message-msgid ls_return-id.
    ls_log_message-msgno ls_return-number.
    ls_log_message-msgv1 ls_return-message_v1.
    ls_log_message-msgv2 ls_return-message_v2.
    ls_log_message-msgv3 ls_return-message_v3.
    ls_log_message-msgv4 ls_return-message_v4.

    CALL FUNCTION 'BAL_LOG_MSG_ADD'
      EXPORTING
        i_log_handle     l_log_handle
        i_s_msg          ls_log_message
      EXCEPTIONS
        log_not_found    1
        msg_inconsistent 2
        log_is_full      3
        OTHERS           4.

  ENDLOOP.

*--------------------------------------------------------------------*
* Save the LOG to the database
*--------------------------------------------------------------------*
  APPEND l_log_handle TO lt_log_handle.

  "Elimino log sem o objeto subobjeto na função.
  ASSIGN ('(SAPLSBAL)G-T_LDAT[]'TO <lt_ldat>.
  IF sy-subrc 0.

    DELETE <lt_ldat>
     WHERE ('LOG-OBJECT = SPACE').

  ENDIF.

  CALL FUNCTION 'BAL_DB_SAVE'
    EXPORTING
      i_client         sy-mandt
      i_save_all       abap_true
      i_t_log_handle   lt_log_handle
    IMPORTING
      e_new_lognumbers lt_log_num
    EXCEPTIONS
      log_not_found    1
      save_not_allowed 2
      numbering_error  3
      OTHERS           4.

  IF lt_log_num[] IS NOT INITIAL.
    fc_lognum lt_log_num[ lineslt_log_num ]-lognumber.
  ENDIF.

    LOOP AT lt_log_handle INTO DATA(ls_log_handle).

      CALL FUNCTION 'BAL_LOG_REFRESH'
        EXPORTING
          i_log_handle  = ls_log_handle
        EXCEPTIONS
          log_not_found = 1
          OTHERS        = 2.

    ENDLOOP.

ENDFORM.


==========================================================
>>>>>>>>>>>>>>   VISUALIZAÇÃO
==========================================================

FORM f_show_log USING fu_lognum TYPE balognr.

  DATA:
    lt_log_header   TYPE balhdr_t,
    ls_log_filter   TYPE bal_s_lfil,
    ls_display_prof TYPE bal_s_prof.

  CLEAR:
    lt_log_header,
    ls_log_filter,
    ls_display_prof.

  CHECK fu_lognum IS NOT INITIAL.

  APPEND INITIAL LINE TO ls_log_filter-lognumber  ASSIGNING FIELD-SYMBOL(<fs_log_num>).
  <fs_log_num>-sign   'I'.
  <fs_log_num>-option 'EQ'.
  <fs_log_num>-low    fu_lognum.
  APPEND INITIAL LINE TO ls_log_filter-object     ASSIGNING FIELD-SYMBOL(<fs_obj>).
  <fs_obj>-sign   'I'.
  <fs_obj>-option 'EQ'.
  <fs_obj>-low    gc_log_obj.
  APPEND INITIAL LINE TO ls_log_filter-subobject  ASSIGNING FIELD-SYMBOL(<fs_subobj>).
  <fs_subobj>-sign   'I'.
  <fs_subobj>-option 'EQ'.
  <fs_subobj>-low    gc_log_subobj.

  CALL FUNCTION 'BAL_DB_SEARCH'
    EXPORTING
      i_s_log_filter     ls_log_filter
    IMPORTING
      e_t_log_header     lt_log_header
    EXCEPTIONS
      log_not_found      1
      no_filter_criteria 2.

  IF sy-subrc <> 0.
    MESSAGE i030 DISPLAY LIKE 'E'.
  ENDIF.

  CALL FUNCTION 'BAL_DB_LOAD'
    EXPORTING
      i_t_log_header     lt_log_header
    EXCEPTIONS
      no_logs_specified  1
      log_not_found      2
      log_already_loaded 3.


  CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'
    IMPORTING
      e_s_display_profile ls_display_prof
    EXCEPTIONS
      OTHERS              1.

  IF sy-subrc IS NOT INITIAL.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      DISPLAY LIKE 'I'.
  ENDIF.

* Display in ALV popup
  ls_display_prof-use_grid          abap_true.
  ls_display_prof-disvariant-report sy-repid.
  ls_display_prof-disvariant-handle 'LOG'.
  ls_display_prof-pop_adjst  abap_true.

  CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
    EXPORTING
*     i_t_log_handle      = lt_log_handle
      i_s_display_profile ls_display_prof
    EXCEPTIONS
      OTHERS              1.

  IF sy-subrc IS NOT INITIAL.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      DISPLAY LIKE 'I'.
  ENDIF.

  READ TABLE lt_log_header INTO DATA(ls_log_headerINDEX 1.

* Free messages from the memory
  CALL FUNCTION 'BAL_LOG_REFRESH'
    EXPORTING
      i_log_handle  ls_log_header-log_handle
    EXCEPTIONS
      log_not_found 1
      OTHERS        2.

  IF sy-subrc IS NOT INITIAL.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      DISPLAY LIKE 'I'.
  ENDIF.

ENDFORM.


==========================================================
>>>>>>>>>>>>>>   ELIMINA LOG
==========================================================

*&---------------------------------------------------------------------*
*& Form F_DELETE_LOG
*&---------------------------------------------------------------------*
FORM f_delete_log USING fu_lognum TYPE balognr.

  DATAlt_log_del TYPE balhdr_t.

  SELECT *
    INTO TABLE lt_log_del
    FROM balhdr
   WHERE lognumber EQ fu_lognum.

  CHECK sy-subrc 0.

  CALL FUNCTION 'BAL_DB_DELETE'
    EXPORTING
      i_t_logs_to_delete lt_log_del
      i_package_size     100
      i_in_update_task   abap_true
    EXCEPTIONS
      no_logs_specified  1
      OTHERS             2.

ENDFORM.




quarta-feira, 1 de junho de 2022

AMDP - Usando WHILE, leitura tipo READ TABLE, variável de sistema

CLASS zcl_szk_amdp1 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    TYPES: BEGIN OF tp_transp,
             nodeid type char05,
             hierarchy type char05,
             parentid type char05,
             tknum type tknum,
             vbeln type likp-vbeln,
             posnr type lips-posnr,
             matnr type lips-matnr,
             maktx type makt-maktx,
             lfimg type lips-lfimg,
             meins type lips-meins,
           END OF tp_transp.

    TYPES tp_vttk type table of vttk WITH DEFAULT KEY.
    types tp_transp_tab type TABLE OF tp_transp with DEFAULT KEY
    .

    INTERFACES if_amdp_marker_hdb .
    METHODS get_transport_detail IMPORTING VALUE(iv_mandt) type sy-mandt
                                           VALUE(iv_tknum) type vttk-tknum
                                           default ' ' "Indica parâmetro opcional
                                 EXPORTING value(et_transp) type tp_transp_tab
                                           value(e_text) type char10.

    class-METHODS get_transporte1 FOR TABLE FUNCTION zteste_szk2.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_szk_amdp1 IMPLEMENTATION.

  METHOD get_transport_detail BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
                                OPTIONS READ-ONLY USING VTTK vttp lips makt.

   DECLARE lt_transp TABLE LIKE :et_transp;
   DECLARE lv_index INTEGER;
   DECLARE lv_nodeid INTEGER;
   DECLARE lv_rows INTEGER;
   DECLARE lv_tknum "$ABAP.type( TKNUM )";
   DECLARE lv_pos INTEGER;

   it_vttk = select tknum
                from vttk
               WHERE mandt = :IV_MANDT;

   lv_rows = record_count( :it_vttk ); "igual ao LINES no ABAP

   lv_index = 1;

   while lv_index <= lv_rows do
     lv_nodeid = lv_index;
     lt_transp.tknum[ :lv_nodeid ] = :it_vttk.tknum[ :lv_index ];
     lt_transp.nodeid[ :lv_nodeid ] = :lv_nodeid;
     lv_index = lv_index + 1;
   END WHILE;

   it_rem = select vttp.tknum,
                   vttp.vbeln,
                   posnr,
                   lips.matnr,
                   maktx,
                   lfimg,
                   meins
              from vttp
                   INNER join :it_vttk as vttk
                   on vttk.tknum = vttp.tknum
                   INNER join lips
                   on lips.vbeln = vttp.vbeln
                   "Mandante é importante, podem vir linhas duplicadas 
                   "caso não seja informado
                   and lips.mandt = vttp.mandt 
                   INNER join makt
                   on makt.matnr = lips.matnr
                   and makt.mandt = lips.mandt
           where vttp.mandt = session_context('CLIENT') "tipo SY-MANDT
             AND makt.spras = session_context('LOCALE_SAP'); "tipo SY-LANGU



    lv_index = 1;
    lv_rows = record_count( :it_rem );

    while lv_index <= lv_rows do

     lv_nodeid = lv_nodeid + 1;
     lt_transp.tknum[ :lv_nodeid ] = :it_rem.tknum[ :lv_index ];
     lv_tknum = :it_rem.tknum[ :lv_index ];
     lt_transp.nodeid[ :lv_nodeid ] = :lv_nodeid;
     lt_transp.vbeln[ :lv_nodeid ] = :it_rem.vbeln[ :lv_index ];
     lt_transp.posnr[ :lv_nodeid ] = :it_rem.posnr[ :lv_index ];
     lt_transp.matnr[ :lv_nodeid ] = :it_rem.matnr[ :lv_index ];
     lt_transp.maktx[ :lv_nodeid ] = :it_rem.maktx[ :lv_index ];
     lt_transp.lfimg[ :lv_nodeid ] = :it_rem.lfimg[ :lv_index ];
     lt_transp.meins[ :lv_nodeid ] = :it_rem.meins[ :lv_index ];
     "SEARCH - faz a busca igual read table
     lv_pos = :lt_transp.search( ( tknum ), :it_rem.tknum[ :lv_index ] );
     IF lv_pos <> 0 THEN
         lt_transp.hierarchy[ :lv_nodeid ] = :lt_transp.nodeid[ :lv_pos ];
         lv_index = lv_index + 1;
     END IF;
    END WHILE ;

   et_transp = SELECT *
                FROM :lt_transp;

  ENDMETHOD.

  method get_transporte1 BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
                               OPTIONS READ-ONLY using vttk vttp lips.

    return select vttk.mandt,
                  vttk.tknum,
                  vttp.vbeln,
                  posnr,
                  lfimg,
                  meins
             from vttk
                  INNER join vttp
                  on vttp.tknum = vttk.tknum
                  inner join lips
                  on lips.vbeln = vttp.vbeln;

  endmethod.

ENDCLASS.

============================  OUTRA BUSCA ==========================

Busca utilizando SEARCH com 2 campos.
No caso o Pedido e Saida são campos da minha tabela





=================================

METHOD execute_db BY DATABASE FUNCTION FOR HDB LANGUAGE

SQLSCRIPT OPTIONS READ-ONLY USING mslb matdoc nsdm_e_marc t156 ekpo.


declare lv_index, lv_rows, lv_pos integer;


it_mat = select mslb.mandt as client,

mslb.matnr as Material,

mslb.werks as Centro,

'0' as QuantTransf,

mslb.charg as Lote,

mslb.lifnr as Fornecedor,

'S' as tipo

FROM mslb

WHERE mandt = session_context('CLIENT')

and sobkz = 'O'

-- AND matnr = '000000000001157206'


UNION ALL


SELECT marc.mandt as Client,

marc.matnr as Material,

marc.werks as Centro,

marc.umlmc as QuantTransf,

'' as Lote,

'' as Fornecedor,

'T' as tipo

FROM nsdm_e_marc as Marc

where marc.mandt = session_context('CLIENT')

and marc.umlmc > 0;


it_mov = select mandt as Client,

bwart

FROM t156;


IF :p_sql_sub IS NOT null then

it_mov_sub = apply_filter (:it_mov, :p_sql_sub);

END if;


IF :p_sql_trc IS NOT NULL then

it_mov_trc = apply_filter (:it_mov, :p_sql_trc);

END if;

-- Documentos subcontratacao

it_doc = SELECT Doc.mandt as Client,

Doc.ebeln as Pedido,

Doc.ebelp as ItemPedido,

Doc.matnr as Material,

Doc.werks as Centro,

Doc.lifnr as Fornecedor,

Doc.budat as DtLancamento,

Doc.charg as Lote,

Doc.vfdat as DtVencLote,

Doc.ebeln as PedCKD,

Doc.lgort as Deposito,

Mat.tipo as Tipo,

CASE when Doc.blart = 'WE' then Doc.menge * -1

else Doc.menge end as Quantidade,

CASE when Doc.blart = 'WE' then ''

ELSE 'X' END as Saida

from matdoc as Doc

inner join :it_mat as Mat

ON Mat.Material = Doc.matnr

and Mat.Centro = Doc.werks

and Mat.Fornecedor = Doc.lifnr

and Mat.tipo = 'S'

inner join :it_mov_sub as mov

ON mov.bwart = Doc.bwart

where Doc.xauto = ''

AND Doc.cancelled = ''

AND Doc.reversal_movement = ''


union all


-- Documento de transferencia

SELECT Doc.mandt as Client,

Doc.ebeln as Pedido,

Doc.ebelp as ItemPedido,

Doc.matnr as Material,

Doc.werks as Centro,

Doc.lifnr as Fornecedor,

Doc.budat as DtLancamento,

Doc.charg as Lote,

Doc.vfdat as DtVencLote,

Doc.ebeln as PedCKD,

Doc.lgort as Deposito,

Mat.tipo as Tipo,

CASE when Doc.blart = 'WE' then Doc.menge * -1

else Doc.menge end as Quantidade,

CASE when Doc.blart = 'WE' then ''

ELSE 'X' END as Saida

from matdoc as Doc

inner join :it_mat as Mat

ON Mat.Material = Doc.matnr

and Mat.Centro = Doc.werks

and Mat.tipo = 'T'

inner join :it_mov_trc as mov

ON mov.bwart = Doc.bwart

where Doc.xauto = ''

AND Doc.cancelled = ''

AND Doc.reversal_movement = '';


it_doc = APPLY_FILTER( :it_doc, :p_sql_werks );


-- Documento ckd

it_ckd = SELECT Doc.Material as Material,

Doc.Lote as Lote,

ItPedido.zzpaickd as PedCKD

from :it_doc as Doc

inner join matdoc as MatDoc

on MatDoc.matnr = Doc.Material

and MatDoc.charg = Doc.Lote

and MatDoc.lifnr = Doc.Fornecedor

and MatDoc.bwart = '101'

INNER JOIN ekpo as ItPedido

ON ItPedido.ebeln = MatDoc.ebeln

and ItPedido.ebelp = MatDoc.ebelp

and ItPedido.zzpaickd <> ''

where Doc.Lote <> '';



lv_index = 1;

lv_rows = record_count( :it_doc );


-- Coloco a DATA de lancamento da saída igual aos documentos de entrada para agrupar os valores

WHILE lv_index <= lv_rows DO


if :it_doc.Saida[ :lv_index ] = '' then


lv_pos = :it_doc.search( ( Pedido, Saida ), ( :it_doc.Pedido[ :lv_index ], 'X' ) );


IF lv_pos <> 0 then

it_doc.DtLancamento[ :lv_index ] = :it_doc.DtLancamento[ :lv_pos ] ;

it_doc.Deposito[ :lv_index ] = :it_doc.Deposito[ :lv_pos ] ;

END if;


END if;


lv_pos = :it_ckd.search( ( Material, Lote ),

( :it_doc.Pedido[ :lv_index ], :it_doc.Lote[ :lv_index ] ) );

IF lv_pos > 0 then

it_doc.PedCKD[ :lv_index ] = :it_ckd.PedCKD[ :lv_pos ];

ELSE it_doc.PedCKD[ :lv_index ] = '';

END if;



lv_index = lv_index + 1 ;


END WHILE ;


terça-feira, 17 de maio de 2022

Alterando texto (info) de um ícone standard - relatorio ALV

Precisei fazer isso em um relatorio ALV TREE que tinha no campo de status um ícone standard, eu queria alterar o texto info do campo para igual ao código do status do meu processo. Utilizei a função ICON_CREATE informando o standard e utilizando o resultado da função como ícone customizado. Lembrando que o resultado dessa função é type ANY, dependendo do texto info que for informado o campo de resultado deve ter um tamanho maior. No começo o meu campo estava pequeno e o info não aparecia, eu aumentei o tamanho do campo e apareceu corretamente. - re 

Ex: METHOD status_icon_wms. 
 CASE i_status. 
     WHEN gc_stwms_aguardando. 
         r_icon = me->create_icon_cust( i_name = icon_yellow_light 
                                                        i_info = me->mt_stwms_dom[ domvalue_l = i_status ]-ddtext ). 
     WHEN gc_stwms_finalizado. 
        r_icon = me->create_icon_cust( i_name = icon_green_light 
                                                       i_info = me->mt_stwms_dom[ domvalue_l = i_status ]-ddtext ). 
     WHEN gc_stwms_erro OR gc_stwms_erro_sap. 
        r_icon = me->create_icon_cust( i_name = icon_red_light 
                                                        i_info = me->mt_stwms_dom[ domvalue_l = i_status ]-ddtext ). 
      WHEN OTHERS. 
        r_icon = me->create_icon_cust( i_name = icon_light_out 
                                                        i_info = me->mt_stwms_dom[ domvalue_l = i_status ]-ddtext ). ENDCASE. 

 ENDMETHOD. 

 METHOD create_icon_cust. 

   CALL FUNCTION 'ICON_CREATE' 
         EXPORTING name = i_name info = i_info 
         IMPORTING 
              result = r_result 
         EXCEPTIONS 
           icon_not_found = 1 
           outputfield_too_short = 2 
         OTHERS = 3. 

   IF sy-subrc <> 0. * Implement suitable error handling here 
   ENDIF. 

 ENDMETHOD.

segunda-feira, 16 de maio de 2022

Erro restauração IPHONE 5s - código de erro 9

Esse erro não tem nada a ver com SAP, mas achei super interessante só para ficar na memória. Eu tenho um iphone 5s q há tempos eu tento fazer ele funcionar, tentei fazer de tudo fiz o reset, reinicializei e por último tentei restaurar pelo itunes mas sempre depois q terminava o download do ios e tentava fazer a restauração no iphone dava um codigo de erro 9, pesquisei na internet por um tempo e não consegui achar como resolver. Até que achei esse cara no youtube que teve o problema e achei inusitado a solução, fiz conforme o cara fala totalmente incrédulo. Mas não é que funcionou... no vídeo ele diz q tem um parafuso dentro do aparelho que dependendo se vc coloca o parafuso errado ou força demais uma parte da placa q começa a dar o erro, assim como ele eu abri o iphone removi o parafuso e não é que funcionou mesmo.. fica a dica https://www.youtube.com/watch?v=2rQwWvrpnvk