【问题标题】:Anylogic Distribution Network connection from database来自数据库的 Anylogic 配电网络连接
【发布时间】:2019-08-27 18:38:32
【问题描述】:

我有一个关于我正在尝试构建的 Anylogic 模型的具体问题。

我有 3 张桌子:

  1. 与列 connecteddcconnectedcustomer 的连接
  2. 具有列 custname需求 的客户
  3. dcdetails 列 dcnamedccapactiy

我正在尝试编写一个 java 代码,将第一个表 (connecteddc) 中的每个 dc 连接到分配的每个客户 (connectedcustomer) 并多次迭代此过程建立准确的网络。我尝试过使用几种代码变体,如下所示。

for (int i=0; i<3 ; i++){
        dc.get(i).LinktoCustomers.connectTo(Locations.get(selectFirstValue(false, int.class, "SELECT connectedcustomer FROM connections WHERE connectedDC = "+i+";")));
}

此代码仅将 1 个 DC 连接到 1 个客户。此问题出现在代码的“selectFirstValue”部分。

【问题讨论】:

    标签: java anylogic


    【解决方案1】:

    数据库查询

    您必须使用其中一种方法来检索所有相关的数据库条目,而不是像使用selectFirstValue() 那样只检索第一个。这是这样做的一种选择:

    for (int i=0; i<dc.size() ; i++){
        List<Tuple> rows = selectFrom(connection)
            .where(connection.connecteddc.eq(dc.get(i).dcName))
            .list();
    
        for (Tuple row : rows) {
            dc.get(i).connectTo(getCustomerByName(row.get(connection.connectedcustomer)));
        }
    }
    

    提示:AnyLogic 为您提供了创建此类查询的助手,您可以在 AnyLogic 工具栏中的“插入数据库查询”下找到该助手。它看起来像这样: AnyLogic Database Query Assistant

    其他内容

    我修改了一些引起我注意的其他内容:

    • 要添加连接,请使用dc.get(i).LinktoCustomers.connectTo(...)。不必为连接使用特殊变量,只需使用以下命令将其添加到标准连接即可:dc.get(i).connectTo(...)
    • 您可以浏览具有硬编码最大索引的 DC 列表。一旦您更改 DC 表中的条目数,该代码将不再起作用。我推荐这样的东西:for (int i=0; i&lt;dc.size() ; i++){...}
    • 您为“客户”类型的代理群体命名为“位置”。使用完全不反映基础代理类型的群体名称会令人困惑。我建议将其重命名,例如“客户”。
    • 要访问您的 DC,您可以在表中存储并使用 DC 的索引号作为整数。为了安全起见,我建议改用唯一的字符串 ID,即使您更改表的顺序也可以使用。为此,您需要将 Id(存储在表中)“解析”为 Customer 对象。

    这可以在这样的函数getCustomerByName(String name) 中完成(尽管这显然缺乏错误处理):

    for(Customer c:Customers){
        if(c.custName.equals(name)){
            return c;
        }
    }
    return null;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多