*&---------------------------------------------------------------------*
*& Report ZHR_BPM11 业务行事日历同步
*&
*&---------------------------------------------------------------------*
*&创建者:caizjian 日期:20141010
*&
*&---------------------------------------------------------------------*
REPORT zhr_bpm11.
TYPES:BEGIN OF typ_db,
pernr TYPE pa0001-pernr, "员工号
datum TYPE ptpsp-datum, "计划工作时间
tprog TYPE ptpsp-tprog, "工作计划规则
timestamp TYPE timestamp, "JOB同步时间
END OF typ_db.
TYPES:BEGIN OF typ_yg,
pernr TYPE pa0001-pernr,
END OF typ_yg.
DATA:gt_db TYPE TABLE OF typ_db,
gs_db LIKE LINE OF gt_db,
gt_yg TYPE TABLE OF typ_yg,
gs_yg LIKE LINE OF gt_yg.
DATA:con_ora_name TYPE dbcon_name VALUE 'BPMFLOW',
tp_time1(19) TYPE c, "开始插入时间
tp_time2(19) TYPE c. "结束插入时间
data: exc_ref TYPE ref TO cx_sy_native_sql_error,
error_text TYPE string.
INITIALIZATION.
IF sy-mandt EQ '800'.
MOVE 'PORTAL' TO con_ora_name.
ENDIF.
START-OF-SELECTION.
PERFORM get_data.
PERFORM frm_connect.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
DATA:l_datum1 TYPE sy-datum,
l_datum2 TYPE sy-datum,
l_return TYPE bapireturn1,
lt_perws TYPE TABLE OF ptpsp,
ls_perws LIKE LINE OF lt_perws.
*员工号
SELECT pernr INTO TABLE gt_yg
FROM pa0001
WHERE begda <= sy-datum
AND endda >= sy-datum
AND persk LIKE '%3'.
l_datum1 = sy-datum.
l_datum2 = l_datum1 + 2.
LOOP AT gt_yg INTO gs_yg.
CLEAR:lt_perws,
l_return.
CALL FUNCTION 'ZHR_GET_DWS'
EXPORTING
pernr = gs_yg-pernr
begda = l_datum1
endda = l_datum2
IMPORTING
return = l_return
TABLES
perws = lt_perws.
LOOP AT lt_perws INTO ls_perws.
gs_db-pernr = gs_yg-pernr.
gs_db-datum = ls_perws-datum.
gs_db-tprog = ls_perws-tprog.
APPEND gs_db TO gt_db.
CLEAR:gs_db, ls_perws.
ENDLOOP.
ENDLOOP.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_CONNECT
*&---------------------------------------------------------------------*
FORM frm_connect .
DATA:l_emp_id TYPE char8,
l_time TYPE char8,
l_error TYPE c.
DATA:wa_log TYPE zhrbpm_log,
l_timestamp TYPE string.
TRY .
EXEC SQL.
CONNECT TO: CON_ORA_NAME.
ENDEXEC.
IF sy-subrc <> 0 .
* 出错时
RAISE EXCEPTION TYPE cx_sy_native_sql_error.
ENDIF.
EXEC SQL.
OPEN dbcur for
select Emp_id from EMP_WORK_SCHEDULE
ENDEXEC.
DO.
EXEC SQL.
FETCH NEXT dbcur INTO :L_Emp_id
ENDEXEC.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
EXEC SQL.
CLOSE dbcur
ENDEXEC.
* 获取开始插入时间
GET TIME.
CONCATENATE sy-datum+0(4)
sy-datum+4(2)
sy-datum+6(2)
INTO tp_time1
SEPARATED BY '-'.
CLEAR l_time.
CONCATENATE sy-uzeit+0(2)
sy-uzeit+2(2)
sy-uzeit+4(2)
INTO l_time
SEPARATED BY ':'.
CONCATENATE tp_time1
l_time
INTO tp_time1
SEPARATED BY space.
EXEC SQL.
UPDATE SYNC_RECORD_TBL set START_TIME = to_date(:TP_TIME1,'YYYY-MM-DD HH24:MI:SS') WHERE SID = '13'
ENDEXEC.
EXEC SQL.
COMMIT
ENDEXEC.
IF l_emp_id IS NOT INITIAL.
EXEC SQL.
DELETE FROM EMP_WORK_SCHEDULE
ENDEXEC.
ENDIF.
IF sy-subrc <> 0.
l_error = 'X'.
ENDIF.
IF l_error IS INITIAL.
LOOP AT gt_db INTO gs_db.
IF gs_db-pernr IS INITIAL OR gs_db-datum IS INITIAL.
CLEAR gs_db.
CONTINUE.
ENDIF.
CALL FUNCTION 'CONVERT_INTO_TIMESTAMP' "获取时间戳
EXPORTING
i_datlo = sy-datum
i_timlo = sy-uzeit
i_tzone = 'UTC+8'
IMPORTING
e_timestamp = gs_db-timestamp.
EXEC SQL.
INSERT INTO EMP_WORK_SCHEDULE(EMP_ID,WORK_DATE,WORK_RULE,CREATE_DATE)
values:(:gs_db-PERNR,:gs_db-DATUM,:gs_db-TPROG,:gs_db-timestamp)
ENDEXEC.
IF sy-subrc <> 0.
l_error = 'X'.
" CRQ000000003316-HR抛BPM出错写日志
wa_log-prog = sy-repid."当前程序名
wa_log-tabnam = 'EMP_WORK_SCHEDULE'."表名
l_timestamp = gs_db-timestamp.
CONCATENATE gs_db-pernr
gs_db-datum
gs_db-tprog
l_timestamp
INTO wa_log-msg
SEPARATED BY '/'.
PERFORM write_bpm_log USING wa_log.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
IF l_error IS INITIAL.
* 获取插入结束时间
CONCATENATE sy-datum+0(4)
sy-datum+4(2)
sy-datum+6(2)
INTO tp_time2
SEPARATED BY '-'.
CLEAR l_time.
GET TIME.
CONCATENATE sy-uzeit+0(2)
sy-uzeit+2(2)
sy-uzeit+4(2)
INTO l_time
SEPARATED BY ':'.
CONCATENATE tp_time2
l_time
INTO tp_time2
SEPARATED BY space.
EXEC SQL.
UPDATE SYNC_RECORD_TBL set END_TIME = to_date(:TP_TIME2,'YYYY-MM-DD HH24:MI:SS') WHERE SID = '13'
ENDEXEC.
EXEC SQL.
COMMIT
ENDEXEC.
WRITE: '插入数据成功!'.
ELSE.
EXEC SQL.
ROLLBACK
ENDEXEC.
WRITE: '插入数据失败!'.
ENDIF.
EXEC SQL.
DISCONNECT :CON_ORA_NAME
ENDEXEC.
CATCH cx_sy_native_sql_error INTO exc_ref.
error_text = exc_ref->get_text( ).
EXEC SQL.
ROLLBACK
ENDEXEC.
IF sy-batch = 'X'.
WRITE: '插入数据失败!',
/ error_text.
ELSE.
MESSAGE error_text TYPE 'I'.
ENDIF.
LEAVE PROGRAM.
ENDTRY.
ENDFORM. " FRM_CONNECT
*&---------------------------------------------------------------------*
*& Form WRITE_BPM_LOG
*&---------------------------------------------------------------------*
FORM write_bpm_log USING wa TYPE zhrbpm_log.
CALL FUNCTION 'ZHR_BPM_WLOG'
EXPORTING
wa_log = wa
EXCEPTIONS
nodata = 1
OTHERS = 2.
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. " WRITE_BPM_LOG