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.

  TYPESBEGIN OF tp_parceiro,
           line TYPE char50,
         END OF tp_parceiro.

  DATAlt_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.

  DATAlw_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.

  DATAl_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.