/// <summary> /// 移動明細情報の更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="dt"></param> /// <param name="userId"></param> /// <returns></returns> private void setT05_IDODTL_Update(T05_IDOHD idohd, DataTable dt) { // 登録済みデータの物理削除(del-ins) T05Service.T05_IDODTL_DeleteRecords(idohd.伝票番号); int rowIdx = 1; // 明細追加 foreach (DataRow row in dt.Rows) { if (row.RowState == DataRowState.Deleted) { continue; } T05_IDODTL dtlData = convertDataRowToT05_IDODTL_Entity(row); if (dtlData.品番コード <= 0) { continue; } T05_IDODTL srdtl = new T05_IDODTL(); srdtl.伝票番号 = dtlData.伝票番号; srdtl.行番号 = rowIdx; srdtl.品番コード = dtlData.品番コード; srdtl.賞味期限 = dtlData.賞味期限; srdtl.数量 = dtlData.数量; srdtl.摘要 = dtlData.摘要; T05Service.T05_IDODTL_Update(srdtl); rowIdx++; } }
/// <summary> /// 移動明細情報の更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="dt"></param> /// <param name="userId"></param> /// <returns></returns> private void setT05_IDODTL_Update(T05_IDOHD idohd, List <T05_IDODTL> idoDtl) { // 登録済みデータの物理削除(del-ins) T05Service.T05_IDODTL_DeleteRecords(idohd.伝票番号); // 入庫の摘要を出庫にもセット string p摘要 = idoDtl.Where(c => c.行番号 == 1).Select(c => c.摘要).FirstOrDefault(); // 明細追加 foreach (var row in idoDtl) { if (row.品番コード <= 0) { continue; } T05_IDODTL updRow = new T05_IDODTL(); updRow.伝票番号 = row.伝票番号; updRow.行番号 = row.行番号; updRow.品番コード = row.品番コード; updRow.賞味期限 = row.賞味期限; updRow.数量 = row.数量; updRow.摘要 = p摘要; T05Service.T05_IDODTL_Update(updRow); } }
/// <summary> /// 移動入力情報を登録・更新する /// </summary> /// <param name="ds"> /// 移動データセット /// [0:T05_IDOHD、1:T05_IDODTL] /// </param> /// <param name="userId">ログインユーザID</param> /// <returns></returns> public void Update(DataSet ds, int userId) { using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { context.Connection.Open(); using (var tran = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable)) { T05Service = new T05(context, userId); S03Service = new S03(context, userId); S04Service = new S04(context, userId, S04.機能ID.振替入力); try { DataRow hdRow = ds.Tables[TABLE_HEADER].Rows[0]; T05_IDOHD 振替Hd = convertDataRowToT05_IDOHD_Entity(hdRow); DataTable 振替出庫Dtl = ds.Tables[SYUKO_TABLE_DETAIL]; DataTable 振替入庫Dtl = ds.Tables[NYUKO_TABLE_DETAIL]; List <T05_IDODTL> updList = new List <T05_IDODTL>(); updList.Add(convertDataRowToT05_IDODTL_Entity(振替出庫Dtl.Rows[0])); updList.Add(convertDataRowToT05_IDODTL_Entity(振替入庫Dtl.Rows[0])); // 1>> ヘッダ情報更新 setT05_IDOHD_Update(振替Hd); // 2>> 明細情報更新 setT05_IDODTL_Update(振替Hd, updList); // 3>> 在庫情報更新 // (出荷元からの引落し) if (振替Hd.出荷元倉庫コード != null) { setS03_STOK_Update(context, hdRow, 振替出庫Dtl, true); setS04_HISTORY_Update(context, 振替Hd, 振替出庫Dtl, true); } // (出荷先への積上げ) if (振替Hd.出荷先倉庫コード != null) { setS03_STOK_Update(context, hdRow, 振替入庫Dtl, false); setS04_HISTORY_Update(context, 振替Hd, 振替入庫Dtl, false); } // 変更状態を確定 context.SaveChanges(); tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } } } }
/// <summary> /// 移動入力情報を削除する /// </summary> /// <param name="ds"> /// 移動データセット /// [0:T04_AGRHD、1:T04_AGRDTL] /// </param> /// <param name="userId">ログインユーザID</param> /// <returns></returns> public void Delete(DataSet ds, int userId) { using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { context.Connection.Open(); using (var tran = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable)) { T05Service = new T05(context, userId); S03Service = new S03(context, userId); S04Service = new S04(context, userId, S04.機能ID.商品移動入力); try { DataRow hdRow = ds.Tables[TABLE_HEADER].Rows[0]; T05_IDOHD idohd = convertDataRowToT05_IDOHD_Entity(hdRow); DataTable dtlTbl = ds.Tables[TABLE_DETAIL]; // 1>> ヘッダ情報削除 T05Service.T05_IDOHD_Delete(idohd.伝票番号); // 2>> 明細情報削除 T05Service.T05_IDODTL_Delete(idohd.伝票番号); // 3>> 在庫情報更新 // (出荷元に戻す) if (idohd.出荷元倉庫コード != null) { setS03_STOK_Update(context, idohd, dtlTbl, true, true); } // (出荷先から引落し) if (idohd.出荷先倉庫コード != null) { setS03_STOK_Update(context, idohd, dtlTbl, false, true); } //履歴テーブルの削除 S04Service.PhysicalDeletionProductHistory(context, idohd.伝票番号, (int)S04.機能ID.商品移動入力); // 変更状態を確定 context.SaveChanges(); tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } } } }
/// <summary> /// 移動入力情報を登録・更新する /// </summary> /// <param name="ds"> /// 移動データセット /// [0:T04_AGRHD、1:T04_AGRDTL] /// </param> /// <param name="userId">ログインユーザID</param> /// <returns></returns> public void Update(DataSet ds, int userId) { using (TRAC3Entities context = new TRAC3Entities(CommonData.TRAC3_GetConnectionString())) { context.Connection.Open(); using (var tran = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable)) { T05Service = new T05(context, userId); S03Service = new S03(context, userId); S04Service = new S04(context, userId, S04.機能ID.商品移動入力); try { DataRow hdRow = ds.Tables[TABLE_HEADER].Rows[0]; T05_IDOHD idohd = convertDataRowToT05_IDOHD_Entity(hdRow); DataTable dtlTbl = ds.Tables[TABLE_DETAIL]; // 1>> ヘッダ情報更新 setT05_IDOHD_Update(idohd); // 2>> 明細情報更新 setT05_IDODTL_Update(idohd, dtlTbl); // 3>> 在庫情報更新 // (出荷元からの引落し) if (idohd.出荷元倉庫コード != null) { setS03_STOK_Update(context, idohd, dtlTbl, true); // No-258 Mod setS04_HISTORY_Update(context, idohd, dtlTbl, true); } // (出荷先への積上げ) if (idohd.出荷先倉庫コード != null) { setS03_STOK_Update(context, idohd, dtlTbl, false); // No-258 Mod setS04_HISTORY_Update(context, idohd, dtlTbl, false); } // 変更状態を確定 context.SaveChanges(); tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } } } }
/// <summary> /// DataRow型をT05_IDOHDエンティティに変換する /// </summary> /// <param name="drow"></param> /// <returns></returns> private T05_IDOHD convertDataRowToT05_IDOHD_Entity(DataRow drow) { T05_IDOHD agrhd = new T05_IDOHD(); int iVal; agrhd.伝票番号 = ParseNumeric <int>(drow["伝票番号"]); agrhd.会社名コード = ParseNumeric <int>(drow["会社名コード"]); agrhd.日付 = DateTime.Parse(string.Format("{0:yyyy/MM/dd}", drow["日付"])); agrhd.移動区分 = ParseNumeric <int>(drow["移動区分"]); agrhd.出荷元倉庫コード = int.TryParse(drow["出荷元倉庫コード"].ToString(), out iVal) ? (int?)iVal : null; agrhd.出荷先倉庫コード = int.TryParse(drow["出荷先倉庫コード"].ToString(), out iVal) ? (int?)iVal : null; return(agrhd); }
/// <summary> /// 移動ヘッダ情報の更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="hdRow"></param> /// <param name="userId"></param> /// <returns></returns> private void setT05_IDOHD_Update(T05_IDOHD t05Data) { // データなしの為追加 T05_IDOHD idohd = new T05_IDOHD(); idohd.伝票番号 = t05Data.伝票番号; idohd.会社名コード = t05Data.会社名コード; idohd.日付 = t05Data.日付; idohd.移動区分 = t05Data.移動区分; idohd.出荷元倉庫コード = t05Data.出荷元倉庫コード; idohd.出荷先倉庫コード = t05Data.出荷先倉庫コード; T05Service.T05_IDOHD_Update(idohd); }
/// <summary> /// 移動ヘッダの登録・更新をおこなう /// </summary> /// <param name="idohd"></param> public void T05_IDOHD_Update(T05_IDOHD idohd) { // 登録データ取得 var hdData = _context.T05_IDOHD .Where(w => w.伝票番号 == idohd.伝票番号) .FirstOrDefault(); if (hdData == null) { // データなしの為追加 T05_IDOHD ido = new T05_IDOHD(); ido.伝票番号 = idohd.伝票番号; ido.会社名コード = idohd.会社名コード; ido.日付 = idohd.日付; ido.移動区分 = idohd.移動区分; ido.出荷元倉庫コード = idohd.出荷元倉庫コード; ido.出荷先倉庫コード = idohd.出荷先倉庫コード; ido.登録者 = _loginUserId; ido.登録日時 = com.GetDbDateTime(); ido.最終更新者 = _loginUserId; ido.最終更新日時 = com.GetDbDateTime(); _context.T05_IDOHD.ApplyChanges(ido); } else { // データを更新 hdData.会社名コード = idohd.会社名コード; hdData.日付 = idohd.日付; hdData.移動区分 = idohd.移動区分; hdData.出荷元倉庫コード = idohd.出荷元倉庫コード; hdData.出荷先倉庫コード = idohd.出荷先倉庫コード; hdData.最終更新者 = _loginUserId; hdData.最終更新日時 = com.GetDbDateTime(); hdData.削除者 = null; hdData.削除日時 = null; hdData.AcceptChanges(); } }
/// <summary> /// 入出庫履歴の登録・更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="idohd">移動ヘッダデータ</param> /// <param name="dtlTbl">移動明細データテーブル</param> /// <param name="orghd">変更前仕入ヘッダデータ</param> /// <param name="isSubtract">減算フラグ(True:減算,False:減算しない)</param> private void setS04_HISTORY_Update(TRAC3Entities context, T05_IDOHD idohd, DataTable dtlTbl, bool isSubtract) { if (isSubtract == true) { // 登録済み入出庫データの削除 int intSlipNumber = idohd.伝票番号; // 入出庫データの物理削除 S04Service.PhysicalDeletionProductHistory(context, intSlipNumber, (int)S04.機能ID.振替入力); } List <T05_IDODTL> t05dtl = getDetailDataList(dtlTbl); foreach (T05_IDODTL row in t05dtl) { int souko = isSubtract ? (int)idohd.出荷元倉庫コード : (int)idohd.出荷先倉庫コード; S04_HISTORY history = new S04_HISTORY(); history.入出庫日 = idohd.日付; history.入出庫時刻 = com.GetDbDateTime().TimeOfDay; history.庫コード = souko; history.入出庫区分 = !isSubtract ? (int)CommonConstants.入出庫区分.ID01_入庫 : (int)CommonConstants.入出庫区分.ID02_出庫; history.品番コード = row.品番コード; history.賞味期限 = row.賞味期限; history.数量 = decimal.ToInt32(row.数量); history.伝票番号 = row.伝票番号; Dictionary <string, string> hstDic = new Dictionary <string, string>() { { S04.COLUMNS_NAME_入出庫日, history.入出庫日.ToString("yyyy/MM/dd") }, { S04.COLUMNS_NAME_倉庫コード, history.庫コード.ToString() }, { S04.COLUMNS_NAME_伝票番号, history.伝票番号.ToString() }, { S04.COLUMNS_NAME_品番コード, history.品番コード.ToString() }, }; // 履歴作成 S04Service.CreateProductHistory(history); } }
/// <summary> /// 入出庫履歴の登録・更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="idohd">移動ヘッダデータ</param> /// <param name="dtlTbl">移動明細データテーブル</param> /// <param name="orghd">変更前仕入ヘッダデータ</param> /// <param name="isSubtract">減算フラグ(True:減算,False:減算しない)</param> private void setS04_HISTORY_Update(TRAC3Entities context, T05_IDOHD idohd, DataTable dtlTbl, bool isSubtract) { // No-258 Mod Start if (isSubtract == true) { // 登録済み入出庫データの削除 int intSlipNumber = idohd.伝票番号; // 入出庫データの物理削除 S04Service.PhysicalDeletionProductHistory(context, intSlipNumber, (int)S04.機能ID.商品移動入力); } // 不要レコード除去 DataTable dtlTblTmp = dtlTbl.Clone(); foreach (DataRow row in dtlTbl.Rows) { T05_IDODTL dtlRow = convertDataRowToT05_IDODTL_Entity(row); if (dtlRow.品番コード <= 0) { continue; } dtlTblTmp.ImportRow(row); } // 入出庫データ作成単位に集約 var dtlTblWk = dtlTblTmp.AsEnumerable() .Where(x => x.RowState != DataRowState.Deleted) .GroupBy(g => new { 伝票番号 = g.Field <int>("伝票番号") , 品番コード = g.Field <int>("品番コード") , 賞味期限 = g.Field <DateTime?>("賞味期限") }) .Select(s => new T05_IDODTL { 伝票番号 = s.Key.伝票番号, 品番コード = s.Key.品番コード, 賞味期限 = s.Key.賞味期限, 数量 = s.Sum(m => m.Field <decimal>("数量")) }) .ToList(); foreach (T05_IDODTL row in dtlTblWk) { int souko = isSubtract ? (int)idohd.出荷元倉庫コード : (int)idohd.出荷先倉庫コード; decimal stockQtyhist = 0; // No-155 Add stockQtyhist = row.数量; S04_HISTORY history = new S04_HISTORY(); history.入出庫日 = idohd.日付; history.入出庫時刻 = com.GetDbDateTime().TimeOfDay; history.庫コード = souko; history.入出庫区分 = !isSubtract ? (int)CommonConstants.入出庫区分.ID01_入庫 : (int)CommonConstants.入出庫区分.ID02_出庫; history.品番コード = row.品番コード; history.賞味期限 = row.賞味期限; history.数量 = decimal.ToInt32(stockQtyhist); // No-155 Mod history.伝票番号 = row.伝票番号; Dictionary <string, string> hstDic = new Dictionary <string, string>() { { S04.COLUMNS_NAME_入出庫日, history.入出庫日.ToString("yyyy/MM/dd") }, { S04.COLUMNS_NAME_倉庫コード, history.庫コード.ToString() }, { S04.COLUMNS_NAME_伝票番号, history.伝票番号.ToString() }, { S04.COLUMNS_NAME_品番コード, history.品番コード.ToString() }, }; // 履歴作成 S04Service.CreateProductHistory(history); } // No-258 Mod End }
/// <summary> /// 在庫情報の更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="idohd">移動ヘッダデータ</param> /// <param name="dtlTbl">移動明細データテーブル</param> /// <param name="isSubtract">減算フラグ(True:減算,False:減算しない)</param> private void setS03_STOK_Update(TRAC3Entities context, T05_IDOHD idohd, DataTable dtlTbl, bool isSubtract, bool isDeleteFlg = false) // No-258 Mod { foreach (DataRow row in dtlTbl.Rows) { T05_IDODTL dtlRow = convertDataRowToT05_IDODTL_Entity(row); if (dtlRow.品番コード <= 0) { continue; } int souko = isSubtract ? (int)idohd.出荷元倉庫コード : (int)idohd.出荷先倉庫コード; #region 在庫数計算 decimal stockQty = 0; decimal oldstockQty = 0; bool iskigenChangeFlg = false; // 賞味期限変更フラグ No-258 Add if (isDeleteFlg) { stockQty = dtlRow.数量 * (isSubtract ? 1 : -1); } else if (row.RowState == DataRowState.Deleted) { // 数量分在庫数を加減算 stockQty = dtlRow.数量 * (isSubtract ? -1 : 1); } else if (row.RowState == DataRowState.Added) { // 数量分在庫数を加減算 stockQty = dtlRow.数量 * (isSubtract ? -1 : 1); } else if (row.RowState == DataRowState.Modified) { // No-258 Mod Start if (!row["賞味期限"].Equals(row["賞味期限", DataRowVersion.Original])) { // 賞味期限が変更された場合 // 減算フラグ(True:減算)の場合:旧賞味期限の在庫を加算、新賞味期限の在庫を減算する // 減算フラグ(True:False)の場合:旧賞味期限の在庫を減算、新賞味期限の在庫を加算する iskigenChangeFlg = true; // 旧賞味期限の在庫数 oldstockQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]) * (isSubtract ? 1 : -1); // 新賞味期限の在庫数 stockQty = dtlRow.数量 * (isSubtract ? -1 : 1); } else { // 数量が変更された場合 decimal orgQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]); stockQty = (dtlRow.数量 - orgQty) * (isSubtract ? -1 : 1); } // No-258 Mod End } else { // 対象なし(DataRowState.Unchanged) continue; } #endregion // No-258 Add Start // 賞味期限が変更された場合 if (iskigenChangeFlg == true) { DateTime dt; S03_STOK oldStok = new S03_STOK(); oldStok.庫コード = souko; oldStok.品番コード = dtlRow.品番コード; oldStok.賞味期限 = row["賞味期限", DataRowVersion.Original] == DBNull.Value ? AppCommon.DateTimeToDate(null, DateTime.MaxValue) : DateTime.TryParse(row["賞味期限", DataRowVersion.Original].ToString(), out dt) ? dt : AppCommon.DateTimeToDate(null, DateTime.MaxValue); oldStok.在庫数 = oldstockQty; // 旧賞味期限の在庫を更新 S03Service.S03_STOK_Update(oldStok); } // No-258 Add End // 対象データ設定 S03_STOK stok = new S03_STOK(); stok.庫コード = souko; stok.品番コード = dtlRow.品番コード; stok.賞味期限 = AppCommon.DateTimeToDate(dtlRow.賞味期限, DateTime.MaxValue); stok.在庫数 = stockQty; // 新賞味期限の在庫を更新 S03Service.S03_STOK_Update(stok); // 変更状態を確定 context.SaveChanges(); // No-258 Add } }
/// <summary> /// 在庫情報の更新をおこなう /// </summary> /// <param name="context"></param> /// <param name="idohd">移動ヘッダデータ</param> /// <param name="dtlTbl">移動明細データテーブル</param> /// <param name="isSubtract">減算フラグ(True:減算,False:減算しない)</param> private void setS03_STOK_Update(TRAC3Entities context, DataRow hdTbl, DataTable dtlTbl, bool isSubtract) { T05_IDOHD idohd = convertDataRowToT05_IDOHD_Entity(hdTbl); foreach (DataRow row in dtlTbl.Rows) { T05_IDODTL dtlRow = convertDataRowToT05_IDODTL_Entity(row); if (dtlRow.品番コード <= 0) { continue; } int souko = isSubtract ? (int)idohd.出荷元倉庫コード : (int)idohd.出荷先倉庫コード; #region 在庫数計算 decimal stockQty = 0; decimal oldstockQty = 0; bool isSamekigenFlg = false; // 賞味期限同一フラグ bool isSameSoukFlg = false; // 倉庫同一フラグ bool isSameSyohinFlg = false; // 商品同一フラグ if (hdTbl.RowState == DataRowState.Modified) { isSameSoukFlg = isSubtract ? CheckSameValue(hdTbl, "出荷元倉庫コード") : CheckSameValue(hdTbl, "出荷先倉庫コード"); } if (row.RowState == DataRowState.Added) { // 数量分在庫数を加減算 stockQty = dtlRow.数量 * (isSubtract ? -1 : 1); } else if (row.RowState == DataRowState.Modified || (hdTbl.RowState == DataRowState.Modified && !isSameSoukFlg)) { // 明細を変更または前回と倉庫が異なる場合 isSamekigenFlg = CheckSameValue(row, "賞味期限"); isSameSyohinFlg = CheckSameValue(row, "品番コード"); // 賞味期限、倉庫、商品が変更された場合、過去在庫を取得 if (!isSamekigenFlg || !isSameSoukFlg || !isSameSyohinFlg) { // 減算フラグ(True:減算)の場合:旧賞味期限の在庫を加算、新賞味期限の在庫を減算する // 減算フラグ(True:False)の場合:旧賞味期限の在庫を減算、新賞味期限の在庫を加算する // 旧賞味期限の在庫数 oldstockQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]) * (isSubtract ? 1 : -1); // 新賞味期限の在庫数 stockQty = dtlRow.数量 * (isSubtract ? -1 : 1); } else { // 数量が変更された場合 decimal orgQty = ParseNumeric <decimal>(row["数量", DataRowVersion.Original]); stockQty = (dtlRow.数量 - orgQty) * (isSubtract ? -1 : 1); } } else { // 明細対象なし(DataRowState.Unchanged) continue; } #endregion // 賞味期限、倉庫、商品が変更された場合 if ((row.RowState == DataRowState.Modified && (!isSamekigenFlg || !isSameSoukFlg)) || (hdTbl.RowState == DataRowState.Modified && !isSameSyohinFlg)) { DateTime dt; S03_STOK oldStok = new S03_STOK(); oldStok.庫コード = isSubtract ? int.Parse(hdTbl["出荷元倉庫コード", DataRowVersion.Original].ToString()) : int.Parse(hdTbl["出荷先倉庫コード", DataRowVersion.Original].ToString()); oldStok.品番コード = int.Parse(row["品番コード", DataRowVersion.Original].ToString()); oldStok.賞味期限 = row["賞味期限", DataRowVersion.Original] == DBNull.Value ? AppCommon.DateTimeToDate(null, DateTime.MaxValue) : DateTime.TryParse(row["賞味期限", DataRowVersion.Original].ToString(), out dt) ? dt : AppCommon.DateTimeToDate(null, DateTime.MaxValue); oldStok.在庫数 = oldstockQty; // 旧賞味期限の在庫を更新 S03Service.S03_STOK_Update(oldStok); } // 対象データ設定 S03_STOK stok = new S03_STOK(); stok.庫コード = souko; stok.品番コード = dtlRow.品番コード; stok.賞味期限 = AppCommon.DateTimeToDate(dtlRow.賞味期限, DateTime.MaxValue); stok.在庫数 = stockQty; // 新賞味期限の在庫を更新 S03Service.S03_STOK_Update(stok); // 変更状態を確定 context.SaveChanges(); } }