*&---------------------------------------------------------------------* *& Report ZZCROUPIER *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zzcroupier. *&---------------------------------------------------------------------* * CONSTANTS. *&---------------------------------------------------------------------* CONSTANTS: c_fichas TYPE rstable-tabname VALUE 'ZZFIC', c_apuestas TYPE rstable-tabname VALUE 'ZZAPU', c_no_va_mas TYPE rstable-tabname VALUE 'ZZNVM', c_nro TYPE rstable-tabname VALUE 'ZZNRO', c_player TYPE rstable-tabname VALUE 'ZZPLY'. *&---------------------------------------------------------------------* * VARIABLES. *&---------------------------------------------------------------------* DATA: g_init_once, ok_code(20), g_ref_from_timer. DATA: v_nro TYPE qf00-ran_int, v_time TYPE sy-uzeit, v_varkey TYPE rstable-varkey, v_status TYPE rstable-tabname VALUE 'ZZAPU'. *&---------------------------------------------------------------------* * TABLAS INTERNAS. *&---------------------------------------------------------------------* DATA: ti_seqg3 TYPE STANDARD TABLE OF seqg3 WITH HEADER LINE, ti_nro TYPE STANDARD TABLE OF qf00-ran_int WITH HEADER LINE. DATA: BEGIN OF ti_usr OCCURS 0, guname TYPE seqg3-guname, gttime TYPE seqg3-gttime, gtcode TYPE seqg3-gtcode, garg TYPE seqg3-garg, name_first TYPE adrp-name_first, name_last TYPE adrp-name_last, END OF ti_usr. *&---------------------------------------------------------------------* * AT LINE-SELECTION. *&---------------------------------------------------------------------* AT LINE-SELECTION. MESSAGE 'LINE-SELECTION' TYPE 'I'. * Trigger an event to run the at user-command SET USER-COMMAND 'RULA'. ok_code = 'RULA'. sy-ucomm = 'RULA'. *&---------------------------------------------------------------------* * AT USER-COMMAND. *&---------------------------------------------------------------------* AT USER-COMMAND. CASE ok_code. WHEN 'RULA'. PERFORM set_status. PERFORM get_enqueue. PERFORM set_header. PERFORM set_players. PERFORM set_obj. sy-lsind = 0. IF g_ref_from_timer = 'X'. CALL FUNCTION 'RFC_PING_AND_WAIT' STARTING NEW TASK 'INFO' PERFORMING when_finished ON END OF TASK EXPORTING seconds = 5 " Refresh time busy_waiting = space EXCEPTIONS resource_failure = 1 communication_failure = 2 system_failure = 3 OTHERS = 4. g_ref_from_timer = ''. ENDIF. ENDCASE. *&---------------------------------------------------------------------* * START-OF-SELECTION. *&---------------------------------------------------------------------* START-OF-SELECTION. v_time = sy-uzeit. v_varkey = c_apuestas. PERFORM enq USING v_varkey. PERFORM bloq. IF g_init_once <> 'X'. g_init_once = 'X'. CALL FUNCTION 'RFC_PING_AND_WAIT' STARTING NEW TASK 'WAIT' PERFORMING when_finished ON END OF TASK EXPORTING seconds = 5 " Refresh time busy_waiting = space EXCEPTIONS resource_failure = 1 communication_failure = 2 system_failure = 3 OTHERS = 4. ENDIF. WRITE:/ 'wait for 5 sec....'. *---------------------------------------------------------------------* * FORM WHEN_FINISHED * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM when_finished USING taskname. RECEIVE RESULTS FROM FUNCTION 'Z_ENQUE_SLEEP'. g_ref_from_timer = 'X'. * Trigger an event to run the at user-command SET USER-COMMAND 'RULA'. ok_code = 'RULA'. sy-ucomm = 'RULA'. ENDFORM. " WHEN_FINISHED *&---------------------------------------------------------------------* *& Form set_header *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM set_header . DATA: l_nro(2) TYPE c, l_tnro(200) TYPE c, l_first TYPE c. WRITE:/ 'Hora:', sy-uzeit. WRITE:/ 'Mandante:', sy-mandt. SKIP. LOOP AT ti_nro. AT FIRST. l_first = 'X'. ENDAT. WRITE ti_nro TO l_nro. CONDENSE l_nro NO-GAPS. IF l_first NE 'X'. CONCATENATE l_tnro l_nro INTO l_tnro SEPARATED BY ', '. ELSE. CLEAR l_first. MOVE l_nro TO l_tnro. ENDIF. ENDLOOP. WRITE: 'Últimos 30 números:', l_tnro. SKIP. CASE v_status. WHEN c_apuestas. WRITE:/ 'Hagan sus apuestas'. WHEN c_no_va_mas. WRITE:/ 'No va más !!'. WHEN c_nro. WRITE:/ 'Número.'. WHEN OTHERS. * DO NOTHING !!. ENDCASE. SKIP. ENDFORM. " set_header *&---------------------------------------------------------------------* *& Form set_players *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM set_players . DATA lt_str TYPE TABLE OF string WITH HEADER LINE. REFRESH ti_usr. LOOP AT ti_seqg3. CHECK ti_seqg3-garg(5) EQ c_fichas. * Se trata de un jugador. CONDENSE ti_seqg3-garg. * Obtengo las fichas del jugador. SPLIT ti_seqg3-garg AT space INTO TABLE lt_str. READ TABLE lt_str INDEX 4. CHECK sy-subrc IS INITIAL. MOVE-CORRESPONDING ti_seqg3 TO ti_usr. MOVE lt_str TO ti_usr-garg. * Obtengo los nombres de los usuarios. SELECT SINGLE b~name_first b~name_last INTO (ti_usr-name_first, ti_usr-name_last) FROM usr21 AS a INNER JOIN adrp AS b ON a~persnumber = b~persnumber AND a~mandt = b~client CLIENT SPECIFIED WHERE a~mandt EQ sy-mandt AND a~bname EQ ti_seqg3-guname. APPEND ti_usr. ENDLOOP. CHECK ti_usr[] IS NOT INITIAL. WRITE:/ 'Usuario', 13 'Hora inicio', 25 'Transacción', 47 'Fichas', 58 'Nombre', 98 'Apellido'. WRITE / sy-uline. LOOP AT ti_usr. WRITE:/ ti_usr-guname, 13 ti_usr-gttime, 25 ti_usr-gtcode, 47 ti_usr-garg(10), 58 ti_usr-name_first, 98 ti_usr-name_last. ENDLOOP. SKIP. ENDFORM. " set_players *&---------------------------------------------------------------------* *& Form bloq *&---------------------------------------------------------------------* * Bloqueo el programa para que haya un solo croupier. *----------------------------------------------------------------------* FORM bloq . DATA l_prog TYPE trdir-name. * DEQUEUE_EPROG l_prog = sy-repid. CALL FUNCTION 'ENQUEUE_EPROG' EXPORTING programm = l_prog EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. 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. " bloq *&---------------------------------------------------------------------* *& Form get_enqueue *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM get_enqueue . CALL FUNCTION 'ENQUEUE_READ' EXPORTING guname = '*' TABLES enq = ti_seqg3 EXCEPTIONS communication_failure = 1 system_failure = 2 OTHERS = 3. DELETE ti_seqg3 WHERE gobj NE 'E_TABLE'. ENDFORM. " get_enqueue *&---------------------------------------------------------------------* *& Form set_status *&---------------------------------------------------------------------* * Determino en que paso de la rula estoy. *----------------------------------------------------------------------* FORM set_status . DATA: l_new TYPE sy-uzeit, l_dif TYPE sy-uzeit, l_varkey TYPE rstable-varkey. GET TIME FIELD l_new. l_dif = l_new - v_time. CASE v_status. * ################################################ WHEN c_apuestas. * ################################################ MESSAGE 'Hagan sus apuestas.' TYPE 'S'. WRITE:/ 'Hagan sus apuestas. Tiempo: ', l_dif. IF l_dif >= 60. * Transcurrieron los 60 segundos permitidos para realizar la apuestas. l_varkey = c_apuestas. PERFORM deq USING l_varkey. v_status = c_no_va_mas. v_time = sy-uzeit. l_varkey = c_no_va_mas. PERFORM enq USING l_varkey. EXIT. ENDIF. * ################################################ WHEN c_no_va_mas. * ################################################ MESSAGE 'No va más !!.' TYPE 'S'. WRITE:/ 'No va más !!. Tiempo: ', l_dif. IF l_dif >= 10. * Transcurrieron los 10 segundos. l_varkey = c_no_va_mas. PERFORM deq USING l_varkey. v_status = c_nro. v_time = sy-uzeit. PERFORM get_nro CHANGING v_nro. WRITE v_nro TO l_varkey. CONDENSE l_varkey NO-GAPS. PERFORM enq USING l_varkey. EXIT. ENDIF. * ################################################ WHEN c_nro. * ################################################ MESSAGE 'Número.' TYPE 'S'. WRITE:/ 'Número.:', v_nro, 'Tiempo: ', l_dif. IF l_dif >= 10. * Transcurrieron los 10 segundos para que visualicen el número * que salió. WRITE v_nro TO l_varkey. CONDENSE l_varkey NO-GAPS. PERFORM deq USING l_varkey. v_status = c_apuestas. v_time = sy-uzeit. l_varkey = c_apuestas. PERFORM enq USING l_varkey. EXIT. ENDIF. * ################################################ WHEN OTHERS. * ################################################ * DO NOTHING !!. ENDCASE. ENDFORM. " set_status *&---------------------------------------------------------------------* *& Form deq *&---------------------------------------------------------------------* * Desbloqueo el objeto correspondiente. *----------------------------------------------------------------------* FORM deq USING p_varkey TYPE rstable-varkey. CALL FUNCTION 'DEQUEUE_E_TABLE' EXPORTING tabname = v_status varkey = p_varkey. ENDFORM. " deq *&---------------------------------------------------------------------* *& Form enq *&---------------------------------------------------------------------* * Bloqueo el objeto correspondiente. *----------------------------------------------------------------------* FORM enq USING p_varkey TYPE rstable-varkey. CALL FUNCTION 'ENQUEUE_E_TABLE' EXPORTING tabname = v_status varkey = p_varkey EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. 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. " enq *&---------------------------------------------------------------------* *& Form get_nro *&---------------------------------------------------------------------* * Obtengo el número de la ruleta. *----------------------------------------------------------------------* FORM get_nro CHANGING p_nro TYPE qf00-ran_int. CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 36 ran_int_min = 0 IMPORTING ran_int = p_nro EXCEPTIONS invalid_input = 1 OTHERS = 2. * Agrego el último número obtenido. APPEND p_nro TO ti_nro. DESCRIBE TABLE ti_nro. CHECK sy-tfill > 30. * Borro el número más antiguo. DELETE ti_nro INDEX 1. ENDFORM. " get_nro *&---------------------------------------------------------------------* *& Form set_obj *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM set_obj . WRITE:/ 'Bloqueo', 31 'Objeto bloqueo', 48 'Clave del bloqueo', 119 'Usuario', 132 'Transacción'. WRITE / sy-uline. LOOP AT ti_seqg3. WRITE:/ ti_seqg3-gname, ti_seqg3-gobj, ti_seqg3-garg(70), ti_seqg3-guname, ti_seqg3-gtcode. ENDLOOP. ENDFORM. " set_obj