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
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
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.
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
=== 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
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.
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
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_param) = NEW cl_edoc_br_create_entity_param( iv_xml = lv_file_raw ).
DATA(lo_entity) = new CL_EDOC_BR_NFE_ENTITY_CREATOR( ).
TRY.
lo_edoc_nfe ?= lo_entity-if_edoc_br_create_entity~create( lo_create_param ).
ENDTRY.
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
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..
Transação SWO1
Adicionar parâmetros de importação se necessário, no meu caso eu precisei.
Adicionei 2 parâmetros tipo tabela.
Criei uma estrutura no dicionário para a tabela, qdo for tabela marcar que a estrutura vai ter várias linhas
Criar o evento q vai disparar o workflow
Assim como método adicionar parâmetros caso necessário, como no meu caso tenho no método, eu preciso fazer essa passagem no container qdo for fazer o binding do evento para o método, sendo assim eu crie os mesmos parâmetros do método no evento
Depois q fizer tudo alterar status do método e do evento como "Implementado" e depois para "Liberado"
Tem q ficar com esse check
== Passo 2 - Workflow
Criar a tarefa padrão primeiro - transação PFTC
Colocar a sigla o número da tarefa será gerado automaticamente
Informar os dados do BO conforme o que foi feito acima e marcar se é backgroune e se é síncrono
Em eventos acionadores informar o BO e o evento utilizado para disparar o worfkflow
Não esquece de ativar o fluxo do evento
Criar o modelo de workflow
Colocar um nome para sigla o número do modelo será gerado automaticamente.
Essa parte não sei precisa pq eu deixei desativado, e como deixei ativado na tarefa não faz sentido
Salvar e clicar no workflow builder
Quando está criando essa etapa fica vazio, nesse caso do print eu já tinha criado. mas daí é só clicar na etapa em branco e colocar a tarefa q foi criado antes do modelo WS
Em detalhes marquei
Salvar, ativar e não esquecer de liberar a tarefa e o modelo workflow.
No meu caso como tenho parâmetros eu conferi os bindings no container para ver se o fluxo estava correto.
============Customizing link to BO com o WS
Transação SWE2
-=============== Parte do programa - trigger
No meu programa q vai disparar o evento eu coloquei o object key q no meu caso ficou como número da reserva. conforme a tela abaixo da SWO1
E no programa que vai er o trigger
a tabela interna LT_CONTAINER vai conter os dados do parâmetro que vou usar no método na BO, no meu caso eu queria passar os dados dos itens para execução da BAPI da MIGO, mas não consegui achar um jeito de passar o tipo especifico da estrutura da BAPI, talvez tenha e eu não saiba..
Mas eu decidi passar pelo parâmetro padrão da função standard só q como a estrutura SWR_CONT no campo value é limitado a 255char eu criei uma estrutura apenas dos campos que eu precissava enviar para preencher a BAPI por isso criei a estrutura ZMM_STK_TRF_ITEM e só passo os valores
DATA: lv_subrc TYPE sy-subrc,
lv_event_id TYPE swr_struct-event_id.
DATA: lt_container TYPE STANDARD TABLE OF swr_cont WITH DEFAULT KEY,
lt_message_lines TYPE STANDARD TABLE OF swr_messag,
lt_message_struct TYPE STANDARD TABLE OF swr_mstruc.
"data ls_value type zmm_stk_trf_item.
IF gs_bapi_item-item_301[] IS NOT INITIAL.
lt_container = VALUE #( FOR ls_301 IN gs_bapi_item-item_301
( element = 'IT_IT301'
value = CORRESPONDING zmm_stk_trf_item( ls_301 ) ) ).
ENDIF.
IF gs_bapi_item-item_411[] IS NOT INITIAL.
lt_container = VALUE #( BASE lt_container
FOR ls_411 IN gs_bapi_item-item_411
( element = 'IT_IT411'
value = CORRESPONDING zmm_stk_trf_item( ls_411 ) ) ).
ENDIF.
CALL FUNCTION 'SAP_WAPI_CREATE_EVENT'
EXPORTING
object_type = 'ZRESTRFSTK'
object_key = CONV swr_struct-object_key( i_rsnum )
event = 'BAPI_EXECUTION'
* commit_work = 'X'
* event_language = SY-LANGU
* language = SY-LANGU
* user = SY-UNAME
* ifs_xml_container =
IMPORTING
return_code = lv_subrc
event_id = lv_event_id
TABLES
input_container = lt_container
message_lines = lt_message_lines
message_struct = lt_message_struct.
=== Dentro do programa BO para fazer a leitura dos parâmetros passados
- Dentro do método q eu criei
eu leio o container passado e atribuo a estrutura da BAPI da MIGO
***** Implementation of object type ZRESTRFSTK *****
INCLUDE <object>.
begin_data object. " Do not change.. DATA is generated
* only private members may be inserted into structure private
DATA:
" begin of private,
" to declare private attributes remove comments and
" insert private attributes here ...
" end of private,
BEGIN OF key,
iv_resum LIKE resb-rsnum,
END OF key.
end_data object. " Do not change.. DATA is generated
begin_method bapi_migo_execution changing container.
DATA: lt_411 TYPE STANDARD TABLE OF zmm_stk_trf_item,
lt_301 TYPE STANDARD TABLE OF zmm_stk_trf_item.
swc_get_table container 'IT_IT411' lt_411.
swc_get_table container 'IT_IT301' lt_301.
DATA(ls_bapi_header) = VALUE bapi2017_gm_head_01( pstng_date = sy-datum
doc_date = sy-datum
header_txt = object-key ).
DATA: lt_bapi_it301 TYPE tab_bapi_goodsmvt_item,
lt_bapi_it411 TYPE tab_bapi_goodsmvt_item.
IF lt_411[] IS NOT INITIAL.
lt_bapi_it411 = CORRESPONDING #( lt_411 ).
ENDIF.
IF lt_301[] IS NOT INITIAL.
lt_bapi_it301 = CORRESPONDING #( lt_301 ).
ENDIF.
CHECK lt_bapi_it301[] IS NOT INITIAL OR lt_bapi_it411[] IS NOT INITIAL.
CALL FUNCTION 'ZFM_MM_TRF_STOCK_RESERVATION'
EXPORTING
is_bapi_header = ls_bapi_header
it_bapi_item = lt_bapi_it301
it_bapi_item_cons = lt_bapi_it411
EXCEPTIONS
OTHERS = 01.
CASE sy-subrc.
WHEN 0. " OK
WHEN OTHERS. " to be implemented
ENDCASE.
end_method.