/// <summary>Синхронизировать изменения по док "Отправить на .." на ТСД</summary> /// <typeparam name="T">Документ</typeparam> /// <typeparam name="S">Таблица</typeparam> private void SyncInSending <T, S>(SyncModes mode) where T : Sending where S : SubSending { string docName = typeof(T).Name; string tableName = typeof(S).Name; PerformQuery("GetSendingDocs", docName, tableName, (int)mode); if (IsExistParameters) { DataTable table = ResultParameters[0] as DataTable; if (table != null) { T newDoc = null; foreach (DataRow row in table.Rows) { int currId = Convert.ToInt32(row["Id"]); if (newDoc == null || newDoc.Id != currId) { newDoc = (T)Activator.CreateInstance(typeof(T)); newDoc.Contractor = Convert.ToInt32(row["Contractor"]); newDoc.Date = Convert.ToDateTime(row["Date"]); newDoc.TypeOfAccessory = (TypeOfAccessories)Convert.ToInt32(row["TypeOfAccessories"]); newDoc.BarCode = currId.ToString(); newDoc.IsSynced = true; newDoc.Sync <T>(); } S newSubDoc = (S)Activator.CreateInstance(typeof(S)); newSubDoc.TypeOfAccessory = newDoc.TypeOfAccessory; newSubDoc.Id = currId; newSubDoc.IsSynced = true; switch (mode) { case SyncModes.StandartToX: newSubDoc.Document = row["Document"].ToString(); break; case SyncModes.SendingToExchange: string syncRef = row["Nomenclature"].ToString(); object modelId = BarcodeWorker.GetIdByRef(typeof(Models), syncRef); newSubDoc.SetValue("Nomenclature", modelId); break; } newSubDoc.Sync <S>(); } } } }
/// <summary>Синхронизировать изменения по док "Отправить на .." на сервере</summary> /// <typeparam name="T">Документ</typeparam> /// <typeparam name="S">Таблица</typeparam> /// <param name="mode">Режим синхронізації</param> private void SyncOutSending <T, S>(SyncModes mode) where T : Sending where S : SubSending { string docName = typeof(T).Name; string tableName = typeof(S).Name; //1. Обновление на сервере string command = string.Format("SELECT Id, Document FROM {0} WHERE IsSynced=0", tableName); DataTable table = null; using (SqlCeCommand query = dbWorker.NewQuery(command)) { table = query.SelectToTable(); } PerformQuery("SetSendingDocs", docName, tableName, table, (int)mode); bool fullDeleteAccepted = typeof(T) == typeof(SendingToRepair) || typeof(T) == typeof(SendingToCharge); if (fullDeleteAccepted) { command = string.Format("SELECT DISTINCT Id FROM {0} WHERE IsSynced=0", tableName); using (SqlCeCommand query = dbWorker.NewQuery(command)) { table = query.SelectToTable(); } StringBuilder removeCommand = new StringBuilder("DELETE FROM {0} WHERE 1=0 "); Dictionary <string, object> parameters = new Dictionary <string, object>(); int index = 0; foreach (DataRow row in table.Rows) { object id = row["Id"]; parameters.Add(string.Concat(PARAMETER, index), id); removeCommand.AppendFormat(" OR Id=@{0}{1}", PARAMETER, index); index++; } using (SqlCeCommand query = dbWorker.NewQuery(string.Format(removeCommand.ToString(), docName))) { query.AddParameters(parameters); query.ExecuteNonQuery(); } using (SqlCeCommand query = dbWorker.NewQuery(string.Format(removeCommand.ToString(), tableName))) { query.AddParameters(parameters); query.ExecuteNonQuery(); } } else { //2. Удаление обновленных (? а нужно ли ... может когда весь документ удаляется) command = string.Format("DELETE FROM {0} WHERE IsSynced=0", tableName); using (SqlCeCommand query = dbWorker.NewQuery(command)) { query.ExecuteNonQuery(); } //3. Удаление полностью принятого документа command = string.Format(@"SELECT s.Id FROM {0} s LEFT JOIN ( SELECT t1.Id, Count(1) Count FROM {0} t1 JOIN {1} t2 ON t2.Id=t1.Id GROUP BY t1.Id)t ON s.Id=t.Id WHERE t.Count=0 OR t.Id IS NULL", docName, tableName); using (SqlCeCommand query = dbWorker.NewQuery(command)) { table = query.SelectToTable(); } StringBuilder removeCommand = new StringBuilder(); removeCommand.AppendFormat("DELETE FROM {0} WHERE 1=0", docName); Dictionary <string, object> parameters = new Dictionary <string, object>(); int index = 0; foreach (DataRow row in table.Rows) { object id = row["Id"]; removeCommand.AppendFormat(" OR {0}=@{1}{2}", dbObject.IDENTIFIER_NAME, PARAMETER, index); parameters.Add(string.Concat(PARAMETER, index), id); index++; } using (SqlCeCommand query = dbWorker.NewQuery(removeCommand.ToString())) { query.AddParameters(parameters); query.ExecuteNonQuery(); } } }