q66262 发表于 2015-9-18 12:50:21

SAP 数据归档

  由于数据库越来越大,对于管理和使用都是一个大的问题,我们归档的目的就是为了是数据库进可能的小,加快用户响应时间,并且对于用户对于数据库的查询来说,进可能加载多的表到内存中。
  归档就是上面两个要求的平衡点,首先把不需要经常使用的商务对象数据从数据库中提取出来写到一个归档文件中,然后把相关对象从数据库删除,这就减小数据库大小。并且这些归档数据同样还是可以被用户读取和查询的。
  注意商业对象可能在数据库中跨多个表存储,归档对象是把这些表中这个商业对象全部归结到这个对象来的。
  然后才会在所有这些表中删除关于这个商业对象的相关数据。
  数据归档运行的大概过程如下:
  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.iyunv.com/zfjay/article/details/4713300>
  
  SAP Archiving--OverView
  2014年6月4日
  19:37
  
  
      所谓的SAP Archiving中文解释就是归档。这是一个什么样的概念呢?就比如,纸质办公的企业,它每年都会有很多的资料和数据,过几年就需要把一些用不着的文件整理处理,由专门的人员管理和保存,不再或很少拿出来使用(仅供特殊用途)。这是为了保证这些过时的文件,不影响到现有的业务,以免混在一起,降低现时文件的查找效率、造成管理混乱。那么现在SAP的归档,你可以理解成把纸质变成了硬盘和磁碟机,它们也有存满的一天,它们也存在着效率问题,所以对于运行大量业务的公司,定期的Archiving是必不可少的。
     下面谈一下Archiving几大优点。

[*]减少数据库的压力,提高系统性能
[*]有些数据由于财务审计、税务要求必须保留,不能删除,就只能通过Archiving的形式保留
[*]减少备份,恢复,升级的时间
[*]节约存储空间
[*]可以通过SAP提供的工具访问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)

  转载▼

  标签: 
  sap
  
  it
  分类: SAP
  物料主数据归档

  

  
  

  

  

  
  

  
  
  销售主数据归档

  

  
  

  
  表空间在数据归档后并没有减少,需要在做数据重组后,表空间才会被释放。(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>
页: [1]
查看完整版本: SAP 数据归档