利用SAP PORTAL平台实现门禁信息查询(仅作范文写作参考,部分图表公式未上传)
王建文
东方电气中央研究院信息化所 四川成都 611731
摘要:随着信息化建设的发展,大多数企业都部署了自己的门禁系统,门禁系统可以记录企业员工打卡的时间和地点,故其数据对于企业的安全管理和考勤都有很大的参考意义。然而,目前的门禁系统往往只支持在服务器上或个别安装了专门客户端的计算机上查看数据,且缺乏有效的权限管理,无法根据用户的级别、部门提供其权限内的数据。要解决普遍用户对门禁信息的查看问题,以及查看门禁信息的权限管理问题,往往需要进行二次开发。本文正是介绍了如何利用SAP PORTAL平台集成门禁系统并且二次开发,最终实现普遍用户可查询门禁信息以及查询权限管理的工作。
关键词:SAP;PORTAL;门禁信息
0 引言
门禁系统是企业信息化建设中的重要系统,往往会被优先部署,其记录的员工打卡时间、地点的数据,对于企业安全管理和考勤都有很大的参考意义。但是目前市面上常见的门禁系统,并不支持除了数据管理人员以外的普通用户对门禁信息的查询,也无法做到根据用户的级别、部门进行查询的权限管理。由于门禁系统的上述缺陷,使得本来很有潜力的门禁数据在许多企业无法得到有效的利用和分析。
不过,对于部署了SAP PORTAL的企业而言,门禁系统的两个缺陷却可以得到有效的解决。这得益于SAP PORTAL平台的良好集成能力、强大的二次开发能力,以及现成的权限管理机制。在接下来的文章中,我们将介绍本集团利用SAP PORTAL实现门禁信息查询的详细步骤。
1 背景
本集团部署的门禁系统为深圳捷顺公司生产的门禁系统,该系统的底层数据库为ORACLE数据库,其自带的信息查询工具比较简陋,只能供系统运维人员使用,并且没有权限管理机制。
本集团的SAP PORTAL系统是SAP Net Weaver产品的一个模块,该模块可以将SAP ABAP程序发布为网页,从而允许企业的所有员工通过互联网使用其程序;而Net Weaver产品本身很好的封装了底层的数据库,不论底层使用何种数据库,Net Weaver都提供了一套标准的SQL接口供编程者使用。SAP PORTAL的开放性和Net Weaver的兼容性,是我们集成工作的基础。
此外,本集团下属有数千个部门,员工超过三万人,每人每天可能产生多条刷卡记录,故我们处理门禁信息时,还必须考虑大数据的处理问题。
2 功能实现
2.1 利用DBCO事务代码连接外部数据库
首先,我们需要在SAP PORTAL的服务器上安装Oracle Client,并设定访问捷顺门禁系统数据库的用户名和密码。
然后登陆SAP PORTAL系统,进入DBCO事务代码,先后点击修改和新条目按钮,进入连接设置界面。
图 1 DBCO显示与新条目按钮
在连接设置界面,我们需要自定义连接名称,选择连接数据库类型为ORA型,并填入事先定义好访问捷顺数据库的用户名和密码,连接信息一栏填写的则是tnsnames.ora文件中的Service Name。
图 2 设置连接界面
设置完成后,我们的SAP ABAP程序就可以通过代码访问捷顺的Oracle数据库了。
2.2 编写作业程序抽取数据
打通了两个数据库的连接,我们就可以通过作业程序将捷顺数据库的数据抽取到SAP PORTAL的系统中。作业程序是一类特殊的ABAP程序,它们没有界面,并且通过SM36事务代码设置的时间自动运行,通常我们设置这类程序在凌晨自动一次,以抽取上一天的数据。
我们的作业程序主要代码如下:
REPORT zfi_jecms_01.
*----------------------------------------------------------------------
*连接数据库
*----------------------------------------------------------------------
DATA:v_dbs TYPE dbcon-con_name ."数据库名
DATA:ibi_message TYPE string.
DATA:lv_subrc LIKE sy-subrc.
DATA:a1 LIKE zfi_jecms OCCURS 0 WITH HEADER LINE.
DATA:o_ref_object TYPE REF TO cx_sy_native_sql_error. "异常信息
DATA:zdate_max TYPE d.
DATA:zopen_time_max(20) TYPE c.
DATA:zopen_time_max2(20) TYPE c.
v_dbs = 'JECMS'. "数据库名称
TRY.
EXEC SQL.
CONNECT TO :V_DBS
ENDEXEC.
IF sy-subrc <> 0.
lv_subrc = 4.
ENDIF.
CATCH cx_sy_native_sql_error.
lv_subrc = 4.
ENDTRY.
IF lv_subrc NE 0.
ibi_message = '数据库连接失败'.
* EXIT.
ENDIF.
SELECT MAX( zdate ) FROM zfi_jecms INTO zdate_max.
IF zdate_max IS INITIAL.
zopen_time_max2 = '01-JAN-15'.
ELSE.
SELECT SINGLE open_time FROM zfi_jecms INTO zopen_time_max WHERE zdate = zdate_max.
zopen_time_max2 = zopen_time_max+0(10) .
ENDIF.
TRY.
EXEC SQL PERFORMING AppendSqlData.
select d.card_no,d.user_name,d.machine_device_name,to_char(d.open_time,'DD-MON-YY HH24:MI:SS'),m.fk_user_id,l.user_no
into :A1-card_no,:A1-user_name,:A1-machine_name,:A1-open_time,:A1-user_id,:A1-user_no
from DA_OPENRECORD_VW d,mc_user_card_vw m,mc_userinfo_vw l
WHERE d.card_no = m.card_no
and m.fk_user_id = l.user_id
and d.open_time >=TO_DATE(TRIM(:zopen_time_max2),'DD-MON-YY')
and l.user_no not like 'L%'
and l.user_no != 'TempUser'
order by d.open_time desc
ENDEXEC.
IF sy-subrc = 0.
EXEC SQL.
COMMIT
ENDEXEC.
ELSE.
ROLLBACK WORK.
ENDIF.
CATCH cx_sy_native_sql_error INTO o_ref_object.
ROLLBACK WORK.
ENDTRY.
*----------------------------------------------------------------------
*释放ODS数据中心连接。
*----------------------------------------------------------------------
TRY.
EXEC SQL.
disconnect :v_dbs
ENDEXEC.
CATCH cx_sy_native_sql_error.
ENDTRY.
MODIFY zfi_jecms FROM TABLE a1.
*&---------------------------------------------------------------------*
*& Form AppendSqlData
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM appendsqldata.
CALL FUNCTION 'ZFI_JECMS_02'
EXPORTING
date_time = a1-open_time
IMPORTING
date = a1-zdate
time = a1-ztime.
APPEND a1.
ENDFORM. "AppendSqlData
针对上述代码,我们需要注意以下几点:
(1) 当我们对SAP PORTAL本身的数据库进行操作时,我们可以直接使用SQL语言,但是当我们对外部数据库(此处的捷顺Oracle数据库)进行操作时,需要在SQL语言外部使用EXEC SQL.和ENDEXEC.关键字;
(2) SAP系统的数据表中的时间格式(YYYYMMDD),与Oracle系统的数据表的时间格式(DDMMYY)是不同的,我们需要自定义一个数据格式转换的程序以免造成错误。
接下来则使用SM36事务代码发布作业。首先,我们需要自定义一个作业名称。
图 3 SM36初始界面
然后点击开始条件按钮,设置运行条件。此处因为我们需要作业程序每天凌晨运行,所以选择开始时间类型为日期/时间并填入启动日期和时间,选中左下角“周期性的作业”,同时在右下角选择周期值为每天。
图 4 SM36开始条件界面
接下来我们需要回到SM36主界面并点击步骤按钮,我们需要在步骤界面填入需要运行的作业程序名称并保存。
图 5 步骤界面
将全部设置保存好后,我们的作业就完成了。
2.3 编写ABAP查询程序
我们的最终目的是将门禁数据按照不同的权限呈现给所有的用户,所以我们很重要的一部分工作就是编写门禁信息查询程序。
为了权限控制,我们给每个用户定义了两个列表,一个是可查询员工列表(存放可以查询的员工的ID),一个是可查询部门列表(存放可查询的部门的ID)。根据两个列表的数据我们可以将员工权限分为三类:
(1) 两张列表均为空,则该员工只能访问自己的考勤数据;
(2) 可查询部门为10000001东方电气集团有限公司(10000001为公司代码),则该员工可以访问所有部门和员工的考勤数据;
(3) 可查询员工有数据或可查询部门有数据,则该员工可以查询列表中的员工和部门的考勤数据。
为了管理两张列表,我们专门开发了管理程序,如下:
图 6 权限列表管理程序
在信息查询程序中,我们允许用户选择要查询的日期。在程序界面左侧,我们将员工、部门按照层级排列成树状图,用户双击树状图任意节点,即可选择要查询的人员或者部门范围。而在程序界面右侧,我们将给出查询结果,包括员工号、刷卡位置、刷卡日期、刷卡时间等数据。
图 7 信息查询界面
对于权限较大的用户,他们能够访问的部门和员工数据量非常之大,对于这种大数据我们需要进行特殊的处理。具体方法为初始化时不展开子孙节点较多的节点,只有当用户双击这部分节点时,才追加这部分节点下面的数据,这样可以有效地提高程序的整体运行速度。即使对于完整权限的用户,我们的程序呈现数据也仅需要数秒钟。
参考文献:
[1]唐嘉 彭功涛 方玉凤 《SAP使用程序开发进阶》[M]北京:兵器工业出版社,2012
[2]黄佳 《SAP程序设计》[M]北京:机械工业出版社,2005
[3]王宏 《实战SAP程序开发--从实例学SAP ABAP编程》[M]北京:电子工业出版社,2006
[4]封~ 《SAP调用外部数据库》[OL] http://www.cnblogs.com/qlb8268/p/3603297.html,2014