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

Conteúdo

ALV com Layout informado na tela de parâmetros

Basicamente você escolhe o layout do relatório já na tela de parâmetros.

Para isto é necessário que antes você tenha gravado um layout, claro!


REPORT ZSAPeiros.
* Global Declarations
DATA:
  gs_key      TYPE salv_s_layout_key,
  gs_layouts  TYPE salv_s_layout_info,
  gs_layout   TYPE lvc_s_layo,
  gt_saida    TYPE TABLE OF mara,
  gt_fieldcat TYPE lvc_t_fcat,
  gs_variant  TYPE disvariant.

* Parameters
PARAMETERS p_layout TYPE slis_vari.

* Action for Layout parameter field
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
  gs_key-report = sy-repid.
  gs_layouts    = cl_salv_layout_service=>f4_layouts( s_key = gs_key
                                                      restrict = '1' ).
  p_layout      = gs_layouts-layout.

START-OF-SELECTION.
* Populate Data Report
  SELECT * UP TO 10 ROWS FROM mara INTO TABLE gt_saida.

  IF sy-subrc IS INITIAL.
    SORT gt_saida BY matnr.
  ENDIF.

* Layout
  gs_layout-col_opt    = abap_true.
  gs_layout-zebra      = abap_true.

* Layout Variant
  gs_variant-report    = sy-repid.
  gs_variant-variant   = p_layout.

* Get fields from structure/table
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'MARA'
      i_client_never_display = abap_true
    CHANGING
      ct_fieldcat            = gt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

* Display ALV Report Data
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fieldcat
      i_save             = abap_true
      is_variant         = gs_variant
    TABLES
      t_outtab           = gt_saida[]
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.

  IF sy-subrc IS NOT INITIAL.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

Popup no estilo Standard com dados da tabela BAPIRET2

Montar um ALV só pra mostrar o os erros que retornaram na tabela BAPIRET?

Ou pensar em algo mirabolante num popup todo incrementado?

Para! É só usar UMA linha de código para ter este resultado:


REPORT SAPeiros.

DATA lt_return TYPE bapiret2_tab.

APPEND INITIAL LINE TO lt_return ASSIGNING FIELD-SYMBOL(<fs_return>).
<fs_return>-type   = 'E'.
<fs_return>-id     = '00'.
<fs_return>-number = 2.

APPEND INITIAL LINE TO lt_return ASSIGNING <fs_return>.
<fs_return>-type   = 'E'.
<fs_return>-id     = '00'.
<fs_return>-number = 4.

APPEND INITIAL LINE TO lt_return ASSIGNING <fs_return>.
<fs_return>-type       = 'E'.
<fs_return>-id         = '00'.
<fs_return>-number     = 60.
<fs_return>-message_v1 = 'MARA'.
<fs_return>-message_v2 = '1000'.
<fs_return>-message_v3 = '9999'.

cl_rmsl_message=>display( lt_return ).

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.

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
...

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!

Copiar request entre mandantes (Configurações, SapScript, TVARV, etc)


Na maioria dos casos, o cliente possui 2 ou mais mandantes de DEV. Um você usa para codificar e outro para testar. Veja, mandante é diferente de ambiente. Estamos falando de direcionamento de banco de dados. Se não sabe esta diferença não continue a leitura.

A parte de desenvolvimento, se replica automaticamente entre todos os mandantes de DEV, mas, formulários SapScript, TVARV, e algumas configurações, não.

Para isto, você precisa copiar o conteúdo da request para outro mandante, conforme os passos abaixo:

1-Logue no ambiente de destino;
2-Acesse a transação SCC1;
3-Escolha o mandante de onde quer copiar;
4-Informe a request e marque para incluir tarefas subordinadas;
5-Clique em Iniciar imediatamente.

Feito isto sua request será copiada.

Caso não funcione, verifique com a equipe de BASIS se a "Porta Lógica" está aberta.

Tabela interna dentro de tabela interna


Nada mais é que uma tabela interna onde além de campos convencionais, tem outra tabela interna.

REPORT ZSAPeiros.

* A idéia é selecionar a VBAP, e retornar em UMA ÚNICA LINHA da tabela interna T_DADOS,
* o documento VBELN e TODOS os materiais com descrição do documento selecionado

* Definição da tabela com material e descrição
TYPES:
  BEGIN OF ty_matnrs,
    matnr               TYPE          mara-matnr, "Material
    maktx               TYPE          makt-maktx, "Descrição
    END OF ty_matnrs.

* Definição da tabela com documento e tabela de materiais
DATA: BEGIN OF t_dados OCCURS 0.
DATA:   vbeln           TYPE          vbap-vbeln. "Documento
DATA:   matnrs          TYPE TABLE OF ty_matnrs.  "Tabela de materiais
DATA: END OF t_dados.

* Declaração de tabelas internas diversas
DATA:
  t_matnrs              TYPE TABLE OF ty_matnrs,  "Tabela de materiais
  w_matnrs              TYPE          ty_matnrs,  "Tabela de materiais
  t_makt                TYPE TABLE OF makt,       "Material/Descrição
  w_makt                TYPE          makt,       "Material/Descrição
  t_vbap                TYPE TABLE OF vbap,       "Tabela VBAP
  w_vbap                TYPE          vbap.       "Estrutura VBAP

* Parâmetros
PARAMETERS p_vbeln TYPE vbap-vbeln.


* Seleção dos dados
START-OF-SELECTION.

  SELECT *
    FROM vbap
    INTO TABLE t_vbap
   WHERE vbeln EQ p_vbeln.

  IF sy-subrc IS INITIAL.

    SELECT *
      FROM makt
      INTO TABLE t_makt
       FOR ALL ENTRIES IN t_vbap
     WHERE matnr EQ t_vbap-matnr
       AND spras EQ sy-langu.

    IF sy-subrc IS INITIAL.
      SORT t_makt BY matnr.
    ENDIF.

    LOOP AT t_vbap INTO w_vbap.

* Monta tabela com campos matnr e maktx
      READ TABLE t_makt
            INTO w_makt
        WITH KEY matnr = w_vbap-matnr
                 BINARY SEARCH.

      IF sy-subrc IS INITIAL.
        w_matnrs-matnr = w_vbap-matnr.
        w_matnrs-maktx = w_makt-maktx.
        APPEND w_matnrs TO t_matnrs.
      ENDIF.

    ENDLOOP.

* Popula tabela T_DADOS com documento VBELN e TABELA de materiais
    t_dados-vbeln    = p_vbeln.
    t_dados-matnrs[] = t_matnrs[].
    APPEND t_dados.

  ENDIF.

  BREAK-POINT.

Qual a transação de manutenção daquela tabela com SM30 mesmo?


A questão é simples: Tem uma transação que atualiza uma tabela, via SM30, mas não lembro qual é.

Simples, acesse a tabela TSTCP pela SE16 ou SE16N, coloque no PARAM *nomedatabela*.

Pronto! O campo TCODE é a transação que procura.

Procurar/Localizar por conteúdo


Google?  kkkkkkkkkkkkkkkkkkkkkk  #SQN

A questão é simples: Como encontrar um conteúdo/texto específico dentro de programas SAP?

A transação mágica é a EWK1 ou o programa RS_ABAP_SOURCE_SCAN, ambos intuitivos e não requerem explicações.

Alterando as Conditions usando BAPI_SALESORDER_CHANGE

Muitas pessoas tem dificuldades na hora de alterar o valor da condition ao executar a BAPI_SALESORDER_CHANGE.

A solução é muito simples! Basta preencher os campos COND_ST_NO e COND_COUNT.

Importante: Isto só deve ser feito quando for uma alteração no valor da condition!!! Se for inclusão ou deleção não precisa. Bastando informar apenas o item, tipo, valor e D (Deleção) ou I (inclusão).
* Primeiro você precisa ir na VBAK e retornar o valor do campo KNUMV
  SELECT SINGLE knumv
    FROM vbak
    INTO v_knumv
   WHERE vbeln EQ v_vbeln.

  IF sy-subrc IS INITIAL.

* Depois é só retornar o valor dos campos STUNR e ZAEHK
    SELECT SINGLE stunr zaehk
      FROM konv
      INTO (v_cond_st_no,v_cond_count)
     WHERE knumv EQ v_knumv 
       AND kposn EQ w_conditions-itm_number
       AND kschl EQ w_conditions-cond_type.

    IF sy-subrc IS INITIAL.

* Valores
      w_conditions_in-itm_number = '00010'.
      w_conditions_in-cond_st_no = v_cond_st_no.
      w_conditions_in-cond_count = v_cond_count.
      w_conditions_in-cond_type  = 'ZZZZ'.
      w_conditions_in-cond_value = '1000'.
      APPEND w_conditions_in TO t_conditions_in.
      CLEAR  w_conditions_in.

* Campos a serem alterados
      w_conditions_inx-updateflag = 'U'.
      w_conditions_inx-itm_number = w_conditions_in-itm_number.
      w_conditions_inx-cond_st_no = w_conditions_in-cond_st_no.
      w_conditions_inx-cond_count = w_conditions_in-cond_count.
      w_conditions_inx-cond_type  = w_conditions_in-cond_type.
      w_conditions_inx-cond_value = 'X'.
      APPEND w_conditions_inx TO t_conditions_inx.
      CLEAR  w_conditions_inx.

    ENDIF.

  ENDIF.

Modificar vários dados de uma tabela interna numa paulada só


Numa paulada só você altera TODOS os valores de uma tabela interna para o valor desejado.

Veja ai a importância do WHERE.

REPORT ZSAPeiros.

* TABELAS/ESTRUTURAS INTERNAS ------------------------------------------
DATA:
  t_makt          TYPE TABLE OF makt,             "Texto breve material
  w_makt          TYPE          makt.             "Texto breve material

* Selecionar textos breves de materiais
SELECT * UP TO 10 ROWS
  FROM makt
  INTO TABLE t_makt.

* Modifirar todas as descrições dos materiais que estiverem em branco
IF sy-subrc IS INITIAL.

  w_makt-maktx = 'SAPeiros'.

  MODIFY t_makt
    FROM w_makt TRANSPORTING maktx
   WHERE maktx IS INITIAL.

ENDIF.

Alterando o texto do Centro e demais campos


Digamos que o campo Centro te lembra Centro de Macumba. Zuado seu pensamento heim!

Bom, vc quer alterar de Centro para Loja.

Ai você vai logo pensando em Tradução ou já ir metendo o dedo na Tela!!! Ei, eu disse TELA!!!

Não faça isso! Faça da maneira correta, seguindo os passos abaixo:

1. Entre na transação WB01 e copie o elemento de dados do campo Centro.
- Não sabe o que é elemento de dados? Pare de ler e clique aqui.

2. Com o elemento de dados em mãos, entre na transação CMOD.

3. Navegue pelo menu -> Ir para -> Ampliações globais -> Palavras-chave -> Modificar.

4. Coloque o idioma e o nome do elemento de dados que você copiou.

5. Altere o conteúdo de Centro para Loja de todos os campos e clique em gravar.

Exemplo transação WB01 ANTES:


Exemplo transação WB01 DEPOIS:



PÉRA!!! NÃO FUNCIONOU!!!

Muito bem, aposto que vc colocou WERKS_D no elemento de dados. Acertei? Bom mané, tutorial é feito para ser seguido.

Vai fazendo as coisas no achismo e vc vai se dar muito bem!!!

Formas de se debugar - SM50 - Loop infinito

Muitos processos são executados em background, é como se fosse "por debaixo dos panos", e com certeza, se você é notavo, ou está com lapso de memória, já deve ter percebido que aquele ponto de parada ou até mesmo aquele BREAK-POINT forçado no código simplesmente foi ignorado. Existe uma maneira simples de resolver... Loop infinito!!! Mas cuidado, após testar não esqueça de remover o código, senão o processo nunca mais chegará ao fim.

Primeiro adicione o loop infinito no ponto onde vai iniciar seu debug, conforme abaixo. Após isto vá na SM50 e encontre seu processo. Clique em Administração > Programa > Debug. Clique em Sim na mensagem que irá aparecer. Vai cair no loop que você criou. Agora basta alterar a variável que sai do loop infinito e pronto. Continue seu debug.

REPORT ZSAPeiros.

DATA lv_break TYPE c VALUE 'X'.
TABLES mara.
DO.
  SELECT SINGLE * FROM mara.
  IF lv_break = ''.
    EXIT.
  ENDIF.
ENDDO.

--- SM50 ---

--- Seu código ---


Marretando tabelas - SE16 / SE16N

NÃO, você não precisa do martelo do Thor para marretar tabelas.

Marretar tabelas nada mais é do que alterar, criar ou eliminar dados de uma tabela na mão, ou seja, dar /H e sair fazendo

Então, bóra aprender, ou relembrar, a marretar:

- MODO 1) OLD SCHOOL - SE16:
- Acesse a transação SE16;
- Coloque os parâmetros e mande visualizar os dados;
- Selecione os dados que deseja alterar, pode ser mais que um;
- Dê 2 cliques em qualquer uma das linhas onde você vai alterar;
- Agora vem a perte boa, dê um /H e Enter;
- Altere o valor do CODE para EDIT, e então poderá alterar os dados da tabela que não são chave da mesma.
- Os demais codes não preciso nem falar nada né, (não sabe inglês básico, sai do SAP por favor). Bom, tem um Code interessante que é o ANVO, ele duplica a linha selecionada.

Mas pesquise bem, pois existem maneiras corretas de alterar dados de tabelas, como por exemplo a tabela KONV, onde existe a função KONV_UPDATE, que faz a alteração de maneira correta dos dados da mesma.

- MODO 2) 4 BABYES - SE16N:
- Acesse a transação SE16N;
- Coloque os parâmetros e mande visualizar os dados;
- Na linha de comando, digite: &SAP_EDIT;
- Pronto, sua SE16N virou um lindo relatório ALV editável.

Muito cuidado!!! Isto pode levar à sua demissão por justa causa se realizar este tipo de operação em ambiente produtivo ou que não seja de testes.

Debugar Popup

Dar /h é fácil né... Quero ver fazer isto num Popup!
Simples, salve o arquivo e basta arrastar o arquivo TXT para sua janela Popup.


Ou se preferir, copie e cole o conteúdo abaixo em um arquivo TXT e arraste-o para seu Popup.

[FUNCTION]
Command=/H
Title=Debugger
Type=SystemCommand
/* POPUP INI */ /* POPUP FIM */