terça-feira, 30 de agosto de 2016

Convertendo smartforms para PDF - arquivo local ou servidor

  Rotina de conversão de relatório SMARTFORMS para arquivo PDF.

Antes de chamar a função do SMARTFORMS, ajustar os parâmetros de impressão.

DATA: w_out_opt  TYPE ssfcompop,
      w_out_info TYPE  ssfcrescl,
      w_ctr_par  TYPE ssfctrlop.

 
    w_out_opt-tdprinter = 'SWIN'.
    w_ctr_par-no_dialog = abap_true.
    w_ctr_par-getotf = abap_true.


"Chamar o smartforms
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'ZTESTE_PDF'
    IMPORTING
      fm_name            = l_fnam
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.

  IF sy-subrc <> 0.
    RAISE sem_dados.
  ENDIF.


"Colocar o parâmetro de retorno JOB_OUTPUT_INFO
  CALL FUNCTION l_fnam
    EXPORTING
      control_parameters = iw_ctr_par
      output_options     = iw_out_opt
      user_settings      = space
    IMPORTING
      job_output_info    = W_OUT_INFO
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
 


 "No caso de saída para arquivo local usando o GUI_DOWNLOAD, remover o parâmetro BIN_FILE

      CALL FUNCTION 'CONVERT_OTF'
        EXPORTING
          format                = 'PDF'
        IMPORTING
          bin_filesize          = bin_size
          bin_file              = bin_file
        TABLES
          otf                   = w_out_info-otfdata
          lines                 = t_lines
        EXCEPTIONS
          err_max_linewidth     = 1
          err_format            = 2
          err_conv_not_possible = 3
          err_bad_otf           = 4
          OTHERS                = 5.



"Para geração de arquivo local
      CALL FUNCTION 'GUI_DOWNLOAD'
        EXPORTING
          filename                = file_loc
          filetype                = 'BIN'
        TABLES
          data_tab                = t_lines
        EXCEPTIONS
          file_write_error        = 1
          no_batch                = 2
          gui_refuse_filetransfer = 3
          invalid_type            = 4
          no_authority            = 5
          unknown_error           = 6
          header_not_allowed      = 7
          separator_not_allowed   = 8
          filesize_not_allowed    = 9
          header_too_long         = 10
          dp_error_create         = 11
          dp_error_send           = 12
          dp_error_write          = 13
          unknown_dp_error        = 14
          access_denied           = 15
          dp_out_of_memory        = 16
          disk_full               = 17
          dp_timeout              = 18
          file_not_found          = 19
          dataprovider_exception  = 20
          control_flush_error     = 21
          OTHERS                  = 22.



"Para geração de arquivo no servidor.

      OPEN DATASET p_filen FOR OUTPUT IN BINARY MODE.
      TRANSFER bin_file TO p_filen.
      CLOSE DATASET p_filen.

sexta-feira, 12 de agosto de 2016

F4IF_INT_TABLE_VALUE_REQUEST - Montagem campo F4 com tabeas e campo de colunas diferentes

  Problema clássico, tenho um campo de tela que pode receber um valor do cliente ou fornecedor (KNA1 e LFA1), os campos das 2 tabelas são idênticos. No meu caso preciso de um matchcode que identifique os valores a serem exibidos, na tela eu tenho um radio buttton para escolha entre o cliente e o fornecedor e 1 campo para receber o código de 1 ou outro.









No código eu tenho o PROCESS ON VALUE-REQUEST para chamada do match code.

  TYPES: BEGIN OF tp_parceiro,
           line TYPE char50,
         END OF tp_parceiro.

  DATA: lt_parceiro  TYPE TABLE OF tp_parceiro,
        lt_rettab    TYPE TABLE OF ddshretval,
        lt_dfies     TYPE TABLE OF dfies,
        lt_dfies_aux TYPE TABLE OF dfies,
        lt_dselc     TYPE TABLE OF dselc.

  DATA: lw_parceiro TYPE tp_parceiro,
        lw_cli      TYPE z_mestre_cliente,
        lw_for      TYPE z_mestre_fornecedor,
        lw_rettab   TYPE ddshretval,
        lw_dfies    TYPE dfies,
        lw_dselc    TYPE dselc.

  DATA: l_tabname   TYPE tabname,
        l_fieldname TYPE fieldname.

  DEFINE lm_ddget.

    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        tabname        = &1
        fieldname      = &2
      TABLES
        dfies_tab      = lt_dfies_aux
      EXCEPTIONS
        not_found      = 1
        internal_error = 2
        OTHERS         = 3.

    IF sy-subrc = 0.
      APPEND LINES OF lt_dfies_aux TO lt_dfies.
    ENDIF.

  END-OF-DEFINITION.

  "Z_LOTE = estrutura do paraâmetro de tela

  "Radio button da tela com o cliente/fornecedor
  IF ( z_lote-partyp_t = c_partyp_cli AND
       t_cliente[] IS INITIAL ).

    l_tabname = 'Z_MESTRE_CLIENTE'.
    l_fieldname = 'KUNNR'.

    SELECT *
      INTO lw_cli
      FROM kna1
     WHERE EXISTS ( SELECT *
                       FROM knb1
                     WHERE bukrs EQ z_lote-bukrs
                       AND kunnr EQ kna1~kunnr ).

      CLEAR lw_parceiro.
      lw_parceiro-line =  lw_cli-land1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_cli-kunnr.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_cli-name1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_cli-regio.
      APPEND lw_parceiro TO lt_parceiro.

    ENDSELECT.

  ELSEIF ( z_lote-partyp_t = c_partyp_for AND
        t_fornecedor[] IS INITIAL ).

    l_tabname = 'Z_MESTRE_FORNECEDOR'.
    l_fieldname = 'LIFNR'.


    SELECT *
     INTO lw_for
     FROM lfa1
    WHERE EXISTS ( SELECT *
                      FROM lfb1
                    WHERE bukrs EQ z_lote-bukrs
                      AND lifnr EQ kna1~lifnr ).

      CLEAR lw_parceiro.
      lw_parceiro-line =  lw_for-land1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_for-lifnr.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_for-name1.
      APPEND lw_parceiro TO lt_parceiro.
      lw_parceiro-line =  lw_for-regio.
      APPEND lw_parceiro TO lt_parceiro.

    ENDSELECT.


  ENDIF.

  lm_ddget l_tabname l_fieldname.
  lm_ddget l_tabname 'NAME1'.
  lm_ddget l_tabname 'REGIO'.

  CLEAR lw_dselc.
  lw_dselc-fldname = l_fieldname.
  lw_dselc-dyfldname = 'Z_LOTE-TFRNR'.
  APPEND lw_dselc TO lt_dselc.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = l_fieldname
      dynpprog        = sy-repid
      dynpnr          = '1000'
      dynprofield     = 'Z_LOTE-TFRNR'
    TABLES
      value_tab       = lt_parceiro
      field_tab       = lt_dfies
      return_tab      = lt_rettab
      dynpfld_mapping = lt_dselc
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     WITH  sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 


terça-feira, 7 de junho de 2016

CEST (Código Especificador ST) - Configuração aparecer na transação J1BxN

  Fiz as aplicações das notas do CEST só que o campo novo criado não aparecia na tela da J1B3n e afins. Tive que debugar para ver porquê não estava aparecendo.

 Esse campo apesar de estar na estrutura da J_1BNFLIN é mostrada na verdade na tela de impostos. do item. É dentro de uma subtela 3211 que está dentro da subtela 3210.

Para aparecer tem q ver qual o grupo de tela que está sendo usado na subtela 3210.

Na SM30 na visão J_1BNFW_SCGAITV


No meu caso no grupo 5.

aí tem que ir na SM30 na view  J_1BNFW_SCCITV
Por default acho q tem um item em branco e mais dois controles de tela a 0001 e 0002.





marcar o item geralmente o branco e clicar em detalhes. e marcar o item 5 para exibir e salvar


Essas telas de baixo são só um informativo do código (para eu me lembrar)


 

Durante o processamento da tela é feito uma verificação, primeiro com o número do controle de tela o Imp.ISS e o tipo de item da NF, se não achar verifca o controle de tela e o ISS e assim por diante.
a variável MV_SCN_I_CONT_ID que está no codigo acima geralmente está em branco, na configuração tem um campo para preencher o grpo de tela, mas não aceita, não sei porque, então geralmente vem em branco a questão do ISS depende da nota inclusive o tipo do item da NF.