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 閱讀(274) 評論(0)  編輯  收藏 所屬分類: 【開源技術】
          主站蜘蛛池模板: 宜城市| 琼结县| 固阳县| 福州市| 龙海市| 和静县| 泸定县| 潮州市| 苗栗市| 章丘市| 娄底市| 越西县| 台山市| 萨迦县| 墨脱县| 廉江市| 友谊县| 九台市| 稷山县| 英超| 雷波县| 石狮市| 鄂托克前旗| 襄垣县| 泸定县| 鹤峰县| 新巴尔虎左旗| 尚义县| 张家界市| 台东市| 陇川县| 无锡市| 新兴县| 鲜城| 大石桥市| 龙海市| 双辽市| 天镇县| 宝山区| 东莞市| 瑞昌市|