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

 
 
  ГлавнаяСправкаПоискВходРегистрация  
 
Переключение на Главную Страницу Страниц: 1
Послать Тему Печать
Последовательность действий с записями (Прочитано 639 раз)
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Последовательность действий с записями
06.08.2018 :: 15:30:50
 
Есть такая задача – получить в шаблон выдачи ФИО учеников из связанной базы ЛЦ при выполнении определенного условия.
Имеем  преподавателей у которых от  1  до 100 учеников, часть последних с различными учеными степенями (описаны в связанной базе ЗВ).
Вопрос -
Возможно ли формулой получить на выдачу ФИО учеников из связанной базы, общее количество которых не должно превышать 12. Если их более 12, то отобрать  учеников имеющих ученую степень (допустим, вначале «доктор наук», затем  и\или «кандидат наук»), но таким образом, чтобы общее количество лиц в сумме при выдаче было не более 12.

Моя попытка выглядела таким образом
@COL := COUNT (ЛЦ42_ЛЦ);
@STUD := LOOP (ЛЦ42_ЛЦ,
[@FIO:= ЛЦ1];
[@STEPEN :=  cat (ЛЦ26_ЗВ, ЗВ1)];
[if @STEPEN =  "1" then @PROF := @FIO]);  //*  1 – доктор наук, 2 – кандидат наук

????? if @COL  >=  12  then @RET := @ STUD  ??????

Далее моя мысль останавливается  :-/
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


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

Сообщений: 2 425
Санкт-Петербург
Re: Последовательность действий с записями
Ответ #1 - 06.08.2018 :: 16:20:58
 
Так Вы же сами и описали алгоритм.
Для каждого из преподавателей формируете три массива: доктора, кандидаты, остальные.
После формирования этих массивов формируете результирующий проверяя максимум. Сначала добавляете из первого, потом второго, потом третьего. Если максимум превышен, на любом из массивов, прекращаете добавлять.
Наверх
 
 
IP записан
 
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Последовательность действий с записями
Ответ #2 - 06.08.2018 :: 16:47:22
 
Таки да. Я как та собака, которая все понимает, но ничего сказать не может. Даже предположу, что здесь еще необходимо использовать переменную @VALUESEPARATOR, но практически прописать формирование массива формируя результирующий и проверяя максимум "клепки" не хватает. Можете, как в анекдоте про чукчу рукой показать где север?!
Наверх
 
 
IP записан
 
Энкан
Профи
****
Вне Форума



Сообщений: 224
Владивосток
Re: Последовательность действий с записями
Ответ #3 - 07.08.2018 :: 14:19:50
 
Первым делом надо засунуть все связанные записи в массив, после посчитать сколько всего таких получилось, если больше 12, то начинаем перебирать массив на наличие заданных кодов из словаря, оставляем все что меньше 12 или по словарю.
Я в отпуске, не имею под рукой компа чтобы эту мысль в код обратить, но первое что вам надо, это составить массив значений для выдачи
Наверх
 
 
IP записан
 
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Последовательность действий с записями
Ответ #4 - 07.08.2018 :: 16:23:12
 
Спасибо за поддержку.
Я пытался отобрать записи, НО мой код выдает ТОЛЬКО ПОСЛЕДЮЮ фамилию из отобранного списка.   :-/

@COL := COUNT (ЛЦ42_ЛЦ);
@STUD := LOOP (ЛЦ42_ЛЦ,
[@FIO:= ЛЦ49];
[@STEPEN :=  cat (ЛЦ26_ЗВ, ЗВ1)];
if @STEPEN =  "1"  then @PROF := @FIO);  //*  1 – доктор наук, 2 – кандидат наук
if @COL # ""  then @RET := @PROF

Попытаюсь посчитать используя функцию VALCOUNT

@records := VALCOUNT(@STUD); // получить количество отобранных записей
@i := 0; // счетчик записей
WHILE ( @i < @records) DO
(@i := @i+1;) ???.......
Наверх
 
 
IP записан
 
Энкан
Профи
****
Вне Форума



Сообщений: 224
Владивосток
Re: Последовательность действий с записями
Ответ #5 - 08.08.2018 :: 14:55:26
 
Конечно он выдаст последнюю, ведь список надо поместить в массив, в каждой интерации через loop собранные значения надо собрать в массив (ADDVALUECHEK функция вроде, возьмите справочник по формулам) затем, если в этом массиве больше 12 записей то сортируем по коду и отрезаем первые 12 записей, которые уже отправляем в @ret

Блин, тяжело без компа, я в принципе понял как решить задачу, но писать синтаксис с телефона вообще не вариант.
Может кто из гуру поможет
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


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

Сообщений: 2 425
Санкт-Петербург
Re: Последовательность действий с записями
Ответ #6 - 12.08.2018 :: 18:22:13
 
Не было возможности смоделировать структуру, к которой есть вопросы и, соответственно, реально проверить, поэтому набросал примерный код. Он не является оптимальным из-за повторения операций, но наглядно показывает ход алгоритма действий:
Код:
@STUD := LOOP (ЛЦ42_ЛЦ, // наполняем массивы 1, 2, 3
	LOOP(ЛЦ26_ЗВ,
	if (ЗВ1=1) then (@lev_1(-1):=ЛЦ49);
	if (ЗВ1=2) then (@lev_2(-1):=ЛЦ49);
	if (ЗВ1#1 & ЗВ1#2 ) then (@lev_3(-1):=ЛЦ49);
	);
);

WHILE(1) DO // формируем результирующий массив. Если кол-во элементов в нем превышает 12, то выходим.
[
	@cnt:=VALCOUNT(@lev_1);
	WHILE(@cnt>0) DO
	[
		@LEV(-1):=@lev_1(@cnt)
		if VALCOUNT(@LEV)>12 then (goto end);
		@cnt:=@cnt-1
	];
	@cnt:=VALCOUNT(@lev_2);
	WHILE(@cnt>0) DO
	[
		@LEV(-1):=@lev_2(@cnt)
		if VALCOUNT(@LEV)>12 then (goto end);
		@cnt:=@cnt-1
	];
	@cnt:=VALCOUNT(@lev_3);
	WHILE(@cnt>0) DO
	[
		@LEV(-1):=@lev_3(@cnt)
		if VALCOUNT(@LEV)>12 then (goto end);
		@cnt:=@cnt-1
	];

];
END:
@RET:=@LEV 

Наверх
 
 
IP записан
 
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Последовательность действий с записями
Ответ #7 - 13.08.2018 :: 17:54:55
 
Спасибо за код. Как говаривал один мой начальник - "Нам так не жить." Немного подправил формулу, так как Кронос ругался на ЛЦ49.

В результате заработало в таком виде 

@STUD := LOOP (ЛЦ42_ЛЦ, // наполняем массивы 1, 2, 3
[@FIO:= ЛЦ49];
     [LOOP(ЛЦ26_ЗВ,
     if (ЗВ1=1) then (@lev_1(-1):= @FIO);
     if (ЗВ1=2) then (@lev_2(-1):=@FIO);
     if (ЗВ1#1 & ЗВ1# 2) then (@lev_3(-1):=@FIO);
     );
]);

WHILE(1) DO // формируем результирующий массив. Если кол-во элементов в нем превышает 12, то выходим.
[
     @cnt:=VALCOUNT(@lev_1);
     WHILE(@cnt>0) DO
     [
           @LEV(-1):=@lev_1(@cnt)
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_2);
     WHILE(@cnt>0) DO
     [
           @LEV(-1):=@lev_2(@cnt)
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_3);
     WHILE(@cnt>0) DO
     [
           @LEV(-1):=@lev_3(@cnt)
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];

];
END:
@RET:=@LEV

Получаю желаемый список, следующего вида -

[b]В. Малышев_С. Бабийчук_В. Скурев_Д. Орликов_И. Лопухов_И. Лопухов_В. Малышев_В. Малышев_В. Григоров_А. Кожеков_А. Кожеков_Р. Таран_Р. Таран
[/b]
Я не учел, что звания множественное понятие и доктор наук, также имеет ранее полученную степень кандидата. Впрочем, при отборе "подхватываются" и другие звания привязанные к лицу. Получается повторение лица в списке. Например - (Малышев - доктор 1990, кандидат - 1985, доцент - 1985). Как "отсечь" повторения вообще не представляю. Может сравнить масcивы 1, 2, 3, и не выдавать повторы, но для меня "тайна сия велика есть". Если в учениках только одно лицо со званием, то в выдаче 12 повторов.       
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


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

Сообщений: 2 425
Санкт-Петербург
Re: Последовательность действий с записями
Ответ #8 - 13.08.2018 :: 23:25:32
 
Замените строки вида
Код:
 @LEV(-1):=@lev_N(@cnt) 


на
Код:
@LEV:= ADDVALUECHECK(@LEV, @lev_N(@cnt)) 

Наверх
 
 
IP записан
 
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Последовательность действий с записями
Ответ #9 - 14.08.2018 :: 16:29:38
 
После замены в коде выдача производится корректно для учителей, у которых количество учеников со "степенью" больше 12. Если учеников "со степенями" меньше 12 выдача не происходит и Кронос "зависает".

@STUD := LOOP (ЛЦ42_ЛЦ, // наполняем массивы 1, 2, 3
[@FIO:= ЛЦ49];
     [LOOP(ЛЦ26_ЗВ,
     if (ЗВ1=1) then (@lev_1(-1):= @FIO);
     if (ЗВ1=2) then (@lev_2(-1):=@FIO);
     if (ЗВ1#1 & ЗВ1#2) then (@lev_3(-1):=@FIO);
     );
]);

WHILE(1) DO // формируем результирующий массив. Если кол-во элементов в нем превышает 12, то выходим.
[
     @cnt:=VALCOUNT(@lev_1);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_1(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_2);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_2(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_3);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_3(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];

];
END:
@RET:=@LEV
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


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

Сообщений: 2 425
Санкт-Петербург
Re: Последовательность действий с записями
Ответ #10 - 14.08.2018 :: 22:03:28
 
Да, общий цикл наверное лишний.
Попробуйте так.
Код:
@STUD := LOOP (ЛЦ42_ЛЦ, // наполняем массивы 1, 2, 3
[@FIO:= ЛЦ49];
     [LOOP(ЛЦ26_ЗВ,
     if (ЗВ1=1) then (@lev_1(-1):= @FIO);
     if (ЗВ1=2) then (@lev_2(-1):=@FIO);
     if (ЗВ1#1 & ЗВ1#2) then (@lev_3(-1):=@FIO);
     );
]);

 // формируем результирующий массив. Если кол-во элементов в нем превышает 12, то выходим.
     @cnt:=VALCOUNT(@lev_1);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_1(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_2);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_2(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_3);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_3(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
END:
@RET:=@LEV 


Приходится делать без экспериментальной проверки из-за отсутствия структуры и некоторого количества данных, а моделировать нету времени.
Наверх
 
 
IP записан
 
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Последовательность действий с записями
Ответ #11 - 15.08.2018 :: 11:41:53
 
Крайняя правка кода правильно отбирает и дает на выдачу всех учеников со степенями. "Затык" остался с учениками у которых вообще нет степеней. Раньше я всех скопом выдавал используя простой код @Ret:=cat(ЛЦ42_ЛЦ, ЛЦ49<<"; ") Вопрос в том как вставить некое подобное условие в имеющуюся формулу, дабы после всех "остепененных" выдавались простые ученики, у которых нет ссылки по полю ЛЦ26 на базу ЗВ ограничив их также в пределах 12?

Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


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

Сообщений: 2 425
Санкт-Петербург
Re: Последовательность действий с записями
Ответ #12 - 15.08.2018 :: 13:04:03
 
Делается аналогично. Если нет связи с ЗВ заносим в другой массив, который также перебираем.
Код:
@STUD := LOOP (ЛЦ42_ЛЦ, // наполняем массивы 1, 2, 3, 4
@FIO:= ЛЦ49;
     LOOP(ЛЦ26_ЗВ,
     if (ЗВ1=1) then (@lev_1(-1):= @FIO);
     if (ЗВ1=2) then (@lev_2(-1):=@FIO);
     if (ЗВ1#1 & ЗВ1#2) then (@lev_3(-1):=@FIO);
     );
	if (COUNT(ЛЦ26_ЗВ)=0) then (@lev_4(-1):=@FIO);
);
// формируем результирующий массив. Если кол-во элементов в нем превышает 12, то выходим.
     @cnt:=VALCOUNT(@lev_1);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_1(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_2);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_2(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
     @cnt:=VALCOUNT(@lev_3);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_3(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
	@cnt:=VALCOUNT(@lev_4);
     WHILE(@cnt>0) DO
     [
           @LEV:= ADDVALUECHECK(@LEV, @lev_4(@cnt))
           if VALCOUNT(@LEV)>12 then (goto end);
           @cnt:=@cnt-1
     ];
END:
@RET:=@LEV  

Наверх
 
 
IP записан
 
Iskander
Опытный пользователь
***
Вне Форума



Сообщений: 60
Re: Последовательность действий с записями
Ответ #13 - 15.08.2018 :: 15:56:50
 
Все работает как часы. Спасибо за внимание к моим проблемам, терпение и быструю помощь.  Улыбка 
Наверх
 
 
IP записан
 
Переключение на Главную Страницу Страниц: 1
Послать Тему Печать