ABAP开发Smartform实例

来源:互联网 发布:打车软件盈利模式 编辑:程序博客网 时间:2024/05/02 04:46

SmartForm是sap用来设计打印单据的基于可视化的一种技术,设计好后可以在程序里调用,传参,参数一般是内表。

         smartform总的来说就3个主要步骤。1,设置表格接口,就是指定该form显示哪个数据库的数据;2,设计报表头(也可以没有),就是表单的上部分,一般用来放公司logo、日期、页数这些信息。 3.设计主窗口,也就是表单显示数据的部分,主要工作就是设计表的列名和列名下面对应的表的字段。程序调用时会先在数据库中取数,然后填充到form。

         事务代码:smartforms进入,可以去设计form的样式,这里就不讲了,在表格处输入一个名字创建一个表格。


         进入后:

     

点击上方的“表格绘制器”可以显示表单,可视化。在“全局设置“->”表格接口“处定义参数ZLT_FLIGHT,关联类型是ZLT_FLIGHT,这个是自己建立的一个数据库表,这里的form就是显示zlt_flight的数据。

ZLT_FLIGHT结构如下:

         在“实用程序”->“字段列表打开/关闭”可以打开字段列表,这时候可以看到zlt_flight表的字段。

         表头设计就略过了。当我们创建了ZTEST_HXG_F3的时候,系统会默认的建立一个页面“%PAGE 新页面”。然后在MAIN 主窗口上点击右键,创建一个TABLE。

         新建后系统会自动在table下创建3个项目:表头,主要区域,脚标。

选中table,点击细节,可以设置表行格式。这里注意表的宽度一定要大于下面行类型的各个列加起来的宽度。行类型右边的1,2,3这些是第一列第二列第三列,还有他们的长度单位。

然后点击“数据”,设计loop循环如下。就是说循环的读取表数据填充到每一行里。一般来说内部表里第一个应该是接口定义的那个变量,第二个应该在全局变量再定义一个。

 

表有多少列这些格式已经设计好了,现在来设计表头,也就是列名。右键表头->新建行。系统会自动的帮你在行下创建等量的cell(列)

         然后我们现在要为每一列添加上名字。选中第一个cell新列,右键新建“文本”。

  

         如上图,画横线处输入列名,这里注意的是第一个列的“开始“一定要选”新行“。因为第一列一开始要新起一行嘛。

         接下来设置第二列的列名,同上新建文本,

         这里注意的是,“开始“处选择直接添加意思就是接着第一列添加该文本。后面的列同理设置成直接添加。

         做完了列名,接下来要设计每一列下面该显示什么数据了,也就是table下的”主要区域“。

         和前面一样,选中“主要区域“右键创建列,系统也会自动生成相应数量的cell,同理在第一个列右键新建文本,在右侧出来的界面里点击如下图画圈按钮,选择”一般属性“。

 

出现如下图界面,第一步和前面设置列一样,第一个列的开始要是”新行”如圈圈1,第二部,在左下角的字段名称下找到ZLT_FLIGHT,将CARRID拖动到箭头处,这样在这列就会显示这个字段的值

         到了第二个列,“开始”选择“直接添加”,拖动字段到那片空白处。后面的列也是这样设置。

 

       实际上到了这里,一个form基本完成了,但是Smartform的输出不支持“QUAN”和”CURR”类型,这里要转换。这些都可以在Smartform内部实现(如果你们的字段不是这两个类型的,可以跳过这部分内容)。步骤如下:

         1).在全局变量增加一变量LPRICE来保存PRICE转换至,类型定义为字符型:CHAR18。

 

         2)编写代码,转换参数类型。在主要区域price那一列,选择右键创建—>流逻辑->程序行,创建转换代码。如下图:

 

         到此已经创建完成,保存,激活,运行会生成一个funciton 模块。

         在这样我们就可以在程序中调用这个form了。代码:

[plain] view plain copy
  1. *&---------------------------------------------------------------------*  
  2. *& Report  ZLEARNING7_SMARTFORM  
  3. *&  
  4. *&---------------------------------------------------------------------*  
  5. *&  
  6. *&  
  7. *&---------------------------------------------------------------------*  
  8.   
  9. REPORT ZLEARNING7_SMARTFORM.  
  10. DATA: ZLT_FLIGHT LIKE STANDARD TABLE OF ZLT_FLIGHT WITH HEADER LINE.  
  11. DATA: L_OUTSET TYPE SSFCOMPOP.  
  12. SELECT *  
  13.   INTO CORRESPONDING FIELDS OF TABLE ZLT_FLIGHT  
  14.   FROM SFLIGHT  
  15.   AS A INNER JOIN SCARR AS B  
  16.   ON A~CARRID = B~CARRID.  
  17.   
  18. DELETE ADJACENT DUPLICATES FROM ZLT_FLIGHT.  
  19. *DATA: ctrl_param TYPE ssfctrlop,  
  20. *      out_option TYPE ssfcompop.  
  21. *  
  22. *ctrl_param-preview = 'X'.  
  23. *out_option-tddest = 'LP01'. " in your case it is LOCL  
  24. *ctrl_param-no_dialog = 'X'.  
  25. L_OUTSET-TDDEST = 'CODE'.  
  26. L_OUTSET-TDIMMED = 'X'.  
  27. L_OUTSET-TDARMOD = 1.  
  28. CALL FUNCTION '/1BCDWB/SF00000026'  
  29.   
  30. EXPORTING  
  31.   OUTPUT_OPTIONS = L_OUTSET  
  32.   USER_SETTINGS = ''  
  33. *EXPORTING  
  34. *    control_parameters = ctrl_param  
  35. *    output_options     = out_option  
  36. *    user_settings      = space  
  37.   TABLES  
  38.     ZLT_FLIGHT                 = ZLT_FLIGHT.  
  39.           .  
  40. IF SY-SUBRC <> 0.  
  41. * Implement suitable error handling here  
  42. ENDIF.  


 


         运行后会弹出对话框,设备输入lp01,点击打印预览,就可以出来结果了。还可以设置不弹出对话框直接预览,方法是代码里注释掉的部分。

 

 

最后,可以通过实际的form名来实现报表的调用,不用smartform直接执行生成的funciton module名来调用。大概方法就是调用系统函数“SSF_FUNCTION_MODULE_NAME“来实现,这里就不详细叙述了。


原创粉丝点击