private void btnAdd_Click(object sender, EventArgs e) { Transaction newTran = null; if (cmbType.Text == "期貨/期權合約") { newTran = new FutureTransaction(); ((FutureTransaction)newTran).contractCode = txtContractCode.Text; } else newTran = new Transaction(); if (string.IsNullOrEmpty(txtCode.Text)) { MessageBox.Show("編號輸入錯誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } newTran.code = txtCode.Text; newTran.date = dtpDate.Value.Date; if (!string.IsNullOrEmpty(txtAmount.Text) && !double.TryParse(txtAmount.Text, out newTran.amount)) { MessageBox.Show("數量輸入錯誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!string.IsNullOrEmpty(txtPayment.Text) && !double.TryParse(txtPayment.Text, out newTran.payment)) { MessageBox.Show("交易金額輸入錯誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } newTran.description = txtDescription.Text; try { _profolioMgr.AddTransaction(newTran); } catch { MessageBox.Show("交易加入失敗!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } MessageBox.Show("交易加入成功", "加入交易", MessageBoxButtons.OK, MessageBoxIcon.Information); }
private void _DoQuery(object param) { object[] plist = (object[])param; DateTime from = (DateTime)plist[0]; DateTime to = (DateTime)plist[1]; try { if (from != DateTime.MinValue) { LinkedList<Transaction> oldTran = _profolioMgr.GetAggregatedTransaction(typeof(Transaction), txtCode.Text, DateTime.MinValue, from.AddDays(-1)); foreach (Transaction t in oldTran) { if (t.amount != 0) { _prevBalance.Add(t.code, t); Transaction curPostBalance = new Transaction(); curPostBalance.code = t.code; curPostBalance.date = to; curPostBalance.amount = -t.amount; _postBalance.Add(t.code, curPostBalance); } } LinkedList<Transaction> oldFutureTran = _profolioMgr.GetAggregatedTransaction(typeof(FutureTransaction), txtCode.Text, DateTime.MinValue, from.AddDays(-1)); foreach (Transaction ft in oldFutureTran) { if (ft.amount != 0) { SortedDictionary<string, FutureTransaction> curPrevBalanceFutureDict; if (!_prevBalanceFuture.TryGetValue(ft.code, out curPrevBalanceFutureDict)) { curPrevBalanceFutureDict = new SortedDictionary<string, FutureTransaction>(); _prevBalanceFuture.Add(ft.code, curPrevBalanceFutureDict); } curPrevBalanceFutureDict.Add(((FutureTransaction)ft).contractCode, (FutureTransaction)ft); SortedDictionary<string, FutureTransaction> curPostBalanceFutureDict; if (!_postBalanceFuture.TryGetValue(ft.code, out curPostBalanceFutureDict)) { curPostBalanceFutureDict = new SortedDictionary<string, FutureTransaction>(); _postBalanceFuture.Add(ft.code, curPostBalanceFutureDict); } FutureTransaction curPostFutureBalance = new FutureTransaction(); curPostFutureBalance.code = ft.code; curPostFutureBalance.contractCode = ((FutureTransaction)ft).contractCode; curPostFutureBalance.date = to; curPostFutureBalance.amount = -ft.amount; curPostBalanceFutureDict.Add(((FutureTransaction)ft).contractCode, curPostFutureBalance); } } } _tran = _profolioMgr.GetTransaction(typeof(Transaction), txtCode.Text, from, to); _futureTran = _profolioMgr.GetTransaction(typeof(FutureTransaction), txtCode.Text, from, to); } catch (Exception ex) { MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _UpdateTransactionCB updateTranCB = new _UpdateTransactionCB(_UpdateDgvTransaction); List<Transaction> updateTranCbData = new List<Transaction>(); //Process transaction data { LinkedListNode<Transaction> t = _tran.First, ft = _futureTran.First; while (t != null || ft != null) { if (ft == null || (t != null && t.Value.date <= ft.Value.date)) { updateTranCbData.Add(t.Value); List<Transaction> curTransactionLst; if (!_tranDct.TryGetValue(t.Value.code, out curTransactionLst)) { curTransactionLst = new List<Transaction>(); _tranDct.Add(t.Value.code, curTransactionLst); } curTransactionLst.Add(t.Value); t = t.Next; } else { updateTranCbData.Add(ft.Value); SortedDictionary<string, List<FutureTransaction>> curDct; if (!_tranFutureDct.TryGetValue(ft.Value.code, out curDct)) { curDct = new SortedDictionary<string, List<FutureTransaction>>(); _tranFutureDct.Add(ft.Value.code, curDct); } List<FutureTransaction> curTransactionFutureLst; if (!curDct.TryGetValue(((FutureTransaction)ft.Value).contractCode, out curTransactionFutureLst)) { curTransactionFutureLst = new List<FutureTransaction>(); curDct.Add(((FutureTransaction)ft.Value).contractCode, curTransactionFutureLst); } curTransactionFutureLst.Add((FutureTransaction)ft.Value); ft = ft.Next; } } } foreach (KeyValuePair<string, List<Transaction>> kwp in _tranDct) { Transaction curNetTran = new Transaction(); curNetTran.code = kwp.Key; curNetTran.date = to; curNetTran.amount = 0; curNetTran.payment = 0; curNetTran.description = "淨交易"; foreach (Transaction t in kwp.Value) { curNetTran.amount += t.amount; curNetTran.payment += t.payment; } _netTran.Add(curNetTran.code, curNetTran); if (curNetTran.amount != 0) { Transaction curPostBalance; if (!_postBalance.TryGetValue(curNetTran.code, out curPostBalance)) { curPostBalance = new Transaction(); curPostBalance.code = curNetTran.code; curPostBalance.date = to; curPostBalance.amount = 0; _postBalance.Add(curPostBalance.code, curPostBalance); } curPostBalance.amount -= curNetTran.amount; if (curPostBalance.amount == 0) _postBalance.Remove(curPostBalance.code); } } foreach (KeyValuePair<string, SortedDictionary<string, List<FutureTransaction>>> kwp in _tranFutureDct) { FutureTransaction curNetTranFuture = new FutureTransaction(); curNetTranFuture.code = kwp.Key; curNetTranFuture.contractCode = "淨期貨交易"; curNetTranFuture.date = to; curNetTranFuture.amount = 0; curNetTranFuture.payment = 0; curNetTranFuture.description = "淨交易"; foreach (KeyValuePair<string, List<FutureTransaction>> kwp2 in kwp.Value) { double tmpAmount = 0; double tmpPayment = 0; foreach (FutureTransaction ft in kwp2.Value) { tmpAmount += ft.amount; tmpPayment += ft.payment; } curNetTranFuture.amount += tmpAmount; curNetTranFuture.payment += tmpPayment; if (tmpAmount != 0) { SortedDictionary<string, FutureTransaction> curPostBalanceDct; if (!_postBalanceFuture.TryGetValue(kwp.Key, out curPostBalanceDct)) { curPostBalanceDct = new SortedDictionary<string, FutureTransaction>(); _postBalanceFuture.Add(kwp.Key, curPostBalanceDct); } FutureTransaction curPostBalance; if (!curPostBalanceDct.TryGetValue(kwp2.Key, out curPostBalance)) { curPostBalance = new FutureTransaction(); curPostBalance.code = kwp.Key; curPostBalance.contractCode = kwp2.Key; curPostBalance.date = to; curPostBalance.amount = 0; curPostBalanceDct.Add(kwp2.Key, curPostBalance); } curPostBalance.amount -= tmpAmount; if (curPostBalance.amount == 0) curPostBalanceDct.Remove(kwp2.Key); if (curPostBalanceDct.Count == 0) curPostBalanceDct.Remove(kwp.Key); } } _netTranFurture.Add(curNetTranFuture.code, curNetTranFuture); } Invoke(updateTranCB, new object[] { updateTranCbData }); //Process return data if (_prevBalance.Count > 0) { SortedDictionary<Pair<string, string>, double> asset = new SortedDictionary<Pair<string, string>, double>(); foreach (string code in _prevBalance.Keys) asset.Add(new Pair<string, string>(code, "-"), 0); try { _profolioMgr.GetHistorialPrice(asset, from.AddDays(-1)); } catch (Exception ex) { MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } foreach (KeyValuePair<Pair<string, string>, double> kwp in asset) { Transaction curTran = _prevBalance[kwp.Key.First]; curTran.payment = -curTran.amount * kwp.Value; } } if (_prevBalanceFuture.Count > 0) { SortedDictionary<Pair<string, string>, double> asset = new SortedDictionary<Pair<string, string>, double>(); foreach (KeyValuePair<string, SortedDictionary<string, FutureTransaction>> stock in _prevBalanceFuture) { foreach (string contractCode in stock.Value.Keys) asset.Add(new Pair<string, string>(stock.Key, contractCode), 0); } try { _profolioMgr.GetHistorialPrice(asset, from.AddDays(-1)); } catch (Exception ex) { MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } foreach (KeyValuePair<Pair<string, string>, double> kwp in asset) { Transaction curTran = _prevBalanceFuture[kwp.Key.First][kwp.Key.Second]; curTran.payment = -curTran.amount * kwp.Value; } } if (_postBalance.Count > 0) { if (to < DateTime.Today) { SortedDictionary<Pair<string, string>, double> asset = new SortedDictionary<Pair<string, string>, double>(); foreach (string code in _postBalance.Keys) asset.Add(new Pair<string, string>(code, "-"), 0); try { _profolioMgr.GetHistorialPrice(asset, to); } catch (Exception ex) { MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } foreach (KeyValuePair<Pair<string, string>, double> kwp in asset) { Transaction curTran = _postBalance[kwp.Key.First]; curTran.payment = -curTran.amount * kwp.Value; } } else { List<StockData> asset = new List<StockData>(); foreach (string code in _postBalance.Keys) { StockData stockData = new StockData(); stockData.code = code; asset.Add(stockData); } try { _stockMgr.GetQuote(asset.ToArray()); } catch (Exception ex) { MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } foreach (StockData stock in asset) { Transaction curTran = _postBalance[stock.code]; curTran.date = DateTime.Today; curTran.payment = -curTran.amount * stock.close; } } } if (_postBalanceFuture.Count > 0) { SortedDictionary<Pair<string, string>, double> asset = new SortedDictionary<Pair<string, string>, double>(); foreach (KeyValuePair<string, SortedDictionary<string, FutureTransaction>> stock in _postBalanceFuture) { foreach (string contractCode in stock.Value.Keys) asset.Add(new Pair<string, string>(stock.Key, contractCode), 0); } try { _profolioMgr.GetHistorialPrice(asset, to); } catch (Exception ex) { MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } foreach (KeyValuePair<Pair<string, string>, double> kwp in asset) { Transaction curTran = _postBalanceFuture[kwp.Key.First][kwp.Key.Second]; if (to >= DateTime.Today) curTran.date = DateTime.Today; curTran.payment = -curTran.amount * kwp.Value; } } Invoke(new _UpdateReturnCB(_UpdateReturn)); }
public LinkedList<Transaction> GetAggregatedTransaction(Type tranType, string code, DateTime from, DateTime to) { OleDbCommand cmd = dbConn.CreateCommand(); LinkedList<Transaction> result = new LinkedList<Transaction>(); string filterStr = _MakeFilterString(code, from, to); if (!string.IsNullOrEmpty(filterStr)) filterStr = " WHERE " + filterStr; if (tranType == typeof(Transaction)) { cmd.CommandText = "SELECT code, SUM(amount), SUM(payment) FROM Investment" + filterStr + " GROUP BY code" + " ORDER BY code"; } else if (tranType == typeof(FutureTransaction)) { cmd.CommandText = "SELECT code, SUM(amount), SUM(payment), contract_code FROM Future" + filterStr + " GROUP BY code, contract_code" + " ORDER BY code, contract_code"; } OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Transaction curTran; if (tranType == typeof(Transaction)) curTran = new Transaction(); else { curTran = new FutureTransaction(); ((FutureTransaction)curTran).contractCode = (string)reader["contract_code"]; } curTran.code = (string)reader["code"]; curTran.date = to; curTran.amount = (double)reader[1]; curTran.payment = (double)reader[2]; curTran.description = "綜合交易"; result.AddLast(curTran); } return result; }
public LinkedList<Transaction> GetTransaction(Type tranType, string code, DateTime from, DateTime to) { OleDbCommand cmd = dbConn.CreateCommand(); LinkedList<Transaction> result = new LinkedList<Transaction>(); string filterStr = _MakeFilterString(code, from, to); if (!string.IsNullOrEmpty(filterStr)) filterStr = " WHERE " + filterStr; if (tranType == typeof(Transaction)) { cmd.CommandText = "SELECT code, tran_date, amount, payment, description FROM Investment" + filterStr + " ORDER BY tran_date"; OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Transaction curTran = new Transaction(); curTran.code = (string)reader["code"]; curTran.date = DateTime.Parse(reader["tran_date"].ToString()); curTran.amount = (double)reader["amount"]; curTran.payment = (double)reader["payment"]; curTran.description = (string)reader["description"]; result.AddLast(curTran); } } else if (tranType == typeof(FutureTransaction)) { cmd.CommandText = "SELECT code, contract_code, tran_date, amount, payment, description FROM Future" + filterStr + " ORDER BY tran_date"; OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { FutureTransaction curTran = new FutureTransaction(); curTran.code = (string)reader["code"]; curTran.contractCode = (string)reader["contract_code"]; curTran.date = DateTime.Parse(reader["tran_date"].ToString()); curTran.amount = (double)reader["amount"]; curTran.payment = (double)reader["payment"]; curTran.description = (string)reader["description"]; result.AddLast(curTran); } } else throw new NotImplementedException("Unknow transaction"); return result; }