/// <summary> /// Сохранение проекта, т.е. запись в базу данных прокта с номером промежуточного сохранения "0" /// </summary> /// <param name="perTempNumber"> Номер текущего промежуточного сохранения перечня элементов</param> /// <param name="specTempNumber"> Номер текущего промежуточного сохранения спецификации</param> public void Save(int perTempNumber, int specTempNumber, int vedomostTempNumber) { //Перечень элементов: //Удаление сохранённых ранее данных: db.Table <PerechenItem>().Delete(x => x.id < Global.TempStartPosMask); //Удаляем все элементы, у которых tempNum = 0 //Сохранение текущих элементов: int perLength = GetPerechenLength(perTempNumber); for (int i = 1; i <= perLength; i++) { PerechenItem perItem = new PerechenItem(); perItem = GetPerechenItem(i, perTempNumber); perItem.id = i; AddPerechenItem(perItem); } //Спецификация: //Удаление сохранённых ранее данных: db.Table <SpecificationItem>().Delete(x => x.id <= Global.TempStartPosMask); //Удаляем все элементы, у которых tempNum = 0 //Сохранение текущих элементов: int specLength = GetSpecLength(specTempNumber); for (int i = 1; i <= specLength; i++) { SpecificationItem specItem = new SpecificationItem(); specItem = GetSpecItem(i, specTempNumber); specItem.id = i; AddSpecItem(specItem); } //Ведомость: //Удаление сохранённых ранее данных: db.Table <VedomostItem>().Delete(x => x.id <= Global.TempStartPosMask); //Удаляем все элементы, у которых tempNum = 0 //Сохранение текущих элементов: int vedomostLength = GetVedomostLength(vedomostTempNumber); for (int i = 1; i <= vedomostLength; i++) { VedomostItem vedomostItem = new VedomostItem(); vedomostItem = GetVedomostItem(i, vedomostTempNumber); vedomostItem.id = i; AddVedomostItem(vedomostItem); } }
public void groupPerechenElements(ref List <PerechenItem> pData, ref int numberOfValidStrings) { #region Группировка элементов перечня с одинаковым наименованием int numOfSameElems = 1; string prevElemName = pData[0].name; string prevElemNote = pData[0].note; for (int i = 1; i < numberOfValidStrings; i++) { if ((pData[i].name == prevElemName) & (pData[i].note == prevElemNote)) { numOfSameElems++; } else { prevElemName = pData[i].name; prevElemNote = pData[i].note; if (numOfSameElems > 1) { //Группировка позиционных обозначений: if (numOfSameElems == 2) { pData[i - 2].designator += ", " + pData[i - 1].designator; } else { pData[i - numOfSameElems].designator += " - " + pData[i - 1].designator; } // Изменение количества элементов: pData[i - numOfSameElems].quantity = numOfSameElems.ToString(); //Перенос оставшихся строчек выше: for (int j = i; j < numberOfValidStrings; j++) { pData[j - (numOfSameElems - 1)] = pData[j]; } //Изменение общего количества строчек, которые нужно записать в перечень: numberOfValidStrings -= (numOfSameElems - 1); i -= (numOfSameElems - 1); numOfSameElems = 1; } } if ((i == numberOfValidStrings - 1) & (numOfSameElems > 1)) { //Группировка позиционных обозначений: if (numOfSameElems == 2) { pData[i - 1].designator += ", " + pData[i].designator; } else { pData[i - numOfSameElems + 1].designator += " - " + pData[i].designator; } // Изменение количества элементов: pData[i - numOfSameElems + 1].quantity = numOfSameElems.ToString(); //Очистка последующей строки: pData[i - numOfSameElems + 2] = new Data.PerechenItem(); //Изменение общего количества строчек, которые нужно записать в перечень: numberOfValidStrings -= (numOfSameElems - 1); } } #endregion #region Группировка элементов перечня по типу и документу // Группировка элементов по типу и документу в текущей версии программы НЕ РЕАЛИЗОВАНА // Группировка элементов только по группе int numOfSameGroupElems = 1; string prevElemGroup = pData[0].groupPlural; int stringsAdded = 0; int numberOfValidStringsTemp = numberOfValidStrings; for (int i = 1; i < numberOfValidStringsTemp; i++) { if ((pData[i + stringsAdded].groupPlural == prevElemGroup)) { numOfSameGroupElems++; } else { if ((numOfSameGroupElems >= 3) & (prevElemGroup != String.Empty)) { //Сдвиг находящихся ниже строк на 2 для пустой строки и строки под наименование группы: int sdvigNumber = 2; //Чтобы название группы не было оторвано от первого элемента группы, добавляем ещё строку, если группа начинается на предпоследней строке страницы: if ((i + stringsAdded - numOfSameGroupElems + 2 == perech_first_page_rows_count) | (((i + stringsAdded - numOfSameGroupElems - perech_first_page_rows_count + 2) % perech_subseq_page_rows_count) == 0)) { sdvigNumber = 3; } //Добавляем необходимое количество строк for (int j = 0; j <= sdvigNumber; j++) { pData.Add(new Data.PerechenItem()); } //Сдвиг находящихся ниже строк для пустой строки и строки под наименование группы: for (int j = numberOfValidStrings + 1; j <= numberOfValidStrings + sdvigNumber; j++) { pData[j] = new Data.PerechenItem(); } for (int j = numberOfValidStrings; j >= i + stringsAdded - numOfSameGroupElems; j--) { pData[j + sdvigNumber] = pData[j]; } //Освобождение строк: for (int j = i + stringsAdded - numOfSameGroupElems; j < i + stringsAdded - numOfSameGroupElems + sdvigNumber; j++) { pData[j] = new Data.PerechenItem(); } //Добавление названия группы на освобождённую строку: pData[i + stringsAdded - numOfSameGroupElems + sdvigNumber - 1].name = prevElemGroup; //Изменение общего количества строчек, которые нужно записать в перечень: numberOfValidStrings += sdvigNumber; stringsAdded += sdvigNumber; } else { //Сдвиг находящихся ниже строк на 1 для пустой строки pData.Add(new Data.PerechenItem()); pData.Add(new Data.PerechenItem()); for (int j = numberOfValidStrings; j >= i + stringsAdded - numOfSameGroupElems; j--) { pData[j + 1] = pData[j]; } //Освобождение строки: pData[i + stringsAdded - numOfSameGroupElems] = new Data.PerechenItem(); //Добавление названия группы к названию каждого несгруппированного элемента: for (int j = i + stringsAdded; j >= i + stringsAdded - numOfSameGroupElems; j--) { if (j >= 0) { pData[j].name = pData[j].group + ' ' + pData[j].name; } } //Изменение общего количества строчек, которые нужно записать в перечень: numberOfValidStrings += 1; stringsAdded++; } numOfSameGroupElems = 1; prevElemGroup = pData[i + stringsAdded].groupPlural; } if (i == (numberOfValidStringsTemp - 1)) { if ((numOfSameGroupElems >= 2) & (prevElemGroup != String.Empty)) { //Сдвиг находящихся ниже строк на 2 для пустой строки и строки под наименование группы: int sdvigNumber = 2; //Чтобы название группы не было оторвано от первого элемента группы, добавляем ещё строку, если группа начинается на предпоследней строке страницы: if ((i + stringsAdded - numOfSameGroupElems + 2 == perech_first_page_rows_count) | (((i + stringsAdded - numOfSameGroupElems - perech_first_page_rows_count + 2) % perech_subseq_page_rows_count) == 0)) { sdvigNumber = 3; } //Добавляем необходимое количество строк for (int j = 0; j <= sdvigNumber; j++) { pData.Add(new Data.PerechenItem()); } //Сдвиг находящихся ниже строк для пустой строки и строки под наименование группы: for (int j = numberOfValidStrings; j <= numberOfValidStrings + sdvigNumber; j++) { pData[j] = new Data.PerechenItem(); } for (int j = numberOfValidStrings; j >= i + stringsAdded - numOfSameGroupElems + 1; j--) { pData[j + sdvigNumber] = pData[j]; } //Освобождение строк: for (int j = i + stringsAdded - numOfSameGroupElems + 1; j < i + stringsAdded - numOfSameGroupElems + sdvigNumber + 1; j++) { pData[j] = new Data.PerechenItem(); } //Добавление названия группы на освобождённую строку: pData[i + stringsAdded - numOfSameGroupElems + sdvigNumber].name = ' ' + prevElemGroup; //Изменение общего количества строчек, которые нужно записать в перечень: numberOfValidStrings += sdvigNumber; stringsAdded += sdvigNumber; } else { //Сдвиг находящихся ниже строк на 1 для пустой строки pData.Add(new Data.PerechenItem()); pData.Add(new Data.PerechenItem()); for (int j = numberOfValidStrings + 1; j >= i + stringsAdded - numOfSameGroupElems + 1; j--) { pData[j + 1] = pData[j]; } //Освобождение строки: pData[i + stringsAdded - numOfSameGroupElems + 1] = new Data.PerechenItem(); //Добавление названия группы к названию каждого несгруппированного элемента: for (int j = i + stringsAdded + 1; j >= i + stringsAdded - numOfSameGroupElems + 1; j--) { if (j >= 0) { pData[j].name = pData[j].group + ' ' + pData[j].name; } } //Изменение общего количества строчек, которые нужно записать в перечень: numberOfValidStrings += 1; stringsAdded++; } numOfSameGroupElems = 1; prevElemGroup = pData[i + stringsAdded].groupPlural; } } #endregion }
/// <summary> /// Добавление элемента item в перечень элементов /// </summary> /// <param name="item"> Элемент перечня для добавления </param> /// <returns></returns> public int AddPerechenItem(PerechenItem item) { return(db.InsertOrReplace(item)); }