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