• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70, 文章 - 0, 評(píng)論 - 9, 引用 - 0
            數(shù)據(jù)加載中……

            xTuple擴(kuò)展開(kāi)發(fā)部分介紹

            基于xTuple框架的擴(kuò)展是在盡可能不修改xTuple核心代碼的前提下進(jìn)行ui和腳本開(kāi)發(fā)的。
             
            以下為開(kāi)發(fā)步驟,將在以后空閑時(shí)間里逐步進(jìn)行細(xì)節(jié)描述。
             
            一、需求分析
                略。
            二、數(shù)據(jù)庫(kù)設(shè)計(jì)
               
                序列
            對(duì)自動(dòng)增加的唯一編號(hào)可以通過(guò)序列來(lái)實(shí)現(xiàn),這樣可以通過(guò)postgresql提供的nextval獲取
            CREATE SEQUENCE house.payrecord_id_seq
              INCREMENT 1
              MINVALUE 1
              MAXVALUE 2147483647
              START 13
              CACHE 1;
            ALTER TABLE house.payrecord_id_seq OWNER TO postgres;
             
            三、ui設(shè)計(jì)
             
                xTuple custom widget 之 xcombobox
            對(duì)于xcombobox控件,可以增加其他我們需要的類型
                1  在xcombobox.h里的XComboBoxTypes枚舉里增加我們要加的類型(如HousePayWays)
                2  在xcombobox.cpp里的XComboBox::init函數(shù)里增加代碼:
            insertEditor(HousePayWays, "housepayways", "MaintainPayWay");
                第二個(gè)參數(shù)為ui名稱:在xcombobox控件下拉里點(diǎn)擊編輯的時(shí)候要連接到的ui;
                第三個(gè)參數(shù)為權(quán)限名稱:需要在數(shù)據(jù)庫(kù)的數(shù)據(jù)表priv里存在,可以通過(guò)升級(jí)包增加此權(quán)限,也可以直接在數(shù)據(jù)庫(kù)里增加
                3  在xcombobox.cpp里的XComboBox::setType函數(shù)里增加switch分支:
                case HousePayWays:
                    query.exec("select payway_id, (payway_name || '-' || payway_description), payway_name "
                            "from house.payway "
                            "order by payway_name");
                    break;
            用來(lái)獲取數(shù)據(jù)庫(kù)信息數(shù)據(jù)。
                4  編譯xTuple,(不需要重新編譯)。
                5  重新打開(kāi)Qt Designer,即可在xTuple Custom Controls里的xcombobox控件里找到我們之前加好的枚舉類型。
             
                xTuple custom widget 之cluster控件
            cluster控件是用戶自己定義的可以實(shí)現(xiàn)輸入下拉的一個(gè)控件,可以在一個(gè)輸入框后面出現(xiàn)搜素標(biāo)志,并可以進(jìn)行列表查找、增加等連接操作。
                1  創(chuàng)建一個(gè).h和一個(gè).cpp文件,根據(jù)需要自行決定是否創(chuàng)建ui文件(如housecluster.h, housecluster.cpp)。里面的代碼請(qǐng)自己增加,如有需要可參考已存在的itemcluster控件代碼。
                2  創(chuàng)建一個(gè)houseclusterplugin.h頭文件。(請(qǐng)注意命名:以housecluster+plugin),并填充代碼。
                3  在widgets.pro里增加這3個(gè)文件。(請(qǐng)手動(dòng)添加,如果自動(dòng)添加,有可能出現(xiàn)將代碼添加到dll.pro中。)
                4  修改widgets.cpp里增加頭文件引用#include "plugins/houseclusterplugin.h",并在構(gòu)造函數(shù)里增加代碼:
            m_plugins.append(new HouseClusterPlugin(this));
                5  編譯xTuple。(不需要全部重新編譯)
                6  重新打開(kāi)Qt Designer,即可使用此新加的控件。
             
            四、腳本開(kāi)發(fā)
             
                display設(shè)計(jì)
            display頁(yè)面在3.8以上的版本中可以完全用腳本實(shí)現(xiàn),以下描述僅限3.8以上的版本
                1  創(chuàng)建housepays-detail.mql,用來(lái)取出數(shù)據(jù)庫(kù)的數(shù)據(jù)和dispay里的filter、查詢等功能:
            -- Group: housepays
            -- Name:  detail
            -- Notes:
            select house.payrecord.*, house.item.item_number, house.custinfo.cust_name
            from house.payrecord, house.item, house.custinfo
            where house.payrecord.item_id = house.item.item_id
            and house.payrecord.cust_id = house.custinfo.cust_id

            -- This clause handles filtering if the user wants to search the list
            -- The ~* uses PostgreSQL built in support for Regular Expressions
            <? if exists("search_pattern") ?>
              AND house.item.item_number || house.custinfo.cust_name || house.payrecord.pay_price ~* <? value("search_pattern") ?>
            <? endif ?>
                2  在連接到此頁(yè)面的腳本里增加連接代碼(initMenu.js):
            houseExtension.housepaylistDisplay = function()
            {
                toolbox.newDisplay("housepays");
            }
                3  xTuple客戶端設(shè)計(jì)里加載腳本initMenu.js和housepays-detail.mql。
                4  重啟xTuple客戶端。運(yùn)行即可。
            參考資料:www.xtuple.org/node/4596
             
                菜單設(shè)計(jì)
            簡(jiǎn)單示例:
                var productsMenu = mainwindow.findChild("menu.prod");
                housecustomerMenu = toolbox.menuAddMenu(productsMenu, qsTr("Customer"));
                newhousecustomerAction = toolbox.menuAddAction(housecustomerMenu, qsTr("New Customer"));
                newhousecustomerAction.triggered.connect(houseExtension.newhousecustomer);
                housecustomersAction = toolbox.menuAddAction(housecustomerMenu, qsTr("Customer List"));
                housecustomersAction.triggered.connect(houseExtension.housecustomersDisplay);

                var tmpMenu = mainwindow.findChild("menu.prod.reports");
                toolbox.menuRemove(productsMenu, tmpMenu);
                tmpMenu = mainwindow.findChild("menu.prod.items");
                toolbox.menuRemove(productsMenu, tmpMenu);
            請(qǐng)注意menuAddMenu和menuAddAction方法的使用。
            參考資料:http://www.xtuple.org/node/337
             
            五、其他
             
                腳本語(yǔ)言翻譯
                1  創(chuàng)建test.pro工程文件
                2  加入.ui,.h,.cpp文件;加入.js文件
                3  降.js文件的類型改為SCOURCES
                4  增加TRANSLATIONS = test_zh.ts
                5  執(zhí)行l(wèi)update test.pro,生成test_zh.ts文件
                6  用Qt Linguist對(duì)ts文件進(jìn)行翻譯操作
                7  翻譯結(jié)束后執(zhí)行Qt Linguist的發(fā)布操作
                8  與原來(lái)的xTuple.zh_CN.qm整合:執(zhí)行l(wèi)release test_zh.qm xTuple.zh_CN.qm -qm xTuple.zh_CN.qm
                9  成功。將新的qm文件放入執(zhí)行目錄即可。
             
            六、更新包創(chuàng)建與發(fā)布
            升級(jí)包package.xml示例:
            <package id = "house"
                name = "housepackage"
                version = "1.0alpha"
                developer = "seahouse"
                descrip = "house rent system"
                updater = "2.2.4">
                <pkgnotes>
                    This package creates a house rent system though scripting.
                </pkgnotes>

                <prerequisite type = "license" name = "houseLicense">
                    <message>
                        &lt;This file is created by seahouse. Copyright @seahouse. seahouse QQ: 260822310, seahouse email: seahouse21@gmail.com.
                    </message>
                </prerequisite>

                <loadappui file = "uiforms/house.ui" />
                <loadappui file = "uiforms/houseClass.ui.ui" />
                <loadappui file = "uiforms/houseClasses.ui" />
                <loadappui file = "uiforms/housecustomer.ui" />
                <loadappui file = "uiforms/housepay.ui" />
                <loadappui file = "uiforms/housepayway.ui" />
                <loadappui file = "uiforms/housepayways.ui" />
                <loadappui file = "uiforms/houserent.ui" />

                <loadappscript file = "scripts/house.js" />
                <loadappscript file = "scripts/houseClass.js" />
                <loadappscript file = "scripts/houseClasses.js" />
                <loadappscript file = "scripts/housecustomer.js" />
                <loadappscript file = "scripts/housecustomers.js" />
                <loadappscript file = "scripts/houseitems.js" />
                <loadappscript file = "scripts/housepay.js" />
                <loadappscript file = "scripts/housepays.js" />
                <loadappscript file = "scripts/housepayway.js" />
                <loadappscript file = "scripts/housepayways.js" />
                <loadappscript file = "scripts/houserent.js" />
                <loadappscript file = "scripts/houserents.js" />
                <loadappscript file = "scripts/initMenu.js" />
                <loadappscript file = "scripts/user.js" />

                <loadmetasql file = "metasql/houseitems-detail.mql" />
                <loadmetasql file = "metasql/housepays-detail.mql" />
                <loadmetasql file = "metasql/houserents-detail.mql" />

                <loadpriv name = "MaintainHouseClasses" module = "Products">
                    Allawed to maintain house classes.
                </loadpriv>
                <loadpriv name = "MaintainHouseItem" module = "Products">
                    Allawed to maintain house item.
                </loadpriv>
                <loadpriv name = "MaintainPayWay" module = "Products">
                    Allawed to maintain house payway.
                </loadpriv>
            </package>
             
            其他數(shù)據(jù)庫(kù)操作(在package節(jié)點(diǎn)下):
            <loadreport file="client/reports/DisplayItemLocations.xml"           >sample_scripts package</loadreport>
            <createfunction file="database/functions/cashregadjust.sql"    name="cashregadjust" />
            <createtable file="database/tables/createTerminal.sql"        name="terminal" />
            <finalscript file="database/tables/createSalenumberseq.sql" />
            <createtrigger file="database/triggers/rtlsitestatuscheck.sql"     name="rtlsitestatuscheck" />
            <createview file="database/views/api_cashregister.sql"        name="api_cashregister" />
             
            參考:http://www.xtuple.org/CreateUpdaterPackages

            posted on 2011-12-24 10:58 seahouse 閱讀(606) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            国内精品九九久久久精品| 人妻精品久久久久中文字幕一冢本| 欧美久久综合性欧美| 久久综合九色综合网站| 热综合一本伊人久久精品| 久久亚洲国产欧洲精品一| 久久精品国产亚洲av水果派| 亚洲伊人久久成综合人影院| 亚洲日韩欧美一区久久久久我| 久久精品无码一区二区app| 国产日韩久久久精品影院首页 | 国产精品美女久久久免费| 久久综合亚洲欧美成人| 99re这里只有精品热久久| 久久er99热精品一区二区| 久久se精品一区精品二区| 日韩亚洲欧美久久久www综合网| 国产精品无码久久久久| 欧美成a人片免费看久久| 日韩亚洲国产综合久久久| 久久AV无码精品人妻糸列| 久久香蕉国产线看观看精品yw| 成人久久精品一区二区三区| 99久久精品国产综合一区| 久久亚洲视频| 久久99精品久久久久久久不卡| 日本精品久久久中文字幕| 热久久最新网站获取| 久久精品国产69国产精品亚洲| 久久综合久久久| 一本色综合久久| 97热久久免费频精品99| 欧美激情精品久久久久久| 亚洲综合精品香蕉久久网| 国产成人无码精品久久久久免费| 久久婷婷午色综合夜啪| 久久久久久久综合日本亚洲| 天堂无码久久综合东京热| 久久精品国产亚洲综合色| 国产精品亚洲综合久久| 国产国产成人久久精品|