|

楼主 |
发表于 2014-5-6 01:08:21
|
显示全部楼层
已经实现。现在贴出来分享,希望高手指教提出更好的解决方法。
1、概念设置
首先,将AB概念按教学方法设置主从库。其次,B增加一个关系fCid,类型为概念C,并且在映射设置中增加一个字段为fCid(这样,B就有了2个分别指向A和C的映射字段)。然后,进行概念C的设置:C中设一个单值关系Aid,String类型,以便将来通过A来访问B;再增加一个多值关系Bids,类型为概念B,互逆中设置B的关系fCid。
由于我这里的业务逻辑是:AB为逻辑源头,有AB才有C;A删除则B中相关数据必须删除,C没有AB则继续存在。故在A的互逆关系中设置了级联删除(composition),而C的互逆关系则不设置级联删除(在高级中不配置,其缺省为aggregation)。
2、界面模型
有关AB的应用,直接使用教学里面的主从界面。
而CB的应用,首先按教学方法使用主从界面,C为主B为从。C界面中的数据操作不变,但从概念B的界面中则不能有新建和删除操作,只能查询和修改(前面已经解释了原因)。那么如何把C的数据连接到B呢?
我这里是这样做的(比较复杂,牵涉到有关windowDialog与主界面的数据互传):
在C界面中增加一个trigger,点击事件为打开一个windowDialog,并传入一个参数idFPSQ:C的当前数据行的主键值。另外,在该弹出窗口的receive事件中,要处理器回送数据;这里仅仅是刷新数据,将关联的从数据B显示出来。
这个弹出窗口做2件事情:
(1)选择C对应的A数据行,并将有关A的数据读出来并传回C中。故要按传统使用方法建立数据映射,特别是C的关系Aid一定要映射好(对应到弹出窗口数据的rowID)。
(2)将A中选中的1条主记录所对应的B中从记录关联到C来,就是对B中的这些数据记录的fCid赋值为参数idFPSQ。增加一个trigger来执行此事件。原界面的“确定”“取消”可以保留,作用不一样;只有增加的这个按钮才能进行主从关联。由于弹出窗口向导中没有主从表界面,故只有自己加入一个从表(增加dataDetail数据组件和对应的grid组件;grid一定要有否则会报错,dataDetail要设置dataMaster和主从关系)。
参考代码
BC主从界面的js文件:- var mainActivity = {};
- mainActivity.trigger1Click = function(event){
- var mainData = justep.xbl('dataMaster');
- var idFPSQ = mainData.getCurrentID();
- justep.xbl("selectSaleWindowDialog").open({
- "idFPSQ" : idFPSQ
- }); // 传入本发票申请记录的主键,以便弹出窗口对选中的业务申请明细记录赋值。
- };
- /**
- name:windowDialog#onReceive}
- @param {function} onInit 初始化事件,参见{@link UI.windowDialog#onInit}
- @param {function} onOpen 对话框打开事件,参见{@link UI.windowDialog#onOpen}
- @param {function} onClose 对话框关闭事件,参见{@link UI.windowDialog#onClose}
- description: 构造函数
- @example
- //动态创建
- var dialog = new justep.WindowDialog(id, url, title);
- */
- mainActivity.selectSaleWindowDialogReceive = function(event){
- var detailData = justep.xbl('dataDetail');
- detailData.refreshData();
- // 弹出窗口选定了对应的业务申请单,且对相关业务申请明细记录填入了本发票申请记录的主键值;
- // 这样,这里只要刷新数据就会自动将其作为从表刷出来。
- };
复制代码 弹出窗口界面的js文件:- var selectOneSale = {};
- /**
- name:windowReceiver#onReceive
- @event
- description: <b>[回调型事件]</b> window接收调用者传入的数据
- @param event
- <br/><b>格式说明:</b>
- <xmp>
- {
- "source" : 组件的js对象,
- "data" : 传入的数据
- }
- </xmp>
- @example
- //接受传入的rowid,组成filter刷新data
- 1、data组件上定义filter1 = DEMO_TABLE1 = :rowid
- 2、接管onReceive
- windowReceiverReceive = function(event){
- if(event.data && event.data.rowid){
- var data = justep.xbl('mainData');
- //给变参:rowid赋值
- data.filters.setStringVar('rowid', event.data.rowid);
- data.refreshData();
- }
- }
- */
- var idFPSQ;
- selectOneSale.windowReceiverReceive = function(event){
- idFPSQ = event.data.idFPSQ;
- //alert(idFPSQ);
- };
- /*function justep.SingleList.windowOK(event){
- var dataMain = justep.xbl("main");
- var dataSQMX = justep.xbl("dataSQMX");
- dataSQMX.refreshData(); // Load detail about YWSQ
- for (var i = 0; i < dataSQMX.getCount(); i++) {
- var id = dataSQMX.getID(i);
- data.setValue('fFPSQZKID', idFPSQ, id);
- }
- data.saveData();
- };*/
- selectOneSale.trigger1_11Click = function(event){
- var dataMain = justep.xbl("main");
- var dataSQMX = justep.xbl("dataSQMX");
- dataSQMX.refreshData(); // Load detail about YWSQ
- for (var i = 0; i < dataSQMX.getCount(); i++) {
- var id = dataSQMX.getID(i);
- dataSQMX.setValue('fFPSQZKID', idFPSQ, id);
- }
- dataSQMX.saveData();
- justep.SingleList.windowOK();
- };
复制代码 |
|