Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用数据库时如何将Anylogic对象(INode)用作类型_Excel_Database_Anylogic_Inode - Fatal编程技术网

Excel 使用数据库时如何将Anylogic对象(INode)用作类型

Excel 使用数据库时如何将Anylogic对象(INode)用作类型,excel,database,anylogic,inode,Excel,Database,Anylogic,Inode,问题:我有数据库表(导入的excel),其中包含订单和位置。订单有一个名为“目的地”的列,该列被交叉引用(使用“外键”引用locations.location)到location列locations表,该表应该表示实际的INode。如何在moveTo块中指定此地址 我没有看到可以在数据库表中将INode指定为类型的选项。如果选择Other作为类型并尝试写入INode,则会出现权限错误 如何在代码或操作行中实现这种交叉引用?它已使用代理表/参数中的外键设置 不能将任何逻辑对象(如INode)表示为

问题:我有数据库表(导入的excel),其中包含订单位置。订单有一个名为“目的地”的列,该列被交叉引用(使用“外键”引用locations.location)到location列locations表,该表应该表示实际的INode。如何在moveTo块中指定此地址

  • 我没有看到可以在数据库表中将INode指定为类型的选项。如果选择Other作为类型并尝试写入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) );
    }