<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

    ——?dú)g迎訪問(wèn)rogerfan的博客,常來(lái)《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗(yàn),分享JAVA帶來(lái)的快樂(lè)!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問(wèn)題請(qǐng)與我聯(lián)系。

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

    18.13  查詢統(tǒng)計(jì)模塊

    18.13.1  查詢統(tǒng)計(jì)模塊總體架構(gòu)

    查詢統(tǒng)計(jì)模塊主要包括以下功能。

      ●   采購(gòu)單查詢:用于根據(jù)不同的條件查詢采購(gòu)單信息。

      ●   入庫(kù)查詢:用于根據(jù)不同的條件查詢?nèi)霂?kù)單信息。

      ●   部門領(lǐng)用查詢:用于根據(jù)不同的條件查詢部門領(lǐng)用信息。

      ●   部門領(lǐng)用匯總:用于根據(jù)不同的條件對(duì)部門領(lǐng)用信息進(jìn)行匯總。

      ●   部門報(bào)損查詢:用于根據(jù)不同的條件查詢部門報(bào)損信息。

      ●   部門報(bào)損匯總:用于根據(jù)不同的條件對(duì)部門報(bào)損信息進(jìn)行匯總。

      ●   借出查詢:用于根據(jù)不同的條件查詢物資借出及歸還信息。

      ●   部門匯總:用于對(duì)全部或指定時(shí)間段內(nèi)部門領(lǐng)用及報(bào)損的物資信息進(jìn)行匯總。

    18.13.2  創(chuàng)建查詢統(tǒng)計(jì)模塊的ActionForm類

    為了方便操作,本系統(tǒng)中定義了一個(gè)用于獲取頁(yè)面中傳遞的查詢條件值的ActionForm類,將其命名為IfForm,并保存在com.actionForm包中,關(guān)鍵代碼如下。

    例程18-118:光盤(pán)\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  創(chuàng)建查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類

    查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類繼承了Action類,在該類中首先需要在構(gòu)造方法中實(shí)例化查詢統(tǒng)計(jì)模塊的QueryDAO類(該類用于實(shí)現(xiàn)業(yè)務(wù)邏輯操作),然后通過(guò)Action實(shí)現(xiàn)類的主要方法execute()執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作。Action實(shí)現(xiàn)類的execute()方法會(huì)被自動(dòng)執(zhí)行,這個(gè)方法本身沒(méi)有具體的事務(wù),它是根據(jù)HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。

    查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類的關(guān)鍵代碼如下。

    例程18-119:光盤(pán)\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")) {     //采購(gòu)單查詢

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

            } else if (action.equals("stockDetail")) {     //采購(gòu)單詳細(xì)信息查詢

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

            } else if (action.equals("inStockQuery")) {     //“入庫(kù)審核”時(shí)調(diào)用的查詢

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

            } else if (action.equals("inStorageSQuery")) {     //“入庫(kù)查詢”時(shí)調(diào)用的查詢

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

            } else if (action.equals("loanApproveQuery")) {     //“借出審核”時(shí)調(diào)用的查詢

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

            } else if (action.equals("loanBackQuery")) {     //“借出歸還”時(shí)調(diào)用的查詢

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

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

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

            } else if (action.equals("loanDetail")) {     //借出詳細(xì)信息查詢

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

            } else if (action.equals("damageQuery")) {     //部門報(bào)損查詢

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

            } else if (action.equals("getuseQuery")) {     //部門領(lǐng)用查詢

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

            } else if (action.equals("getuseTotal")) {     //部門領(lǐng)用匯總查詢

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

            } else if (action.equals("damageTotal")) {     //部門報(bào)損匯總查詢

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

            } else if (action.equals("branchTotal")) {     //部門匯總查詢

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

            } else {

                return mapping.findForward("error");

            }

        }

        ……  //此處省略了該類中其他方法,這些方法將在后面的具體過(guò)程中給出

    }

    18.13.4  在QueryDAO類中創(chuàng)建通用查詢的方法

    在物資管理系統(tǒng)中多處涉及到數(shù)據(jù)查詢,為了精簡(jiǎn)程序代碼,可以將系統(tǒng)中多次使用的查詢方法制作成為通用查詢方法,這樣在程序中只需要傳遞相應(yīng)的參數(shù)就可以完成不同數(shù)據(jù)的查詢。

    在查詢統(tǒng)計(jì)模塊的業(yè)務(wù)邏輯類QueryDAO中創(chuàng)建通用查詢的方法需要通過(guò)3個(gè)方法實(shí)現(xiàn),下面分別介紹。

    1.根據(jù)傳遞的參數(shù)組合單個(gè)條件的方法

    編寫(xiě)根據(jù)傳遞的參數(shù)組合單個(gè)條件的方法,名稱為oneIf(),該方法包括兩個(gè)參數(shù),一個(gè)是IfForm類型的ifForm,用于指定查詢條件的ActionForm類,另一個(gè)是String類型的flagv,用于指定查詢方式。在該方法中根據(jù)ifForm和flagv的值組合單個(gè)查詢條件的條件字符串,并返回該字符串,具體代碼如下。

    例程18-120:光盤(pán)\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)) { //按狀態(tài)查詢

            int state = ifForm.getState();

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

        }

        return str;

    }

    2.組合查詢條件字符串的方法

    編寫(xiě)組合查詢條件字符串的方法,名稱為ifCompose(),該方法只有一個(gè)IfForm類型的參數(shù)ifForm,用于指定查詢條件的ActionForm類。在該方法中將通過(guò)循環(huán)調(diào)用例程18-120所介紹的oneIf()方法將多個(gè)查詢條件組合成一個(gè)字符串,并返回該字符串,具體代碼如下。

    例程18-121:光盤(pán)\mr\18\MaterialManage\src\com\dao\QueryDAO.java

    public String ifCompose(IfForm ifForm) {

        String str = null;

        String flag[] = ifForm.getFlag(); //定義一個(gè)字符型數(shù)組,獲取表單中復(fù)選框提交的數(shù)據(jù)

        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.通用查詢的核心方法

    編寫(xiě)通用查詢的核心方法,名稱為stockQuery(),該方法包括3個(gè)參數(shù),分別是IfForm類型的ifForm(用于指定查詢條件的ActionForm類)、String類型的tablename(用于指定查詢數(shù)據(jù)表對(duì)應(yīng)的持久化類名稱)和int類型的state(用于指定查詢狀態(tài),為3時(shí)代表查詢?nèi)繑?shù)據(jù),其他值根據(jù)相應(yīng)數(shù)據(jù)表決定)。stockQuery()方法的具體實(shí)現(xiàn)過(guò)程如下。

    (1)調(diào)用ifCompose()方法將傳遞的查詢條件組合成一個(gè)查詢條件字符串賦值給String類型的變量str。

    (2)根據(jù)傳遞的參數(shù)和變量str的值組合HQL語(yǔ)句。

    (3)執(zhí)行HQL語(yǔ)句并將查詢結(jié)果保存到List集合中。

    查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類的關(guān)鍵代碼如下。

    例程18-122:光盤(pán)\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時(shí)代表查詢?nèi)繑?shù)據(jù)

                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(); //打開(kāi)Session

        try {

            Query query = session.createQuery(hql);

            list = query.list();

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("查詢時(shí)出現(xiàn)的錯(cuò)誤信息:" + e.getMessage());

        } finally {

            MySession.closeSession(session); //關(guān)閉Session

        }

        return list;

    }

    說(shuō)明:在采購(gòu)單查詢、入庫(kù)查詢、入庫(kù)審核、借出查詢、借出歸還和借出審核頁(yè)面中都會(huì)用到QueryDAO類的stockQuery()方法。

    18.13.5  采購(gòu)單查詢?cè)O(shè)計(jì)

    使用的數(shù)據(jù)表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider

    用戶登錄后,選擇“查詢統(tǒng)計(jì)”→“采購(gòu)單查詢”菜單項(xiàng),進(jìn)入到采購(gòu)單查詢頁(yè)面,在該頁(yè)面中可以按指定的字段或某一時(shí)間段進(jìn)行查詢,同時(shí)還可以實(shí)現(xiàn)按指定字段及時(shí)間段進(jìn)行綜合查詢。采購(gòu)單查詢頁(yè)面的運(yùn)行結(jié)果如圖18.28所示。

    圖18.28  采購(gòu)單查詢頁(yè)面運(yùn)行結(jié)果

    1.設(shè)計(jì)采購(gòu)單查詢頁(yè)面

    采購(gòu)單查詢頁(yè)面主要用于收集查詢條件和顯示查詢結(jié)果,并通過(guò)自定義的JavaScript函數(shù)驗(yàn)證輸入的查詢條件是否合法,該頁(yè)面中所涉及到的表單元素如表18.22所示。

    表18.22                                        采購(gòu)單查詢頁(yè)面所涉及的表單元素

    名    稱

    元 素 類 型

    重 要 屬 性

    含    義

    myform

    form

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

    表單

    flag

    checkbox

    value="a" checked

    請(qǐng)選擇查詢依據(jù)

    flag

    checkbox

    value="b"

    采購(gòu)時(shí)間

    flag

    checkbox

    value="c"

    狀態(tài)

    f

    select

    <option value="sno" selected>采購(gòu)單號(hào)</option>

    <option value="provider">供應(yīng)商名稱</option>

    <option value="principal">負(fù)責(zé)人</option>

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

    查詢字段

    key

    text

    size="50"

    關(guān)鍵字

    sdate

    text

    開(kāi)始日期

    edate

    text

    結(jié)束日期

    state

    radio

    value="0" checked

    未審核

    state

    radio

    value="1"

    已入庫(kù)

    state

    radio

    value="2"

    不合格

    Submit

    submit

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

    【查詢】按鈕

    編寫(xiě)自定義的JavaScript函數(shù)check(),用于判斷是否選擇了查詢方式及當(dāng)選擇按時(shí)間段進(jìn)行查詢時(shí),判斷輸入的日期是否合法,代碼如下。

    例程18-123:光盤(pán)\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("請(qǐng)選擇查詢方式!");return false;

        }

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

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

                alert("請(qǐng)輸入開(kāi)始日期");myform.sdate.focus();return false;

            }

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

                alert("您輸入的結(jié)束日期不正確(如:2006-07-05)\n 請(qǐng)注意日期格式或閏年!"); myform. sdate.focus();return false;

            }

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

                alert("請(qǐng)輸入結(jié)束日期");myform.edate.focus();return false;

            }

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

                alert("您輸入的結(jié)束日期不正確!\n 請(qǐng)注意日期格式或閏年!");myform.edate.focus(); return false;

            }

        }

    }

    </script>

    2.修改查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類

    在采購(gòu)單查詢頁(yè)面中單擊【查詢】按鈕,系統(tǒng)會(huì)訪問(wèn)一個(gè)URL地址,這個(gè)URL地址是“ifDeal.do?action=stockQuery”。從這個(gè)URL地址中可以知道采購(gòu)單查詢頁(yè)面所涉及到的action的參數(shù)值為“stockQuery”,當(dāng)action=stockQuery時(shí),會(huì)調(diào)用查詢采購(gòu)單概要信息的方法stockIf(),具體代碼如下。

    例程18-124:光盤(pán)\mr\18\MaterialManage\src\com\action\IfDeal.java

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

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

    }

    在查詢采購(gòu)單概要信息的方法stockIf()中,首先需要將接收的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,并將其做為QueryDAO類中stockQuery()方法的參數(shù),然后調(diào)用stockQuery()方法查詢符合條件的采購(gòu)單信息,再將返回的查詢結(jié)果保存到HttpServlet Request的對(duì)象getuse中。查詢采購(gòu)單概要信息的方法stockIf()的具體代碼如下。

    例程18-125:光盤(pán)\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.編寫(xiě)查詢采購(gòu)單信息的QueryDAO類的方法

    從上面的代碼中可以知道查詢采購(gòu)單概要信息使用的QueryDAO類的方法是stockQuery(),該方法為通用查詢的核心方法,通過(guò)該方法可以查詢出符合條件的采購(gòu)單信息。關(guān)于通用查詢方法的詳細(xì)介紹請(qǐng)參見(jiàn)18.13.4節(jié)。

    4.struts-config.xml文件配置

    在struts-config.xml文件中配置查詢采購(gòu)單概要信息所涉及的<forward>元素,代碼如下:

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

    接下來(lái)的工作是將stockIf()方法返回的查詢結(jié)果顯示在采購(gòu)單查詢頁(yè)面stockQuery.jsp中。在stockQuery.jsp中首先通過(guò)request.getAttribute()方法獲取查詢結(jié)果并將其顯示在相應(yīng)的位置。

    5.采購(gòu)單詳細(xì)信息查詢

    在采購(gòu)單查詢頁(yè)面中單擊“采購(gòu)單號(hào)”超級(jí)鏈接,系統(tǒng)會(huì)訪問(wèn)一個(gè)URL地址,這個(gè)URL地址是“ifDeal.do?action=stockDetail”。從這個(gè)URL地址中可以知道采購(gòu)單詳細(xì)信息查詢頁(yè)面所涉及到的action的參數(shù)值為“stockDetail”,當(dāng)action=stockDetail時(shí),會(huì)調(diào)用查詢采購(gòu)單詳細(xì)信息的方法stockDetail(),具體代碼如下。

    例程18-126:光盤(pán)\mr\18\MaterialManage\src\com\action\IfDeal.java

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

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

    }

    在查詢采購(gòu)單詳細(xì)信息的方法stockDetail()中,首先需要獲取從頁(yè)面中傳遞的參數(shù)id的值并賦值給int型變量id,然后調(diào)用GueryDAO類中的stockDetail()方法,并將變量id作為該方法的參數(shù),查詢出采購(gòu)單的詳細(xì)信息,再將返回的查詢結(jié)果保存到HttpServletRequest的對(duì)象stockDetail中。查詢采購(gòu)單詳細(xì)信息的方法stockDetail()的具體代碼如下。

    例程18-127:光盤(pán)\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");

    }

    從上面的代碼中可以知道查詢采購(gòu)單詳細(xì)信息使用的QueryDAO類的方法是stockDetail(),在該方法中通過(guò)session的get()方法查詢出指定采購(gòu)單的詳細(xì)信息,具體代碼如下。

    例程18-128:光盤(pán)\mr\18\MaterialManage\src\com\dao\QueryDAO.java

        public StockMainViewForm stockDetail(int id) {

            session = MySession.openSession();     //打開(kāi)Session

            StockMainViewForm stockMVF = new StockMainViewForm();

            try {

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

            } catch (Exception e) {

                System.out.println("查詢采購(gòu)單詳細(xì)信息時(shí)出錯(cuò):" + e.getMessage());

            } finally {

                MySession.closeSession(session);

            }

            return stockMVF;

        }

    在struts-config.xml文件中配置查詢采購(gòu)單詳細(xì)信息所涉及的<forward>元素,代碼如下:

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

    接下來(lái)的工作是將Action實(shí)現(xiàn)類中stockDetail()方法返回的查詢結(jié)果顯示在采購(gòu)單詳細(xì)頁(yè)面stockDetail.jsp中。在stockDetail.jsp中通過(guò)request.getAttribute()方法獲取查詢結(jié)果并將其顯示在相應(yīng)的位置。

    18.13.6  部門領(lǐng)用匯總設(shè)計(jì)

    使用的數(shù)據(jù)表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider

    用戶登錄后,選擇“查詢統(tǒng)計(jì)”→“部門領(lǐng)用匯總”菜單項(xiàng),進(jìn)入到部門領(lǐng)用匯總頁(yè)面,在該頁(yè)面中可以按指定的字段或某一時(shí)間段進(jìn)行匯總,同時(shí)還可以實(shí)現(xiàn)按指定字段及時(shí)間段進(jìn)行綜合匯總。部門領(lǐng)用匯總頁(yè)面的運(yùn)行結(jié)果如圖18.29所示。

    圖18.29  部門領(lǐng)用匯總頁(yè)面運(yùn)行結(jié)果

    1.修改查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類

    在部門領(lǐng)用匯總頁(yè)面中單擊【統(tǒng)計(jì)】按鈕,系統(tǒng)會(huì)訪問(wèn)一個(gè)URL地址,這個(gè)URL地址是“ifDeal.do?action=getuseTotal”。從這個(gè)URL地址中可以知道部門領(lǐng)用匯總所涉及到的action的參數(shù)值為“getuseTotal”,當(dāng)action=getuseTotal時(shí),會(huì)調(diào)用部門領(lǐng)用匯總查詢的方法getuseTotal(),具體代碼如下。

    例程18-129:光盤(pán)\mr\18\MaterialManage\src\com\action\IfDeal.java

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

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

    }

    在部門領(lǐng)用匯總查詢的方法getuseTotal()中,首先需要將接收的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,并將其做為QueryDAO類中g(shù)etusedamageTotal()方法的參數(shù),然后調(diào)用getusedamageTotal()方法匯總符合條件的部門領(lǐng)用信息,再將返回的統(tǒng)計(jì)結(jié)果保存到HttpServletRequest的對(duì)象getuseTotal中。部門領(lǐng)用匯總查詢的方法getuseTotal()的具體代碼如下。

    例程18-130:光盤(pán)\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.編寫(xiě)匯總部門領(lǐng)用信息的QueryDAO類的方法

    從上面的代碼中可以知道匯總部門領(lǐng)用信息使用的QueryDAO類的方法是getusedamageTotal()。在該方法中首先調(diào)用組合查詢條件字符串的方法ifCompose()將從前臺(tái)表單接收的查詢條件組合成條件字符串,然后通過(guò)HQL查詢中的“使用聚合函數(shù)+分組查詢+連接查詢+WHERE條件”將部門領(lǐng)用信息按指定條件進(jìn)行匯總,并將匯總結(jié)果保存到List集合list中,最后返回該list。匯總部門領(lǐng)用信息的方法getusedamageTotal()的具體代碼如下。

    例程18-131:光盤(pán)\mr\18\MaterialManage\src\com\dao\QueryDAO.java

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

        session = MySession.openSession(); //打開(kāi)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(); //打開(kāi)Session

        try {

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

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("查詢時(shí)出現(xiàn)的錯(cuò)誤信息:" + e.getMessage());

        } finally {

            MySession.closeSession(session); //關(guān)閉Session

        }

        return list;

    }

    說(shuō)明:

    (1)在使用“聚合函數(shù)+分組查詢+連接查詢”進(jìn)行查詢時(shí),查詢結(jié)果并不是一個(gè)持久化類的對(duì)象,而是包含各輸出列的數(shù)組類型的對(duì)象,每個(gè)對(duì)象數(shù)組對(duì)應(yīng)查詢結(jié)果中的一條記錄。

    (2)部門報(bào)損匯總模塊應(yīng)用的也是QueryDAO類的getusedamageTotal()方法。

    3.struts-config.xml文件配置

    在struts-config.xml文件中配置匯總部門領(lǐng)用信息所涉及的<forward>元素,代碼如下:

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

    接下來(lái)的工作是將getusedamageTotal()方法返回的查詢結(jié)果顯示在部門領(lǐng)用匯總頁(yè)面getuseTotal.jsp中。在getuseTotal.jsp中首先通過(guò)request.getAttribute()方法獲取查詢結(jié)果并將其顯示在相應(yīng)的位置,關(guān)鍵代碼如下。

    例程18-132:光盤(pán)\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">沒(méi)有符合條件的部門領(lǐng)用信息!</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%">物資名稱[規(guī)格]</td>

        ……   //此處省略了部門HTML代碼

        <td width="11%">領(lǐng)用金額</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  部門匯總設(shè)計(jì)

    使用的數(shù)據(jù)表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider

    用戶登錄后,選擇“查詢統(tǒng)計(jì)”→“部門匯總”菜單項(xiàng),進(jìn)入到部門匯總頁(yè)面,在該頁(yè)面中可以對(duì)全部的部門領(lǐng)用、部門報(bào)損和部門在用物資名稱進(jìn)行匯總,也可以按指定的時(shí)間段進(jìn)行匯總。部門匯總頁(yè)面的運(yùn)行結(jié)果如圖18.30所示。

    圖18.30  部門匯總頁(yè)面運(yùn)行結(jié)果

    1.修改查詢統(tǒng)計(jì)模塊的Action實(shí)現(xiàn)類

    從系統(tǒng)主菜單中選擇“查詢統(tǒng)計(jì)”→“部門匯總”菜單項(xiàng)或在部門匯總頁(yè)面中單擊【統(tǒng)計(jì)】按鈕,系統(tǒng)會(huì)訪問(wèn)一個(gè)URL地址,這個(gè)URL地址是“ifDeal.do?action=branchTotal”,從這個(gè)URL地址中可以知道部門匯總所涉及到的action的參數(shù)值為“branchTotal”,當(dāng)action=branchTotal時(shí),會(huì)調(diào)用部門匯總查詢的方法branchTotal(),具體代碼如下。

    例程18-133:光盤(pán)\mr\18\MaterialManage\src\com\action\IfDeal.java

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

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

    }

    在部門匯總查詢的方法branchTotal()中,首先需要將接收的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,并將其作為QueryDAO類中branchTotal()方法的參數(shù),然后調(diào)用branchTotal()方法對(duì)部門領(lǐng)用、部門報(bào)損和部門在用信息進(jìn)行匯總,再將返回的統(tǒng)計(jì)結(jié)果保存到HttpServletRequest的對(duì)象branchTotal中。部門匯總查詢的方法branchTotal()的具體代碼如下:

    例程18-134:光盤(pán)\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.編寫(xiě)匯總部門信息的QueryDAO類的方法

    從上面的代碼中可以知道匯總部門信息使用的QueryDAO類的方法是branchTotal(),在該方法中首先調(diào)用組合查詢條件字符串的方法ifCompose()將從前臺(tái)表單接收的查詢條件組合成條件字符串,然后通過(guò)HQL查詢中的“使用聚合函數(shù)+分組查詢+連接查詢+WHERE條件”將部門領(lǐng)用信息按指定條件進(jìn)行匯總,并將匯總結(jié)果保存到List集合list中,最后返回該list。匯總部門領(lǐng)用信息的方法getusedamageTotal()的具體代碼如下。

    例程18-135:光盤(pán)\mr\18\MaterialManage\src\com\action\IfDeal.java

    public List branchTotal(IfForm ifForm) {

        session = MySession.openSession(); //打開(kāi)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("查詢時(shí)出現(xiàn)的錯(cuò)誤信息:" + e.getMessage());

        } finally {

            MySession.closeSession(session); //關(guān)閉Session

        }

        return list;

    }

    說(shuō)明:例程18-132中涉及的SQL語(yǔ)句的具體分析請(qǐng)參見(jiàn)18.15節(jié)。

    3.struts-config.xml文件配置

    在struts-config.xml文件中配置查詢采購(gòu)單概要信息所涉及的<forward>元素,代碼如下:

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

    接下來(lái)的工作是將Action實(shí)現(xiàn)類中branchTotal()方法返回的匯總結(jié)果顯示在部門匯總頁(yè)面branchTotal.jsp中。在branchTotal.jsp中通過(guò)request.getAttribute()方法獲取匯總結(jié)果并將其顯示在相應(yīng)的位置。

    posted on 2009-01-07 10:44 rogerfan 閱讀(271) 評(píng)論(0)  編輯  收藏 所屬分類: 【開(kāi)源技術(shù)】
    主站蜘蛛池模板: 国产极品粉嫩泬免费观看 | 免费看香港一级毛片| 国产亚洲精品无码专区| 亚洲熟女www一区二区三区| 久久国产精品免费专区| 亚洲第一页日韩专区| 亚洲六月丁香婷婷综合| 免费人成黄页在线观看日本| 免费人妻无码不卡中文字幕18禁| 亚洲免费中文字幕| 日本一道本不卡免费| 亚洲免费日韩无码系列 | 国产精品亚洲av色欲三区| 曰批视频免费40分钟试看天天| 国产成A人亚洲精V品无码| 日日狠狠久久偷偷色综合免费| 在线免费观看毛片网站| 亚洲午夜电影在线观看高清 | 亚洲一卡2卡3卡4卡乱码 在线 | 亚洲高清国产拍精品青青草原| 亚洲综合av一区二区三区不卡| 国产精品视频免费| 亚洲成a人片77777老司机| 国产精品无码免费专区午夜 | 亚洲国产a∨无码中文777| 未满十八私人高清免费影院| 国产男女猛烈无遮挡免费网站| 亚洲一区二区观看播放| 国产免费看JIZZ视频| 亚洲精品在线免费观看| 色猫咪免费人成网站在线观看| 亚洲VA中文字幕无码一二三区 | 免费人妻精品一区二区三区| 午夜免费福利在线| 亚洲色偷偷色噜噜狠狠99| 无限动漫网在线观看免费| 亚洲伊人久久大香线蕉结合| 国产又大又粗又长免费视频| 亚洲性猛交xx乱| 免费大片黄在线观看yw| 亚洲午夜国产精品无卡|