2016-11-03 8 views
0

私はDexie.jsを使用してJavaScriptで単純な在庫/販売アプリケーションを作成しようとしています。私は、1つの製品の合計販売数量に対して複数回クエリを実行するひどい再帰的コードを書くことなく、トータルセールス金額を返す方法についてはわかりません。IndexedDBデータベース内の複数のテーブルからの合計売上をどのように計算する必要がありますか?

私のスキーマは次のように多少です:私は、価格やその他の詳細は、「製品」には、製品の種類を保存

clients: "++id, name, phone", 
order: "++id, clientId, daate", 
order_content: "orderId, productId, qty", 
product: "++id, name, mu, mk_cost, sa_cost, prod_cost", 
stock: "++id, date, productId, qty, lot" 

。注文が置かれると、私はclientIdをOrderに格納し、orderIdをソートするキーとしてそこにアイテムを格納するために "order_content"を使用します。

私は基本的にすべてのアイテムとその合計を合計したいと思っています。

以下のコードをdb.product.each()ループで実行しようとしましたが、私は自分自身を複雑にしているようです。

var product1Total = 0; 
function calculateTotal(productId, price){ 
db.order_content 
.where("productID") 
.equals(productId) 
.each(function(item){ 
product1Total += (price * qty) 
}) 
} 

ありがとうございます!

答えて

2

あなたの目標は、単一のクエリ内の特定の注文の合計価格を取得することで、prod_costはあなたの製品のコストで、あなたは合計をしたい場合

function calculateTotal (orderId) { 
    return db.order_content 
     .where('orderId').equals(orderId).toArray() 
    .then(orderContents => { 
     return Promise.all(
      orderContents.map(oc => db.product.get(oc.productId)) 
     ).then (products => { 
      return orderContents.reduce (
       (total, oc, i) => total + oc.qty * producs[i].prod_cost, 0); 
     }); 
    }); 
} 

または非同期の機能を持つ:

特定の順序のために、あなたはそれを、次のような何かを行う必要があります

それともバニラES5のJavaScriptを使用して:

function calculateTotal (orderId) { 
    return db.order_content 
     .where('orderId').equals(orderId).toArray() 
    .then(function (orderContents) { 
     return Dexie.Promise.all(
      orderContents.map(function (oc) { 
       return db.product.get(oc.productId); 
      }) 
     ).then (function (products) { 
      return orderContents.reduce (
       function (total, oc, i) { 
        return total + oc.qty * producs[i].prod_cost; 
       }, 0); 
     }); 
    }); 
} 
+0

うん、これは私が望んでいたまさにです。漠然とした投稿には申し訳ありません。それもバニラJSでこれを行うことは可能ですか? –

+0

私はちょうど最初のサンプルで矢印関数を使用しています。 「function(oc){return ...}」を含む「orderContents => {...}」を「function(orderContents){...}」および「oc => ...」に置き換えます。 –

1

クエリに間違いはありませんが、プロミスを返す関数でカプセル化する必要があります。これはDexieのCollection.each()から返された約束を連鎖することで簡単に達成できます。

function calculateTotal(productId, price) { 
    var total = 0; 
    return db.order_content 
     .where("productID") 
     .equals(productId) 
     .each(function(item){ 
      total += (price * item.qty) 
     }).then (function() { 
      return total; 
     }); 
} 

またはES7で:

async function calculateTotal (productId, price) { 
    var total = 0; 

    await db.order_content 
     .where("productID") 
     .equals(productId) 
     .each (item => total += (price * item.qty)); 

    return total; 
} 
関連する問題