转 : authority object,luw,data cluster,bapi等

转自:scnblogs.techweb.com.cn/abaplv/archives/212.html

authority object,luw,data cluster,bapi等

 

sub5为了使具有相应权限的人能够访问相应的数据,开发人员必须在SAP系统中实施authorization object。为了达到这个目的,你需要首先开发一个与应用逻辑相关的权限模型,在ABAP WORKBENCH中你需要创建authorization object并在其基础上创建authorization。权限是通过authorization profile分配给用户的。在程序中检查用户是否具有执行相应动作的权限。应用开发人员必须在执行相应的action之前检查相应的权限。Sap在自己的software中了应用了相应权限的概念,作为客户也应当应用相同的权限的概念在对sap的增强或开发的独立应用中。SAP有相应的管理权限和分配权限的工具。

    一个authorization object最多可以有十个字段,不过这些字段并没有值。而authorization就是对authorization object赋值的结果。一个authorization object可以产生多个authorization。一系列authorizations可以组合到authorization profile中。一个authorization profile应当包含执行某个特定任务所需的所有权限。Authorization profiles可以分配给用户。Authorization object维护的事务为Tools->ABAP Workbench->Development->other tools->Authorization object。可以通过AHTUORITY-CHECK语句实现权限的检查,一个语句用于检查authorization object和其field value。如果某个特殊的权限对某些field的内容并不关心,那么可以使用dummy代替field <value>。这可以实现更加灵活的权限检查。当具备相应的权限时AUTHORITY-CHECK就会给sy-subrc赋值0否则的话就会赋值4

    事务启用时的权限检查过程:

l         事务代码在表TSTC中是否存在

l         该事务代码在表TSTC中是否被锁住

l         用户是否具有s_tcode对应的该事务代码的authorization

l         然后检查分配给这个事务代码的缺省的权限对象。

只有这个四个步骤都通过时,才会启动事务。而AUTHORITY-CHECK语句只有事务启动以后才会检查。

    SAPDATABASE TABLE可以被bufferapplication server上,这么做的主要目的有:

l         减少对数据库的直接访问,提高访问速度

l         减少对数据库的负载

Buffered table只能被database interface访问。

如果执行Native SQL就会绕过database interface,当然也就不能够使用SAP R/3database buffer了,因此应当避免使用Native SQL修改buffered table的数据,以免造成数据的不一致。并不是所有的OPEN SQL都会去读table buffer

Open sql修改数据的结果时数据库中的数据以及运行这个sqlapplication servertable buffer中的数据都会被改变。如果tablebuffer在不同的application server上,这些application serverbuffer会延迟同步,过程如下:如果数据库中的数据被一个application server更改,修改得数据被注册在数据库表DDLOG中。Application server会每个周期读一下这个表,如果发现相应的记录,buffer中的该条记录就会被标识为no longer up-to-date。下次读取buffered table的数据时database interface就会从数据库中读取数据并更新buffer contentInterval的大小是有profile parameter/rdisp/buffertime定义的。有三种buffer的类型:

l         Resident buffer(100%)第一次访问表时,表中的所有内容都被buffer

l         Generic buffer:一个generic key(nkey)ABAP Dictionary中必须被定义。这个key用来把table content划分成generic areas。如果generic area的一条数据被访问,整个generic area都会被放到table buffer中。集团相关的表基本上是按照集团buffer

l         Single-record buffer.只有被访问的记录才会放到table buffer

Native SQL可以做的操作远远超出标准OPEN SQL的范围。其不仅可以操作本地数据库还可以操作分散数据库。Native SQL既可以做DDL也可以做DML。不过对于error handle和声明host variables并不支持。EXEC SQLEND EXEC必须封装一个NATIVE SQL语句,NATIVE SQL操作的表不需要再ABAP DICTIONARY中声明。NATIVE SQL的语法与数据库是相关的。Native SQL可以执行的DDLCREATE (TABLE,VIEW,INDEX)

DROP (TABLE,VIEW,INDEX)ALTER TABLE VIEW INDEX),GRANTREVOKE。可以执行的DMLSELECT INSERT UPDATE DELETE DECLARE CURSOR FETCH CURSOR OPEN CURSOR CLOSE CURSOR

    Data clusterdata objects的组合。Data object可以是fields, structured fields, internal tables以及complex data objects。可以通过ABAP语句EXPORTIMPORTDELETE来操作data clusterData cluster可以存储在cluster database中。可以通过application area来划分cluster database的区域。Application areaname是由两个字符组成的。同一个application areacluster是通过cluster id来区分的。

    对于export需要一个cluster databasetable INDX是一个cluster databaseCluster databaseABAP dictionary中是transparent table并有standardized structure。执行EXPORT需要指定cluster database及其application area。通过cluster ID来区分cluster本身。如果cluster中的field nameprogram中的不同可以通过addition from来实现。对于export没有任何write protection。数据在cluster database中是以压缩的形式存储的。程序启动时,可以通过TABLES语句来声明cluster databaseapplication areaInternal tableheadline不能被export

    EXPORT <NAME> FROM <obj>

           [obj]

    TO DATABASE <dbtab>(<ar>) ID <id>

    例:REPORT XXX.

       TABLES indx.

       EXPORT

           <field1> from <field a>

           <field2> from <field b>

           .

           <structure1> from <structure a>

           

           <itab1> from <itab a>

       TO DATABASE indx(<ar>)

       ID <id>

对于IMPORT你只需要列出cluster data objects的子集,如program中的变量的名称与clusterdata object的名称不同可以通过addition TO来实现。通过sy-subrc来返回IMPORT执行的结果,如果不成功sy-subrc <> 0Fieldstructureinternal table的结构与cluster中相应object的必须相同,否则就会产生runtime errorIMPORT时所使用的field nameEXPORT时所使用的field name必须相同。如果cluster存在sy-subrc = 0,而不管data field是否被importedDELETE用来删除整个clusterDELETE也通过return code返回结果。

    IMPORT <name> TO <obj>

       [obj]

       FROM DATABASE <dbtab>(<ar>) ID <id>

    例:REPORT XXX.

       TABLES indx.

       IMPORT

           <field1> TO <field a>

           <field2> TO <field b>

           <field3> TO <field c>

           

           <structure1> TO <structure a>

           

           <itab1> TO <itab a>

       TO DATABASE indx(<ar>)

       ID <id>.

可以通过下面的步骤自己创建abap cluster database;

l         abap dictionary中建立一个transparent table,用来存储cluster database

l         建立table structure

l         MANDT FIELD可以被ommit

l         字段RELID,SRTF2,CLUSTER,CLUSTIDcluster idEXPORT的时候会被自动填充。

l         自定义的字段要在export之前填充,这些字段的值可以被IMPORT获取

l         选择cluste IDfield name和你自己的fields,剩余的field是由系统确定的。

l         通过structure的总体长度减去前六个字段的长度可以得到数据所占的长度。

 

 

INDX是可以存储cluster的一个例子,其在系统中是缺省安装的,它的key field的长度为31byte,除了key fielddata cluster还有一些字段用来存储管理系信息。不如change, validate  date, create by等。可以在EXPORT之前来填充这些信息。比如:MOVE SY-DATUM TO INDX-AEDATCluster tabletransparent table的区别:cluster table用来存储cluster,很少访问大量数据,存储的是异构数据,灵活的技术,不能用于link access,需要cluster IDapplication area才能访问,其返回结果只能是是一个cluster。而对于transparent table可以多次访问,支持link access可以通过logical condition限制访问的数据。

       对于scope = 1lockdialog program拥有其产生的locklock在其被释放之前依然存在,可以通过DEQUEUE_<OBJECT>释放lock,也可以在程序结束时implicitly release。这包括语句:LEAVE PROGRAMLEAVET TO TRANSACTION <TA>SUBMIT <program>以及termination messages。如果事务使用用异步更新,就无法保证出现要修改的数据被其他用户lock住。所以对于异步更新不应当使用_scope1 = 1lock

       对于异步更新,应当保证dialog program产生的LockV1 update program active的时间要长,可以通过_scope = 3来做到这点。通过_scoped = 3产生的lock既要被dialog program释放又要被update module释放。

       BAPI可以看作为SAP ERPgateway,它是business objectmethod,可以实现:创建object,查询object的某些属性和修改object的某些属性。BAPI是外部系统访问SAP ERP

interfaceBAPIobject-oriented的,其是business objectmethodBAPIINTERFACE是稳定的,对客户是开放的,interface parameter是通过data element来定义的。既可以外部调用也可以内部调用。BAPI没有presentation layerBAPI一般是同步调用,IDOC中的ALE例外,其在目标系统中依然是同步调用。可以通过update task实现数据更新。BAPI中不能使用COMMIT WORK。而要使用service objectmethodBAPI_TRANSACTION_COMMITBAPI_TRANSACTION_ROLLBACKBAPI使用了TRANSACTION MODEL,一个transaction代表了一个process unitLUW。修改数据库的动作必须通过update task实现。这样可以实现将多个BAPI放到一个LUW中。可以通过FMBAPI_TRANSACTION_COMMIT来关闭LUW

       COMMIT WORK产生的动作:

l         当前dialog step的所有update都会被commit

l         所有的database lock都会被释放

l         所有open database cursor都会被close

l         所有通过PERFORM ON COMMIT注册的SUBROUTINE都会被执行

l         更新被trigger,一种方式是不等待更新结束,还有等待更新结束对于local update会立即执行

l         _scope = 2lock,如果没有update request就不释放,传给update module并由它来释放。

ROLLBACK WORK产生的动作:

l         当前的DB LUW结束,所有当前的dialog step所做的修改动作都会被undone,所有的database lock都会被释放。所有的open cursor都被关闭。

l         当前SAP LUWdata被删除,通过CALL FUNCTION IN UPDATE TASK注册的update module被清除,PERFORM ON COMMIT也是同理。通过TRANSACTIONQUEUE RFC注册的FUNCTION MODULE也不会执行。

l         SAP LOCK被释放(_scope = 2

对于ROLLBACK WORK,下列动作不会执行:

l         前一个commit提交的更新

l         internal table和其他data object的内容的改变

l         Calculated ‘contexts’不会被reset

l         Operating system files的修改

l         同步调用的RFC所做的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值