/// <summary> /// 現在のDB日付を取得する /// </summary> /// <returns>Db現在日時</returns> public DateTime GetDbDateTime() { using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { try { context.Connection.Open(); } catch (Exception ex) { throw new DBOpenException(ex); } var date = context.ExecuteStoreQuery <DateTime>("SELECT GETDATE()", null).FirstOrDefault(); return(date); } }
/// <summary> /// 在庫集計処理 /// </summary> /// <param name="paramDic">パラメータ辞書</param> /// <param name="userId">ログインユーザID</param> public void InventorySummary(Dictionary <string, string> paramDic, int userId) { string yearMonth = paramDic["集計年月"]; int iYearMonth = int.Parse(yearMonth.Replace("/", "")); DateTime startDate = DateTime.Parse(string.Format("{0}/01", yearMonth)); // 集計月前月 int oneOldYearMonth = int.Parse(startDate.AddMonths(-1).ToString("yyyyMM")); // 集計月末日 DateTime endDate = new DateTime(startDate.Year, startDate.Month, DateTime.DaysInMonth(startDate.Year, startDate.Month)); using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { context.Connection.Open(); using (var tran = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable)) { try { #region 集計のベースとなる倉庫・商品データを作成 // -- A.倉庫・品番の全組合せリスト var itemList = context.M22_SOUK.Where(w => w.削除日時 == null) .SelectMany(x => context.M09_HIN.Where(w => w.削除日時 == null), (x, y) => new { SOUK = x, HIN = y }); // -- B.前月の在庫締集計結果データ var stokMonthList = context.S05_STOK_MONTH .Where(w => w.締年月 == oneOldYearMonth); // -- C.対象月の入出庫データ var historyList = context.S04_HISTORY .Where(w => w.入出庫日 >= startDate && w.入出庫日 <= endDate); #endregion // 基本倉庫・商品データ var baseList = ( itemList.ToList() .Select(s => new BaseItemMember { 庫コード = s.SOUK.庫コード, 品番コード = s.HIN.品番コード, 賞味期限 = AppCommon.GetMaxDate() }) .Union(stokMonthList.ToList() .Select(s => new BaseItemMember { 庫コード = s.庫コード, 品番コード = s.品番コード, 賞味期限 = s.賞味期限 })) .Union(historyList.ToList() .Select(s => new BaseItemMember { 庫コード = s.庫コード, 品番コード = s.品番コード, 賞味期限 = s.賞味期限 ?? AppCommon.GetMaxDate() })) ) //.Distinct() // Remarks:Distinctが効かないのでGroupByで対応 .GroupBy(g => new { g.庫コード, g.品番コード, g.賞味期限 }) .Select(s => s.Key) .OrderBy(o => o.庫コード) .ThenBy(t => t.品番コード) .ThenBy(t => t.賞味期限); #region 入出庫データのデータを集計 // -- D.入庫データ集計 var receipt = historyList .Where(w => w.削除日時 == null && w.入出庫区分 == (int)CommonConstants.入出庫区分.ID01_入庫) .GroupBy(g => new { g.庫コード, g.品番コード, g.賞味期限 }) .ToList() .Select(s => new HistorySummaryMember { 庫コード = s.Key.庫コード, 品番コード = s.Key.品番コード, 賞味期限 = s.Key.賞味期限 ?? AppCommon.GetMaxDate(), 数量 = s.Sum(m => m.数量 ?? 0) }); // -- E.出庫データ集計 var issue = historyList .Where(w => w.削除日時 == null && w.入出庫区分 == (int)CommonConstants.入出庫区分.ID02_出庫) .GroupBy(g => new { g.庫コード, g.品番コード, g.賞味期限 }) .ToList() .Select(s => new HistorySummaryMember { 庫コード = s.Key.庫コード, 品番コード = s.Key.品番コード, 賞味期限 = s.Key.賞味期限 ?? AppCommon.GetMaxDate(), 数量 = s.Sum(m => m.数量 ?? 0) }); #endregion // 上記までのデータを使用して在庫数を計算取得 var result = baseList .GroupJoin(stokMonthList, x => new { x.庫コード, x.品番コード, x.賞味期限 }, y => new { y.庫コード, y.品番コード, y.賞味期限 }, (x, y) => new { x, y }) .SelectMany(z => z.y.DefaultIfEmpty(), (a, b) => new { BASE = a.x, STK = b }) .GroupJoin(receipt, x => new { x.BASE.庫コード, x.BASE.品番コード, x.BASE.賞味期限 }, y => new { y.庫コード, y.品番コード, y.賞味期限 }, (x, y) => new { x, y }) .SelectMany(z => z.y.DefaultIfEmpty(), (c, d) => new { c.x.BASE, c.x.STK, NYK = d }) .GroupJoin(issue, x => new { x.BASE.庫コード, x.BASE.品番コード, x.BASE.賞味期限 }, y => new { y.庫コード, y.品番コード, y.賞味期限 }, (x, y) => new { x, y }) .SelectMany(z => z.y.DefaultIfEmpty(), (e, f) => new { e.x.BASE, e.x.STK, e.x.NYK, SYK = f }) .Select(s => new S05_STOK_MONTH { 締年月 = iYearMonth, 庫コード = s.BASE.庫コード, 品番コード = s.BASE.品番コード, 賞味期限 = s.BASE.賞味期限, 在庫数量 = (s.STK != null ? s.STK.在庫数量 : 0) + (s.NYK != null ? s.NYK.数量 : 0) - (s.SYK != null ? s.SYK.数量 : 0), 登録者 = userId, 登録日時 = DateTime.Now }); //▼Add Start Arinobu 2019/03/19 主キー違反がおこるため result = result .GroupBy(g => new { g.締年月, g.庫コード, g.品番コード, g.賞味期限 }) .Select(s => new S05_STOK_MONTH { 締年月 = s.Key.締年月, 庫コード = s.Key.庫コード, 品番コード = s.Key.品番コード, 賞味期限 = s.Key.賞味期限, 在庫数量 = s.Max(m => m.在庫数量), 登録者 = userId, 登録日時 = DateTime.Now }); //▲Add End Arinobu 2019/03/19 // 集計年月の作成済締データを一括削除 var delObject = context.ExecuteStoreQuery <object>(string.Format("DELETE FROM S05_STOK_MONTH WHERE 締年月 = {0}", iYearMonth)); // 抽出データを登録 result.Where(w => w.在庫数量 != 0).ToList().ForEach(S05 => context.S05_STOK_MONTH.ApplyChanges(S05)); // 変更内容を確定 context.SaveChanges(); // トランザクションのコミット tran.Commit(); } catch (Exception ex) { // トランザクションのロールバック tran.Rollback(); throw ex; } } } }