自定义Report 变量保存功能_第1页
自定义Report 变量保存功能_第2页
自定义Report 变量保存功能_第3页
自定义Report 变量保存功能_第4页
自定义Report 变量保存功能_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、       自定义Report 变量保存功能Robin Lei 如果已经使用EP并且完成了BI Integrated Into EP的用户,可能对这个功能很熟悉,就是在显示Report之前输入变量之时,报表的上方有输入变量值的保存功能。如果以上都没做到,下文值得看下去,当然整体思路绝对可以用到其他地方,因为它提供了一个交互切入点。碰到用户需要保存Report的变量,这还是第一遭。在显示报表之前,系统会自动生成变量输入界面,这个界面乃系统生成无法定制(或不知道如何做到)。这个界面在SAP 提供的基于Excel 的Bex Analysi

2、s是可以保存输入的变量的,用户接触之后希望能够移植到Web上,甚至说添加一个button来保存自己输入的变量值即可。需求简单明确,IT 捶胸顿足。       开始试图去发现,是否系统本身有这个功能,只是没人发扬光大而已,不过没有结果。以此同时,用户提到是否可以显示打开用户保存的View,还真在Web Application Designer发现相关控件,是一个Dropdown List。系统提供Save View的Button,这个一点我开始忽视了,这时突然觉得两者的相同之处,都是保存值到BW,无非都是提交Form给server处理

3、,是否可以借鉴?答案是肯定的。 首先分析Save View Button的代码,通过WAD打开标准模板0ADHOC_TABLE<!-Save View à<A class=SAPBEXBtnStd title="<SAP_BW_TEXT program='SAPLRRSV' key='C11'> <SAP_BW_TEXT program='SAPLRRSV' key='738'>" href="JavaScript:SAPBWOpenWindow(SAP_

4、BW_URL_Get() + '&amp;CMD=PROCESS_HELP_WINDOW&amp;HELP_SERVICE=HW_SAVE_VIEW&amp;item=QueryName', 'SaveView',500,250);"><nobr>&nbsp;<SAP_BW_TEXT program="SAPLRRSV" key="C11"></nobr> </A>看上去比较长,不过分析之后会发现关键是这里执行了一段Javasc

5、ript,所以可以把关键部分拿出来分析。SAPBWOpenWindow 为Function 名,传入几个参数,第一个是URL,其它可以不用管它。用过BW的人对里面的某些关键字一定熟悉了,比如CMD,HELP_SERVICE,ITEM。对,这里用到了SAP Command URLs(即传说中的WebAPI)。所以这次的突破点就是:如果定制SAP Command URLs。我们先来看看Save View是如何实现的:前提:为了使用这个命令,必须将help service 注册到某个Web Item。就是将下述属性加入到web Item 中。AttributeDescriptionHELP_SERV

6、ICEName of the help service (SAVE_VIEW)HELP_SERVICE_CLASSTechnical name of the help service class(CL_RSR_WWW_HWIND_SAVE_VIEW)以上我们可以获知,需要用到类,需要Register。首先我们通过CL_RSR_WWW_HWIND_SAVE_VIEW认识一下这个类的定义和使用。1. 继承CL_RSR_WWW_HELP_WINDOW2. 通过Method PROCESS_CMD处理接受到的参数及参数值3. 通过i_r_parameter获取参数及参数值上述三步算是吧Class的框架

7、立了起来。另外涉及到如何传参数,以及如何保存参数的问题,随后一一道来。 要把变量值整批的传递,自然考虑用Form以及Form的Submit功能。到这里会想到几个问题。1. 传什么2. 变量的类型决定用户会输入不同的数据,或单值或区间或通配符等等3. 输入框的数量是变化的,比如Multiple Selection,Select-Option4. 如何把Save Button嵌入到标准的界面第一个问题需要分析变量值保存的数据结构,这里涉及到三个表:Rsrrepdir - Directory of all reportsRsrvarianttxt - Texts for VariantsRsrvar

8、iantdir - Directory of Variants for Queries and Selection ObjectsRSRVARIANT - Variant Values看完这三个表,并结合之前存的一些变量值,可以发现内部存值采用的都是Option的方式,即:queryId、variantName、POS、SIGN,OPT,LOW,HIGH.这些都是很熟悉的东西。所以要保存的值就是变量的名称以及各种各样的值。第二、三个问题其实斗可以通过第一个问题获得答案,因为SAP的存值无法采用Option的方式。第四个问题比较麻烦,因为我们很清楚标准的变量输入界面我们是无法插足的,可是我们需要

9、动态去取输入界面的参数值。最终选择采用的方式是Iframe,当然内嵌网页的技术都可以实现,只是Iframe用的方便些。<IFRAME id=if01 height="100%" marginHeight=0 border=0 src="/sap/bw/BEx?sap-language=EN&bsplanguage=EN&CMD=LDOC&TEMPLATE_ID=ZWAD_SALES_BUDGET_DATA&VARIABLE_SCREEN=X" frameBorder=0 width="100%"

10、name=if01 marginWidth=0></IFRAME> 采用Iframe还有一个原因是后面需要动态去改变Iframe的内容,用Javascript去改变SRC的值即可实现。用户不单单需要保存,同时还需要选择各种已保存的变量组合,甚至可能要修改已保存的变量,这些都是需要考虑而用户不一定会说的。最终的样式如下: 我用了一个下拉框来显示系统已保存变量,以及用户新增的变量。因为没有现成的Dropdown List可以显示保存变量,所以我对表RSRVARIANT 建了一个Remote Cube,直接拉一个query显示变量列表,然后通过JS把值组装到Dropdown Lis

11、t。Dropdown List的HTML<select id=sel01 name="sel01" onchange="fs(this.value)" style="width:234;"> <OPTION>default</OPTION> </SELECT>初始化组装Dropdown List的代码$(document).ready(function() var arr = new Array(); /输出的是一个两列的表,第一列是技术名,第二列是描述,所以直接写谈不上逻辑 $(&qu

12、ot;tablename='TABLE_1'").find("tr").each(function(i) arri = new Array(); $(this).find("td").each(function(j) arrij = $(this).text(); ); ); var i ,opt_str; for( i = 0; i < arr.length ; i +) opt_str = "<option value=" +arri0 + ">" + arri1 +

13、 "</option>"/采用JQuery把可能值写入下拉框 sel01是Dropdown List的ID $(opt_str).appendTo($("#sel01"); )Dropdown List值变化的处理函数function fs(vari) var iframe1 = document.getElementById("if01"); var if_src = iframe1.src; iframe1.src = if_src + "&variant=" + vari; $("

14、;#DESCRIPTION").val( $("#sel01 option:selected").text() ); /添加到编辑框 $("#TECH_NAME").val( $("#sel01 option:selected ").val() ); /添加到编辑框变量值名称保存form<FORM id=VARI method=post name=VARI action=<sap_bw_url cmd='PROCESS_HELP_WINDOW' help_service='SAVE_VAR

15、IANT' item='TABLE_1'> target=show><input type="hidden" name="queryname" value="ZSD_BUDGET_MGROUP"></input> <input name="DESCRIPTION" id="DESCRIPTION" type="TEXT" maxlength="60" class="SAPBEXTx

16、tFld" size="30" > </input><input name="TECH_NAME" id="TECH_NAME" type="TEXT" maxlength="30" class="SAPBEXTxtFld" size="30" > </input>.<DIV style="DISPLAY: none" id=selection> 存放变量处</DIV

17、></form>保存发送代码function pre_submit() var flag = check_val();if(flag = 'N')return ;/以下代码实现将Iframe 的页面的变量存放的Form的值存到当前Form $("#selection").empty(); input_txt = $(window.frames"if01".document).find("formname='VARI'").html() ;$("#selection"

18、).append(input_txt);/提交表单$("form0").submit(); $("#frm01").css("display", "none")开始的时候我还在考虑变量值怎么取,后来干脆把这个变量Form都拷贝出来,一起传,到Process_CMD里面去处理。为了简洁,我还特意把保存框,在不用的时候隐藏起来,可以通过下述Funtion去切换。function show( ) var flag; flag = $("#frm01").css("display")

19、; if( flag = 'none') $("#frm01").css("display", "block"); else $("#frm01").css("display", "none") 之前我们有提到,要把Class注册到Web Item,所以我们就把Class注册到Table上,注意最后两个参数设定。<object> <param name="OWNER" value="SAP_BW"/&g

20、t; <param name="CMD" value="GET_ITEM"/> <param name="NAME" value="TABLE_1"/> <param name="ITEM_CLASS" value="CL_RSR_WWW_ITEM_GRID"/> <param name="DATA_PROVIDER" value="DATAPROVIDER_1"/> <param

21、name="GENERATE_CAPTION" value=""/> <param name="GENERATE_LINKS" value=""/> <param name="BORDER_STYLE" value=""/> <param name="SUPPRESS_REPETITION_TEXTS" value=""/> <param name="SHOW_COLUMN_HE

22、ADER" value=""/> <param name="SHOW_DATA_CELLS" value=""/> <param name="HELP_SERVICE" value="SAVE_VARIANT"/> <param name="HELP_SERVICE_CLASS" value="ZCL_RSR_WWW_HWIND_SAVE_VARIANT"/> ITEM: TABLE_1</obje

23、ct>还有一个函数是用来判断值是否存在的function check_val() var flag;var is_ort;var desc,tech_name;var size;var opt_txt; flag = 'Y'desc = $("#DESCRIPTION").val();tech_name = $("#TECH_NAME").attr("value");is_ort = $("#OVERWRITE").attr("checked");if (is_ort !=

24、 true) size = $("#sel01").find("optionvalue='"+ tech_name +"'").size() if(size > 0) alert("The technical name is exist"); flag = 'N' return flag; size = $("option:contains('"+desc+"')").size(); if(size > 0) ale

25、rt("The description is exist"); flag = 'N' return flag; size = $("#sel01").find("optionvalue='"+ tech_name +"'").size() if(size > 0) $("#sel01").find("optionvalue='"+ tech_name +"'").text(desc).attr(&quo

26、t;selected","selected"); else opt_txt = "<option value='" + tech_name + "' >" + desc + "</option>" $(opt_txt).appendTo("#sel01").attr("selected","selected"); 以上部分把页面处理的过程以及代码都做了交代,应该可以参照完成了。第三部分是关于如何存储值,这里

27、还需要好好看看输入些什么。如何看输入的值呢?第一到输入变量的界面,看Web的源代码,就可以很清楚的看到相应的input的内容,里面一大串的input就是变量值的内容。另外可以在class的接收部分去传递过来的值的规律。处理代码如下:  DATA:     l_view_id     TYPE string,     l_description TYPE string,  

28、60;  l_overwrite   TYPE string,     l_queryname   TYPE string,     l_compuid     TYPE sysuuid_25,     l_string      

29、;TYPE TABLE OF string,     l_index        TYPE sy-tabix,     para_itab TYPE rsr_th_parameter,     para_wa   TYPE LINE OF rsr_

30、th_parameter,     l_pos TYPE rsrnumc10,     l_log TYPE string,     l_str TYPE string.  DATA:itab_txt TYPE TABLE OF rsrvarianttxt,      

31、  wa_txt LIKE LINE OF itab_txt.  DATA:itab_dat TYPE TABLE OF rsrvariant,        wa_dat LIKE LINE OF itab_dat.  DATA:itab_dir TYPE TABLE OF rsrvariantdir, &

32、#160;      wa_dir LIKE LINE OF itab_dir. DATA: l_date(8),l_time(6).*Get The Parameters List  CALL METHOD i_r_parameter->get_table    RECEIVING      r_th_parameter

33、 = para_itab.*Get Technical Name & Descript  l_view_id = i_r_parameter->get_upper_case( i_id = 'TECH_NAME' ).  l_description = i_r_parameter->get( i_id = 'DESCRIPTION' ).

34、0; l_overwrite = i_r_parameter->get_upper_case( i_id = 'OVERWRITE').  l_queryname = i_r_parameter->get_upper_case( i_id = 'QUERYNAME' ).*Get Query COMPUID  SELECT SINGLE compuid 

35、INTO  l_compuid  FROM rsrrepdir  WHERE compid = l_queryname.*Get Variant Name List  SORT para_itab BY id index.  LOOP AT para_itab INTO para_wa WHERE id  EQ

36、0;'VAR_ID'.    wa_dat-compuid = l_compuid.    wa_dat-vari    = l_view_id.    wa_dat-pos     =  para_wa-index.    SPLIT para_wa-value 

37、; AT space INTO TABLE  l_string    .    READ TABLE l_string INTO wa_dat-vnam INDEX 1.    APPEND wa_dat TO itab_dat.  ENDLOOP.*Set the sign &

38、#160;LOOP AT para_itab INTO para_wa WHERE id  EQ 'VAR_SIGN'.    READ TABLE itab_dat INTO wa_dat WITH KEY pos = para_wa-index .     l_index = sy-tab

39、ix .     wa_dat-sign =  para_wa-value.     MODIFY   itab_dat FROM wa_dat  INDEX l_index.  ENDLOOP.*Set the operation  LOOP AT para_itab INTO para_wa&#

40、160;WHERE id  EQ 'VAR_OPERATOR'.    READ TABLE itab_dat INTO wa_dat WITH KEY pos = para_wa-index .    l_index = sy-tabix .    wa_dat-opt =

41、0;para_wa-value.    MODIFY  itab_dat FROM wa_dat INDEX l_index.  ENDLOOP.*Set the low value  LOOP AT para_itab INTO para_wa WHERE id  EQ 'VAR_VALUE_EXT'. 

42、60;  READ TABLE itab_dat INTO wa_dat WITH KEY pos = para_wa-index .    l_index = sy-tabix .    wa_dat-low = para_wa-value.    MODIFY  itab_dat

43、60;FROM wa_dat INDEX l_index.  ENDLOOP.*Set the Low value  LOOP AT para_itab INTO para_wa WHERE id  EQ 'VAR_VALUE_LOW_EXT'.    CONDENSE para_wa-value.   

44、0;IF para_wa-value NE ''.      READ TABLE itab_dat INTO wa_dat WITH KEY pos =  para_wa-index  .      l_index = sy-tabix .   

45、60;  wa_dat-low = para_wa-value.      MODIFY  itab_dat FROM wa_dat INDEX l_index.    ENDIF.  ENDLOOP.*Set the HIGH value  LOOP AT para_itab INTO 

46、para_wa WHERE id  EQ 'VAR_VALUE_HIGH_EXT'.    CONDENSE para_wa-value.    IF para_wa-value NE ''.      READ TABLE itab_dat INTO wa_dat WITH 

47、KEY pos =  para_wa-index .      l_index = sy-tabix .      wa_dat-high = para_wa-value.      MODIFY  itab_dat FROM wa_dat INDEX l_i

48、ndex.    ENDIF.  ENDLOOP. DATA: moff TYPE i,        mlen TYPE i.  LOOP AT itab_dat INTO wa_dat.    l_index = sy-tabix.   

49、0;CONDENSE wa_dat-low.    CONDENSE wa_dat-high .    CONDENSE wa_dat-sign .    DATA:str TYPE string.*这里主要是处理时间格式的问题    IF wa_dat-low NE ''.    

50、  MOVE wa_dat TO str.      FIND REGEX 'd2.d4' IN str.      IF sy-subrc EQ 0.        CONCATENATE wa_dat-low+3(4) wa_dat-low

51、+0(2) INTO wa_dat-low.      ENDIF.    ENDIF.    IF wa_dat-high NE ''.      FIND REGEX 'd2.d4' IN wa_dat-high.     

52、 IF sy-subrc EQ 0.        CONCATENATE wa_dat-high+3(4) wa_dat-high+0(2) INTO wa_dat-high.      ENDIF.    ENDIF.*这里比较麻烦,因为后来发现传过来的值没有严格的遵从Option的规则,比如说单值*sign和opt的栏位都是空的,所

53、以要结合low和high对sign和opt进行值的设定*,有空值的情况,也要把opt,sign清空。    IF wa_dat-sign EQ ''.      IF wa_dat-high NE '' .        wa_dat-sign = 'I'.  

54、      wa_dat-opt = 'BT'.      ELSEIF wa_dat-low ne ''.        wa_dat-sign = 'I'.        wa_dat-opt

55、60;= 'EQ'.      ENDIF.    ELSE.      IF wa_dat-low EQ ''.        CLEAR: wa_dat-sign   , wa_dat-opt .  &#

56、160;   ENDIF.    ENDIF.    MODIFY itab_dat FROM wa_dat INDEX l_index.  ENDLOOP.*先删除后保存值DELETE FROM rsrvariant  WHERE  compuid = l_compuid AND         vari   

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论