Buen día amigo voy empezando en abap tengo la función ZCFDICMP_CHECK_VALIDITY y quiero que cada que se va facturar si es proveedor nacional facture de inmediato 10000-19999 y si el proveedor es externo 50001-59999 mande llamar número de pedimento. actualmente manda mansaje de error para posición 000010 existen datos errónes para fecha y número de pedimento. les agradezco su aporte esto tiene en codigo la funcion:
DATA: lv_function TYPE res150.
SELECT SINGLE function
INTO lv_function
FROM zmxabapdata
WHERE programm = cv_programm
AND searchkey = cv_cfdi
AND keyfield1 = iv_bukrs
AND keyfield2 = iv_fkart.
IF sy-subrc NE 0.
RAISE sociedad_no_es_valida.
ENDIF.
MOVE lv_function TO ev_function.
ENDFUNCTION.
Por lo que veo, esa función solo extrae una funcion de una tabla en base a ciertos filtros.
¿Probaste debuguarlo?
Vas a tener que ir a la tabla zmxabapdata y filtrar como lo hace ahi:
WHERE programm = cv_programm
AND searchkey = cv_cfdi
AND keyfield1 = iv_bukrs
AND keyfield2 = iv_fkart.
(vas a tener que ver los valores de cv_programm, cv_cfdi, iv_bukrs y iv_fkart).
Gracias por responder Sebastián si se hace así? sale esto
Y este documento tiene
la sociedad: 1021 y clase de documento: F2, por lo cual solicita los
pedimentos.
1 - Ver qué valor tiene lv_function (que es el resultado del select
2 - Ir a la transacción SE16, visualizar la tabla y filtrar la misma manera (vas a llegar al mismo resultado que 1).
En fin, esta funcion que nos pasas, solo hace eso, extraer un valor para lv_function (que lo pasa a ev_function) . En el caso que no encuentra valor, lanza el error RAISE sociedad_no_es_valida.
lo que veoes que lv_function manda traer esta otra función ZCFDICMP_EXTRACT_PED_HIAB y
cv_programm - ZCFDICMP_CHECK_VALIDITY
cv_cfdi - CFDI
iv_bukrs - 1021 (sociedad)
iv_fkart - F2 (clase de documento)
me dice un consultor que lo que debo hacer es validar el rango para proveedor nacional(10001-19999 y extranjero 50001-59999 para que se pueda facturar porque la función valida todos los tipos de proveeedores
Entonces deberias revisar esa funcion, ZCFDICMP_EXTRACT_PED_HIAB a ver si hace lo que piden…
Como es todo Z desde aquí mucho no podemos hacer, pero de todas maneras las dudas que te surjan puedes ir pasandolas y de a poco vamos iremos avanzando.
DATA: lt_riserls TYPE STANDARD TABLE OF riserls,
ls_riserls TYPE riserls,
lt_objk TYPE STANDARD TABLE OF ts_objk,
ls_objk TYPE ts_objk,
lt_ser03 TYPE STANDARD TABLE OF ts_ser03,
lt_mseg TYPE STANDARD TABLE OF ts_mseg,
lt_mseg2 TYPE STANDARD TABLE OF ts_mseg2,
lt_mkpf TYPE STANDARD TABLE OF ts_mkpf,
lt_lfa1 TYPE STANDARD TABLE OF ts_lfa1,
lt_pedimentos TYPE ztcfdi_pedimentos.
FIELD-SYMBOLS: <ls_ser03> TYPE ts_ser03,
<ls_riserls> TYPE riserls,
<ls_complemento> TYPE zcfdi_pedimentos.
break: dgomez. "jvega
** Se obtienen los numeros de seri por cada documento de entrega y
** posicion
CALL FUNCTION 'SERIAL_LS_PRINT'
EXPORTING
posnr = iv_vgpos
vbeln = iv_vgbel
TABLES
iserls = lt_riserls.
* Si no se encontraron números de serie se dispara una
* una excepcion.
IF lt_riserls[] IS INITIAL.
RAISE no_se_encontraron_nseries.
ENDIF.
* Movimientos de material por número de serie en
* historial de movimientos del número de serie (objk y ser03)
SELECT matnr sernr obknr
INTO TABLE lt_objk
FROM objk
FOR ALL ENTRIES IN lt_riserls
WHERE sernr = lt_riserls-sernr
AND matnr = iv_matnr
AND taser = cv_tnser.
IF lt_objk[] IS INITIAL.
RAISE no_llave_para_busqueda_doc.
ENDIF.
SORT lt_objk BY obknr ASCENDING.
SELECT obknr mblnr mjahr zeile
INTO CORRESPONDING FIELDS OF TABLE lt_ser03
FROM ser03
FOR ALL ENTRIES IN lt_objk
WHERE obknr = lt_objk-obknr
AND bwart = cv_clmov_101.
* Si no se encontraron entradas, recurrir a tabla de datos
* zsd_carini_ped
IF sy-subrc <> 0.
PERFORM f10_data_from_zsd_carini_ped USING iv_matnr
lt_riserls
CHANGING lt_pedimentos.
ENDIF.
IF NOT lt_pedimentos IS INITIAL.
PERFORM f10_asignar_pedimentos USING iv_vbeln
iv_posnr
lt_riserls
lt_pedimentos
CHANGING et_complemento.
EXIT.
ENDIF.
IF lt_ser03[] IS INITIAL.
RAISE no_se_encontraron_docs_mov.
ENDIF.
* Se obtienen los documentos de material que
* han sido anulados.
SELECT mblnr mjahr zeile sjahr smbln smblp
INTO TABLE lt_mseg
FROM mseg
FOR ALL ENTRIES IN lt_ser03
WHERE sjahr = lt_ser03-mjahr
AND smbln = lt_ser03-mblnr
AND smblp = lt_ser03-zeile.
IF sy-subrc EQ 0.
* Se eliminan los documentos de material que han sido anulados.
SORT lt_mseg BY sjahr smbln smblp ASCENDING.
LOOP AT lt_ser03 ASSIGNING <ls_ser03>.
READ TABLE lt_mseg TRANSPORTING NO FIELDS
WITH KEY sjahr = <ls_ser03>-mjahr
smbln = <ls_ser03>-mblnr
smblp = <ls_ser03>-zeile BINARY SEARCH.
IF sy-subrc EQ 0.
CLEAR <ls_ser03>.
ENDIF.
ENDLOOP.
DELETE lt_ser03 WHERE table_line IS initial.
ENDIF.
IF lt_ser03[] IS INITIAL.
RAISE no_hay_docs_mat_p_procesar.
ENDIF.
* Se obtiene de la tabla cabecera de los movimientos
* el numero de Pedimento y la fecha del pedimento
SELECT mblnr mjahr frbnr xabln
INTO CORRESPONDING FIELDS OF TABLE lt_pedimentos
FROM mkpf
FOR ALL ENTRIES IN lt_ser03
WHERE mblnr = lt_ser03-mblnr
AND mjahr = lt_ser03-mjahr
AND frbnr <> ''
AND xabln <> ''.
* Si no se encontraron entradas, recurrir a tabla de datos
* zsd_carini_ped
IF sy-subrc <> 0.
PERFORM f10_data_from_zsd_carini_ped USING iv_matnr
lt_riserls
CHANGING lt_pedimentos.
ELSE.
SORT lt_pedimentos BY MBLNR DESCENDING.
ENDIF.
PERFORM f10_asignar_pedimentos USING iv_vbeln
iv_posnr
lt_riserls
lt_pedimentos
CHANGING et_complemento.
IF et_complemento[] IS INITIAL.
RAISE no_se_encontraron_pedimentos.
ENDIF.
ENDFUNCTION.
*---------------------------------------------------------------------*
* FORM f10_data_from_zsd_carini_ped *
*---------------------------------------------------------------------*
FORM f10_data_from_zsd_carini_ped
USING uv_matnr TYPE mara-matnr
ut_serials TYPE tt_serials
CHANGING ct_pedimentos TYPE ztcfdi_pedimentos.
FIELD-SYMBOLS:
<ls_sd_carini_ped> TYPE zsd_carini_ped.
DATA:
lt_sd_carini_ped TYPE tt_carini,
ls_cfdi_pedimentos TYPE zcfdi_pedimentos.
SELECT * INTO TABLE lt_sd_carini_ped FROM zsd_carini_ped
FOR ALL ENTRIES IN ut_serials
WHERE matnr = uv_matnr
AND sernr = ut_serials-sernr.
LOOP AT lt_sd_carini_ped ASSIGNING <ls_sd_carini_ped>.
ls_cfdi_pedimentos-xabln = <ls_sd_carini_ped>-xabln.
ls_cfdi_pedimentos-frbnr = <ls_sd_carini_ped>-frbnr.
ls_cfdi_pedimentos-sernr = <ls_sd_carini_ped>-sernr.
APPEND ls_cfdi_pedimentos TO ct_pedimentos.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM f10_asignar_pedimentos *
*---------------------------------------------------------------------*
FORM f10_asignar_pedimentos USING uv_vbeln TYPE vbrk-vbeln
uv_posnr TYPE vbrp-posnr
ut_riserls TYPE tt_serials
ut_pedimentos TYPE ztcfdi_pedimentos
CHANGING ct_complemento TYPE ztcfdi_pedimentos.
FIELD-SYMBOLS: <ls_riserls> TYPE riserls,
<ls_complemento> TYPE zcfdi_pedimentos.
LOOP AT ut_riserls ASSIGNING <ls_riserls>.
READ TABLE ut_pedimentos ASSIGNING <ls_complemento>
WITH KEY sernr = <ls_riserls>-sernr.
IF sy-subrc = 0.
CLEAR <ls_complemento>-sernr.
ELSE.
READ TABLE ut_pedimentos ASSIGNING <ls_complemento> INDEX 1.
ENDIF.
IF <ls_complemento> IS ASSIGNED.
<ls_complemento>-vbeln = uv_vbeln.
<ls_complemento>-posnr = uv_posnr.
APPEND <ls_complemento> TO ct_complemento.
ENDIF.
ENDLOOP.
ENDFORM.