segunda-feira, 3 de novembro de 2025

RAP - Deixar coluna da lista com somatório - somente para oData V2

Para oDataV4 , ocorre um erro ao tentar carregar os dados. Se procurar no SDN tem um post sobre esse erro e uma resposta que no V4 somente utilizando as annotations para analytics, link abaixo


https://community.sap.com/t5/technology-q-a/rap-view-entity-analytical-table-with-subtotals-totals-in-list-report-sap/qaq-p/14118877


=== VIEW ENTITY

 @AbapCatalog.viewEnhancementCategory: [#NONE]

@AccessControl.authorizationCheck: #NOT_REQUIRED

@EndUserText.label: 'TESTE'

@Metadata.ignorePropagatedAnnotations: true

@ObjectModel.usageType:{

serviceQuality: #X,

sizeCategory: #S,

dataClass: #MIXED

}



define root view entity ZI_SZK1

as select from zszk_tab

{


key matnr as Matnr,

key status as Status,

waers as Waers,

@Semantics.amount.currencyCode: 'waers'

valor as Valor,

valor2 as Valor2

}




@AccessControl.authorizationCheck: #NOT_REQUIRED

@EndUserText.label: 'Projectoi'

@Metadata.ignorePropagatedAnnotations: true

@Analytics.dataCategory: #CUBE


@UI.presentationVariant : [{

groupBy : [ 'Matnr' ],

total : [ 'Valor' ],

visualizations: [{

type: #AS_LINEITEM,

element: 'Valor'

}]

}]


=== PROJECTION


define root view entity ZC_SZK1

provider contract transactional_query

as projection on ZI_SZK1

{


@UI.facet: [


{

purpose: #STANDARD,

type: #IDENTIFICATION_REFERENCE,

targetQualifier: 'DPBP',

position: 10


}]

@UI.lineItem: [{ position: 10 }]

@UI.identification: [{ position: 10 }]

key Matnr,

@UI.lineItem: [{ position: 20 }]

@UI.identification: [{ position: 20 }]

key Status,

// @UI.lineItem: [{ position: 30 }]

// @UI.identification: [{ position: 30 }]

@Semantics.currencyCode: true

Waers,

@UI.lineItem: [{ position: 40 }]

@UI.identification: [{ position: 40 }]

@Semantics.amount.currencyCode: 'Waers'

@Aggregation.default: #SUM

Valor,

@UI.lineItem: [{ position: 50 }]

@UI.identification: [{ position: 50 }]

@Aggregation.default: #SUM

Valor2

}



No VS Code selecionar a opção de LIST REPORT PAGE,  na seleção do tipo da tabela selecionar o Analytical





















quinta-feira, 23 de outubro de 2025

DRC - Inbound - Solução partição de lote

 Tudo dentro da badi  LE_SHP_DELIVERY_PROC

Tive q criar duas implementaçoes, uma para o processo de compra normal e outra para subcontratação

=== Compra normal

Método SAVE_DOCUMENT_PREPARE























































==== Subcontratação - Solução muito louco por que precisa carregar os objetos do DRC para subcontração, fiz uma herança da Implementação da badi da subcontratação

Implentei todos os métodos herdados para redefinição mas sem código, a idéia é q mesmo q passe pelos métodos não seja executado nada nem na minha implementação como na classe superior


















O único método implentado é o SAVE_DOCUMENT_PREPARE.



















terça-feira, 14 de outubro de 2025

RSM - Workflow flexivel - Adminstração de responsabilidade - Sales

Adicionando campo customizado para regra de aprovação na configuração da administração de responsabilidade ;

SM30  - ATM_V_ATTRIBUT_C

Lembrar q o nome da definição tem q começar com Z_*, existe validação interna 















2 - RSM_V_TC_S_ATR_C

Essa configuração é o q vai aparecer na tela do fiori 









3 - ATM_V_ATRC_CDS_C

Essa configuração acho q não é necessário pq a busca ai ser definida na BADI








4 - Criação de implementação de lógica personalizada no FIORI

Contexto SD_RSM_CONTEXT_ATTRIB_CALC

No caso o filtro somente para SALES































Observações.
Classes para debugar usuário de workflow - externo

CL_RSM_TEAM_ATTRIBUTE_UTILS

CL_RSM_BADI_IMPL_TEAM

CL_RSM_TEAM_ATTRIBUTE






quarta-feira, 24 de setembro de 2025

DRC - Pegar dados da NFe pelo xml

 Utilizar classe cl_edoc_br_nfe_entity 


Outra forma, tentei usar somente a classe  cl_edoc_br_nfe_entity mas as estruturas vieram em branco, da forma abaixo consegui dar um bypass

        DATA(lo_create_paramNEW cl_edoc_br_create_entity_paramiv_xml lv_file_raw ).

        DATA(lo_entitynew CL_EDOC_BR_NFE_ENTITY_CREATOR).

        TRY.
            lo_edoc_nfe  ?= lo_entity-if_edoc_br_create_entity~createlo_create_param ).
        ENDTRY.


terça-feira, 12 de agosto de 2025

RAP - Habilitar marcar/desmarcar todas as linhas no list report

Por default aparece apenas a caixainha para desmarcar tudo, para habilitar para marcar tudo tem q fazer pelo VS Code. Com uma ressalva que é selecionado somente as linhas q estão na tela, linhas ocultas não são selecionadas, nesse caso existe uma solução  mais porreta q não fiz mas fica o link abaixo

https://community.sap.com/t5/technology-blog-posts-by-members/how-to-select-all-rows-and-execute-custom-actions-on-a-list-report-like/ba-p/13984607 



quarta-feira, 6 de agosto de 2025

AMDP - Uso do RANK para filtrar apenas valor único de seleção

  METHOD executar BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS
  READ-ONLY USING I_CreditDecisionDocAttrib
                  c_outbdelivprocfloW
                  i_salesdocument
                  i_salesdocumentitem
                  i_salesdocitempricingelement.

    it_creddec = select client,
                        caseuuid as Id,
                        CreditDecisionObjectType as DecType,
                        CreditDecisionSalesDocument as DecDoc
                   from I_CreditDecisionDocAttrib as _CredDec
                  where client = session_context('CLIENT');
    it_condPag = SELECT _CredDec.client as Client,
                      _CredDec.Id as Id,
                      _SalesOrder.salesdocument as SalesDocument,
                      _SalesOrder.CustomerPaymentTerms as CondPag,
                      rank ( ) over ( partition by client, _CredDec.Id order by _CredDec.Id desc ) as rank
                 from :it_creddec as _CredDec
                     inner join i_salesdocument as _SalesOrder
                     on _SalesOrder.salesdocument = _CredDec.DecDoc
                where _CredDec.DecType = 'VBAK'
                 UNION ALL
            SELECT _CredDec.client as Client,
                   _CredDec.Id as Id,
                   _SalesOrder.salesdocument as SalesDocument,
                   _SalesOrder.CustomerPaymentTerms as CondPag,
                   rank ( ) over ( partition by client, _CredDec.Id order by _CredDec.Id desc ) as rank
                 from :it_creddec as _CredDec
                     inner join c_outbdelivprocflow as _Outb
                     on _Outb.outbounddelivery = _CredDec.DecDoc
                     inner join i_salesdocument as _SalesOrder
                     on _SalesOrder.salesdocument = _Outb.precedingdocument
                     and precedingdocumentcategory = 'C'
                where _CredDec.DecType = 'LIKP'
                  and EXISTS ( SELECT * FROM i_salesdocumentitem
                                       WHERE salesdocument = _Outb.PrecedingDocument
                                         and sddocumentrejectionstatus <> 'C' );


    RETURN select Client,
                  Id,
                  CondPag,
                  _CondPag.SalesDocument,
                  sum( _Pricing.conditionamount ) as ValorTotal
            from :it_condPag as _CondPag
                 left outer join i_salesdocitempricingelement as _Pricing
                   on _Pricing.salesdocument = _CondPag.salesdocument
                  and _Pricing.conditiontype = 'ZTOT'
           where rank = 1
             GROUP BY _CondPag.Client, _CondPag.Id, _CondPag.CondPag, _CondPag.SalesDocument;
endmethod.


=============================== 
Teve 1 vez q o rank não funcionou e usei o ROW_NUMBER,  a sintaxe é parecida
    t_main = select z.mandt,
                    z.product_id,
                    z.product_name,
                    LTRIM( z.product_quantity, '0' ) as product_quantity,
                    LTRIM( z.purchase_price, '0' ) as purchase_price,
                    LTRIM( z.selling_price, '0' ) as selling_price,
                    z.production_start_date,
                    z.production_end_date,
                    ROW_NUMBER ( ) OVER( PARTITION BY "PRODUCT_QUANTITY"  ) AS "ROW_NUMBER_PARTION_BY"
   from zdm_products_iy as z
    where z.mandt = clnt;





sábado, 21 de junho de 2025

Extension "Adminstrar Deferimentos de Crédito Documentado" - Business Context "UKM_CREDIT_DECISION_DOCUMENT"

 A SAP disponibiliza  um help para implementação lógica mas na sequência que ela fornece não é possível adicionar o campo adicional no APP.

Implementei o seguinte;

- Criei o campo lógico no App Custom Logic Field, no meu caso criei um campo adicional para condição de pagto e um de valor.

Segui as regras do Help para crição sem ativar nenhuma interface de usuário, na publicação nesse caso só gera os appends nas estruturas, se vc habilitar as interface de usuário vai criar as extensions sem possibilidade de modificação e a SAP não disponibiliza nenhum BADI standard para preenchimento dos campos.







Detalhe no campo de valor que cria 3 campos por causa da moeda.





    









Criei uma CDS para buscar as informações para preencher os campos.











Aí a mágica acontece, para esse app tem 2 CDS uma entity e uma projection.

- Criei a extension na enttity primeiro com o valor dos campos criados na custom logic fields







- Criei a extension para a projection.







- Crie a extension para o metadata






Ativar e seja feliz..