quarta-feira, 7 de janeiro de 2026

Adicionar MESES, DIAS ou ANOS - classe xco_cp_time

DATA(lv_start_date) = xco_cp_time=>date( iv_year = is_xml_values-data_concl_germ(4)

iv_month = is_xml_values-data_concl_germ+4(2)

iv_day = is_xml_values-data_concl_germ+6(2) ).


DATA(lv_new_date_obj) = lv_start_date->add( iv_month = CONV i( ls_cultura-meses_venc ) io_calculation = xco_cp_time=>date_calculation->ultimo ).

DATA(lv_new_date) = replace( val = lv_new_date_obj->as( xco_cp_time=>format->iso_8601_extended )->value pcre = '\-' with = ' ' occ = 0 ).

AMDP - Chamada de método sem criar CDS

 CLASS zcl_bloqueio_miro_tm DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .
  PUBLIC SECTION.

    TYPES: BEGIN OF ty_services,
             srvpos TYPE esll-srvpos,
           END OF ty_services.
    TYPES: tty_services TYPE STANDARD TABLE OF ty_services WITH DEFAULT KEY.

    INTERFACES if_amdp_marker_hdb.

    CLASS-METHODS check_bloqueio IMPORTING iv_sheet_service TYPE essr-lblni
                                 CHANGING  cs_invfo         TYPE invfo
                                           cs_bseg          TYPE bseg.
    CLASS-METHODS get_service IMPORTING VALUE(iv_sheet_service) TYPE essr-lblni
                              EXPORTING VALUE(et_service_nr)    TYPE tty_services.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.


CLASS zcl_bloqueio_miro_tm IMPLEMENTATION.

  METHOD check_bloqueio.
    TRY.
        get_service( EXPORTING
                        iv_sheet_service = iv_sheet_service
                      IMPORTING
                        et_service_nr    = DATA(lt_services) ).
      CATCH cx_amdp_error INTO DATA(lx_error).
    ENDTRY.
    CHECK lt_services[] IS NOT INITIAL.
    SELECT sign, opti, lpad( low, 18, '0' ) AS low  , lpad( high, 18, '0' ) AS high
      FROM tvarvc
     WHERE name = 'ZTM_TIPOSERVICO_BLOQUEIO'
     INTO TABLE @DATA(lt_tipo_servico).
    CHECK sy-subrc = 0 AND lt_tipo_servico[] IS NOT INITIAL.
    CHECK lt_services[ 1 ]-srvpos IN lt_tipo_servico.
    cs_invfo-zlspr = 'Y'.
    cs_bseg-zlspr = 'Y'.
  ENDMETHOD.

  METHOD get_service BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS
             READ-ONLY USING essr esll.
    DECLARE lv_sub_packno "$ABAP.type( PACKNO )";
    lt_sub_packno = SELECT DISTINCT SUB_PACKNO
                     FROM essr
                          INNER JOIN esll
                          on esll.packno = essr.packno
                     WHERE lblni = :iv_sheet_service;
    IF record_count( :lt_sub_packno ) > 0 then
        lv_sub_packno = :lt_sub_packno.SUB_PACKNO[ 1 ];
        et_service_nr = SELECT DISTINCT srvpos
                          from esll
                         where esll.packno = :lv_sub_packno ;
    end if;
  ENDMETHOD.

ENDCLASS.

quinta-feira, 4 de dezembro de 2025

Função quebra de texto string em tamanho definido

           CALL FUNCTION 'SOTR_SERV_STRING_TO_TABLE'

            EXPORTING

              text                = lr_struct_srv->ztexto_longo

              flag_no_line_breaks = ''

              line_length         = 132

            TABLES

              text_tab            = lt_line.                  " Text Table


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