cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход или Регистрация

 
 
  ГлавнаяСправкаПоискВходРегистрация  
 
Страниц: 1 2 3 
Послать Тему Печать
Сквозная нумерация в БД (Прочитано 877 раз)
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 886
Санкт-Петербург
Re: Сквозная нумерация в БД
Ответ #30 - 12.07.2021 :: 14:46:37
 
Это во втором варианте формул. Вы его значит не пробовали.
Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Сквозная нумерация в БД
Ответ #31 - 12.07.2021 :: 14:51:46
 
Пробовал, но там есть одно но - нет пересчета порядковых номеров без индекса.
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 886
Санкт-Петербург
Re: Сквозная нумерация в БД
Ответ #32 - 12.07.2021 :: 15:36:17
 
Ну тогда в левую руку первый вариант, в правую второй, и комбинируете.
Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Сквозная нумерация в БД
Ответ #33 - 15.07.2021 :: 11:15:05
 
Вот, постарался собрать из двух формул одну.
1. Формула по пересчету всех номеров (добавил комментарий, насколько хватило понимания)
Код:
@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] /* вторая часть выражения будет выполнена если полю 10, обрабатываемой записи базы ДЛ, будет присвоено значение переменной @A с индексом "А", а также переменной @A будет присвоено значение переменной @A с шагом + 1 {}применяются для получения доступа к полю любой другой записи базы ДЛ*/
						else [ДЛ10{@SNS(@I)}:=@D; @D:=@D+1])/* третья часть выражения будет выполнена если полю 10, обрабатываемой записи базы ДЛ, будет присвоено значение переменной @D, а также переменной @D будет присвоено значение переменной @D с шагом + 1 {}применяются для получения доступа к полю любой другой записи базы ДЛ*/
	else [ if (ДЛ49#"")/* третья часть выражения будет выполнена если в первой части поле 49, обрабатываемой записи базы ДЛ, не равно пустому значению */
			then [ДЛ10:=@A<<"A"; @A:=@A+1] /* вторая часть выражения будет выполнена если полю 10, обрабатываемой записи базы ДЛ, будет присвоено значение переменной @A с индексом "А", а также переменной @A будет присвоено значение переменной @A с шагом + 1*/
					else [ДЛ10:=@D; @D:=@D+1]];/* третья часть выражения будет выполнена если полю 10, обрабатываемой записи базы ДЛ, будет присвоено значение переменной @D, а также переменной @D будет присвоено значение переменной @D с шагом + 1*/
	@I:=@I+1] //переменной @I будет присвоено значение переменной @I с шагом + 1
 



2. Формула по проставлению дополнительной литеры без изменения нумерации
Код:
@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 */
 



3. Вот, что получилось
Код:
@SNS:=FIND("ОТ ДЛ01");
@D:=1;
@A:=1;
@CNT:=VALCOUNT(@SNS);
@I:=1
WHILE(@I<=@CNT) DO
[if (@SNS(@I)#@SYSNOMER
	then	(if (ДЛ49{@SNS(@I)}#"" & ДЛ10#"" & CHECKSYMBOL(ДЛ10,"A")=0)
				then [ДЛ10{@SNS(@I)}:=ДЛ10<<"A"; @A:=@A+1]
						else [ДЛ10{@SNS(@I)}:=@D; @D:=@D+1])
	else [ if (ДЛ49#"" & ДЛ10#"" & CHECKSYMBOL(ДЛ10,"A")=0)
			then [ДЛ10:=ДЛ10<<"A"; @A:=@A+1]
					else [ДЛ10:=@D; @D:=@D+1]];
	@I:=@I+1]
 


Формула вроде работает, но есть ряд проблем:
1. Если в последней записи в поле 49 проставить дату "ликвидации" ,то индекс "А" проставляется с сохранением старого порядкового номера, но как только я начинаю создавать новую запись cronos зависает.
2. Если я пытаюсь проставить в любую другую запись дату "ликвидации", то получаю зависание программы.
Я понимаю, что это не формула виновата, а мои неправильные действия.

И ещё, если можно (процетирую уважаемого Zuluss):
Если я хочу вставить новую запись в любое другое место, как при помощи формулы откорректировать  все последующие номера? Т.е. при вводе проверить существует ли уже указанный номер (код) и предложить произвести пересчет последующих номеров.
Спасибо
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 886
Санкт-Петербург
Re: Сквозная нумерация в БД
Ответ #34 - 15.07.2021 :: 12:53:50
 
Для варианта с постоянной нумерацией и проставлением литеры пересчитывать надо только текущую запись.
Наверх
 
 
IP записан
 
graffserg
Профи
****
Вне Форума



Сообщений: 134
Re: Сквозная нумерация в БД
Ответ #35 - 15.07.2021 :: 13:07:09
 
Zuluss писал(а) 15.07.2021 :: 12:53:50:
Для варианта с постоянной нумерацией и проставлением литеры пересчитывать надо только текущую запись.

Уважаемый Zuluss, если не трудно, пожалуйста подскажите:
1. в каком месте нужно подправить код. Смущённый

2. И как вставить новую запись в любое другое место, как при помощи формулы откорректировать  все последующие номера? Т.е. при вводе проверить существует ли уже указанный номер (код) и предложить произвести пересчет последующих номеров. Нерешительный

Очень нужно.
Спасибо
Наверх
 
 
IP записан
 
Страниц: 1 2 3 
Послать Тему Печать