PDA

Ver la Versión Completa : Pasos para hacer un ejercicio básico [Ayuda]


torsku
30/06/13, 12:02:28
Buenas tardes a todos:

Me he registrado en este foro por ver si puedo aprender a desarrollar SAP con vuestra ayuda, ya que estoy en un curso y me resulta bastante dificil ya que nunca he programado y no quiero retrasar la clase.

El ejercicio en cuestión es muy simple, os lo pongo en un enlace dropbox, pulsáis y descargáis:

https://dl.dropboxusercontent.com/u/13462177/ejercicio.doc

Me gustaría que me dieseis los pasos necesarios para hacerlo, voy a empezar yo a ver si me explico, os lo pongo coloreado como en el programa para que su compresión sea mayor:

Primero creamos el programa con lo que nos dice en el documento, por ahí no hay problema, lo llamamos en mi caso Z_MATNR_XX

Ahora hay que crear una pantalla de selección, en la cual ya me lio un poco. Voy a poner el código en cuestión:

Primero definimos la tabla donde se encuentra
TABLES: MATNR.

Y abajo escribimos el código para crear la pantalla de selección:
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-b01.

PARAMETERS P_WERKS TYPE WERKS.

SELECT-OPTIONS: S_MATNR FOR MATNR, "Material
S_LGORT FOR LGORT. "Storage Location

SELECTION-SCREEN END OF BLOCK B1.

Ya aquí se produce el error, intento ponerle en nombre a los campos a través de Goto/Text Elements/Selection Texts, y me doy cuenta que Material y Almacén no se visualizan y no entiendo por qué... conforme podáis ayudarme escribiré de nuevo en el foro para que también les sirva a futuros usuarios.

coloso
01/07/13, 06:39:29
Hola compañero, para ponerle la descripción donde indicas. Has probado primero a activar el programa y entonces ya te tienen que aparecer el nombre de las variables de la pantalla de selección.

Salu2.

torsku
02/07/13, 18:32:06
Hola compañero, para ponerle la descripción donde indicas. Has probado primero a activar el programa y entonces ya te tienen que aparecer el nombre de las variables de la pantalla de selección.

Salu2.

Muy buenas!! Antes de nada gracias por tu respuesta.

El problema era que no había pulsado dos veces sobre "TEXT-b01" para definir un título a la "Selection Screen". Una vez hecho eso todo ha ido bien. Si pongo el código del ejercicio me podrías echar una mano? Funcionar me funciona, pero es por si está hecho correctamente.

Un saludo y gracias de nuevo!!

coloso
03/07/13, 07:00:12
Hola compañero, comparte el código y le echo un vistazo. Y me dices que dudas tienes.

Salu2.

torsku
05/07/13, 19:06:04
Hola compañero, comparte el código y le echo un vistazo. Y me dices que dudas tienes.

Salu2.

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