powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Help
16 сообщений из 16, страница 1 из 1
Help
    #33045989
Tone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите решить следующию задачу. Как заполнить месяц (с 1 по 31) следующим циклом 2-раполняем 3-пропускаем и так до конца месяца. Существуют несколько видов заполнения (2 ч-з 2; 3 ч-з 1; 3 ч-з 3 ... и т.д.)
...
Рейтинг: 0 / 0
Help
    #33046100
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "заполнить месяц"?
Ну или сказал бы, что график работы сторожей хочешь сделать...
...
Рейтинг: 0 / 0
Help
    #33046120
Tone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Именно ... врнее говоря скользящий график работы. Может кто подскажит решение. Зарание спосибо.
...
Рейтинг: 0 / 0
Help
    #33046172
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если все-таки написать что именно надо получить?

-) Результат расчета записывается в таблицу?
-) Результат расчета - это: список дат, интервала дат, порядковые номера дней в месяце?
-) Расчет производиться только на один месяц или за период с ... по ... ?
-) В течении расчетного периода график может меняться?
-) Учитываются ли выходные и праздничные дни?

И это еще не все вопросы! Без полноценного ТЗ внятного ответа не получишь!
...
Рейтинг: 0 / 0
Help
    #33046177
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что Вас собственно смущат получаете количество дней в месяце получаете первый день и в цикле элементарно через масивы
ищете стандарную функцию?
...
Рейтинг: 0 / 0
Help
    #33046241
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafа что Вас собственно смущат получаете количество дней в месяце получаете первый день и в цикле элементарно через масивы
ищете стандарную функцию?
Праздник не закончился? ;-)
...
Рейтинг: 0 / 0
Help
    #33046293
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2redrik
Ну может я чего и сморозил но просто не хочеться ваять чего-то за человека (без предоплаты ) при такой не четкой постановке задачи
Хотя сама задачка не так что бы тяжелая но не так что бы и легкая
Когда мне нужно было я с подобной задачей в общем виде (часов 1-5 непомню) справлялся хотя исходник за давностью лет и за ненадобностью увы утерян
...
Рейтинг: 0 / 0
Help
    #33046591
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leafНу может я чего и сморозил но просто не хочеться ваять чего-то за человека
1. Тогда зачем вообще "морозить"? :-(
2. Знаки препинания облегчают понимание! ;-)
...
Рейтинг: 0 / 0
Help
    #33047190
Tone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ

1. Результаты записываются в таблицу либо в курсор неважно
2. Результат - список дат (с 1 по 31)
3. Расчет производится только за один месяц
4. В течение расчетного периода график не меняется
5. Выходные и праздники не учитывать
...
Рейтинг: 0 / 0
Help
    #33047435
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tone3. Расчет производится только за один месяц
А если человек работает, например, по схеме "3 ч-з 3", отработал 29,30,31...
С 1-го числа следующего месяца ему снова три дня вкалывать?
...
Рейтинг: 0 / 0
Help
    #33047533
Tone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Redrik Tone3. Расчет производится только за один месяц
А если человек работает, например, по схеме "3 ч-з 3", отработал 29,30,31...
С 1-го числа следующего месяца ему снова три дня вкалывать?
В этом случае расчет следующего месяца пойдет не с 1-го а с 4 числа ... будет предусмотрена проверка.

Копался с массивами у меня получается только для каждого конкретного случая.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
CREATE CURSOR qwe (day i( 0 ))

DIMENSION mes( 31 )
	
FOR i= 1  TO  31 
    mes(i)=i
ENDFOR 

&&  3  через  1 
FOR i= 1  TO  31 
    mesy=mes(i)
    mesy1=mes(i+ 1 )
    mesy2=mes(i+ 2 )
    SELECT qwe
    APPEND BLANK
    REPLACE day WITH mesy 
    APPEND BLANK 
    REPLACE day WITH mesy1 
    APPEND BLANK 
    REPLACE day WITH mesy2
    i=i+ 3 
ENDFOR

&&  2  через  2 
FOR i= 1  TO  12 
    mesy=mes(i)
    mesy1=mes(i+ 1 )
    SELECT qwe
    APPEND BLANK
    REPLACE day WITH mesy 
    APPEND BLANK 
    REPLACE day WITH mesy1
    i=i+ 2 
ENDFOR   
и так далее... может подскажите чтонибудь универсальное.
...
Рейтинг: 0 / 0
Help
    #33047588
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свое время, когда делал систему для ведения графиков (а их на предприятии было порядка 30 различных) НО было введено понятие цикла графика - это как раз в даном случае РРРВВВ и сдвиг от начала цикла (на начало года или месяца) и по этой инфе строил график на весь год
...
Рейтинг: 0 / 0
Help
    #33047595
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простейший вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
LOCAL ldFromDate, ldToDate
ldFromDate = DATE( 2005 , 1 , 1 )		&& начало месяца
ldToDate   = GoMonth(m.ldFromDate, 1 )- 1 	&& конец месяца

LOCAL lnWorkDay, lnRestDay
lnWorkDay =  2 	&& количество рабочих дней
lnRestDay =  3 	&& количество выходных дней

* Итоговый курсор
CREATE CURSOR Result (NextDate D)

LOCAL lnI, ldNextDate, ldNextToDate
FOR lnI =  1  TO (m.ldToDate - m.ldFromDate +  1 ) STEP (m.lnWorkDay + m.lnRestDay)
	* Первый рабочий день
	ldNextDate = m.ldFromDate + (m.lnI -  1 )
	* Последний рабочий день
	ldNextToDate = m.ldNextDate + (m.lnWorkDay -  1 )
	IF m.ldNextToDate > m.ldToDate
		m.ldNextToDate = m.ldToDate
	ENDIF
	* Записываю рабочие дни
	DO WHILE m.ldNextDate <= m.ldNextToDate 
		INSERT INTO Result (NextDate) VALUES (m.ldNextDate)
		* Следующая дата
		ldNextDate = m.ldNextDate +  1 
	ENDDO
ENDFOR

* Результат
SET DATE GERMAN
SET CENTURY ON
select Result 
go top
browse nowait
...
Рейтинг: 0 / 0
Help
    #33047680
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tone Копался с массивами у меня получается только для каждого конкретного случая.
... может подскажите чтонибудь универсальное.
Ну что же, попробую.
Во-первых, кто сказал, что дней будет 31? Надо брать реальные цифры (количество дней в месяце), а не "зашивать" их жестко в циклы - в феврале даже в високосный год не будет 31 день! А от этого пойдут в дальнейшем накладки... Итак, имеем переменную - KolDays.
Во-вторых, пару "append blank - replace" вполне можно заменить на "insert into...". И работать будет быстрее...
В-третьих, имея различные графики работы можно это дело параметризовать, то есть ввести переменые: KolWorkDays (количество рабочих дней) и KolFreeDays (количество дней отдыха). Тогда режим 3 через 3 будет прописан так: KolWorkDays=3 и KolFreeDays=3.
В-четвертых, менять значение переменной цикла внутри самого цикла не есть хорошо. Поэтому, откажемся от цикла For и заменим его на While.
В-пятых, желательно хранить все настройки в отдельном файле/файлах.
В-шестых, необходимо задать день начала расчета в графике (как это было правильно сказано в одном из предыдущих постов). Тогда имеем переменную FirstWorkDay.

В итоге получаем примерно следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
&&Main programm
CREATE CURSOR qwe (day i( 0 ))

DIMENSION mes( 31 )
dimension year( 12 )

&&  3  через  1 
KolWorkDays= 3 
KolFreeDays= 1 
KolDays= 31 
FirstWorkDay= 1 
=Grafik(KolDays,KolWorkDays,KolFreeDays,FirstWorkDay)
&& или =Grafik( 31 , 3 , 1 , 1 )
....

&& Target procedure
Procedure Grafik 
Parameters KolDays,KolWorkDays,KolFreeDays,FirstWorkDay
Private i,j,DaysToSkip;
i=FirstWorkDay;
j= 0 ;
do while (i<KolDays)
    j=j+ 1 

    if j<=KolWorkDays
      insert into qwe (day) value (i)
    endif

    if j<KolWorkDays
      DaysToSkip= 1 
    else
     j= 0 
     DaysToSkip=KolFreeDays+ 1 
    endif

    i=i+DaysToSkip
ENDDo
return

...
Рейтинг: 0 / 0
Help
    #33047772
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
LOCAL ldFromDate, ldToDate
ldFromDate = DATE( 2005 , 1 , 1 )		&& начало месяца
ldToDate   = GoMonth(m.ldFromDate, 1 )- 1 	&& конец месяца

LOCAL lnWorkDay, lnRestDay
lnWorkDay =  2 	&& количество рабочих дней
lnRestDay =  3 	&& количество выходных дней

* Итоговый курсор
CREATE CURSOR Result (NextDate D)

LOCAL lnI, ldNextDate
FOR lnI =  1  TO (m.ldToDate - m.ldFromDate +  1 ) 
	IF BETWEEN(MOD(m.lnI,m.lnWorkDay + m.lnRestDay), 1 ,m.lnWorkDay)
		INSERT INTO Result (NextDate) VALUES (m.ldFromDate + (m.lnI -  1 ))
	ENDIF
ENDFOR

* Результат
SET DATE GERMAN
SET CENTURY ON
select Result 
go top
browse nowait

Если оформить это через функцию, то и получим "универсальный" алгоритм.
...
Рейтинг: 0 / 0
Help
    #33047917
Tone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо свем кто откликнулся.
ВладимирМ
то шо доктор прописал!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Help
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]