terça-feira, 21 de dezembro de 2021

Corrigindo status monitor NFE - cancelamento autorizado pelo SEFAZ mas status 2 no monitor

 Pela chave da NFE ler tabela /XNFE/EVENTS

CHNFE =  <chave da NF>

pegar o valor do GUID 

Utilizar função /XNFE/PROCSTEP_EV_ERPUPDAT - colocar o GUID

Executar debugando conforme tela abaixo.



terça-feira, 9 de novembro de 2021

Alterando nome de arquivo anexo - caixa de entrada FIORI

UKM_CASE - com workflow de aprovação de crédito.
Quando o caso entra na caixa de entrada do usuário/responsável na aprovação ou qualquer outra decisão na caixa de entrada do FIORI é possível incluir um comentário/justificativa, esse texto quando volta para o backend entra como um anexo na caixa de email na SOST, o problema é que o nome do arquivo por standard fica como "Approver Comments", debugando percebi que esse texto é uma constante sem  opção de tradução.

Sem muita opção no retorno para o backend eu altero o nome do arquivo antes de entrar na caixa de email para envio. 
Essa informação fica gravado na tabela SOOD

Utilizei a função conforme abaixo:
Essa rotina eu inseri numa classe criada dentro do fluxo do workflow

    DATAl_doc_id    TYPE sofolenti1-doc_id,
          ls_doc_data TYPE sofolenti1.

    DATAlt_header  TYPE TABLE OF solisti1,
          lt_content TYPE TABLE OF solisti1.
    
    "O LOOP é necessário pois pode haver mais anexos 
    LOOP AT it_attach INTO DATA(ls_attach).

      l_doc_id ls_attach-instid.
        
      "Faço a importação dos dados do anexo
      CALL FUNCTION 'SO_DOCUMENT_READ_API1'
        EXPORTING
          document_id                l_doc_id
        IMPORTING
          document_data              ls_doc_data
        TABLES
          object_header              lt_header
          object_content             lt_content
        EXCEPTIONS
          document_id_not_exist      1
          operation_no_authorization 2
          x_error                    3
          OTHERS                     4.
     
      "Nesse caso peguei somente o objeto COMMENT ref. a justificativa gravado
      IF sy-subrc AND
         ls_doc_data-obj_name 'COMMENT' AND
         ls_doc_data-obj_descr /iwwrk/if_wf_constants_gw=>gc_approver_comments.

        DATAl_attach_id TYPE soattinfi1-attach_id.
        DATAls_attach_data TYPE soattchgi1.

        CONCATENATE ls_doc_data-doc_id ls_doc_data-object_id
                    INTO l_attach_id RESPECTING BLANKS.

        CLEAR ls_attach_data.
        MOVE-CORRESPONDING ls_doc_data TO ls_attach_data.
        ls_attach_data-obj_descr mc_approver_filename. "Constante com outro nome                                                            " do arquivo
        ls_attach_data-att_size ls_doc_data-doc_size.

        CALL FUNCTION 'SO_ATTACHMENT_UPDATE_API1'
          EXPORTING
            attachment_id              l_attach_id
            attachment_data            ls_attach_data
          TABLES
            attachment_header          lt_header
            attachment_content         lt_content
          EXCEPTIONS
            attachment_not_exist       1
            operation_no_authorization 2
            parameter_error            3
            x_error                    4
            enqueue_error              5
            OTHERS                     6.

        IF sy-subrc <> 0.

        ENDIF.


      ENDIF.

    ENDLOOP.

segunda-feira, 25 de outubro de 2021

Adicionando anexo em Doc. contábil - utilizando a funcionalidade standard GOS (Generic Object Services)

 Precisei fazer isso para um programa Z que lista doc. contábil e o usuário queria anexar arquivos nos doc. contábeis.



DATA(lo_gosNEW cl_gos_srv_attachment_create).

DATAl_sib    TYPE sibflporb,
      l_ip     TYPE swc_value,
      l_status TYPE sgs_status,
      l_icon   TYPE sgs_icon.


"Empresa + Doc.contábil + Exercicio
l_sib-instid '100010000592332021'.
l_sib-typeid 'BKPF'.
l_sib-catid 'BO'.

"igual ao L_SIB-INSTID
l_ip '100010000592332021'.

lo_gos->set_object(
EXPORTING is_lporb l_sib
          ip_default_attribute l_ip
  IMPORTING
          ep_status l_status
          ep_icon l_icon ).

lo_gos->execute).

"Não esquecer do COMMIT
COMMIT WORK AND WAIT.

UKM_CASE - Incluindo botão adicional na tela de solicitação de crédito

 Transação SCASE_CUSTOMIZING


- Definir um código de função primeiro



- Criar perfil da função 


- Implementar BADI

    - Definição SCMG_CASE_FCODE_S






quinta-feira, 14 de outubro de 2021

BADI - Transação UKM_CASE - Preenchimento de campos na inicialização

 Definição SCMG_INITIALIZE_C

Implementação com filtro. No caso da UKM_CASE


Implementação do método.

No meu caso, defini um valor padrão para o segmento de crédito '0000'

    DATAl_help           TYPE string.

    TRY.
        CALL METHOD im_case->get_single_attribute_value
          EXPORTING
            im_srmadid 'FCR_SEGMENT'
          RECEIVING
            re_value   l_help.

        IF l_help IS INITIAL.
          l_help '0000'.
        ENDIF.

*     set currency to prevent UI-error due to initial currency
        CALL METHOD im_case->set_single_attribute_value
          EXPORTING
            im_value   l_help
            im_srmadid 'FCR_SEGMENT'.

      CATCH cx_srm_framework .
      CATCH cx_scmg_case_attribute .
    ENDTRY.


RESULTADO.



quarta-feira, 13 de outubro de 2021

CL_SALV_TABLE - Filtro dentro de evento hotspot - erro na atualização da tela

 Situação de tela com 2 ALV em tela SPLIT, no ALV superior com campo hotspot, e no ALV inferior lista de itens do item superior selecionado.

 ALV inferior utilizando classes SALV, tentei utilizar o filtro, mas a tela não atualizava, tentei forçar o PBO utilizando o método 

CALL METHOD cl_gui_cfw=>set_new_ok_code

 EXPORTING

          new_code = 'REFRESH'.

mas também não funcionou.

Para resolver tive que carregar os dados novamente com o filtro. Um detalhe é q tive q carregar todos os dados, anteriormente tentei montar uma tabela interna com o filtro, até atualizava a tela, mas não sei o que acontece mas ao rolar o scroll lateral no final da página dava um DUMP, me parece q ele se perde no contador de linhas. Mas sempre carregando tudo funciona sem problema.


  READ TABLE gt_dados INDEX fu_row-index
                      INTO DATA(ls_dados).

  CHECK sy-subrc 0.

  DATA(lo_filterso_alv_item->get_filters).
  lo_filters->remove_filter('MATNR').

  l_low =  ls_dados-matnr.
  lo_filters->add_filter(
  columnname 'MATNR'
  low l_low
  ).

  o_alv_item->set_dataCHANGING t_table gt_acdoca ).

  o_alv_item->refresh).




quinta-feira, 2 de setembro de 2021

Erro ao carregar aplicativo FIORI criado no VS code no S4

 Eu tinha um aplicativo criado no VS code que testava e funcionava sem problema, quando eu importei no S4, dava erro ao carregar a aplicação no browser..

no console do browser - chrome apresentava erro na biblioteca sap.m.f.layouttype.js


busquei várias informações sobre o problema e não achava o pq do erro.  Até q comecei a procurar alguma coisa fora disso e encontrei uma informação q resolvi o problema.

substitui a chamada no INDEX.HTML na linha do src

<script
    id="sap-ui-bootstrap"
    src="resources/sap-ui-core.js"
    data-sap-ui-theme="sap_fiori_3"
    data-sap-ui-resourceroots='{
            "rvf.remvfut": "."
        }'
    data-sap-ui-compatVersion="edge"
    data-sap-ui-async="true"
    data-sap-ui-preload="async"
    data-sap-ui-libs="sap.m">
</script>

Substitui por:

<script
    id="sap-ui-bootstrap"
    src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"
    data-sap-ui-theme="sap_fiori_3"
    data-sap-ui-resourceroots='{
            "rvf.remvfut": "."
        }'
    data-sap-ui-compatVersion="edge"
    data-sap-ui-async="true"
    data-sap-ui-preload="async"
    data-sap-ui-libs="sap.m">
</script>


quarta-feira, 1 de setembro de 2021

Erro 0K 407 - falta modelo sap_sm.xls

 Verificar a nota 1937247 - How to manage SAP standard templates [Video]

Importar o arquivo  .zip da nota 1686797 

Apesar da nota 1937247 falar  para importar no client 000, pode fazer direto no ambiente q está com erro



domingo, 29 de agosto de 2021

CDS view - Search help com descrição do texto

 Exemplo, descrição do material

Importante  lembrar de colocar a categoria de dados e a semantica de texto


@AbapCatalog.sqlViewName: 'ZDDV_CDS_SZK_T8'

@AbapCatalog.compiler.compareFilter: true

@AbapCatalog.preserveKey: true

@ObjectModel.dataCategory: #TEXT

@AccessControl.authorizationCheck: #CHECK

@EndUserText.label: 'Material'

@OData.publish: true


define view ZDD_CDS_SZK_T8 as select from makt

 {

 key matnr as CodMat,

      @Semantics.text: true

      @EndUserText.label: 'Descrição'

      cast(maktx as abap.char(30)) as Mattxt


} where spras = $session.system_language


--- Na view principal

define view ZDD_CDS_SZK_T3

  as select from vbak as A

  association [1..*] to zdd_cds_szk_t6 as _ItemOV   on $projection.DocVen = _ItemOV.Vbeln

  association [1]    to ZDD_CDS_SZK_T4 as _SalesOrg on $projection.OrgVen = _SalesOrg.SalesOrganization

  association [1] to ZDD_CDS_SZK_T7 as _ItemOVSum   on $projection.DocVen = _ItemOVSum.Vbeln

  association [1] to ZDD_CDS_SZK_T8 as _MatF4  on $projection.CodMat = _MatF4.CodMat

{


      @UI.facet: [

      {

      id: 'Info',

      type: #DATAPOINT_REFERENCE,

      purpose: #HEADER,

      position: 10,

      qualifier: 'OrgVenda'

       },

       -- facet de corpo

       {

      id: 'Dados',

      label: 'Info geral',

      type: #COLLECTION,

      purpose: #STANDARD,

      position: 10

       },

       {

      label: 'Dados NF',

      type: #IDENTIFICATION_REFERENCE,

      purpose: #STANDARD,

      position: 10,

      parentId: 'Dados'

       },

       {

       id: 'Item',

       type: #LINEITEM_REFERENCE,

       purpose: #STANDARD,

       targetElement: '_ItemOV',

       position: 20

       }


       ]

     

      @ObjectModel.text.association: '_MatF4'

     

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

  key A.vbeln                            as DocVen,

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

      @UI.selectionField: [{position: 30}]

      @ObjectModel.foreignKey.association: '_SalesOrg'

      @Consumption.filter: { selectionType: #RANGE, multipleSelections: true }

      @UI.dataPoint: { qualifier: 'OrgVenda', title: 'Organização de vendas' }

      A.vkorg                            as OrgVen,

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

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

      @UI.dataPoint: { title: 'Canal de distribuição' }

      A.vtweg                            as CanDist,

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

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

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

      A.spart                            as SetAtiv,

      @UI.dataPoint: { title: 'Cliente' }

      A.kunnr                            as CodCli,

      @UI.hidden: true

      A.auart                            as TpOV,

      (concat('Doc.Venda :', A.vbeln ) ) as TxtDoc,

      case  

      when _ItemOVSum.SomaTotal < 10 then 1

      else 3 

      end as StatusCor,

      @UI.lineItem: [{ position: 60 },

                     { criticality: 'StatusCor', value: 'TotalQtd' }]

      _ItemOVSum.SomaTotal as TotalQtd,      

       

      _ItemOVSum.totitem as TotItem,             

      

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

      @ObjectModel.foreignKey.association: '_MatF4'

      @Search.defaultSearchElement: true

      --@Consumption.filter: { selectionType: #RANGE, multipleSelections: true }

      _ItemOV.Matnr as CodMat,

             

      _ItemOV,

      _ItemOVSum,

      _SalesOrg,

      _MatF4

      

}