Conteúdo

Campo obrigatório de mentirinha - Screen-Required

Precisa que um parâmetro de tela apareça o simbolo de obrigatório, mas que não seja obrigatório?

Isso não é tão estranho... é?



REPORT ZSAPeiros.

PARAMETERS p_werks TYPE t001w-werks. "CADÊ O OBLIGATORY?

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    FIND 'P_WERKS' IN screen-name.
    IF sy-subrc IS INITIAL.
      screen-required = '2'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
Pra validar valor ou obrigatório ( estranho já que não queria como obrigatório ), pode usar assim:

AT SELECTION-SCREEN.
  IF p_werks IS INITIAL.
    MESSAGE e032(ms) WITH 'Centro'.
  ENDIF.

Exibir opção de Gravar Layout em seu AlvOO

DATA wa_variant TYPE disvariant.

wa_variant-report = sy-repid. "Sim, só por causa disso!

CALL METHOD go_grid_0100->set_table_for_first_display
  EXPORTING
    i_save     = 'A' "E disso
    is_layout  = wa_layout
    is_variant = wa_variant
...

Conteúdo da SO10 ( textos sapscript ) em Request

Digamos que vc criou isso:


Primeiro mude o tipo da TASK da sua request de workbench para Reparação:


Execute o programa RSTXTRAN no ambiente que criou o texto, e informe os dados solicitados e F8:


<Enter>   <Aceit>   <Sim>






Download de imagem da SE78 ( Smartforms/ Sapscript )

REPORT ZSAPeiros.

* Definição de tipos
TYPES:
  BEGIN OF ty_graphic_table,
    line(255) TYPE x,
  END OF ty_graphic_table.

* Variáveis
DATA:
  lv_graphic_size  TYPE i,
  lv_bytecount     TYPE i,
  lv_tdbtype       LIKE stxbitmaps-tdbtype,
  lv_call_mask(50) TYPE c,
  lv_name_exp      LIKE ibipparms-path,
  lv_filename      TYPE rlgrap-filename,
  lt_content       TYPE TABLE OF bapiconten,
  lt_graphic_table TYPE TABLE OF ty_graphic_table.

* Parâmetros de tela
PARAMETERS:
  p_name  TYPE stxbitmaps-tdname  DEFAULT 'ZSAPEIROS',
  p_btype TYPE stxbitmaps-tdbtype DEFAULT 'BCOL'.

* Atribuir valor aos parâmetros
INITIALIZATION.
  %_p_name_%_app_%-text  = 'Logo (SE78)'.
  %_p_btype_%_app_%-text = 'Cores ou P&B'.

* Executar
END-OF-SELECTION.
* Conteúdo da imagem
  CALL FUNCTION 'SAPSCRIPT_GET_GRAPHIC_BDS'
    EXPORTING
      i_object       = 'GRAPHICS'
      i_name         = p_name
      i_id           = 'BMAP'
      i_btype        = p_btype
    IMPORTING
      e_bytecount    = lv_bytecount
    TABLES
      content        = lt_content
    EXCEPTIONS
      not_found      = 1
      bds_get_failed = 2
      bds_no_content = 3
      OTHERS         = 4.

* Conversão da imagem
  CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP'
    EXPORTING
      old_format               = 'BDS'
      new_format               = 'BMP'
      bitmap_file_bytecount_in = lv_bytecount
    IMPORTING
      bitmap_file_bytecount    = lv_graphic_size
    TABLES
      bds_bitmap_file          = lt_content
      bitmap_file              = lt_graphic_table
    EXCEPTIONS
      OTHERS                   = 1.

* Extenção do arquivo de saída
  lv_call_mask = ',Bitmap (*.bmp),*.BMP'.

* Nome do arquivo original
  lv_filename = p_name && '.bmp'.

* Popup para informar o local onde será gravado o arquivo
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = lv_filename
      def_path         = lv_name_exp
      mask             = lv_call_mask
      mode             = 'S'
    IMPORTING
      filename         = lv_name_exp
    EXCEPTIONS
      inv_winsys       = 04
      no_batch         = 08
      selection_cancel = 12
      selection_error  = 16.

  CHECK sy-subrc IS INITIAL.

* Nome do arquivo com o caminho informado
  lv_filename = lv_name_exp.

* Download do arquivo
  CALL FUNCTION 'WS_DOWNLOAD'
    EXPORTING
      bin_filesize            = lv_graphic_size
      filename                = lv_filename
      filetype                = 'BIN'
    TABLES
      data_tab                = lt_graphic_table
    EXCEPTIONS
      invalid_filesize        = 1
      invalid_table_width     = 2
      invalid_type            = 3
      no_batch                = 4
      unknown_error           = 5
      gui_refuse_filetransfer = 6.

  IF sy-subrc IS INITIAL.
    MESSAGE 'Download realizado com sucesso!' TYPE 'S'.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

Deu TIMEOUT ou ALLOC MEMORY no seu SELECT? OPEN CURSOR pode ser a solução

O que acha de ir trabalhando um grupo de dados antes mesmo de finalizar a seleção de todos os dados?

Basicamente é isto que o comando OPEN CURSOR faz.

_Ah, mas o SELECT ... END SELECT faz isso.

Se você realmente chegou a pensar nisso, na boa, nem tente entender o código abaixo, recomendo estudar um pouco sobre PERFORMANCE e BEST PRATICES.

Eis um código para estudar e aplicar para sua solução.

REPORT ZSAPeiros.

DATA:
  lv_cursor    TYPE cursor,
  lt_j_1bnfdoc TYPE TABLE OF j_1bnfdoc,
  ls_j_1bnfdoc TYPE j_1bnfdoc.

GET TIME STAMP FIELD DATA(lv_ini).
WRITE:/ lv_ini.

OPEN CURSOR lv_cursor 
 FOR SELECT * 
       FROM j_1bnfdoc
      WHERE docdat LE sy-datum.

IF sy-subrc IS NOT INITIAL.
  WRITE:/ 'Erro ao abrir o cursor'.
  REJECT.
ENDIF.

DO.

  FETCH NEXT CURSOR lv_cursor
        INTO TABLE lt_j_1bnfdoc
     PACKAGE SIZE 100. "Quantidade de registros por bloco

  IF sy-subrc IS NOT INITIAL.
    WRITE / '----- FIM DO BLOCO -----'.
    EXIT.
  ENDIF.

  WRITE / '----- INÍCIO DO BLOCO -----'.
  LOOP AT lt_j_1bnfdoc INTO ls_j_1bnfdoc.
    WRITE:/ ls_j_1bnfdoc-docnum.
  ENDLOOP.
  WRITE / '----- FIM DO BLOCO -----'.

ENDDO.

GET TIME STAMP FIELD DATA(lv_fim).
WRITE:/ lv_fim.

Pilha de Processos ABAP / ABAP Stack Process - LIFO

REPORT ZSAPeiros.

DATA:
  lt_stack TYPE abap_callstack,
  ls_stack TYPE abap_callstack_line.

CALL FUNCTION 'SYSTEM_CALLSTACK'
  IMPORTING
    callstack = lt_stack.

LOOP AT lt_stack INTO ls_stack.
  WRITE:/ 'Programa principal:',ls_stack-mainprogram.
  WRITE:/ 'Include           :',ls_stack-include.
  WRITE:/ 'Linha da chamada  :',ls_stack-line.
  WRITE:/ 'Tipo da chamada   :',ls_stack-blocktype.
  WRITE:/ 'Nome do processo  :',ls_stack-blockname.
  WRITE:/ 'Programa sistema  :',ls_stack-flag_system.
ENDLOOP.

Converter Tabela Interna para Excel XLS e enviar para o Servidor

Rodei a internet procurando uma função mais simples, mas não encontrei, então ai vai:
CLASS zcl_itab_to_excel DEFINITION PUBLIC FINAL.
  PUBLIC SECTION.
    METHODS:
      itab_to_xstring 
        IMPORTING ir_data_ref       TYPE REF TO data
        RETURNING VALUE(rv_xstring) TYPE xstring.
ENDCLASS.

CLASS zcl_itab_to_excel IMPLEMENTATION.
  METHOD itab_to_xstring.

    FIELD-SYMBOLS: <fs_data> TYPE ANY TABLE.

    CLEAR rv_xstring.
    ASSIGN ir_data_ref->* TO <fs_data>.

    TRY.
        cl_salv_table=>factory(
          IMPORTING r_salv_table = DATA(lo_table)
          CHANGING  t_table      = <fs_data> ).
  
        DATA(lt_fcat) = 
          cl_salv_controller_metadata=>get_lvc_fieldcatalog(
            r_columns      = lo_table->get_columns( )
            r_aggregations = lo_table->get_aggregations( ) ).

        DATA(lo_result) =
          cl_salv_ex_util=>factory_result_data_table( 
            r_data         = ir_data_ref
            t_fieldcatalog = lt_fcat ).

        cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
          EXPORTING
            xml_type      = if_salv_bs_xml=>c_type_xlsx
            xml_version   = cl_salv_bs_a_xml_base=>get_version( )
            r_result_data = lo_result
            xml_flavour   = if_salv_bs_c_tt=>c_tt_xml_flavour_export
            gui_type      = if_salv_bs_xml=>c_gui_type_gui
          IMPORTING
            xml           = rv_xstring ).
      CATCH cx_root.
        CLEAR rv_xstring.
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

Depois só chamar passando sua tabela como referência:
DATA lt_sapeiros TYPE TABLE OF MARA.
GET REFERENCE OF lt_sapeiros INTO DATA(lo_data_ref).
DATA(lv_xstring) = NEW zcl_itab_to_excel( )->itab_to_xstring( lo_data_ref ). 
OPEN DATASET lv_xls_file FOR OUTPUT IN BINARY MODE.
IF sy-subrc IS INITIAL.
  TRANSFER lv_xstring TO lv_xls_file.
  CLOSE DATASET.
ENDIF.

Inserir objetos em request sem necessariamente terem sido alterados

Existem 2 modos ( ou mais ) de inserir objetos em uma Request:

Como exemplo coloquei objetos standard (elemento de dados e domínio), mas serve para Z tmb, e reports, funções, smartforms, etc.

Ah, importante ressaltar que a tradução vai junto com o objeto! Ou seja, um problema com tradução pode ser resolvido facilmente enviando novamente o objeto.

Modo 1 (Best Pratices SAP):
SE11:

Lista de Objetos:

Botão direito no objeto > Outras funções > Escrever entrada de transporte:

Informar a request ou criar uma nova:

Modo 2 (Easy Pratices):
Crie a request de workbanch, e insira os objetos na raça!

ABAP VS Code Connect: Editar objetos SAP no VS Code

Edite seus programas SAP utilizando o VS Code. Basta seguir os estepes abaixo:

Downloads:
Faça download e instale o VS Code:

Extensões mais utilizadas:
APÓS INSTALAR O VS CODE, abra cada um dos links e clique em instalar:


Buscando configurações do SAP:
Em seu SAP GUI DEV, execute a transação SICF, e em ServiceName, procure por ADT* (verde).
- Verifique se o serviço ADT_SRV está ativado (amarelo);
- Teste o serviço (azul);


Obs.: Este Serviço permite que editores, como o VS Code, se conectem ao seu sistema SAP.
Caso não tenha nenhum odata instalado, fale com basis.

Quando clicar em Test Service, irá lhe retornar um popup com o link e mandante que precisará copiar:



Configurando o VS Code:
Em seu VS Code, abra as extensões ( CTRL + SHIFT + X ), clique na extensão "ABAP remote filesystem", e em Configurações de Extensão:


Após isto clique em Editar em settings.json:


Insira sua configuração DENTRO de abapfs.remote:
{
    "workbench.colorTheme": "Default Light+",
    "explorer.confirmDelete": false,
    "sap.ux.applicationModeler.showPropertiesDescriptionInPageEditor": true,
    "abapfs.remote": {
        "Cliente SAP":{
            "url": "http://linkcopiado.com:8000/",
            "username": "Usuário",
            "password": "Senha",
            "client": "100",
            "language": "EN",
            "allowSelfSigned": true
        }
    }
}

Grave seu arquivo json.


Acessando seus programas no VS Code:
Para se conectar ao SAP, utilize o atalho CTRL + SHIFT + P, e procure por Connect ABAP:


Se tudo estiver certo, você já deve ter acesso ao ambiente SAP dentro do VS Code. Para isto basta ir no Explorador, ou utilizar o atalho CTRL + SHIFT + E: