标签:
由于数据库越来越大,对于管理和使用都是一个大的问题,我们归档的目的就是为了是数据库进可能的小,加快用户响应时间,并且对于用户对于数据库的查询来说,进可能加载多的表到内存中。
归档就是上面两个要求的平衡点,首先把不需要经常使用的商务对象数据从数据库中提取出来写到一个归档文件中,然后把相关对象从数据库删除,这就减小数据库大小。并且这些归档数据同样还是可以被用户读取和查询的。
注意商业对象可能在数据库中跨多个表存储,归档对象是把这些表中这个商业对象全部归结到这个对象来的。
然后才会在所有这些表中删除关于这个商业对象的相关数据。
数据归档运行的大概过程如下:
1 创建归档文件:在第一步过程中,写程序创建一个或者多个归档文件。然后从数据库读取将要被归档的数据并且写到这些归档文件中 。?
2 存储归档文件:在写程序完成对我们所创建的归档文件之后,这些被归档文件被存储起来。
3 删除数据:删除程序首先读取归档文件中的数据,然后输出数据中对应记录。
另外:归档数据要考虑安全存放问题。
对于归档文件存放也有几个方法:
。HSM(tcode FILE)
。光盘
。磁带。
归档对象
数据归档的核心元素就是归档对象---可以被进行归档并且从数据库中删除的最小单元,并且描述必须被存取数据库对象,以及如何完整的归档一个商业对象。
归档对象包括三个组件
。数据描述组件---一个应用对象(商业对象)所有相关的数据库对象的说明都是通过这个组件实现
。自定义设定-----为了归档运行对于指定对象对象所做的自定义设定
。程序-----------包含其他一些内容:一个写程序(把数据对象写入到归档对象)
?????????????????????????????????? 一个删除程序(从数据库中删除从归档对象中成功读取的所有数据对象)
?????????????????????????????????? 一个显示程序(允许读取归档对象中的数据)
? ?
提示:DB15显示归档对象与数据库具体边之间的信息。
自定义的设定
在自定义归档过程中,你需要设定一些影响归档执行的参数。
。通常自定义定义(基本自定义)
?? ----定义逻辑路径和文件名称
。跨归档对象自定义
?? ----定义归档执行的服务器群组
。指定归档对象的自定义。
-----归档文件的大小
-----删除程序的设定
通过TCODE的customizing按钮来调用自定义设定。
在通常自定义(基本自定义,TCODE FILE)过程中,如果不存在的话,你首先定义一个逻辑文件路径作为归档的全局路径,并且指定一个物理路径给这个逻辑路径。在归档运行的时候逻辑路径仅仅是物理路径一个占位符。
你对于应用程序数据的归档文件的命名也可以通过这里维护一个逻辑文件名,并且在归档运行时候指定给一个具体文件使用作为他的文件名字。
在跨归档对象自定义,你可以执行是否需要监视归档执行在CCMS中(RZ20)被激活,或者选择那些服务器群组进行归档后台处理作业(这个社顶是SAP WEB APPLICATION SERVER 6。10新加的)
在指定归档对象的自定义,你可以为了指定的归档对象来维护一个逻辑文件名,并且对于删除程序做设定。你可以设定是否删除程序自动执行再归档文件创建完成后。在这个地方, 你可以为了测试来创建一个一个变式。也可以为了生产系统运行来创建一个变式。指定一个归档文件的最大大小。
归档的运行
实际我们运用归档都是把它做为一个后台定期执行的任务。首先,它从数据库中选择将要被归档的数据对象,在做这个的时候,构成一个商业数据对象的所有条件都应考虑到。系统会检查是是否每一个数据对象都会被归档。如果可以的话,这些数据对象会被写入归档对象中。如果自定义设定指定删除程序自动运行,那么问这个归档文件关闭的时候相关删除程序就自动运行。????????????????????????????
提示:如果删除程序被同样安排为定义执行后台任务和归档任务并行执行的话,只要应该有两个后台进程被系统配置。
删除程序一定要作为独立的后台定期执行任务。如果在指定归档对象自定义过程中删除程序不自动执行。当我们独立安排的时候,一定要选择归档文件从当前删除程序运行中我们取得将要删除商业对象的归档对象中,然后把这些从归档对象中读出的商业数据对象从数据库中删除。
归档程序的定义安排通过TCODE SARA中的write按钮。它为分为了四步骤:
1创建一个归档变式
2指定执行用户
3指定开始时间
4定义假脱机参数
对于具体某一个归档对象对于那些实际商业数据对象被归档到这里来,是通过归档变式这里指定的。理论上来说。当相关归档任务被是删除后,这些归档变式才可以被重用。变式的定义必须执行是否他是为了测试目的还是生产目的。
对于可以运行这个归档程序的用户需要一个合适的权限---只要具有权限对象(S_ARCHIVE),这个对象是数据归档需要的主要权限,通过它可以限制哪些归档对象可以被使用。并且对于需要被归档的数据对象的应用程序的事物也需要适当的权限。就象归档程序在后台运行,用户需要具有可以执行后台程序的权限(权限对象S_BTCH_JOB).
用于归档任务日志可以变的很大,建议设定脱机参数以便日志不会立即输出到输出设备上。
数据归档的监视
有很多系统工具可以对归档运行进行监视
。后台处理工具
----任务日志
----假脱机列表(如果被创建的话)
。系统监视工具
----数据归档监视器(在CCMS监视集中)
一个归档运行过程中一个日志被创建。如果应用创建了一个指定的日志,它就被使用;否则,会使用标准日志。标准日志含有归档数据对象的号码,他所联系对应的表,一些被处理的那些表的行的编号和文件的大小。在指定的应用日志情况下,归档的内容可以被存储到文件层次。
?? 注意:归档日志会被日常的假脱机清理任务删除。你必须考虑这些日志的用途目标等,例如,可以存储这些日志到外部存储系统。
通过使用SM37中的事务simple job selection的后台进程监视功能来对归档运行进行跟踪。通过选择job overview,你可以直接从SARA的初始品目直接跳转到SM37。在你通过SARA初始屏幕成功维护一个归档对象后,你可以选择management来显示一个关于来自于SARA的归档运行的简短的日志文件。
另外,还有一个专门的数据归档监视器(CCMS中,TCODE RZ20),它是被系统管理员用来监视归档运行的。你也可以通过这个工具来获得一个归档对象的概览。你能通过跨归档对象自定义来激活或者取消激活它。
存取归档文件中的数据
对于要被归档的数据是有一个明显的前提的这个数据一定属于一个完整商业流程或者商业区间,并且不被当前商业流程所需要。然后这些数据别归档后,从归档中再次读取他们也是很必要的。例如一个工厂要进行评估或者审记等。
归档开发用具以一种任何时间都具有读权限的方式来存储数据的。这个方式的前提是对于相关归档对象读取程序程序的存在和是否可以获取。这个读程序被用来读取被归档到归档对象中的数据以一定选择标准,并且对最终用户以一定的格式输出。通常,两个存取类型或者显示方法被使用:
。顺序存取
。直接存取
顺序存取(读)是对于归档数据的最简单的一种获去方式。通过这个方式,读程序首先打开顺序归档文件,然后读取所有对象的内容,并且列出符合标准的数据。例如 你可以用这个方法来列出一个特殊帐期的所有数据对象或者一个特殊的文档号码组。
直接存取:对于私有的被归档的数据对象的直接存取,例如一个定单或者帐单凭证仅仅可以通过一个索引表来被归档。将要被选择数据对象首先要通过搜索选择来在索引表中被选中。如果归档成功,则含有这些数据对象内容归档文件被本地化,并且通过索引表被打开。读程序直接读取并且显示这些你想所有的数据对象。这个方法系统开销大,这个方法仅仅对很小数量的对象提供,例如FI_DOCUMENT.
注意:一个简单的选项对于系统管理员来获取归档对象的读权限就是在SARA初始屏幕输入相关的归档对象名字然后选择Read。
SAP归档信息系统
SAP归档信息系统提供了更广泛更简单的使用功能对于被归档数据对象的快速直接存取。
SAP Archive Information System(Archive Information Ssytem,SAP AS),是一个可以搜索归档对象的工具,并且被集成到了归档环境中了。它支持对于已经到归档到归档对象中的数据对象的所有,以及对符合要求数据对象的显示功能。
这个工具是一个很通用工具,对于所有归档对象都适用。
对于被归档后的数据的检索都是基于归档信息结构的。从归档对象中数据会提供一些透明数据库表。对于归档对象中的被归档的数据的检索,要求必须至少具有一个这个归档对象的信息结构。这种类型的信息结构经常会包含结构自身,相应的数据库透明表,和相应的评估程序。
在一个归档信息结构被创建前,这些构成这个结构的数据都是来自于归档对象中的数据的,他必须要被激活的。系统会产生一个透明数据库表和一个评估程序在后台。在删除程序开始运行的时候,所有被激活的归档信息结构对于这个归档对象,都会被填充。
? ?
From <http://blog.csdn.net/zfjay/article/details/4713300>
? ?
SAP Archiving--OverView
2014年6月4日
19:37
? ?
? ?
??? 所谓的SAP Archiving中文解释就是归档。这是一个什么样的概念呢?就比如,纸质办公的企业,它每年都会有很多的资料和数据,过几年就需要把一些用不着的文件整理处理,由专门的人员管理和保存,不再或很少拿出来使用(仅供特殊用途)。这是为了保证这些过时的文件,不影响到现有的业务,以免混在一起,降低现时文件的查找效率、造成管理混乱。那么现在SAP的归档,你可以理解成把纸质变成了硬盘和磁碟机,它们也有存满的一天,它们也存在着效率问题,所以对于运行大量业务的公司,定期的Archiving是必不可少的。
???下面谈一下Archiving几大优点。
??? SAP Archiving就是为了解决公司业务增长过快,原有数据库中数据海量增长,系统效率降低,而导致业务受到影响等情况的。虽然说现在有BI,可以方便用来出报表,但是不管出报表速度多快,如果数据量无限膨胀的话,哪个数据库,哪个系统都是吃不消的,所以Archiving还是必须的。
??? 下面是一些在Archving时常用的T-code,总的来说分为数据容量分析和归档具体应用两块。着颜色的几个T-code是几个主要的归档事务。以后的总结中,会慢慢讲解其中一些T-code的应用。
Transaction Code | Short text | Package |
ACLA | Define Archiving Classes | SARC |
AOBJ | Archiving object definition | SARC |
DB15 | Data Archiving: Database Tables | SARC |
SARA | Archive Administration | SARC |
SAR_DA_STAT_ANALYSIS | Analysis of DA Statistics | SARC |
SAR_OBJ_IND_CUS | Cross-Archiving-Obj. Customizing | SARC |
SAR_SHOW_MONITOR | Data Archiving Monitor | SARC |
SAR_SYNC_HOME_PATH | Synchornization of Home Paths | SARC |
AS_ADMIN | SAP AS: Administration | SARCIS |
SARE | Archive Explorer | SARCIS |
SARI | Archive Information System | SARCIS |
SARJ | Archive Retrieval Configurato | SARCIS |
? ?
? ?
SAP Archiving(2)--项目介绍
上文介绍了一下Archiving,下面来介绍我参与的那个项目。
?? 一般来说Archiving只要Basis去做就可以了,但是由于上线一段时间后客户会做很多的定制和增强,那么原有的Archiving程序就不能再用了,需要重新编写。
?? Archiving运行界面:
??? 我们需要用T-code: AOBJ来定义一个Archiving Object。其中有四个主要的地方需要ABAPer来参与,Preprocess,Write,Delete,Read,这四个步骤分别代表4个程序,在AOBJ里需要配置给相应的自定义的Archiving Object。
??? 其中,Archiving Object中需要Write Program, Delete Program, Preprocessing Program等,这三个一般都要重写,其他的视情况而定。Stucture Definition要定义哪些表要Archiving,最好这些表都是相关联的。Customizing Settings,就是定义一些Archive文件的容量,提交的频率等。Read Program就是用来读取已经Archiving数据的程序。其余的就是一些选择性的内容,根据Archiving Object来定。
??? 配置完毕后,用T-code: SARA进行Archiving 就行。
??? 对于这个Archiving Project原来有两个方案,一个针对Oracle数据库的优化软件LiveReorg,另一个是日立的IXOS。介绍一下这各工具:
??? Oracle数据库应用的大量实施,使数据库碎片重组成为保持应用高性能运行的关键。常规重组方法需要中断应用运行,对企业造成严重的影响。
??? LiveReorg是一种联机数据库性能优化工具,在不影响关键业务系统运行的情况下,对Oracle数据库进行碎片重组。?
????LiveReorg 采用了基于日志的复制技术。通过读取Oracle 日志,可以跟踪重组期间发生的用户活动,保证应用系统的数据库保持持续可用的状态。
??? LiveReorg包括快速、灵活的数据移动选项,支持通过实时和常规方式进行重组。重组过程既可以完全在数据库内,通过 SQL语句来实现,也可以利用该主品的FastCopy功能通过文件系统实现。FastCopy功能可以将数据卸载到文件系统,再利用Oracle的直接路径技术对其进行重载,这种方式对较大的Long和Long Raw数据类型有很好的支持。
??? IXOS,是一个文档管理系统,数据是存在光存储器上的,专门用来管理Archiving文档的工具,具有简单好用等特点。
??? 最后,公司选择了IXOS,理由就是简单好用,越是牛比复杂的技术,日后出现问题的概率就越大,维护起来就越麻烦。
??? 由于选择了IXOS,所有有了Archiving项目,才有了机会把Archiving好好搞一遍。
SAP Archiving(3)--代码举例
SAP Archiving中对于一些增强过的表及特殊要求,我们要重写一些PreProcessing, Write, Delete, Read等程序。由于PreProcessing就是在Archiving前做一些检查和处理,每个表都有不同。所以下面就举Write, Delete, Read等比较通用的程序。(其实还是按照我之前的方法,把例子看懂了,逻辑清楚了,就可以拿来重用了。不然每次都重头写,不要累死的)。
Write Program
SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; }?*----------------------------------------------------------------------*?
*?Program?Name:?ZKEVINA_WRI?
*?Project?????:?N/A?
*?Author??????:?Kevin.Zhang?
*?Date????????:?2007.1.1?
*?Module??????:?N/A?
*?Description?:?Template?of?Program?
*?
*?
*?
*?Special?features:?N/A?
*?
*?
*----------------------------------------------------------------------*?
*?Modifications:?
*?Author??????Date?????Commented?as??Description?
*-----------??--------??-----------??----------------------------------*?
*?
*----------------------------------------------------------------------*?
REPORT??ZKEVINA_WRI.
*$*$----------------------------------------------------------------$*$*?
*$*$???????Global?Types,?Data?Statements,?Ranges,?Constants?????????$*$*?
*$*$----------------------------------------------------------------$*$*?
? ?
*-----------------------------------------------------------------------?
*???????????????????Tables?
*-----------------------------------------------------------------------?
TABLES?:?ZKEVINA.
*-----------------------------------------------------------------------?
*????????????????????Constants?
*-----------------------------------------------------------------------?
*?data?declaration?
CONSTANTS?:?LC_OBJECT???TYPE??ARCH_OBJ-OBJECT?VALUE??‘ZKEVIN‘?.
*-----------------------------------------------------------------------?
*??????????????????Variables?
*-----------------------------------------------------------------------?
DATA?:???LV_FILES_CREATE(1?)????????TYPE??C?,
????????LV_DELETE_TESTMODE(1?)?????TYPE??C?,
????????LV_HANDLE?????????????????LIKE??SY-TABIX,
????????LV_SESSION_INTERRUPTED(1?)?TYPE??C??VALUE??‘?‘?,
????????LV_OBJECT_IDENTIFIER??????TYPE??STRING,
????????LV_TOTAL_OBJECT_NUMBER????TYPE??I?,
????????LV_OBJECTS_PROCESSED??????TYPE??I?,
????????LV_PROGRESS_SEND(1?)???????TYPE??C?.
? ?
*-----------------------------------------------------------------------?
*????????????????????Internal?Tables?and?Work?Areas?
*-----------------------------------------------------------------------?
DATA?:???LS_ZKEVINA??????????????????LIKE??ZKEVINA,
????????LW_CALLBACK_PARAM?????????TYPE??BAL_S_PARM,
*????????lt_callback_param?????????TYPE?bal_t_par,?
????????LT_ZKEVINA??????????????????LIKE??TABLE??OF??ZKEVINA.
? ?
*?optional?e.g.?for?the?old?index?solution?(ADK?index,?not?SAP?AS)?
*?DATA:???lv_data_object_id??????LIKE?arch_idx_s-obj_id.?
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????Selection?Screen??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*-----------------------------------------------------------------------?
*???????????????????Selection?Screen?
*-----------------------------------------------------------------------?
*?selection?criteria?and?parameters?
SELECTION-SCREEN??BEGIN??OF??BLOCK??ARCH_ZKEVINA?WITH??FRAME?.
SELECT?-OPTIONS:??S_ID?FOR??ZKEVINA-ID?,
?????????????????S_NAME??FOR??ZKEVINA-NAME.
SELECTION-SCREEN??END??OF??BLOCK??ARCH_ZKEVINA.
? ?
*-----------------------------------------------------------------------?
*???????????????????At?Selection?Screen?
*-----------------------------------------------------------------------?
INCLUDE??ARCH_WRITE_PRG_STANDARD2.??????"?flow?control?
*---------?INITIALIZATION?----------?
INITIALIZATION?.
??PERFORM??STANDARD_OPT_WRITEPRG_INIT.??"?flow?contol:?frame?titel?
*---------?AT?SELECTION-SCREEN?OUTPUT?----------?
AT??SELECTION-SCREEN??OUTPUT?.
??PERFORM??STANDARD_OPT_WRITEPRG_ATOUTPUT?USING??LC_OBJECT.
??"?options?for?start?of?delete?program?
? ?
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????????Main?Program??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*---------?START-OF-SELECTION?----------?
START-OF?-SELECTION.
? ?
*?set?parameters?for?‘ARCHIVE_OPEN_FOR_WRITE‘?from?selection?screen?
??LV_DELETE_TESTMODE?=?‘X‘?.
??IF??P_WRITST?=?‘X‘?.
????LV_FILES_CREATE?=?SPACE.
??ELSE?.
????LV_FILES_CREATE?=?‘X‘?.
????IF??P_DELTST?IS??INITIAL?.
??????LV_DELETE_TESTMODE?=?SPACE.
????ENDIF?.
??ENDIF?.
? ?
*?select?data?from?the?database?
??SELECT??*?FROM??ZKEVINA?INTO??TABLE??LT_ZKEVINA
???????????WHERE??ID??IN??S_ID?AND?
?????????????????NAME?IN??S_NAME.
??LV_TOTAL_OBJECT_NUMBER?=?SY-DBCNT.
? ?
*?open?a?new?archiving?session?to?archive?data?
??CALL??FUNCTION??‘ARCHIVE_OPEN_FOR_WRITE‘?
????EXPORTING?
??????CALL_DELETE_JOB_IN_TEST_MODE??=?LV_DELETE_TESTMODE
??????COMMENTS??????????????????????=?P_COMENT
??????CREATE_ARCHIVE_FILE???????????=?LV_FILES_CREATE
??????OBJECT????????????????????????=?LC_OBJECT
??????OUTPUT_SEL_SCREEN_WHEN_DIALOG?=?‘‘?
????IMPORTING?
??????ARCHIVE_HANDLE????????????????=?LV_HANDLE.
? ?
*?optional:?set?call?back?parameter?for?object?and?message?details?
*??lw_callback_param-callback-userexitp?=?sy-repid.?
*??lw_callback_param-callback-userexitf?=?‘CALLBACK_AT_LINE_SELECTION‘.?
*??lw_callback_param-callback-userexitt?=?space.?
*??"or:?
*??lw_callback_param-callback-userexitf?=?‘<name?of?the?function?module>‘.?
*??lw_callback_param-callback-userexitt?=?‘F‘.?
*?init?protocoll?
??CALL??FUNCTION??‘ARCHIVE_PROTOCOL_INIT‘?
????EXPORTING?
??????I_DETAILPROTOCOL??=?P_PROT
??????I_PROTOCOL_OUTPUT?=?P_PROT_O.
*?optional:?set?call?back?parameter?for?object?and?message?details?
*?????I_CALLBACK_PARAMETER???????=?lw_callback_param.?
? ?
??LOOP??AT??LT_ZKEVINA?INTO??LS_ZKEVINA.
*?if?necessary,?process?checks?whether?records?can?be?archived?or?not?
*?(residence?time?etc.)?
*?...?
? ?
*?get/check?records?from?all?dependig/further?tables?
*?SELECT?*?FROM?<depending_table1>?INTO?TABLE?lt_depending_table1?
*????????????WHERE?...?
*??????????????AND?...?
*?...?
? ?
*?optional?e.g.?for?the?old?index?solution?(ADK?index,?not?SAP?AS)?
*?if?possible?use?SAP?AS?instead?
*?CONCATENATE?sy-mandt?ls_sbook-carrid?ls_sbook-bookid?
*???????????????INTO?lv_data_object_id.?
? ?
*?initialize?a?new?data?object?
????CALL??FUNCTION??‘ARCHIVE_NEW_OBJECT‘?
??????EXPORTING?
????????ARCHIVE_HANDLE?=?LV_HANDLE.
*????????object_id??????=?lv_data_object_id.?"?optional:?ADK?index?
? ?
*?put?data?records?into?ADK‘s?data?container?
????CALL??FUNCTION??‘ARCHIVE_PUT_RECORD‘?
??????EXPORTING?
????????ARCHIVE_HANDLE???=?LV_HANDLE
????????RECORD_STRUCTURE?=?‘ZKEVINA‘?
????????RECORD???????????=?LS_ZKEVINA.
? ?
*?further?(depending)?records?from?other?tables?usually?follow?
*????CALL?FUNCTION?‘ARCHIVE_PUT_TABLE‘?
*??????EXPORTING?
*????????archive_handle?????????????????=?lv_handle?
*????????record_structure???????????????=?‘DEPENDING_TABLE1‘?
*??????TABLES?
*????????table??????????????????????????=?lt_depending_table1.?
*?.......?
*?(or?alternatively?
*?????loop?at?<lt_depending_table1>?where?...?
*?????call?function?‘ARCHIVE_PUT_RECORD‘?...?
*?????endloop...)?
? ?
*?write?data?object?into?the?archive?file?
????CALL??FUNCTION??‘ARCHIVE_SAVE_OBJECT‘?
??????EXPORTING?
????????ARCHIVE_HANDLE????????=?LV_HANDLE
??????EXCEPTIONS?
????????TERMINATION_REQUESTED?=?1?.
????IF??SY-SUBRC?=?1?.
??????LV_SESSION_INTERRUPTED?=?‘X‘?.
??????EXIT?.
????ENDIF?.
? ?
*?collect?protocol?messages?
????CONCATENATE??LS_ZKEVINA-ID??LS_ZKEVINA-NAME?INTO??LV_OBJECT_IDENTIFIER?SEPARATED??BY??SPACE.
? ?
*?optional:?parameter?needed?in?order?to?display?object?details?
*????REFRESH?lt_callback_param.?
*????APPEND?INITIAL?LINE?TO?lt_callback_param?ASSIGNING?<lw_param>.?
*????<lw_param>-parname??=?‘...‘.?
*????<lw_param>-parvalue?=?‘...‘.?
? ?
????CALL??FUNCTION??‘ARCHIVE_PROTOCOL_COLLECT‘?
??????EXPORTING?
????????I_OBJECT??=?LV_OBJECT_IDENTIFIER
????????I_TEXT????=?‘Einzelflugbuchung?archiviert‘?(001?)
????????I_MSGTYPE?=?1?.
*????????I_CALLBACK_PARAMETER?=?lt_callback_param[].?
? ?
????LV_OBJECTS_PROCESSED?=?LV_OBJECTS_PROCESSED?+?1?.
? ?
*?send?progress?indicator?
????CALL??FUNCTION??‘PROGRESS_INDICATOR‘?
??????EXPORTING?
????????I_TEXT??????????=?‘&1%?(&2?von?&3)?der?Einzelflugbuchungen?archiviert‘?(002?)
????????I_PROCESSED?????=?LV_OBJECTS_PROCESSED
????????I_TOTAL?????????=?LV_TOTAL_OBJECT_NUMBER
??????IMPORTING?
????????E_PROGRESS_SENT?=?LV_PROGRESS_SEND.
????IF??NOT??LV_PROGRESS_SEND?IS??INITIAL?.
??????CALL??FUNCTION??‘DB_COMMIT‘?.
????ENDIF?.
? ?
*?send?progress?indicator?if?all?objects?are?processed?
????IF??LV_OBJECTS_PROCESSED?=?LV_TOTAL_OBJECT_NUMBER.
??????CALL??FUNCTION??‘PROGRESS_INDICATOR‘?
????????EXPORTING?
??????????I_TEXT???????????????=?‘&1%?(&2?von?&3)?der?Einzelflugbuchungen?archiviert‘?(002?)
??????????I_PROCESSED??????????=?LV_OBJECTS_PROCESSED
??????????I_TOTAL??????????????=?LV_TOTAL_OBJECT_NUMBER
??????????I_OUTPUT_IMMEDIATELY?=?‘X‘?.
????ENDIF?.
? ?
??ENDLOOP?.
? ?
??IF??LV_SESSION_INTERRUPTED?=?‘X‘?.
*?This?means?the?last?data?object?has?not?been?saved.?
*?->?Clean-up?and/or?update?status?specific?to?interrupted?sessions,?
*?but?also?write?a?detailed?or?standard?log?+?close?session?as?usual:?
??ENDIF?.
? ?
*?create?the?default?spool?list?
??CALL??FUNCTION??‘ARCHIVE_WRITE_STATISTICS‘?
????EXPORTING?
??????ARCHIVE_HANDLE?=?LV_HANDLE.
? ?
*?close?the?archiving?session?
??CALL??FUNCTION??‘ARCHIVE_CLOSE_FILE‘?
????EXPORTING?
??????ARCHIVE_HANDLE?=?LV_HANDLE.
? ?
*?write?protocol?
??CALL??FUNCTION??‘ARCHIVE_PROTOCOL_WRITE‘?.
? ?
*************?
*?optional?-?only?for?online?programs?with?protocol?output?into?the?spool:?
*?show?details?on?chosen?object?or?message?
*??AT?LINE-SELECTION.?
*????CALL?FUNCTION?‘ARCHIVE_PROTOCOL_LINE_DETAIL‘.?
? ?
*************?
*?optional?-?only?for?online?programs?with?protocol?output?into?the?spool:?
*?call?back?for?showing?details?on?chosen?object?
*??FORM?callback_at_line_selection?USING?lv_object?TYPE?string?
*????????????????????????????????????????lt_param??TYPE?bal_t_par.?
*????...?
**??!!!?if?CALL?SCREEN?is?needed,?it?has?to?be?called?in?a?function?module.!!!?
*?
*??ENDFORM.
? ?
? ?
Delete Program
SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; }?*----------------------------------------------------------------------*?
*?Program?Name:?ZKEVIN_DEL?
*?Project?????:?N/A?
*?Author??????:?Kevin.Zhang?
*?Date????????:?2007.1.1?
*?Module??????:?N/A?
*?Description?:?Template?of?Program?
*?
*?
*?
*?Special?features:?N/A?
*?
*?
*----------------------------------------------------------------------*?
*?Modifications:?
*?Author??????Date?????Commented?as??Description?
*-----------??--------??-----------??----------------------------------*?
*?
*----------------------------------------------------------------------*?
REPORT???ZKEVINA_DEL.
*$*$----------------------------------------------------------------$*$*?
*$*$???????Global?Types,?Data?Statements,?Ranges,?Constants?????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*-----------------------------------------------------------------------?
*????????????????????Constants?
*-----------------------------------------------------------------------?
*?data?declaration?
CONSTANTS?:?LC_OBJECT????????LIKE??ARCH_OBJ-OBJECT?VALUE??‘ZKEVIN‘?.
? ?
*-----------------------------------------------------------------------?
*??????????????????Variables?
*-----------------------------------------------------------------------?
DATA?:?LV_HANDLE????????LIKE??SY-TABIX,
??????LV_COMMIT_CNT????LIKE??ARCH_USR-ARCH_COMIT,
??????LV_OBJECT_CNT????TYPE??I?,
??????LV_DELCNT????????TYPE??I?,
??????LV_CNT???????????TYPE??I?.
? ?
DATA?:?LV_DOCUMENT?TYPE??ADMI_RUN-DOCUMENT,
??????LV_ARCHIVE_KEY?TYPE??ADMI_FILES-ARCHIV_KEY,
??????LV_OBJECTS_TO_DELETE?TYPE??I?.
*-----------------------------------------------------------------------?
*???????????????????Tables?
*-----------------------------------------------------------------------?
DATA?:?LT_ZKEVINA?????????TYPE??TABLE??OF??ZKEVINA,
??????LT_ZKEVINA_DELETE??TYPE??TABLE??OF??ZKEVINA.
? ?
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????Selection?Screen??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*-----------------------------------------------------------------------?
*???????????????????At?Selection?Screen?
*-----------------------------------------------------------------------?
*---------?INITIALIZATION?----------?
INCLUDE??ARCH_DELETE_PRG_STANDARD1.??????"<<<?flow?control?
? ?
? ?
INITIALIZATION?.
??PERFORM??STANDARD_OPT_DELETEPRG_INIT.??"<<<?flow?control:?frame?titel?
? ?
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????????Main?Program??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
START-OF?-SELECTION.
? ?
*?open?a?new?archiving?session?to?delete?data?
??CALL??FUNCTION??‘ARCHIVE_OPEN_FOR_DELETE‘?
????EXPORTING?
??????OBJECT?????????=?LC_OBJECT
??????TEST_MODE??????=?P_DELTST
????IMPORTING?
??????ARCHIVE_HANDLE?=?LV_HANDLE.
? ?
*?get?Customizing?data?from?the?archiving?object?
??CALL??FUNCTION??‘ARCHIVE_GET_CUSTOMIZING_DATA‘?
????EXPORTING?
??????OBJECT??????????????????????=?LC_OBJECT
????IMPORTING?
??????COMMIT_COUNT_FOR_DELETE_PRG?=?LV_COMMIT_CNT.
? ?
*?get?total?number?of?objects?to?be?deleted?
? ?
??CALL??FUNCTION??‘ARCHIVE_GET_INFORMATION‘?
????EXPORTING?
??????ARCHIVE_HANDLE???=?LV_HANDLE
????IMPORTING?
??????ARCHIVE_DOCUMENT?=?LV_DOCUMENT
??????ARCHIVE_NAME?????=?LV_ARCHIVE_KEY.
? ?
??SELECT??SINGLE??OBJ_COUNT?FROM??ADMI_FILES?INTO??LV_OBJECTS_TO_DELETE
???????????????????WHERE??DOCUMENT???=?LV_DOCUMENT
?????????????????????AND??ARCHIV_KEY?=?LV_ARCHIVE_KEY.
? ?
*?loop?to?get?the?next?data?object?from?the?archive?file(s)?
??CLEAR??LV_OBJECT_CNT.
??DO?.
????CALL??FUNCTION??‘ARCHIVE_GET_NEXT_OBJECT‘?
??????EXPORTING?
????????ARCHIVE_HANDLE?=?LV_HANDLE
??????EXCEPTIONS?
????????END_OF_FILE????=?01?.
????IF??SY-SUBRC?=?1?.
??????EXIT?.
????ENDIF?.
? ?
????ADD??1??TO??LV_OBJECT_CNT.
? ?
????REFRESH??LT_ZKEVINA.
????CALL??FUNCTION??‘ARCHIVE_GET_TABLE‘?
??????EXPORTING?
????????ARCHIVE_HANDLE????????=?LV_HANDLE
????????RECORD_STRUCTURE??????=?‘ZKEVINA‘?
????????ALL_RECORDS_OF_OBJECT?=?‘X‘?
??????TABLES?
????????TABLE??????????????????=?LT_ZKEVINA.
? ?
????APPEND??LINES??OF??LT_ZKEVINA?TO??LT_ZKEVINA_DELETE.
? ?
*???for?dependig/further?tables?
*???call?function?‘ARCHIVE_GET_TABLE‘?
*?????exporting?
*???????archive_handle????????=?lv_handle?
*???????record_structure??????=?‘DEPENDING_TABLE1‘?
*???????all_records_of_object?=?‘X‘?
*?????tables?
*???????table?????????????????=?lt_depending_table1.?
*???APPEND?LINES?OF?lt_depending_table1?TO?lt_depending_table1_to_del.?
? ?
? ?
*??in?case?of?archiving?classes?
*??call?function?‘ARCHIVE_DELETE_OBJECT_DATA‘?
*????exporting?
*??????archive_handle?????????=?lv_handle?
? ?
????IF??LV_OBJECT_CNT?=?LV_COMMIT_CNT.
*?delete?data?(if?running?in?production?mode)?or?simulate?deletion?(if?
*?running?in?test?mode)?and?collect?statistics?
??????PERFORM??DELETE_FROM_TABLE?USING??LV_HANDLE
??????????????????????????????????????P_DELTST
??????????????????????????????????????LV_OBJECT_CNT
??????????????????????????????????????LT_ZKEVINA_DELETE.
??????DESCRIBE??TABLE??LT_ZKEVINA_DELETE?LINES??LV_CNT.
??????ADD??LV_OBJECT_CNT?TO??LV_DELCNT.
??????CLEAR??LV_OBJECT_CNT.
??????REFRESH??LT_ZKEVINA_DELETE.
? ?
??????"..?dependig/further?tables?
????ENDIF?.???????????????????????????????"?value?of?commit?counter?
? ?
*?send?progress?indicator?
????CALL??FUNCTION??‘PROGRESS_INDICATOR‘?
??????EXPORTING?
????????I_TEXT??????=?‘&1?(&2?von?&3)?der?Einzelflugbuchungen?bearbeitet‘?(003?)
????????I_PROCESSED?=?LV_DELCNT
????????I_TOTAL?????=?LV_OBJECTS_TO_DELETE.
? ?
??ENDDO?.
? ?
??IF??LV_OBJECT_CNT?>=?1?.
????PERFORM??DELETE_FROM_TABLE?USING??LV_HANDLE?"?deleting?last?package?
????????????????????????????????????P_DELTST
????????????????????????????????????LV_OBJECT_CNT
????????????????????????????????????LT_ZKEVINA_DELETE.
????ADD??LV_OBJECT_CNT?TO??LV_DELCNT.
????CLEAR??LV_OBJECT_CNT.
? ?
????"..?dependig/further?tables?
??ENDIF?.
? ?
??IF??LV_DELCNT?=?LV_OBJECTS_TO_DELETE.
*?send?progress?indicator?at?the?end?
????CALL??FUNCTION??‘PROGRESS_INDICATOR‘?
??????EXPORTING?
????????I_TEXT???????????????=?‘&1?(&2?von?&3)?der?Einzelflugbuchungen?bearbeitet‘?(003?)
????????I_PROCESSED??????????=?LV_DELCNT
????????I_TOTAL??????????????=?LV_OBJECTS_TO_DELETE
????????I_OUTPUT_IMMEDIATELY?=?‘X‘?.
??ENDIF?.
? ?
*?create?statistics?list?
??CALL??FUNCTION??‘ARCHIVE_WRITE_STATISTICS‘?
????EXPORTING?
??????ARCHIVE_HANDLE???????????=?LV_HANDLE
??????STATISTICS_ONLY_PER_FILE?=?‘X‘?.
? ?
*?close?the?archiving?session?
??CALL??FUNCTION??‘ARCHIVE_CLOSE_FILE‘?
????EXPORTING?
??????ARCHIVE_HANDLE?=?LV_HANDLE.
? ?
*---------------------------------------------------------------------*?
*???????FORM?DELETE_FROM_TABLE????????????????????????????????????????*?
*---------------------------------------------------------------------*?
*??-->?P_HANDLE??????????ADK?handle?
*??-->?P_TESTMODE????????X?=?deleting?in?test?mode?
*??-->?P_OBJECT_CNT??????number?of?deleted?data?objects?
*??-->?PT_SBOOK_DELETE???records?to?delete?from?SBOOK?
*??-->?PT_...????????????records?to?delete?from?further?tables?
*---------------------------------------------------------------------*?
FORM??DELETE_FROM_TABLE?USING??VALUE?(P_HANDLE)?LIKE??SY-TABIX
???????????????????????????VALUE?(P_TESTMODE)?LIKE??P_DELTST
???????????????????????????VALUE?(P_OBJECT_CNT)?LIKE??SY-DBCNT
???????????????????????????VALUE?(PT_ZKEVINA_DELETE)?LIKE??LT_ZKEVINA_DELETE.
? ?
??DATA?:??LS_STAT_ITAB?TYPE??ARCH_STAT,
?????????LT_STAT_ITAB?TYPE??TABLE??OF??ARCH_STAT,
?????????LT_ZKEVINA_AUX?TYPE??TABLE??OF??ZKEVINA,??????????????"#EC?NEEDED?
?????????LV_DBCNT?TYPE??SY-DBCNT.
? ?
??REFRESH??LT_STAT_ITAB.
? ?
??IF??P_TESTMODE?IS??INITIAL?.
*?delete?data?on?DB?if?running?in?production?mode?
????DELETE??ZKEVINA?FROM??TABLE??PT_ZKEVINA_DELETE.??"?delete?job?restartable?
????LV_DBCNT?=?SY-DBCNT.
????"..?dependig/further?tables?
??ELSE?.
*?select?data?from?DB?if?running?in?test?mode?
????SELECT???*?FROM??ZKEVINA?INTO??TABLE??LT_ZKEVINA_AUX
????????????FOR??ALL??ENTRIES?IN??PT_ZKEVINA_DELETE
????WHERE??ID????=???PT_ZKEVINA_DELETE-ID?
????AND??NAME???=???PT_ZKEVINA_DELETE-NAME.
????LV_DBCNT?=?SY-DBCNT.
????"..?dependig/further?tables?
??ENDIF?.
? ?
??LS_STAT_ITAB-TABNAME?=?‘?‘?.
??LS_STAT_ITAB-COUNT????=?P_OBJECT_CNT.
??APPEND??LS_STAT_ITAB?TO??LT_STAT_ITAB.
??LS_STAT_ITAB-TABNAME?=?‘ZKEVINA‘?.
??LS_STAT_ITAB-COUNT????=?LV_DBCNT.
??APPEND??LS_STAT_ITAB?TO??LT_STAT_ITAB.
? ?
*?provide?ADK?with?statistics?data?(before?every?COMMIT?WORK!)?
??CALL??FUNCTION??‘ARCHIVE_GIVE_STATISTICS‘?
????EXPORTING?
??????ARCHIVE_HANDLE?=?P_HANDLE
????TABLES?
??????TABLE???????????=?LT_STAT_ITAB.
??COMMIT??WORK?.
? ?
ENDFORM?.???????????????????????????????"?DELETE_FROM_TABLE
? ?
Read Program
SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; }?*----------------------------------------------------------------------*?
*?Program?Name:?ZKEVINA?
*?Project?????:?N/A?
*?Author??????:?Kevin.Zhang?
*?Date????????:?2007.1.1?
*?Module??????:?N/A?
*?Description?:?Template?of?Program?
*?
*?
*?
*?Special?features:?N/A?
*?
*?
*----------------------------------------------------------------------*?
*?Modifications:?
*?Author??????Date?????Commented?as??Description?
*-----------??--------??-----------??----------------------------------*?
*?
*----------------------------------------------------------------------*?
REPORT???ZKEVINA.
*$*$----------------------------------------------------------------$*$*?
*$*$???????Global?Types,?Data?Statements,?Ranges,?Constants?????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*-----------------------------------------------------------------------?
*??????????????????Variables?
*-----------------------------------------------------------------------?
*?data?declaration?
DATA?:?HANDLE?????????????????LIKE??SY-TABIX,
??????BUFFER??????????????????TYPE??ARC_BUFFER,
??????ZKEVINA_WA???????????????LIKE??ZKEVINA,
??????NUMBER_OF_RECORDS_READ?TYPE??I?.
? ?
? ?
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????????Main?Program??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*?open?existing?archive?files?
CALL??FUNCTION??‘ARCHIVE_OPEN_FOR_READ‘?
??EXPORTING?
????OBJECT?????????=?‘ZKEVIN‘?
??IMPORTING?
????ARCHIVE_HANDLE?=?HANDLE
??EXCEPTIONS?
????OTHERS??????????=?1?.
? ?
IF??SY-SUBRC?<>?0?.
??WRITE?:?/?‘No?file?can?be?accessed‘?(001?).
??STOP?.
ENDIF?.
? ?
CLEAR??NUMBER_OF_RECORDS_READ.
*?loop?to?get?the?next?data?object?from?the?archive?file(s)?
DO?.
??CALL??FUNCTION??‘ARCHIVE_GET_NEXT_OBJECT‘?
????EXPORTING?
??????ARCHIVE_HANDLE?=?HANDLE
????EXCEPTIONS?
??????END_OF_FILE????=?1?
??????OTHERS??????????=?2?.
??IF??SY-SUBRC?<>?0?.
????EXIT?.
??ENDIF?.
? ?
*?get?data?records?from?the?data?container?
??DO?.
????CALL??FUNCTION??‘ARCHIVE_GET_NEXT_RECORD‘?
??????EXPORTING?
????????ARCHIVE_HANDLE???=?HANDLE
??????IMPORTING?
????????RECORD???????????=?BUFFER?-SEGMENT
????????RECORD_STRUCTURE?=?BUFFER?-RNAME
??????EXCEPTIONS?
????????END_OF_OBJECT????=?1?
????????OTHERS????????????=?2?.
????IF??SY-SUBRC?<>?0?.
??????EXIT?.
????ENDIF?.
? ?
????ADD??1??TO??NUMBER_OF_RECORDS_READ.
??ENDDO?.
ENDDO?.
? ?
WRITE?:?/?‘Total?number?of?records?read:?‘?(002?),?NUMBER_OF_RECORDS_READ.
SKIP?.
WRITE??/?‘Last?record?read:?‘?(003?).
SKIP?.
CASE??BUFFER?-RNAME.
??WHEN??‘ZKEVINA‘?.
????FIELD?-SYMBOLS:?<FS1>??TYPE??X?,
???????????????????<FS2>??TYPE??X?.
? ?
????ASSIGN??ZKEVINA_WA?TO??<FS1>?CASTING.
????ASSIGN??BUFFER?-SEGMENT?TO??<FS2>?CASTING.
????<FS1>?=?<FS2>.
*????sbook_wa?=?buffer-segment.?
????WRITE?:?/?‘ID????:‘?,?ZKEVINA_WA-ID?,
???????????/?‘NAME????:‘?,?ZKEVINA_WA-NAME,
???????????/?‘...‘?.
*?when?...?
*?If?the?archive?object?contained?more?than?one?table?
*?(different?buffer-rname),?more?cases?would?be?needed.?
ENDCASE?.
? ?
*?close?the?archive?session?
CALL??FUNCTION??‘ARCHIVE_CLOSE_FILE‘?
??EXPORTING?
????ARCHIVE_HANDLE?=?HANDLE.
SAP Archiving(4)--重点
你说SAP Archiving的重点和难点是什么?是技术么?显然不是,SAP已经提供了一套相当简便的方法,还有也有很多例子可供参考。有一个很Senior的 BASIS和我说过,BASIS做多了,就成了体力活,我想这句话应该是真的。很多BASIS的活不难,但是很需要熟练度,像这个Archiving的项目,看上去,主力是BASIS,但实际上,你只要会用几个T-code(DB02,DB15等)和一些DB上的知识,你也行。关键是人家比你更熟练,更精通,更有经验。
??? 虽说主要任务还是由BASIS和ABAP来承担,但是项目成败的关键还是业务,能对业务准确地分析,多久的数据是可以Archiving的?什么类型的凭证是不能Archiving的?
??? 我要先要把业务搞清楚了,才能往下做,我们当时做的时候就是在这方面花了很大力气。
后面就是BASIS分析好,那些表由于技术上的考虑(DB容量,系统性能等),需要Archiving。最后才是ABAP来进行实现。
??? 可是,一个项目要成功,就需要业务、BASIS、ABAP同事做好才能行。不然,就会导致以下几种情况:
??? 1.业务弄错了,后面都是白做
??? 2.BASIS没分析好,该Archiving的没有做,不该做的倒做了
??? 3.ABAP最后没有把实现好,导致最后数据错误地被Archiving,这个后果也是很严重的!
??? 所以,一个实施好的项目,就是把一系列的做好的事情串联而成的,要重视每一个环节!
SAP Archiving(5)--很好的架构
由于这边的业务比较复杂,对需要Archiving数据做的处理也就很多。
??? 这里我就要提到架构问题。之前写程序也没考虑到架构问题,因为大家都知道,国内做ABAP开发,程序的规模都不是很大。能在一个程序里写完的,绝对不放在两个程序里搞定。
??? 刚看到把一个程序搞那么复杂时,我真觉得那个美国的架构师是不是闲得没事做了,特意把简单东西复杂化了。
??? 但实则不然。
??? 后来在做项目过程中,慢慢发现,那样架构的优势,真的是很不错,值得国内的一些项目借鉴。下面就先写几点。
??? 先是一个自己写的Archiving Main Menu,User Menu上挂了很多T-code,包括SAP标准的那些Archiving 工具,还有自己定制的一些工具,用起来很方便。
??? 大量使用了function group,主程序代码量相对很少,大量地模块化。注:一个function group是可以共享全局变量的,这样每个function之间就有了联系。
??? 使用了动态调用及Mapping技术,真的很动态,减少很多冗余代码。
??? ......
????突然觉得这种东西,还是挺值得写写的。看看人家几百个程序是怎么整合成一个应用的,我后面会慢慢总结,好东西要一口口吃,不然会噎着的。
? ?
SAP Archiving(6)--一些补充
?对之前的Archiving?做一下补充
???????? T-code: AOBJ?,Customizing Setting?里,有一块是‘Place File in Storage System‘?,是将在SAP?文件系统中的Archive?文件,移送到外围的Storage System?中。但是,在我参与的项目中没有使用这个选项,而是由人工去实现移送。
Content Repository?需要根据情况自己定义。
T-code
OAC0?定义Content Repository
OAC2?定义Document types
OAC3?定义Content Repository?的Link
SM59?定义RFC Destination for Content Sever
SAP?官方有详细的介绍:
http://help.sap.com/saphelp_47x200/helpdata/en/8d/3e4ef6462a11d189000000e8323d3a/frameset.htm
???????? T-code SARI?,这是对Archiving?后的数据进行浏览使用的。
??? 进入SARI?界面后Customizing->Environment->Field Catalogs?定义与Archiving data?相应的Field Catalogs->?回到Customizing?界面,建立Archive Infostructure->?回到SARI界面,Status->?Status Per Archive/Status Per Infostructure->Fill Structures->SARI?界面,Archive Explorer->?输入相应的选择条件,就能查询到相关Archived?数据->?回到SARI界面,Status->?Status Per Archive/Status Per Infostructure->Delete Structures->?完成一次Archive Data Explorer?。
?? 对之前的Archiving?做一下补充。
??? 由于数据库中的数据做完Archiving?后,会暂时存在SAP?服务器中,之后才会移到相应的Storage System?。
??? 所以要对Archiving?数据的存储路径和命名规则进行定义。
??? 你在AOBJ->Customizing Settings?中要输入Logical File Name?,那个是在T-code: FILE?里定义的。
同时,你也可以查看Archiving?数据是否生成在指定目录,这个T-code?是AL11
????还有两个比较有用的T-code?:
?????????? CG3Y?下载服务器文件
?????????? CG3Z??上传服务器文件
? ?
????至于FILE?中如何设置的话,大家可以参看黄佳的《SAP?业务数据传输指南》,那里讲得比较详细。
??????????还有就是建议大家学一些BASIS的知识,这个对SAP从业人员还是很有用的。
SAP Archiving(7)--再谈架构01
之前说过一个Main Menu?的架构,虽然实现难度不是很大,但是却可以省去用户很多麻烦。所有的T-code?都集中在一个屏幕上,再也不用记那么多繁杂的T-code?了。
??? 主要是在Menu Bar?里加上相应的T-code?和描述,下面是代码的实现。很简单吧!但很实用!
*----------------------------------------------------------------------*?
* Program?Name:?ZARCH_MAINMENU?
*?Project?????:?N/A?
*?Author??????:?Kevin.Zhang?
*?Date????????:?2007.1.1?
*?Module??????:?N/A?
*?Description?:?Template?of?Program?
*?
*?
*?
*?Special?features:?N/A?
*?
*?
*----------------------------------------------------------------------*?
*?Modifications:?
*?Author??????Date?????Commented?as??Description?
*-----------??--------??-----------??----------------------------------*?
*?
*----------------------------------------------------------------------*?
? ?
REPORT???ZARCH_MAINMENU.
*$*$----------------------------------------------------------------$*$*?
*$*$???????Global?Types,?Data?Statements,?Ranges,?Constants?????????$*$*?
*$*$----------------------------------------------------------------$*$*?
? ?
*-----------------------------------------------------------------------?
*??????????????????Variables?
*-----------------------------------------------------------------------?
DATA?:?GV_TCODE?LIKE??SY-TCODE.
? ?
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????????Main?Program??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
? ?
*---------?START-OF-SELECTION?----------?
START-OF?-SELECTION.
? ?
*??Empty?screen?used?just?to?display?the?GUI?status.?
??CALL??SCREEN??001?.
? ?
*---------?END-OF-SELECTION?----------?
END?-OF?-SELECTION.
*&---------------------------------------------------------------------*?
*&??????Module??STATUS_0001??OUTPUT?
*&---------------------------------------------------------------------*?
*???????text?
*----------------------------------------------------------------------*?
MODULE??STATUS_0001?OUTPUT?.
? ?
*?Archiving?Area?Menu?
??SET??TITLEBAR??‘001‘?.
??SET??PF-STATUS?‘ARCHMENU‘?.
? ?
ENDMODULE?.?????????????????"?STATUS_0001??OUTPUT?
*&---------------------------------------------------------------------*?
*&??????Module??USER_COMMAND_0001??INPUT?
*&---------------------------------------------------------------------*?
*???????text?
*----------------------------------------------------------------------*?
MODULE??USER_COMMAND_0001?INPUT?.
? ?
??IF??(?SY-UCOMM?=?‘BACK‘??)???OR??(?SY-UCOMM?=?‘EXIT‘??)?OR?
??????(?SY-UCOMM?=?‘CANCEL‘??)?OR??(?SY-UCOMM?=?‘SE38‘??).
????LEAVE??PROGRAM?.
??ELSEIF??(?SY-UCOMM?=?SPACE?).
????EXIT?.
??ELSE?.
????GV_TCODE?=?SY-UCOMM.
????CALL??TRANSACTION??GV_TCODE.
??ENDIF?.
? ?
ENDMODULE?.?????????????????"?USER_COMMAND_0001??INPUT
SAP Archiving(8)--再谈架构02
?将一个功能或者模块的开发放在一个Package?里,这是一个习惯。就如,我们把SAP Archiving?中所有的字典对象,类,程序等都会放在一个Package?里。国内有些项目放得很随意,有根据开发人员分Package?的,有分得很宽泛的,更有甚者随便拿了个Package?就可以你放,以为只要能传输就可以了……?但是为了方便项目的管理和维护,我觉得还是以项目为单位比较好。特别是当一个公司模块很多,错综复杂的时候,这样分更易维护和升级。
???关于用Function Group?的好处。前面提到要把一个项目相关的开发都要放到一个Package?以便维护,这里有一个更进一步的,就是把相关联的Function?都放到一个Function Group?里,因为这样可以共享全局的参数,而且方便管理。
?? 可以用以下路径访问到Function?的Function Pool: se37->function?名->Goto->Global Data/MainProgram
Global Data?是全局有效的,Function?之间是共享的。比如一个程序调用一个function group?里的两个function?,如果这两个function?都对一个参数进行了操作,那么这个参数会顺序改变。
如:Global Data: A = 1.
??????? ?FM1: A = A + 1.
???????? FM2: A = A + 2.
????在主程序中Call FM1??? : A = 1 + 1 = 2
?????????????????????????? Call FM2???? : A = 2 + 2 = 4
?? 所以使用这种方式写的话,要当心全局变量的赋值。
SAP Archiving(9)--再谈架构03
这里我们聊一下动态调用和Mapping?。
?? 作为一个比较大型的应用,动态调用和Mapping?是必不可少的,有了这两样法宝,可以减少很多冗余代码,同时也简化日后维护。
???下面给一个例子:分两部分,一个是function group?,另一个运行用的report
Function pool: SAPLZKEVIN_A
*******************************************************************?
* ??System-defined?Include-files.?????????????????????????????????*?
*******************************************************************?
??INCLUDE??LZKEVIN_ATOP.??????????????????????"?Global?Data?
??INCLUDE??LZKEVIN_AUXX.??????????????????????"?Function?Modules?
? ?
*******************************************************************?
*???User-defined?Include-files?(if?necessary).????????????????????*?
*******************************************************************?
*?INCLUDE?LZKEVIN_AF.??????????????????????"?Subprograms?
*?INCLUDE?LZKEVIN_AO...??????????????????????"?PBO-Modules?
*?INCLUDE?LZKEVIN_AI...??????????????????????"?PAI-Modules?
? ?
INCLUDE??LZKEVIN_AF01.
? ?
*INCLUDE?LZKEVIN_AF02.?
? ?
INCLUDE??LZKEVIN_AF02.
? ?
LZKEVIN_AF01
? ?
*----------------------------------------------------------------------*?
***INCLUDE?LZKEVIN_AF01?.?
*----------------------------------------------------------------------*?
*&---------------------------------------------------------------------*?
*&??????Form??CHECK_02?
*&---------------------------------------------------------------------*?
*???????text?
*----------------------------------------------------------------------*?
*??-->??p1????????text?
*??<--??p2????????text?
*----------------------------------------------------------------------*?
FORM??CHECK_02?.
WRITE??/?‘CHECK_02‘?.
ENDFORM?.????????????????????"?CHECK_02?
*&---------------------------------------------------------------------*?
*&??????Form??CHECK_03?
*&---------------------------------------------------------------------*?
*???????text?
*----------------------------------------------------------------------*?
*??-->??p1????????text?
*??<--??p2????????text?
*----------------------------------------------------------------------*?
FORM??CHECK_03?.
WRITE??/?‘CHECK_03‘?.
ENDFORM?.????????????????????"?CHECK_03
? ?
LZKEVIN_AF02
*----------------------------------------------------------------------*?
***INCLUDE?LZKEVIN_AF02?.?
*----------------------------------------------------------------------*?
*&---------------------------------------------------------------------*?
*&??????Form??CHECK_01?
*&---------------------------------------------------------------------*?
*???????text?
*----------------------------------------------------------------------*?
*??-->??p1????????text?
*??<--??p2????????text?
*----------------------------------------------------------------------*?
FORM??CHECK_01?.
WRITE??/?‘CHECK_01‘?.
ENDFORM?.????????????????????"?CHECK_01
? ?
Report
*----------------------------------------------------------------------*?
*?Program?Name:?Z_KEVIN_ARCH?
*?Project?????:?N/A?
*?Author??????:?Kevin.Zhang?
*?Date????????:?2007.1.1?
*?Module??????:?N/A?
*?Description?:?Template?of?Program?
*?
*?
*?
*?Special?features:?N/A?
*?
*?
*----------------------------------------------------------------------*?
*?Modifications:?
*?Author??????Date?????Commented?as??Description?
*-----------??--------??-----------??----------------------------------*?
*?
*----------------------------------------------------------------------*?
? ?
REPORT???Z_KEVIN_ARCH.
*$*$----------------------------------------------------------------$*$*?
*$*$???????Global?Types,?Data?Statements,?Ranges,?Constants?????????$*$*?
*$*$----------------------------------------------------------------$*$*?
*-----------------------------------------------------------------------?
*????????????????????Internal?Tables?and?Work?Areas?
*-----------------------------------------------------------------------?
? ?
DATA??GS_CHECK?TYPE??ZCHECK.
DATA??GT_CHECK?TYPE??TABLE??OF??ZCHECK.
DATA??GS_ZKEVINA?TYPE??ZKEVINA.
DATA??GT_ZKEVINA?TYPE??TABLE??OF??ZKEVINA.
*$*$----------------------------------------------------------------$*$*?
*$*$??????????????????????????Main?Program??????????????????????????$*$*?
*$*$----------------------------------------------------------------$*$*?
? ?
SELECT??*?FROM??ZKEVINA
?????????INTO??TABLE??GT_ZKEVINA
????????WHERE??ID??=?‘1‘?.
? ?
SELECT??*?FROM??ZCHECK
?????????INTO??TABLE??GT_CHECK.
? ?
SORT??GT_CHECK?BY??SEQ.
? ?
LOOP??AT??GT_ZKEVINA?INTO??GS_ZKEVINA.
??READ??TABLE??GT_CHECK?INTO??GS_CHECK?WITH??KEY??ID??=?GS_ZKEVINA-ID?.
??IF??(?SY-SUBRC?=?0??).
????LOOP??AT??GT_CHECK?INTO??GS_CHECK?WHERE??ID??=?GS_ZKEVINA-ID?.
??????PERFORM??(GS_CHECK-CHECK_ROUTINE)?IN??PROGRAM??SAPLZKEVIN_A.
????ENDLOOP?.
??ENDIF?.
ENDLOOP?.
? ?
表结构:
ZCHECK
MANDT? ?????? ????????????? MANDT? ?????? CLNT???? 3???? 0???? Client
ID????????? ???????????????????????????????????????????????? CHAR???? 4???? 0???? ???????????????????????????????????????????????????????????
SEQ?????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????? NUMC3? ?????? NUMC??? 3???? 0???? Numc3, internal use
CHECK_ROUTINE????? CHAR30 ?????? CHAR???? 30??? 0???? 30 Characters
ZKEVINA
ID?????????? ????????? CHAR???? 4???? 0???? ID
NAME?????????? CHAR???? 20??? 0???? Name
? ?
The End!!!
? ?
From <http://blog.chinaunix.net/uid-22490185-id-3246075.html>
? ?
SARA?归档
2015年1月12日
19:23
? ?
? ?
? ?
(2013-04-25 14:01:43)
物料主数据归档
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
销售主数据归档
? ?
? ?
? ?
? ?
表空间在数据归档后并没有减少,需要在做数据重组后,表空间才会被释放。(reorg db)
? ?
T-code: AOBJ来定义Archiving Object
SAP使用归档对象(Archive Object)对数据进行归档,归档对象实际是多种关系的集合,一个归档对象对一类业务数据进行归档,归档对象告诉系统如何将数据写入到归档文件,归档后如何将数据从在线系统删除,归档文件如何保存到外部存储设备,如何从归档文件恢复数据到在线系统中等,维护归档对象的T-CODE是AOBJ
SAP使用T-CODE:SARA 归档管理工具进行归档操作,SARA从归档对象中找出对应写入程序,删除程序等,这些程序是使用ADK(Archive Development Kit)开发的一些报表程序,可以后台运行,SARA通过假脱机也就是打印的方式输出日志,
归档的简单过程是:
使用SARA调度
1. 通过归档对象中的wirte program,将数据以文件形式从系统中导出 2. 通过归档对象中的delete program,查询归档文件,将查询到的结果从在线系统中删除 3. 如果归档对象中设定了外部存储,归档文件可以转移到外部存储,外部存储可以是磁带机或光存储设备等 4. 如果归档对象中设置的Reload Program,数据可以从归档文件还原回数据库
? ?
Archive Development Kit(ADK)
ADK是SAP归档数据的开发包,其中包含归档管理程序,开发归档程序的API函数,
???ADK具有JOB调度,日志管理,数据的批量处理,文件的压缩,权限检查等功能
Archiving Object
Definition
归档对象是SAP数据归档的核心组件,它定义了那些数据需要归档以及如何归档
Use
使用TCODE SARA维护
结构
归档对象包含以下组成部分
Preprocessing (optional)
在写入程序之前对数据库中数据进行预处理,如设置一些标识位
Write
将系统中数据导出为二进制文件,write 程序是Report程序,使用Report 的程序的好处是可以后台运行,输出的日志可以通过假脱机显示,开发write程序需使用ADK提供的函数并遵循ADK的规则
Delete
读取导出的二进制文件,将这些数据从数据库中删除,读取二进制文件是为了防止误删除,这种机制保证了数据必须导出后才能删除
Reload archive (optional)
将二进制文件还原回在线数据库中
Index (optional)
SAP建议不要开发索引程序,推荐用Archive Information System(SARI)代替,归档文件是用二进制形式存储的,通常只能顺序方法,通过生成索引记录可以实现随机访问
Developing Archiving Solutions
?使用ADK开发write delete 等程序?
?使用AOBJ维护归档对象
Creating Archiving Objects
Prerequisites
write delete 等需要的程序必须已经存在
Procedure
使用TCODE AOBJ维护
定义基本信息
维护write,delete程序,
Interruption Possible表示是否允许中断,如果允许中断,需要在write程序中处理
1. Structure definition
声明数据类型,那些数据库中的数据组成了这个规定对象,定义结构,ADK程序会注册这些结构,按这些结构组织数据的归档,其中层次关系的作用还不清楚,需要维护的字段是segment, 标记为Do not Delete的 delete程序不会删除
2. Tables from Which You Only Delete Entries
ADK程序对维护在这里的表仅做删除操作而不进行文件的归档
3. Network Graphic
提示用户在归档前需要提前进行归档的对象,在SARA中可以以图形形式展示,仅仅是一个提示的作用,对ADK程序无任何影响
4. Customizing Settings
维护归档文件属性
Logical File Name 归档文件逻辑路径,使用TCODE:FILE维护,逻辑文件名用参数表示配置时按F1可以看到参数表示的含义
Maximum Size in MB 每个归档文件最多保存的数据量,超过这个限制write程序会生成新的归档文件
Maximum Number of Data Objects 每个归档文件最多保存的对象数
Commit Counter Delete程序计数器,达到这个数值后程序Commit一次数据库,这里设置是批处理的大小
Test Mode Variant & Production Mode Varia 删除程序使用的Variant,程序是报表形式开发的,使用Variant可以提供一个限制条件
Delete jobs,delete程序的触发条件,
Content Repository 外部存储,磁带机等
5. Archive classes Used
归档类使用 ACLA维护
6. Read Programs
读取程序,该程序从归档的二进制文件中读取数据
7. Customizing Transactions
业务相关的TCODE,如果维护了对于的TCODE,在SARA中可以跳转到对于的程序进行查看
Developing Write Programs
参考
http://help.sap.com/saphelp_nw70ehp2/helpdata/en/04/52ae3a6900b631e10000000a114084/frameset.htm
程序参考 BC_SFLIGHT归档对象下的相应程序
? ?
? ?
SAP归档操作
1. 归档前使用 TCODE AOBJ_DOCU 查询相关文档
2. 按照TCODE-ARCHGUIDE的指示进行归档
归档前要对系统进行分析,确定哪些表是需要归档的
3. 归档前建议建立Archive Information system (SARI)需要的结构,此后归档的相关信息可以在SARI里查看, SARI也提供了索引访问的工具
4. 使用AOBJ维护归档对象
5. 使用SARA调用归档对象进行写入删除等操作
6. 归档后要对数据库进行调整,如果使用的是Oracle这种带有基于成本的SQL优化器,要更新统计信息,以提高数据库性能
SAP归档常用TCODE
AOBJ 定义归档对象
AOBJ_DOCU 归档对象文档
SARA 归档管理
SARI 归档信息系统
SARE 归档浏览器
ARCHGUIDE 数据归档GUIDE
AS_AFB 归档文件查看,查询归档文件的技术信息
DB15 归档对象与表对于关系
? ?
来自 <http://blog.sina.com.cn/s/blog_4a036117010176an.html>
标签:
原文地址:http://www.cnblogs.com/rootbin/p/4463499.html