Ver Mensaje Individual
  #5  
Viejo 05/07/13, 19:06:04
torsku torsku is offline
Junior Member
 
Fecha de Ingreso: jun 2013
Mensajes: 3

Buenas compañero, voy a intentar poner el código lo más claro posible, quiero que me digas si está hecho correctamente, y si es posible, que me expliques las cosas que pongo en rojo. Muchísimas gracias de antemano!!

Aclaro que utilizamos una plantilla para hacer el ejercicio.

REPORT LINE-SIZE 176
LINE-COUNT 65
NO STANDARD PAGE HEADING
MESSAGE-ID zmalaga.

************************************************************************
* PROGRAM ...... *
* DESCRIPTION .. Programa en el que pretendemos mostrar un listado de *
* materiales por planta y almacén *
* FUNCTION ..... *
* Ascendant ref. *
* AUTHOR ....... *
* DATE WRITTEN . *
* R/3 RELEASE .. *
*======================================================================*
* COPIED FROM .. *
* TITLE ORIGINAL *
*----------------------------------------------------------------------*
* PROGRAM TYPE . Executable *
* DEV. CLASS ... ZFRP *
* LOGICAL DB ... *
*======================================================================*
* MODIFICATION HISTORY *
* Date BY Chg Note # SDS Description *
* Vers *
* ---------- --- ---------------------------------------------------- *
* dd/MM/YYYY 1.0 Initial Version *
* DD/MM/YYYY 2.0 *
************************************************************************
*
* Data Includes *
*
* INCLUDE:

*-----------------------------------------------------------------------
* Tables *
*-----------------------------------------------------------------------

TABLES: mard.

* TYPE-POOLS: SLIS.

TYPES: BEGIN OF t_mard,
werks TYPE werks_d,
matnr TYPE matnr,
lgort TYPE lgort_d,
END OF t_mard.

TYPES: BEGIN OF t_salida,
werks TYPE werks,
matnr TYPE matnr,
lgort TYPE lgort_d,
maktx TYPE maktx,
lgobe TYPE lgobe,
name1 TYPE name1,
END OF t_salida.
*-----------------------------------------------------------------------
* Data
*-----------------------------------------------------------------------
* DATA - WORK-AREAS

* Data - Internal Tables

DATA: wa_mard TYPE t_mard,
it_mard TYPE STANDARD TABLE OF t_mard.

DATA: wa_salida TYPE t_salida,
it_salida TYPE STANDARD TABLE OF t_salida.

* Internal table for customer data and accounting data


*
* Data - Structures *

*
* Data - Constants *
* CONSTANTS:

* Data - Variables and flags *
*DATA:


*-----------------------------------------------------------------------
* Ranges
*-----------------------------------------------------------------------
* RANGES:


*-----------------------------------------------------------------------
* Field Symbols
*-----------------------------------------------------------------------

*-----------------------------------------------------------------------
* Field Groups
*-----------------------------------------------------------------------

*-----------------------------------------------------------------------
* Select options / Parameters
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-b01.

PARAMETERS p_werks TYPE werks.

SELECT-OPTIONS: s_matnr FOR mard-matnr, "Material
s_lgort FOR mard-lgort. "Storage Location

SELECTION-SCREEN END OF BLOCK b1.


*-----------------------------------------------------------------------
* Define classes *
*-----------------------------------------------------------------------
* CLASS ????? DEFINITION.

*-----------------------------------------------------------------------
* Initialisation
*-----------------------------------------------------------------------
INITIALIZATION.

* initialize global data.
PERFORM f_initialize.

*-----------------------------------------------------------------------
* Selection Screen
*-----------------------------------------------------------------------
*AT SELECTION-SCREEN.

AT SELECTION-SCREEN ON p_werks.

SELECT COUNT(*)
FROM t001w
WHERE werks = p_werks.

* AT SELECTION-SCREEN ON .....

IF sy-dbcnt EQ 0.
MESSAGE e065(zmalaga).
ENDIF.

AT SELECTION-SCREEN ON s_matnr.
SELECT COUNT(*)
FROM mara
WHERE matnr IN s_matnr.

IF sy-dbcnt EQ 0.
MESSAGE e066(zmalaga).
ENDIF.

AT SELECTION-SCREEN ON s_lgort.
SELECT COUNT(*)
FROM t001l
WHERE lgort IN s_lgort.

IF sy-dbcnt EQ 0.
MESSAGE e067(zmalaga).
ENDIF.
*-----------------------------------------------------------------------
* Selection
*-----------------------------------------------------------------------
* start of selection
*
START-OF-SELECTION.

PERFORM f_process.
* End of selection.
*
END-OF-SELECTION.


*-----------------------------------------------------------------------
* End of Program
*-----------------------------------------------------------------------
* Standard end of program is written in F_END_OF_LIST


* free internal tables
PERFORM f_free_tables.


*-----------------------------------------------------------------------
* Top of page
*-----------------------------------------------------------------------
TOP-OF-PAGE.

*-----------------------------------------------------------------------
* User commands
*-----------------------------------------------------------------------
AT USER-COMMAND.


*-----------------------------------------------------------------------
* Processing routines - Forms
*-----------------------------------------------------------------------




*&---------------------------------------------------------------------*
*& Form f_initialize
*&---------------------------------------------------------------------*
* initialize global data.
*----------------------------------------------------------------------*
FORM f_initialize.




ENDFORM
. " f_initialize


*&---------------------------------------------------------------------*
*& Form f_process
*&---------------------------------------------------------------------*
* program process.
*----------------------------------------------------------------------*
FORM f_process.

PERFORM f_select_matnr.
PERFORM f_retrieve_data.
PERFORM f_write_report.

ENDFORM. " f_process


*&---------------------------------------------------------------------*
*& Form f_free_tables
*&---------------------------------------------------------------------*
* liberar las tablas.
*----------------------------------------------------------------------*
FORM f_free_tables.




ENDFORM. " f_free_tables

*&---------------------------------------------------------------------*
*& Form F_SELECT_MATNR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_select_matnr .

SELECT werks matnr lgort
FROM mard
INTO TABLE it_mard
WHERE werks = p_werks
AND matnr IN s_matnr
AND lgort IN s_lgort.

IF sy-subrc NE 0.
MESSAGE e005(zmalaga).
ENDIF.

ENDFORM. " F_SELECT_MATNR

*&---------------------------------------------------------------------*
*& Form F_RETRIEVE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_retrieve_data .
LOOP AT it_mard INTO wa_mard.
wa_salida = wa_mard. "HEMOS METIDO LOS TRES CAMPOS DE MARD EN SALIDA

SELECT SINGLE name1
FROM t001w "TABLA DE LA QUE PROVIENE
INTO wa_salida-name1 "CAMPO DONDE QUEREMOS METERLO
WHERE werks = wa_mard-werks.

IF sy-dbcnt EQ 0.
CLEAR wa_salida-name1.
ENDIF.

********************************************

SELECT SINGLE lgobe
FROM t001l
INTO wa_salida-lgobe
WHERE lgort = wa_mard-lgort.

IF sy-dbcnt EQ 0.
CLEAR wa_salida-lgobe. Por qué y para qué hace este clear?
ENDIF.

********************************************

SELECT SINGLE maktx
FROM makt
INTO wa_salida-maktx
WHERE matnr = wa_salida-matnr.

IF sy-dbcnt EQ 0. ¿Para qué sirve esta sentencia? La utilizamos mucho
CLEAR wa_salida-maktx.
ENDIF.

APPEND wa_salida TO it_salida.

CLEAR wa_salida.

ENDLOOP.

ENDFORM. " F_RETRIEVE_DATA

*&---------------------------------------------------------------------*
*& Form F_WRITE_REPORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_write_report .

write:/'Título del report'.

SORT it_mard BY werks lgort matnr.
LOOP AT it_mard INTO wa_mard.

AT NEW werks.
skip.
WRITE: /'Planta', wa_mard-werks INTENSIFIED on.
READ TABLE it_salida INTO wa_salida WITH KEY werks = wa_mard-werks.

IF sy-subrc EQ 0.
WRITE: wa_salida-name1 .
ENDIF.

ENDAT.

AT NEW lgort.
WRITE: /'Almacen', wa_mard-lgort INTENSIFIED on.
READ TABLE it_salida INTO wa_salida WITH KEY lgort = wa_mard-lgort.
IF sy-subrc EQ 0.
WRITE: wa_salida-lgobe .
SKIP.
WRITE sy-uline.
skip.
ENDIF.
ENDAT.


WRITE : / wa_mard-matnr intensified off.
READ TABLE it_salida INTO wa_salida WITH KEY matnr = wa_mard-matnr.
IF sy-subrc EQ 0.
WRITE: wa_salida-maktx intensified off.
ENDIF.

ENDLOOP.

ENDFORM. " F_WRITE_REPORT

Úlima edición por torsku fecha: 13/08/13 a las 04:56:38.
Responder Con Cita