/// <summary> /// 仕訳データ取込 /// </summary> /// <param name="path"></param> public static void AddShiwakeFromCSV(bool isAppend) { string path = ""; using (var dialog = new OpenFileDialog()) { dialog.Filter = "CSV Files|*.csv"; dialog.Multiselect = false; if (dialog.ShowDialog() == DialogResult.OK) { path = dialog.FileName; } else { return; } } try { if (!isAppend) { SaveShiwakeXML(); Static.ShiwakeDs.Shiwake.Clear(); } new Exception(); // ============================== // 弥生会計のフォーマット // ============================== // 1 - 必須 - 識別フラグ // 2 - 任意 - 伝票No // 3 - 任意 - 決算 // 4 - 必須 - 取引日付 ○ // 5 - 必須 - 借方勘定科目 ○ // 6 - 任意 - 借方補助科目 ○ // 7 - 任意 - 借方部門 // 8 - 必須 - 借方税区分 // 9 - 必須 - 借方金額 ○ // 10 - 任意 - 借方税金額 // 11 - 必須 - 貸方勘定科目 ○ // 12 - 任意 - 貸方補助科目 ○ // 13 - 任意 - 貸方部門 // 14 - 必須 - 貸方税区分 // 15 - 必須 - 貸方金額 // 16 - 任意 - 貸方税金額 // 17 - 任意 - 摘要 ○ // 18 - 任意 - 番号 // 19 - 任意 - 期日 // 20 - 必須 - タイプ // 21 - 任意 - 生成元 // 22 - 任意 - 仕訳メモ // 23 - 任意 - 付箋1 // 24 - 任意 - 付箋2 // 25 - 必須 - 調整 // ============================== // // Ole DBと同じになるように処理を組み立てる // // Ole は、インストールが必要だから廃止 // var parser = new TextFieldParser(path, Encoding.GetEncoding("Shift_JIS")); parser.SetDelimiters(","); var dt = new DataTable(); for (int i = 1; i < 26; i++) { dt.Columns.Add("F" + i.ToString(), typeof(string)); } while (!parser.EndOfData) { var csvCells = parser.ReadFields(); var row = dt.NewRow(); if (csvCells.Length != 25) { MessageBox.Show("取込データの列数が弥生の仕訳データと異なるため、取り込めません。", "取込エラー", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } for (int i = 0; i < 25; i++) { row[i] = csvCells[i]; } dt.Rows.Add(row); } //// CSVファイル読み込み(Ole.4.0 をインストールしないと動かないので、独自で読み込む) //string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.IO.Path.GetDirectoryName(path) + ";Extended Properties=\"text;HDR=No;FMT=Delimited\""; //var con = new System.Data.OleDb.OleDbConnection(conString); //var da = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [" + System.IO.Path.GetFileName(path) + "]", con); //da.Fill(dt); //if (dt.Columns.Count != 25) //{ // MessageBox.Show("取込データの列数が弥生の仕訳データと異なるため、取り込めません。", "取込エラー", MessageBoxButtons.OK, MessageBoxIcon.Information); // return; //} dt.Columns.Add("Error", typeof(string)); int rowNo = 1; foreach (DataRow row in dt.Rows) { string errorMsg = ""; DateTime o = new DateTime(); // 取引日付 if (row["F4"].ToString() == "") { errorMsg += "取引日付が空白です;"; } else { if (!DateTime.TryParse(row["F4"].ToString(), out o)) { errorMsg += "取引日付が日付ではありません;"; } if (o.Year != Static.Nendo) { errorMsg += "取引日付が年度と異なります;"; } } // 勘定科目 if (row["F5"].ToString() == "") { errorMsg += "借方勘定科目が空白です;"; } else if (!Static.KmkList.Any(x => x.KmkName == row["F5"].ToString())) { errorMsg += "借方勘定科目がシステムで認識できない為、外取り込めません;"; } decimal d = 0; if (row["F9"].ToString() == "") { errorMsg += "借方金額が空白です;"; } else { if (!decimal.TryParse(row["F9"].ToString(), out d)) { errorMsg += "借方金額が数値ではありません;"; } } if (row["F11"].ToString() == "") { errorMsg += "貸方勘定科目が空白です;"; } else if (!Static.KmkList.Any(x => x.KmkName == row["F11"].ToString())) { errorMsg += "貸方勘定科目がシステムで認識できない為、外取り込めません;"; } if (errorMsg != "") { row["Error"] = rowNo.ToString() + "行目 : " + errorMsg; } else { var shiwake = Static.ShiwakeDs.Shiwake.NewShiwakeRow(); shiwake.No = GetShiwakeNo(); shiwake.KmkKbn = KmkList.Where(x => row["F5"].ToString() == x.KmkName).Select(x => x.KmkKbn).First(); shiwake.CustomDate = o.ToString("MMdd"); shiwake.Week = o.ToString("ddd"); shiwake.KrKmkName = row["F5"].ToString(); shiwake.KrHKmkName = row["F6"].ToString(); shiwake.Kingaku = d; shiwake.KsKmkName = row["F11"].ToString(); shiwake.KsHKmkName = row["F12"].ToString(); shiwake.Tekiyo = row["F17"].ToString(); Static.ShiwakeDs.Shiwake.AddShiwakeRow(shiwake); } rowNo++; } // エラーデータは、ファイルで出力 var errorRows = dt.Select("Error <> ''"); var sb = new StringBuilder(); foreach (DataRow row in errorRows) { string rowLine = ""; foreach (DataColumn col in dt.Columns) { if (col.ColumnName == "Error") { rowLine += row[col.ColumnName].ToString().ToDoubleQuote(); } else { rowLine += row[col.ColumnName].ToString().ToDoubleQuote() + ","; } } sb.AppendLine(rowLine); } using (var stream = new System.IO.StreamWriter(path + ".err")) { stream.Write(sb.ToString(), false, Encoding.GetEncoding("SJIS")); } // 処理を終了 if (errorRows.Count() == 0) { MessageBox.Show("取込が正常に終了しました。", "CSV取込", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("取込が正常に終了しました。\n [ 取込エラー行は、.err として、出力されました。 ] ", "CSV取込", MessageBoxButtons.OK, MessageBoxIcon.Information); } SaveShiwakeXML(); } catch (Exception ex) { MessageBox.Show(ex.Message, "CSV取込エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); ReadShiwakeXML(); } }
public static void ShiwakeChanged() { decimal uriage = 0; decimal keihi = 0; if (ShiwakeDs.Shiwake.Count == 0) { return; } // ------------------------------------------------------------------ // 経費合計を計算 // ------------------------------------------------------------------ ShiwakeDs.KeihiSum.Clear(); var sumKeihiGroup = ShiwakeDs.Shiwake.Where(x => x.KmkKbn == KmkKbn.経費.ToString()). GroupBy(x => x.KrKmkName).Select(g => new { KrKmkName = g.Key, Kingaku = g.Sum(x => x.Kingaku) }); foreach (var kmkSum in sumKeihiGroup) { var row = ShiwakeDs.KeihiSum.NewKeihiSumRow(); row.KrKmkName = kmkSum.KrKmkName; row.Kingaku = kmkSum.Kingaku; ShiwakeDs.KeihiSum.AddKeihiSumRow(row); } // ------------------------------------------------------------------ // 仕訳合計(現金、普通預金、定期預金、売掛金、事業貸主) // ------------------------------------------------------------------ ShiwakeDs.ShisanSum.Clear(); var sumGKr = ShiwakeDs.Shiwake.Where(x => x.KmkKbn == KmkKbn.資産.ToString()). GroupBy(x => new { KmkName = x.KrKmkName, HKmkName = x.KrHKmkName }). Select(g => new { KmkName = g.Key.KmkName, HKmkName = g.Key.HKmkName, Kingaku = g.Sum(x => x.Kingaku) }); var sumGKs = ShiwakeDs.Shiwake.Where(x => x.KmkKbn == KmkKbn.資産.ToString()). GroupBy(x => new { KmkName = x.KsKmkName, HKmkName = x.KsHKmkName }). Select(g => new { KmkName = g.Key.KmkName, HKmkName = g.Key.HKmkName, Kingaku = g.Sum(x => x.Kingaku) }); foreach (var item in KmkList.Where(x => x.KmkKbn == KmkKbn.資産.ToString()). Join(sumGKr, x => new { x.KmkName }, y => new { y.KmkName }, (x, y) => new { y.KmkName, y.HKmkName, y.Kingaku })) { var row = ShiwakeDs.ShisanSum.NewShisanSumRow(); decimal ks = sumGKs.Where(x => x.KmkName == item.KmkName && x.HKmkName == item.HKmkName).Select(x => x.Kingaku).FirstOrDefault(); decimal kingaku = item.Kingaku - ks; row.KmkName = item.KmkName; row.HKmkName = item.HKmkName; if (item.KmkName.IndexOf("売上高") >= 0) { row.Kingaku = -1 * kingaku; uriage = row.Kingaku; } else { row.Kingaku = kingaku; } // 売掛の前年度引継ぎ // ToDo : 今のところ補助科目の考慮が無いので、処理を追加する必要がある if (ShiwakeDs.Zandaka.Count != 0 && ShiwakeDs.Zandaka[0].Urikake.Trim() != string.Empty) { if (row.KmkName == "売掛金") { int o = 0; int.TryParse(ShiwakeDs.Zandaka[0].Urikake, out o); row.Kingaku = row.Kingaku += o; } } ShiwakeDs.ShisanSum.AddShisanSumRow(row); } foreach (var item in sumGKs) { // 貸方にしかない場合は、こちらから表示する var sumGr = sumGKr.Where(x => x.KmkName == item.KmkName && x.HKmkName == item.HKmkName).FirstOrDefault(); if (sumGr == null) { var row = ShiwakeDs.ShisanSum.NewShisanSumRow(); row.KmkName = item.KmkName; row.HKmkName = item.HKmkName; if (item.KmkName.IndexOf("売上高") >= 0) { row.Kingaku = item.Kingaku; uriage = row.Kingaku; } else { row.Kingaku = -1 * item.Kingaku; } ShiwakeDs.ShisanSum.AddShisanSumRow(row); } } var rowKeihi = ShiwakeDs.ShisanSum.NewShisanSumRow(); rowKeihi.KmkName = KmkKbn.経費.ToString(); rowKeihi.Kingaku = ShiwakeDs.KeihiSum.Sum(x => x.Kingaku); keihi = rowKeihi.Kingaku; ShiwakeDs.ShisanSum.AddShisanSumRow(rowKeihi); var rowUriageKeihi = ShiwakeDs.ShisanSum.NewShisanSumRow(); rowUriageKeihi.KmkName = "売上高 - 経費"; rowUriageKeihi.Kingaku = uriage - keihi; ShiwakeDs.ShisanSum.AddShisanSumRow(rowUriageKeihi); // ------------------------------------------------------------------ // 現金出納帳 // ------------------------------------------------------------------ SetGenkinSuitocho(); // ------------------------------------------------------------------ // 預金出納帳 // ------------------------------------------------------------------ SetYokinSuitocho(); }