青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 70, 文章 - 0, 評論 - 9, 引用 - 0
數據加載中……

xTuple擴展開發部分介紹

基于xTuple框架的擴展是在盡可能不修改xTuple核心代碼的前提下進行ui和腳本開發的。
 
以下為開發步驟,將在以后空閑時間里逐步進行細節描述。
 
一、需求分析
    略。
二、數據庫設計
   
    序列
對自動增加的唯一編號可以通過序列來實現,這樣可以通過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設計
 
    xTuple custom widget 之 xcombobox
對于xcombobox控件,可以增加其他我們需要的類型
    1  在xcombobox.h里的XComboBoxTypes枚舉里增加我們要加的類型(如HousePayWays)
    2  在xcombobox.cpp里的XComboBox::init函數里增加代碼:
insertEditor(HousePayWays, "housepayways", "MaintainPayWay");
    第二個參數為ui名稱:在xcombobox控件下拉里點擊編輯的時候要連接到的ui;
    第三個參數為權限名稱:需要在數據庫的數據表priv里存在,可以通過升級包增加此權限,也可以直接在數據庫里增加
    3  在xcombobox.cpp里的XComboBox::setType函數里增加switch分支:
    case HousePayWays:
        query.exec("select payway_id, (payway_name || '-' || payway_description), payway_name "
                "from house.payway "
                "order by payway_name");
        break;
用來獲取數據庫信息數據。
    4  編譯xTuple,(不需要重新編譯)。
    5  重新打開Qt Designer,即可在xTuple Custom Controls里的xcombobox控件里找到我們之前加好的枚舉類型。
 
    xTuple custom widget 之cluster控件
cluster控件是用戶自己定義的可以實現輸入下拉的一個控件,可以在一個輸入框后面出現搜素標志,并可以進行列表查找、增加等連接操作。
    1  創建一個.h和一個.cpp文件,根據需要自行決定是否創建ui文件(如housecluster.h, housecluster.cpp)。里面的代碼請自己增加,如有需要可參考已存在的itemcluster控件代碼。
    2  創建一個houseclusterplugin.h頭文件。(請注意命名:以housecluster+plugin),并填充代碼。
    3  在widgets.pro里增加這3個文件。(請手動添加,如果自動添加,有可能出現將代碼添加到dll.pro中。)
    4  修改widgets.cpp里增加頭文件引用#include "plugins/houseclusterplugin.h",并在構造函數里增加代碼:
m_plugins.append(new HouseClusterPlugin(this));
    5  編譯xTuple。(不需要全部重新編譯)
    6  重新打開Qt Designer,即可使用此新加的控件。
 
四、腳本開發
 
    display設計
display頁面在3.8以上的版本中可以完全用腳本實現,以下描述僅限3.8以上的版本
    1  創建housepays-detail.mql,用來取出數據庫的數據和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客戶端設計里加載腳本initMenu.js和housepays-detail.mql。
    4  重啟xTuple客戶端。運行即可。
參考資料:www.xtuple.org/node/4596
 
    菜單設計
簡單示例:
    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  創建test.pro工程文件
    2  加入.ui,.h,.cpp文件;加入.js文件
    3  降.js文件的類型改為SCOURCES
    4  增加TRANSLATIONS = test_zh.ts
    5  執行lupdate test.pro,生成test_zh.ts文件
    6  用Qt Linguist對ts文件進行翻譯操作
    7  翻譯結束后執行Qt Linguist的發布操作
    8  與原來的xTuple.zh_CN.qm整合:執行lrelease test_zh.qm xTuple.zh_CN.qm -qm xTuple.zh_CN.qm
    9  成功。將新的qm文件放入執行目錄即可。
 
六、更新包創建與發布
升級包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>
 
其他數據庫操作(在package節點下):
<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 閱讀(625) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产一区二区三区a毛片| 亚洲乱码久久| 亚洲男人的天堂在线观看| 亚洲国产成人精品女人久久久 | 99riav1国产精品视频| 免费亚洲视频| 久久网站热最新地址| 1000部国产精品成人观看| 久久躁日日躁aaaaxxxx| 久久久久九九视频| 亚洲欧洲一区二区三区久久| 欧美成人免费一级人片100| 嫩草影视亚洲| 一区二区三区欧美| 亚洲午夜精品| 国产在线精品二区| 欧美大胆成人| 欧美日韩小视频| 欧美一区二区三区免费观看| 久久九九全国免费精品观看| 91久久国产综合久久| 99av国产精品欲麻豆| 国产日韩在线视频| 欧美高清一区| 国产精品美女久久久久av超清| 欧美一区二区成人| 久久综合九色99| 亚洲一区日韩| 久久国产精彩视频| 99re66热这里只有精品3直播| 亚洲无毛电影| 亚洲国产精品久久久久秋霞不卡 | 欧美综合77777色婷婷| 久久婷婷国产麻豆91天堂| 亚洲视频网站在线观看| 久久成人亚洲| 亚洲女爱视频在线| 久久在线免费视频| 一区二区三区毛片| 亚洲欧美另类国产| 欧美经典一区二区三区| 久久精品成人一区二区三区| 久久综合久久综合久久| 中日韩男男gay无套| 欧美一区二区视频在线观看2020| **欧美日韩vr在线| 这里只有精品视频在线| 精品成人久久| 亚洲天堂第二页| 亚洲国产一区二区三区a毛片| 一区二区三区欧美在线观看| 好吊一区二区三区| 亚洲国产导航| 亚洲高清在线播放| 亚洲欧美一区二区原创| 亚洲视频在线播放| 久久久久久久一区二区| 久久不见久久见免费视频1| 欧美成人黑人xx视频免费观看| 久久久夜精品| 国产精品美女999| 日韩一区二区精品视频| 亚洲精品123区| 久久免费视频在线观看| 午夜精品影院| 国产精品免费在线| 亚洲免费av电影| 9l国产精品久久久久麻豆| 久久资源在线| 欧美成人午夜激情| 国内精品视频在线观看| 亚洲欧美精品一区| 亚洲先锋成人| 欧美日韩在线不卡| 亚洲理论在线| 国产一区二区三区的电影| 最新日韩在线| 亚洲国产精品成人va在线观看| 久久精品亚洲乱码伦伦中文 | 国产手机视频一区二区| 在线亚洲电影| 亚洲午夜久久久久久久久电影院| 美日韩精品免费观看视频| 六月天综合网| 亚洲电影在线免费观看| 亚洲天堂偷拍| 一区二区三区.www| 欧美日韩精品综合| 一区二区三区视频在线| 亚洲视频导航| 国产精品高潮呻吟久久av黑人| 最新日韩在线| 亚洲一区视频在线| 国产精品一区二区在线观看| 亚洲综合国产精品| 欧美一区二区三区四区视频| 国产精品自拍三区| 久久激情五月丁香伊人| 欧美xart系列高清| 国产在线欧美日韩| 老司机午夜精品视频| 亚洲激情av| 亚洲色无码播放| 国产精品入口日韩视频大尺度| 亚洲欧美国产制服动漫| 久久久精品动漫| 国产综合18久久久久久| 欧美高清视频在线播放| 亚洲一区二区三区涩| 久久久www成人免费精品| 在线观看日韩一区| 欧美精品九九| 亚洲免费在线播放| 免费成人av在线| 在线一区视频| 国精产品99永久一区一区| 欧美极品一区| 午夜亚洲精品| 亚洲经典在线| 9久re热视频在线精品| 欧美午夜片在线观看| 欧美中文字幕视频在线观看| 欧美激情一区二区三区在线视频 | 久久精品在这里| 欧美粗暴jizz性欧美20| 欧美在线看片| 99re热精品| 激情五月综合色婷婷一区二区| 欧美黄色一区| 欧美在线视频观看| 亚洲日本中文字幕| 久久久亚洲影院你懂的| 国产精品99久久久久久宅男| 亚洲国产天堂久久综合网| 国产欧美va欧美不卡在线| 欧美激情aⅴ一区二区三区| 欧美亚洲三级| 99re热这里只有精品免费视频| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲国产精品综合| 国产老女人精品毛片久久| 免费成人高清视频| 一本大道久久精品懂色aⅴ| 欧美黄色免费| 久久在精品线影院精品国产| 亚洲一区网站| 宅男66日本亚洲欧美视频| 亚洲国产精品一区二区www| 国产一区二区三区四区三区四| 国产精品精品视频| 欧美精品在线一区二区| 老司机久久99久久精品播放免费| 性欧美xxxx视频在线观看| 亚洲午夜伦理| 一区二区欧美日韩视频| 亚洲精品乱码久久久久| 亚洲精品免费在线| 亚洲黄一区二区| 亚洲国产综合91精品麻豆| 欧美制服丝袜| 亚洲欧美综合| 亚洲自拍电影| 亚洲欧美一区二区三区在线| 亚洲日韩欧美视频一区| 国产偷久久久精品专区| 国产精品一区二区在线| 国产精品在线看| 国产日韩亚洲欧美| 国产日韩在线一区二区三区| 国产精品推荐精品| 国产精品天美传媒入口| 欧美日韩中文字幕综合视频| 欧美大色视频| 欧美日韩国产123区| 欧美日韩一区二区三区在线观看免 | 国产精品99久久久久久有的能看| 日韩网站在线看片你懂的| 99精品免费网| 99视频在线精品国自产拍免费观看| 亚洲国产精品成人综合色在线婷婷 | 欧美超级免费视 在线| 免播放器亚洲一区| 亚洲电影观看| 99精品视频免费全部在线| 9久re热视频在线精品| 亚洲午夜精品久久| 久久成人精品一区二区三区| 久久婷婷av| 久久综合激情| 欧美黄色网络| 国产精品视频区| 极品尤物一区二区三区| 亚洲电影自拍| 亚洲欧美日韩国产精品| 久久九九电影| 蜜桃av一区二区| 亚洲黄色精品| 亚洲一区三区视频在线观看 | 久久免费精品视频| 亚洲国产小视频在线观看|