33
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, Pag. 1 de 33

Ejemplo - Abap Con Adobe Forms

Embed Size (px)

DESCRIPTION

Ejemplo - Abap Con Adobe Forms

Citation preview

Page 1: Ejemplo - Abap Con Adobe Forms

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

Page 2: Ejemplo - Abap Con Adobe Forms

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

Page 3: Ejemplo - Abap Con Adobe Forms

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

Page 4: Ejemplo - Abap Con Adobe Forms

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

Page 5: Ejemplo - Abap Con Adobe Forms

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

Page 6: Ejemplo - Abap Con Adobe Forms

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

Page 7: Ejemplo - Abap Con Adobe Forms

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

Page 8: Ejemplo - Abap Con Adobe Forms

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

Page 9: Ejemplo - Abap Con Adobe Forms

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

Page 10: Ejemplo - Abap Con Adobe Forms

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

Page 11: Ejemplo - Abap Con Adobe Forms

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

Page 12: Ejemplo - Abap Con Adobe Forms

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

Page 13: Ejemplo - Abap Con Adobe Forms

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

Page 14: Ejemplo - Abap Con Adobe Forms

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

Page 15: Ejemplo - Abap Con Adobe Forms

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

Page 16: Ejemplo - Abap Con Adobe Forms

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

Page 17: Ejemplo - Abap Con Adobe Forms

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

Page 18: Ejemplo - Abap Con Adobe Forms

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

Page 19: Ejemplo - Abap Con Adobe Forms

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

Page 20: Ejemplo - Abap Con Adobe Forms

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

Page 21: Ejemplo - Abap Con Adobe Forms

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

Page 22: Ejemplo - Abap Con Adobe Forms

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

Page 23: Ejemplo - Abap Con Adobe Forms

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

Page 24: Ejemplo - Abap Con Adobe Forms

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

Page 25: Ejemplo - Abap Con Adobe Forms

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

Page 26: Ejemplo - Abap Con Adobe Forms

Ejemplo Abap - Adobe Forms

ENDIF.

ENDLOOP.

ENDFORM. " ACUMULADO_Y_RECALCULO_MERMA

Pag. 26 de 29

Page 27: Ejemplo - Abap Con Adobe Forms

Ejemplo Abap - Adobe Forms

Pag. 27 de 29

Page 28: Ejemplo - Abap Con Adobe Forms

Ejemplo Abap - Adobe Forms

Transacción SFP :

Formulario : ZCO_FICHA_COSTES_2

Pag. 28 de 29

Page 29: Ejemplo - Abap Con Adobe Forms

Ejemplo Abap - Adobe Forms

Pag. 29 de 29