Excel 使用数据库时如何将Anylogic对象(INode)用作类型
问题:我有数据库表(导入的excel),其中包含订单和位置。订单有一个名为“目的地”的列,该列被交叉引用(使用“外键”引用locations.location)到location列locations表,该表应该表示实际的INode。如何在moveTo块中指定此地址Excel 使用数据库时如何将Anylogic对象(INode)用作类型,excel,database,anylogic,inode,Excel,Database,Anylogic,Inode,问题:我有数据库表(导入的excel),其中包含订单和位置。订单有一个名为“目的地”的列,该列被交叉引用(使用“外键”引用locations.location)到location列locations表,该表应该表示实际的INode。如何在moveTo块中指定此地址 我没有看到可以在数据库表中将INode指定为类型的选项。如果选择Other作为类型并尝试写入INode,则会出现权限错误 如何在代码或操作行中实现这种交叉引用?它已使用代理表/参数中的外键设置 不能将任何逻辑对象(如INode)表示为
不能将任何逻辑对象(如
INode
)表示为数据库项。相反,您可以存储有关节点的特征,并在模型开始时以编程方式创建节点
所以存储X/Y坐标等东西
下面是一个GIS点示例,向您展示该方法。您需要对INode执行类似的操作(查看INode API的AnyLogic帮助以了解如何创建它们)
我将位置名称作为字符串存储在数据库中:
在模型启动时,我通过编程从数据创建GISPoint
元素(假设我有一个名为map
的GIS地图):
List rows=selectFrom(路由)
.list();
for(元组行:行){
GISPoint locationFrom=map.searchFirst(row.get(routes.location_from));
GISPoint locationTo=map.searchFirst(row.get(routes.location_to));
地图。添加(位置从);
地图。添加(位置到);
GISRoute route=map.getRoute(locationFrom.getLatitude(),locationFrom.getLength(),
locationTo.getLatitude(),locationTo.getLatitude());
路线:setLineColor(光谱颜色(均匀分布(1,10,10));
}
思想:解析
我同意Benjamin的观点:您不能直接保存对INode的Java对象的引用。如果仍要使用预定义的索引节点,可以将节点的文本名称保存在Excel/数据库中,然后将其解析(“转换”)为具有此名称的索引节点的引用
怎么做
为了做好准备,最简单的方法是手动将可能要检索的所有inode放入一个集合中,例如,我将其命名为allmyinode
:
然后可以使用解析函数,下面是一个建议:
INode getINodeByName(字符串节点名)
:
INode-myNode;
myNode=allMyINodes.stream()
.filter(c->c.getName().equals(nodeName))
.findAny()
.orElse(空);
返回myNode;
这里是Anylogic云中的一个示例,您也可以在那里运行和下载源文件
将其应用到您的场景中
在您的应用程序中,这意味着,例如在moveTo块中,您可以编写
getINodeByName(……这里是从数据库中获取一个节点名的代码……)
用于INode类型的目标
至于你的第二个问题,即如何根据找到的订单和键链接检索位置,我认为这是一个单独的问题,并且仅与数据库/SQL相关,也许你可以在这篇文章中单独打开一个带有SQL标记的帖子。谢谢你的回复,我希望我可以把它放在电子表格里,当它改变的时候再更新。谢谢Florian。谢谢你上传这个例子。我使用函数和case/switch语句实现了类似的功能。我从未使用过过滤器/流,对lambda只有初步的了解。因此,我将使用这个简单的案例来获得更多的信息。
List<Tuple> rows = selectFrom(routes)
.list();
for (Tuple row : rows) {
GISPoint locationFrom = map.searchFirst(row.get( routes.location_from ));
GISPoint locationTo = map.searchFirst(row.get( routes.location_to ));
map.add(locationFrom);
map.add(locationTo);
GISRoute route = map.getRoute(locationFrom.getLatitude(), locationFrom.getLongitude(),
locationTo.getLatitude(), locationTo.getLongitude());
route.setLineColor( spectrumColor(uniform_discr(1,10), 10) );
}