ABAP学习之—SMARTFORM.ppt
ABAP学习之SMARTFORM2008年7月28号V1.01前言 总结了一下SmartForm的知识,和大家一起共享,也希望以后大家能够共同丰富这个PPT的内容。本次讲解建立在大家都掌握SmartForm开发的基本知识的基础之上。2目录我们主要通过SmartForm的开发流程逐次讲解:1.如何通过表单打印类型来判断SmartForm的设计方式 2.如何选择SmartForm与程序的接口方式 3.Report中编程和SmartForm中编程的区别 4.SmartForm中常用的小技巧31.如何通过表单类型来判断SmartForm的设计方式常见的几种表单打印类型分为l套打例如:发票的打印l非套打1)有固定的格式,对其中的字数和行数都有严格的规定。例如:发票凭证的打印2)只用按照一定的格式即可。例如:工资单信息的打印在这里,我们主要判断是使用模板,还是表来实现主数据的循环显示。42.如何选择SmartForm与程序的接口方式 在SAP的ABAP编程中,一般开发过程都是在Report程序中取出所有需要的数据,将数据进行相应的处理以后保存到输出内表中,再打印内表中的数据,但是SmartForms是一个独立的外部Function Module,对于程序内部定义的内表数据不能直接传递,需要定义外部的数据结构Structure或者使用标准的表结构,如果程序变更,需要传递的数据发生变化,那么该Sturcture也需要修改,这是SmartForms中不方便的地方。52.如何选择SmartForm与程序的接口方式l2.1通过读取数据库数据用SE11创建结构,通过设置SmartForm中的全局设置=表格借口=表,来使用。l2.2通过指针不用在SE11中创建结构,需要在SmartForm中的全局设置=全局定义=类型中定义。必须与Report中传输的内表结构一致。l2.3通过读取内存数据1)在全局设置=表格借口=导入中定义内表数据句柄。2)不用在SE11中创建结构,需要在SmartForm中的全局设置=全局定义=类型中定义。必须与Report中传输的内表结构一致。62.1通过读取数据库数据l结构:ZSDSM0001l表单:ZSDSM0002 l程序:ZSDSM000172.1通过读取数据库数据82.1通过读取数据库数据92.1通过读取数据库数据102.1通过读取数据库数据112.1通过读取数据库数据l行格式固定。122.1通过读取数据库数据系统:KF1参考Smartform:ZSDSM0001参考程序:YFIF0007_1132.2通过指针这种方法是通过在Smartform中建立指针,让其指向程序中的内表或工作区,从而实现不需要建立结构、不需要导入导出参数或内表,Smartform即可展示程序中数据的效果。142.2通过指针我们通常根据业务需求,会在程序中使用TYPE构建用于Smartform展示的内表或工作区,然后通过CALLFUNCTIONFNAMEEXPORTINGTABLES向Smartform传入参数,在Smartform中通过全局设置表格接口定义接收参数。使用指针,我们仍然需要在Smartform中定义参数,不过是在全局设置全局定义中进行设置。152.2通过指针步骤一步骤一:我们需要在全局定义的类型选项卡中进项设置,这里把我们程序中定义的TYPE直接复制过来就行了,如图:直接直接复制复制程序程序中的中的type定义定义162.2通过指针步骤二步骤二:在全局定义的全局数据选项卡中定义Smartform中使用的内表和工作区变量,参考的类型就是步骤一中定义的类型。定义内表使用TYPETABLEOF定义工作区使用TYPE如图:172.2通过指针步骤三步骤三:在全局定义的初始化选项卡中定义指针指向程序中的内表或工作区。首先:在输入参数填入步骤二中定义的内表和工作区变量名称。如图:182.2通过指针然后在下面的文本框中加入如下代码:*定义变量DATA:HEADER(50),BODY(50).*定义指针FIELD-SYMBOLS:TYPEANY,TYPEANY.*将程序中的工作区和内表赋值给变量HEADER=(YFIF0007_1)GWA_HEADER.BODY=(YFIF0007_1)GIT_BODY.*将变量赋给指针ASSIGN(HEADER)TO.ASSIGN(BODY)TO.*将指针赋给在全局数据中定义的内表和工作区变量GW_HEADER=.GT_BODY=.192.2通过指针那程序中需要做何事情吗?看这个调用Smartform的FUNCTION:CALLFUNCTIONFNAME*EXPORTING*TABLESEXCEPTIONSFORMATTING_ERROR=1INTERNAL_ERROR=2SEND_ERROR=3USER_CANCELED=4OTHERS=5.答案是:什么都不用做,注释掉EXPORTING和TABLES,我们不需要他们了。202.2通过指针系统:KF1参考Smartform:YFISM0001_1参考程序:YFIF0007_1212.3通过读取内存数据我们是在Report程序中进行取数逻辑,然后想办法将数据传递到SMARTFORMS中。我们知道在SAP中可以将一个对象Export到内存中的,我们就可以根据一个类似于句柄的字符串再次取出该数据,传送一个字符串到SmartForms中是没有任何问题的,所以我们只需要Export内表到内存中,将句柄传递到SmartForms中,在SmartForms中首先定义完全相同类型的内表,再将数据Import到内表中即可完全恢复数据,这样就完成的数据的传递工作。222.3通过读取内存数据事例程序:*&-*&ReportZFS_TEST001*&*&-*创建日期:2008/07/29*创建人:DuanYulan*功能说明:通过调用内存才实现参数的传递*-*变更履历*变更日期变更者管理序号变更内容*YYYY/MM/DDCGX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*-*REPORTZFS_TEST001.INCLUDEZINC_SF_HELPER.“创建内表在内存中的句柄的程序DATA:GIT_OUTPUT_HTYPETABLEOFSCARR,传入SmartForm的头数据GWA_OUTPUT_HLIKELINEOFGIT_OUTPUT_H,GIT_OUTPUT_DTYPETABLEOFSFLIGHT,传入SmartForm的明细数据GWA_OUTPUT_DLIKELINEOFGIT_OUTPUT_D.232.3通过读取内存数据DATA:HEADERNAMETYPECHAR18,头内表句柄ITEMSNAMETYPECHAR18,明细内表句柄GC_CARRIDTYPES_CARR_ID.查询条件SELECT-OPTIONS:S_CARRIDFORGC_CARRID.START-OF-SELECTION.PERFORMFRM_GETDATA.输出数据的查询在句柄中加上服务器当前时间作为句柄名称,防止多人同时使用该程序,导致句柄名称相同CONCATENATEZFSTEST001HDSY-UZEITINTOHEADERNAME.CONCATENATEZFSTEST001ITSY-UZEITINTOITEMSNAME.存输出表单表头数据的内表SAVEBUFFERGIT_OUTPUT_HHEADERNAME.保存输出数据明细的内表,与表头数据有关联字段SAVEBUFFERGIT_OUTPUT_DITEMSNAME.PERFORMFRM_OUTPUT_TO_SMARTFORM.调用完毕以后,删除数据CLEARBUFFERHEADERNAME.CLEARBUFFERITEMSNAME.END-OF-SELECTION.242.3通过读取内存数据*&-*&FormFRM_OUTPUT_TO_SMARTFORM*&-*输出到smartform打印*-*FORMFRM_OUTPUT_TO_SMARTFORM.SMARTFORMSDATA:OPTIONSTYPESSFCOMPOP.DATA:FM_NAMETYPERS38L_FNAM,S_OUTPUT_OPTIONSTYPESSFCOMPOP,CONTROLTYPESSFCTRLOP.S_OUTPUT_OPTIONS-TDDEST=LP01.SMARTFORMS初始化定义CONTROL-NO_DIALOG=.CONTROL-PREVIEW=.CONTROL-NO_OPEN=X.CONTROL-NO_CLOSE=X.CALLFUNCTIONSSF_FUNCTION_MODULE_NAMEEXPORTINGFORMNAME=ZSF_TEST003IMPORTINGFM_NAME=FM_NAMEEXCEPTIONSNO_FORM=1NO_FUNCTION_MODULE=2OTHERS=3.252.3通过读取内存数据CALLFUNCTIONSSF_OPENEXPORTINGCONTROL_PARAMETERS=CONTROLEXCEPTIONSFORMATTING_ERROR=1INTERNAL_ERROR=2SEND_ERROR=3USER_CANCELED=4OTHERS=5.CALLFUNCTIONFM_NAME打印会计凭证EXPORTINGPTR_HEADER=HEADERNAMEPTR_ITEMS=ITEMSNAMECONTROL_PARAMETERS=CONTROLOUTPUT_OPTIONS=S_OUTPUT_OPTIONSUSER_SETTINGS=EXCEPTIONSFORMATTING_ERROR=1INTERNAL_ERROR=2SEND_ERROR=3USER_CANCELED=4OTHERS=5.262.3通过读取内存数据CALLFUNCTIONSSF_CLOSEEXCEPTIONSFORMATTING_ERROR=1INTERNAL_ERROR=2SEND_ERROR=3OTHERS=4.ENDFORM.FRM_OUTPUT_TO_SMARTFO*&-*&FormFRM_GETDATA*&-*通过查询条件得到查询信息*-*FORMFRM_GETDATA.获取数据SELECT*FROMSCARRINTOCORRESPONDINGFIELDSOFTABLEGIT_OUTPUT_HWHERECARRIDINS_CARRID.SELECT*FROMSFLIGHTINTOCORRESPONDINGFIELDSOFTABLEGIT_OUTPUT_DWHERECARRIDINS_CARRID.ENDFORM.FRM_GETDATA272.3通过读取内存数据以下是在Report程序中Import和Export的Include的程序:*&-*&包括ZINC_SF_HELPER*&-*创建日期:2008/07/29*创建人:DuanYulan*功能说明:通过调用内存才实现参数的传递*-*变更履历*变更日期变更者管理序号变更内容*YYYY/MM/DDCGX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*-*TYPESBUFFER_ID(80)TYPEC.DATAWA_INDXTYPEINDX.DEFINESAVEBUFFER.定义存入内存的句柄PERFORMSAVE_TO_BUFFERUSING&1&2.END-OF-DEFINITION.DEFINECLEARBUFFER.清空内存PERFORMCLEAR_BUFFERUSING&1.END-OF-DEFINITION.282.3通过读取内存数据*&-*&Formsave_to_buffer*&-*定义存入内存的句柄*-*FORMSAVE_TO_BUFFERUSINGTTYPETABLETYPEIDTYPEC.WA_INDX-AEDAT=SY-DATUM.WA_INDX-USERA=SY-UNAME.WA_INDX-PGMID=SY-REPID.EXPORTTTODATABASEINDX(HK)IDTYPEIDFROMWA_INDX.ENDFORM.Save_To_Buffer*&-*&Formclear_buffer*&-*清空内存*-*FORMCLEAR_BUFFERUSINGBUFFIDTYPEC.DELETEFROMDATABASEINDX(HK)IDBUFFID.ENDFORM.Clear_Buffer292.3通过读取内存数据创建SmartForm:步骤一步骤一:在“全局设置”-“表格接口”-“导入”设置两个参数:ptr_header,ptr_items 这两个参数用来传入我们在Report中Export内表数据的句柄(ID key)。302.3通过读取内存数据步骤二步骤二:在“全局设置”-“全局定义”中进行多项设定 2.1)类型”设定,在这里需要定义4个类型,一个用来保存表头数据的工作区和内表,一个用来保存明细数据的工作区和内表,它们的结构必须与Report中Export到数据库中的内表的结构完全对应一致,否则,我们将不能从传入的句柄(ID key)中恢复内表数据。312.3通过读取内存数据2.2)全局数据”中,定义全局的变量,我们需要定义如下几个变量322.3通过读取内存数据2.3)在“初始化”中,将数据句柄中的内表恢复到刚设定的全局变量中,输入参数:PTR_HEADER,PTR_ITEMS,IT_HEADER,IT_ITEMS,G_TOTALLINES332.3通过读取内存数据2.4)在Freecode“格式化程序”中,定义Form Restor_buffer函数 至此,我们已经得到了表头和明细这2个内表的数据,下面就可以准备画报并输出数据了。342.3通过读取内存数据系统:KF1参考SmartForm:ZSF_TEST003参考程序:ZSF_TEST00135学习SmartForm谢谢观看!36