|
The popular Solitaire game
PROGRAM ZMN00003 NO STANDARD PAGE HEADING.
DATA: NUMBER LIKE DATATYPE-INTEGER2.
DATA: DUMMY LIKE DATATYPE-INTEGER2.
DATA: BEGIN OF CARDS OCCURS 52 ,
ENTRY TYPE I,
ROW TYPE I,
COL
TYPE I,
VIS (1),
END OF CARDS.
DATA: CARD_NUM TYPE I, SUIT_NUM TYPE I, SUIT(1), CARD(2), ROWS TYPE I.
DATA: BLANK(3) VALUE '***'.
DATA: NEXT-CARD(4) VALUE 'Next'.
DATA: RESTART(8) VALUE 'New game'.
DATA: REVEAL(6) VALUE 'Reveal'.
DATA: TEST_NUM TYPE I, TO_NUM TYPE I, MOVING_NUM TYPE I,
PILE_NUM TYPE I.
DATA: CURR_C TYPE I, CURR_H TYPE I, CURR_S TYPE I, CURR_D TYPE I.
DATA: MOVING_SUIT(1), TO_SUIT(1), MOVING_CARD(2), TO_CARD(2),
PILE_SUIT(1), PILE_CARD(2),MOVING_TYPE(1) .
DATA: MOVING_ROW TYPE I, MOVING_COL TYPE I,
TO_ROW TYPE I, TO_COL TYPE I, TEST_ROW TYPE I.
DATA: CURRENT_CARD TYPE I,
MIN_CARD TYPE I , MAX_CARD TYPE I.
DATA: CURRENTFIELD(50).
DATA: DISC_C(3),DISC_H(3),DISC_S(3),DISC_D(3).
DATA: ROWS_OUT TYPE I, COLS_OUT TYPE I.
PERFORM SHUFFLE.
PERFORM SHOW_SCREEN.
AT LINE-SELECTION.
GET CURSOR FIELD CURRENTFIELD.
PERFORM PROCESS-INPUT.
*---------------------------------------------------------------------*
* FORM SHUFFLE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM SHUFFLE.
MIN_CARD = 3.MAX_CARD = 24.
CURR_C = -1.CURR_D = -1.CURR_H = -1.CURR_S = -1.
DISC_C = 'CCC'.DISC_H = 'HHH'.DISC_S = 'SSS'.DISC_D = 'DDD'.
NUMBER = SY-UZEIT MOD 1000.
DO NUMBER TIMES.
CALL FUNCTION 'RANDOM_I2'
IMPORTING
RND_VALUE = DUMMY.
ENDDO.
REFRESH CARDS. CLEAR CARDS. SY-TABIX = 0.
WHILE SY-TABIX < 52.
*do 40 times.
CALL FUNCTION 'RANDOM_I2'
EXPORTING
RND_MIN = 0
RND_MAX = 51
IMPORTING
RND_VALUE = NUMBER.
READ TABLE CARDS WITH KEY NUMBER TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
CARDS-VIS = 'n'.
DESCRIBE TABLE CARDS LINES ROWS.
CASE ROWS.
WHEN 0.CARDS-VIS = 'y'.CARDS-ROW = 0.CARDS-COL = 0.
WHEN 7.CARDS-VIS = 'y'.CARDS-ROW = 1.CARDS-COL = 1.
WHEN 13.CARDS-VIS = 'y'.CARDS-ROW = 2.CARDS-COL = 2.
WHEN 18.CARDS-VIS = 'y'.CARDS-ROW = 3.CARDS-COL = 3.
WHEN 22.CARDS-VIS = 'y'.CARDS-ROW = 4.CARDS-COL = 4.
WHEN 25.CARDS-VIS = 'y'.CARDS-ROW = 5.CARDS-COL = 5.
WHEN 27.CARDS-VIS = 'y'.CARDS-ROW = 6.CARDS-COL = 6.
WHEN 28.CARDS-ROW = 20.CARDS-COL = 0.
ENDCASE.
CARDS-COL = CARDS-COL + 1.
CARDS-ENTRY = NUMBER.
APPEND CARDS.
ENDIF.
*enddo.
ENDWHILE.
CURRENT_CARD = MIN_CARD.
ENDFORM.
*---------------------------------------------------------------------*
* FORM SHOW_SCREEN *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM SHOW_SCREEN.
ROWS_OUT = 1.
COLS_OUT = 4.
DO 7 TIMES.
SKIP TO LINE ROWS_OUT.
POSITION COLS_OUT.
WRITE BLANK HOTSPOT.
COLS_OUT = COLS_OUT + 4.
ENDDO.
LOOP AT CARDS.
PERFORM MAKE_CARD.
IF CARDS-ROW < 20.
ROWS_OUT = CARDS-ROW + 1.
SKIP TO LINE ROWS_OUT.
COLS_OUT = CARDS-COL * 4.
POSITION COLS_OUT.
IF CARDS-VIS = 'n'.
WRITE 'XXX' COLOR OFF INTENSIFIED OFF INVERSE OFF.
ELSE.
IF SUIT = 'D' OR SUIT = 'H'.
WRITE: SUIT NO-GAP COLOR 6 INTENSIFIED INVERSE HOTSPOT,
CARD COLOR 6 INTENSIFIED INVERSE HOTSPOT.
ELSE.
WRITE: SUIT NO-GAP COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT,
CARD COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT.
ENDIF.
ENDIF.
ELSE.
SKIP TO LINE 20. COLS_OUT = CARDS-COL * 4.
IF COLS_OUT > 48.
SKIP TO LINE 21.
COLS_OUT = COLS_OUT - 48.
ENDIF.
POSITION COLS_OUT.
IF CARDS-COL = CURRENT_CARD.
PILE_SUIT = SUIT.
PILE_CARD = CARD.
PILE_NUM = CARD_NUM.
IF SUIT = 'D' OR SUIT = 'H'.
WRITE: PILE_SUIT NO-GAP COLOR 6 INTENSIFIED INVERSE HOTSPOT,
PILE_CARD COLOR 6 INTENSIFIED INVERSE HOTSPOT.
ELSE.
WRITE: PILE_SUIT NO-GAP COLOR OFF INTENSIFIED OFF HOTSPOT,
PILE_CARD COLOR OFF INTENSIFIED OFF HOTSPOT.
ENDIF.
ELSE.
IF CARDS-COL < CURRENT_CARD.
WRITE 'XXX' COLOR OFF INTENSIFIED OFF INVERSE OFF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
SKIP TO LINE 4. POSITION 40.WRITE: DISC_C
COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT.
SKIP TO LINE 4. POSITION 44. WRITE: DISC_D
COLOR 6 INTENSIFIED INVERSE HOTSPOT.
SKIP TO LINE 4. POSITION 48. WRITE: DISC_S
COLOR OFF INTENSIFIED OFF INVERSE OFF HOTSPOT.
SKIP TO LINE 4. POSITION 52. WRITE: DISC_H
COLOR 6 INTENSIFIED INVERSE HOTSPOT.
IF MIN_CARD > 0.
SKIP TO LINE 23. POSITION 1. WRITE NEXT-CARD HOTSPOT.
ENDIF.
SKIP TO LINE 23. POSITION 20. WRITE RESTART HOTSPOT.
* skip to line 23. position 40. write reveal hotspot.
SKIP TO LINE 25. POSITION 1. WRITE CURRENTFIELD.
SY-LSIND = 0.
ENDFORM.
*---------------------------------------------------------------------*
* FORM PROCESS-INPUT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM PROCESS-INPUT.
IF CURRENTFIELD = 'NEXT-CARD'.
IF CURRENT_CARD = MAX_CARD.
CURRENT_CARD = MIN_CARD.
ELSE.
CURRENT_CARD = CURRENT_CARD + 3.
IF CURRENT_CARD > MAX_CARD.
CURRENT_CARD = MAX_CARD.
ENDIF.
ENDIF.
MOVING_CARD = SPACE.
CURRENTFIELD = SPACE.
PERFORM SHOW_SCREEN.
EXIT.
ENDIF.
IF CURRENTFIELD = 'REVEAL'.
LOOP AT CARDS.
CARDS-VIS = 'y'.
MODIFY CARDS.
ENDLOOP.
PERFORM SHOW_SCREEN.
EXIT.
ENDIF.
IF CURRENTFIELD = 'RESTART'.
PERFORM SHUFFLE.
CURRENTFIELD = 'Restarting'.
PERFORM SHOW_SCREEN.
EXIT.
ENDIF.
IF MOVING_CARD = SPACE.
IF CURRENTFIELD = 'CARD' OR CURRENTFIELD = 'SUIT'.
CURRENTFIELD = SPACE.
ROWS_OUT = SY-CUROW - 1.
COLS_OUT = SY-CUCOL DIV 4.
LOOP AT CARDS.
IF CARDS-ROW = ROWS_OUT AND CARDS-COL = COLS_OUT.
CURRENTFIELD = 'Moving '.
PERFORM MAKE_CARD.
MOVING_ROW = CARDS-ROW.
MOVING_COL = CARDS-COL.
MOVING_CARD = CARD.
MOVING_SUIT = SUIT.
MOVING_TYPE = 'm'.
MOVING_NUM = CARD_NUM.
CURRENTFIELD+8(1) = SUIT.
CURRENTFIELD+9(2) = CARD.
ENDIF.
ENDLOOP.
ELSE.
IF CURRENTFIELD = 'PILE_CARD' OR CURRENTFIELD = 'PILE_SUIT'.
MOVING_CARD = PILE_CARD.
MOVING_SUIT = PILE_SUIT.
MOVING_TYPE = 'p'.
MOVING_NUM = PILE_NUM.
CURRENTFIELD = 'Moving pile card'.
CURRENTFIELD+17(1) = PILE_SUIT.
CURRENTFIELD+18(2) = PILE_CARD.
ELSE.
CURRENTFIELD = SPACE.
ENDIF.
ENDIF.
ELSE.
IF CURRENTFIELD = 'CARD' OR CURRENTFIELD = 'SUIT' OR
CURRENTFIELD = 'BLANK'.
ROWS_OUT = SY-CUROW - 1.
COLS_OUT = SY-CUCOL DIV 4.
TEST_ROW = -1.
IF CURRENTFIELD = 'BLANK'.
TO_COL = COLS_OUT.
TO_ROW = ROWS_OUT - 1.
IF MOVING_CARD = 'K'.
PERFORM MOVE_CARD.
ELSE.
CURRENTFIELD = 'Can only move K to blank'.
MOVING_CARD = SPACE.
ENDIF.
ELSE.
LOOP AT CARDS.
IF ( CARDS-ROW >= TEST_ROW AND CARDS-ROW < 20 )
AND CARDS-COL = COLS_OUT.
TEST_ROW = CARDS-ROW.
PERFORM MAKE_CARD.
TO_COL = CARDS-COL.
TO_ROW = CARDS-ROW.
TO_CARD = CARD.
TO_SUIT = SUIT.
TO_NUM = CARD_NUM.
ENDIF.
ENDLOOP.
IF TO_COL <> MOVING_COL OR MOVING_TYPE = 'p'.
IF
( ( MOVING_SUIT = 'D' OR MOVING_SUIT = 'H' ) AND
( TO_SUIT = 'D' OR TO_SUIT = 'H' ) )
OR
( ( MOVING_SUIT = 'C' OR MOVING_SUIT = 'S' ) AND
( TO_SUIT = 'S' OR TO_SUIT = 'S' ) ).
CURRENTFIELD = 'Can only put black on red or red on black'.
MOVING_CARD = SPACE.
ELSE.
TEST_NUM = TO_NUM - 1.
IF TEST_NUM = MOVING_NUM.
PERFORM MOVE_CARD.
ELSE.
CURRENTFIELD = 'Can only put on next higher card'.
MOVING_CARD = SPACE.
ENDIF.
ENDIF.
ELSE.
CURRENTFIELD = 'Can only move to another column'.
MOVING_CARD = SPACE.
ENDIF.
ENDIF.
ELSE.
IF CURRENTFIELD(4) = 'DISC'.
TO_SUIT = CURRENTFIELD+5(1).
IF MOVING_TYPE = 'p'.
ELSE.
TEST_ROW = -1.
LOOP AT CARDS.
IF CARDS-COL = MOVING_COL AND
CARDS-ROW > TEST_ROW AND CARDS-ROW < 20.
TEST_ROW = CARDS-ROW.
PERFORM MAKE_CARD.
MOVING_SUIT = SUIT.
MOVING_CARD = CARD.
MOVING_ROW = CARDS-ROW.
MOVING_COL = CARDS-COL.
MOVING_NUM = CARD_NUM.
ENDIF.
ENDLOOP.
ENDIF.
IF MOVING_SUIT = TO_SUIT.
CASE MOVING_SUIT.
WHEN 'C'. TEST_NUM = CURR_C + 1.
WHEN 'H'. TEST_NUM = CURR_H + 1.
WHEN 'D'. TEST_NUM = CURR_D + 1.
WHEN 'S'. TEST_NUM = CURR_S + 1.
ENDCASE.
IF TEST_NUM = MOVING_NUM.
PERFORM DISCARD_CARD.
CASE MOVING_SUIT.
WHEN 'C'. CURR_C = CURR_C + 1.
WHEN 'D'. CURR_D = CURR_D + 1.
WHEN 'S'. CURR_S = CURR_S + 1.
WHEN 'H'. CURR_H = CURR_H + 1.
ENDCASE.
ELSE.
CURRENTFIELD = 'Can only discard on next lower card'.
MOVING_CARD = SPACE.
ENDIF.
ELSE.
MOVING_CARD = SPACE.
CURRENTFIELD = 'Can only discard on same suit'.
ENDIF.
ELSE.
MOVING_CARD = SPACE.
CURRENTFIELD = SPACE.
ENDIF.
ENDIF.
ENDIF.
PERFORM SHOW_SCREEN.
ENDFORM.
*---------------------------------------------------------------------*
* FORM MAKE_CARD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM MAKE_CARD.
SUIT_NUM = CARDS-ENTRY DIV 13 .
CASE SUIT_NUM.
WHEN 0.SUIT = 'D'.
WHEN 1.SUIT = 'H'.
WHEN 2.SUIT = 'C'.
WHEN 3.SUIT = 'S'.
ENDCASE.
CARD_NUM = CARDS-ENTRY MOD 13.
CASE CARD_NUM.
WHEN 0.CARD = 'A'.
WHEN 1.CARD = '2'.
WHEN 2.CARD = '3'.
WHEN 3.CARD = '4'.
WHEN 4.CARD = '5'.
WHEN 5.CARD = '6'.
WHEN 6.CARD = '7'.
WHEN 7.CARD = '8'.
WHEN 8.CARD = '9'.
WHEN 9.CARD = '10'.
WHEN 10.CARD = 'J'.
WHEN 11.CARD = 'Q'.
WHEN 12.CARD = 'K'.
ENDCASE.
ENDFORM.
*---------------------------------------------------------------------*
* FORM MOVE_CARD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM MOVE_CARD.
IF CURRENTFIELD <> 'BLANK'.
CURRENTFIELD = 'Moving xxx to'.
MOVE MOVING_SUIT TO CURRENTFIELD+7(1).
MOVE MOVING_CARD TO CURRENTFIELD+8(2).
MOVE TO_SUIT TO CURRENTFIELD+14(1).
MOVE TO_CARD TO CURRENTFIELD+15(2).
ELSE.
CURRENTFIELD = 'Starting emtpy column'.
ENDIF.
IF MOVING_TYPE = 'p'.
MOVE 'from pile' TO CURRENTFIELD+18.
LOOP AT CARDS.
IF CARDS-ROW = 20 AND CARDS-COL = CURRENT_CARD.
CARDS-COL = TO_COL.
CARDS-ROW = TO_ROW + 1.
CARDS-VIS = 'y'.
ENDIF.
IF CARDS-ROW = 20 AND CARDS-COL > CURRENT_CARD.
CARDS-COL = CARDS-COL - 1.
ENDIF.
MODIFY CARDS.
ENDLOOP.
CURRENT_CARD = CURRENT_CARD - 1.
MAX_CARD = MAX_CARD - 1.
IF MAX_CARD < MIN_CARD.
MIN_CARD = MIN_CARD - 1.
MAX_CARD = MIN_CARD.
ENDIF.
IF CURRENT_CARD < 1.
CURRENT_CARD = MIN_CARD.
ENDIF.
ELSE.
LOOP AT CARDS.
IF CARDS-COL = MOVING_COL AND
( CARDS-ROW >= MOVING_ROW AND CARDS-ROW < 20 ).
CARDS-COL = TO_COL.
CARDS-ROW = TO_ROW + 1 + CARDS-ROW - MOVING_ROW.
MODIFY CARDS.
ENDIF.
ENDLOOP.
TEST_ROW = MOVING_ROW - 1.
LOOP AT CARDS.
IF CARDS-COL = MOVING_COL AND CARDS-ROW = TEST_ROW.
CARDS-VIS = 'y'.
MODIFY CARDS.
ENDIF.
ENDLOOP.
ENDIF.
MOVING_CARD = SPACE.
ENDFORM.
*---------------------------------------------------------------------*
* FORM DISCARD_CARD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM DISCARD_CARD.
MOVE 'Discarding' TO CURRENTFIELD.
MOVE MOVING_SUIT TO CURRENTFIELD+13(1).
MOVE MOVING_CARD TO CURRENTFIELD+14(2).
CASE TO_SUIT.
WHEN 'C'.
DISC_C+1(2) = MOVING_CARD.
WHEN 'D'.
DISC_D+1(2) = MOVING_CARD.
WHEN 'H'.
DISC_H+1(2) = MOVING_CARD.
WHEN 'S'.
DISC_S+1(2) = MOVING_CARD.
ENDCASE.
IF MOVING_TYPE = 'p'.
MOVE 'from pile' TO CURRENTFIELD+18.
LOOP AT CARDS.
IF CARDS-ROW = 20 AND CARDS-COL = CURRENT_CARD.
CARDS-COL = 0.
ENDIF.
IF CARDS-ROW = 20 AND CARDS-COL > CURRENT_CARD.
CARDS-COL = CARDS-COL - 1.
ENDIF.
MODIFY CARDS.
ENDLOOP.
CURRENT_CARD = CURRENT_CARD - 1.
MAX_CARD = MAX_CARD - 1.
IF MAX_CARD < MIN_CARD.
MIN_CARD = MIN_CARD - 1.
MAX_CARD = MIN_CARD.
ENDIF.
IF CURRENT_CARD < 1.
CURRENT_CARD = MIN_CARD.
ENDIF.
ELSE.
LOOP AT CARDS.
IF CARDS-ROW = MOVING_ROW AND CARDS-COL = MOVING_COL.
CARDS-COL = 0.
MODIFY CARDS.
ENDIF.
ENDLOOP.
TEST_ROW = MOVING_ROW - 1.
LOOP AT CARDS.
IF CARDS-COL = MOVING_COL AND CARDS-ROW = TEST_ROW.
CARDS-VIS = 'y'.
MODIFY CARDS.
ENDIF.
ENDLOOP.
ENDIF.
MOVING_CARD = SPACE.
ENDFORM.
Up/Download the table content of a SAP table to/from a file REPORT ZAPC0042.
TABLES: DD02T,
DD03L.
* Linea
DATA: I_SOURCE LIKE LINE OCCURS 100 WITH HEADER LINE.
DATA L_RESP.
DATA: PROGRAM_NAME LIKE SY-CPROG.
DATA: L_MANDT.
DATA: L_LINEA(72).
DATA: L_TABLA(2000).
define ap.
APPEND &1 TO I_SOURCE.
end-of-definition.
*------PARAMETER/SELECT-OPTIONS EN PANTALLA----------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK_PAR WITH FRAME.
PARAMETERS: P_TABLA LIKE DD03L-TABNAME OBLIGATORY."Nombre de tabla
PARAMETERS: P_PATH LIKE RLGRAP-FILENAME
DEFAULT 'C:\TEMP\' OBLIGATORY.
PARAMETERS: P_BORRAR AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK BLK_PAR.
SELECTION-SCREEN BEGIN OF BLOCK BLK_PAR3 WITH FRAME TITLE TEXT-003.
PARAMETERS: P_W1(80),
P_W2(80),
P_W3(80),
P_W4(80),
P_W5(80).
SELECTION-SCREEN END OF BLOCK BLK_PAR3.
SELECTION-SCREEN BEGIN OF BLOCK BLK_PAR2 WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(6) TEXT-001.
SELECTION-SCREEN POSITION 10.
PARAMETERS: P_GRAB RADIOBUTTON GROUP RAD1 DEFAULT 'X'. "Grabar
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(6) TEXT-002.
SELECTION-SCREEN POSITION 10.
PARAMETERS: P_CARG RADIOBUTTON GROUP RAD1. "Cargar
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BLK_PAR2.
SELECTION-SCREEN BEGIN OF BLOCK BLK_PAR4 WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(6) TEXT-005.
SELECTION-SCREEN POSITION 10.
PARAMETERS: P_INS RADIOBUTTON GROUP RAD2 DEFAULT 'X'. "Insert
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(6) TEXT-006.
SELECTION-SCREEN POSITION 10.
PARAMETERS: P_MOD RADIOBUTTON GROUP RAD2. "Modify
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BLK_PAR4.
START-OF-SELECTION.
PERFORM VALIDAR_USUARIO(ZAPC0050).
PERFORM GENERAR_REPORT.
IF NOT P_CARG IS INITIAL.
IF NOT P_BORRAR IS INITIAL.
PERFORM BORRAR_TABLA.
ENDIF.
PERFORM CARGAR_TABLA.
ELSE.
PERFORM GRABAR_TABLA.
ENDIF.
*---------------------------------------------------------------------*
* FORM GENERAR_REPORT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM GENERAR_REPORT.
DATA L_TABLA(10).
CLEAR L_MANDT.
SELECT * FROM DD03L
WHERE TABNAME = P_TABLA
AND FIELDNAME = 'MANDT'.
L_MANDT = 'X'.
ENDSELECT.
CONCATENATE 'I_' P_TABLA INTO L_TABLA.
AP 'REPORT Z.'.
CONCATENATE 'TABLES' P_TABLA '.' INTO L_LINEA SEPARATED BY SPACE.
AP L_LINEA.
CONCATENATE 'DATA' L_TABLA
'LIKE' P_TABLA 'OCCURS 100 WITH HEADER LINE.'
INTO L_LINEA SEPARATED BY SPACE.
AP L_LINEA.
AP 'FORM BORRAR_TABLA.'.
IF L_MANDT = 'X'.
CONCATENATE 'DELETE FROM' P_TABLA
'CLIENT SPECIFIED WHERE MANDT = SY-MANDT.'
INTO L_LINEA SEPARATED BY SPACE.
ELSE.
IF P_BORRAR = 'X'.
MESSAGE E208(00) WITH ' cannot erase contained board by MANDT '.
ENDIF.
ENDIF.
AP L_LINEA.
AP 'ENDFORM. "BORRAR TABLA'.
AP 'FORM GRABAR_TABLA.'.
CONCATENATE 'SELECT * FROM' P_TABLA
'INTO TABLE ' L_TABLA
INTO L_LINEA SEPARATED BY SPACE.
AP L_LINEA.
IF NOT P_W1 IS INITIAL.
CONCATENATE 'WHERE' P_W1 INTO L_LINEA SEPARATED BY SPACE.
AP L_LINEA.
AP P_W2.
AP P_W3.
AP P_W4.
AP P_W5.
ENDIF.
AP '.'.
AP 'CALL FUNCTION ''WS_DOWNLOAD'''.
AP 'EXPORTING'.
CONCATENATE 'FILENAME = ''' P_PATH P_TABLA '.DAT''' INTO L_LINEA.
AP L_LINEA.
AP 'FILETYPE = ''DAT'''.
AP 'TABLES'.
CONCATENATE 'DATA_TAB = ' L_TABLA '.' INTO L_LINEA
SEPARATED BY SPACE.
AP L_LINEA.
AP 'ENDFORM. "GRABAR_TABLA'.
AP 'FORM CARGAR_TABLA.'.
AP 'CALL FUNCTION ''WS_UPLOAD'''.
AP 'EXPORTING'.
CONCATENATE 'FILENAME = ''' P_PATH P_TABLA '.DAT''' INTO L_LINEA.
AP L_LINEA.
AP 'FILETYPE = ''DAT'''.
AP 'TABLES'.
CONCATENATE 'DATA_TAB = ' L_TABLA '.' INTO L_LINEA
SEPARATED BY SPACE.
AP L_LINEA.
IF L_MANDT = 'X'.
CONCATENATE 'LOOP AT ' L_TABLA '.' INTO L_LINEA SEPARATED BY SPACE.
AP L_LINEA.
CONCATENATE L_TABLA '-MANDT = SY-MANDT.' INTO L_LINEA.
AP L_LINEA.
CONCATENATE 'MODIFY ' L_TABLA '.' INTO L_LINEA SEPARATED BY SPACE.
AP L_LINEA.
AP 'ENDLOOP.'.
ENDIF.
IF P_INS = 'X'.
CONCATENATE 'INSERT ' P_TABLA
'FROM TABLE ' L_TABLA '.'
INTO L_LINEA SEPARATED BY SPACE.
ELSE.
CONCATENATE 'MODIFY ' P_TABLA
'FROM TABLE ' L_TABLA '.'
INTO L_LINEA SEPARATED BY SPACE.
ENDIF.
AP L_LINEA.
AP 'ENDFORM. "CARGAR_TABLA'.
PERFORM GENERATE_SUBROUTINE_POOL TABLES I_SOURCE.
ENDFORM.
*---------------------------------------------------------------------*
* FORM GRABAR_TABLA *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM GRABAR_TABLA.
PERFORM GRABAR_TABLA IN PROGRAM (PROGRAM_NAME).
ENDFORM.
*---------------------------------------------------------------------*
* FORM CARGAR_TABLA *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM CARGAR_TABLA.
* message i208(00) with '¨Esta seguro de querer cargar los datos?'.
PERFORM CARGAR_TABLA IN PROGRAM (PROGRAM_NAME).
ENDFORM.
*---------------------------------------------------------------------*
* FORM BORRAR_TABLA *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM BORRAR_TABLA.
SELECT * FROM DD02T
WHERE TABNAME = P_TABLA
AND DDLANGUAGE = SY-LANGU.
EXIT.
ENDSELECT.
CONCATENATE '¨Desea borra tabla' P_TABLA INTO L_LINEA
SEPARATED BY SPACE.
CONCATENATE L_LINEA '?' INTO L_LINEA.
CALL FUNCTION 'POPUP_CONTINUE_YES_NO'
EXPORTING
DEFAULTOPTION = 'N'
TEXTLINE1 = L_LINEA
TEXTLINE2 = DD02T-DDTEXT
TITEL = 'Confirmacion'
IMPORTING
ANSWER = L_RESP
EXCEPTIONS
OTHERS = 1.
IF L_RESP = 'J'.
PERFORM BORRAR_TABLA IN PROGRAM (PROGRAM_NAME).
ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
* FORM GENERATE_SUBROUTINE_POOL *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> SOURCE_TAB *
*---------------------------------------------------------------------*
FORM GENERATE_SUBROUTINE_POOL TABLES SOURCE_TAB.
DATA: LINE_NO TYPE I,
SYNTAX_CHECK_MESSAGE(128).
DESCRIBE TABLE SOURCE_TAB.
CHECK SY-TFILL GT 0.
GENERATE SUBROUTINE POOL SOURCE_TAB
NAME PROGRAM_NAME
MESSAGE SYNTAX_CHECK_MESSAGE
line line_no.
if sy-subrc ne 0.
WRITE: / 'Error de sintaxis, mensaje', SYNTAX_CHECK_MESSAGE,
/ 'en linea', LINE_NO.
stop.
endif.
ENDFORM.
Text elements I | 001 | Grabar | I | 002 | Cargar | I | 003 | WHERE | I | 005 | Insert | I | 006 | Modify | R | | Carga/Descarga del contenido de una tabla desde/a fichero | S | P_BORRAR | Borrar tabla antes de cargar | S | P_CARG | Cargar tabla | S | P_GRAB | Grabar tabla | S | P_PATH | Directorio de salida | S | P_TABLA | Tabla | S | P_W1 | Linea 1 | S | P_W2 | Linea 2 | S | P_W3 | Linea 3 | S | P_W4 | Linea 4 | S | P_W5 | Linea 5 |
|