terça-feira, 25 de novembro de 2025

Processamento de execução em background task esperando por commit

 FUNCTION zfmmm_inforecord_maintain_m

IMPORTING

VALUE(iv_task) TYPE string

TABLES

ct_eina TYPE mewieina_mig_t OPTIONAL

ct_einax TYPE mewieinax_t OPTIONAL

ct_eine TYPE mewieine_t OPTIONAL

ct_einex TYPE mewieinex_t OPTIONAL

ct_txt_lines TYPE mewipirtext_tt OPTIONAL

ct_cond_validity TYPE mewivalidity_tt OPTIONAL

ct_condition TYPE mewicondition_tt OPTIONAL

ct_cond_scale_value TYPE mewiscaleval_tt OPTIONAL

ct_cond_scale_quan TYPE mewiscalequan_tt OPTIONAL

ct_return TYPE fs4mig_t_bapiret2 OPTIONAL.




DATA: lt_return TYPE fs4mig_t_bapiret2.


DATA: lv_infnr TYPE eina-infnr.


gv_esperar = abap_false.


CALL FUNCTION 'ZFMMM_INFORECORD_MAINTAIN_MULT'

DESTINATION 'NONE'

STARTING NEW TASK iv_task

PERFORMING f_recebe_dados_operacao ON END OF TASK

TABLES

ct_eina = ct_eina

ct_einax = ct_einax

ct_eine = ct_eine

ct_einex = ct_einex

ct_cond_validity = ct_cond_validity

ct_condition = ct_condition

ct_return = ct_return.


WAIT FOR ASYNCHRONOUS TASKS

UNTIL gv_esperar = abap_true.


*

ct_return[] = gt_return[].


CLEAR: lv_infnr.

READ TABLE ct_return ASSIGNING FIELD-SYMBOL(<lf_return>)

WITH KEY type = 'S'

id = '06'

number = '331'.

IF sy-subrc = 0.

lv_infnr = <lf_return>-message_v1.

DO 10 TIMES.

SELECT COUNT(*)

FROM eina

INNER JOIN eine

ON eina~infnr = eine~infnr

WHERE eina~infnr = lv_infnr.

IF sy-subrc = 0.

EXIT.

ENDIF.

WAIT UP TO 1 SECONDS.

ENDDO.

ENDIF.


ENDFUNCTION.





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

FORM f_recebe_dados_operacao USING iv_taskname.

DATA: lt_return TYPE TABLE OF fs4mig_s_bapiret2.


CLEAR gt_return.


RECEIVE RESULTS FROM FUNCTION 'ZFMMM_INFORECORD_MAINTAIN_MULT'

TABLES

ct_return = lt_return


EXCEPTIONS

resource_failure = 1

system_failure = 2

communication_failure = 3.


APPEND LINES OF lt_return TO gt_return.

ENDFORM.






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;