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));
{
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;
}
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;
}