JAVA—咖啡馆

——欢迎访问rogerfan的博客,常来《JAVA——咖啡馆》坐坐,喝杯浓香的咖啡,彼此探讨一下JAVA技术,交流工作经验,分享JAVA带来的快乐!本网站部分转载文章,如果有版权问题请与我联系。

BlogJava 首页 新随笔 联系 聚合 管理
  447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

18.13  查询统计模块

18.13.1  查询统计模块总体架构

查询统计模块主要包括以下功能。

  ●   采购单查询:用于根据不同的条件查询采购单信息。

  ●   入库查询:用于根据不同的条件查询入库单信息。

  ●   部门领用查询:用于根据不同的条件查询部门领用信息。

  ●   部门领用汇总:用于根据不同的条件对部门领用信息进行汇总。

  ●   部门报损查询:用于根据不同的条件查询部门报损信息。

  ●   部门报损汇总:用于根据不同的条件对部门报损信息进行汇总。

  ●   借出查询:用于根据不同的条件查询物资借出及归还信息。

  ●   部门汇总:用于对全部或指定时间段内部门领用及报损的物资信息进行汇总。

18.13.2  创建查询统计模块的ActionForm类

为了方便操作,本系统中定义了一个用于获取页面中传递的查询条件值的ActionForm类,将其命名为IfForm,并保存在com.actionForm包中,关键代码如下。

例程18-118:光盘\mr\18\MaterialManage\src\com\actionForm\IfForm.java

package com.actionForm;

import org.apache.struts.action.*;

public class IfForm extends ActionForm {

    private String flag[]=null;

    private String f="";

    private String key="";

    private String sdate="";

    private String edate="";

    private int state;

    public IfForm(){

    }

    public void setFlag(String flag[]) {

        this.flag = flag;

    }

    public String[] getFlag() {

        return flag;

    }

    ……   //此处省略了其他属性的getXXX()和setXXX()方法

}

18.13.3  创建查询统计模块的Action实现类

查询统计模块的Action实现类继承了Action类,在该类中首先需要在构造方法中实例化查询统计模块的QueryDAO类(该类用于实现业务逻辑操作),然后通过Action实现类的主要方法execute()执行相应的业务逻辑操作。Action实现类的execute()方法会被自动执行,这个方法本身没有具体的事务,它是根据HttpServletRequest的getParameter()方法获取的action参数值执行相应方法的。

查询统计模块的Action实现类的关键代码如下。

例程18-119:光盘\mr\18\MaterialManage\src\com\action\Damage.java

public class IfDeal extends Action {

    QueryDAO queryDAO = null;

    public IfDeal() {

        queryDAO = new QueryDAO();

    }

    public ActionForward execute(ActionMapping mapping, ActionForm form,

                                 HttpServletRequest request,HttpServletResponse response) {

        String action = request.getParameter("action");

        if (action.equals("stockQuery")) {     //采购单查询

            return stockIf(mapping, form, request, response);

        } else if (action.equals("stockDetail")) {     //采购单详细信息查询

            return stockDetail(mapping, form, request, response);

        } else if (action.equals("inStockQuery")) {     //“入库审核”时调用的查询

            return inStockIf(mapping, form, request, response);

        } else if (action.equals("inStorageSQuery")) {     //“入库查询”时调用的查询

            return inStorageSQuery(mapping, form, request, response);

        } else if (action.equals("loanApproveQuery")) {     //“借出审核”时调用的查询

            return loanApproveQuery(mapping, form, request, response);

        } else if (action.equals("loanBackQuery")) {     //“借出归还”时调用的查询

            return loanBackQuery(mapping, form, request, response);

        } else if (action.equals("loanQuery")) {     //借出查询

            return loanQuery(mapping, form, request, response);

        } else if (action.equals("loanDetail")) {     //借出详细信息查询

            return loanDetail(mapping, form, request, response);

        } else if (action.equals("damageQuery")) {     //部门报损查询

            return damageQuery(mapping, form, request, response);

        } else if (action.equals("getuseQuery")) {     //部门领用查询

            return getuseQuery(mapping, form, request, response);

        } else if (action.equals("getuseTotal")) {     //部门领用汇总查询

            return getuseTotal(mapping, form, request, response);

        } else if (action.equals("damageTotal")) {     //部门报损汇总查询

            return damageTotal(mapping, form, request, response);

        } else if (action.equals("branchTotal")) {     //部门汇总查询

            return branchTotal(mapping, form, request, response);

        } else {

            return mapping.findForward("error");

        }

    }

    ……  //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出

}

18.13.4  在QueryDAO类中创建通用查询的方法

在物资管理系统中多处涉及到数据查询,为了精简程序代码,可以将系统中多次使用的查询方法制作成为通用查询方法,这样在程序中只需要传递相应的参数就可以完成不同数据的查询。

在查询统计模块的业务逻辑类QueryDAO中创建通用查询的方法需要通过3个方法实现,下面分别介绍。

1.根据传递的参数组合单个条件的方法

编写根据传递的参数组合单个条件的方法,名称为oneIf(),该方法包括两个参数,一个是IfForm类型的ifForm,用于指定查询条件的ActionForm类,另一个是String类型的flagv,用于指定查询方式。在该方法中根据ifForm和flagv的值组合单个查询条件的条件字符串,并返回该字符串,具体代码如下。

例程18-120:光盘\mr\18\MaterialManage\src\com\dao\QueryDAO.java

public String oneIf(IfForm ifForm, String flagv) {

    String str = null;

    if ("a".equals(flagv)) {     //按指定字段查询

        if (ifForm.getF() != null) {

            str = ifForm.getF() + " like '%" +ifForm.getKey() + "%'";

        }

    }

    if ("b".equals(flagv)) {

        String sdate = ifForm.getSdate();

        String edate = ifForm.getEdate();

        if (sdate != null && edate != null) {

           str = "createTime between '" + sdate + "' and '" + edate +" 23:59:59'";

        }

    }

    if ("c".equals(flagv)) { //按状态查询

        int state = ifForm.getState();

        str = "state=" + state + "";

    }

    return str;

}

2.组合查询条件字符串的方法

编写组合查询条件字符串的方法,名称为ifCompose(),该方法只有一个IfForm类型的参数ifForm,用于指定查询条件的ActionForm类。在该方法中将通过循环调用例程18-120所介绍的oneIf()方法将多个查询条件组合成一个字符串,并返回该字符串,具体代码如下。

例程18-121:光盘\mr\18\MaterialManage\src\com\dao\QueryDAO.java

public String ifCompose(IfForm ifForm) {

    String str = null;

    String flag[] = ifForm.getFlag(); //定义一个字符型数组,获取表单中复选框提交的数据

    if (flag != null) {

        str = "";

        for (int i = 0; i < flag.length; i++) {

            str = str + oneIf(ifForm, flag[i]);

            if (i < flag.length - 1) {

                str = str + " and ";

            }

        }

    }

    return str;

}

3.通用查询的核心方法

编写通用查询的核心方法,名称为stockQuery(),该方法包括3个参数,分别是IfForm类型的ifForm(用于指定查询条件的ActionForm类)、String类型的tablename(用于指定查询数据表对应的持久化类名称)和int类型的state(用于指定查询状态,为3时代表查询全部数据,其他值根据相应数据表决定)。stockQuery()方法的具体实现过程如下。

(1)调用ifCompose()方法将传递的查询条件组合成一个查询条件字符串赋值给String类型的变量str。

(2)根据传递的参数和变量str的值组合HQL语句。

(3)执行HQL语句并将查询结果保存到List集合中。

查询统计模块的Action实现类的关键代码如下。

例程18-122:光盘\mr\18\MaterialManage\src\com\dao\QueryDAO.java

public List stockQuery(IfForm ifForm, String tablename, int state) {

    String str = ifCompose(ifForm);

    String hql = "";

    List list = null;

    if (str == null) {

        if (state == 3) { //state为3时代表查询全部数据

            hql = "From " + tablename + " order by createTime desc";

        } else {

            hql = "From " + tablename + " where state=" + state +

                  " order by createTime desc";

        }

    } else {

        hql = "From " + tablename + " WHERE " + str +

              " order by createTime desc";

    }

    session = MySession.openSession(); //打开Session

    try {

        Query query = session.createQuery(hql);

        list = query.list();

    } catch (Exception e) {

        e.printStackTrace();

        System.out.println("查询时出现的错误信息:" + e.getMessage());

    } finally {

        MySession.closeSession(session); //关闭Session

    }

    return list;

}

说明:在采购单查询、入库查询、入库审核、借出查询、借出归还和借出审核页面中都会用到QueryDAO类的stockQuery()方法。

18.13.5  采购单查询设计

使用的数据表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider

用户登录后,选择“查询统计”→“采购单查询”菜单项,进入到采购单查询页面,在该页面中可以按指定的字段或某一时间段进行查询,同时还可以实现按指定字段及时间段进行综合查询。采购单查询页面的运行结果如图18.28所示。

图18.28  采购单查询页面运行结果

1.设计采购单查询页面

采购单查询页面主要用于收集查询条件和显示查询结果,并通过自定义的JavaScript函数验证输入的查询条件是否合法,该页面中所涉及到的表单元素如表18.22所示。

表18.22                                        采购单查询页面所涉及的表单元素

名    称

元 素 类 型

重 要 属 性

含    义

myform

form

method="post" action="ifDeal.do?action=stockQuery"

表单

flag

checkbox

value="a" checked

请选择查询依据

flag

checkbox

value="b"

采购时间

flag

checkbox

value="c"

状态

f

select

<option value="sno" selected>采购单号</option>

<option value="provider">供应商名称</option>

<option value="principal">负责人</option>

<option value="username">操作员</option>

查询字段

key

text

size="50"

关键字

sdate

text

开始日期

edate

text

结束日期

state

radio

value="0" checked

未审核

state

radio

value="1"

已入库

state

radio

value="2"

不合格

Submit

submit

value="查询" onClick="return check(myform)"

【查询】按钮

编写自定义的JavaScript函数check(),用于判断是否选择了查询方式及当选择按时间段进行查询时,判断输入的日期是否合法,代码如下。

例程18-123:光盘\mr\18\MaterialManage\defaultroot\stockQuery.jsp

<script language="javascript">

function check(myform){

    if(myform.flag[0].checked==false && myform.flag[1].checked==false && myform.flag[2].checked= =false){

        alert("请选择查询方式!");return false;

    }

    if (myform.flag[1].checked){

        if(myform.sdate.value==""){

            alert("请输入开始日期");myform.sdate.focus();return false;

        }

        if(CheckDate(myform.sdate.value)){

            alert("您输入的结束日期不正确(如:2006-07-05)\n 请注意日期格式或闰年!"); myform. sdate.focus();return false;

        }

        if(myform.edate.value==""){

            alert("请输入结束日期");myform.edate.focus();return false;

        }

        if(CheckDate(myform.edate.value)){

            alert("您输入的结束日期不正确!\n 请注意日期格式或闰年!");myform.edate.focus(); return false;

        }

    }

}

</script>

2.修改查询统计模块的Action实现类

在采购单查询页面中单击【查询】按钮,系统会访问一个URL地址,这个URL地址是“ifDeal.do?action=stockQuery”。从这个URL地址中可以知道采购单查询页面所涉及到的action的参数值为“stockQuery”,当action=stockQuery时,会调用查询采购单概要信息的方法stockIf(),具体代码如下。

例程18-124:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

if (action.equals("stockQuery")) {

    return stockIf(mapping, form, request, response);

}

在查询采购单概要信息的方法stockIf()中,首先需要将接收的表单信息强制转换成ActionForm类型,并将其做为QueryDAO类中stockQuery()方法的参数,然后调用stockQuery()方法查询符合条件的采购单信息,再将返回的查询结果保存到HttpServlet Request的对象getuse中。查询采购单概要信息的方法stockIf()的具体代码如下。

例程18-125:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

public ActionForward stockIf(ActionMapping mapping, ActionForm form,

                             HttpServletRequest request,HttpServletResponse response) {

    IfForm ifForm = (IfForm) form;

    String tablename = "StockMainViewForm";

    request.setAttribute("stockQueryM",queryDAO.stockQuery(ifForm, tablename, 3));

    return mapping.findForward("stockQuery");

}

3.编写查询采购单信息的QueryDAO类的方法

从上面的代码中可以知道查询采购单概要信息使用的QueryDAO类的方法是stockQuery(),该方法为通用查询的核心方法,通过该方法可以查询出符合条件的采购单信息。关于通用查询方法的详细介绍请参见18.13.4节。

4.struts-config.xml文件配置

在struts-config.xml文件中配置查询采购单概要信息所涉及的<forward>元素,代码如下:

<forward name="stockQuery" path="/stockQuery.jsp" />

接下来的工作是将stockIf()方法返回的查询结果显示在采购单查询页面stockQuery.jsp中。在stockQuery.jsp中首先通过request.getAttribute()方法获取查询结果并将其显示在相应的位置。

5.采购单详细信息查询

在采购单查询页面中单击“采购单号”超级链接,系统会访问一个URL地址,这个URL地址是“ifDeal.do?action=stockDetail”。从这个URL地址中可以知道采购单详细信息查询页面所涉及到的action的参数值为“stockDetail”,当action=stockDetail时,会调用查询采购单详细信息的方法stockDetail(),具体代码如下。

例程18-126:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

if (action.equals("stockDetail")) {

    return stockDetail(mapping, form, request, response);

}

在查询采购单详细信息的方法stockDetail()中,首先需要获取从页面中传递的参数id的值并赋值给int型变量id,然后调用GueryDAO类中的stockDetail()方法,并将变量id作为该方法的参数,查询出采购单的详细信息,再将返回的查询结果保存到HttpServletRequest的对象stockDetail中。查询采购单详细信息的方法stockDetail()的具体代码如下。

例程18-127:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

public ActionForward stockDetail(ActionMapping mapping, ActionForm form,

                                  HttpServletRequest request,HttpServletResponse response) {

    int id = Integer.parseInt(request.getParameter("id"));

    request.setAttribute("stockDetail", queryDAO.stockDetail(id));

    return mapping.findForward("stockDetail");

}

从上面的代码中可以知道查询采购单详细信息使用的QueryDAO类的方法是stockDetail(),在该方法中通过session的get()方法查询出指定采购单的详细信息,具体代码如下。

例程18-128:光盘\mr\18\MaterialManage\src\com\dao\QueryDAO.java

    public StockMainViewForm stockDetail(int id) {

        session = MySession.openSession();     //打开Session

        StockMainViewForm stockMVF = new StockMainViewForm();

        try {

            stockMVF = (StockMainViewForm) session.get(StockMainViewForm.class,id);

        } catch (Exception e) {

            System.out.println("查询采购单详细信息时出错:" + e.getMessage());

        } finally {

            MySession.closeSession(session);

        }

        return stockMVF;

    }

在struts-config.xml文件中配置查询采购单详细信息所涉及的<forward>元素,代码如下:

<forward name="stockDetail" path="/stockDetail.jsp" />

接下来的工作是将Action实现类中stockDetail()方法返回的查询结果显示在采购单详细页面stockDetail.jsp中。在stockDetail.jsp中通过request.getAttribute()方法获取查询结果并将其显示在相应的位置。

18.13.6  部门领用汇总设计

使用的数据表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider

用户登录后,选择“查询统计”→“部门领用汇总”菜单项,进入到部门领用汇总页面,在该页面中可以按指定的字段或某一时间段进行汇总,同时还可以实现按指定字段及时间段进行综合汇总。部门领用汇总页面的运行结果如图18.29所示。

图18.29  部门领用汇总页面运行结果

1.修改查询统计模块的Action实现类

在部门领用汇总页面中单击【统计】按钮,系统会访问一个URL地址,这个URL地址是“ifDeal.do?action=getuseTotal”。从这个URL地址中可以知道部门领用汇总所涉及到的action的参数值为“getuseTotal”,当action=getuseTotal时,会调用部门领用汇总查询的方法getuseTotal(),具体代码如下。

例程18-129:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

if (action.equals("getuseTotal")) {

    return getuseTotal(mapping, form, request, response);

}

在部门领用汇总查询的方法getuseTotal()中,首先需要将接收的表单信息强制转换成ActionForm类型,并将其做为QueryDAO类中getusedamageTotal()方法的参数,然后调用getusedamageTotal()方法汇总符合条件的部门领用信息,再将返回的统计结果保存到HttpServletRequest的对象getuseTotal中。部门领用汇总查询的方法getuseTotal()的具体代码如下。

例程18-130:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

public ActionForward getuseTotal(ActionMapping mapping, ActionForm form,

                             HttpServletRequest request,HttpServletResponse response) {

    IfForm ifForm = (IfForm) form;

    request.setAttribute("getuseTotal",queryDAO.getusedamageTotal(ifForm,"GetUseForm","number"));

    return mapping.findForward("getuseTotal");

}

2.编写汇总部门领用信息的QueryDAO类的方法

从上面的代码中可以知道汇总部门领用信息使用的QueryDAO类的方法是getusedamageTotal()。在该方法中首先调用组合查询条件字符串的方法ifCompose()将从前台表单接收的查询条件组合成条件字符串,然后通过HQL查询中的“使用聚合函数+分组查询+连接查询+WHERE条件”将部门领用信息按指定条件进行汇总,并将汇总结果保存到List集合list中,最后返回该list。汇总部门领用信息的方法getusedamageTotal()的具体代码如下。

例程18-131:光盘\mr\18\MaterialManage\src\com\dao\QueryDAO.java

public List getusedamageTotal(IfForm ifForm,String form,String cfield) {

    session = MySession.openSession(); //打开Session

    String str = ifCompose(ifForm);

    String sql="";

    List list = null;

    if (str == null) {

        sql = "select sum(form."+cfield+") as amount,b.name,g.name,g.spec,g.price,g.unit,g.producer "+

                 "FROM "+form+" form JOIN form.branch b JOIN form.goods g "+

                 "GROUP BY b.name,g.name,g.spec,g.price,g.unit,g.producer";

    } else {

        sql ="select sum(form."+cfield+") as amount,b.name,g.name,g.spec,g.price,g.unit,g.producer "+

                 "FROM "+form+" form JOIN form.branch b JOIN form.goods g WHERE "+str+" "+

                 "GROUP BY b.name,g.name,g.spec,g.price,g.unit,g.producer";

    }

    session = MySession.openSession(); //打开Session

    try {

        list = session.createQuery(sql).list();

    } catch (Exception e) {

        e.printStackTrace();

        System.out.println("查询时出现的错误信息:" + e.getMessage());

    } finally {

        MySession.closeSession(session); //关闭Session

    }

    return list;

}

说明:

(1)在使用“聚合函数+分组查询+连接查询”进行查询时,查询结果并不是一个持久化类的对象,而是包含各输出列的数组类型的对象,每个对象数组对应查询结果中的一条记录。

(2)部门报损汇总模块应用的也是QueryDAO类的getusedamageTotal()方法。

3.struts-config.xml文件配置

在struts-config.xml文件中配置汇总部门领用信息所涉及的<forward>元素,代码如下:

<forward name="getuseTotal" path="/getuseTotal.jsp" />

接下来的工作是将getusedamageTotal()方法返回的查询结果显示在部门领用汇总页面getuseTotal.jsp中。在getuseTotal.jsp中首先通过request.getAttribute()方法获取查询结果并将其显示在相应的位置,关键代码如下。

例程18-132:光盘\mr\18\MaterialManage\defaultroot\getuseTotal.jsp

<%

List list=(List)request.getAttribute("getuseTotal");

if(list.size()==0){

%>

<table width="98%" height="30"  border="0" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF">

<tr><td height="36" align="center">没有符合条件的部门领用信息!</td></tr>

</table>

<%}else{

    String goodsname="";

    String spec="";

    String producer="";

    String branchname="";

    String unit="";

    float price=0.0f;

    int amount=0;

  %>

<table width="98%"  border="1" cellpadding="0" cellspacing="0" bordercolor="#FFFFFF"

    bordercolordark="#D2E3E6" bordercolorlight="#FFFFFF">

  <tr align="center" bgcolor="#e3F4F7">

    <td width="17%">部门</td>

    <td width="25%">物资名称[规格]</td>

    ……   //此处省略了部门HTML代码

    <td width="11%">领用金额</td>

  </tr>

<%

for(int i=0;i<list.size();i++){

    Object obj[]=(Object[])list.get(i);

    amount=Integer.parseInt(obj[0].toString());

    branchname=obj[1].toString();

    goodsname=obj[2].toString();

    spec=obj[3].toString();

    price=Float.parseFloat(obj[4].toString());

    unit=obj[5].toString();

    producer=obj[6].toString();

%>

  <tr>

    <td style="padding:5px;"><%=branchname%></td>

    <td style="padding:5px;"><%=goodsname%>[<%=spec%>]</td>

    ……     //此处省略了部门HTML代码

    <td style="padding:5px;"><%=price*amount%></td>

  </tr>

<%}%>

</table>

<%}%>

18.13.7  部门汇总设计

使用的数据表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider

用户登录后,选择“查询统计”→“部门汇总”菜单项,进入到部门汇总页面,在该页面中可以对全部的部门领用、部门报损和部门在用物资名称进行汇总,也可以按指定的时间段进行汇总。部门汇总页面的运行结果如图18.30所示。

图18.30  部门汇总页面运行结果

1.修改查询统计模块的Action实现类

从系统主菜单中选择“查询统计”→“部门汇总”菜单项或在部门汇总页面中单击【统计】按钮,系统会访问一个URL地址,这个URL地址是“ifDeal.do?action=branchTotal”,从这个URL地址中可以知道部门汇总所涉及到的action的参数值为“branchTotal”,当action=branchTotal时,会调用部门汇总查询的方法branchTotal(),具体代码如下。

例程18-133:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

if (action.equals("branchTotal")) {

    return branchTotal(mapping, form, request, response);

}

在部门汇总查询的方法branchTotal()中,首先需要将接收的表单信息强制转换成ActionForm类型,并将其作为QueryDAO类中branchTotal()方法的参数,然后调用branchTotal()方法对部门领用、部门报损和部门在用信息进行汇总,再将返回的统计结果保存到HttpServletRequest的对象branchTotal中。部门汇总查询的方法branchTotal()的具体代码如下:

例程18-134:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

public ActionForward branchTotal(ActionMapping mapping, ActionForm form,

                                 HttpServletRequest request,

                                 HttpServletResponse response) {

    IfForm ifForm = (IfForm) form;

    request.setAttribute("sDate", ifForm.getSdate());

    request.setAttribute("eDate", ifForm.getEdate());

    request.setAttribute("branchTotal",queryDAO.branchTotal(ifForm));

    return mapping.findForward("branchTotal");

}

2.编写汇总部门信息的QueryDAO类的方法

从上面的代码中可以知道汇总部门信息使用的QueryDAO类的方法是branchTotal(),在该方法中首先调用组合查询条件字符串的方法ifCompose()将从前台表单接收的查询条件组合成条件字符串,然后通过HQL查询中的“使用聚合函数+分组查询+连接查询+WHERE条件”将部门领用信息按指定条件进行汇总,并将汇总结果保存到List集合list中,最后返回该list。汇总部门领用信息的方法getusedamageTotal()的具体代码如下。

例程18-135:光盘\mr\18\MaterialManage\src\com\action\IfDeal.java

public List branchTotal(IfForm ifForm) {

    session = MySession.openSession(); //打开Session

    String str = ifCompose(ifForm);

    List list = null;

    String sql="select  g.name,g.spec,g.unit,g.price,t.branchname,t.lyamount,t.bsamount,"+

    "(t.lyamount-t.bsamount) zyamount from tb_goods g inner join ( select goodsid,branchname,"+

    "sum(bsamount) bsamount,sum(lyamount) lyamount from(select getuse.goodsid,0 as bsamount,"+

    "sum(getuse.number) as lyamount,branch.name as branchname from tb_getuse getuse inner join  " +

    " tb_branch branch on getuse.branchid=branch.id group by branch.name,getuse.goodsid " +

    "union select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,"+

    "branch.name as branchname from tb_damage damage inner join  " +

    " tb_branch branch on damage.branchid=branch.id group by branch.name,damage.goodsid " +

    ") as t group by goodsid,branchname) as t on g.id=t.goodsid";

if (str != null) {

    sql="select g.name,g.spec,g.unit,g.price,t.branchname,t.lyamount,t.bsamount,"+

    "(t.lyamount-t.bsamount) zyamount from tb_goods g inner join ( "+

    "select goodsid,branchname,sum(bsamount) bsamount,sum(lyamount) lyamount from(" +

    "select getuse.goodsid,0 as bsamount,sum(getuse.number) as lyamount,branch.name as branchname"+

    " from tb_getuse getuse inner join tb_branch branch on getuse.branchid=branch.id and getuse."+str+

    "  group by branch.name,getuse.goodsid union " +

    "select damage.goodsid,sum(damage.damagenum) as bsamount,0 as lyamount,"+

    "branch.name as branchname from tb_damage damage inner join  " +

    " tb_branch branch on damage.branchid=branch.id and damage."+str+

    " group by branch.name,damage.goodsid ) as t group by goodsid,branchname) as t on g.id=t.goodsid";

}

try {

SQLQuery query = session.createSQLQuery(sql);

   list=query.list();

         for(int i=0;i<list.size();i++){

             System.out.println(list.get(i));

         }

    } catch (Exception e) {

        e.printStackTrace();

        System.out.println("查询时出现的错误信息:" + e.getMessage());

    } finally {

        MySession.closeSession(session); //关闭Session

    }

    return list;

}

说明:例程18-132中涉及的SQL语句的具体分析请参见18.15节。

3.struts-config.xml文件配置

在struts-config.xml文件中配置查询采购单概要信息所涉及的<forward>元素,代码如下:

<forward name="stockQuery" path="/stockQuery.jsp" />

接下来的工作是将Action实现类中branchTotal()方法返回的汇总结果显示在部门汇总页面branchTotal.jsp中。在branchTotal.jsp中通过request.getAttribute()方法获取汇总结果并将其显示在相应的位置。

posted on 2009-01-07 10:44 rogerfan 阅读(261) 评论(0)  编辑  收藏 所属分类: 【开源技术】

只有注册用户登录后才能发表评论。


网站导航: