PDA

Ver la Versión Completa : Rupturas de Control


amam2605
18/05/12, 12:53:27
Hola a Todos !!!

Necesito trabajar con rupturas de control para una modificacion que debo realizar pero no manejo bien ese procedimiento, este es mi codigo, el programa realiza la Generacion automatica de las facturas correspondientes a los pedidos de avisos credito, generando 1 factura por pagina (llama la transacción (VF01) Crear Factura). Actualmente el une varios anunciantes (TH_PEDIDO_2-ANUN) aunque sean diferentes que son de la agencia (TH_PEDIDO_2-KUNNR) y maximo 2 anunciantes por pagina. Ahora se quiere que se agrupen los anunciantes de esa misma agencia (maximo 2 por factura) y se imprima.

La Factura queda asi actualmente:

Codigo: 35000 (TH_PEDIDO_2-KUNNR)

38413 (TH_PEDIDO_2-ANUN)
Monto

12000 (TH_PEDIDO_2-ANUN)
Monto

Si me pueden dar una mano al respecto.

Muchas Gracias

Saludos

AMAM



REPORT Z_FACT_VENTAS_AVISOS_UNA_PAGIN
LINE-SIZE 100 NO STANDARD PAGE HEADING LINE-COUNT 000(001)
MESSAGE-ID SY.

TABLES: VBRK, VBFA, VBPA, VBAP, T001B.
TABLES VKDFS.
DATA: MES TYPE I,
EJERCICIO TYPE I.

DATA: BEGIN OF TH_PEDIDO_2 OCCURS 100,
VBELN(10),
KUNNR LIKE VBPA-KUNNR,
ANUN LIKE VBPA-KUNNR,
END OF TH_PEDIDO_2.

DATA BEGIN OF T_BDC_DATA OCCURS 1000.
INCLUDE STRUCTURE BDCDATA. "TABLA PARA LA BDC_DATA.
DATA END OF T_BDC_DATA.

DATA BEGIN OF T_MESSTAB OCCURS 10.
INCLUDE STRUCTURE BDCMSGCOLL. "TABLA QUE GUARDA LOS ERRORES.
DATA END OF T_MESSTAB.
DATA: IND_S.
DATA: WC_FECHA(10).

* Parametros de Entrada

SELECTION-SCREEN BEGIN OF BLOCK B0 WITH FRAME TITLE TEXT-001.
PARAMETERS: P_OV LIKE VBRK-VKORG OBLIGATORY DEFAULT '1000',
P_SECTOR LIKE VBRK-SPART OBLIGATORY DEFAULT '11',
P_FKART LIKE VBRK-FKART OBLIGATORY DEFAULT 'ZF2'.
SELECT-OPTIONS P_FECHA FOR VBRK-FKDAT OBLIGATORY DEFAULT SY-DATUM.
SELECT-OPTIONS P_KUNNR FOR VBRK-KUNRG.
SELECTION-SCREEN END OF BLOCK B0.

START-OF-SELECTION.

IND_S = 0.
CLEAR T_BDC_DATA.
REFRESH T_BDC_DATA.

SELECT * FROM VKDFS
WHERE FKTYP = 'A'
AND VKORG = P_OV
AND FKDAT IN P_FECHA
AND FKART = P_FKART
AND KUNNR IN P_KUNNR
AND FAKSK = ''.

SELECT SINGLE * FROM VBAP
WHERE VBELN = VKDFS-VBELN
AND SPART = P_SECTOR.
IF SY-SUBRC = 0.
PERFORM SEL_ANUN.
IND_S = 1.
TH_PEDIDO_2-VBELN = VKDFS-VBELN.
TH_PEDIDO_2-KUNNR = VKDFS-KUNNR.

APPEND TH_PEDIDO_2.
ENDIF.
ENDSELECT.

* Validacion fecha factura no corresponda a un periodo contable cerrado
IF P_FECHA-HIGH = '00000000'.
P_FECHA-HIGH = P_FECHA-LOW.
ENDIF.
SELECT SINGLE * FROM T001B
WHERE BUKRS = 'VDEU'
AND MKOAR = '+'.

MES = P_FECHA-HIGH+4(2).
EJERCICIO = P_FECHA-HIGH(4).
IF MES < 5.
EJERCICIO = EJERCICIO - 1.
MES = MES + 8.
ELSE.
MES = MES - 4.
ENDIF.

IF T001B-FRYE1 > EJERCICIO OR ( T001B-FRYE1 = EJERCICIO AND
T001B-FRPE1 > MES ).
MESSAGE E002 WITH 'La fecha corresponde a un periodo cerrado'.
ENDIF.
* Fin modificacion

IF IND_S = 1.
PERFORM GENERA_FACTURAS.
ENDIF.

END-OF-SELECTION.


FORM GENERA_FACTURAS.
DATA: IND, PEDIDO(10), NRO_POS_TOT TYPE I,
NRO_POS TYPE I,
CONT(3), WC_CAMPO(15),
WC_KUNNR LIKE LIKP-KUNNR.

IND = 1.

SORT TH_PEDIDO_2 BY KUNNR ANUN VBELN.

NRO_POS_TOT = 0.

CONCATENATE P_FECHA-HIGH+6(2) '.' P_FECHA-HIGH+4(2) '.'
P_FECHA-HIGH(4) INTO WC_FECHA.

PERFORM DYNPRO_START USING 'SAPMV60A' '0102'.
PERFORM DYNPRO_FIELD USING 'BDC_CURSOR' 'KOMFK-VBELN(13)'.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'FKAN'.


IND = 0.


LOOP AT TH_PEDIDO_2.
CONT = CONT + 1.
NRO_POS = 0.
* wc_kunnr = th_entrega_2-kunnr.

* Cuenta posiciones permitidas por Documento de Facturacion
SELECT COUNT(*) INTO NRO_POS FROM VBAP
WHERE VBELN = TH_PEDIDO_2-VBELN.

NRO_POS_TOT = NRO_POS_TOT + NRO_POS.

IF ( TH_PEDIDO_2-KUNNR NE WC_KUNNR OR NRO_POS_TOT > '2' )
AND IND = 1.
IF P_OV = '8000'.
* PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'FKVO'.
* PERFORM DYNPRO_START USING 'SAPMV60A' '0107'.
PERFORM DYNPRO_FIELD USING 'RV60A-FKDAT' WC_FECHA.
* PERFORM DYNPRO_START USING 'SAPMV60A' '0102'.
ENDIF.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/11'.
CALL TRANSACTION 'VF01' USING T_BDC_DATA MODE 'N' UPDATE 'S'
MESSAGES INTO T_MESSTAB.

CLEAR T_BDC_DATA.
REFRESH T_BDC_DATA.

PERFORM DYNPRO_START USING 'SAPMV60A' '0102'.
PERFORM DYNPRO_FIELD USING 'BDC_CURSOR' 'KOMFK-VBELN(13)'.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'FKAN'.
NRO_POS_TOT = NRO_POS.
CONT = 1.
ENDIF.
IND = 1.
WC_KUNNR = TH_PEDIDO_2-KUNNR.
CONCATENATE 'KOMFK-VBELN(' CONT ')' INTO WC_CAMPO.
CONDENSE WC_CAMPO NO-GAPS.
PERFORM DYNPRO_FIELD USING WC_CAMPO TH_PEDIDO_2-VBELN.

ENDLOOP.
* Ulitmo registro
IF P_OV = '8000'.
* PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'FKVO'.
* PERFORM DYNPRO_START USING 'SAPMV60A' '0107'.
PERFORM DYNPRO_FIELD USING 'RV60A-FKDAT' WC_FECHA.
* PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' 'FKAN'.
* PERFORM DYNPRO_START USING 'SAPMV60A' '0102'.
ENDIF.
PERFORM DYNPRO_FIELD USING 'BDC_OKCODE' '/11'.
CALL TRANSACTION 'VF01' USING T_BDC_DATA MODE 'N' UPDATE 'S'
MESSAGES INTO T_MESSTAB.

CLEAR TH_PEDIDO_2.
CLEAR TH_PEDIDO_2.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form SEL_ANUN
*&---------------------------------------------------------------------*
* Obtiene el Anunciante por pedido y posicion
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SEL_ANUN.

SELECT SINGLE KUNNR INTO TH_PEDIDO_2-ANUN FROM VBPA
WHERE VBELN EQ VKDFS-VBELN
AND PARVW EQ 'ZA'.
IF SY-SUBRC <> 0.
TH_PEDIDO_2-ANUN = VKDFS-KUNNR.
ENDIF.

ENDFORM. " SEL_ANUN
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form DYNPRO_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_1760 text *
* -->P_1761 text *
*----------------------------------------------------------------------*
FORM DYNPRO_FIELD USING FIELD VALUE.
CLEAR T_BDC_DATA.
T_BDC_DATA-FNAM = FIELD.
T_BDC_DATA-FVAL = VALUE.
APPEND T_BDC_DATA.

ENDFORM. " DYNPRO_FIELD

*&---------------------------------------------------------------------*
*& Form DYNPRO_START
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_1765 text *
* -->P_1766 text *
*----------------------------------------------------------------------*
FORM DYNPRO_START USING PROGRAM DYNPRO.
CLEAR T_BDC_DATA.
T_BDC_DATA-PROGRAM = PROGRAM.
T_BDC_DATA-DYNPRO = DYNPRO.
T_BDC_DATA-DYNBEGIN = 'X'.
APPEND T_BDC_DATA.

ENDFORM. " DYNPRO_START
*&---------------------------------------------------------------------*