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

隨筆 - 70, 文章 - 0, 評(píng)論 - 9, 引用 - 0
數(shù)據(jù)加載中……

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

基于xTuple框架的擴(kuò)展是在盡可能不修改xTuple核心代碼的前提下進(jìn)行ui和腳本開發(fā)的。
 
以下為開發(fā)步驟,將在以后空閑時(shí)間里逐步進(jìn)行細(xì)節(jié)描述。
 
一、需求分析
    略。
二、數(shù)據(jù)庫設(shè)計(jì)
   
    序列
對(duì)自動(dòng)增加的唯一編號(hào)可以通過序列來實(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è)計(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ù)庫的數(shù)據(jù)表priv里存在,可以通過升級(jí)包增加此權(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控件是用戶自己定義的可以實(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  重新打開Qt Designer,即可使用此新加的控件。
 
四、腳本開發(fā)
 
    display設(shè)計(jì)
display頁面在3.8以上的版本中可以完全用腳本實(shí)現(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è)計(jì)里加載腳本initMenu.js和housepays-detail.mql。
    4  重啟xTuple客戶端。運(yùn)行即可。
參考資料:www.xtuple.org/node/4596
 
    菜單設(shè)計(jì)
簡單示例:
    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
 
五、其他
 
    腳本語言翻譯
    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  與原來的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ù)庫操作(在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 閱讀(617) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   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>
            麻豆精品视频| 亚洲乱码国产乱码精品精天堂| 亚洲精品国产品国语在线app| 麻豆精品视频| 亚洲人体影院| 99视频+国产日韩欧美| 国产精品vvv| 久久蜜桃香蕉精品一区二区三区| 久久久免费av| 99国产精品私拍| 亚洲欧美国产毛片在线| 尤妮丝一区二区裸体视频| 亚洲国产欧美日韩另类综合| 国产精品久久久久秋霞鲁丝 | 亚洲成在人线av| 亚洲精品永久免费| 国产偷自视频区视频一区二区| 欧美成年人在线观看| 欧美日韩一区二区三区在线视频| 久久gogo国模裸体人体| 免费在线一区二区| 午夜一级久久| 欧美高清影院| 欧美一区免费视频| 欧美电影免费观看大全| 香蕉久久一区二区不卡无毒影院| 久久综合免费视频影院| 亚洲中字黄色| 欧美激情按摩在线| 久久青草福利网站| 国产精品看片你懂得| 亚洲电影免费观看高清| 国产精品色一区二区三区| 亚洲国语精品自产拍在线观看| 国产日韩欧美一区二区三区在线观看 | 欧美国产日韩视频| 久久久久久夜精品精品免费| 欧美日韩免费观看一区三区| 久久综合久久综合九色| 国产精品免费视频xxxx| 亚洲精品乱码久久久久久黑人| 国产综合av| 亚洲图片在线| 99精品国产99久久久久久福利| 亚洲一级片在线观看| 亚洲久久在线| 久久久精品日韩| 久久精品论坛| 国产精品一区二区女厕厕| 亚洲精品免费在线观看| 亚洲精品视频一区二区三区| 久久久久久久久久久成人| 午夜精品久久久久久久久久久久| 欧美黑人多人双交| 麻豆av一区二区三区| 国产日韩一区在线| 亚洲一区在线免费观看| 亚洲免费视频在线观看| 欧美成人伊人久久综合网| 久久久久久久波多野高潮日日| 国产精品入口福利| 亚洲午夜一区| 午夜视频一区| 国产精品一区久久久| 亚洲一区www| 亚洲欧美视频在线观看视频| 国产精品国产三级国产普通话蜜臀| 亚洲伦伦在线| 亚洲视频一区在线观看| 欧美日韩国产美女| 亚洲狼人精品一区二区三区| 在线一区亚洲| 国产精品福利久久久| 午夜久久资源| 老司机免费视频一区二区| 一区二区三区在线免费观看| 久久性天堂网| 亚洲国产欧美一区| 中文av一区二区| 国产精品理论片| 欧美一级在线视频| 美女被久久久| 一区二区国产精品| 国产精品腿扒开做爽爽爽挤奶网站 | 亚洲国产日韩欧美在线99| 老牛国产精品一区的观看方式| 欧美成人精品h版在线观看| 亚洲人午夜精品免费| 欧美日韩中文字幕在线| 亚洲一区尤物| 欧美激情一级片一区二区| 亚洲精品韩国| 国产精品美女久久福利网站| 欧美在线观看日本一区| 欧美激情亚洲另类| 亚洲永久网站| 在线不卡免费欧美| 欧美日韩另类在线| 欧美在线999| 亚洲精品一区二区三区99| 欧美一区二区视频免费观看 | 国产精品久久久免费| 久久久久久久久综合| 日韩视频一区二区三区在线播放免费观看 | 亚洲国产欧美国产综合一区| 欧美天天视频| 久久婷婷丁香| 亚洲一二三区在线观看| 免费看的黄色欧美网站| 亚洲综合另类| 91久久线看在观草草青青| 国产精品亚洲аv天堂网| 看片网站欧美日韩| 亚洲在线观看| 亚洲精品视频免费在线观看| 久久久久久成人| 一本一本久久| 亚洲电影免费观看高清| 国产精品福利影院| 欧美不卡三区| 久久久久成人网| 亚洲午夜成aⅴ人片| 亚洲国产成人久久综合一区| 久久久久久久久伊人| 午夜精品久久久久久久99热浪潮| 91久久视频| 亚洲第一精品电影| 国产亚洲欧美一区| 国产精品福利在线观看| 欧美另类在线观看| 欧美成人首页| 久久综合狠狠| 久久激情视频| 欧美一区二区精品在线| 亚洲视频1区| 一本色道久久88综合亚洲精品ⅰ | 亚洲三级电影全部在线观看高清| 麻豆91精品91久久久的内涵| 久久精品亚洲一区二区三区浴池| 亚洲综合色婷婷| 亚洲午夜女主播在线直播| 亚洲精品极品| 亚洲精品综合久久中文字幕| 亚洲国产mv| 亚洲国产高清一区| 亚洲精品国产欧美| 亚洲美女一区| 日韩午夜电影在线观看| 日韩亚洲欧美成人一区| 亚洲激情社区| 亚洲精品国精品久久99热一| 91久久黄色| 亚洲乱码一区二区| 亚洲少妇最新在线视频| 在线一区二区三区做爰视频网站 | 国产精品99久久久久久人| 亚洲深夜福利在线| 午夜精品一区二区三区电影天堂 | 国产亚洲精品久久久| 国产一区二区无遮挡| 极品裸体白嫩激情啪啪国产精品| 激情综合久久| 日韩小视频在线观看| 亚洲欧美日本国产专区一区| 久久精品99| 欧美激情久久久久| 99精品国产99久久久久久福利| 亚洲网址在线| 久久精品国产91精品亚洲| 久久综合五月| 欧美日韩精品一区二区在线播放 | 美日韩精品免费观看视频| 欧美肥婆在线| 国产精品久久久久久久久久妞妞| 国产又爽又黄的激情精品视频| 亚洲大片精品永久免费| 中文一区字幕| 久久视频国产精品免费视频在线| 亚洲激情中文1区| 亚洲欧美日韩综合国产aⅴ| 久久久www免费人成黑人精品| 欧美久久视频| 国产主播精品在线| 在线一区欧美| 免费在线一区二区| 一区二区三区欧美| 久久亚洲国产精品日日av夜夜| 欧美日韩免费一区二区三区| 国产区日韩欧美| 99国产精品久久久| 久久综合九色综合久99| 亚洲一二三区精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美亚洲不卡| 亚洲乱码国产乱码精品精天堂 | 久久久久一区| 国产精品视频999| 日韩一区二区高清| 美女露胸一区二区三区| 亚洲性夜色噜噜噜7777|