for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

Равные периоды в остатке месяцев с начала года
Baga

Сообщений: 518
Откуда: г. Махачкала
Дата: 26.10.20 20:36:39
Здравствуйте форумчане.
В давно написанной программе возникла задача равномерного распределения остатков чего-либо до конца года.
Никак не могу сообразить, как это лучше сделать.
Вот более подробно:
Имеется некая головная таблица
  
  CREATE CURSOR kur (npp N(6,0),kolpl N(1,0))  
 * где kolpl случайное число от 1 до 4  
 *Заполняем  
  FOR i=1 TO 10000  
      INSERT INTO kur (npp,kolpl) VALUES (i, 1 + 3 * RAND( ))  
  NEXT   
 *Убеждаемся, что kolpl между 1 и 4  
  SELECT MIN(kolpl) as mipl,MAX(kolpl) as mapl FROM kur  
 **Создаем подчиненную таблицу  
  CREATE CURSOR child (npp N(6,0), mpm N(2,0))
Задача состоит в том, чтобы записать значение npp и месяца mpm в дочернюю таблицу столько раз, сколько раз указано в поле kolpl головной таблицы. При этом значение поля mpm должно быть распределено примерно равными промежутками между оставшимися до конца года месяцами.
Если количество оставшихся месяцев до конца года меньше значения kolpl, то kolpl принимается равным количеству
оставшихся месяцев.
Например:
  
  tm=1 && Текущий месяц  
  om=12-tm+1=12 && Количество оставшихся месяцев, включая текущий  
 *Если  
  kolpl=4  
  &&Количество записей в дочерней таблице 4, значения mpm 3,6,9,12  
 *Если   
  kolpl=1   
  &&Количество записей в дочерней таблице 1, значение 6  
 * и т.д.  
 *допускается ежемесячное указание значения mpm, если нет другого выходя или часть через какой-то промежуток, а часть ежемесячно  
 *Пример 2:  
  tm=10 && Текущий месяц  
  om=12-tm+1=3 && Количество оставшихся месяцев, включая текущий  
 *Если  
  kolpl=4  
 *то kolpl=3  
 *в дочерней таблице 3 записи 10, 11, 12  
и т.д.
Пробовал различные подходы, но без ручной корректировки никак не удается справиться с ситуацией. В итоге получается очень большая разница количества записей в разных месяцах.
Помогите, пожалуйста, справиться с этой ситуацией.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive

Re: Равные периоды в остатке месяцев с начала года
Владимир Максимов
Автор

Сообщений: 13866
Откуда: Москва
Дата: 27.10.20 00:25:58
Вас вводит в заблуждение "магия" месяцев

Какое же это равномерное распределение при значении 4 в виде 3,6,9,12. Здесь от начала интервала до первого значения = 3, а от последнего значения до конца интервала = 0. Это не есть "равномерное" распределение

Исходите из того, что kolpl - это количество значений. Но для равномерного распределения Вам нужно знать количество интервалов. А это будет на единицу больше = kolpl+1

Логика такая

kolpl = 4
Интервалов = 4 + 1 = 5

Оставшихся месяцев = 12 -> Средний интервал = 12 / 5 = 2,4

Число 1 = round(1*2.4, 0) = 2
Число 2 = round(2*2.4, 0) = 5
Число 3 = round(3*2.4, 0) = 7
Число 4 = round(4*2.4, 0) = 10

А вот если kolpl больше или равно количеству оставшихся месяцев, то равномерного распределения не будет. А будет просто перечисление оставшихся месяцев

Если в виде кода, то примерно так


  
  kolpl = 4 	&& количество значений  
  tm = 1 	&& текущий месяц  
    
 * Оставшихся месяцев  
  om = 12 - tm + 1  
    
  if kolpl>=om  
  	for i = 1 to om  
  		?tm - 1 + i  
  	endfor  
  else  
  	stepM = om / (kolpl + 1)  
  	for i = 1 to kolpl  
  		?tm - 1 + round(i*stepM, 0)  
  	endfor  
  endif

Если уж совсем алгоритм не выходит, то просто сделайте настроечную таблицу с правильным по вашем мнению распределением. Значений то не особо много. Если я правильно понял, то у Вас kolpl от 1 до 4, а tm от 1 до 12. Всего возможных комбинаций 4*12 = 48. Не более 4 значений. Вот и сделайте табличку

kolpl
tm
m1
m2
m3
m4
Ratings: 0 negative/0 positive

Re: Равные периоды в остатке месяцев с начала года
Baga

Сообщений: 518
Откуда: г. Махачкала
Дата: 27.10.20 10:13:25
Спасибо, Владимир. Попробую переосмыслить.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 8 Oleg  (Гостей: 7)

30.11.2020 23:12:28 exec: 0.12
Mem: 1.116 Mb

© 2000-2020 Fox Club 
Яндекс.Метрика