/* POPUP INI */
/* POPUP FIM */

Conteúdo

Caminho Lógico / Logical Path

Antes de dar seu OPEN DATASET, é interessante, inclusive por questões de segurança, que você utilize um Caminho Lógico.

Para criar, acesse a transação FILE.

Clique 1 vez em Logical File Path Definition, e crie uma nova entrada:


Agora marque o item que acaba de criar, e duplo clique em Assignment of Physycal Paths to Logical Path, então crie uma nova entrada:


<SYSID> no caso é seu ambiente, então seja DEV, QAS ou PRD, ele vai entender. Lembre-se de  pedir para BASIS configurar este caminho nos 3 ambientes, afim de serem visualizados pela AL11 no caso.

Feito isso, agora é só utilizar o seguinte código:

REPORT ZSAPeiros.

* Local Declarations
DATA:
  lv_logical_filename TYPE filename-fileintern VALUE 'ZSAPEIROS',
  lv_filename         TYPE rlgrap-filename     VALUE 'ARQUIVO.TXT',
  lv_file             TYPE string,
  lt_file             TYPE TABLE OF char255.

* Physical File Name Using a Logical File Name
CLEAR lv_file.

CALL FUNCTION 'FILE_GET_NAME'
  EXPORTING
    logical_filename = lv_logical_filename
    parameter_1      = lv_filename
    including_dir    = 'X'
  IMPORTING
    file_name        = lv_file
  EXCEPTIONS
    file_not_found   = 1
    OTHERS           = 2.

IF sy-subrc IS NOT INITIAL.
  RETURN.
ENDIF.

* Physical File Name Based on a Logical Lile Name
CALL FUNCTION 'FILE_VALIDATE_NAME'
  EXPORTING
    logical_filename           = lv_logical_filename
    parameter_1                = lv_filename
  CHANGING
    physical_filename          = lv_file
  EXCEPTIONS
    logical_filename_not_found = 1
    validation_failed          = 2
    OTHERS                     = 3.

IF sy-subrc IS NOT INITIAL.
  RETURN.
ENDIF.

* File content
CLEAR lt_file[].

APPEND INITIAL LINE TO lt_file ASSIGNING FIELD-SYMBOL(<fs_file>).
<fs_file> = 'Linha 1'.

APPEND INITIAL LINE TO lt_file ASSIGNING <fs_file>.
<fs_file> = 'Linha 2'.

* Generate file in server
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.

IF sy-subrc IS INITIAL.

  LOOP AT lt_file INTO DATA(ls_file).
    TRANSFER ls_file TO lv_file.
  ENDLOOP.

  CLOSE DATASET lv_file.

ENDIF.

Abrir arquivo PDF em tela em vez de salvar

Antes da aplicação da nota 2525392, paa abrir um arquivo PDF por exemplo, bastava chamar a função CALL_BROWSER, porém agora não mais.

Segue um exemplo de como manter a chamada, pois pode vir por variável, e ainda sim fazer funcionar caso falhe na chamada da CALL_BROWSER:

REPORT SAPeiros.

DATA:
  lv_url  TYPE char255 VALUE 'C:\TEMP\Arquivo.PDF',
  lv_file TYPE string.

CALL FUNCTION 'CALL_BROWSER'
  EXPORTING
    url                    = lv_url
  EXCEPTIONS
    frontend_not_supported = 1
    frontend_error         = 2
    prog_not_found         = 3
    no_batch               = 4
    unspecified_error      = 5
    OTHERS                 = 6.
 
IF sy-subrc IS NOT INITIAL.
 
  lv_file = lv_url.
 
  CALL METHOD cl_gui_frontend_services=>execute
    EXPORTING
      document = lv_file
    EXCEPTIONS
      OTHERS   = 1.
 
ENDIF.

openSAP Sumiu 😲 Caaaaalma, só migraram

Desde julho de 2024 a plataforma openSAP foi descontinuada.

Os cursos gratuitos continuarão disponíveis no site de aprendizado.

Alguns dos cursos que estavam na openSAP foram migrados para plataforma.

Mais detalhes sobre a migração aqui:
https://learning.sap.com/opensap-course-migration

Cursos aqui:
https://learning.sap.com/courses

Certificados:
Meu amigo, ainda não sei, mas até o momento não consegui encontrá-los.
Então quem souber como recuperar os certificados anteriormente realizados na open.SAP me avise para atualizar o blog e ajudar aos demais.

Que tal uma tela de parâmetros diferentona?

Não tive muitas idéias de ícones ou utilidade disso na tela de parâmetros, mas aposto que você terá!


REPORT ZSAPeiros.

DATA l_field TYPE string.
FIELD-SYMBOLS <fs_tab> TYPE ANY.

SELECTION-SCREEN BEGIN OF TABBED BLOCK t1 FOR 10 LINES.
SELECTION-SCREEN TAB (50) tab1 USER-COMMAND tab1 DEFAULT SCREEN 101.
SELECTION-SCREEN TAB (50) tab2 USER-COMMAND tab2 DEFAULT SCREEN 102.
SELECTION-SCREEN TAB (50) tab3 USER-COMMAND tab3 DEFAULT SCREEN 103.
SELECTION-SCREEN END OF BLOCK t1.

SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-t01.
PARAMETERS p_bukrs TYPE bukrs.
SELECTION-SCREEN END OF BLOCK 1.
SELECTION-SCREEN END OF SCREEN 101.

SELECTION-SCREEN BEGIN OF SCREEN 102 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE text-t02.
PARAMETERS p_werks TYPE werks_d.
SELECTION-SCREEN END OF BLOCK 2.
SELECTION-SCREEN END OF SCREEN 102.

SELECTION-SCREEN BEGIN OF SCREEN 103 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 3 WITH FRAME TITLE text-t03.
PARAMETERS p_kunnr TYPE kunnr.
SELECTION-SCREEN END OF BLOCK 3.
SELECTION-SCREEN END OF SCREEN 103.

INITIALIZATION.
  l_field = '(ZSAPEIROS)TAB1'.
  ASSIGN (l_field) TO <fs_tab>.
  CONCATENATE '@0Y@' 'Novo' INTO <fs_tab> RESPECTING BLANKS.

  l_field = '(ZSAPEIROS)TAB2'.
  ASSIGN (l_field) TO <fs_tab>.
  CONCATENATE '@0Z@' 'Alterar' INTO <fs_tab> RESPECTING BLANKS.

  l_field = '(ZSAPEIROS)TAB3'.
  ASSIGN (l_field) TO <fs_tab>.
  CONCATENATE '@0W@' 'Excluir' INTO <fs_tab> RESPECTING BLANKS.

Mudar de idioma sem precisar sair ou logar novamente

Precisa testar aquela tradução que está fazendo mas está com preguiça de sair e logar novamente?

Digite ZEN para mudar para o idioma Inglês, ou ZES para Espanhol, ZPT para Português, etc.

Crie as transações ZEN, ZPT, ZES direcionando para o mesmo programa.

REPORT ZSAPeiros.

CASE sy-tcode.

  WHEN 'ZEN'.
    SET LOCALE LANGUAGE 'E'.

  WHEN 'ZPT'.
    SET LOCALE LANGUAGE 'P'.
  
  WHEN 'ZES'.
    SET LOCALE LANGUAGE 'S'.
  
  WHEN OTHERS.
    RETURN.

ENDCASE.
 
CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'LANGUAGE'
  EXPORTING
    tcode = 'SESSION_MANAGER'.

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.
/* POPUP INI */ /* POPUP FIM */