spark的自留地(ofbiz/eclipse rcp/shark/opentaps)

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            54 Posts :: 0 Stories :: 112 Comments :: 0 Trackbacks

          #

          放一些屏幕截圖來看圖說話吧

          流程設(shè)計(jì)界面
          左邊下拉框放至了我所有允許定義流程的業(yè)務(wù)對(duì)象類型,可通過底部的"新增"\"修改"\"刪除"等操作進(jìn)行維護(hù).點(diǎn)擊已定義的流程可以查看對(duì)應(yīng)的流程設(shè)置

          審批流設(shè)置界面

          新增流程界面
          新增時(shí)可為該流程設(shè)置相關(guān)啟用條件,優(yōu)先級(jí)別及審批步驟等

          新增流程

          審批人的待辦工作臺(tái),可以這里統(tǒng)一處理各類待辦業(yè)務(wù):

          待辦工作

          待辦業(yè)務(wù)的查看界面:
          待辦業(yè)務(wù)界面

          審批流轉(zhuǎn)界面(以通過為例)
          通過界面
          posted @ 2008-11-17 13:55 shanghai_spark 閱讀(1688) | 評(píng)論 (0)編輯 收藏

          下面給出UML圖供大家參考:

          工作流UML

          其中:
          流程類型、流程、活動(dòng)、流轉(zhuǎn)條件、外部應(yīng)用為設(shè)計(jì)時(shí)對(duì)象,用于描述流程規(guī)則
          流程實(shí)例、活動(dòng)實(shí)例、活動(dòng)記錄為運(yùn)行時(shí)對(duì)象,用于記錄實(shí)際發(fā)生的流程運(yùn)行狀況

          需要解決的問題是,如何將我們的應(yīng)用與此工作流引擎進(jìn)行結(jié)合?我的解決方法是:
          1、流程類型約定業(yè)務(wù)對(duì)象類型(即此流程可以與哪種業(yè)務(wù)對(duì)象關(guān)聯(lián))
          2、業(yè)務(wù)對(duì)象中的屬性或其組合可以定義為流轉(zhuǎn)條件(即實(shí)現(xiàn)業(yè)務(wù)對(duì)象信息影響工作流流轉(zhuǎn))
          3、活動(dòng)執(zhí)行者可以選擇業(yè)務(wù)系統(tǒng)的組織機(jī)構(gòu)、角色、人員定義(我是通過接口方式進(jìn)行約定,IOC注入)
          4、活動(dòng)可調(diào)用已定義的應(yīng)用(可多個(gè))
          5、業(yè)務(wù)對(duì)象可以通過報(bào)批動(dòng)作啟動(dòng)工作流實(shí)例,之后由工作流按照設(shè)計(jì)信息與業(yè)務(wù)信息進(jìn)行自動(dòng)流轉(zhuǎn)或全程提供表單與審批按鈕支持。

          由于此工作流系統(tǒng)是出于簡化的目的進(jìn)行設(shè)計(jì)的,設(shè)計(jì)時(shí)與運(yùn)行時(shí)信息我都使用數(shù)據(jù)庫信息來表示,設(shè)計(jì)器也未提供拖拉界面來進(jìn)行設(shè)計(jì),而是采用順序定義的方式來操作。在實(shí)際運(yùn)作過程中,我覺得它可以滿足一般規(guī)模不大(文職人員100人左右)的企業(yè)的OA應(yīng)用。

          本人原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處!
          posted @ 2008-11-08 21:53 shanghai_spark 閱讀(1725) | 評(píng)論 (0)編輯 收藏

          工作流引擎產(chǎn)品無論國內(nèi)或國外都有不少成熟之作,開源的工作流產(chǎn)品也有諸如shark之類的精品。但工作流產(chǎn)品做為一個(gè)獨(dú)立的中間件,無論是其本身或通過它進(jìn)行流程設(shè)計(jì)及與你自己的系統(tǒng)整合,對(duì)很多使用過工作流產(chǎn)品的開發(fā)人員來說都是一件不容易的事。特別是在一些其實(shí)只是一些很簡單的流程控制應(yīng)用需要時(shí),我們是否需要一個(gè)獨(dú)立的工作流產(chǎn)品來運(yùn)作呢?

          也許你可以嘗試自己做一個(gè)工作流組件?聽起來好象有點(diǎn)兒難,但其實(shí)并不是一件很恐怖的工作。讓我們先從通常會(huì)使用到工作流引擎的情景分析下我們需要什么?

          情景:某公司需要對(duì)員工請(qǐng)假進(jìn)行管理,員工請(qǐng)假需進(jìn)行系統(tǒng)填寫申請(qǐng),如果請(qǐng)假天數(shù)<=1天,可以部門主管批準(zhǔn)。如果請(qǐng)假天數(shù)>1天,需由部門主管->副總經(jīng)理進(jìn)行再行批復(fù)。批準(zhǔn)后的請(qǐng)假自動(dòng)記入考勤系統(tǒng)。

          從這個(gè)簡單的業(yè)務(wù)需求,我們進(jìn)行分析它的需求:
          1、工作流程的選擇是由業(yè)務(wù)信息(請(qǐng)假單)相關(guān)聯(lián)的,工作流獨(dú)立存在是無意義的。
          2、業(yè)務(wù)信息中的內(nèi)容會(huì)決定流程的選擇與流向。如:請(qǐng)假天數(shù),或是主管的批復(fù)意見
          3、工作流程的流轉(zhuǎn)與組織結(jié)構(gòu)、角色、員工相關(guān)。
          4、工作流程通常會(huì)調(diào)用相關(guān)業(yè)務(wù)應(yīng)用(記入考勤)來完成多應(yīng)用系統(tǒng)之間的協(xié)作。

          結(jié)合以上需求,我們定義出工作流系統(tǒng)所需功能與數(shù)據(jù):
          1、流程定義工具(負(fù)責(zé)生成工作流引擎能明白的流程控制信息),對(duì)應(yīng)于XPDL
          2、工作流控制變量定義(即用于控制流程流轉(zhuǎn)的控制量,如請(qǐng)假天數(shù)與各級(jí)審批意見,可由系統(tǒng)根據(jù)流程實(shí)體信息自動(dòng)注入至工作流引擎)
          3、工作流相關(guān)數(shù)據(jù),即與業(yè)務(wù)過程相關(guān)的數(shù)據(jù),如:業(yè)務(wù)表單、組織結(jié)構(gòu)、角色、員工等
          4、工作流引擎,負(fù)責(zé)解釋流程定義,創(chuàng)建過程實(shí)例并控制其執(zhí)行,并可能提供相關(guān)的監(jiān)控界面以保障工作流的正確運(yùn)轉(zhuǎn)。
          5、外部應(yīng)用,可由工作流引擎進(jìn)行調(diào)用完成多個(gè)業(yè)務(wù)系統(tǒng)的流程銜接。這通常是工作流引擎的最大亮點(diǎn)。

          未完待續(xù)>>

          本人原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處!

          posted @ 2008-11-04 16:34 shanghai_spark 閱讀(2204) | 評(píng)論 (3)編輯 收藏

          * 如何在minilang中使用Java靜態(tài)方法獲得數(shù)據(jù)
          使用beanshell腳本:

          <set field="notApplied" value="${bsh:org.ofbiz.accounting.invoice.InvoiceWorker.getInvoiceNotApplied(invoice)}" type="Double"/>

           

          警告:你必須使用type=""來轉(zhuǎn)換你的結(jié)果類型,否則的話,它將返回字符串類型.


          * 如何在minilang中調(diào)用Java程序
          你可以在minilang中插入一段beanshell代碼,類似于 applications/ecommerce/script/org/ofbiz/ecommerce/customer/CustomerEvents.xml的示例:

                  <call-bsh><![CDATA[
                      String password = (String) userLoginContext.get("currentPassword");
                      String confirmPassword = (String) userLoginContext.get("currentPasswordVerify");
                      String passwordHint = (String) userLoginContext.get("passwordHint");
                      org.ofbiz.securityext.login.LoginServices.checkNewPassword(newUserLogin, null, password, confirmPassword, passwordHint, error_list, true, locale);
                  
          ]]></call-bsh>


            在beanshell腳本中可以訪問在minilang中所有的變量


          * 清除 與 刷新的比較
            <clear-field field-name="foo"/> 設(shè)置它為null. 這可以是一個(gè)類的屬性或是集合中的一個(gè)值
            <refresh-value value-name="foo"/> 從數(shù)據(jù)庫中重新獲得foo的值. foo必須是一個(gè)GenericValue.


          * 如何設(shè)置一個(gè)布爾值
           我無法找到任何例子,但是我這樣做是成功的:

           <set field="orderAvailableCtx.countNewReturnItems" value="true" type="Boolean"/>


           我想minilang使用type=""中的類型與value中的值的做為構(gòu)造調(diào)用.猜想在某天我看到這些代碼時(shí)能證明我是對(duì)的...

          本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉(zhuǎn)載,請(qǐng)注明出處.

          posted @ 2008-10-31 09:21 shanghai_spark 閱讀(1613) | 評(píng)論 (4)編輯 收藏

          我的產(chǎn)品是被要求運(yùn)行在多種常見數(shù)據(jù)庫平臺(tái)下(mysql/sqlserver/oracle)下,在開發(fā)中需要嚴(yán)格遵循相關(guān)的規(guī)范以確保能夠?qū)崿F(xiàn)跨數(shù)據(jù)庫類型的要求.(相關(guān)的要點(diǎn)在我的"你的系統(tǒng)真的因?yàn)槭褂胔ibernate就可以適應(yīng)各種數(shù)據(jù)庫嗎? "一文中已提及).在初始開發(fā)時(shí)有一個(gè)問題是比較困擾我的團(tuán)隊(duì)的,我們開發(fā)的時(shí)候必定是基于某個(gè)特定的數(shù)據(jù)庫開發(fā)的(比如mysql),但在測試階段是需要在不同的數(shù)據(jù)庫平臺(tái)下進(jìn)行兼容性測試,由于開發(fā)過程中數(shù)據(jù)庫結(jié)構(gòu)與種子數(shù)據(jù)變化非常快,全部編寫sql方式非常浪費(fèi)時(shí)間,如何能找到一種高效的數(shù)據(jù)庫相互遷移的工具,是我們當(dāng)時(shí)所急需的解決方案.

          其實(shí)也沒啥選擇,比較常用的數(shù)據(jù)庫遷移工具就是Sqlserver自帶的DTS,這玩意在sql server數(shù)據(jù)庫間進(jìn)行數(shù)據(jù)導(dǎo)入/導(dǎo)出時(shí)倒確實(shí)比較好用,在不同數(shù)據(jù)庫類型進(jìn)行操作時(shí),就會(huì)出多多問題,如:類型轉(zhuǎn)換需手工指定/導(dǎo)出字段有雙引號(hào)...

          所以最后的選擇就是自己做一個(gè)DTS好啦,思路如下:
          1、選擇源數(shù)據(jù)庫連接與目標(biāo)數(shù)據(jù)庫連接
          2、根據(jù)源數(shù)據(jù)庫遍歷所有數(shù)據(jù)庫對(duì)象(表),做為基準(zhǔn)
          3、刪除目標(biāo)數(shù)據(jù)庫所有表外鍵及索引、刪除所有種字?jǐn)?shù)據(jù)(根據(jù)約定)數(shù)據(jù)、字段均允許null
          4、遍歷源數(shù)據(jù)庫中所有表,為目標(biāo)數(shù)據(jù)庫修改結(jié)構(gòu)(如增刪字段,字段改類型、大小)
          5、將源數(shù)據(jù)庫中種子數(shù)據(jù)表數(shù)據(jù)拷貝至目標(biāo)數(shù)據(jù)庫中
          6、根據(jù)源數(shù)據(jù)庫為目標(biāo)數(shù)據(jù)庫中的表創(chuàng)建外鍵及索引、設(shè)置是否允許為null
          7、搞掂!

          完工后總代碼量不過兩千行(因?yàn)樾杩紤]不同數(shù)據(jù)庫的SQL Dialet,否則應(yīng)該更少)

          用戶界面基于Eclipse RCP技術(shù)開發(fā),使用JFace Wizard向?qū)Вㄈ绻皇窍胗孟驅(qū)У脑挘憧梢杂肧WT來做)對(duì)話框獲得源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫的連接內(nèi)容,并在用戶點(diǎn)擊完成按鈕后,在進(jìn)度條中提示用戶執(zhí)行情況.用了這個(gè)玩意以后,測試同事的數(shù)據(jù)庫兼容性測試就再也不用來煩我們開發(fā)組啦!真是爽呀!當(dāng)然很多喜歡折騰的客戶(比如突然在哪里聽說oracle是大型數(shù)據(jù)庫,非讓你幫他弄過去)此類朝三暮四也就自然不在話下啦!


          數(shù)據(jù)庫遷移向?qū)聊灰? src=

          數(shù)據(jù)庫遷移向?qū)聊欢? src=

          數(shù)據(jù)庫遷移向?qū)聊蝗? src=

          本人原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處!
          posted @ 2008-10-27 14:22 shanghai_spark 閱讀(1472) | 評(píng)論 (3)編輯 收藏

          * 如何為SELECT SUM(QUANTITY - CANCEL_QUANTITY) AS QUANTITY之類的語句設(shè)置別名 

            <alias entity-alias="OI" name="quantity" function="sum">
                
          <complex-alias operator="-">
                    
          <complex-alias-field entity-alias="OI" field="quantity" default-value="0"/>
                    
          <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0"/>
                
          </complex-alias>
            
          </alias> 

             SELECT SUM(COALESCE(OI.QUANTITY,'0') - COALESCE(0I.CANCEL_QUANTITY)) AS QUANTITY在結(jié)果集包含默認(rèn)值是一個(gè)好的習(xí)慣,否則如果有一項(xiàng)為null,那么最終相減的結(jié)果就也為null了.
            操作符可以為任何你當(dāng)前使用數(shù)據(jù)庫所支持的SQL操作符,比如算術(shù)運(yùn)算符+, -, * 和/ 或者字符串連接符 ||.

            你可以增加function=""標(biāo)簽來完成在complex-alias-field中的min, max, sum, avg, count, count-distinct, upper 及l(fā)ower集合運(yùn)算.  示例, 以上的定義可以用另一種方法表示為:

            <alias entity-alias="OI" name="quantity">
                
          <complex-alias operator="-">
                    
          <complex-alias-field entity-alias="OI" field="quantity" default-value="0" function="sum"/>
                    
          <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0" function="sum"/>
                
          </complex-alias>
            
          </alias>

             即為SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0'))) AS QUANTITY查詢結(jié)果集

          * 我討厭OFBiz的實(shí)體引擎,我要自己的JDBC連接!
            好的,以下是你獲得JDBC連接的方法: 

          import org.ofbiz.entity.jdbc.ConnectionFactory;

          String helperName 
          = delegator.getGroupHelperName("org.ofbiz");    // gets the helper (localderby, localmysql, localpostgres, etc.) for your entity group org.ofbiz
          Connection conn = ConnectionFactory.getConnection(helperName); 
          Statement statement 
          = conn.createStatement();
          statement.execute(
          "SELECT * FROM PARTY");
          ResultSet results 
          = statement.getResultSet();

          //  通過普通JDBC 的結(jié)果集來操作

          //Alternatively, you can use the SQLProcessor like 
          this:

          SQLProcessor sqlproc 
          = new SQLProcessor(helperName);
          sqlproc.prepareStatement(
          "SELECT * FROM PARTY");
          ResultSet rs1 
          = sqlproc.executeQuery();

          ResultSet rs2 
          = sqlproc.executeQuery("SELECT * FROM PRODUCT");

           你可以查看framework/webtools/webapp/webtools/WEB-INF/actions/entity/EntitySQLProcessor.bsh了解它的使用

          在以下網(wǎng)址你可以獲得相關(guān)JavaDoc的內(nèi)容:
          http://www.opentaps.org/javadocs/version-1.0/framework/api/org/ofbiz/entity/jdbc/SQLProcessor.html
          http://www.opentaps.org/javadocs/version-1.0/framework/api/org/ofbiz/entity/jdbc/ConnectionFactory.html

            *** 請(qǐng)先考慮以下內(nèi)容: 你放棄數(shù)據(jù)庫的無關(guān)性意味著你在某些方法將無法與框架或其它程序集成.你確定你要這么做嗎?

          獲得更好的做法,請(qǐng)?jiān)L問 http://www.opentaps.org/docs/index.php/Using_the_Query_Tool


          * 關(guān)于時(shí)間比較方法的一些警告

          在你用 GREATER_THAN比較一個(gè) Timestamp類型數(shù)據(jù)時(shí), 你有可能獲得相同的時(shí)間數(shù)據(jù): 

          delegator.findByAnd("XXX", UtilMisc.toList(new EntityExpr("fromDate", EntityOperator.GREATER_THAN, "2007-12-31 23:59:59.998")));

           有可能包含fromDate=2007-12-31 23:59:59.998的數(shù)據(jù).  (此種情況發(fā)生于PostgreSQL 8.1并且GenericDAO 類生成的SQL代碼是'FROM_DATE > ' so 所以我也不明白發(fā)生這個(gè)問題的原因.) 所以確保安全的方法是, 增加1秒到需要比較的時(shí)間中然后使用 GREATER_THAN_EQUAL_TO方法  

          delegator.findByAnd("XXX", UtilMisc.toList(new EntityExpr("fromDate", EntityOperator.GREATER_THAN_EQUAL_TO, "2008-01-01 00:00:00.998")));

           

          * 警告: 在空集合中使用EntityOperator.IN

          請(qǐng)小心如果使用EntityOperator.IN去判斷一個(gè)非空集合在一個(gè)空集合中的包含項(xiàng),你有可能獲得一個(gè)語法錯(cuò)誤: 在Derby或者其它一些不為人知的數(shù)據(jù)庫中可能會(huì)出錯(cuò).
          所以建議你能在使用EntityOperator.IN之間,通常執(zhí)行UtilValidate.isNotEmpty方法來判斷一下結(jié)果集是否為空

          * 警告: delegator.getNextSubSeqId 不能確保唯一性

          很多實(shí)體有很多合成的主鍵.示例OrderItem's 主鍵是orderId + orderItemSeqId.  InventoryItemDetail's 主鍵是inventoryItemId +inventoryItemSeqId.  通常, delegator.getNextSubSeqId 通常是獲得一個(gè)序列值,但是在多線程的訪問下有可能無法確保生成的值的唯一性.  此段內(nèi)容在 http://issues.apache.org/jira/browse/OFBIZ-1636 中有相關(guān)文檔記錄.

          當(dāng)前, 如果有可能多個(gè)線程嘗試同時(shí)寫入實(shí)體組合鍵時(shí),可以使用delegator.getNextSeqId來替代getNextSubSeqId.  (此問題不會(huì)發(fā)生于OrderItem, 因?yàn)樗皇褂脝尉€程寫入, 但有可能發(fā)生于 InventoryItemDetail, 它使用多線程來創(chuàng)建庫存記錄項(xiàng).)
           

          完>>

          本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉(zhuǎn)載,請(qǐng)注明出處.
          posted @ 2008-10-26 11:30 shanghai_spark 閱讀(1603) | 評(píng)論 (0)編輯 收藏

          * 我可以在entitymodel.xml文件中定義自己的view-entities嗎?

          不能, 你可以動(dòng)態(tài)定義它們.你可以查看org.ofbiz.party.party.PartyServices中的findParty方法學(xué)習(xí)它的使用

          * 如果為有效期間創(chuàng)建條件?

          我們提供了一組非常有用的方法EntityUtil.getFilterByDateExpr ,它能返回一個(gè)EntityConditionList根據(jù)有效期間來篩選一個(gè)結(jié)果集. 

          * 如何在大數(shù)據(jù)結(jié)果集下工作

          如果你檢出一個(gè)大的數(shù)據(jù)結(jié)果集,你應(yīng)當(dāng)使用EntityListIterator通過迭代方式讀取數(shù)據(jù),而非List.
          示例,如果你使用:

          List products = delegator.findAll("Product");


          你可能獲得一個(gè)"java.lang.OutOfMemoryError".  這是由于你通過findAll, findByAnd, findByCondition等方法來獲得一個(gè)大的內(nèi)存數(shù)據(jù)結(jié)果集導(dǎo)致內(nèi)存溢出.  在這種情況下, 應(yīng)該使用EntityListIterator迭代方式來讀取你的數(shù)據(jù). 這個(gè)示例應(yīng)改寫成:

          productsELI = delegator.findListIteratorByCondition("Product"new EntityExpr("productId", EntityOperator.NOT_EQUAL, null), UtilMisc.toList("productId"), null);

           

          注意獲得EntityListIterator的方法只用通過條件, 所以你需要將你的條件重寫為EntityExpr (在此次情況下,productId是主鍵字段不可能為空的, 所以將返回所有Proudct實(shí)例,)或 EntityConditionList.

          此方法參數(shù)中包含檢出的字段(這里為productId)以及排序字段(這里不需要,所以賦了null)

          你可以傳遞一個(gè)null作為EntityCondition參數(shù)來獲得所有結(jié)果.然后這不一定在所有數(shù)據(jù)庫下都能正常工作!  在maxdb及其它不常用的數(shù)據(jù)庫下時(shí)你要小心使用這些高級(jí)功能.

          * 如何使用EntityListIterator

          當(dāng)我們通過EntityListIterator迭代訪問數(shù)據(jù)時(shí), 通常是這樣:

          while ((nextProduct = productsELI.next()) != null{
          .
              
          // operations on nextProduct
          }


          在EntityListIterator 中使用 .hasNext()方法是一種不經(jīng)濟(jì)的做法.

          在你完成你的操作后,要記得關(guān)閉此迭代

          productsELI.close();

           

          * 如何查詢無重結(jié)果集

          當(dāng)前只能通過list iterator方法并指定EntityFindOptions參數(shù),示例如下:

              listIt = delegator.findListIteratorByCondition(entityName, findConditions, 
                      
          null// EntityConditions參數(shù)
                      fieldsToSelectList, 
                      fieldsToOrderByList,  
                      
                      
          //關(guān)鍵部分.  第一個(gè)true表示"specifyTypeAndConcur"
                      
          // 第二個(gè)true指完是一個(gè)濾重查詢.  顯然在實(shí)體引擎中只能通過這個(gè)方法來進(jìn)行濾重查詢
                      new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true));

           

          在minilang, 它會(huì)更簡單:

           

            <entity-condition entity-name="${entityName}" list-name="${resultList}" distinct="true">
               
          <select field="${fieldName}"/>
               .


          * 如何進(jìn)行一個(gè)大小寫不敏感的查詢(即不分大小寫)

          你需要查詢條件表達(dá)式兩邊均轉(zhuǎn)為大寫,示例:

          andExprs.add(new EntityExpr("lastName"true, EntityOperator.LIKE, "%"+lastName+"%"true));

               (來源org.ofbiz.party.party.PartyServices)


          * 如何將EntityListIterator轉(zhuǎn)換成List

            使用EntityListIterator.getCompleteList() 及getPartialList 方法


          * 如何自動(dòng)獲得下一個(gè)ID值

            在minilang 中使用 <sequence-id-to-env ...> 或在Java中通過delegator.getNextSeqId(...) 獲得 .  id序列存放于SequenceValueItem中.


          * 關(guān)于ID值的一些警告

            不要在種子/演示數(shù)據(jù)中使用10000做為數(shù)據(jù)的ID,當(dāng)系統(tǒng)嘗試自動(dòng)創(chuàng)建數(shù)據(jù)時(shí),它們都將嘗試10000,這將導(dǎo)致一個(gè)鍵值沖突錯(cuò)誤.

          * 如何從一個(gè)明細(xì)項(xiàng)中獲得序列ID
            
            有些實(shí)體,比如擁有itemSeqId 的InvoiceItem(發(fā)票明細(xì)項(xiàng)) and OrderItem(訂單明細(xì)項(xiàng)).此項(xiàng)通常在你處一次為item生成GenericValue 時(shí)自動(dòng)生成ID,之后向delegator要求生成項(xiàng)目的seq Id:

            GenericValue orderItem = delegator.makeValue("OrderItem", orderItemValues);
            delegator.setNextSubSeqId(orderItem, 
          "orderItemSeqId", ORDER_ITEM_PADDING, 1);

          未完待續(xù)>>

          本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉(zhuǎn)載,請(qǐng)注明出處.
          posted @ 2008-10-25 11:42 shanghai_spark 閱讀(1648) | 評(píng)論 (1)編輯 收藏

          * 保持實(shí)體名稱少于25個(gè)字符
          這個(gè)限制主要是為了Oracle只支持30字符以內(nèi)的數(shù)據(jù)庫對(duì)象名稱,再加上OFBiz會(huì)自動(dòng)在單詞之間加上"_",所以就得出了這么個(gè)限制.

          * 關(guān)聯(lián)的工作方式
          它們定義于entitymodel.xml文件中的<entity>段,示例如下:
                <relation type="one" fk-name="PROD_CTGRY_PARENT" title="PrimaryParent" rel-entity-name="ProductCategory">
                  
          <key-map field-name="primaryParentCategoryId" rel-field-name="productCategoryId"/>
                
          </relation>
                
          <relation type="many" title="PrimaryChild" rel-entity-name="ProductCategory">
                  
          <key-map field-name="productCategoryId" rel-field-name="primaryParentCategoryId"/>
                
          </relation>
              type這個(gè)屬性標(biāo)簽定義關(guān)聯(lián)類型: "one"表示一對(duì)一,"many"表示從此實(shí)體引出的一對(duì)多關(guān)系
              fk-name的屬性值是數(shù)據(jù)庫外鍵名.為自己的外鍵命名是一個(gè)好的習(xí)慣,雖然如果你不設(shè)置此屬性,OFiz也會(huì)自己建外建.
              rel-entity-name的屬性值指向關(guān)聯(lián)的實(shí)體名稱
              title用來區(qū)分兩個(gè)實(shí)體之間的多重關(guān)系
              <key-map>節(jié)點(diǎn)定義關(guān)聯(lián)中使用到的字段.field-name指向本實(shí)體內(nèi)的引用字段,rel-field-name定義關(guān)聯(lián)的實(shí)體字段,你可以通過多個(gè)字段組合關(guān)聯(lián)
              當(dāng)你訪問一個(gè)關(guān)聯(lián),你可以使用title+entityName作為參數(shù)調(diào)用.getRelated("")或.getRelatedOne("")方法.在關(guān)聯(lián)為"many"時(shí)使用.getRelated("")是恰當(dāng)?shù)?因?yàn)樗祷匾粋€(gè)List,同樣在關(guān)聯(lián)為"one"時(shí)通過.getRelatedOne("")方法獲得一個(gè)值.

          * view-entities相關(guān)內(nèi)容
          view-entities的功能非常強(qiáng)大,它允許你可以創(chuàng)建一個(gè)join-like查詢,即使你的數(shù)據(jù)庫不支持join.
          關(guān)于你數(shù)據(jù)庫的join語法存放在entityengine.xml的datasource節(jié)點(diǎn)下的join-style屬性中.
          當(dāng)你通過<view-link...>節(jié)點(diǎn)將兩上實(shí)體連接起來時(shí),記住:
          1. 實(shí)體名稱順序是重要的
          2. 默認(rèn)的連接方式是inner join(即同樣的值存在于兩個(gè)實(shí)體類中),外連接需要使用rel-optional="true"
          如果多個(gè)實(shí)體中擁有相同的字段名稱,比如statusId,結(jié)果集中的statusId使用第一個(gè)實(shí)體中的該列,其它實(shí)體中的同名列將被丟棄.如果你想要同時(shí)獲得這些列,你需要通過在其之前加入<alias-all>節(jié)點(diǎn),一個(gè)方式是使用<alias ..>節(jié)點(diǎn)來為不同實(shí)體的同名字段起別名,示例:
          <alias entity="EntityOne" name="entityOneStatusId" field="statusId"/>
          <alias entity="EntityTwo" name="entityTwoStatusId" field="statusId"/>
          另一種方法是在<alias-all>節(jié)點(diǎn)中使用<exclude field="">,如下:
          <alias-all entity-alias="EN">
            
          <exclude field="fieldNameToExclude1"/>
            
          <exclude field="fieldNameToExclude2"/>
          </alias-all>

          這樣也可以排除掉很多不打算使用到的信息,特別是在一個(gè)非常大的表中查詢時(shí).
          如果你打算執(zhí)行類似于以下的查詢語句時(shí):
          SELECT count(visitId) FROM  GROUP BY trackingCodeId WHERE fromDate > '2005-01-01'
          需要包含字段visitId以及function="count" 標(biāo)簽,trackingCodeId需加上group-by="true"標(biāo)簽,fromDate需要加上group-by="false"標(biāo)簽

          在你進(jìn)行查詢時(shí),有一件非常重要的事情需要注意,比如說delegator.findByCondition方法,你必須指定檢出的字段列表,并且你不能指定fromDate字段,否則你將得到一個(gè)錯(cuò)誤.這就是為webtools不能夠使用view-entities來查看的原因.

          你可以查看applications/marketing/entitydef/entitymodel.xml的底部內(nèi)容學(xué)習(xí),及通過applications/marketing/webapp/marketing/WEB-INF/actions/reports學(xué)習(xí)beanshell腳本的調(diào)用.

          未完待續(xù)>>

          本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉(zhuǎn)載,請(qǐng)注明出處.
          posted @ 2008-10-24 16:26 shanghai_spark 閱讀(1904) | 評(píng)論 (0)編輯 收藏

          項(xiàng)目總結(jié)不知道大家是否都會(huì)真正去做,隔段時(shí)間會(huì)不會(huì)再去閱讀與體會(huì)當(dāng)時(shí)的心情呢?找出一篇舊時(shí)的項(xiàng)目總結(jié),細(xì)細(xì)讀來,看得仿佛還能感覺到當(dāng)時(shí)的心酸。這個(gè)項(xiàng)目是我剛進(jìn)入一家公司不久的情況下,我的職位是PM,當(dāng)時(shí)公司有一個(gè)遲遲不能終驗(yàn)的項(xiàng)目,拖了三年,據(jù)說在我之前項(xiàng)目經(jīng)理已經(jīng)換了四任,所有項(xiàng)目成員也都不在公司里了。所以公司里資深些的PM都不愿意接這個(gè)項(xiàng)目,我想大家做過項(xiàng)目都明白,項(xiàng)目獎(jiǎng)早就分完了,而且公司只剩尾款未收,根本就不愿意真正投入人力去完成這個(gè)項(xiàng)目,只是對(duì)客戶有個(gè)交待罷了。于是,這么個(gè)爛攤子就落在我這個(gè)當(dāng)時(shí)的新人身上了。

          從總結(jié)中摘抄一些部分放在這里,希望可以安慰時(shí)有低落心情的我及有相似遭遇的朋友們:

          一堆無人愿去看的源代碼、無一原項(xiàng)目組成員的參與、充斥報(bào)怨的客戶、亂七八糟的文檔、無序的需求...這一切使得每個(gè)人不禁望而生畏。說實(shí)話,當(dāng)時(shí)我心里也是非常不愿意接手這個(gè)項(xiàng)目的,心想:這個(gè)項(xiàng)目我對(duì)其一無所知、因?yàn)楫?dāng)時(shí)項(xiàng)目開發(fā)已進(jìn)行了多年,需求與最初已發(fā)生極大變化、重新搜集需求又得不到客戶的理解與支持、項(xiàng)目組普遍彌漫著一種失敗論的氣氛。

          沒有人愿意接,公司領(lǐng)導(dǎo)指派我去完成這件事。那我就抱著盡力試一試的想法參與進(jìn)來。從此進(jìn)入了漫長的需求摸索(資料不全、負(fù)責(zé)此項(xiàng)目客戶的變化)、完整的功能的再次開發(fā)(我項(xiàng)目組無人精通Delphi,也無人愿意去看無文檔無人員支持的原有的代碼),還要在此過程去平息客戶的怒火及吸收理解客戶業(yè)務(wù)的內(nèi)涵。在這漫長的過程,沒有太多的肯定或成為焦點(diǎn)的可能。很有些苦悶的時(shí)候,我也想要去放棄——承認(rèn)自己的無能、不愿再面對(duì)這種混亂的局面... 在這個(gè)過程中,幸有項(xiàng)目組人員、公司領(lǐng)導(dǎo)的理解與支持及自己不愿認(rèn)輸?shù)囊蛩夭拍軋?jiān)持到今天。

          從這個(gè)過程我也學(xué)到了對(duì)客戶業(yè)務(wù)的理解。我想今日的我再不會(huì)象初接手這個(gè)項(xiàng)目面對(duì)客戶時(shí),那樣不敢說出自己的建議和業(yè)務(wù)理解了。

          時(shí)至今日,總結(jié)過去所發(fā)生的,有一些經(jīng)驗(yàn)和想法愿意與大家分享:
          (1)在你最苦惱的時(shí)候,請(qǐng)勿輕言放棄,你的成功不是為了得到鮮花與掌聲。做完你要做的事,是你自己的成功;離成功最近的地方也是最易放棄的地方。
          (2)選擇一至兩個(gè)可以傾訴的對(duì)象,他們的支持(可能只是傾聽你的牢騷)會(huì)是你最大的動(dòng)力。
          (3)團(tuán)隊(duì)的力量:選擇一個(gè)假想敵或是共同的目標(biāo)(不能讓這些打算看你們笑話的人的陰謀得逞),會(huì)成為你這個(gè)團(tuán)隊(duì)?wèi)?zhàn)斗力的最大源泉
          (4)表面看起來蠻不講理的客戶是你最好的老師:只因?yàn)樗貌坏剿胍臇|西,才會(huì)看起來這樣蠻不講理。

          過去的經(jīng)驗(yàn),也許快樂,也許心酸。但回首時(shí),只要你有真正的努力,你一定有屬于自己的收獲!

          posted @ 2008-10-23 21:58 shanghai_spark 閱讀(1820) | 評(píng)論 (8)編輯 收藏

          在整理自己的文檔庫時(shí)發(fā)現(xiàn)了這篇五年前在另家公司工作時(shí)向公司老大提議"軟件技術(shù)支持組"的一個(gè)建議書,后來因?yàn)橛捎谌狈ο嚓P(guān)的推動(dòng)力(當(dāng)時(shí)自己還只是一個(gè)PM并缺乏相應(yīng)的授權(quán)與支持),最終并沒有達(dá)到設(shè)想的效果,現(xiàn)在發(fā)出來聊以紀(jì)念一下年青時(shí)的想法吧:

           

          1      前言

          在近期推動(dòng)組件庫項(xiàng)目實(shí)施的過程中,經(jīng)常感覺到?jīng)]有執(zhí)行能力能夠推動(dòng)公司技術(shù)革新之困境。現(xiàn)征詢xxxx咨詢公司及其它朋友意見之后。現(xiàn)向您建議成立公司軟件技術(shù)支持組(PIT)并授予相應(yīng)職責(zé)的權(quán)力以負(fù)責(zé)公司的技術(shù)(工具、方法和過程)的挑選和識(shí)別,并將經(jīng)過挑選和驗(yàn)證的技術(shù)有序地引入公司的軟件開發(fā)過程。

          2      實(shí)施后的藍(lán)圖

          1、公司由于技術(shù)的先進(jìn)性獲得市場競爭地位的極大提高。

          2、售前人員可使用PIT根據(jù)公司用戶市場情況、技術(shù)積累、成本因素、資源情況所制定出的商業(yè)解決方案向客戶銷售,對(duì)銷售可起到良好的技術(shù)支持作用。

          3、將過程財(cái)富(組件、工具、方法、經(jīng)驗(yàn))及規(guī)范標(biāo)準(zhǔn)在公司各軟件項(xiàng)目中實(shí)施,可極大降低研發(fā)部門(成本中心)所耗費(fèi)的巨額開發(fā)成本,獲得最大的投入產(chǎn)出比。

          4、可對(duì)風(fēng)險(xiǎn)進(jìn)行預(yù)先評(píng)價(jià),做好風(fēng)險(xiǎn)預(yù)防。

          5、項(xiàng)目經(jīng)理或銷售人員可在需求調(diào)研階段即可獲得公司已有財(cái)富的情況和資源分配情況,對(duì)用戶的引導(dǎo)可有的放矢,從而帶來諸多額外的收獲。

          6、可有效的鼓舞公司研發(fā)人員的士氣,加強(qiáng)公司戰(zhàn)斗力和凝聚力。

          3      PIT的職責(zé)

          1、              PIT對(duì)SEPG和高層管理者負(fù)責(zé),有專門的定期匯報(bào)渠道。經(jīng)批準(zhǔn)后的行動(dòng)計(jì)劃和規(guī)范制度對(duì)公司研發(fā)部員工具有強(qiáng)制性。

          2、              向公司高層匯報(bào)公司技術(shù)積累情況,長期技術(shù)策略以及提高公司市場競爭地位的發(fā)展路線。并負(fù)責(zé)安排和提供相應(yīng)的實(shí)施計(jì)劃(包括技術(shù)更新可能涉及的范圍、更新的時(shí)機(jī)、可選的方案、評(píng)估情況、初期培訓(xùn)及指導(dǎo)、成本耗費(fèi)情況)。經(jīng)同行評(píng)審和高層批準(zhǔn)后負(fù)責(zé)安排實(shí)施。

          3、              負(fù)責(zé)收集市場、客戶、項(xiàng)目的數(shù)據(jù)并根據(jù)公司技術(shù)積累、成本因素、資源情況、用戶市場情況制定出銷售所適用的解決方案。

          4、              負(fù)責(zé)的技術(shù)范圍包括:軟件重用、CASE技術(shù)、架構(gòu)設(shè)計(jì)、組件庫規(guī)劃及安排實(shí)施、語言規(guī)范及對(duì)應(yīng)的形式方法。支持的范圍包括語言、數(shù)據(jù)庫、工具。并負(fù)責(zé)向外界尋求組織內(nèi)部無法解決的技術(shù)問題。

          5、              與各軟件項(xiàng)目組一同確定軟件開發(fā)計(jì)劃,向項(xiàng)目組提供可用技術(shù)、已有技術(shù)積累應(yīng)用及相應(yīng)標(biāo)準(zhǔn)開發(fā)方法、開發(fā)工具、語言、過程的選擇。并將在項(xiàng)目中應(yīng)用的情況記錄入過程財(cái)富庫。

          6、              負(fù)責(zé)提供公司的技術(shù)(工具、方法、語言、架構(gòu)等)參考數(shù)據(jù),包括:風(fēng)險(xiǎn)評(píng)價(jià)、公司資源情況、生產(chǎn)率、成本、進(jìn)度、缺陷率、已知問題列表及公司已有技術(shù)積累情況。

          7、              負(fù)責(zé)提供工具、方法、過程、新技術(shù)的培訓(xùn)及指導(dǎo)。

          8、              負(fù)責(zé)收集本組工作結(jié)果,并成文歸檔。估計(jì)其在組織中的效益與影響、風(fēng)險(xiǎn)。決定是否在公司大規(guī)模推廣、否決或重新試驗(yàn)。


          這只是一個(gè)建議書,只是想從實(shí)施后的效果與日常的工作職責(zé)讓老大明白這件事的意義,具體的計(jì)劃與KPA文檔就不一并附上了 。
          posted @ 2008-10-22 21:48 shanghai_spark 閱讀(1629) | 評(píng)論 (7)編輯 收藏

          僅列出標(biāo)題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          主站蜘蛛池模板: 镇巴县| 江都市| 外汇| 曲松县| 小金县| 芒康县| 阿荣旗| 彭水| 翁牛特旗| 怀柔区| 那曲县| 沙坪坝区| 高雄县| 海晏县| 大竹县| 来安县| 丹阳市| 彭州市| 枣庄市| 泽普县| 什邡市| 西宁市| 乌拉特中旗| 大同市| 新丰县| 于田县| 杭州市| 中方县| 渭南市| 峨边| 新源县| 任丘市| 佳木斯市| 灌阳县| 垫江县| 乐平市| 长葛市| 阜阳市| 呼和浩特市| 上杭县| 和顺县|