Función ZCFDICMP_CHECK_VALIDITY

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.

Hola,

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

Saludos,
Sebastián

1 me gusta

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.

y lv_function manda llamar esta otra función: ZCFDICMP_EXTRACT_PED_HIAB

Ahi puedes hacer dos cosas:

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.

Saludos.

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.

Saludos !

esto es lo que tiene esa función:

 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.

como puedo hacer una comparación de proveedores nacionales con rango 1000-1999 que trae la función? y omitir los que no son váildos

@Ulises, lee cómo usar el foro: parte de códigos, estás pegando el código mal, y no se entiende nada de lo que estás escribiendo (si escribis dentro del código, o no).

Saludos.

PD: recuerda que hay un repositorio ABAP del foro, para pegar códigos extensos.

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.