Beispiel #1
0
        /// <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();
            }
        }
Beispiel #2
0
        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();
        }