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.
terça-feira, 30 de agosto de 2016
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.
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.
Assinar:
Postagens (Atom)