public int CapNhapChiTietPhieuXuat(DataTable dt, string maPhieu, clsPhieuXuatTamVatTu phieuxuat) { this.new_dt = null; this.old_dt = null; this.dt_TonKho = null; this.dt_TheKho = null; this.maPhieu = maPhieu; this.Ngay_xuat = phieuxuat.Ngay_xuat; this.ID_nhan_vien = phieuxuat.ID_Nhan_vien; //phieuxuat. //Dùng cho xét nợ VT giữa các kho ID_Kho_Xuat = phieuxuat.ID_kho; //B1: Get về dt vt theo mã phiếu có trong DB this.old_dt = GetDataTable(maPhieu); this.new_dt = dt.Copy(); //Cache tồn kho this.dt_TonKho = getAll_Ton_kho(new_dt); this.dt_TheKho = getAll_TheKho(new_dt); //dt_TheKho = //BeginTransaction SqlTransaction m_trans = null; SqlConnection m_conn = new SqlConnection(clsThamSoUtilities.connectionString); try { if (m_conn.State == ConnectionState.Closed) m_conn.Open(); m_trans = m_conn.BeginTransaction(); //Cập nhật phiếu xuất --> phần header if (phieuxuat.CapNhapPhieuXuat(m_trans, m_conn) == -1) { m_trans.Rollback(); m_conn.Close(); return -1; } //Cập nhật phần chi tiết trên grid //Nếu mã phiếu này chưa có trong DB, thêm mới tất cả. if (old_dt.Rows.Count == 0) { for (int i = 0; i < new_dt.Rows.Count; i++) { if (Insert_row(i, m_trans, m_conn) == -1) { m_trans.Rollback(); m_conn.Close(); return -1; } } m_trans.Commit(); m_conn.Close(); return 1; } //End Insert mới //Nếu đã có trong DB, cập nhật theo table mới --> update cái đã có, insert cái chưa có //Chuyển sang dùng ID để quyết định Insert hay Update for (int i = 0; i < new_dt.Rows.Count; i++) { DataRow selectedRow = new_dt.Rows[i]; int id = Int32.Parse(selectedRow["ID_chi_tiet_phieu_xuat_tam"].ToString()); if (id == -1) { if (Insert_row(i, m_trans, m_conn) == -1) { m_trans.Rollback(); m_conn.Close(); return -1; } } else { DataRow[] KiemTra = old_dt.Select(string.Format("ID_chi_tiet_phieu_xuat_tam='{0}'", id)); if (Update_row(i, KiemTra[0], m_trans, m_conn) == -1) { m_trans.Rollback(); m_conn.Close(); return -1; } old_dt.Rows.Remove(KiemTra[0]); } } //Xử lý Xóa row ko có trong table mới if (old_dt.Rows.Count == 0) { m_trans.Commit(); m_conn.Close(); return 1; } for (int i = 0; i < old_dt.Rows.Count; i++) { if (Delete_row(i, m_trans, m_conn) == -1) { m_trans.Rollback(); m_conn.Close(); return -1; } } m_trans.Commit(); m_conn.Close(); return 1; } catch (Exception ex) { m_trans.Rollback(); return -1; throw ex; } finally { if (m_conn.State != ConnectionState.Closed) m_conn.Close(); } }