Форум компании Кронос-Информ | |
http://www.cronos.ru/cgi-bin/YaBB2/YaBB.cgi
Конференции для пользователей >> CronosPRO: формулы >> Сквозная нумерация в БД http://www.cronos.ru/cgi-bin/YaBB2/YaBB.cgi?num=1623501813 Сообщение написано graffserg в 12.06.2021 :: 16:43:33 |
Заголовок: Сквозная нумерация в БД Создано graffserg в 12.06.2021 :: 16:43:33
Всем доброго дня!
Есть СЛОВАРНАЯ База :Занимаемая должность 0|Системный номер|Ц|10||| 43|Перемещения/назначения|ПО|||МН|Д16 10|Код|Т|7||АП| 20|Понятие|Т|512||ИФ;АП| 45|Является должностью...|ПО|||МН|ДЛ45 44|Подразделения(в/сл)|ПО|||МН|М145 42|Дата создания|Т|20||НК;МН| 41|Дата ликвидации|Т|20||НК| 30|Предки|ПО|||МН|ДЛ40 40|Потомки|ПО|||МН|ДЛ30 в которой должности привязаны к определенному порядковому номеру. Возможно ли в формулу [code] IF (ДЛ10 = "") THEN ( @UID := LOAD("record_UID"); if (@UID < 100) THEN (@UID := 100) @UID := (@UID + 1); ДЛ10 := @UID; SAVE("record_UID", @UID) ) [/code] , которая в поле "10|Код|Т|7||АП" автоматически присваивает номер с шагом =1 модернизировать так, чтобы она производила пересчет номеров по условию. Например, в поле "41|Дата ликвидации|Т|20||НК|" будет стоять дата "ликвидации" должности за п/н 155. Нужно чтобы формула произвела пересчет и номеру, который "ликвидирован" присвоила индекс, допустим "А", а следующему номеру 155. Спасибо. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 12:03:05
Всем добрейшего дня!Хочу поднять данную тему для обсуждения.
Вот, к примеру, в excel сквозную нумерацию можно осуществить с помощьюформул: Code (] =ЕСЛИ((D2="")*(E2="");МАКС($A$1:A1)+1;ЕСЛИОШИБКА(ЕСЛИ(ИЛИ(E2<>"";B2<>"");СЧЁТЕСЛИ($A$1:A1;"?*");"")+1&СИМВОЛ(65);"")) [/code):
или [code] =ЕСЛИ((D2="")*(E2="");МАКС($H$1:H1)+1;ЧСТРОК($H$1:H1)&СИМВОЛ(65)) [/code] Суть формул сводится к одному - сохранить прежний порядковый номер, толькодобавлять к нему индекс, так сказать, сохранить историю. Например, был 155,а стал 155А, был 136, а стал 136А. Вопрос в cronos возможно ли реализовать данный вариант нумерации. На прикрепленном файле постарался показать суть задуманного. Спасибо. ![]() |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 12:46:09
Сквозную нумерацию легко организовать через присвоение полю системного номера записи.
Записи лучше не удалять. При необходимости ввести Статус (категорию), где отмечать необходимые атрибуты. Реализовывать в нумерации какие то буквенные дополнения - нонсенс, но реализовать можно без проблем. Лучше сделать множественное поле с историей нумерации. Например, действующий номер - 135, История - 134; 137; 200. Делать непрерывную нумерацию можно при выдаче. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 12:58:18
Увадаемый Zuluss! Спасибо за оперативность.
Теперь по делу. Рассмотрим на примере должностей: - должности имеют свой порядковый номер, который отражается в поле "код" базы "должности". Со временем должности либо "ликвидируются", либо добавляются. Соответственно старые записи в базе остаются и их удаление не планируется, но желательно знать этот самый порядковый номер "ликвидированной" должности. Вот почему я и предположил, что лучше добавить "ликвидированной" должности, т.е. её порядковому номеру индекс, например "А". - при наличии "ликвидированых" должностей нумерация должна продолжаться в нарастающей порядке. - насчёт "При необходимости ввести Статус (категорию), где отмечать необходимые атрибуты" согласен, так и планируется. Своего рода сделать маркер, чтобы формула понимала что вы считывать и по какому условию. Подскажите пожалуйста, как это реализовать на практике. Спасибо. В прикреплённом выше файле, я посторался показать все это. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 13:23:35
Я это долго и мучительно рассказывал. Достаточно поля "Дата ликвидации должности". По наличию в нем значения определяется действующая она или нет, а номер не меняется. Так видна вся история.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 13:37:12 Zuluss записан в 09.07.2021 :: 13:23:35:
Уважаемый Zuluss, насчёт этого я с Вами не спорю. Если можно, подскажите пожалуйста, какую формулу в данной ситуации нужно использовать или как доработать формулу в первом посте. Спасибо. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 14:21:31
Это тупиковый путь.
Предположим есть Отдел А и Отдел Б. В отделе А должности 1, 2, 3, в Б 4, 5, 6. Ликвидируем отдел А и все должности. Они станут 1А, 2А, 3А. Какой номер будет следующий? |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 14:46:43 Zuluss записан в 09.07.2021 :: 14:21:31:
Допустим, в данном примере следующим номером будет 1, 2, 3, а 1А, 2А, 3А будут находится в базе, но они не будут участвовать в дальнейшем построении базы, это своего рода архив, история или какие-то подругому назовём. Но,к примеру, даже если есть несколько отделов, Отдел А и Отдел Б, и порядковые номера у них тоже одинаковые, а системные номера в любом случае будут разные. Суть данной темы и вопроса - сделать сквозную нумерацию при условии, что в базе также будут находиться "ликвидированные" должности, порядковый номерам которых будет присвоен индекс. Если Вы говорите, что это "тупиковый путь", то есть ли альтернатива данному решению вопроса? |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 17:11:44
Я попросил ответить на вопрос какой номер нужно будет присвоить. Ответа нет. Значит не может быть и алгоритма присвоения номеров в данном случае.
Для использования системного номера достаточно сделать формулу в структуре: ДЛ10:=@SYSNOMER |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 17:24:44
Я постарался ответить на Ваш вопрос - нумерация пойдёт с 1 в нарастающей порядке.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 17:26:37 graffserg записан в 12.06.2021 :: 16:43:33:
В принципе я ещё в начале темы постарался описать суть вопроса. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 17:31:59 Цитировать:
Для меня непонятно, а зачем? Если номер 1 никоим образом не будет связан с номером 1А, и будет следовать по порядку за номером 6. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 17:44:42
Уважаемый Zuluss, посмотрите пожалуйста пример в Excel.
Я надеюсь, что в примере будет все показано наглядно. Вот именно это я и хочу реализовать в cronos. Спасибо |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 20:21:03
В формуле Excel реализован немного другой механизм, отличный от описываемого. Там два вида нумерации ведутся паралельно и всегда пересчитывается весь набор строк. Т.е. одна нумерация только цифрами, другая нумерация цифрами и буквами.
1 1 2A 2A 3A 3A 2 4A 4A 5A 3 2 5A 6A 6A 7A 4 3 7A 8A 5 4 6 5 8A 9A 7 6 9A 10A 10A 11A 8 7 Первый столбец изначальный. Меняем в 4 строке значение в столбце Е. В результате происходит полный пересчет и мы получаем значения в столбце 2. Т.е. 2 преобразовалось в 4А. Ни о какой истории хранения номеров не может быть и речи. Преобразовались и другие номера. 8 стало 7. Вам нужен такой пересчет? Как то сомневаюсь. Такой вариант вообще даже в голову прийти не мог. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 21:59:43
Ок. Дабы не дискутировать начнём сначала на примере должностей.
1. Есть база "должности" в которой каждому порядковому номеру соответствует та или иная должность. 2. С течением времени должности имеют свойство добавляться или "ликвидироваться", в связи с чем происходит изменение порядкового номера для действующей должности. Должности которые "ликвидированы" остаются в базе. Т.е. происходит смещение в нумерации для действующих должностей. Теперь идём далее. Зная, что каждому порядковому номеру соответствует та или иная должность оператор просто вводит её номер и при помощи поиска на вводе создаёт связь лица с данной должностью. Вопрос: Как нужно поступить с должностями, которые ликвидированы и находятся в базе? Какую формулу нужно использовать для пересчета порядковых номеров, зная тот факт, что в базе существует поле "дата ликвидации"? Вот мне и пришла мысль добавить порядковому номеру ликвидирован ной должности индекс, а для действующих должностей производить пересчет. :-/ Например было 1,2,3,4,5,6,7,8,9,10, а с появлением ликвидированых должностей стало 1,2,3А,3,4,5,6А,7А,6,7,8 и т.д. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 09.07.2021 :: 23:08:41
Так соответствовала задумке работа формулы в Excel или нет?
Цитировать:
А теперь подумаем. Вводил, вводил оператор номер 4, ликвидировалась должность 3, стала 3А, 4 стала 3, а 4 совсем другая. Оператор опять вводит 4, но это уже другая должность. Всех надо переучивать. Непонятно, где логика? Проще оставлять не пересчитывая, просто добавлять буквенный код, или, как уже ранее говорилось, перемещать этот код в поле истории, и оставлять порядковый номер пустой. Он не отберется. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 09.07.2021 :: 23:47:16
Уважаемый Zuluss, на примере БД "должность" :
1. формула из Excel соответствует предьявляемым требованиям и задумке. На данном этапе она проходит тестирование, но в общем то, что необходимо (с доработками). Суть такова, что изначально все данные вносятся, а потом по мере необходимости редактируются оператором. Всё в Excel. Далее все это распечатывается и согласовывается. Оператор на всех этапах знает порядковый номер, не зависимо от того добавлялась должность или "ликвидировалась". 2. Логика в том, что оператор на всех этапах знает порядковый номер, так как он в процессе ввода у него перед глазами. Вот мне и пришло в голову, а что если формула будет делать пересчет порядковых номеров по условию и ликвидированным номерам будет добавлять индекс, а действующие будут идти в нарастающей порядке (о чем я писал выше). 3. Возможно есть ещё способ о котором я не знаю. Подскажите пожалуйста, возможно ли это реализовать в cronos? Спасибо. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 10.07.2021 :: 13:01:24
Реализовать можно многое. Вопрос в целесообразности.
Формула в структуре для формирования как в варианте с Excel (пересчет всех номеров) Code (]@SNS:=FIND("ОТ ШТ01"); @D:=1; @A:=1; @CNT:=VALCOUNT(@SNS); @I:=1 WHILE(@I<=@CNT) DO [if (@SNS(@I)#@SYSNOMER) then (if (ШТ51{@SNS(@I)}#"") then [ШТ10{@SNS(@I)}:=@A<<"A"; @A:=@A+1):
Вариант с проставлением дополнительной литеры без изменения нумерации Code (]@SNS:=FIND("ОТ ШТ01"); @CNT:=VALCOUNT(@SNS); if (ШТ51#"" & ШТ10#"" & CHECKSYMBOL(ШТ10,"A")=0) then (ШТ10:=ШТ10<<"A"); if (ШТ10="" & ШТ51="") then (ШТ10:=@CNT+1)[/code):
В формулах ШТ соответствует ДЛ, ШТ51 - дата ликвидации. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 10.07.2021 :: 16:27:13
Спасибо большое.
Буду тестить. Чуть позже отпишусь. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 01:07:02
Уважаемый Zuluss!
Все работает, первая формула подходит по всем параметрам. Единственное, после тестирования хочу спросить - насколько я понял, порядковый номер должности берется согласно системного номера, так вот: 1. Возможно ли подправить код так, чтобы порядковый номер "ликвидированной" должности оставался прежним, только с индексом. Например, была должность за порядковым номером 10, ее "ликвидировали" и порядковый номер стал 10А. В данном варианте "ликвидированный" порядковый номер всегда начинается с 1А и дальше по возрастанию. 2. Например, необходимо новую должность вставить где ни будь в середине или в начале, в общем в любом месте списка, то она, должность, постоянно попадает в конец этого списка, даже если при создании новой записи ввести необходимый номер. Вот представим, в списке есть 100 должностей с 1 по 100 порядковый номер. Мне как оператору, необходимо внести новую должность с порядковым номером 88. При создании новой должности в поле "код" я ввожу порядковый номер 88, а в поле "Название" - название должности. Соответственно, список будет уже состоять из 101 должности с "вставленным" в нужном месте порядковым номером 88. Таким образом формула пересчет номеров должна произвести уже от номера 88. Возможно ли реализовать на практике два данных вопроса? Спасибо. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 08:56:30 Цитировать:
Ни в одном из вариантов системный номер в нумерации не применяется. Везде линейный список по порядку. Для того, чтобы реализовать привычный порядок следования должностей, лучше ввести поле "Порядковый номер" и корректировать их после вставки, а при работе с формой ввода их сортировать программно. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 09:30:25 Цитировать:
Ок. Допустим, в базу вводим дополнительное поле "Код должности", а корректировку после вставки нужно будет проводить руками? А можно ли саму формулу доработать согласно поста выше? Сама формула подходит, а вот если бы её немного доработать вообще идеально. Спасибо |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 10:13:07
Сортировка связанных баз по умолчанию идет в порядке системных номеров. По другому не получится.
Предположим такую ситуацию. СисНомер, Номер п/п (Код), Наименование 101, 21, Начальник отдела 120, 22, Главный специалист 130, 23, специалист Нам нужно вставить заместителя начальника Добавляем 140, __, Заместитель начальника и 141,__ , старший специалист Как в формуле узнать, куда мы хотим что-то вставить :)? |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 11:33:39
Уважаемый Zuluss:
1. оператор на всех этапах знает порядковый номер, так как он в процессе ввода у него перед глазами. Соответственно, при вводе новой должности уже известен этот самый порядковый номер. 2. Должно получиться примерно так СисНомер, Номер п/п (Код), Наименование 101. 21. Начальник отдела 140. 22. Заместитель начальника 120. 23. (был 22.) Главный специалист 141. 24. Старший специалист 130. 25 (был23.) Специалист Задумка в том, чтобы при вводе новой должности оператор мог указывать её порядковый номер, не зависимо от того где она, должность, будет вставляется в начале или в середине, а формула автоматически будет производить пересчет от нового порядкового номера. В Excel это сделать намного проще - вставил строку в любом месте списка, а потом протянул формулу на вставленную строку. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 12:07:33
Дело в том, что номера уже стоят. Если мы хотим вставить, нужно сначала откорректировать все последующие номера. Т.е. при вводе проверить существует ли уже указанный номер (код) и предложить произвести пересчет последующих номеров.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 12:14:25
Этот момент я понимаю, почему и спросил Вас, возможно ли это реализовать с использованием формул, если да, то если не сложно и если Вам будет интересно помогите.
|
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 12:51:44
Я считаю (почти уверен) это неправильным направлением, поэтому неинтересно.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 13:03:51
Ок. Тогда хочу спросить, есть ли другие варианты реализации данного вопроса? И какое, по Вашему мнению направление будет более правильным?
Спасибо. |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 13:22:18
Эти варианты были расписаны неоднократно ранее в переписке с Вами на форуме. И структура, и порядок работы, и алгоритмы, и примерные формулы.
:) Смайлик кликабельный. |
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 14:44:54
Ок. Уважаемый Zuluss, если можно, пожалуйста подскажите:
Цитировать:
Спасибо |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 14:46:37
Это во втором варианте формул. Вы его значит не пробовали.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 12.07.2021 :: 14:51:46
Пробовал, но там есть одно но - нет пересчета порядковых номеров без индекса.
|
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 12.07.2021 :: 15:36:17
Ну тогда в левую руку первый вариант, в правую второй, и комбинируете.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 15.07.2021 :: 11:15:05
Вот, постарался собрать из двух формул одну.
1. Формула по пересчету всех номеров (добавил комментарий, насколько хватило понимания) Code (] @SNS:=FIND("ОТ ДЛ01"); // выполняем строчный запрос по отбору всех записей поля 01 базы ДЛ @D:=1; // переменной @D будет присвоено значение равное 1 @A:=1;// переменной @A будет присвоено значение равное 1 @CNT:=VALCOUNT(@SNS); // получаем количество записей массива (переменной) @SNS базы ДЛ @I:=1 // счетчик записей равен 1 WHILE(@I<=@CNT) DO // тело цикла будет выполнено тогда, когда будут обработаны все отобранные записи переменной @CNT, которая больше или равна счетчику значений переменной @I [if (@SNS(@I)#@SYSNOMER)/* первая часть выражения будет выполнена если переменная @SNS не равна системному номеру записи, обрабатываемой по формуле */ then (if (ДЛ49{@SNS(@I)}#"")/* вторая часть выражения будет выполнена если в первой части поле 49, обрабатываемой записи базы ДЛ, не равно пустому значению {}применяются для получения доступа к полю любой другой записи базы ДЛ */ then [ДЛ10{@SNS(@I)}:=@A<<"A"; @A:=@A+1):
2. Формула по проставлению дополнительной литеры без изменения нумерации Code (] @SNS:=FIND("ОТ ДЛ01"); // выполняем строчный запрос по отбору всех записей поля 01 базы ДЛ @CNT:=VALCOUNT(@SNS); // получаем количество отобранных записей массива (переменной) @SNS базы ДЛ if (ДЛ49#"" & ДЛ10#"" & CHECKSYMBOL(ДЛ10,"A")=0) /* первая часть выражения будет выполнена если и поле 49, и поле 10 базы ДЛ неравны пустому значению, а также будет проверено наличие в строке 10 базы ДЛ искомого символа "А", которое будет равно "0" */ then (ДЛ10:=ДЛ10<<"A"); /* вторая часть выражения будет выполнена если в поле 10, обрабатываемой записи базы ДЛ, будет находится значение поля 10 базы ДЛ с индексом "А" */ if (ДЛ10="" & ДЛ49="") /* первая часть выражения будет выполнена если и поле 10, и поле 49 базы ДЛ равны пустому значению */ then (ДЛ10:=@CNT+1) /* вторая часть выражения будет выполнена если полю 10, обрабатываемой записи базы ДЛ, будет присвоено значение переменной @CNT с шагом + 1 */ [/code):
Формула вроде работает, но есть ряд проблем: 1. Если в последней записи в поле 49 проставить дату "ликвидации" ,то индекс "А" проставляется с сохранением старого порядкового номера, но как только я начинаю создавать новую запись cronos зависает. 2. Если я пытаюсь проставить в любую другую запись дату "ликвидации", то получаю зависание программы. Я понимаю, что это не формула виновата, а мои неправильные действия. И ещё, если можно (процетирую уважаемого Zuluss): Если я хочу вставить новую запись в любое другое место, как при помощи формулы откорректировать все последующие номера? Т.е. при вводе проверить существует ли уже указанный номер (код) и предложить произвести пересчет последующих номеров. Спасибо |
Заголовок: Re: Сквозная нумерация в БД Создано Zuluss в 15.07.2021 :: 12:53:50
Для варианта с постоянной нумерацией и проставлением литеры пересчитывать надо только текущую запись.
|
Заголовок: Re: Сквозная нумерация в БД Создано graffserg в 15.07.2021 :: 13:07:09 Zuluss записан в 15.07.2021 :: 12:53:50:
Уважаемый Zuluss, если не трудно, пожалуйста подскажите: 1. в каком месте нужно подправить код. :-[ 2. И как вставить новую запись в любое другое место, как при помощи формулы откорректировать все последующие номера? Т.е. при вводе проверить существует ли уже указанный номер (код) и предложить произвести пересчет последующих номеров. :-/ Очень нужно. Спасибо |
Форум компании Кронос-Информ » Powered by YaBB 2.5.2! YaBB © 2000-2009. Все права защищены. Localization by mySOPROMAT.ru |