0

問題の解決策を見つけることができません。私は4つのテーブルを持っています:

BomModule:このテーブルは、データベース内のモジュールを表します。

CREATE TABLE "BOMMODULE"
(
    "MODULEID" NUMBER(10,0) NOT NULL ENABLE,
    "ISROOTMODULE"     NUMBER(1,0) NOT NULL ENABLE,
    "MODULENAME"       VARCHAR2(255 CHAR),
    ...
)

BomItem:このテーブルは、リーフまたはデータベース内のアイテムを表します。

CREATE TABLE "BOMITEM"
(
    "ITEMID"     NUMBER(10,0) NOT NULL ENABLE,
    ...
)

ModuleConnection:このテーブルは、モジュールを別の親モジュールにマップします。特定の親モジュールに属するサブモジュールの数を定義できます。

CREATE TABLE "MODULECONNECTION"
(
    "ID"       NUMBER(10,0) NOT NULL ENABLE,
    "QUANTITY"   NUMBER(10,0) NOT NULL ENABLE,
    "SUBMODULE_MODULEID"   NUMBER(10,0) NOT NULL ENABLE,
    "PARENTMODULE_MODULEID" NUMBER(10,0) NOT NULL ENABLE,
    ...
)

ItemModuleConnection: このテーブルは、すべてのleave-itemをモジュールにマップします。さらに、1つのモジュールのアイテムの数量を定義できます。

CREATE TABLE "ITEMMODULECONNECTION"
(
    "ID"       NUMBER(10,0) NOT NULL ENABLE,
    "QUANTITY" NUMBER(10,0) NOT NULL ENABLE,
    "ITEMID"   NUMBER(10,0),
    "MODULEID" NUMBER(10,0),
    ...
)

表の構造からわかるように、アイテムとモジュールは相互に接続されており、数量が異なります。これらの接続は非常に柔軟であるため、SQLステートメントを作成できません。これにより、アイテムの合計数量がわかります。

select quantity from ...... where itemId = xy;

SQLステートメントは、アイテムからルートモジュールまでのすべての数量をチェックし、それらを乗算する必要があります。

2 x rootmodule (total 2)
-- 1x submodule 1 (total 2)
-- 2x submodule 2 (total 4)
---- 5x item 1 (total 20)
---- 6x item 2 (total 24)

このSQLステートメントの作成を手伝ってください。あなたの答えに感謝します!

制約:-SQL
ステートメントである必要があります(Javaアプリケーションで使用されます)
-データベースはOracle11gです

4

2 に答える 2

0

必要なのは、オラクルのconnect byandstart with句です。申し訳ありませんが、SQL ステートメントを実際に作成する時間がありませんが、構文は次の場所で説明されています: http://www.adp-gmbh.ch/ora/sql/connect_by.html

于 2012-05-08T10:29:26.313 に答える
0

SQL の代わりに Java を使用することで、この問題を解決できました。これが私のアプローチです:

/**
 * This recursive functions interates through the whole tree and checks if there are items and modules.
 * As soon as an item is found, it is multiplied with the module amount. The result is saved in a HashMap. 
 * This HashMap is being parsed in the end.
 */
public HashMap<Integer, Integer> updateBom(HashMap<Integer, Integer> bom, BomModule module, int amount, BomHandling bh) {
    if(bom == null) {
        bom = new HashMap<Integer, Integer>();
    }
    // get all items for this parent module
    Collection<ItemModuleConnection> items = bh.getItems(module.getModuleId());
    Iterator<ItemModuleConnection> itemIterator = items.iterator();

    while(itemIterator.hasNext()) {
        ItemModuleConnection con = itemIterator.next();

        int itemQuantity = con.getQuantity() * amount;

        // if bom item already exists in bom list, get it and update quantity
        Integer currentItemQuantity = new Integer(0);
        if(bom.containsKey(new Integer(con.getItem().getItemId()))) {
            currentItemQuantity = bom.get(con.getItem().getItemId());
            bom.remove(bom.get(con.getItem().getItemId()));
        }
        bom.put(con.getItem().getItemId(), currentItemQuantity + itemQuantity);
    }

    // get all modules for this parent module
    Collection<ModuleConnection> modules = bh.getConnections(module.getModuleId());
    Iterator<ModuleConnection> moduleIterator = modules.iterator();

    // set the quantity of the module by multiplying it with the amount
    while(moduleIterator.hasNext()) {
        ModuleConnection moduleCon = moduleIterator.next();
        int moduleQuantity = moduleCon.getQuantity();
        updateBom(bom, moduleCon.getSubModule(), moduleQuantity * amount, bh);
    }
    return bom;
}

単一のアイテムを出力する前に、この updateBom() 関数を呼び出して、HashMap から値を取得します。

HashMap<Integer, Integer> bom = updateBom(null, bomModule, 1, bh);
Iterator<Map.Entry<Integer, Integer>> entries = bom.entrySet().iterator();

while (entries.hasNext()) {

    Map.Entry<Integer, Integer> bomEntry = entries.next();
    BomItem item = bh.getBomItem(bomEntry.getKey());
    Integer itemAmount = bomEntry.getValue();

    ...
}
于 2012-05-09T09:01:22.600 に答える