Ejemplo Abap Con Adobe Forms

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 29

Ejemplo Abap - Adobe Forms

************************************************************************
** NOMBRE : ZCO_FICHA_COSTES **
** DESCRIPCIÓN : Ficha de costes **
** AUTOR : Eduardo Campos (Sapas) **
** FECHA : 09.10.2013 **
************************************************************************
** MODIFICACION 1 **
** Fecha : 30-10-2014 **
** Id : JMM-301014 **
** Autor : Josep Martín (SAPAS) **
** Descripción: INCMCM0005 :
** Los campos "Producto"/"GR/M2(Gramaje)", tienen los siguientes
** problemas en el Listado:
**
** - Campo "Producto": El problema es que ls desc.del producto
** está en "Inglés" y deberá de estar siempre en "Español".
**
** - Campo "GR/M2(Gramaje)": El Problema que el Gramaje que está
** mostrando no es correcto se deberá de verificar de donde
** saca el Gramaje y corregir el Error.
**
************************************************************************
REPORT zco_ficha_costes.

*----------------------------------------------------------------------*
* DEFINICIÓN DE TABLAS *
*----------------------------------------------------------------------*
TABLES: ckis.

*----------------------------------------------------------------------*
* DEFINICIÓN DE INCLUDES *
*----------------------------------------------------------------------*
*INCLUDE zut01.

*----------------------------------------------------------------------*
* DEFINICIÓN DE TIPOS *
*----------------------------------------------------------------------*
TYPES: BEGIN OF tp_tab,
kostl TYPE ckis-kostl,
matnr TYPE ckis-matnr,
meeht TYPE ckis-meeht,
menge TYPE ckis-menge,
gpreis TYPE ckis-gpreis,
peinh TYPE ckis-peinh,
pmeht TYPE ckis-pmeht,
wertn TYPE ckis-wertn,
lstar TYPE ckis-lstar,
maktx TYPE makt-maktx,
werks TYPE ckis-werks,
typps TYPE ckis-typps,
arbid TYPE ckis-arbid,
END OF tp_tab.

TYPES: BEGIN OF tp_lista,


kostl TYPE ckis-kostl,
matnr TYPE ckis-matnr,
meeht TYPE ckis-meeht,
menge TYPE ckis-menge,
gpreis TYPE ckis-gpreis,
peinh TYPE ckis-peinh,
pmeht TYPE ckis-pmeht,
wertn TYPE ckis-wertn,
baugr TYPE ckis-baugr,
ukaln TYPE ckis-ukaln,

Pag. 1 de 29
Ejemplo Abap - Adobe Forms
ukalka TYPE ckis-ukalka,
ukadky TYPE ckis-ukadky,
lstar TYPE ckis-lstar,
werks TYPE ckis-werks,
typps TYPE ckis-typps,
arbid TYPE ckis-arbid,
strat TYPE ckis-strat,
END OF tp_lista.

TYPES: BEGIN OF tp_prods,


kostl TYPE zed_cecotxt,
prod TYPE zpp_product-zproduct,
turno TYPE zed_turno,
merma TYPE zpp_product-zmerma,
tlote TYPE keko-losgr,
END OF tp_prods.

TYPES: BEGIN OF tp_recorte,


ceco TYPE ckis-kostl,
produccion TYPE zco_ficha_coste_bloque02-produccion,
mat_prima TYPE zco_ficha_coste_bloque02-mat_prima,
tlote TYPE keko-losgr,
um TYPE ckis-meeht,
END OF tp_recorte.

TYPES: BEGIN OF tp_matnr,


matnr TYPE mara-matnr,
END OF tp_matnr.

TYPES: tt_tab TYPE TABLE OF tp_tab,


tt_lista TYPE TABLE OF tp_lista.

*----------------------------------------------------------------------*
* DEFINICIÓN DE TABLAS INTERNAS *
*----------------------------------------------------------------------*
DATA: BEGIN OF t_itab OCCURS 0,
kostl LIKE ckis-kostl,
matnr LIKE ckis-matnr,
meeht LIKE ckis-meeht,
menge LIKE ckis-menge,
gpreis LIKE ckis-gpreis,
peinh LIKE ckis-peinh,
pmeht LIKE ckis-pmeht,
wertn LIKE ckis-wertn,
lstar LIKE ckis-lstar,
maktx LIKE makt-maktx,
werks LIKE ckis-werks,
typps LIKE ckis-typps,
arbid LIKE ckis-arbid,
END OF t_itab.

DATA: gt_lista LIKE t_itab OCCURS 0.

DATA: gt_keko TYPE TABLE OF keko.

DATA: gt_cabecera TYPE zco_tt_ficha_coste_cabecera,


gt_bloque01 TYPE zco_tt_ficha_coste_bloque01,
gt_bloque02 TYPE zco_tt_ficha_coste_bloque02,
gt_bloque02_tmp TYPE zco_tt_ficha_coste_bloque02,
gt_prods TYPE TABLE OF tp_prods,
gt_recorte TYPE TABLE OF tp_recorte,
gt_matnr TYPE TABLE OF mara-matnr,
gt_ficha_coste TYPE zco_tt_ficha_coste,
gt_explo TYPE TABLE OF tp_lista.

Pag. 2 de 29
Ejemplo Abap - Adobe Forms

*----------------------------------------------------------------------*
* DEFINICIÓN DE ESTRUCTURAS *
*----------------------------------------------------------------------*
DATA: gs_itab LIKE t_itab,
gs_bloque01 TYPE zco_ficha_coste_bloque01,
gs_bloque02 TYPE zco_ficha_coste_bloque02,
gs_keko TYPE keko,
gs_cabecera TYPE zco_ficha_coste_cabecera,
gs_prods TYPE tp_prods,
gs_recorte TYPE tp_recorte,
gs_ficha_coste TYPE zco_st_ficha_coste,
gs_explo TYPE tp_lista.

*----------------------------------------------------------------------*
* DEFINICIÓN DE VARIABLES *
*----------------------------------------------------------------------*
DATA: v_lines TYPE i,
v_bklas TYPE bklas,
v_ceco TYPE ckis-kostl,
txt_ceco TYPE c LENGTH 10,
v_tabix TYPE sy-tabix,
gv_matnr_exp TYPE mara-matnr,
gv_matnr TYPE mara-matnr,
txt_matnr TYPE c LENGTH 50,
gv_lines TYPE i,
gv_porcen TYPE i,
gv_porcen_ant TYPE i,
gv_tabix TYPE sy-tabix,
gv_numlin TYPE i,
gv_lote TYPE keko-losgr,
gv_meins TYPE mara-meins,
gv_pci TYPE zed_pciacum,
gv_acum_ant TYPE zed_pciacum,
gv_error TYPE c.

*----------------------------------------------------------------------*
* DEFINICIÓN DE CONSTANTES *
*----------------------------------------------------------------------*
DATA: c_desglose TYPE tdltypnam VALUE '01_DESGLOSE',
c_abonorecorte TYPE tdltypnam VALUE '02_ABONORECORTE',
c_acumulado TYPE tdltypnam VALUE '03_ACUMULADO',
c_recalculomerma TYPE tdltypnam VALUE '04_RECALCULOMERMA',
c_totalrecorte TYPE tdltypnam VALUE '99_TOTALRECORTE',
c_primerregistro TYPE i VALUE 1.

*----------------------------------------------------------------------*
* DEFINICIÓN DE RANGES *
*----------------------------------------------------------------------*
RANGES: rg_bklas FOR mbew-bklas,
rg_matpri FOR mbew-bklas,
rg_matnr FOR mbew-bklas,
rg_energia FOR ckis-lstar,
rg_valora FOR ckis-lstar,
rg_recorte FOR mbew-bklas.

*----------------------------------------------------------------------*
* DEFINICIÓN DE FIELD SYMBOLS *
*----------------------------------------------------------------------*
*field-symbols: <fs_xxxx>. "Descripción

*----------------------------------------------------------------------*

Pag. 3 de 29
Ejemplo Abap - Adobe Forms
* DATOS PARA IMPRESION FORMULARIO *
*----------------------------------------------------------------------*
DATA: docparams TYPE sfpdocparams.
DATA: formoutput TYPE fpformoutput.
DATA: outputparams TYPE sfpoutputparams.
DATA: gv_fm_name TYPE rs38l_fnam.

*----------------------------------------------------------------------*
* DEFINICIÓN DE LA PANTALLA DE SELECCIÓN *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-t01.

SELECT-OPTIONS: so_matnr FOR ckis-matnr OBLIGATORY. "Material

PARAMETERS: p_werks TYPE keko-werks OBLIGATORY, "Centro


p_klvar TYPE keko-klvar OBLIGATORY, "Variante cálc.coste
p_tvers TYPE keko-tvers OBLIGATORY DEFAULT '1',"Versión CC
p_fecha TYPE keko-kadat OBLIGATORY. "Fecha CC

SELECTION-SCREEN END OF BLOCK bl1.

************************************************************************
* PROGRAMA PRINCIPAL *
************************************************************************

*----------------------------------------------------------------------*
*---------- INITIALIZATION ----------*
*----------------------------------------------------------------------*
INITIALIZATION.
* repname = sy-repid.

*----------------------------------------------------------------------*
*---------- AT SELECTION-SCREEN ----------*
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.

* Validación autorización Centro.


AUTHORITY-CHECK OBJECT 'ZSD1_03'
ID 'WERKS' FIELD p_werks
ID 'ACTVT' FIELD '03'.

* Si hay falta, mostramos un error.


IF sy-subrc NE 0.
MESSAGE s004(zco) WITH p_werks DISPLAY LIKE 'E'.
gv_error = 'X'.
ELSE.
gv_error = ''.
ENDIF.

*----------------------------------------------------------------------*
*---------- START OF SELECTION -----------*
*----------------------------------------------------------------------*
START-OF-SELECTION.

CHECK gv_error = ''.

* Preparamos los rangos que utilizaremos para filtrar.


PERFORM preparar_rangos.

* Seleccionamos los materiales.


PERFORM seleccion_materiales.

CHECK gt_matnr[] IS NOT INITIAL.

Pag. 4 de 29
Ejemplo Abap - Adobe Forms
* Abrimos el formulario para ir acumulando páginas.
PERFORM abrir_formulario.

* Contamos las líneas para mostrar el porcentaje.


DESCRIBE TABLE gt_matnr LINES gv_lines.

LOOP AT gt_matnr INTO gv_matnr.

gv_tabix = sy-tabix.

* Limpiamos todos los datos globales.


PERFORM limpiar_datos.

* Mostramos el progreso.
PERFORM mostrar_progreso.

* Seleccionamos los datos.


PERFORM seleccion_datos.

* Si no hay datos del CC para este material, no se añade página.


IF gt_keko[] IS NOT INITIAL.

* Tratamos los datos seleccionados.


PERFORM tratar_datos.

* Mostramos el formulario.
PERFORM generar_pagina_formulario.

ENDIF.

ENDLOOP.

*----------------------------------------------------------------------*
*---------- END OF SELECTION -----------*
*----------------------------------------------------------------------*
END-OF-SELECTION.

CHECK gv_error = ''.

CHECK gt_matnr[] IS NOT INITIAL.

* Cerramos el formulario.
PERFORM cerrar_formulario.

* PERFORM obt_campos_tabla_interna USING repname 'ITAB'.


* PERFORM camb_descrip_campos_tabla USING 'MAKTX' 'Denominación'.
* PERFORM camb_descrip_campos_tabla USING 'GPREIS' 'Precio unitario'.
* PERFORM camb_descrip_campos_tabla USING 'PEINH' 'Cant.Base Prec.un.'.
* PERFORM camb_descrip_campos_tabla USING 'WERTN' 'Total EUR'.
* PERFORM camb_descrip_campos_tabla USING 'MENGE' 'Unidades necesarias'
* PERFORM camb_descrip_campos_tabla USING 'MEEHT' 'UMB'.
* PERFORM camb_descrip_campos_tabla USING 'PMEHT' 'UM Precio'.
* PERFORM asignar_variante USING repname '/STANDARD'.
* PERFORM carac_gen_listado.
* PERFORM visualizar_grid TABLES itab USING repname .

************************************************************************
************** SUBRUTINAS *******************
************************************************************************
*&---------------------------------------------------------------------*
*& Form SELECCION_DATOS
*&---------------------------------------------------------------------*
* text

Pag. 5 de 29
Ejemplo Abap - Adobe Forms
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM seleccion_datos .

REFRESH gt_prods.

* Seleccionamos los datos de la keko a partir de los campos de selección


SELECT * FROM keko
INTO TABLE gt_keko
WHERE matnr = gv_matnr
AND werks = p_werks
AND klvar = p_klvar
AND tvers = p_tvers
AND kadat <= p_fecha
AND bidat >= p_fecha.

* Contamos los registros encontrados.


DESCRIBE TABLE gt_keko LINES v_lines.

* En caso de que haya más de uno, nos quedaremos sólo con uno.
* Según el Status cálculo del coste(FEH_STA) que encontremos, nos
* quedaremos con un registro u otro.
IF v_lines > 1.

READ TABLE gt_keko INTO gs_keko WITH KEY feh_sta = 'FR'.


IF sy-subrc = 0.
DELETE gt_keko WHERE feh_sta <> 'FR'.
ENDIF.

READ TABLE gt_keko INTO gs_keko WITH KEY feh_sta = 'VO'.


IF sy-subrc = 0.
DELETE gt_keko WHERE feh_sta <> 'VO'.
ENDIF.

READ TABLE gt_keko INTO gs_keko WITH KEY feh_sta = 'KA'.


IF sy-subrc = 0.
DELETE gt_keko WHERE feh_sta <> 'KA'.
ENDIF.

READ TABLE gt_keko INTO gs_keko WITH KEY feh_sta = 'KF'.


IF sy-subrc = 0.
DELETE gt_keko WHERE feh_sta <> 'KF'.
ENDIF.

ELSE.

READ TABLE gt_keko INTO gs_keko INDEX 1.

ENDIF.

CLEAR gv_lote.
gv_lote = gs_keko-losgr.

* Si hay cálculo del coste para el material.


IF gt_keko[] IS NOT INITIAL.

* Obtenemos la lista de material de este cálculo de coste.


* Este form es RECURSIVO, ojo! con las modificaciones dentro de él.
PERFORM obtener_lista TABLES gt_lista[]
USING gs_keko-kalnr gs_keko-kadky
gs_keko-kalka gs_keko-matnr
gs_keko-werks gs_keko-losgr

Pag. 6 de 29
Ejemplo Abap - Adobe Forms
gs_keko-losgr 0.

ENDIF.

ENDFORM. " SELECCION_DATOS

*&---------------------------------------------------------------------*
*& Form OBTENER_LISTA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_KEKO text
* -->P_GT_LISTA text
*----------------------------------------------------------------------*
FORM obtener_lista TABLES pt_tab TYPE tt_tab
USING pi_kalnr pi_kadky pi_kalka pi_matnr
pi_werks pi_tlote pi_menge pi_peinh.

DATA: ls_lista TYPE tp_lista,


lt_lista TYPE tt_lista,
ls_tab TYPE tp_tab,
l_kostl TYPE ckis-kostl,
lt_conjunto TYPE tt_tab,
lv_losgr TYPE keko-losgr,
lv_kosar TYPE csks-kosar.

CLEAR lt_lista[].

* Obtenemos los datos de la lista de componentes.


SELECT *
FROM ckis
INTO CORRESPONDING FIELDS OF TABLE lt_lista
WHERE kalnr = pi_kalnr
AND kalka = pi_kalka
AND kadky = pi_kadky.

CLEAR l_kostl.

* Cogemos un registro que tenga el Ceco informado.


LOOP AT lt_lista INTO ls_lista WHERE kostl <> ''.
* Nos guardamos el registro.
l_kostl = ls_lista-kostl.
EXIT.
ENDLOOP.

* Productividades
CLEAR: gs_prods.
* Seleccionamos la productividad y la merma.
SELECT SINGLE zproduct zmerma
FROM zpp_product
INTO (gs_prods-prod, gs_prods-merma)
WHERE matnr = pi_matnr
AND werks = pi_werks.

CLEAR lv_kosar.

* Obtenemos el indicador de turno.


SELECT SINGLE kosar
INTO lv_kosar
FROM csks
WHERE kostl EQ l_kostl
AND datbi GE pi_kadky.

* Modificamos la producción según los criterios siguientes.

Pag. 7 de 29
Ejemplo Abap - Adobe Forms
CASE lv_kosar.
WHEN 'Y'.
gs_prods-prod = gs_prods-prod / 8.
gs_prods-turno = 'LIB/HORA'.
WHEN 'F'.
gs_prods-prod = gs_prods-prod * 3.
gs_prods-turno = 'KG/DIA'.
WHEN OTHERS.
gs_prods-turno = 'KG/TURNO'.
ENDCASE.

gs_prods-kostl = l_kostl.
gs_prods-tlote = pi_tlote.
APPEND gs_prods TO gt_prods.
CLEAR: gs_prods.

* Se dan casos en los que no hay centro de coste porque un material se


* realiza en un centro diferente. En ese caso no lo tenemos en cuenta.
IF l_kostl IS NOT INITIAL.
* Buscamos los materiales que nos servirán para el cálculo del PCI
* LOOP AT lt_lista INTO ls_lista WHERE strat = '' AND typps = 'M'.
* CLEAR: gs_explo.
gs_explo-kostl = l_kostl.

IF pi_matnr = gs_explo-matnr.
ELSE.
gs_explo-matnr = pi_matnr.
gs_explo-menge = pi_menge.
gs_explo-peinh = pi_peinh.
ENDIF.

APPEND gs_explo TO gt_explo.

ELSE.

* Guardamos el registro para compararlo con el siguiente.


gs_explo-kostl = l_kostl.
gs_explo-matnr = pi_matnr.
gs_explo-menge = pi_menge.
gs_explo-peinh = pi_peinh.

* ENDLOOP.
ENDIF.

* Cogemos los conjuntos.


LOOP AT lt_lista INTO ls_lista WHERE baugr <> ''.

* Guardamos el material que se explota para llevarnos el último


* de ellos.
gv_matnr_exp = ls_lista-matnr.

CLEAR lv_losgr.
* Obtenemos el tamaño del cálculo del coste para el material explotado
SELECT SINGLE losgr
FROM keko
INTO lv_losgr
WHERE kalnr = ls_lista-ukaln
AND kadky = ls_lista-ukadky.

* Obtenemos los materiales del conjunto.


PERFORM obtener_lista TABLES lt_conjunto[]
USING ls_lista-ukaln ls_lista-ukadky
ls_lista-ukalka ls_lista-matnr
ls_lista-werks lv_losgr

Pag. 8 de 29
Ejemplo Abap - Adobe Forms
ls_lista-menge ls_lista-peinh.

* Guardamos el conjunto en la tabla final.


LOOP AT lt_conjunto INTO ls_tab.
APPEND ls_tab TO pt_tab.
CLEAR ls_tab.
ENDLOOP.

ENDLOOP.

* Recorremos la tabla inicial y la guardamos.


LOOP AT lt_lista INTO ls_lista WHERE baugr = ''.
MOVE-CORRESPONDING ls_lista TO ls_tab.
ls_tab-kostl = l_kostl.
APPEND ls_tab TO pt_tab.
CLEAR ls_tab.
ENDLOOP.

ENDFORM. " OBTENER_LISTA

*&---------------------------------------------------------------------*
*& Form GENERAR_PAGINA_FORMULARIO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM generar_pagina_formulario .

CALL FUNCTION gv_fm_name


EXPORTING
* /1BCDWB/DOCPARAMS =
* t_cabecera = gt_cabecera
* t_bloque01 = gt_bloque01
* t_bloque02 = gt_bloque02
t_ficha = gt_ficha_coste
* IMPORTING
* /1BCDWB/FORMOUTPUT =
EXCEPTIONS
usage_error =1
system_error =2
internal_error =3
OTHERS =4
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " GENERAR_PAGINA_FORMULARIO

*&---------------------------------------------------------------------*
*& Form PREPARAR_RANGOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM preparar_rangos .

DATA: ls_datos TYPE zco_fcoste_datos.

Pag. 9 de 29
Ejemplo Abap - Adobe Forms
CLEAR: rg_bklas, rg_matpri, rg_matnr, rg_energia,
rg_valora, rg_recorte.
REFRESH: rg_bklas, rg_matpri, rg_matnr, rg_energia,
rg_valora, rg_recorte.

* Recorremos la tabla donde tenemos los valores de los rangos.


SELECT *
FROM zco_fcoste_datos
INTO ls_datos.

CASE ls_datos-concepto.
WHEN 'ACUMULADOS'.
rg_bklas-option = 'EQ'.
rg_bklas-sign = 'I'.
rg_bklas-low = ls_datos-valor.
APPEND rg_bklas.
CLEAR rg_bklas.
WHEN 'MAT_PRIMA'.
rg_matpri-option = 'EQ'.
rg_matpri-sign = 'I'.
rg_matpri-low = ls_datos-valor.
APPEND rg_matpri.
CLEAR rg_matpri.
WHEN 'ENERGIA'.
rg_energia-option = 'EQ'.
rg_energia-sign = 'I'.
rg_energia-low = ls_datos-valor.
APPEND rg_energia.
CLEAR rg_energia.
WHEN 'VALOR_A'.
rg_valora-option = 'EQ'.
rg_valora-sign = 'I'.
rg_valora-low = ls_datos-valor.
APPEND rg_valora.
CLEAR rg_valora.
WHEN 'MATERIALES'.
rg_matnr-option = 'EQ'.
rg_matnr-sign = 'I'.
rg_matnr-low = ls_datos-valor.
APPEND rg_matnr.
CLEAR rg_matnr.
WHEN 'RECORTE'.
rg_recorte-option = 'EQ'.
rg_recorte-sign = 'I'.
rg_recorte-low = ls_datos-valor.
APPEND rg_recorte.
CLEAR rg_recorte.
WHEN OTHERS.
ENDCASE.

ENDSELECT.

ENDFORM. " PREPARAR_RANGOS

*&---------------------------------------------------------------------*
*& Form TRATAR_DATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM tratar_datos .

Pag. 10 de 29
Ejemplo Abap - Adobe Forms
DATA: lv_ktext TYPE cskt-ktext,
lv_ceco TYPE ckis-kostl,
lv_matnr(12) TYPE c,
lv_maktx TYPE makt-maktx,
ls_bloque02 TYPE zco_ficha_coste_bloque02.

*----------------------------------------------------------------------

CLEAR: gt_bloque01[], gt_bloque02[], gt_cabecera[], v_ceco,


gt_bloque02_tmp[], gt_recorte[], lv_ceco.

* Recorremos la lista obtenida.


LOOP AT gt_lista INTO gs_itab.

IF gs_itab-matnr = ''.
* Texto de la línea.
SELECT SINGLE ktext INTO gs_itab-maktx
FROM cslt
WHERE spras = 'S' "Mod.JMM-301014
AND kokrs = '001' "Mod.JMM-301014
AND lstar = gs_itab-lstar.

ELSE.
* Texto del maestro de materiales.
SELECT SINGLE maktx INTO gs_itab-maktx
FROM makt
WHERE spras = 'S' "Mod.JMM-301014
AND matnr = gs_itab-matnr.

ENDIF.

*** Bloque 1 ***********************************************************

CLEAR: gs_bloque01.
gs_bloque01-kostl = gs_itab-kostl.

* Separador de ceco.
IF v_ceco <> gs_itab-kostl.

v_ceco = gs_itab-kostl.
CLEAR txt_ceco.
WRITE gs_itab-kostl TO txt_ceco NO-ZERO NO-GAP.
CLEAR lv_ktext.

* Obtenemos la denominación del ceco.


SELECT SINGLE ktext
INTO lv_ktext
FROM cskt
WHERE spras = 'S'
AND kokrs = gs_keko-kokrs
AND kostl = gs_itab-kostl
AND datbi >= p_fecha.

* Preparamos el texto separador.


CONCATENATE '***' txt_ceco '***'
INTO gs_bloque01-denominacion.

CONCATENATE gs_bloque01-denominacion lv_ktext


INTO gs_bloque01-denominacion SEPARATED BY space.

CLEAR: gs_explo, lv_matnr, lv_maktx.

* Obtenemos el material explotado para este CeCo.


READ TABLE gt_explo INTO gs_explo WITH KEY kostl = v_ceco.

Pag. 11 de 29
Ejemplo Abap - Adobe Forms

* Si lo encontramos.
IF sy-subrc = 0.

* Buscamos el texto.
SELECT SINGLE maktx FROM makt
INTO lv_maktx
WHERE spras = 'S' "Mod.JMM-301014
AND matnr = gs_explo-matnr.

* Convertimos el formato del material.


CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = gs_explo-matnr
IMPORTING
output = lv_matnr.

CONCATENATE gs_bloque01-denominacion '-' lv_matnr '-' lv_maktx


INTO gs_bloque01-denominacion SEPARATED BY space.

ENDIF.

* Grabamos el registro.
APPEND gs_bloque01 TO gt_bloque01.

ENDIF.

CLEAR: gs_bloque01, v_bklas.


gs_bloque01-kostl = gs_itab-kostl.

* Campos genéricos.
gs_bloque01-un_necesarias = gs_itab-menge.
gs_bloque01-precio_unit = gs_itab-gpreis.
gs_bloque01-total_eur = gs_itab-wertn.

* Comprobamos si la categoría de valoración del registro corresponde


* a la de los acumulados.
SELECT SINGLE bklas
FROM mbew
INTO v_bklas
WHERE matnr = gs_itab-matnr
AND bwkey = gs_itab-werks
AND bklas IN rg_bklas.

* Si está dentro de las categorías de acumulados.


IF sy-subrc = 0.

gs_bloque01-umb = '*'.

* Seleccionamos la denominación de la categoría de valoración.


SELECT SINGLE bkbez
INTO gs_bloque01-denominacion
FROM t025t
WHERE spras = 'S' "sy-langu - "Mod.JMM-301014
AND bklas = v_bklas.

* Acumulamos los valores de la categoría.


COLLECT gs_bloque01 INTO gt_bloque01.

* Si no.
ELSE.

gs_bloque01-umb = gs_itab-meeht.

Pag. 12 de 29
Ejemplo Abap - Adobe Forms

* Movemos la denominación del material.


gs_bloque01-denominacion = gs_itab-maktx.

* Grabamos el registro.
APPEND gs_bloque01 TO gt_bloque01.

ENDIF.

*** Bloque 2 ***********************************************************

CLEAR: gs_bloque02, gs_recorte.

gs_bloque02-ceco = gs_itab-kostl.

* Clasificamos el importe.
CASE gs_itab-typps.

WHEN 'M' OR 'I' OR 'L' OR 'G' OR 'F'. "Materiales y Mat.Prima

CLEAR v_bklas.

* Obtenemos la categoría de valoración


SELECT SINGLE bklas
FROM mbew
INTO v_bklas
WHERE matnr = gs_itab-matnr
AND bwkey = gs_itab-werks.

* Materia prima.
IF v_bklas IN rg_matpri.
gs_bloque02-mat_prima = gs_itab-wertn.

* Materiales.
ELSEIF v_bklas IN rg_matnr.
gs_bloque02-materiales = gs_itab-wertn.

* Abono recorte.
ELSEIF v_bklas IN rg_recorte.

* Si es positivo.
IF gs_itab-menge > 0.
* Se considera materia prima.
gs_bloque02-mat_prima = gs_itab-wertn.

ELSE.
gs_recorte-ceco = gs_bloque02-ceco.
SHIFT gs_recorte-ceco LEFT DELETING LEADING '0'.
gs_recorte-mat_prima = gs_itab-wertn.
gs_recorte-produccion = gs_itab-menge.
gs_recorte-um = gs_itab-meeht.
COLLECT gs_recorte INTO gt_recorte.
* Seguimos con el siguiente registro.
CONTINUE.

ENDIF.

ENDIF.

WHEN 'E'. "Valor añadido y Energia.

* Energia.
IF gs_itab-lstar IN rg_energia.

Pag. 13 de 29
Ejemplo Abap - Adobe Forms
gs_bloque02-energia = gs_itab-wertn.

* Valor añadido.
ELSEIF gs_itab-lstar IN rg_valora.
gs_bloque02-valor_a = gs_itab-wertn.

ENDIF.

WHEN OTHERS.

ENDCASE.

* Grabamos el registro.
COLLECT gs_bloque02 INTO gt_bloque02_tmp.

CLEAR gs_itab.

ENDLOOP.

CLEAR gv_numlin.

*** Desglose y Abono recorte *******************************************


LOOP AT gt_bloque02_tmp INTO gs_bloque02.

* Contador de número de línea.


gv_numlin = gv_numlin + 1.
gs_bloque02-numlin = gv_numlin.
gs_bloque02-tipolinea = c_desglose. "Tipo desglose

* Si el ceco está en blanco.


IF gs_bloque02-ceco IS INITIAL.
* Movemos el ceco que hemos guardado previamente.
gs_bloque02-kostl = lv_ceco.

* Si no.
ELSE.
* Asignamos el ceco de la línea al bloque y a la variable local.
gs_bloque02-kostl = gs_bloque02-ceco.
lv_ceco = gs_bloque02-ceco.

ENDIF.

CLEAR gs_prods.

* Recuperamos la productividad y la merma.


READ TABLE gt_prods INTO gs_prods WITH KEY kostl = gs_bloque02-ceco.

IF sy-subrc = 0.

gs_bloque02-produccion = gs_prods-prod.
gs_bloque02-turno = gs_prods-turno.

* ecampos 27.01.2014 cambio de merma por JCLL.


IF gs_prods-merma <> 0.
gs_bloque02-porc_merma = gs_prods-merma * -1.
ELSE.
gs_bloque02-porc_merma = 0.
ENDIF.

IF gs_prods-tlote <> 0.

* Coste unitario.
gs_bloque02-coste_unitario = gs_bloque02-produccion *
gs_bloque02-valor_a /

Pag. 14 de 29
Ejemplo Abap - Adobe Forms
gs_prods-tlote.
ENDIF.

ENDIF.

CLEAR lv_ktext.

* Obtenemos la denominación del ceco.


SELECT SINGLE ktext
INTO lv_ktext
FROM cskt
WHERE spras = 'S'
AND kokrs = gs_keko-kokrs
AND kostl = gs_bloque02-ceco
AND datbi >= p_fecha.

CLEAR txt_ceco.
WRITE gs_bloque02-ceco TO txt_ceco NO-ZERO NO-GAP.
SHIFT txt_ceco LEFT DELETING LEADING space.

* Movemos la denominación del material.


CONCATENATE txt_ceco lv_ktext
INTO gs_bloque02-ceco
SEPARATED BY space.

* Total de ceco
gs_bloque02-total_ceco = gs_bloque02-materiales +
gs_bloque02-mat_prima +
gs_bloque02-energia +
gs_bloque02-valor_a.

* Modificamos el registro.
APPEND gs_bloque02 TO gt_bloque02.

* Posición de recorte.
CLEAR gs_recorte.
READ TABLE gt_recorte INTO gs_recorte
WITH KEY ceco = txt_ceco.

CLEAR gs_bloque02.
gs_bloque02-kostl = lv_ceco.
gs_bloque02-numlin = gv_numlin.
gs_bloque02-tipolinea = c_abonorecorte. "Abono Recorte
gs_bloque02-ceco = 'Abono Recorte'.
gs_bloque02-produccion = gs_recorte-produccion.
gs_bloque02-mat_prima = gs_recorte-mat_prima.
gs_bloque02-total_ceco = gs_recorte-mat_prima.
gs_bloque02-turno = gs_recorte-um.

* Añadimos el registro.
APPEND gs_bloque02 TO gt_bloque02.

ENDLOOP.

*** Recorte total ******************************************************


PERFORM calcular_recorte.

*** Total con merma ****************************************************


PERFORM acumulado_y_recalculo_merma.

* Ordenamos la tabla para que los registros de merma se ordenen.


SORT gt_bloque02.

*** Cabecera ***********************************************************

Pag. 15 de 29
Ejemplo Abap - Adobe Forms
CLEAR: gs_cabecera, gt_cabecera[].

gs_cabecera-fecha = sy-datum.
gs_cabecera-hora = sy-uzeit.
gs_cabecera-cod_produ = gv_matnr.

SELECT SINGLE maktx


INTO gs_cabecera-denom_produ
FROM makt
WHERE spras = 'S' "Mod.JMM-301014
AND matnr = gs_cabecera-cod_produ.

gs_cabecera-cod_partida = gv_matnr_exp.

SELECT SINGLE maktx


INTO gs_cabecera-denom_partida
FROM makt
WHERE spras = 'S' "Mod.JMM-301014
AND matnr = gs_cabecera-cod_partida.

gs_cabecera-variantecc = p_klvar.
gs_cabecera-centro = p_werks.

SELECT SINGLE name1


INTO gs_cabecera-denom_centro
FROM t001w
WHERE werks = p_werks.

CLEAR gs_keko.
READ TABLE gt_keko INTO gs_keko INDEX 1.

gs_cabecera-status_cc = gs_keko-feh_sta.

PERFORM calcular_gramaje USING gv_matnr_exp gs_keko-matnr


CHANGING gs_cabecera-gr_m2 gs_cabecera-gr_lib.

gs_cabecera-tamlote = gv_lote.
gs_cabecera-meins = gv_meins.
gs_cabecera-pci = gv_pci.

APPEND gs_cabecera TO gt_cabecera.

* Puesto que los cambios de página en este formulario son un tanto


* peculiares, se requiere controlar las páginas que se mostrarán.
PERFORM preparar_paginas_formulario.

ENDFORM. " TRATAR_DATOS

*&---------------------------------------------------------------------*
*& Form CALCULAR_RECORTE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM calcular_recorte .

DATA: ls_tot TYPE zco_ficha_coste_bloque02.


CLEAR ls_tot.

ls_tot-ceco = 'Tot. Recorte'.

Pag. 16 de 29
Ejemplo Abap - Adobe Forms
* Acumulamos los recortes.
LOOP AT gt_bloque02 INTO gs_bloque02 WHERE tipolinea = c_abonorecorte.

ls_tot-produccion = ls_tot-produccion + gs_bloque02-produccion.


ls_tot-mat_prima = ls_tot-mat_prima + gs_bloque02-mat_prima.

ENDLOOP.

ls_tot-numlin = 99.

ls_tot-tipolinea = c_totalrecorte.

APPEND ls_tot TO gt_bloque02.


CLEAR gs_bloque02.

ENDFORM. " CALCULAR_RECORTE

*&---------------------------------------------------------------------*
*& Form CALCULAR_GRAMAJE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GV_MATNR_EXP text
* <--P_GS_CABECERA_GR_M2 text
* <--P_GS_CABECERA_GR_LIB text
*----------------------------------------------------------------------*
FORM calcular_gramaje USING pi_matnr_exp pi_matnr_ini
CHANGING po_m2
po_lib.

CLEAR: po_lib, po_m2.

* Obtenemos la unidad de medida del material.


SELECT SINGLE meins
INTO gv_meins
FROM mara
WHERE matnr = pi_matnr_ini.

CHECK gv_meins IS NOT INITIAL.

* ecampos 27.01.2014 cambiamos los GR/LIB por LIB/CJT.


* Para libritos.
IF gv_meins = 'LIB'.

CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'


EXPORTING
i_matnr = pi_matnr_ini
i_in_me = 'CS'
i_out_me = 'LIB'
i_menge =1
IMPORTING
e_menge = po_lib
EXCEPTIONS
error_in_application = 1
error =2
OTHERS = 3.

ENDIF.

*-----------------------------------------------------------
* Para el resto.
*-----------------------------------------------------------

Pag. 17 de 29
Ejemplo Abap - Adobe Forms
* INCIO Delete <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Mod. JMM-
301014
**
** CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
** EXPORTING
** i_matnr = pi_matnr_exp
** i_in_me = 'M2'
** i_out_me = 'G'
** i_menge =1
** IMPORTING
** e_menge = po_m2
** EXCEPTIONS
** error_in_application = 1
** error =2
** OTHERS = 3.
**
** EXIT.
**
* FIN Delete <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Mod. JMM-
301014

* INCIO Modif <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Mod. JMM-


301014

* Variables Locales
DATA: lv_gramaje TYPE cabn-atinn,
lv_cuobj LIKE inob-cuobj,
lv_atflv LIKE ausp-atflv.

*-----------------------------------------------------------
* Seleccionamos el número de característica del GRAMAJE.
*-----------------------------------------------------------
SELECT SINGLE atinn
INTO lv_gramaje
FROM cabn
WHERE atnam = 'GRAMAJE'.

* Seleccionamos el código de objeto del material.


CLEAR lv_cuobj.

SELECT SINGLE cuobj


INTO lv_cuobj
FROM inob
WHERE objek = pi_matnr_exp.

* Obtenemos el GRAMAJE
CLEAR: lv_atflv.

SELECT SINGLE atflv


INTO lv_atflv
FROM ausp
WHERE objek = lv_cuobj
AND atinn = lv_gramaje.

MOVE lv_atflv TO po_m2.

* FIN Modif <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Mod. JMM-301014

ENDFORM. " CALCULAR_GRAMAJE

Pag. 18 de 29
Ejemplo Abap - Adobe Forms
*&---------------------------------------------------------------------*
*& Form SELECCION_MATERIALES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM seleccion_materiales .

* Seleccionamos los datos del maestro.


SELECT matnr
INTO TABLE gt_matnr
FROM mara
WHERE matnr IN so_matnr.

SORT gt_matnr.
DELETE ADJACENT DUPLICATES FROM gt_matnr.

ENDFORM. " SELECCION_MATERIALES

*&---------------------------------------------------------------------*
*& Form ABRIR_FORMULARIO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM abrir_formulario .

CLEAR: docparams, formoutput, outputparams, gv_fm_name.

"Borrar tras salida (parámetros de impresión)


* outputparams-REQDEL = 'X'.
"Orden SPOOL nueva (parámetros de impresión)
outputparams-reqnew = 'X'.
"La orden SPOOL ha concluido
outputparams-reqfinal = 'X'.

IF sy-batch = ''.
"Salidas inmediatas (parámetros de impresión)
outputparams-reqimm = 'X'.
ELSE.
outputparams-reqimm = ''.
outputparams-dest = sy-pdest.
ENDIF.

CALL FUNCTION 'FP_JOB_OPEN'


CHANGING
ie_outputparams = outputparams
EXCEPTIONS
cancel =1
usage_error =2
system_error = 3
internal_error = 4
OTHERS = 5.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Pag. 19 de 29
Ejemplo Abap - Adobe Forms
* docparams-langu = 'E'.
* docparams-country = 'US'.
* docparams-fillable = 'X'.

CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'


EXPORTING
i_name = 'ZCO_FICHA_COSTES_2'
IMPORTING
e_funcname = gv_fm_name.

ENDFORM. " ABRIR_FORMULARIO

*&---------------------------------------------------------------------*
*& Form CERRAR_FORMULARIO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM cerrar_formulario .

CALL FUNCTION 'FP_JOB_CLOSE'


* IMPORTING
* E_RESULT =
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " CERRAR_FORMULARIO

*&---------------------------------------------------------------------*
*& Form MOSTRAR_PROGRESO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM mostrar_progreso .

* Sólo lo mostramos en proceso online


CHECK sy-batch = ''.

CLEAR txt_matnr.

* Convertimos el material con los guiones.


CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = gv_matnr
IMPORTING
output = txt_matnr.

* Confeccionamos texto.
CONCATENATE 'Calculando material:' txt_matnr INTO txt_matnr
SEPARATED BY space.

Pag. 20 de 29
Ejemplo Abap - Adobe Forms
* Calculamos el porcentaje
gv_porcen = gv_tabix * 100 / gv_lines.

* Solo mostramos el progreso cuando cambia de número.


IF gv_porcen <> gv_porcen_ant.

gv_porcen_ant = gv_porcen.

* Mostramos texto.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = gv_porcen
text = txt_matnr.

ENDIF.

ENDFORM. " MOSTRAR_PROGRESO

*&---------------------------------------------------------------------*
*& Form LIMPIAR_DATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM limpiar_datos .

REFRESH: gt_lista, gt_keko, gt_cabecera, gt_bloque01, gt_bloque02,


gt_bloque02, gt_bloque02_tmp, gt_prods, gt_recorte, gt_explo.

CLEAR: gt_lista, gs_itab, gs_bloque01, gs_bloque02, gs_keko,


gs_cabecera, gs_prods, gs_recorte, gs_explo.

CLEAR: v_lines, v_bklas, v_ceco, txt_ceco, v_tabix, gv_matnr_exp,


txt_matnr, gv_porcen.

ENDFORM. " LIMPIAR_DATOS

*&---------------------------------------------------------------------*
*& Form PREPARAR_PAGINAS_FORMULARIO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM preparar_paginas_formulario .

DATA: lv_tabix_bl1 TYPE sy-tabix,


lv_tabix_bl2 TYPE sy-tabix,
lv_tabix_ficha TYPE sy-tabix,
lv_lin_bl1 TYPE sy-tabix,
lv_lin_bl2 TYPE sy-tabix,
lv_tot_bl1 TYPE sy-tabix,
lv_tot_bl2 TYPE sy-tabix,
lv_numpag TYPE sy-tabix.

CLEAR: gs_ficha_coste, lv_tabix_bl1, lv_tabix_bl2, lv_tot_bl1,


lv_tot_bl2.
REFRESH: gt_ficha_coste.

DESCRIBE TABLE gt_bloque01 LINES lv_tot_bl1.


DESCRIBE TABLE gt_bloque02 LINES lv_tot_bl2.

Pag. 21 de 29
Ejemplo Abap - Adobe Forms

* La página 1 siempre existirá.


gs_ficha_coste-numpag = lv_numpag = 1.

* Leemos la cabecera.
READ TABLE gt_cabecera INTO gs_cabecera INDEX 1.
* La grabamos.
APPEND gs_cabecera TO gs_ficha_coste-cabecera.

CLEAR: lv_lin_bl1.

* Recorremos la tabla del bloque1.


LOOP AT gt_bloque01 INTO gs_bloque01.

* Guardamos la posición de la tabla en la que estamos.


lv_tabix_bl1 = sy-tabix.

* Contador de líneas.
lv_lin_bl1 = lv_lin_bl1 + 1.

* Grabamos la posición.
APPEND gs_bloque01 TO gs_ficha_coste-bloque01.

* Si hemos llegado al final de la tabla.


IF lv_tabix_bl1 = lv_tot_bl1.

* Grabamos el registro en la tabla.


APPEND gs_ficha_coste TO gt_ficha_coste.
CLEAR gs_ficha_coste.

* Si llegamos al máximo de líneas por página.


ELSEIF lv_lin_bl1 >= 36.

* Grabamos el registro en la tabla.


APPEND gs_ficha_coste TO gt_ficha_coste.
CLEAR gs_ficha_coste.

* Añadimos una página nueva.


lv_numpag = lv_numpag + 1.
gs_ficha_coste-numpag = lv_numpag.

* Leemos la cabecera.
READ TABLE gt_cabecera INTO gs_cabecera INDEX 1.
* La grabamos.
APPEND gs_cabecera TO gs_ficha_coste-cabecera.

* Limpiamos el contador de líneas.


CLEAR: lv_lin_bl1.

ENDIF.

ENDLOOP.

CLEAR: gs_ficha_coste.

* Recorremos las páginas creadas en el bloque1 para añadir los registros


* del bloque2
READ TABLE gt_ficha_coste INTO gs_ficha_coste INDEX 1.

* Guardamos el índice del registro.


lv_tabix_ficha = sy-tabix.

* Limpiamos el contador de líneas.

Pag. 22 de 29
Ejemplo Abap - Adobe Forms
CLEAR: lv_lin_bl2.

* Recorremos la tabla del bloque2.


LOOP AT gt_bloque02 INTO gs_bloque02.

* Guardamos la posición de la tabla en la que estamos.


lv_tabix_bl2 = sy-tabix.

* Aumentamos el contador de líneas.


lv_lin_bl2 = lv_lin_bl2 + 1.

* Grabamos la posición.
APPEND gs_bloque02 TO gs_ficha_coste-bloque02.

* Si hemos llegado al final de la tabla.


IF lv_tabix_bl2 = lv_tot_bl2.

* Modificamos el registro en la tabla.


MODIFY gt_ficha_coste FROM gs_ficha_coste INDEX lv_tabix_ficha.
CLEAR gs_ficha_coste.

* Si llegamos al máximo de líneas por página.


ELSEIF lv_lin_bl2 >= 36.

* Modificamos el registro en la tabla.


MODIFY gt_ficha_coste FROM gs_ficha_coste INDEX lv_tabix_ficha.
CLEAR gs_ficha_coste.

lv_tabix_ficha = lv_tabix_ficha + 1.

* Leemos el siguiente registro de página.


READ TABLE gt_ficha_coste INTO gs_ficha_coste
INDEX lv_tabix_ficha.

* Limpiamos el contador de líneas.


CLEAR: lv_lin_bl2.

ENDIF.

ENDLOOP.

ENDFORM. " PREPARAR_PAGINAS_FORMULARIO

*&---------------------------------------------------------------------*
*& Form ACUMULADO_Y_RECALCULO_MERMA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM acumulado_y_recalculo_merma.

DATA: ls_recalculoant TYPE zco_ficha_coste_bloque02,


ls_abonorecorte TYPE zco_ficha_coste_bloque02,
ls_desglose TYPE zco_ficha_coste_bloque02,
ls_sigdesglose TYPE zco_ficha_coste_bloque02,
ls_acumulado TYPE zco_ficha_coste_bloque02,
ls_recalculo TYPE zco_ficha_coste_bloque02.

DATA: l_lineaant TYPE i,


l_lineapost TYPE i,
l_matnr TYPE mara-matnr.

Pag. 23 de 29
Ejemplo Abap - Adobe Forms

* Recorremos las posiciones de Detalle de Máquina a partir de la cual


* calcularemos la posición de Acumulados y de Recálculo por merma.
LOOP AT gt_bloque02 INTO ls_desglose WHERE tipolinea = c_desglose.

*** Línea de Acumulados **********************************************

* Restamos 1 al número de línea del registro de acumulados.


l_lineaant = ls_desglose-numlin - 1.

CLEAR: ls_recalculoant.
* Obtenemos la línea del recalculo por merma anterior.
READ TABLE gt_bloque02 INTO ls_recalculoant
WITH KEY numlin = l_lineaant
tipolinea = c_recalculomerma.

CLEAR: ls_abonorecorte.
* Obtenemos la línea del abono recorte de la línea actual.
READ TABLE gt_bloque02 INTO ls_abonorecorte
WITH KEY numlin = ls_desglose-numlin
tipolinea = c_abonorecorte.

* Limpiamos la estructura donde crearemos la línea nueva.


CLEAR: ls_acumulado.

ls_acumulado-numlin = ls_desglose-numlin.
ls_acumulado-tipolinea = c_acumulado.
ls_acumulado-kostl = ls_desglose-kostl.
ls_acumulado-ceco = '*Acumulado'.

CLEAR gs_explo.
* Obtenemos el material del Ceco.
READ TABLE gt_explo INTO gs_explo
WITH KEY kostl = ls_acumulado-kostl.
* Si existe.
IF sy-subrc = 0.
CLEAR l_matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = gs_explo-matnr
IMPORTING
output = l_matnr.
* Concatenamos el material a la descripción.
CONCATENATE ls_acumulado-ceco l_matnr INTO ls_acumulado-ceco
SEPARATED BY space.
ENDIF.

* Calculamos los valores del registro de la línea.


ls_acumulado-mat_prima = ls_desglose-mat_prima +
ls_recalculoant-mat_prima +
ls_abonorecorte-mat_prima.
ls_acumulado-energia = ls_desglose-energia +
ls_recalculoant-energia +
ls_abonorecorte-energia.
ls_acumulado-valor_a = ls_desglose-valor_a +
ls_recalculoant-valor_a +
ls_abonorecorte-valor_a.
ls_acumulado-materiales = ls_desglose-materiales +
ls_recalculoant-materiales +
ls_abonorecorte-materiales.

* Cálculo de PCI.
ls_acumulado-pci_acum = ls_acumulado-mat_prima +
ls_acumulado-energia +

Pag. 24 de 29
Ejemplo Abap - Adobe Forms
ls_acumulado-valor_a +
ls_acumulado-materiales.

* Esta variable es la que se utiliza para el total PCI de Cabecera.


* El último valor que se asigne a esta variable es el que aparece.
gv_pci = ls_acumulado-pci_acum.

* Guardamos el registro.
APPEND ls_acumulado TO gt_bloque02.

*** Línea de Recálculo por merma *************************************

CLEAR: ls_recalculo.

ls_recalculo-numlin = ls_acumulado-numlin.
ls_recalculo-tipolinea = c_recalculomerma.
ls_recalculo-ceco = ''.
ls_recalculo-pci_acum = 0.
ls_recalculo-kostl = ls_acumulado-kostl.

* Sumamos 1 al número de línea del registro de Desglose.


l_lineapost = ls_acumulado-numlin + 1.

CLEAR ls_sigdesglose.
* Obtenemos el registro siguiente de Ceco.
READ TABLE gt_bloque02 INTO ls_sigdesglose
WITH KEY numlin = l_lineapost
tipolinea = c_desglose.

* Si lo encontramos.
IF sy-subrc = 0.

* Si tiene merma, calculamos los importes.


IF ls_sigdesglose-porc_merma <> 0.

ls_recalculo-mat_prima = ls_acumulado-mat_prima /
( ( 100 - ls_sigdesglose-porc_merma ) /
100 ).
ls_recalculo-energia = ls_acumulado-energia /
( ( 100 - ls_sigdesglose-porc_merma ) /
100 ).
ls_recalculo-valor_a = ls_acumulado-valor_a /
( ( 100 - ls_sigdesglose-porc_merma ) /
100 ).
ls_recalculo-materiales = ls_acumulado-materiales /
( ( 100 - ls_sigdesglose-porc_merma ) /
100 ).
ELSE.

ls_recalculo-mat_prima = ls_acumulado-mat_prima.
ls_recalculo-energia = ls_acumulado-energia.
ls_recalculo-valor_a = ls_acumulado-valor_a.
ls_recalculo-materiales = ls_acumulado-materiales.

ENDIF.

* Acumulado de ceco.
ls_recalculo-total_ceco = ls_recalculo-mat_prima +
ls_recalculo-energia +
ls_recalculo-valor_a +
ls_recalculo-materiales.

* Grabamos el registro de Recálculo por merma.


APPEND ls_recalculo TO gt_bloque02.

Pag. 25 de 29
Ejemplo Abap - Adobe Forms

ENDIF.

ENDLOOP.

ENDFORM. " ACUMULADO_Y_RECALCULO_MERMA

Pag. 26 de 29
Ejemplo Abap - Adobe Forms

Pag. 27 de 29
Ejemplo Abap - Adobe Forms
Transacción SFP :

Formulario : ZCO_FICHA_COSTES_2

Pag. 28 de 29
Ejemplo Abap - Adobe Forms

Pag. 29 de 29

También podría gustarte