AppQuicker

快速搭建应用系统教程

  • 首页
  • 教程
  • 疑难解答
  • 关于AppQuicker

#14 窗口帮助——链接技术

一个企业可能有数以千计的产品数量,客户也有几百个,使用下拉列表会给填报带来困难。

解决这一问题的比较好的方法是:页面放置一个帮助按钮,通过按钮打开一个窗口,在新打开的窗口中不仅列示大数据量帮助列表,还提供查询过滤功能。

例如,我们建立一个客户的帮助窗口,在这个窗口中可以按照地区对客户进行过滤,也可以按照输入的客户名称关键字进行搜索,当我们选择查询结果时,页面自动把选中的数据回写到合同上……

这是一个很实用的需求,下面我们看一下这样的方式在Appquicker 中如何实现!

本章知识点:

Ð 报表文件如何调用jsp 的javascript 函数

Ð 自定义JSP

Ð TAG 的使用

第一步:修改销售合同单据

在设计器中打开销售合同(contract.raq ),调整界面结构如下:

image135

【属性_ 报表属性】,修改报表样式为普通报表。

插入语由于行式报表不支持HTML数据类型的单元格,所以我们要先把报表样式改为普通报表。

选择A6 ,输入表达式:=to(1,5)

表达式作用to(1,5)在A6中生成从1到5的一个数组,A6被扩展成为5行。

选择B3 ,右键菜单? 填报属性? 常规,是否可写:否,我们要使用帮助窗口来填写合同的客户信息。

选择F6 ,右键菜单? 填报属性? 常规,修改自动计算表达式:${ D6}*${E6} 。

选择D6 ,右键菜单? 填报属性? 校验tab 页,修改校验表达式为:D6.match(/^\d*\.\d{1,2}$|^\d*$/) 。

选择E6 ,右键菜单? 填报属性? 校验tab 页,修改校验表达式为:E6.match(/^\d*\.\d{1,2}$|^\d*$/)。

选择E3 单元格,右键菜单? 数据类型,选择类型8HTML ,在内容栏内输入下述HTML 语句:

<input type=”button” value=”…” onclick=”customer_help()”/>

插入语上面html语句意为:在E3单元格内加入一个按钮,点击按钮时执行javascript函数customer_help()。

customer_help()函数的作用?它在哪里?

修改后的contract.raq要以链接页面的方式进行发布,因为我们要使用帮助按钮打开一个新的窗口,这需要定义一个javascript函数来实现这一功能,这个javascript函数就是上面代码中的customer_help()。我们后面会把这个函数的定义写在装载contract.raq的jsp上。

选择B6 ,右键菜单? 填报属性? 更新tab 页,增加contract 表的更新项。

SNAG-0017

保存报表contract.raq 。

第二步:建立客户帮助报表

创建一张新的可以填报的普通报表,格式如下,保存为customerhelp.raq 文件。

image136

【配置_ 参数】新增字符串类型参数area ,customer 。

【配置_ 数据集】,新建基于地区表(area )的SQL 检索数据集ds1 ,另建立一个基于customer 表的复杂SQL 数据集ds2 。Sql 语句如下:

SELECT * FROM customer WHERE (? is null or province=?) and (? is null or customername like ‘%’+?+’%')

切换到参数tab页 ,增加参数列表,area ,area ,customer ,customer 。

插入语现在你能够熟练完成上述配置了吗?如果找不到相关的界面,请复习第九章的内容。

提示SQL中%的作用:”%“是SQL语句中使用的通配符,上面的SQL对客户姓名使用了模糊过滤,作用是从客户列表中过滤出客户名称包含customer参数值的所有记录。

设计器右侧数据集tab页,数据对象选择8列表,展开ds2节点,拖动customerid节点到A3;数据对象选择8取值,拖动customername到B3,linkman到C3,linkduty到D3,province到E3。

选择B1,D1,右键菜单?填报属性?常规,勾选是否可写。

选择B1,右键菜单?填报属性?常规,编辑风格选择下拉数据集,设置:数据集ds1,显示列areaname,数据列areaid。

选择C3,属性区域â显示值â表达式,输入:

ds1.select1(areaname,areaid==value())

选择B3,设置前景色为蓝色,字体带有下划线。

选择E1,右键菜单?数据类型,选择类型8HTML ,在内容栏输入:

<input type=”button” value=”查找” onclick=”customer_search()”/>

插入语javascript函数customer_search()的作用是按照输入的地区和用户名关键字过滤客户表。、

选择B3,属性区域â超链接â表达式,输入:

“javascript:customer_choose(”+A3+”,’”+B3+”‘)”

表达式提示调用页面上的customer_choose()函数,并把选中的客户编号和名称以参数的形式传给该函数。

保存customerhelp.raq。

第三步:创建JSP

在C:\Program Files\runqianReportCenter\webapps\reportCenter 目录下,新建一个文本文档,保存为contract.jsp ,这里记得修改文件的扩展名, 这个JSP 作用是显示contract.raq 报表文件。

Contract.jsp 内容如下, 请注意实际代码中不要加入行号:

#001 <%@ page contentType=“text/html;charset=GBK” %>

#002 <%@ taglib uri=“/WEB-INF/runqianReport4.tld” prefix=“report”%>

#003 <html>

#004 <body leftMargin=0 top =0 rigtMargin=0 bottonMargin=0>

#005 <report:html name=“report1″ reportFileName=“basic/contract.raq”

#006 funcBarLocation=“top”

#007 />

#008 </body>

#009 </html>

#010 <SCRIPT LANGUAGE=”JavaScript”>

#011 function customer_help()

#012 {

#013 var strurl=”customerHelp.jsp“;

#014 window.open(strurl,“_blank”,“Scrollbars=no,Toolbar=no,Location=no,Direction=no,titlebar=no,Resizeable=no,Width=490 ,Height=500,top=”+(window.screen.height-500)/2+”,left=”+(window.screen.width-500)/2);

#015 return false;

#016 }

#017 </SCRIPT>

插入语为什么我们要自己写jsp?

数据中心装载报表文件的页面是一个模板JSP,当我们需要引入一些javascript函数来执行特定功能(比如点击按钮打开一个窗口)的时候,模板JSP就无能为力了,这需要我们自己定义JSP页面文件,Appquicker提供了发布报表文件的TAG,这些TAG用法简单,容易掌握,下面只对本章用到的tag知识做一个介绍,tag的详细介绍请参见附录。

在介绍代码结构前,希望你已经对HTML的知识能有一个了解,知道HTML界面的主要几个标签如<html>,<body>,<script>,能看懂一般的javascript函数结构就够用了。

contract.jsp包括四部分内容,jsp的文件头,图表按钮,tag发布报表文件,javacript函数customer_help()。

Jsp文件头 :<%@ page contentType=”text/html;charset=GBK” %>,这一句告诉服务器,以GBK编码的方式输出JSP文件流,<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report”%>,这句标志了tag库的位置,声名tag使用时的前缀字符为report。

Tag标签 :report:html 代表这里要插入一个raq 报表,name 为引入的报表定义一个名称,reportFileName 指定raq 报表文件的位置,funcBarLocation=”" ,报表功能按钮的位置,非必选项,这里置空意思是不显示报表的功能按钮,我们已经自定了上面的图表按钮来实现应有的功能。Html 标签的其它属性设置请参见附录。

函数customer_help():使用了window.open()方法,打开一个新窗口,并载入指定rul的页面文档。Open()的用法可以查看MSDN的专题介绍,网址:

http://msdn2.microsoft.com/en-us/library/ms536651.aspx

函数customer_help()在新窗口中打开customerHelp.jsp,这个JSP我们将在下面定义。

创建customerHelp.jsp

在C:\Program Files\runqianReportCenter\webapps\reportCenter 目录下,另建customerHelp.jsp, 注意文件名中大写H 。

customerHelp.jsp 内容如下:

#001 <%@ page contentType=“text/html;charset=GBK” %>

#002 <%@ taglib uri=“/WEB-INF/runqianReport4.tld” prefix=“report”%>

#003 <html>

#004 <body leftMargin=0 top =0 rigtMargin=0 bottonMargin=0>

#005 <report:html name=“report1″ reportFileName=“basic/customerhelp.raq”

#006 funcBarLocation=“”

#007 params=“<%=request.getParameter(”params”)%>”

#008 />

#009 </body>

#010 </html>

#011 <SCRIPT LANGUAGE=”JavaScript”>

#012 function customer_search()

#013 {

#014 var strurl=“customerHelp.jsp?params=area=”+document.getElementById(”report1_B1″).value+”;customer=”+document.getElementById(”report1_D1″).value;

#015 window.location=strurl;

#016 }

#017 function customer_choose(A3,B3)

#018 {

#019 opener.document.getElementById(‘report1_B3′).innerText=B3;

#020 opener.document.getElementById(‘report1_B3′).value=A3;

#021 window.close();

#022 return false;

#023 }

#024 </SCRIPT>

编码说明 :tag 中的params=“<%=request.getParameter(”params”)%> 语句作用是:获取url 变量params 字符串,并用获取的值给tag 的params 属性赋值。这样customerhelp.raq 的area 和customer 参数就从params 属性中获得初始值。

函数customer_search() 作用:重新载入自身页面文件(customerHelp.jsp ),在载入之前,取得当前页面上的地区和用户名称关键字,形成params 参数,在载入页面时一并提交。

Window.location ,当前窗口中重新载入指定的url 。

函数customer_choose(A3,B3) 作用:用取得的参数对父窗口的B3 单元格进行赋值。

opener.document.getElementById(‘report1_B3′).innerText ,替换report1_B3 对象的起始和结束标记中间的内容,也就是设定report1_B3 的显示值。

report1_B3是什么?

由填报表模板生成的HTML中,一个填报表相当于一个<Table>,而每一个子元素<td>,都会自动生成id属性,其属性值的命名规则是,id=”tag的name属性值_单元格号“,如id=”report1_B2″,我们要在页面中用脚本取得或者修改单元格的值,可以根据这个id很容易做到,例如,要取得B2单元格的值,用javascript在页面中可以这样取得var B2Vlalue = document.all[’report1_B2′].value。

opener.document.getElementById(‘report1_B3′).value ,对report1_B3 对象赋值。

window.close() :关闭当前窗口。

注意到了吗?

Customerhelp页面的实现思路是:通过contract页面打开customerhelp窗口,这是可以输入查询条件进行过滤,每点击一次查找按钮,页面就根据查询参数重新载入一次,传递到后台的参数成为SQL查询的依据。对新载入的页面,用户可以直接点击某个客户名称,这时系统把该客户的编号和名称都返回到contract页面,更新客户编辑框的显示内容和值,同时关闭customerhelp窗口。理解了吗?重新理一理这一章的操作步骤吧!

删除单据专题

或许看到这里你已经产生了疑问,页面上并没有给出删除按钮,如果我想在打开一张非列表形式单据同时删除它该怎么实现?现在程序中还没有提供删除一个单据的功能,这个问题只有想想变通的解决方案了!

思路在合同的数据库表contract中加入一个字段del_flag,类型int,作为一条记录的删除标志,在合同报表上,增加一列,把这列的宽度设置为0(不显示),我们在合同报表所在的jsp上加入一个javascript函数,函数内容如下:

function del_func()

{

var i=5

var value_object=

document.getElementById(’report1′).rows(i).cells(5).innerText

while(value_object)

{

document.getElementById(’report1′).rows(i).cells(5).innerText=1

document.getElementById(’report1′).rows(i).cells(5).value=1

i=i+1;

value_object=document.getElementById(’report1′).rows(i).cells(5).innerText

}

_submitTable( report1 )

return false; }

其中的_submitTable( report1 ) 函数是系统提供的强提交函数,用它我们把修改后的数据向服务器提交,函数的主体功能是设置报表上新增加列的值为1,这样,我们就可以在查询时判定这张合同是不是已经被删除了。下面我们在页面上增加一个按钮来调用这个函数,试一下,这样的效果是否达到删除功能的要求。

第四步:发布链接

登录数据中心控制台,选择报表发布,在字典维护节点下新增节点:节点类型 超链接,节点名称 销售合同2 ,此节点对应的超链接 选择系统功能连接,编辑框内输入:

/contract.jsp

以/ 开头表示相对于WEB 应用的根目录

登录数据中心首页,选择销售合同2 节点,看到客户帮助的功能了吗?有了这个界面,再多的数据也可以搞定了。

image137

教程 |2007/11/07
#16 销售数据统计表——双向分组交叉表 #13 新需求:销售合同的单据

Comments are closed.


  • 询问问题

  • 关于AppQuicker

    • 认识APPQUICKER
    • AppQuicker适用于哪些企业
    • APPQUICKER的开发模式
    • 为什么可以快速开发
    • 打造企业级系统的优势

AppQuicker © 2007 All Rights Reserved.