Agora entrando no mundo HANA, tive minha primeira experiência desenvolvendo uma Calc view um pouco mais complexa utilizando os objetos do HANA no eclipse e criando uma função AMDP com input parameters, na chamada do método incluindo parãmetros SELECT-OPTIONS.
Vou colocar apenas o código do AMDP e da chamada do método no programa.
Observações:
- INTERFACE IF_AMDP_MARKER_HDB é obrigatorio.
- Criei a calculation view ZV_GUIAS
- Os PLACEHOLDERS são os input parameters: P_DTINI e P_DTFIM
- O parâmetro IV_WHERE é um SQL dinâmico que crio no programa de chamada
- Não tentem colocar * no select que dá merda.
- De preferência criem tipos especificos para retorno do SELECT
*==============================
CLASS zcl_teste_guias DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb.
TYPES:
BEGIN OF ty_guias,
empresa TYPE zv_guias-empresa,
filial TYPE zv_guias-filial,
nf_id TYPE zv_guias-nf_id,
dt_lancto TYPE zv_guias-dt_lancto,
END OF ty_guias,
tyt_guias TYPE STANDARD TABLE OF ty_guias.
DATA:
tt_guias TYPE tyt_guias.
***********************************************************************
* Get Company details based on input parameters *
***********************************************************************
CLASS-METHODS: get_guias
IMPORTING
VALUE(iv_client) TYPE mandt
VALUE(iv_bukrs) TYPE bukrs
VALUE(iv_where) TYPE string
VALUE(iv_dtini) TYPE dats
VALUE(iv_dtfin) TYPE dats
EXPORTING
VALUE(et_guias) TYPE tyt_guias.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_teste_guias IMPLEMENTATION.
METHOD get_guias BY DATABASE PROCEDURE
FOR HDB
LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING zv_guias.
***********************************************************************
* Get Company details based on input parameters *
***********************************************************************
tt_guias = SELECT empresa, filial, nf_id, dt_lancto
from "ZV_GUIAS"
( PLACEHOLDER."$$P_DTINI$$"=> :i_dtini,
PLACEHOLDER."$$P_DTFIM$$"=> :i_dtfin )
where MANDT = IV_CLIENT
AND EMPRESA = IV_BUKRS;
et_guias = apply_filter(:tt_guias, :iv_where ) ;
ENDMETHOD.
ENDCLASS.
*=====================================================
Chamada do AMDP no programa.
Observações:
- S_BUDAT e um parâmetro tipo select-options
- No retorno do metodo DATA(t_guias) não precisa declarar no programa, mas essa variável fica alocado na memória apenas na execução do form onde está.
* ============================================
DATA(lv_where) = cl_shdb_seltab=>combine_seltabs(
it_named_seltabs = VALUE #(
( name = 'DT_LANCTO' dref = REF #( s_budat[] ) ) ) ).
zcl_teste_guias=>get_guias(
EXPORTING iv_bukrs = p_bukrs
iv_client = p_mandt
iv_where = lv_where
iv_dtini = '20140101'
iv_dtfin = '99991231'
IMPORTING
et_guias = DATA(t_guias) ).
cl_demo_output=>display_data( value = t_guias ).
terça-feira, 2 de outubro de 2018
quarta-feira, 8 de agosto de 2018
Webservice sem montar estrutura WSDL
A experiência faz toda diferença.. Eu coloquei alguns posts referente ao envio de arquivo para o SEFAZ do estado do ES e PE, onde montei um WSDL para ser importado no SAP e assim criar as estruturas automaticamente, basicamente no programa era só colocar os valores nos campos da estrutura criada. EIS QUE.
Tem um problema nesse esquema, que no começo funcionou, mas tive problema com alguns clientes. Como a estrutura era standard na montagem do XML para envio o SAP automaticamente coloca o namespace nas tags e isso em alguns casos começaram a dar erro. Quebrei a cabeça por um bom tempo e percebi que eu poderia manter o WSDL original do SEFAZ e montar manualmente o XML antes de enviar o proxy. No caso do ES eu tive que fazer uma modificação no WSDL para poder funcionar, mas sem criar campos.
Falando na prática.
no WSDL no exemplo abaixo. o duaEmissao é a tag principal e abaixo vai as outras tags de valores, quando eu fiz a primeira vez criei todos os campos manualmente no WSDL, no caso abaixo ficou com um elemento <S:ANY>. Quando importado esse WSDL esse elemento é criado no SAP com typo RAWSTRING.
<s:element name="duaEmissao">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
No programa. criei um campo tipo string e concatenei todo o meu XML.
DATA: l_xml TYPE string.
CONCATENATE
'<duaDadosMsg xmlns="http://www.sefaz.es.gov.br/duae">'
'<emisDua versao="1.01">'
'<tpAmb>1</tpAmb>'
'<cnpjEmi>07592315000114</cnpjEmi>'
'<cnpjOrg>27080571000130</cnpjOrg>'
'<cArea>4</cArea>'
'<cServ>1384</cServ>'
'<cnpjPes>28614242000194</cnpjPes>'
'<dRef>2018-08</dRef>'
'<dVen>2018-09-30</dVen>'
'<dPag>2018-09-30</dPag>'
'<cMun>57053</cMun>'
'<xInf>teste</xInf>'
'<vRec>119.06</vRec>'
'<qtde>1</qtde>'
'</emisDua>'
'</duaDadosMsg>'
INTO l_xml.
converto para uma variável tipo XTRING.
DATA: l_xstr TYPE xstring.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = l_xml
IMPORTING
buffer = l_xstr
EXCEPTIONS
failed = 1
OTHERS = 2.
Atribuo esse valor convertido ao meu campo ANY.
lw_emi_in-any = l_xstr.
Tem um problema nesse esquema, que no começo funcionou, mas tive problema com alguns clientes. Como a estrutura era standard na montagem do XML para envio o SAP automaticamente coloca o namespace nas tags e isso em alguns casos começaram a dar erro. Quebrei a cabeça por um bom tempo e percebi que eu poderia manter o WSDL original do SEFAZ e montar manualmente o XML antes de enviar o proxy. No caso do ES eu tive que fazer uma modificação no WSDL para poder funcionar, mas sem criar campos.
Falando na prática.
no WSDL no exemplo abaixo. o duaEmissao é a tag principal e abaixo vai as outras tags de valores, quando eu fiz a primeira vez criei todos os campos manualmente no WSDL, no caso abaixo ficou com um elemento <S:ANY>. Quando importado esse WSDL esse elemento é criado no SAP com typo RAWSTRING.
<s:element name="duaEmissao">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
No programa. criei um campo tipo string e concatenei todo o meu XML.
DATA: l_xml TYPE string.
CONCATENATE
'<duaDadosMsg xmlns="http://www.sefaz.es.gov.br/duae">'
'<emisDua versao="1.01">'
'<tpAmb>1</tpAmb>'
'<cnpjEmi>07592315000114</cnpjEmi>'
'<cnpjOrg>27080571000130</cnpjOrg>'
'<cArea>4</cArea>'
'<cServ>1384</cServ>'
'<cnpjPes>28614242000194</cnpjPes>'
'<dRef>2018-08</dRef>'
'<dVen>2018-09-30</dVen>'
'<dPag>2018-09-30</dPag>'
'<cMun>57053</cMun>'
'<xInf>teste</xInf>'
'<vRec>119.06</vRec>'
'<qtde>1</qtde>'
'</emisDua>'
'</duaDadosMsg>'
INTO l_xml.
converto para uma variável tipo XTRING.
DATA: l_xstr TYPE xstring.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = l_xml
IMPORTING
buffer = l_xstr
EXCEPTIONS
failed = 1
OTHERS = 2.
Atribuo esse valor convertido ao meu campo ANY.
lw_emi_in-any = l_xstr.
E chamo proxy.
CALL METHOD lo_proxy->dua_emissao
EXPORTING
input = lw_emi_in
IMPORTING
output = lw_emi_out.
EXPORTING
input = lw_emi_in
IMPORTING
output = lw_emi_out.
================================
Para ver como ficou montado o XML, pode usar a função abaixo, q convert o xtring em uma tabela XML. Eu utilizo para verificar o retorno que para mim também vem com um campo tipo RAWSTRING.
CALL FUNCTION 'SMUM_XML_PARSE'
EXPORTING
xml_input = l_xstr
TABLES
xml_table = lt_xml
return = t_ret.
EXPORTING
xml_input = l_xstr
TABLES
xml_table = lt_xml
return = t_ret.
quarta-feira, 9 de maio de 2018
Função para trazer a transação real executada
Começou a ter um problema para verificar a variável TCODE para saber a transação executada, isso acontece quando a transação é referenciado por objeto e não por report, durante o programa o SY-TCODE fica com "OS_APPLICATION".
Achei no google a função abaixo que traz a transação executada.
Data <var > type sy-tcode.
CALL 'GET_PARAM_TCOD' ID 'PTCOD' FIELD <VAR>
Achei no google a função abaixo que traz a transação executada.
Data <var > type sy-tcode.
CALL 'GET_PARAM_TCOD' ID 'PTCOD' FIELD <VAR>
quinta-feira, 11 de janeiro de 2018
SM30 Visão de atualização - botão expandir/comprimir - Dependência de relação de tempo
Hoje tive um problema e a solução estava na documentação da SAP, como não é um problema muito comum, resolvi relatar a solução para documentação pessoal.
Enfim, tinha criado uma tabela com os campos de data de validade, criei uma visão de atualização, testei e tal, e quando criava uma validade diferente para o mesmo item, o bendito não aparecia na visão, mas na tabela estava gravado, eis que vi que apareceu na visão de atualização um botão de comprimir/expandir, e quando seleciona a linha e clicava no botão o outro item criado aparecia. Só que não queria q acontecesse assim e fui procurar uma ajuda no Help(google).
O botão em si é esse carinha abaixo
Na documentação da SAP é bem explicito o seguinte, se vc tem campos de data como chave com os seguintes elementos atribuídos.
Enfim, tinha criado uma tabela com os campos de data de validade, criei uma visão de atualização, testei e tal, e quando criava uma validade diferente para o mesmo item, o bendito não aparecia na visão, mas na tabela estava gravado, eis que vi que apareceu na visão de atualização um botão de comprimir/expandir, e quando seleciona a linha e clicava no botão o outro item criado aparecia. Só que não queria q acontecesse assim e fui procurar uma ajuda no Help(google).
O botão em si é esse carinha abaixo
Na documentação da SAP é bem explicito o seguinte, se vc tem campos de data como chave com os seguintes elementos atribuídos.
- Data element BEGDATUM or
- Data element VIM_BEGDA or
- Data element BEGDA
Automaticamente é criado a dependência de tempo e o botão aparece na SM30. Para resolver o problema é só criar ou escolher um outro elemento que tenha um outro nome diferente desses acima com o mesmo tipo (data).
segunda-feira, 13 de novembro de 2017
Coisinhas da SPAU
Esse post é só um memo também, mas as vezes pode ser que alguém passe por esse problema.
Tem um erro que dá em alguns objetos logo depois da verificação da SPAU, isso depois de um upgrade, etc.
Já tinha ocorrido comigo, mas não me lembrava como tinha arrumado, então depois de muita luta descobri e resolvei deixar postado para futuras atualizações de sistema.
O erro que acontece é que vc tenta abrir um objeto standard para modificação (no meu caso uma macro do SPED), e dá uma mensagem que o objeto ainda está bloqueado na SPAU,SPDD,SE95 e pede para ser liberado. Quando vc entra nessas transações vc não acha nada do objeto. Nesse caso descobri que tem uma tabela q mostra os objetos que foram modificados durante o upgrade na correção da SPAU. Tabela SMODILOG, coloquei o objeto lá e tem o status do objeto, e tem um campo que tem a request que está o objeto bloqueado. No meu caso vi que eram notas, selecionei todas as notas e fui na SPAU processar, apesar do status da nota estar como não implementável, é necessário executar a nota para que fique setado como nota ajustada. Depois de resolvido isso a objeto abriu.
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.
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.
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:
Comentários (Atom)
