sábado, 17 de fevereiro de 2024

RAP - Facets(Object list page) - Várias formas

 Adicionando campos no cabeçalho.



Resultado











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

Adionando abas 




Resultado



















=================================
Adicionando outra lista no object pages
- Primeiro passo criar uma entidade da lista que vai ser criado, no meu caso os impostos de um item da NF

@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Impostos '
define root view entity ZI_Impostos
  as select from I_BR_NFTax

{

  key BR_NotaFiscal               as Docnum,
  key BR_NotaFiscalItem           as Itmnum,
  key BR_TaxType                  as Taxtype,
  key TaxGroup                    as TaxGrp,
      @Semantics.amount.currencyCode: 'Currency'
      BR_NFItemBaseAmount         as Base,
      BR_NFItemTaxRate            as Rate,
      @Semantics.amount.currencyCode: 'Currency'
      BR_NFItemTaxAmount          as TaxValue,
      BR_NFItemExcludedBaseAmount as ExcBase,
      @Semantics.amount.currencyCode: 'Currency'
      BR_NFItemOtherBaseAmount    as OthBas,
      SalesDocumentCurrency       as Currency

}

Criei uma projection view tbm mas não sei se é necessário

@EndUserText.label: 'Impostos da Nota Fiscal Importação (Projection)'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
define root view entity ZC_Impostos
  provider contract transactional_query
  as projection on ZI_Impostos
{
  key Docnum,
  key Itmnum,
  key Taxtype,
  key TaxGrp,
      Base,
      Rate,
      TaxValue,
      ExcBase,
      OthBas,
      Currency
}

Criei um METADATA
@Metadata.layer: #CORE
annotate entity ZC_Impostos with
{
  @UI:{ lineItem: [{ position: 10 }] }
  @EndUserText.label: 'Tipo Imposto'
  Taxtype;
  @UI:{ lineItem: [{ position: 20 }] }
  @EndUserText.label: 'Grupo Imposto'
  TaxGrp;
  @UI:{ lineItem: [{ position: 30 }] }
  @EndUserText.label: 'Base'
  Base;
  @UI:{ lineItem: [{ position: 40 }] }
  @EndUserText.label: 'Taxa'
  Rate;
  @UI:{ lineItem: [{ position: 50 }] }
  @EndUserText.label: 'Valor Imposto'
  TaxValue;
  @UI:{ lineItem: [{ position: 60 }] }
  @EndUserText.label: 'Base excluída'
  ExcBase;
  @UI:{ lineItem: [{ position: 70 }] }
  @EndUserText.label: 'Outras Bases'
  OthBas;
  @UI:{ lineItem: [{ position: 80 }] }
    @EndUserText.label: 'Moeda'
  Currency;

}

Fiz a associação a minha projection principal 
@EndUserText.label: 'Dados gestão importação (projection)'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
define root view entity ZC_DadosGestaoImportacao
  provider contract transactional_query
  as projection on ZI_DadosGestaoImportacao
  association [0..*] to ZC_Impostos as _ImpList on $projection.docnum = _ImpList.Docnum
                                                     and $projection.itmnum = _ImpList.Itmnum  

{
  key zuonr,
  key belnr,
  key gjahr,
  key buzei,
      bldat,
      budat,
      usnam,
      xblnr,
      bukrs,
      --@ObjectModel.foreignKey.association: '_Lfa1'
      @ObjectModel.text.element: ['NomeFornecedor']
      lifnr,
      waers,

      _ImpList
    
No METADATA principal criei o facet para associação
-- TAB dados Impostos
  {
      id: 'Impostos',
      purpose: #STANDARD,
      type: #LINEITEM_REFERENCE,
      label: 'Impostos',
      position: 50,
      targetElement: '_ImpList'

  }
  ]

E não esquecer de adicionar a entidade no SERVICE DEFINITION
@EndUserText.label: 'Dados de Gestao de importação'
define service ZSD_DadosGestaoImportacao {
  expose ZC_DadosGestaoImportacao;
  expose ZC_Impostos;
}

Resultado















segunda-feira, 12 de fevereiro de 2024

Collect usando FOR IN GROUPS

Código exemplo abaixo, pegando dados de remessa

sELECT likp~vbeln,

       likp~ernam,

       lips~matnr,
       lips~lfimg
  INTO TABLE @DATA(lt_likp)

  FROM likp INNER JOIN lips ON lips~vbeln = likp~vbeln
 WHERE likp~lfart = 'ZVME'.

"Criar estrutura que quer fazer a somatória
TYPES: BEGIN OF ty_rem,
         matnr TYPE lips-matnr,
         lfimg TYPE lips-lfimg,
       END OF ty_rem.

TYPES ty_t_rem TYPE TABLE OF ty_rem WITH DEFAULT KEY.

DATA w_lips TYPE ty_rem.

BREAK-POINT.

DATA(lt_lips) = VALUE ty_t_rem( FOR GROUPS w_lips_x OF <ls_collect> IN lt_likp
                     GROUP BY ( matnr = <ls_collect>-matnr )
                     LET coll_line = REDUCE #( INIT ls_sum TYPE ty_rem
                                                      FOR ls_sum_likp IN GROUP w_lips_x
                                                        NEXT ls_sum-lfimg = ls_sum-lfimg + ls_sum_likp-lfimg
                                                             ls_sum-matnr = ls_sum_likp-matnr
                                                        ) IN ( coll_line ) ).
BREAK-POINT.



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

LOOP COM GROUPS

types: begin of ty_doc,

bukrs type bukrs,

belnr type belnr_d,

gjahr type gjahr,

buzei type buzei,

end of ty_doc.


data t_doc type STANDARD TABLE OF ty_doc WITH DEFAULT KEY.


t_doc = value #(

( bukrs = '1000' belnr = '1' gjahr = '2025' buzei = 1 )

( bukrs = '1000' belnr = '1' gjahr = '2025' buzei = 2 )

( bukrs = '1000' belnr = '1' gjahr = '2025' buzei = 3 )

( bukrs = '1000' belnr = '2' gjahr = '2025' buzei = 1 )

( bukrs = '1000' belnr = '3' gjahr = '2025' buzei = 1 )

( bukrs = '1000' belnr = '3' gjahr = '2025' buzei = 2 )


( bukrs = '2000' belnr = '4' gjahr = '2025' buzei = 1 )

( bukrs = '2000' belnr = '5' gjahr = '2025' buzei = 1 )

( bukrs = '2000' belnr = '6' gjahr = '2025' buzei = 1 )


( bukrs = '3000' belnr = '7' gjahr = '2025' buzei = 1 )

( bukrs = '3000' belnr = '7' gjahr = '2025' buzei = 2 )

( bukrs = '3000' belnr = '8' gjahr = '2025' buzei = 1 )


).


BREAK-POINT.


loop at t_doc into data(ls_doc) GROUP BY ls_doc-bukrs into data(lv_bukrs).


loop at group lv_bukrs into data(lv_docs).


if 1 = 1.


endif.


endloop.


endloop.

segunda-feira, 5 de fevereiro de 2024

Leitura de dados de estrutura BOPF

 Transações importantes

BOBX - Estruturas dos BOPF

BOBT - Teste de estrutura BOPF

Ex: /SCMTMS/TOR

Transação BOBX

- Clicar na estrutura desejada








BOBT - teste de query

Do lado esquerdo na BOBT tem as queries disponíveis.

Do lado direito na BOBX a localização das querys disponíveis na visão de estrutura

















Pegando exemplo de dados da remessa na query PLANNING_ATTRIBUTES

Registros encontrados





Fazendo pelo código do programa

"Service Manager
DATA(lo_srv_mgr/bobf/cl_tra_serv_mgr_factory=>get_service_manager/SCMTMS/IF_TOR_C=>sc_bo_key ).

DATA(lv_bo_name/SCMTMS/IF_TOR_C=>sc_bo_name.

data(lv_attname=  /SCMTMS/IF_TOR_C=>sc_query_attribute-root-planning_attributes-trq_base_btd_id.

*"Selection Parameters
DATA(lt_selparVALUE /bobf/t_frw_query_selparamattribute_name lv_attname
                                                      sign 'I'
                                                      option 'EQ'
                                                      low '0080000180' ).

*"Query key

data lt_key TYPE /BOBF/T_FRW_KEY.
data lt_docref type /scmtms/t_tor_root_k.

"Execução da query
lo_srv_mgr->queryEXPORTING iv_query_key /scmtms/if_tor_c=>sc_query-root-planning_attributes
                             "it_filter_key =
                             it_selection_parameters lt_selpar
                             "is_query_options =
                             iv_fill_data abap_true
                             "it_requested_attributes =
                   IMPORTING "eo_message = DATA(lo_message)
                      et_key lt_key
                      et_data lt_docref
                      ).


====== Abaixo de onde vem as informações na BOBX











====== Para ler os dados da estrutura abaixo do ROOT.

Transação BOBT













=========  Código ==========

Como faz parte da estrutura ROOT pega os dados a partir das chaves retornadas da leitura do root

DELETE lt_key WHERE key not in lt_r_key.

data lt_doc_tr type /SCMTMS/T_TOR_ITEM_TR_K.

  lo_srv_mgr->retrieve_by_association(
      EXPORTING
        iv_node_key             /scmtms/if_tor_c=>sc_node-root
        it_key                  lt_key                             " Key Table
        iv_edit_mode            /bobf/if_conf_c=>sc_edit_read_only " Change Mode
        iv_fill_data            abap_true                          " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
        iv_association /scmtms/if_tor_c=>sc_association-root-item_tr_main
      IMPORTING
        "eo_message              = lo_message                         " Interface of Message Object
        et_data                 lt_doc_tr
        et_failed_key           DATA(lt_failed_key)                " Key Table
    ).










E assim sucessivamente, com outras estruturas sob o mesmo nó

data lt_doc_tr_seal type /SCMTMS/T_TOR_SEAL_K.

  lo_srv_mgr->retrieve_by_association(
      EXPORTING
        iv_node_key             /scmtms/if_tor_c=>sc_node-root
        it_key                  lt_key                             " Key Table
        iv_edit_mode            /bobf/if_conf_c=>sc_edit_read_only " Change Mode
        iv_fill_data            abap_true                          " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
        iv_association /scmtms/if_tor_c=>sc_association-root-seal
      IMPORTING
        "eo_message              = lo_message                         " Interface of Message Object
        et_data                 lt_doc_tr_seal
        et_failed_key           lt_failed_key                " Key Table
    ).

data lt_doc_tr_item type /SCMTMS/T_TOR_ITEM_TR_K.

  lo_srv_mgr->retrieve_by_association(
      EXPORTING
        iv_node_key             /scmtms/if_tor_c=>sc_node-root
        it_key                  lt_key                             " Key Table
        iv_edit_mode            /bobf/if_conf_c=>sc_edit_read_only " Change Mode
        iv_fill_data            abap_true                          " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
        iv_association /scmtms/if_tor_c=>sc_association-root-item_tr
      IMPORTING
        "eo_message              = lo_message                         " Interface of Message Object
        et_data                 lt_doc_tr_item
        et_failed_key           lt_failed_key                " Key Table
    ).



quinta-feira, 1 de fevereiro de 2024

REDUCE com concatenação de texto

 TYPES: BEGIN OF ttt,
         item  TYPE posnr,
         texto TYPE char10,
       END OF ttt.
TYPES ttt_t TYPE TABLE OF ttt WITH DEFAULT KEY.
DATA lt_t TYPE ttt_t .

lt_t  = value #(
             ( ITEM = '10' texto = 'A' )
             ( ITEM = '20' texto = 'B' )
             ( ITEM = '30' texto = 'C' )
             ( ITEM = '40' texto = 'D' )
             ( ITEM = '50' texto = 'E' )
             ( ITEM = '60' texto = 'F' )
             ( ITEM = '70' texto = 'G' )
             ) .
BREAK-POINT.
data lv_texto type string.
lv_texto = reduce string( init lv_text = lv_texto lv_sep = ''
                               for ls_ttt in lt_t  NEXT lv_text = |{ lv_text }{ lv_sep }{ ls_ttt-texto }| lv_sep = ',' ).

=============   RESULTADO



segunda-feira, 4 de dezembro de 2023

DUMP VBFA - duplicated key - BAPI BAPI_SALESORDER_CREATEFROMDAT2

 - Caso estranho onde tenho um programa que executa uma remessa VL01NO em batch input e depois a criação de ordem de venda pela BAPI BAPI_SALESORDER_CREATEFROMDAT2, ocorre um DUMP de chave duplicada na atualização da VBFA


Coisa muita estranha, onde analisando o DUMP percebi que nessa tabela DA_XVBFAI no conteúdo tinha 2 registros onde 1 era a ordem em si q estava criando e a outra a remessa que tinha criado anteriormente no batch input.   

Pesquisando no SDN achei o mesmo problema, que se resolveu utilizando a função RV_DELIVERY_INIT antes da execução da BAPI



segunda-feira, 6 de novembro de 2023

CSD/AMDP - Erro ao criar AMDP, CDS standard com erro de mandante especifico deve ser informado

 Informar os parâmetros.

@ClientHandling.type: #CLIENT_DEPENDENT
@ClientHandling.algorithm: #SESSION_VARIABLE
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Teste'
define table function ZZZ_TESTE
  with parameters
    @Environment.systemField: #CLIENT
    client       : abap.clnt,
    p_dtbase     : datum,
    p_where_part : abap.char( 500 ),
    p_where_trfi : abap.char( 255 )
returns
{
  client     : abap.clnt;
  rfha       : tb_rfha;
  bukrs      : bukrs;
  KONTRH     : tb_kunnr_new;
  tp_prod    : vvsart;
  tp_trfi    : tb_sfhaart;
  observacao : zdetrm_observacao;
  banco      : zdt_bankl;
  tp_mov     : tb_sfhazba;
  ano        : gjahr;
  valor      : tb_bzbetr;
}
implemented by method
  zcl_cds_teste=>execute_db;

============== ERRO/SOLUÇÃO 17/04/2026 
Começou a dar um erro numa AMDP que até então não tinha acontecido conforme eu estava criando antes.
O erro foi esse aqui 

Error in entity 'ZI_XXXX(CDS)': Visão CDS ZI_CCXXXXX contém parâmetro com SY-MANDT, que não está oculto.


Para resolver adicionei uma annotation para ocultar o campo 

@ClientHandling.type: #CLIENT_DEPENDENT

@ClientHandling.algorithm: #SESSION_VARIABLE

@EndUserText.label: 'Busca Centro cooperado'

define table function ZI_CCXXXXX 

with parameters

@Consumption.hidden: true

@Environment.systemField: #CLIENT

client : abap.clnt

returns

{

@Consumption.hidden: true

client : abap.clnt;

partner : bu_partner;

centro : abap.char(6);

}

implemented by method

zcl_fi_CC_XXXXXX=>get_centro;



============== ERRO/SOLUÇÃO 23/05/2026
Erro na ativação só q somente de classe AMDP O mesmo de client

Na declaração colocar o parâmetro com opçoes amdp


CLASS zcl_TESTE_AMDP DEFINITION

PUBLIC

FINAL

CREATE PUBLIC .


PUBLIC SECTION.


INTERFACES if_amdp_marker_hdb .


TYPES: BEGIN OF ty_doc_fi,

accounting_document TYPE bseg-belnr,

fiscal_year TYPE bseg-gjahr,

END OF ty_doc_fi,


tty_doc_fi TYPE STANDARD TABLE OF ty_doc_fi WITH DEFAULT KEY.



CLASS-METHODS get_dados_doc_ref AMDP OPTIONS CDS SESSION CLIENT iv_client

IMPORTING VALUE(iv_company) TYPE bseg-bukrs

VALUE(iv_acc_doc) TYPE bseg-belnr

VALUE(iv_fiscal_year) TYPE bseg-gjahr

VALUE(iv_client) TYPE sy-mandt

EXPORTING VALUE(et_doc_fi) TYPE tty_doc_fi.


PROTECTED SECTION.

PRIVATE SECTION.

ENDCLASS.