viernes, 4 de noviembre de 2011

Calcular precio neto con descuentos

************************************************************************
*DESCRIPCION
************************************************************************
*Reporte que genera un listado con el precio neto de cada material
*considerando los descuentos.
*Los parametros del programa son cliente y material y un check para
*bajar o no el archivo de texto y ruta del servidor donde se guardara
*el archivo txt
*FJCH OCT.2011
************************************************************************
REPORT ZPREFIN .
TABLES: KNA1,LIPS,MAKT,MARA,KNVV,MARC.
INCLUDE ZALV.

************************************************************************
*VARIABLES
************************************************************************
DATA g_repid like sy-repid.
data A(10).
data porc type p.
DATA LINEAS LIKE SY-TABIX.
DATA LINEAS2 LIKE SY-TABIX.

************************************************************************
*TABLAS INTERNAS
************************************************************************
*TABLA DE SALIDA DEL AVL
DATA: BEGIN OF IOUT OCCURS 0,
WERKS like KNVV-VWERK,
VKORG LIKE KNVV-VKORG,
VTWEG LIKE KNVV-VTWEG,
SPART LIKE KNVV-SPART,
BZIRK LIKE KNVV-BZIRK,
KUNNR LIKE KNA1-KUNNR,
NAME1 LIKE KNA1-NAME1,
MATNR LIKE LIPS-MATNR,
MAKTX LIKE MAKT-MAKTX,
NETPR2 LIKE LIPS-NETPR,
NETPR LIKE LIPS-NETPR
.
DATA END OF IOUT.
*TABLA CON LA INFORMACION DE LOS MATERIALES.
DATA IMAKT LIKE MAKT OCCURS 0 WITH HEADER LINE.
DATA BEGIN OF IMARA OCCURS 0.
INCLUDE STRUCTURE MARA.
DATA WERKS LIKE MARC-WERKS.
DATA END OF IMARA.
*TABLA CON LA INFORMACION DE LOS CLIENTES
DATA BEGIN OF IKNA1 OCCURS 0.
INCLUDE STRUCTURE KNA1.
DATA: BZIRK LIKE KNVV-BZIRK,
VWERK LIKE KNVV-VWERK,
VKORG LIKE KNVV-VKORG,
VTWEG LIKE KNVV-VTWEG,
SPART LIKE KNVV-SPART,
NETPR LIKE LIPS-NETPR,
NETPR2 LIKE LIPS-NETPR.
DATA END OF IKNA1.

************************************************************************
*PARAMETROS
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK LIST WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
P_CLI FOR KNA1-KUNNR OBLIGATORY,
P_MATKL FOR MARA-MATKL,
P_MAT FOR LIPS-MATNR,
P_ZONA FOR KNVV-BZIRK,
P_WERKS FOR MARC-WERKS.
SELECTION-SCREEN END OF BLOCK LIST.

SELECTION-SCREEN BEGIN OF BLOCK LIST2 WITH FRAME TITLE TEXT-002.
PARAMETERS:
P_CHECK AS CHECKBOX,
P_PATH(128) DEFAULT
'C:\Inetpub\ftproot\comercial\PRNETO.TXT',
P_SEPARA(1) DEFAULT '|'.
SELECTION-SCREEN END OF BLOCK LIST2.

************************************************************************
*START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
g_repid = sy-repid.
PERFORM TRAEINFO.
DESCRIBE TABLE IOUT LINES LINEAS.
DELETE IOUT WHERE NETPR = 0.
IF P_CHECK = 'X'.
PERFORM DOWNLOADA.
MESSAGE I368(00) WITH 'Se ha descargado archivo ' P_PATH.
ELSE.
PERFORM DESPLIEGAALV.
ENDIF.


*&---------------------------------------------------------------------*
*& Form TRAEINFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM TRAEINFO.
DATA FECHA2 LIKE SY-DATUM.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 1
TEXT = 'Recolectando datos'.

FECHA2 = SY-DATUM - 30.
*SI SELECCIONA TODOS LOS CLIENTES SOLO
*TRAEMOS LOS CLIENTES QUE HAN CREADO UN PEDIDO EN EL ULTIMO MES
IF P_CLI-LOW = '*'.
SELECT KNA1~KUNNR NAME1 KNVV~VKORG KNVV~VTWEG KNVV~SPART BZIRK FROM
KNA1
JOIN KNVV ON KNVV~KUNNR = KNA1~KUNNR
JOIN VBAK ON VBAK~KUNNR = KNA1~KUNNR INTO
CORRESPONDING FIELDS OF TABLE IKNA1
WHERE KNA1~KUNNR IN P_CLI AND
BZIRK IN P_ZONA
AND ( VBAK~ERDAT >= FECHA2 AND VBAK~ERDAT <= SY-DATUM ).
ELSE.
SELECT KNA1~KUNNR NAME1 KNVV~VKORG KNVV~VTWEG KNVV~SPART BZIRK FROM
KNA1
JOIN KNVV ON KNVV~KUNNR = KNA1~KUNNR INTO
CORRESPONDING FIELDS OF TABLE IKNA1
WHERE KNA1~KUNNR IN P_CLI AND
BZIRK IN P_ZONA
.
ENDIF.
SORT IKNA1 BY KUNNR BZIRK VWERK VKORG VTWEG SPART.
DELETE ADJACENT DUPLICATES FROM IKNA1 COMPARING ALL FIELDS.

*SI SELECCIONA TODOS LOS MATERIALES TOMAMOS TODOS LOS QUE SE HAYA ECHO
*UN PEDIDO EN EL ULTIMO MES DE LO CONTRARIO LOS QUE INDIQUE EL PARAMETRO
DATA BEGIN OF MATERIALES OCCURS 0.
DATA MATNR LIKE VBAP-MATNR.
DATA END OF MATERIALES.

IF P_MAT-LOW IS INITIAL OR P_MAT-LOW = '*'.
CLEAR P_MAT. REFRESH P_MAT.
SELECT MATNR FROM VBAP INTO TABLE MATERIALES
WHERE ERDAT >= FECHA2 AND ERDAT <= SY-DATUM.
SORT MATERIALES BY MATNR.
DELETE ADJACENT DUPLICATES FROM MATERIALES COMPARING MATNR.
LOOP AT MATERIALES.
P_MAT-SIGN = 'I'.
P_MAT-OPTION = 'EQ'.
P_MAT-LOW = MATERIALES-MATNR.
APPEND P_MAT.
ENDLOOP.
ENDIF.

SELECT MARA~MATNR WERKS FROM MARA
JOIN MARC ON MARA~MATNR = MARC~MATNR
INTO CORRESPONDING FIELDS OF TABLE IMARA
WHERE MARA~MATNR IN P_MAT
AND WERKS IN P_WERKS
AND MTART = 'FERT'
AND MATKL IN P_MATKL.
IF SY-SUBRC = 0.
DELETE ADJACENT DUPLICATES FROM IMARA COMPARING MATNR.
ENDIF.
IF SY-SUBRC = 0.
SELECT MATNR MAKTX FROM MAKT INTO CORRESPONDING FIELDS OF TABLE
IMAKT
FOR ALL ENTRIES IN IMARA
WHERE MATNR = IMARA-MATNR.
ENDIF.
*CALCULAMOS EL PRECIO NETO Y BRUTO PARA CADA CLIENTE CON CADA PRODUCTO
*DE LOS QUE SACAMOS ANTERIORMENTE
DESCRIBE TABLE IKNA1 LINES LINEAS.
DESCRIBE TABLE IKNA1 LINES LINEAS2.
DATA CLINEAS2(20).
DATA CLINEAS22(20).
MOVE LINEAS2 TO CLINEAS22.
LOOP AT IKNA1.
MOVE SY-TABIX TO CLINEAS2.
CONDENSE: CLINEAS2, CLINEAS22.
CONCATENATE CLINEAS2 '/' CLINEAS22 INTO A.
porc = sy-tabix * ( 100 / lineas ).
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = porc
TEXT = A.
LOOP AT IMARA.
PERFORM F_PRECIOF.
MOVE-CORRESPONDING IKNA1 TO IOUT.
IOUT-MATNR = IMARA-MATNR.
IOUT-WERKS = IMARA-WERKS.

READ TABLE IMAKT WITH KEY MATNR = IMARA-MATNR.
IF SY-SUBRC = 0.
IOUT-MAKTX = IMAKT-MAKTX.
ENDIF.
APPEND IOUT.
ENDLOOP.
ENDLOOP.
ENDFORM. " TRAEINFO
*&---------------------------------------------------------------------*
*& Form DESPLIEGAALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DESPLIEGAALV.
PERFORM obt_descrip_campos_tabla USING g_repid 'IOUT'.
PERFORM camb_descrip_campos_tabla USING 'NETPR' 'Pr.Bruto'.
PERFORM camb_descrip_campos_tabla USING 'NETPR2' 'Pr.Neto'.
PERFORM carac_gen_listado.
PERFORM visualizar_lista TABLES IOUT USING 'IOUT' g_repid .
ENDFORM. " DESPLIEGAALV
*&---------------------------------------------------------------------*
*& Form DESPLIEGAALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form set_status using rt_extab type slis_t_extab.

set pf-status 'ZSTANDARD'. "Status nuevo
set titlebar 'T001'. "Titulo

ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOADA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DOWNLOADA.
DATA: LINEA(10000),
CNETWR(20),CNETWR2(20).
OPEN DATASET P_PATH FOR OUTPUT IN TEXT MODE.
LOOP AT IOUT.
CLEAR: LINEA,CNETWR,CNETWR2.
MOVE IOUT-NETPR TO CNETWR.
MOVE IOUT-NETPR2 TO CNETWR2.
CONDENSE: CNETWR, CNETWR2.
CONCATENATE
IOUT-WERKS P_SEPARA
IOUT-VKORG P_SEPARA
IOUT-VTWEG P_SEPARA
IOUT-SPART P_SEPARA
IOUT-BZIRK P_SEPARA
IOUT-KUNNR P_SEPARA
IOUT-NAME1 P_SEPARA
IOUT-MATNR P_SEPARA
IOUT-MAKTX P_SEPARA
CNETWR2 P_SEPARA
CNETWR P_SEPARA
INTO LINEA.
TRANSFER LINEA TO P_PATH.
ENDLOOP.
CLOSE DATASET P_PATH.
ENDFORM. " DOWNLOADA
*&---------------------------------------------------------------------*
*& Form F_PRECIOF
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IOUT_MATNR text
* -->P_IOUT_KUNNR text
*----------------------------------------------------------------------*
FORM F_PRECIOF.
SUBMIT ZSDNETPR0
WITH P_VKORG = IKNA1-VKORG
WITH P_VTWEG = IKNA1-VTWEG
WITH P_SPART = IKNA1-SPART
WITH P_KUNNR = IKNA1-KUNNR
WITH P_WERKS = IMARA-WERKS
WITH S_MATNR = IMARA-MATNR
WITH P_FKDAT = SY-DATUM AND RETURN.
IMPORT PB TO IKNA1-NETPR FROM MEMORY ID 'PB'.
IMPORT PN TO IKNA1-NETPR2 FROM MEMORY ID 'PN'.
ENDFORM. " F_PRECIOF

No hay comentarios: