付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块化ABAP/4程概内 宏的定义与调 在调用程序与子程序之间进行数据传 在子程序中定义局部数据类型和对 功能模 使用现有功能模 创建和编写功能模 本章将介绍如何模块化ABAP/4程序。如果程序包含相同或相似的语句块,或者希望多次处理相同函数,应用模块化技术可以避免冗余。通过模块化ABAP/4程序,使得程序易读,并改善程序的结构。与未模块化的程序相比,模块化程序更易于维护和更新。模块化ABAP/4提供下列模块化技术如果模块化源代码,程序将更易 。例如,如果希望避免在程序中多次重复相同的语句,就应使用模块化技术。但是,不应采用这些方法模块化任务和函数。要模块化任务和函数,应使用子程序和功能模块。通过定义宏,可以在ABAP/4程序中创建可调用的程序代码模块。也可以在库中创建包含程序。这些程序包含源代码模块。宏的定义与调要定义包含部分源代码的宏,请使用DEFINE语句,用法如下语DEFINE这就定义了宏<macro>。必须在DEFINE和END-OF-DEFINITION之间指定完整的语句。这些语句最多可以包含九个占位符(&1,&2,…,&9)。完成宏定义之后,就可以进行调用,方法如下:语<macro>[<p1> 在生成程序期间,系统用已定义的语句替换<macro>,用<pi>替换每个占位符&i。可以从宏中调用另一个宏,但宏不能调用自己。DATA:DATA:RESULTTYPE TYPEIVALUE TYPEIVALUEDEFINERESULT=&1&2 &1&2&3DEFINEWRITE:/'Theresultof&1&2&3is',OPERATION4+3.OPERATION2**OPERATIONN2-Theresultof4+3Theresultof2**77TheTheresultofN2-N11这样就定义了两个宏:OPERATION和OUTPUT。OUTPUT嵌套在OPERATIONOPERATION&1、&2包含程如果要在多个程序中使用相同的语句序列,则可 将其代码编写到包含程序中。例如,当希望在不同程序中使用的数据较长时,这一点将非常重要。以下说明不不能与包含程序进行显式数因为包含程序的目的是模块化源代码。如与模数据传递,请使用子程序或功能模块。创建包含程序要创建包含程序,请按以下章节所述步骤进行:创建简单的ABAP/4程序(页对于程序属性类型,必须使用类型I。具体说明参见重要的程序属性(页1–4)通过双击ABAP/4程序中INCLUDE后的程序名,还可创建或更改包含程序(参见使用包含程序(页2)。这样既可以创建新程序,又可以更改现有程序。不能单独运行包含程序,而必须从其它程序中调用。可以从其它包含程序中调用包含程序。编写INCLUDE程序源代码的唯一限制如下 包含程序不能包含PROGRAM或REPORT语句。 包含程序不能调用自身。 包含程序必须包含完整语句TEXT=' TEXT字段。但是TEXT=' TEXT字段。但是,在用合适的类型定义了字段的任何程序中,都可以调用程序INCL-TST的结含程序的程序进行语法检查(参见使用包含程序(页2)使用包含程序要从另一个ABAP/4程序中调用包含程序,请使用INCLUDE语句,用法如下语INCLUDE在语法检查期间和生成期间,该语句将源代码<incl>到ABAP/4程序中。INCLUDE语句的功能类似于INCLUDE语句必须单独占一行,并且不能扩展到多行<incl>源INCLUDE语句必须单独占一行,并且不能扩展到多行假设编写了如下的包含程序***INCLUDEWRITE:假设编写了如下的包含程序***INCLUDEWRITE:/'Programstartedby',SY-/'onhost',SY-可以从任何其它ABAP/4程序调用该程序。例如,如果希望编写输出功能模块的标准表头请在PROGRAM或REPORT之 INCLUDE语句,方法如下INCLUDE输出结果如下ProgramProgramstartedbyonhost date:07/19/1995time:子程序是可以从ABAP/4中调用的程序。定义子程序的目的是为了避免重复编写程序中频繁使用的某些部分或频繁使用的算法。可以与子程序进行显式数据传递。有两种类型的子程序 子程序:子程序的源代码与调用程序(调用)位于同一ABAP/4程序中 外部子程序:外部子程序的源代码位于ABAP/4程序中而不是调用程序(外部调用)中尽管子程序主要用于模块化及结构化单个程序,某个ABAP/4程序中调用的子程序可以从另一个ABAP/4程序中外部调用。另外,也可以创建只包含子程序的ABAP/4程序。这些程序不能自己运行,而是被其它ABAP/4程序作为外部子程序库来调用。下列说子程序是以FORM开头、以ENDFORM结尾的代码块。要定义子程序,请使用下列语法:语FORM<subr><subr>定义子程序名。<pass>选项用于指定如何与子程序进行数 子程序,不必使用<pass>选项,但子程序可以主ABAP/4程序中的所有数据对象。(页 对于外部子程序,必须决定是使用<pass>选项,还是在内存公用部分 数据对象。有关与子程序进行数据传递的详细信息,参见在调用程序与子程序之间进行数据传递(页5)(页如果在同一程序中定义子程序,并且不使用事件关键字,则应将其分组集中在程序末尾,以免影响程流程(参见定义过程 Error!Notavalidlink.)子程序不能包含子程序不能包含嵌套的FORM-ENDFORM块。FORMWRITE:/'Programstartedby',SY-/'onhost',SY-这样就创建子程序HEADER子程序可创建输列表的表(请与2)中的示例进行比较)可以调用代码位于同一ABAP/4程序中的子程序(调用),也可调用代码位于其它ABAP/4程序中的子程序(外部调用。可以运行时指定子程序名,或从给定列表中调用子程序不仅可以从子程序中调用子程序(嵌套调用),子程序也可以调用自己(递归调用调用子程要调用子程序,请使用PERFORM语句,用法如下语PERFORM<subr>调用子程序<subr>。在<pass>选项中,指定如何与子程序进行数据传递。如果不使用<pass>选项,子程序也 主ABAP/4程序中 的所有数据类型和对象。该数据叫做全局数据,如果不被同名局域数据隐藏,该数据对子程序可见(关于数据传递的详细信息,参见在调用程序与子程序之间进行数据传递(页5)。PROGRAMPROGRAMDATA:NUM1TYPEDATA:NUM1TYPENUM2TYPESUMTYPENUM1=2.NUM2=PERFORMNUM1=7.NUM2=PERFORMADDIT.FORMADDIT.PERFORMOUT.FORMWRITE:/'Sumof',NUM1,'and',NUM2,'is',SUM.SUM=NUM1+Sum246Sum 7 11 在该示例中,程序末尾定义了两 子程序:ADDIT和OUT。ADDIT从该程序中调用OUT从ADDIT调用。子程序自动具有字段NUM1、NUM2和SUM 权限要调用外部子程序,请使用PERFORM语句,用法如下语PERFORM<subr>(<prog>)[<pass>][IF调用程序<prog>中定义的子程序<subr>。如果希望与子程序进行数据传递,必须定义<pass>选项或者使用公用部分(关于进行数据传递的详细信息,参见在调用程序与子程序之间进行数据传递(页5)如果使用IFFOUND选项,并且程序<prog>中没有子程序<sub>,系统就忽略PERFORM语句启动调用外部子程序的程序时,如果定义了子程序的程序不在内存中,ABAP/4就将其装载到内存中。为了节省空间,尽量将不同程序中定义的子程序数目限制到最小。PROGRAMFORMWRITE:/'Programstartedby',SY-/'onhost',SY-PROGRAMPERFORMHEADER(FORMPOOL)IF序运行时,可以指定要调用的子程序名以及子程序的程序名。为此请使用PERFORM语句,用法如下语PERFORM(<fsubr>)[INPROGRAM(<fprog>)][<pass>][IF系统执行字段<fsubr>中 的子程序。如果使用INPROGRAM选项,系统在字段<fprog>中的程序内查找子程序(外部调用。否则,系统在当前程序中查找子程序( 调用使用该语句还可在程序代码中指定子程序名和外部程序名。为此请忽略括弧<pass>选项指定如何与子程序进行数据传递(关于数据传递的详细信息,参见在调用程序与子程序之间进行数据传递(页5)。如果使用IFFOUND选项,找不到子程序<sub>时,系统就忽略PERFORM语句。PROGRAMFORMFORMWRITE:/'SubroutineWRITE:/'SubroutinePROGRAMSUBRNAME='SUB1'.PERFORM(SUBRNAME)INPROGRAM(PROGNAME)IFFOUND.SUBRNAME='SUB2'.PERFORM(SUBRNAME)INPROGRAM(PROGNAME)IFSubroutineSubroutinePROGNAME程要从列表中调用特定子程序,请使用PERFORM语句,用法如下:语PERFORM<idx>OF<form1> 系统执行子程序列表中位于<idx>处的子程序。PERFORM语句的这一变量只对调用有效。字段DO2PERFORMSY-INDEXOFDO2PERFORMSY-INDEXOFSUB1WRITE/'SubroutineWRITE/'SubroutineSubroutineSubroutine在该示例中,从列表中连续调用两 子程序:SUB1和SUB2在调用程序与子程序之间进行数据传递就和外部子程序而言,处理数据的缺省方法有所不同_对于 子程序,如果调用程序的全局数据未被同名局部数据隐藏,可直接从子程序进行 该全局数据由 数据对象和类型以及ABAP/4词典字段组成。ABAP/4词典字段由程序中的TABLES 。(关于该语句的详细信息,参见BCABAP/4用户指南(页Error!Notavalidlink.))。 如果希望采用与 子程序相同的方式,从外部子程序 调用程序数据,就必须在调用程序和包含外部子程序的程序中,将数据为公用部分(参见将数据 为公共部分(页6))在子程序中使用全局数据时,可以将全局数 到局部数据堆栈上。这一点 子程序中的全局数据为公共部分的数据有效。为此,必须使用字段符号(关于该 的详细信息,参见分配全局字段的本地副本(页10–16)(块的详细信息,参见功能模块(页16) 公共部分的规则会很复杂为了使程序更透明,可移植性更好,在调用程序和子程序之间进行数据传递时,应尽量选择下列方在和外部子程序中,明确指定所需的及可能更改的数据。为此,在定义和调用子程序期间,可以使用参数。参数是在FORM(参见定义子程序(页3)和PERFORM(参见调用子程序(页3)语句的<pass>选项中定义的。下列说将数据为公共部要将数据为公共部分,请使用DATA语句,用法如下语<dataENDOFCOMMONPART子程序和调用程序自动共享TABLES语句定义的表格工作区。在<datadeclaration>中,按DATA语句子程序和调用程序自动共享TABLES语句定义的表格工作区。要在调用程序和子程序中使用公共部分,必须在所涉及的全部程序中都使用完全相同的。因此,应将公共部分放到INCLUDE程序中(参见包含程序(页2)一个程序中可使用多个公共部分。但必须给每个公共部分分配一个名称<name>。如果每个程序中只使用一个公共部分,则名称<name>可选。为了避免在具有不同公共部 的程序之间发 ,公共部分的名称应始终保持唯一假定某个INCLUDE程序 MON包含公共部分NUMBERS的。公共部分由三个数字字段组成:NUM1、NUM2以及SUM: DATA:BEGINOFCOMMONPARTNUMBERS,NUM1TYPEI,NUM2TYPEI,SUMTYPEI,ENDOFCOMMONPART假定程序FORMPOOL包 MON,同时包含子程序ADDIT和PROGRAMFORMPOOL. FORMADDIT.SUM=NUM1+PERFORMOUT.FORMWRITE:/'Sumof',NUM1,'and',NUM2,'is',SUM.假定调用程序SAPMZTST时包 MON,并从程序FORMPOOL中调用ADDITPROGRAMSAPMZTST. NUM1=2.NUM2=4.PERFORMNUM1=7.NUM2=11.PERFORM启动SAPMZTST后,输出如下:Sum246Sum711该示例与调用 子程序(页3)中的示例功能相同。在当前示例中,必须将程序所用数据对 为公共部分,因为子程序ADDIT和OUT都被外部调用。通过参数进行数据传可以用参数在调用程序和子程序之间进行数据传递。 在定义子程序期间用FORM语句定义的参数叫做形式参数 在调用子程序期间用PERFORM语句指定的参数叫做实参数。可以区分不同种类的参数: 输入参数用于向子程序传递参 输出参数用于从子程序传递参 输入/输出参数用于与子程序进行参数传在FORM和PERFORM语句的<pass>选项中定义参数,方法如下语FORM<subr>[TABLES<formaltablelist>][USING<formalinputlist>][CHANGING<formaloutputPERFORM<subr>[(<prog>)][TABLES<actualtable[USING<actualinputlist>][CHANGING<actualoutputlist>]....选项TABLES、USING和CHANGING必须按上述顺序编写列表中USING和CHANGING后面的参数可以是所有类型的数据对象(参 数据(页3–1))和字段符可以用变量偏移量和长度规范指定实参数(关于偏移量规范的详细信息,参见指定数据对象然后号(参见使用字畏_号(页10–可以用变量偏移量和长度规范指定实参数(关于偏移量规范的详细信息,参见指定数据对象然后号(参见使用字畏_号(页10–1))段符同(参见具有偏移量说明的10–7))。存区内存区指定的实边界的偏移量(页6–35))。对于形式参数,不能采取这种方法。要参考形式参数的一部分,请对于FORM语句中USING和CHANGING后面列表中的个形式参数,可以指定不同数据传递方式_通过参考值调用:在子程序调用期间,仅将实参数的地址传送给形式参数。形式参数本身没有内存。在子程序中使用调用程序的字段。更改形式参数之后,调用程序中的字段内容也会_通过值调用:在子程序调用期间,形式参数是作为实参数的副本创建的。形式参数有自己的内存。更改形式参数并不影响实参数。_通过值和结果调用:在子程序调用期间,形式参数是作为实参数的副本创建的。形式参数有自己的内存空间。在子程序末尾,将对形式参数的更改给实参数。由TABLES传递的内表均通过参考值调用。关于如何指定形式参数数据类型的信息,参见指定形式参数的数据类型对于向子程序传递结构化数据非常重要。有关如何传递结构化数据的内容(字段串和内表)在以下章节中有专门解释:通过参考传递要通过参考值在调用程序和子程序之间进行数据传递,请使用FORM和PERFORM语句<pass>选项USING或CHANGING语FORM.....[USING<fi1>...<fin>][CHANGING<fo1>...<fon>]...PERFORM...[USING<ai1>...<ain>][CHANGING<ao1>...<aon>]...在USING和CHANGING后面的列表中指定形式参数和实参数,而不需附加任FORM语句中形式参数的名称可以与PERFORM语句中实参数<ai1>...<ain>and<ao1>...<aon>的名称不同。PERFORM语句列表中的第一个参数传递给FORM语句相应列表中的第一个参数,以此类推。用程避免定程序FORMPOOL包含两个子程序ADDIT和OUT:PROGRAMFORMADDITUSINGADDNUM1ADDNUM2CHANGINGADDADDSUM=ADD用程避免定程序FORMPOOL包含两个子程序ADDIT和OUT:PROGRAMFORMADDITUSINGADDNUM1ADDNUM2CHANGINGADDADDSUM=ADDNUM1+ADDPERFORMOUTUSINGADDNUM1ADDNUM2ADDFORMOUTUSINGOUTNUM1OUTNUM2OUT...WRITE:/'Sumof',OUTNUM1,'and',OUTNUM2,'is',OUT假定某个调用程序调用ADDIT和DATA:NUM1TYPENUM2TYPEI,SUMTYPENUM1=2.NUM2=PERFORMADDIT(FORMPOOL)USINGNUM1NUM2CHANGINGNUM1=7.NUM2NUM1=7.NUM2=PERFORMADDIT(FORMPOOL)USINGNUM1NUM2CHANGING启动SAPMZTST后,输出如下:Sum 2 4 Sum 7 11 该示例与将数据为公共部分(页6)中的示例功能相同。在当前示例中,通过参考值将参数NUM1、NUM2和SUM从SAPMZTST传递给子程序ADDIT的形式参数。更ADD_SUM后,后面的参数就传递给子程序OUT的形式参数OUT_NUM1、OUT_NUM2和要确保输入参数在调用程序中保持不变(即使子程序中已被更改),可以通过值将数据传递给子程序。为此,请使用FORM和PERFORM语句<pass>选项的USING,用法如下:语 <aii>通过对FORM语句中USING(关于USING的详细信息,参见通过参考传递(页7))后面列表中的形式输入参数写入VALUE(<fii>)而不是<fii>,相应参数就通过值进行传递。与实字段<ai>属性相同的PERFORM语句调用该子程序时,就会创建一个新的局域字段<fi>(关于局域字段的信息,参见在子程型和对。系统处独程序中参字段的该字段。假定假定FORMPOOL程序包含子程序PROGRAMFORMFACTUSINGVALUE(FNUM)CHANGINGFFFACT=WHILEFNUMGEFFACT=FFACT*FFNUM=FNUM-假定程序SAPMZTST调用子程序PROGRAMSAPMZTST.DATA:NUMTYPEIVALUE5,FACTYPEIVALUEPERFORMFACT(FORMPOOL)USINGNUMCHANGINGWRITE:/'Factorialof',NUM,'is',FAC.在启动SAPMZTST后,输出如下:Factorialof 5is 在该示例中,计算数字NUM的阶乘。输入参数NUM被传递给子程序的形式参数FNUM管FNUM在子程序中已被更改,实参数NUM仍然保持其初始值。输出参数FAC通过参考值通过值和结果进行传如果仅希望在子程序运行成功之后,才将更改过的输出参数从子程序返回给调用程序,请使用FORM和PERFORM语句<pass>选项的CHANGING,用法如下语通过对FORM语句中CHANGING(参见通过参考传递(页7)后面列表中的形式输入参数写入VALUE(<fii>)而不是<fii>,相应参数通过值和结果调用进行传递。与实字段<ai>属性相同的PERFORM语句调用该子程序时,就会创建一个新的局域段<fi>(关于局域字段的信息,参见在子程序中局部数类型和对(页13)。系统处理独立于调用程序中参考字段的字段。仅在运行到ENDFORM语句时,系统才将<fii>的当前值传递给<aii>。如果子程序因为某个信息(关于信息的详细资料,参见处理错误和消息Error!Notavalidlink.))而中断,则实参数aii>保持不变。DATA:OP1TYPEOP2TYPEI,RESTYPEOP1=OP2=DATA:OP1TYPEOP2TYPEI,RESTYPEOP1=OP2=PERFORMMULTIPUSINGOP1OP2CHANGINGWRITE:/'After/'RES='UNDER'RES=',FORMMULTIPUSINGVALUE(O1)VALUE(O2)CHANGINGR=O1*WRITE:/'Inside/'R=',R,'RES=',在启动SAPMZTST后,输出如下Inside 12 After 在该示例中,从调用程序调用子程序MULTIP。参数OP1和OP2通过值传递给形式参O1和O2。输出参数RES通过值和结果传递给形式参数R。通过将R和RES从子程 到屏幕上,证明RES在ENDFORM语句之前未被更改。从子程序中返回之后,其内容改。仅在编写程序(参见编写ABAP/4事务(页Error!Notavalidlink.))时,通过信终止子程序才有意义。在报表程序中,子程序中的信息终止整个程序。在时间事件)(参见列表中的消(页Error!Notavalidlink.))在互报表的选项屏幕和工具使用现 程序。 程序是作为ABAP/4中的关键字提供的键入形式参数要确保子程序的形式参数属于某个类型,可在FORM语句中指定该类型。为此,请在TABLES、USING或CHANGING后面列表中的形式参数后输入TYPE<t>或LIKE<f>(参见DATA语句的基本格式(页3–14)该类型规范可选。用PERFORM调用子程序时,系统检查PERFORM语句中实参数的类型是否与分配给形式参数的类型兼容。下表给出了兼容规则。不存在类型转换。如果类型不兼容,系统会在子程序调用的语法检查期间输出错误信息,或在外部子程序调用时出现运行错误。实参数的语法检查无类型规范TYPE系实参数的语法检查无类型规范TYPE系统接受任意类型的实参数。将实参数的所有属性传递给形式参TYPE系统检查实参数是否为内属性和结构从实参数TYPEC、N、P或系统检查实参数的类型是否为CN、P或X。将参数的长度和其规范(对类型P)从实参数传递给形式参数。TYPED、FI或T,LIKE<f>,完全确定这些类型。系统类型是否完全与形式相兼容。 TYPE TYPESTRING1(6)TYPE STRING2(8)TYPE TYPEPDECIMALS2,NUMBER2 TYPEI, TYPEI.PERFORMTYPETESTUSINGDATE1STRING1NUMBER1COUNT1.PERFORMTYPETESTUSINGDATE2STRING2NUMBER2FORMTYPETESTUSINGTXTTYPECVALUE(NUM)TYPEPINTTYPEI.DATA:DESCRIBEFIELDNOWTYPEWRITE:/'TypeofNOWis',T.DESCRIBEFIELDTXTLENGTHT.WRITE:/'LengthofTXTis',T.DESCRIBEFIELDNUMDECIMALST.WRITE:/'DecimalsofNUMare',T.DESCRIBEFIELDINTTYPET.WRITE:/'TypeofINTis',T.在SAPMZTST后,输出如下:TYPEofNOWisDLengthofTXTis6DecimalsofNUMare2TypeofINTisITYPEofNOWisTLengthofTXTis8DecimalsofNUMare0TypeofINTisI采用不同的实参数,两次调用 子程序TYPETEST。所有实参数和形式参数均兼容,在语法检查中没有出现错误信息。例如,如果在调用程序中将COUNT2 为TYPEF而不是TYPEI,则在语法检查中会报告错误,因为形式参数INT是用TYPEI指定的。请注意,类型规范不同,每次调用子程序时,形式参数的类型和属性也可以有所不同。详细信息,请参见FORM的关键字文档。段如果要向子程序传递字段串,并 子程序中字段串的组件,则必须指定相应形式参数的类型(参见键入形式参数(页9)。这里使用的数据类型必须与字段串类型相同。 子程序,可以使用TYPE或LIKE参考要直接传递的字段串的结构。对于外部子程序,还必须在包含子程序的程序中指定结构定义。为此,可以使用下列任何一种: ABAP/4下例就上述内容加以说明:包含程构(参见包含程序(页2)。该方法这种子程并且仅由几个开发者使用。包含程包含程序***INCLUDETYPES:BEGINOFENDOFLINE.程序FORMPOOL包含程序DECLARE和COMPONENTS程序INCLUDE TYPEN,FORMCOMPONENTSCHANGINGWRITE:-NAME=-AGE=-)TYPE--COUNTRY=-COUNTRY=程序SAPMZTST包含程序DECLARE,并调用子程序REPORTSAPMZTST.INCLUDEDECLARE.DATAWHOTYPELINE.WHO-NAME='Karl'.WHO-AGE='10'.WHO-COUNTRY='D'.PERFORMCOMPONENTS(FORMPOOL)CHANGINGWHO.WRITE:/WHO-NAME,WHO-AGE,WHO-COUNTRY.SAPMZTST后输 10 60实参数WHO(具有用户定义的、结构化数据类型LINE)传递给形式参参的类型就被完全指定。子程 的类型由TYPELINE确定。因为LINE是由用户定义的数据类型,因。形的组件。然后返回给调用程序中WHO的组DECLA类型组TYPE-POOLDECLATYPES:BEGINOFDECLA TYPEENDOFDECLA_LINE.程序FORMPOOL使用DECLA含子序COMPONENTSDECLA类型组TYPE-POOLDECLATYPES:BEGINOFDECLA TYPEENDOFDECLA_LINE.程序FORMPOOL使用DECLA含子序COMPONENTSTYPE-POOLS TYPEWRITE:-NAME=-)TYPEDECLA-AGE=程序SAPMZTST使用DECLA类型组,并调用子程序COMPONENTS:REPORTSAPMZTST.DATAWHOTYPEWHO-NAME='Karl'.WHO-AGE='10'.WHO-COUNTRY='D'.PERFORMCOMPONENTS(FORMPOOL)CHANGINGWHO.WRITE:/WHO-NAME,WHO-AGE,WHO-COUNTRY.SAPMZTST后输 10 60出现DECLA型组中之外,该例一样ABAP/4词典结程序FORMPOOL包含子程序COMPONENTS可以使用ABAP/4词典中的表格结构。该方法始终可选,因为总程序FORMPOOL包含子程序COMPONENTSPROGRAMPROGRAMWRITE:/CITIES-CITYFROM,CITIES- ='San程序SAPMZTST调用子程序REPORTSAPMZTST.DATAFLIGHTLIKESPFLI.FLIGHT-CITYFROM='Berlin'.FLIGHT-CITYTO='London'.PERFORMCOMPONENTS(FORMPOOL)CHANGINGFLIGHT.WRITE:/FLIGHT-CITYFROM,FLIGHT-CITYTO.SAPMZTSTCITIES-CITYFROM='NewNewSan在子程序COMPONENTSLIKESPFLICITIESABAP/4CITIES结构与表格SPFLI相同。在程序SAPMZTST中,使用相同结构对字段串FLIGHT明,然后填充和传递给子程序COMPONENTS的结构CITIES向子程序传递内用USING和CHANGING传递在FORM和PERFORM语句中,可以将内表当作USING或CHANGING后面列表中的参数传递。如果要访问内表组件,则必须指定相应形式参数的类型(参见键入形式参数(页9)。否则,只能在子程序中执行行操同时还必须区分有表头行或无表头行的内表。对于有表头行的内表,必须在表格名之后用方括号([])指定表格体,以便与表头行区分开(参见内表(页8–4)DATA:BEGINOFCOL1TYPEENDOFCOL2TYPEDATAITABLIKELINEOCCURSPERFORMFILLCHANGINGPERFORMOUT FORMFILLCHANGINGFITABLIKEDATA:BEGINOFCOL1TYPEENDOFCOL2TYPEDATAITABLIKELINEOCCURSPERFORMFILLCHANGINGPERFORMOUT FORMFILLCHANGINGFITABLIKEDATAFLINELIKELINEOFFDO3FLINE-COL1=SY-FLINE-COL2=SY-INDEX**APPENDFLINETOFFORMOUTUSINGVALUE(FITAB)LIKEDATAFLINELIKELINEOFFLOOPATFITABINTOFWRITE:/FLINE-COL1,FLINE-启动SAPMZTST后,输出如下:123149FILL和OUTITAB通过参考值传递给FILL,通过值传递给OUTF_LINE建为局部数据对象(有关局部字段的信息,参见在子程序中定义局部数据类型和对象(页3)ITAB为有表头行的表格,则在PERFORM和FORM中必须用ITAB[]代替ITAB用TABLES传递在FORM和PERFORM语句中,可以将所有内表当作TABLES后面列表中的参数进行传递。如果要在子程序中表格行的组件,则必须指定形式参数的数据类型(参见向子程序传递字段串(页10)。否则,只能执行整行操作。由TABLES传递的内表总是通过参考值调用。TYPES:BEGINOFCOL1TYPEENDOFCOL2TYPEDATA:ITABTYPELINEOCCURS10WITHHEADERLINE,JTABTYPELINEOCCURS10.PERFORMFILLTABLESMOVEITAB[]TOJTAB.PERFORMOUTTABLESTYPES:BEGINOFCOL1TYPEENDOFCOL2TYPEDATA:ITABTYPELINEOCCURS10WITHHEADERLINE,JTABTYPELINEOCCURS10.PERFORMFILLTABLESMOVEITAB[]TOJTAB.PERFORMOUTTABLESJTAB.FORMFILLTABLESFITABLIKEDO3FITAB-COL1=SY-FITAB-COL2=SY-INDEX**APPENDFFORMOUTTABLESFITABLIKELOOPATFWRITE:/FITAB-COL1,FITAB-启动SAPMZTST后,输出如下 在该示例中,内表ITAB有表头行,而内表JTAB无表头行。ITAB被传递给子程序FILL,从中使用表格工作域FITAB进行填充。在调用程序中,将ITAB的表格 到JTAB后被传递给子程序OUT工作F_ITAB在子程序中定义局部数据类型和对象局部数据类型和对象仅在它们的过程中出现。对程序,可以区 仅在执行子程序时才存在的动态数据类型和对象 程序之外的静态数据对象。在下次调用同一子程序之前,该数据对象一直调用和保留 显式定义的局部数据对象,可以用于保留全局数据对象值特殊种类的局部数据是局部数据堆栈上的全局数据副本。使用字段符号定义和 的详细信息,参见分配全局字段的局部副本(页10–16)定义动态局部数据类型和对可以用TYPES和DATA语句,按照创建数据对象和数据类型(页3–12)中的说明,在子程序内创建局部数据类型和数据对象。为每个子程序调用新近定义的这些类型和对象将在退出子程序时删除。每个子程序均有自己的局域命名空间。如果用与全局数据类型或对象相同的名称定义局部数据类型或对象,则不能在子程序中全局数据类型或对象。局部数据类型或数据对象会隐藏同名全局数据类型或对象。这意味着,如果在子程序中使用某个数据类型或对象名,则总定址局部的对象(如果存在),否则,定址全局的对象。PROGRAMTYPESWORD(10)TYPEDATATEXTTYPETEXT=PROGRAMTYPESWORD(10)TYPEDATATEXTTYPETEXT='1234567890'.WRITE/TEXT.PERFORMDATATEST.WRITE/FORMTYPESWORD(5)TYPEC.DATATEXTTYPEWORD.TEXT='ABCDEFGHJK'.WRITE/启动SAPMZTST后,输出如下该示例中,类型为WORD的数据类型WORD以及数据对象TEXT都在调用程序中给出全局部,类型为WORD的数据类型WORD以及数据对象TEXT都给出局 。它们隐藏全局类。在给TEXT分配值并将其写到屏幕上之后,调 子程序DATATEST。在子程序和对象。出子才恢效定义静态局部数据对如果想在退出子程序后保留局部数据对象之值,必须使用STATICS语句而非DATA语句进行(参PROGRAMPERFORMPERFORMFORMDATATEST1.TYPESFWORD(5)TYPEDATAFTEXTTYPEFWORDVALUEPROGRAMPERFORMPERFORMFORMDATATEST1.TYPESFWORD(5)TYPEDATAFTEXTTYPEFWORDVALUEWRITEFWRITEFTEXT.FORM FWORD(5)TYPESTATICSFTEXTTYPEFWORDVALUE'INIT'.WRITEFTEXT.FTEXT=WRITEFTEXT.启动SAPMZTST后,输出如下:INIT12345INITINITABCDEABCDEFTEXT=在该示例中,定义了两个类似的子程序:DATATEST1和DATATEST2。在DATATEST2中,用STATICS语句而不是DATA语 数据对象FTEXT。每次调用DATATEST1期间FTEXT都被再次初化,但都为DATATEST2STATICS语句的VALUE选项仅在第一次调用DATATEST2时起作用。显式定义局部数据对要避免全局数据对象值在子程序内被更改,请使用LOCAL语句,用法如下语LOCAL只能在FORM语句和ENDFORM语句之间使用该语句。对于LOCAL,可以保存无法被子程序内的数据隐藏的全局数据对象值(参见定义动态局部数据类型和对象(页13)例如,在子程序内,用TABLES语句(参见TABLES语句(页3–20))无法 由另一个TABLES语句定义的表格工作域。如果想局部使用表格工作域,但保留其在子程序外部的内容,则必须使用LOCAL语句。关于该语句的详细信息,参见LOCAL关键字文档。如下所示,假定程序FORMPOOL包含两个子程序TABTEST1和TABLESSFLIGHT.FORMTABTEST1.SFLIGHT-PRICE=WRITE:/SFLIGHT-PLANETYPE,SFLIGHT-PRICE.FORMTABTEST2.SFLIGHT-PRICE='500.00'.WRITE:/SFLIGHT-PLANETYPE,SFLIGHT-PRICE.如下所示,假定程序SAPMZTST调用TABTEST1和PROGRAMSAPMZTST.TABLESSFLIGHT.PERFORMWRITE:/SFLIGHT-PLANETYPE,SFLIGHT-PRICE.PERFORMTABTEST2(FORMPOOL).启动SAPMZTST后,输出如下:该示例中,通过参照ABAP/4词典结构SFLIGHT创建了一个表格工作域。在TABTEST1和TABTEST2中,给表格工作域SFLIGHT指定不同的值。TABTEST1中指定的值全局有效,而TABTEST2中指定的值仅局部有效。要中断子程序,所用方法与使用EXIT或CHECK语句中断循环的方式类似(参见终止循环(页7–20) 用EXIT无条件中断子程序 用CHECK根据条件中断子程序在FORM例程中,如果在循环内使用EXIT或CHECK循环的条参见止循环在FORM例程中,如果在循环内使用EXIT或CHECK循环的条参见止循环(页7–20)。中断循环时,EXIT语句和CHECK语句的工作方式不同,但中断子程序时,方式相同。无条件中断子程要无条件中断子程序,请使用EXIT语句,用法如下:语PROGRAMSAPMZTST.PERFORM执行EXIT语句后,系统立即退出子程序,进行PERFORMPROGRAMSAPMZTST.PERFORMWRITEWRITEFORMWRITEWRITE启动SAPMZTST12在该示例中,子程序TERMINATE在第三个WRITE程要有条件中断子程序,请使用CHECK语句,用法如下语CHECK如果条件不满足,则系统退出子程序,并开始PERFORM语句后的处理。对于<condition>,可以使用编程逻辑表达式(页7–3).中说明的任意逻辑表达式。DATA:NUM1TYPENUM2TYPERESTYPEPDECIMALSNUM1=3.NUM2=PERFORMDIVIDEUSINGNUM1NUM2CHANGINGRES.NUM1=5.NUM2=0.PERFORMDIVIDEUSINGNUM1NUM2CHANGINGRES.NUM1=2.NUM2=3.PERFORMDIVIDEUSINGNUM1NUM2CHANGINGFORMDIVIDEUSINGN1N2CHANGINGCHECKN2NER=N1/WRITE:/N1,'/',N2,'=',启动SAPMZTST3 42 3功能模块是在库内的特殊外部子程序。R/3系统提供大量预定义的功能模块,可以从ABAP/4程序中进行调用,而且可以创建自己的功能模块。功能模块和一般ABAP/4子程序的显著差异在于一个明确定义的、用于与功能模块进行数据传递的接口。对于功能模块,不能将数据为公共部分。对于ABAP/4词典表格,调用程序和被调用的功能模块都有单独的工作域。接口有助于输入和输出参数的传递并将其标准化。例如,可以给功能模块的输入值分配缺省值。可以决定通过值还是参考值进行数据传递(关于进行数据传递的详细信息,参见通过参数进行数据传递(页6)。接口也支持例外处理。借助例外,可以处理可能发生的错误。用ABAP/4工作台调用、创建和功能模块。例如,通过从ABAP/4程序外的事务屏幕调用功能模块,可以对其进试。在功能库中,可以将多个功能模块组功能组。因为可以定义功能组中所有功能模块都能的全局数据,因此,在一个功能组中包含操作相同数据(如内表)的功能模块比较合理。下列就现有功能模块的使用原则以及如何创建新的功能模块等加以说明。关于功能模块和功能库的详细信息,参见文档工作台工具(页Error!Notavalidlink.).。使用现有功能模下面说明调用可用功能模块列要获得可用功能模块列表,请执行以下操作通过“ABAP/4开发工作台”屏幕,在应用工具条中,选择“开发->功能库”,或者选择“功能库”。显示“功能库:功能模块”屏幕选择“查找”显示“ABAP/4信息系统:功能模块”屏幕输入所有已知的搜索标准(例如string_sp*),并选择“输入”。显示符合输入标准的所有功能模块列表。在该列表中,双击相应的复选框,选择所需的功能模块。要更改功能模块,选择“更改”(关于该 的详细信息,参见文档ABAP/4工作台工具(页Error!Notavalidlink.))。要显示关于功能模块的文档,选择“显示”(关于该 的属性(页17))。属要显示功能模块的属性,请将功能模块名输入到“功能库 功能模块”屏幕。例如然后,选择要显示属性的单选按钮,并选择示要更改以在“ABAP/4功能库:初始屏幕”上选择“更改”,或在下面的屏幕上选择“显示<->更改”。有文“文档”屏幕显示如下:文档就功能模块的目的加以说明,列出与模块进行数据传递的参数以及例外。参数类型I的参数为输入参数,用于向功能模块传递数据。参数类型E的参数为输出参数,用于从功能模块向调用函数传递数据。例外主要对功能模块中可能出现的错误情况进行说明。接参数出现列屏幕:选择“表格参数/例外出现下列屏幕上述屏幕列出功能模块中用于数据传递的所有形式参数。传递参数的过程与子程序的过程类似(参见通过参数进行数据传递(页6)。如果选择“参考值”复选框,就通过参考值传递参数。否则,如果不选择该复选框,就通过值传递参数。_输入参数与子程序的形式输入参数相对应。用于将数据从调用程序传递到功能模块。即使输入参数是通过参考值传递的,也不能改写。_输出参数与子程序的形式输出参数相对应。用于将数据从功能模块传递回调用程序。_通过参考值或值和结果(参见通过值和结果进行传递(页8))传递更改参数。更改参数即是输入参数又是输出参数。更改传递给功能模块的值,并将其返回给调用程序。_表格参数是内表。内表处理方式与更改参数一样,总是通过参考值传递_例外用于处理功能模块中可能发生错误的情况。调用程序检查是否发生了错误,然后采取相应的措施。这就是说,在调用程序中调用函数时,可以忽略相应的实参数。如果参数可选,并且不指定实参数,则可以指定在功能模块中使用的缺省值。输出参数总是可选。与子程序一样(参见键入形式参数(页9)),可以在字段“参考值类型”中指定形式参数的数据类型。在段“参考值结构”中,可以指定ABAP/4词典参考结构或字段。然后,在运行时,系统对照结构或字段检查当前参数。ABAP/4编辑器屏幕显示功能模块的ABAP/4源代码。可以按照显示或更改程序(页1–7)中说明的处理正ABAP/4程序的方式,处理源代码。测试功能模块可以选择“单个测试”,通过“功能库: 功能模块”屏幕对功能模块进试,不用从ABAP/4程序中调用。在“测试功能模块”屏幕上,可以为输入参数分配值。选择后,出现功结果屏幕”:随后,可以现功能模STRING_SPLIT的工作方式与ABAP/4关键字SPLIT(拆分字符串(页6–33))相同。在DELIMITER"-"处,将输入参数STRINGFUNCTION-MODULE"的值分为“FUNCTION”和“MODULE”并将其分配给输出参数HEAD和TAIL。请注意,STRING的内容改为大写字母,因为“测试功能模块”屏幕上的“大写/小写”复选框空着。调用功能模块要从ABAP/4程序调用功能模块,请使用CALL语句,用法如下语CALLFUNCTION<module>[EXPORTINGF1= fn=[IMPORTINGF1= fn= F1= fn= F1= fn=[EXCEPTIONSe1= en=rn[OTHERS=<formalparameter>=<actual可以module称指文字或。通过将参数显式指定给EXPORTING、IMPORTING、TABLES或CHANGING选项<formalparameter>=<actual EXPORTING选项允许将实参数ai传递给形式输入参数fi。在功能模块中,必须将形式参数为输入参数。 IMPORTING选项允许将形式输出参数fi传递给实参数ai。在功能模块中,必须将形式参数为输出参数。 CHANGING选项允许将实参数ai传递给形式参数fi,并在处理功能模块后,系统将(更改过的)形式参数fi传递回实参数ai。在功能模块中,必须将形式参数为更改参数。 TABLES选项允许在实参数和形式参数间传递表格。借助该选项,内表总是通 、PORTING和CHANGING选项的参数可以是任意类型的数据对象。这些选项的程序的FORM和PERFORM语句中(参见通过参传递(页6))的USING和CHANGING选项。TABLES选项的参数必须为内表。TABLES选项对应于FORM和PERFORM语句的TABLES选项(参见向子程序传递内表(页12)用EXCEPTIONS选项,可以处理功能模块处理过程中发生的例外。例外是功能模块的特殊参数。有关如何定义和出现例外的内容,创建和编写功能模块(页19).中有专门说明。如果出现ei例外,则系统停止执行功能模块,并且不将任何值从功能模块传递给程序,通过参考值传递的值例外。如果在EXCEPTION选项中指定了ei,则调用程序通过将ri分配给SY-SUBRC来处理例外。必须将ri指定为数字文字。可以使用EXCEPTION列表中的OTHERS处理列表中没有显式指定的所有例外,并且可将同一数值ri用于多个例外。通过ABAP/4编辑择“编辑->语句”是在程序中包括功能模块调用的最简单方法。可以在出现的对话窗口中选择“调用函数”,并输入要调用的功能模块名。然后选择“回车”,则系统将CALL语句(包含指定功能模块的所有可能选项)程序代码中。对于功能模块STRING-SPLIT,的代码如下显示:CALLFUNCTION'STRING_SPLIT'DELIMITER=STRING NOT_FOUND=TOO_LONG=TOO_SMALL=现在,可以按需要更改该代码DATA:DATA:TEXT=CALLFUNCTION'STRINGEXCEPTIONSNOT_FOUND=1OTHERS=CASESY-EXPORTINGDELIMITER=':'STRING=TEXTIMPORTINGHEAD=FRONTTAIL=ENDWHENWHENWRITE/'NotWRITE/'OtherWHEN WRITE:/FRONT,/启动SAPMZTST后,输出如下:该示例中,调用了功能模块STRINGSPLIT。通过使用EXPORTING项,将实参数“:”和传递给形式参数DELIMITER和STRING。如果这一过程成功完成,则通过IMPORTING选项将形式参数HEAD和TAIL传递给实参数FRONT和END如果STRINGSPLIT中出现NOTFOUND例外,则将SY-SUBRC的值设置为1。如果出现另个例外,则将SY-SUBRC的值设置为2。用CASE语句处理该例外。例如,如果将某个中不包括的文字分配给EXPORTING列表中的形式参数DELIMITER,则输出:Not下 说明如何创建简单功能模块。关于ErrorNotavalidlink.创建功能模块要创建新的功能模块,请执行以下操作通过“功能库:功能模块”屏幕,输入功能模块名并选择“创建”出现“功能模块创建:管理”屏幕。必须在该屏
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年哈尔滨东部地区投资建设有限责任公司校园招聘笔试备考题库及答案解析
- 2026年青岛能源集团有限公司校园招聘笔试模拟试题及答案解析
- 景区文明岗位工作制度
- 最小无疫单元工作制度
- 服务热线相关工作制度
- 机关管理节约工作制度
- 机电档案工作制度汇编
- 村卫生室全套工作制度
- 村咨询委员会工作制度
- 预防保健员工工作制度
- 2025年品牌故事活动培训课件
- 护理临床带教有效沟通
- 肌筋膜疼痛综合征触发点超声引导精准干针治疗方案
- 2025年贝壳房屋出租合同范本
- 花境园艺施工方案
- 2025年四川省雅安市小升初数学试卷(含答案)
- 教育局中小学阅读推广方案
- 教师使命读书课件
- 水务集团招聘考试笔试试题及答案
- 工完料净场地清课件
- 历年通信工程概预算考试试题与答案
评论
0/150
提交评论