处理拥有相似结构的表 & map 和 maps 的区别和使用方法

 
Map和Maps的区别和使用方法:
一、map当作一个哈希表来用:
Map mymap;
mapEnumerator me;
;
Mymap = new map(Types::String,Types::String);
//以这样的格式添加数据
Mymap.insert(key,value);
//获取遍历
Me = map.getEnumerator();
While(me.MoveNext())
{
         Print me.currentKey() + me.currentValue();
}
这是最基本的方法,有关方法请查看MSDN: http://msdn.microsoft.com/en-us/library/aa553382.aspx
二、maps:在系统中不同的表可能会有一些相同属性的字段,而且这些字段的处理逻辑也非常相似,但是他们的字段名可能完全不相同,为了减少代码量可以使用Maps。
        也就是说,我们创建一个Maps,将相关表的字段映射到该maps,然后再该Maps上添加出来这些字段的方法,通过用相关表的实例来初始该maps的变量,执行相应方法就可以操作该相关表了。一下是一个例子:
将创建一个Map映射到CustTable和myTable共有的字段
1.       在AOT的Map节点右击新建Map,命名为“MyMap”
2.       将EDT中的 AccountNum, CustName, CustGroupId CustCurrencyCode 拖入到“ MyMap ”中
3.       保存并 RESTORE
4.       在“myMap”的mapping节点下新建映射,选择映射表为CUSTTABLE,在映射下选择映射字段,选择对应的字段进行关联,在CUSTTABLE中对应的字段有 accountNum, name, currency and custGroup.
5.       按照同样的方法添加 MyTable
6.       在“ MyMap ”的 Methods 方法下添加方法(测试用):
void listRecords(MyMap _myMap)
{
;
while select _myMap
{
info(strFmt("%1, %2", _myMap.accountNum, _myMap.custName));
}
}
7.       保存
以下是一个用来打印用来初始化MAPS的记录的值:
static void DataDic_TestMyMap(Args _args)
{
MyMap myMap;
CustTable custTable;
MyTable myTable;
;
myMap.listRecords(myTable);
}
注意这里 MAP 完全是被声明为一个表来使用的。
同样也可以这样使用:
Tablename.mapsname::mapsmethos(parameter);
表名后边加点以后直接打上该表关联的MAPS名字,然后“::”号再加上MAPS的方法,括号中传上参数。这样可以直接调用MAPS的方法来修改该表的数据。
还有一种用法,如:
MyMap myMap;
MyTable myTable;
;
myMap = myTable;
ttsbegin;
select forupdate myMap;
myMap.fields = value;
myMap.insert();
ttscommit;
注意是一定要用事务的。
 
处理拥有相似结构表的一些方法
(以下部分引用自 http://www.cnblogs.com/soondy/articles/856908.html,本人做过一些修改)
 
方法1 :(我个人认为这样的方法灵活性太低,不过看看这段代码可以学习Dict的使用)
使用common复制表内容:
Static Common RecordCopy(Common _from,Common _to)
         {
             Dictionary      dict;
             DictTable       dictTableFrom;
             DictTable       dictTableTo;
             DictField       dictFieldFrom;
             DictField       dictFieldTo;
             Integer         recCnt;
             ;
             dictTableFrom = new DictTable(_from.TableId);
             dictTableTo = new DictTable(_to.TableId);
             for (recCnt = 1;recCnt <= dictTableTo.fieldCnt();recCnt ++)
             {
                 dictFieldTo = dictTableTo.fieldObject(dictTableTo.fieldCnt2Id(recCnt));
                //系统字段一般是由系统来维护的,所以一下判断的结果是不复制系统字段
                 if (!dictFieldTo.isSystem())
                 {
                     if (dictFieldTo.name() == "oldRecId")
                         dictFieldFrom = dictTableFrom.fieldObject(dictTableFrom.fieldName2Id("RecId"));
                     else
                         dictFieldFrom = dictTableFrom.fieldObject(dictTableFrom.fieldName2Id(dictFieldTo.name()));
                     if (dictFieldFrom && dictFieldFrom.type() == dictFieldTo.type())
                     {
                         _to.(dictFieldTo.id()) = _from.(dictFieldFrom.id());
                     }
                 }
             }
             return _to;
         }
 

方法2:
要把这些表放到同一个Map中,并建立字段的映射:

static void CopyData(Args _args)
{
JournalTableMap journalTableMapCopyFrom;
JournalTableMap journalTableMapCopyTo;
InventJournalTable inventJournalTable;
ProdJournalTable   prodJournalTable;
;

select firstonly inventJournalTable
where inventJournalTable.JournalId == '000010_080';

journalTableMapCopyFrom = inventJournalTable;
journalTableMapCopyTo = prodJournalTable;

//这里需要注意的是直接赋值和使用data方法复制的区别,如果直接赋值,如a=b,对于表变量,我们是在进行引用传递,而data()则是值传递。
journalTableMapCopyTo.data(journalTableMapCopyFrom);

print journalTableMapCopyTo.journalId;
pause;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值