• <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, 評論 - 9, 引用 - 0
            數(shù)據(jù)加載中……

            xTuple擴展開發(fā)部分介紹

            基于xTuple框架的擴展是在盡可能不修改xTuple核心代碼的前提下進行ui和腳本開發(fā)的。
             
            以下為開發(fā)步驟,將在以后空閑時間里逐步進行細節(jié)描述。
             
            一、需求分析
                略。
            二、數(shù)據(jù)庫設(shè)計
               
                序列
            對自動增加的唯一編號可以通過序列來實現(xiàn),這樣可以通過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è)計
             
                xTuple custom widget 之 xcombobox
            對于xcombobox控件,可以增加其他我們需要的類型
                1  在xcombobox.h里的XComboBoxTypes枚舉里增加我們要加的類型(如HousePayWays)
                2  在xcombobox.cpp里的XComboBox::init函數(shù)里增加代碼:
            insertEditor(HousePayWays, "housepayways", "MaintainPayWay");
                第二個參數(shù)為ui名稱:在xcombobox控件下拉里點擊編輯的時候要連接到的ui;
                第三個參數(shù)為權(quán)限名稱:需要在數(shù)據(jù)庫的數(shù)據(jù)表priv里存在,可以通過升級包增加此權(quán)限,也可以直接在數(shù)據(jù)庫里增加
                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;
            用來獲取數(shù)據(jù)庫信息數(shù)據(jù)。
                4  編譯xTuple,(不需要重新編譯)。
                5  重新打開Qt Designer,即可在xTuple Custom Controls里的xcombobox控件里找到我們之前加好的枚舉類型。
             
                xTuple custom widget 之cluster控件
            cluster控件是用戶自己定義的可以實現(xiàn)輸入下拉的一個控件,可以在一個輸入框后面出現(xiàn)搜素標志,并可以進行列表查找、增加等連接操作。
                1  創(chuàng)建一個.h和一個.cpp文件,根據(jù)需要自行決定是否創(chuàng)建ui文件(如housecluster.h, housecluster.cpp)。里面的代碼請自己增加,如有需要可參考已存在的itemcluster控件代碼。
                2  創(chuàng)建一個houseclusterplugin.h頭文件。(請注意命名:以housecluster+plugin),并填充代碼。
                3  在widgets.pro里增加這3個文件。(請手動添加,如果自動添加,有可能出現(xiàn)將代碼添加到dll.pro中。)
                4  修改widgets.cpp里增加頭文件引用#include "plugins/houseclusterplugin.h",并在構(gòu)造函數(shù)里增加代碼:
            m_plugins.append(new HouseClusterPlugin(this));
                5  編譯xTuple。(不需要全部重新編譯)
                6  重新打開Qt Designer,即可使用此新加的控件。
             
            四、腳本開發(fā)
             
                display設(shè)計
            display頁面在3.8以上的版本中可以完全用腳本實現(xiàn),以下描述僅限3.8以上的版本
                1  創(chuàng)建housepays-detail.mql,用來取出數(shù)據(jù)庫的數(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  在連接到此頁面的腳本里增加連接代碼(initMenu.js):
            houseExtension.housepaylistDisplay = function()
            {
                toolbox.newDisplay("housepays");
            }
                3  xTuple客戶端設(shè)計里加載腳本initMenu.js和housepays-detail.mql。
                4  重啟xTuple客戶端。運行即可。
            參考資料:www.xtuple.org/node/4596
             
                菜單設(shè)計
            簡單示例:
                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);
            請注意menuAddMenu和menuAddAction方法的使用。
            參考資料:http://www.xtuple.org/node/337
             
            五、其他
             
                腳本語言翻譯
                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對ts文件進行翻譯操作
                7  翻譯結(jié)束后執(zhí)行Qt Linguist的發(fā)布操作
                8  與原來的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ā)布
            升級包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ù)庫操作(在package節(jié)點下):
            <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 閱讀(600) 評論(0)  編輯 收藏 引用

            91超碰碰碰碰久久久久久综合| 免费国产99久久久香蕉| 青青草原综合久久大伊人| 伊人久久精品影院| 性欧美丰满熟妇XXXX性久久久| 精品少妇人妻av无码久久| 久久精品成人免费网站| 久久毛片免费看一区二区三区| 麻豆精品久久久久久久99蜜桃| 亚洲国产精品无码久久一线| 热99re久久国超精品首页| 欧美激情精品久久久久久久| 一本久久a久久精品vr综合| www.久久精品| 性高湖久久久久久久久AAAAA| 亚洲狠狠婷婷综合久久久久 | 亚洲精品乱码久久久久久久久久久久 | 三级韩国一区久久二区综合| 久久婷婷色综合一区二区| 九九99精品久久久久久| 无码精品久久一区二区三区 | 亚洲欧洲久久久精品| 国产成人精品白浆久久69| 无码8090精品久久一区| 99久久成人国产精品免费| 99久久综合国产精品免费| 日韩一区二区久久久久久| 99久久精品国产一区二区| 国产精品狼人久久久久影院| 日韩乱码人妻无码中文字幕久久 | 青青青青久久精品国产h| 亚洲国产欧洲综合997久久| 久久久久人妻一区精品| 97精品国产91久久久久久| 思思久久好好热精品国产| 91性高湖久久久久| 久久精品国产亚洲av水果派| 精品综合久久久久久97| 亚洲欧美国产精品专区久久 | 国产精品久久久久9999| 久久精品久久久久观看99水蜜桃|