Está en la página 1de 29

Ejemplo Abap - Adobe Forms

************************************************************************
** NOMBRE
: ZCO_FICHA_COSTES
**
** DESCRIPCIN : Ficha de costes
**
** AUTOR
: Eduardo Campos (Sapas)
**
** FECHA
: 09.10.2013
**
************************************************************************
** MODIFICACION 1
**
**
Fecha
: 30-10-2014
**
**
Id
: JMM-301014
**
**
Autor
: Josep Martn (SAPAS)
**
**
Descripcin: 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 "Ingls" y deber de estar siempre en "Espaol".
**
**
- 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.
*----------------------------------------------------------------------*
*
DEFINICIN DE TABLAS
*----------------------------------------------------------------------*
TABLES: ckis.

*----------------------------------------------------------------------*
*
DEFINICIN DE INCLUDES
*----------------------------------------------------------------------*
*INCLUDE zut01.
*----------------------------------------------------------------------*
*
DEFINICIN 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.
*----------------------------------------------------------------------*
*
DEFINICIN 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


*----------------------------------------------------------------------*
*
DEFINICIN 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.
*----------------------------------------------------------------------*
*
DEFINICIN 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.

*----------------------------------------------------------------------*
*
DEFINICIN 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.
*----------------------------------------------------------------------*
*
DEFINICIN 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.
*----------------------------------------------------------------------*
*
DEFINICIN DE FIELD SYMBOLS
*----------------------------------------------------------------------*
*field-symbols: <fs_xxxx>.
"Descripcin
*----------------------------------------------------------------------*
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.

*----------------------------------------------------------------------*
*
DEFINICIN DE LA PANTALLA DE SELECCIN
*
*----------------------------------------------------------------------*
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 clc.coste
p_tvers TYPE keko-tvers OBLIGATORY DEFAULT '1',"Versin 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.
* Validacin autorizacin 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 pginas.
PERFORM abrir_formulario.
* Contamos las lneas 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 aade pgina.
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
PERFORM
PERFORM
PERFORM
PERFORM
PERFORM
PERFORM
PERFORM
PERFORM
PERFORM
PERFORM

obt_campos_tabla_interna USING repname 'ITAB'.


camb_descrip_campos_tabla USING 'MAKTX' 'Denominacin'.
camb_descrip_campos_tabla USING 'GPREIS' 'Precio unitario'.
camb_descrip_campos_tabla USING 'PEINH' 'Cant.Base Prec.un.'.
camb_descrip_campos_tabla USING 'WERTN' 'Total EUR'.
camb_descrip_campos_tabla USING 'MENGE' 'Unidades necesarias'
camb_descrip_campos_tabla USING 'MEEHT' 'UMB'.
camb_descrip_campos_tabla USING 'PMEHT' 'UM Precio'.
asignar_variante USING repname '/STANDARD'.
carac_gen_listado.
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 seleccin
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 ms de uno, nos quedaremos slo con uno.
* Segn el Status clculo 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 clculo del coste para el material.
IF gt_keko[] IS NOT INITIAL.
* Obtenemos la lista de material de este clculo 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 produccin segn 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 servirn para el clculo 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 tamao del clculo 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 lnea.
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 denominacin 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 genricos.
gs_bloque01-un_necesarias = gs_itab-menge.
gs_bloque01-precio_unit = gs_itab-gpreis.
gs_bloque01-total_eur
= gs_itab-wertn.
* Comprobamos si la categora de valoracin 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 categoras de acumulados.
IF sy-subrc = 0.
gs_bloque01-umb = '*'.
*

Seleccionamos la denominacin de la categora de valoracin.


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


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 denominacin 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 categora de valoracin


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 aadido 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 aadido.
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 nmero de lnea.
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 lnea 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


ENDIF.

gs_prods-tlote.

ENDIF.
CLEAR lv_ktext.
* Obtenemos la denominacin 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 denominacin 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.
* Posicin 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.
* Aadimos 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 pgina en este formulario son un tanto
* peculiares, se requiere controlar las pginas que se mostrarn.
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. JMM301014
**
** 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. JMM301014
* INCIO Modif <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Mod. JMM301014
* Variables Locales
DATA: lv_gramaje
TYPE cabn-atinn,
lv_cuobj
LIKE inob-cuobj,
lv_atflv
LIKE ausp-atflv.
*----------------------------------------------------------* Seleccionamos el nmero de caracterstica del GRAMAJE.
*----------------------------------------------------------SELECT SINGLE atinn
INTO lv_gramaje
FROM cabn
WHERE atnam = 'GRAMAJE'.
* Seleccionamos el cdigo 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 (parmetros de impresin)
* outputparams-REQDEL = 'X'.
"Orden SPOOL nueva (parmetros de impresin)
outputparams-reqnew = 'X'.
"La orden SPOOL ha concluido
outputparams-reqfinal = 'X'.
IF sy-batch = ''.
"Salidas inmediatas (parmetros de impresin)
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 .
* Slo 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 nmero.
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 pgina 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 posicin de la tabla en la que estamos.
lv_tabix_bl1 = sy-tabix.
* Contador de lneas.
lv_lin_bl1 = lv_lin_bl1 + 1.
* Grabamos la posicin.
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 mximo de lneas por pgina.


ELSEIF lv_lin_bl1 >= 36.
*

Grabamos el registro en la tabla.


APPEND gs_ficha_coste TO gt_ficha_coste.
CLEAR gs_ficha_coste.

Aadimos una pgina 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 lneas.


CLEAR: lv_lin_bl1.
ENDIF.
ENDLOOP.
CLEAR: gs_ficha_coste.

* Recorremos las pginas creadas en el bloque1 para aadir 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 lneas.
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 posicin de la tabla en la que estamos.
lv_tabix_bl2 = sy-tabix.
* Aumentamos el contador de lneas.
lv_lin_bl2 = lv_lin_bl2 + 1.
* Grabamos la posicin.
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 mximo de lneas por pgina.


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


READ TABLE gt_ficha_coste INTO gs_ficha_coste
INDEX lv_tabix_ficha.

Limpiamos el contador de lneas.


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 Mquina a partir de la cual
* calcularemos la posicin de Acumulados y de Reclculo por merma.
LOOP AT gt_bloque02 INTO ls_desglose WHERE tipolinea = c_desglose.
*** Lnea de Acumulados **********************************************
* Restamos 1 al nmero de lnea del registro de acumulados.
l_lineaant = ls_desglose-numlin - 1.
CLEAR: ls_recalculoant.
* Obtenemos la lnea 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 lnea del abono recorte de la lnea actual.
READ TABLE gt_bloque02 INTO ls_abonorecorte
WITH KEY numlin = ls_desglose-numlin
tipolinea = c_abonorecorte.
* Limpiamos la estructura donde crearemos la lnea 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 descripcin.
CONCATENATE ls_acumulado-ceco l_matnr INTO ls_acumulado-ceco
SEPARATED BY space.
ENDIF.
* Calculamos los valores del registro de la lnea.
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.
* Clculo 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.
*** Lnea de Reclculo 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 nmero de lnea 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 Reclculo 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


Transaccin SFP :
Formulario : ZCO_FICHA_COSTES_2

Pag. 28 de 29

Ejemplo Abap - Adobe Forms

Pag. 29 de 29

También podría gustarte