powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запустить код на выполнение?!
37 сообщений из 37, показаны все 2 страниц
Запустить код на выполнение?!
    #37734783
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться с кодом!?

Код: sql
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
DEFINE CLASS progressbar AS container

*Длина полосы индикатора
Width = 100
*Высота полосы индикатора
Height = 20
BackStyle = 0
BorderWidth = 0
**Максимальное значение переменной процесса
MaxValue = (This.Width)
**Текущее значение переменной процесса 
CurrentValue = 0
name = "progressbar"
** Объект показывающий общую длинну процесса 

**Разместить на всей площади контейнера 
ADD OBJECT border AS shape WITH ;
Top = 0, ;
Left = 0, ;
Height = (this.Parent.Height), ;
Width = (this.Parent.Width), ;
name = "border"

** Разместить по высоте контейнера с нулевой длинной 
ADD OBJECT bar AS shape WITH ;
Top = 0, ;
Left = 0, ;
Height = (this.Parent.Height), ;
Width = 0, ;
BackStyle = 0, ;
BorderWidth = 0, ;
curvature = 0, ;
Fillstyle = 0, ;
Fillcolor = RGB(0,0,255), ;
name = "Bar"

PROCEDURE curentvalue_assing
*при изменении текущего значения пораметра 
*необходимо присвоить объект текущего значения 
LPARAMETERS vNewVal
*Анализ значения принятого пораметра
DO CASE 
    CASE m.vNewVal<0
        this.CurrentValue = 0 
    CASE m.vNewVal>0 AND m.vNewVal<=this.maxvalue
        this.CurrentValue = m.vNewVal 
    CASE m.vNewVal>this.maxvalue
ENDCASE 
*перерисовка объекта
this.bar.width=INT(this.Width*(this.currentvalue/this.maxvalue))
ENDPROC 

PROCEDURE init 
*настройка объектов на размер контейнера
this.bar.Height = this.Height 
this.bar.width = 0
this.border.Height = this.Height 
this.border.Width = this.Width 
ENDPROC 
ENDDEFINE 
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37734886
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

А как ты хочешь этот код запустить? Там только определение класса
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37734892
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

А какое можно найти ему применение?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37734923
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Да миллион вариантов. Включи в код метода формы или в .prg, например.
Это пример динамического создания класса
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37734967
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Можешь на примере показать использование этого кода в .prg.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37735048
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В коде несколько ошибок. Хотя, может даный класс был рассчитан на специфическое использование. В приведенном примере сделано следующее

1. Удалены присвоения вида Height = (this.Parent.Height)
2. Вместо названия метода "curentvalue_assing" должно быть "curentvalue_assign". Две последние буквы поменять местами


Код: sql
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
Public oForm as Form 
oForm = CreateObject('Form')
oForm.Show()

oForm.AddObject('oProgress','progressbar')
oForm.oProgress.visible = .T.
oForm.oProgress.CurrentValue = 0

For lnI=1 to 100
	oForm.oProgress.CurrentValue = m.lnI
	Doevents 
	Inkey(0.01)   && в рабочем проекте эта команда не нужна. Здесь она для организации задержки
EndFor

oForm.Release()


DEFINE CLASS progressbar AS container

*Длина полосы индикатора
Width = 100
*Высота полосы индикатора
Height = 20
BackStyle = 0
BorderWidth = 0
**Максимальное значение переменной процесса
MaxValue = (This.Width)
**Текущее значение переменной процесса 
CurrentValue = 0
name = "progressbar"
** Объект показывающий общую длинну процесса 

**Разместить на всей площади контейнера 
ADD OBJECT border AS shape WITH ;
Top = 0, ;
Left = 0, ;
name = "border"

** Разместить по высоте контейнера с нулевой длинной 
ADD OBJECT bar AS shape WITH ;
Top = 0, ;
Left = 0, ;
Width = 0, ;
BackStyle = 0, ;
BorderWidth = 0, ;
curvature = 0, ;
Fillstyle = 0, ;
Fillcolor = RGB(0,0,255), ;
name = "Bar"

PROCEDURE CurrentValue_ASSIGN
*при изменении текущего значения пораметра 
*необходимо присвоить объект текущего значения 
LPARAMETERS vNewVal
*Анализ значения принятого пораметра
DO CASE 
    CASE m.vNewVal<0
        this.CurrentValue = 0 
    CASE m.vNewVal>0 AND m.vNewVal<=this.maxvalue
        this.CurrentValue = m.vNewVal 
    CASE m.vNewVal>this.maxvalue
ENDCASE 
*перерисовка объекта
this.bar.width=INT(this.Width*(this.currentvalue/this.maxvalue))
ENDPROC 

PROCEDURE init 
*настройка объектов на размер контейнера
this.bar.Height = this.Height 
this.bar.width = 0
this.border.Height = this.Height 
this.border.Width = this.Width 
ENDPROC 
ENDDEFINE 

...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37735721
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Спасибо, получилось то что нужно.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37735739
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще такой момент, может кто подскажет.
Есть программа, она считает, отображает, записывает и т.д. И когда она считает, занимает много времени. Для того чтобы пользователь видел что программа еще работает я вставил сообщение:
Код: sql
1.
2.
WAIT WINDOW "Идёт отбор данных... Ждите..." NOWAIT NOCLEAR AT SROWS()/2, SCOLS()/2
WAIT CLEAR


Но оно по словам начальника не информативно и не дает пользователю уверенности что программа еще работает!
Я вставил несколько таких сообщений с названиями отображающими этап работы программы, но в место пяти вставленных сообщений отображаются только два.
Можно что ни будь сделать, что бы, видеть, что программа еще работает?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37735766
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Так у тебя же пример есть с прогресбар :)
вот и воткни его в дополнение к WAIT WIND
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37735795
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Я так и хотел вот только не знаю как совместить WAIT WIND с DEFINE CLASS.
Если не трудно приведи пример.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37735952
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Для начала скажи, как ты определяешь форму
И что у тебя за фокс?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736052
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Visual Fox Pro 9.0

Код: sql
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
*Передаётся тип отчёта(зарезервировано)
PARAMETERS tip_otch
*Нужно для работы с репортами
PUBLIC datt, datt_ok 
PUBLIC lc_TypeInterval, lc_NumQuarter
SET DATE GERMAN 
*выключаем вывод на форму отладочной информации
SET CONSOLE OFF 
*Не обрабатывать помеченные удалёнными
SET DELETED ON

*Окошко,которое просит подождать
WAIT WINDOW "Идёт отбор данных... Ждите..." NOWAIT NOCLEAR AT SROWS()/2, SCOLS()/2 

*Заполняем курсоры подразделений, исполнителей и кураторов + поле признака пометки чекбоксом
SELECT kstruct,nastruct,vsp FROM struct_podr UNION ALL SELECT kstruct,nastruct,vsp FROM lvprivat ;
INTO CURSOR podr_al
SELECT podr_al.kstruct as kodp, podr_al.nastruct as naimp ,.f. as przk;
FROM podr_al ;
INTO CURSOR podrazd_al READWRITE 
**********************************  
SELECT ispleader.tabel as tabn,ispleader.fio as fio,;
.f. as przk,ispleader.kstruct as kodp,ispleader.phone as phone;
FROM ispleader ;
UNION ALL ;
SELECT lvPrivat.tabel as tabn,lvPrivat.fio as fio,;
.f. as przk,lvPrivat.kstruct as kodp,lvPrivat.phone as phone;
FROM lvPrivat ;
INTO CURSOR ispoln_al READWRITE  
*********************************
SELECT ispleader.tabel as tabn,ispleader.fio as fio,;
.f. as przk,ispleader.kstruct as kodp,ispleader.phone as phone ;
FROM ispleader ;
UNION ALL ;
SELECT lvPrivat.tabel as tabn,lvPrivat.fio as fio,;
.f. as przk,lvPrivat.kstruct as kodp,lvPrivat.phone as phone ;
FROM lvPrivat ;
INTO CURSOR kurat_al READWRITE  
*Для лога при поиске неоптимального(долгого) кода
*SET COVERAGE TO 'cover_eng.log'

WITH ThisForm.pageframe1.paGE1.container1

*получаем дату которая в окне выбора 
S=DateBegin
N=DateEnd

lc_TypeInterval=nTypeInterval
lc_NumQuarter=nNumQuarter

*Перевод в формат только даты
*datt=TTOD(s)
datt=DateBegin
datt_ok=DateEnd

*кусок для русского месяца
DO CASE 
 CASE lc_NumQuarter=1
     kvartal='Первый квартал'
 CASE lc_NumQuarter=2
     kvartal='Второй квартал'
 CASE lc_NumQuarter=3
    kvartal='Третий квартал'
 CASE lc_NumQuarter=4
    kvartal='Четвертый квартал'
ENDCASE
*кусок для русского месяца
DO CASE 
 CASE MONTH(s)=1
     mesyac='январь'
 CASE MONTH(s)=2
    mesyac='февраль'
 CASE MONTH(s)=3
    mesyac='март'
 CASE MONTH(s)=4
    mesyac='апрель'
 CASE MONTH(s)=5
    mesyac='май'
 CASE MONTH(s)=6
    mesyac='июнь'
 CASE MONTH(s)=7
    mesyac='июль'
 CASE MONTH(s)=8
    mesyac='август'
 CASE MONTH(s)=9
    mesyac='сентябрь'
 CASE MONTH(s)=10
    mesyac='октябрь'
 CASE MONTH(s)=11
    mesyac='ноябрь'
 CASE MONTH(s)=12
    mesyac='декабрь'
ENDCASE 
DO CASE 
 CASE MONTH(n)=1
     mesyacn='январь'
 CASE MONTH(n)=2
    mesyacn='февраль'
 CASE MONTH(n)=3
    mesyacn='март'
 CASE MONTH(n)=4
    mesyacn='апрель'
 CASE MONTH(n)=5
    mesyacn='май'
 CASE MONTH(n)=6
    mesyacn='июнь'
 CASE MONTH(n)=7
    mesyacn='июль'
 CASE MONTH(n)=8
    mesyacn='август'
 CASE MONTH(n)=9
    mesyacn='сентябрь'
 CASE MONTH(n)=10
    mesyacn='октябрь'
 CASE MONTH(n)=11
    mesyacn='ноябрь'
 CASE MONTH(n)=12
    mesyacn='декабрь'
ENDCASE 

*Устанавливаем соответствующие надписи на лейбелах
DO CASE
CASE lc_TypeInterval=1
    ThisForm.pageframe1.page1.Label1.Caption='Текущие значения показателей работы подразделений на: '+mesyac+' '+STR(YEAR(n),4,0)
    ThisForm.pageframe1.page2.Label1.Caption='Текущие значения показателей работы подразделений на: '+mesyac+' '+STR(YEAR(n),4,0)
    ThisForm.pageframe1.page3.Label1.Caption='Перечень карточек по подразделению на: '+mesyac+' '+STR(YEAR(n),4,0)
CASE lc_TypeInterval=2
    ThisForm.pageframe1.page1.Label1.Caption='Текущие значения показателей работы подразделений на: '+kvartal+' '+STR(YEAR(n),4,0)
    ThisForm.pageframe1.page2.Label1.Caption='Текущие значения показателей работы подразделений на: '+kvartal+' '+STR(YEAR(n),4,0)
    ThisForm.pageframe1.page3.Label1.Caption='Перечень карточек по подразделению на: '+kvartal+' '+STR(YEAR(n),4,0)
ENDCASE 
*Нахождение послднего дня месяца(коректно в высокосный год и переходу между годами)
*datt_ok=GOMONTH(datt,1)-1    && +1 МЕСЯЦ -1 ДЕНЬ

*Иначе нельзя!!!(нельзя делать селект в курсор, который является источником)
.grdVuborIsp.recordSource=[]

*Заполняем курсоры подразделений, исполнителей и кураторов + поле признака пометки чекбоксом
SELECT struct_podr.kstruct as kodp, struct_podr.nastruct as naimp ,.f. as przk ;
FROM struct_podr ;
UNION ALL ;
SELECT lvPrivat.kstruct as kodp, lvPrivat.nastruct as naimp ,.f. as przk ;
FROM lvPrivat ;
INTO CURSOR podrazd_al READWRITE 
********************************    курсор исполнителей
SELECT ispleader.tabel as tabn, ispleader.fio as fio,;
       .f. as przk, ispleader.kstruct as kodp, ispleader.phone as phone ;
FROM ispleader ;
UNION ALL ;
SELECT lvPrivat.tabel as tabn, lvPrivat.fio as fio,;
.f. as przk, lvPrivat.kstruct as kodp, lvPrivat.phone as phone;
FROM lvPrivat ;
INTO CURSOR ispoln_al READWRITE 
*******************************        курсор кураторов 
SELECT ispleader.tabel as tabn, ispleader.fio as fio,;
.f. as przk, ispleader.kstruct as kodp, ispleader.phone as phone ;
FROM ispleader ;
UNION ALL ;
SELECT lvPrivat.tabel as tabn, lvPrivat.fio as fio,;
.f. as przk, lvPrivat.kstruct as kodp, lvPrivat.phone as phone ;
FROM lvPrivat ;
INTO CURSOR  kurat_al READWRITE  
*******************************

* ВЫБОРКА *
WAIT WINDOW "Выборка всех данных... Ждите..." NOWAIT NOCLEAR AT SROWS()/2, SCOLS()/2 
SELECT podrazd_al.naimp as naimp, ispoln_al.fio as fio_isp,;
        (ALLTRIM(kard.regnumb)+'('+ALLTRIM(pointtask.pointnumb)+')') as regn, kurat_al.fio as fio_kur,;
        IIF(EMPTY(pointtask.datenew), pointtask.dateout, pointtask.datenew) as d_n,;
        000000 as dnei, 000000 as dn_per, kard.pz as pz,;
        IIF(EMPTY(pointtask.datefact) OR pointtask.datefact>datt_ok, datt_ok, pointtask.datefact) as d_k,;
        pointtask.dateout as d_out,pointtask.datenew as d_new,pointtask.datefact as d_fact,pointtask.datecansel as d_cansel,;
        kard.regnumb,pointtask.datemarke,IIF(pointtask.datenew=CTOD(''),pointtask.dateout,;
        IIF(EMPTY(pointtask.datefact),IIF(pointtask.datenew>=pointtask.datemarke,pointtask.datenew,pointtask.datemarke),;
        IIF(pointmove.datenew>=pointmove.datemarke,pointmove.datenew,pointmove.datemarke))) as d_mkn,;
        IIF(EMPTY(pointtask.datefact) OR pointtask.datefact>datt_ok, datt_ok, pointtask.datemarke) as d_mkk,kard.doctitle,pointtask.pointsod,kard.docname,pointtask.pointnumb;
    FROM  kard JOIN pointtask ON kard.regnumb=pointtask.regnumb;
                left JOIN ispoln_al ON ispoln_al.tabn=kard.tabispolnit; 
                left JOIN kurat_al ON kurat_al.tabn=kard.tabkurator;
                left JOIN podrazd_al ON podrazd_al.kodp=ispoln_al.kodp;
                left JOIN pointmove ON pointmove.regnumb=pointtask.regnumb;
                             AND pointmove.pointnumb=pointtask.pointnumb AND pointmove.datenew=pointtask.datenew; 
    WHERE (EMPTY(pointtask.datecansel) or pointtask.datecansel>datt_ok) ;
UNION ;
SELECT  podrazd_al.naimp as naimp,ispoln_al.fio as fio_isp,;
                (ALLTRIM(kardout.regnumb)+'('+ALLTRIM(pointout.pointnumb)+')') as regn,kurat_al.fio as fio_kur,;
                IIF(EMPTY(pointout.datenew),pointout.dateout,pointout.datenew) as d_n, 000000 as dnei,000000 as dn_per,;
                kardout.pz as pz,;
                IIF(EMPTY(pointout.datefact) OR pointout.datefact>datt_ok,datt_ok,pointout.datefact) as d_k,;
                pointout.dateout as d_out,pointout.datenew as d_new,pointout.datefact as d_fact,pointout.datecansel as d_cansel,;
                kardout.regnumb,pointout.datemarke,IIF(pointout.datenew=CTOD(''),pointout.dateout,;
                IIF(EMPTY(pointout.datefact),IIF(pointout.datenew>=pointout.datemarke,pointout.datenew,pointout.datemarke),;
                IIF(pointmoveout.datenew>=pointmoveout.datemarke,pointmoveout.datenew,pointmoveout.datemarke))) as d_mkn,;
                IIF(EMPTY(pointout.datefact) OR pointout.datefact>datt_ok,datt_ok,pointout.datemarke) as d_mkk,kardout.doctitle,pointout.pointsod,kardout.docname,pointout.pointnumb;
    FROM kardout JOIN pointout ON kardout.regnumb=pointout.regnumb;
                    left JOIN ispoln_al ON ispoln_al.tabn=kardout.tabispolnit;
                    left JOIN kurat_al ON kurat_al.tabn=kardout.tabkurator;
                    left JOIN podrazd_al ON podrazd_al.kodp=ispoln_al.kodp;
                    left JOIN pointmoveout ON pointmoveout.regnumb=pointout.regnumb;
                             AND pointmoveout.pointnumb=pointout.pointnumb AND pointmoveout.datenew=pointout.datenew; 
    WHERE EMPTY(pointout.datecansel) or !BETWEEN(pointout.datecansel,datt,datt_ok) ;
    INTO CURSOR tt_al ORDER BY regn

*Селект для отбора данных необходимых в данной форме :)
SELECT tt_al.*;
 FROM tt_al;
    WHERE ((BETWEEN(d_n,datt,datt_ok) AND (EMPTY(d_fact) OR BETWEEN(d_fact,datt,datt_ok))) ;
     OR (BETWEEN(d_fact,datt,datt_ok));
     OR (EMPTY(d_fact) AND d_n<datt ) ;
     OR (BETWEEN(d_mkk,datt,datt_ok) AND d_fact<datt AND !EMPTY(d_fact))) AND (EMPTY(d_cansel) OR d_cansel>=datt);
INTO CURSOR t_al READWRITE;
ORDER BY tt_al.fio_isp
*OR (BETWEEN(d_mkk,datt,datt_ok) AND d_fact<datt)
GO TOP IN podrazd_al
GO TOP IN ispoln_al
GO TOP IN kurat_al

thisform.pageframe1.page3.grid1.RecordSource=[empty]
*Копия для работы алг подсчёта, назовём "расчётной таблицей"
SELECT t_al.*;
 FROM t_al;
INTO CURSOR t1_al READWRITE ;
ORDER BY t_al.fio_kur

SELECT t1_al

WAIT WINDOW "Идёт подсчёт дней... Ждите..." NOWAIT NOCLEAR AT SROWS()/2, SCOLS()/2 

*************************************
*Алгоритм подсчёта дней
*************************************
SCAN
    *Селект собирающий все переносы по текущей карте(пункту),отсортированый по datenew
    SELECT pointmove.datenew,;
             IIF(pointmove.datemarke>datt_ok,datt_ok,pointmove.datemarke) as datemarke;
        FROM pointmove ;
        WHERE ALLTRIM(pointmove.regnumb)+'('+ALLTRIM(pointmove.pointnumb)+')'=t1_al.regn;
                 AND (pointmove.datenew<=datt_ok OR (pointmove.datenew>datt_ok AND pointmove.datemarke<=datt_ok) ;
                 OR (pointmove.datenew<=datt_ok AND pointmove.datemarke>datt_ok));
    UNION;
    SELECT pointmoveout.datenew,;
            IIF(pointmoveout.datemarke>datt_ok,datt_ok,pointmoveout.datemarke) as datemarke;
        FROM pointmoveout ;
        WHERE ALLTRIM(pointmoveout.regnumb)+'('+ALLTRIM(pointmoveout.pointnumb)+')'=t1_al.regn;
                AND (pointmoveout.datenew<=datt_ok OR (pointmoveout.datenew>datt_ok AND pointmoveout.datemarke<=datt_ok) ;
                OR (pointmoveout.datenew<=datt_ok AND pointmoveout.datemarke>datt_ok));
    INTO CURSOR perenosu readwrite;
    ORDER BY 1

    SELECT perenosu
    GO TOP  

    *Используется для отладки(останов на опр намере карточки)
    *!*    IF LEFT(t1_al.regn,8)='24116016'
    *!*    ENDIF 
    SELECT perenosu
    *Подсчёт общего числа переносов
    kol_per=RECCOUNT()
    *Опоздания по переносам
    op_per=0
    *Опоздания по закрытию,либо ещё не закрыта,а должна
    op_vup=0
    SELECT perenosu
    GO TOP
    *Если переносы вообще есть,то
    IF kol_per>0
    *Запоминаем дату када должен был быть первый перенос
    old=t1_al.d_out 
    FOR i=1 TO kol_per
    *Если есть опоздания,то
    IF old<perenosu.datemarke
    *Считаем кол-во дней
    nn=perenosu.datemarke-(old)
    *Выключен подсчёт рабочих дней по просьбам трудящихся :)
     nn=nn-3
        *если опоздали из-за дороги,то
        IF nn<0
        *Закроем глаза
        nn=0
        ENDIF 
        *проссумировали оп по переносам
        op_per=op_per+nn
    ENDIF 
    *Запоминаем:када к нам в след раз должны придти :)(мы всё помним)
    old=perenosu.datenew 
    *Перемещаемся на след по времени перенос,
    skip
    *Выход из цикла если больше нет переносов для обработки
    ENDFOR 
    ENDIF 
    *Сюда попадём, если переносов вообще не было, или када подсчитаем опоздания по всем переносам
    *Были или нет переносы--без разницы, считаем колво дней опозданий с даты начала подсчёта(d_out или d_new<соотв посл переносу>)
        *!*IF t1_al.d_n<t1_al.d_mkk
        nn=t1_al.d_mkk-(t1_al.d_n)
        *!*calculate cnt() FOR BETWEEN(calendar.dday,t1_al.d_n+1,t1_al.d_mkk) TO nn in calendar
        nn=nn-3
        IF nn<0
        nn=0
        ENDIF 
        op_vup=op_vup+nn

       *Вернулись в главную таблицу
       SELECT t1_al
    *Заносим подсчитанные дни опоздания
    replace t1_al.dnei WITH op_per+op_vup,t1_al.dn_per WITH op_per
ENDSCAN
*Селект, который готовит данные для итоговой таблицы, осталось только подсчитать задания и коэффиц
SELECT distinct t1_al.naimp,t1_al.fio_isp,000 as zad_vsego,000 as zad_vup,0000000000 as kolvo_dnei,;
000000 as kolvo_op, 00.00 as koeffic,00.00 as koeffic2;
FROM t1_al;
INTO CURSOR isp_tmp readwrite;
ORDER BY t1_al.fio_isp

*!*kolvo=RECCOUNT()
*browse
GO TOP 
*Займёмся этим
SCAN 
*Фильтр по исполнителю в расчётной таблице 
SET FILTER TO t1_al.fio_isp=isp_tmp.fio_isp IN t1_al
*подсчитали всего заданий
calculate CNT() to n1 IN t1_al
replace isp_tmp.zad_vsego WITH n1 
n2=0
*Подсчитали кол-во вып заданий
calculate CNT() FOR !empty(t1_al.d_fact) AND (t1_al.d_fact<=datt_ok) to n2 IN t1_al
replace isp_tmp.zad_vup WITH n2
PRIVATE n3 n(10)
PRIVATE n4 n(10)
*Сумма всего дней для данного исполнителя
calculate sum(t1_al.dnei) to n3 IN t1_al
replace isp_tmp.kolvo_dnei WITH n3
*Сумма дней опозданий по переносам у данного исполнителя
calculate sum(t1_al.dn_per) to n4 IN t1_al 
replace isp_tmp.kolvo_op WITH n4
*Проверка, чтобы не было деления на ноль при подсч коэффиц
IF zad_vsego>0
IF isp_tmp.zad_vup=0
 IF kolvo_dnei=0 
  koeff=1
  ELSE 
  koeff=0
 ENDIF
ELSE   
koeff=(zad_vsego-0.05*kolvo_dnei)/zad_vsego
ENDIF 
ELSE
koeff=1
ENDIF 
IF koeff<0
koeff=0
ENDIF 
replace isp_tmp.koeffic WITH koeff
IF isp_tmp.koeffic=1
  koeff2=0
ELSE  
  koeff2=(1-koeff)*25
ENDIF  
replace isp_tmp.koeffic2 WITH koeff2
SET FILTER TO IN t1_al
ENDSCAN  
*Окончание заполнения итоговой таблицы
thisform.pageframe1.page2.grid1.recordsource=[empty]

GO TOP 
*.grdVuborPodr.recordSource=[]
*Формируем курсор подразделений
SELECT distinct struct_podr.kstruct as kodp, isp_tmp.naimp,.f. as przk ; 
FROM struct_podr JOIN isp_tmp ON struct_podr.nastruct=isp_tmp.naimp ;
UNION ALL ;
SELECT distinct lvPrivat.kstruct as kodp, isp_tmp.naimp,.f. as przk ; 
FROM lvPrivat JOIN isp_tmp ON lvPrivat.nastruct=isp_tmp.naimp ;
INTO CURSOR podrazd_al READWRITE ;
ORDER BY isp_tmp.naimp 
kolvo_podr=_tally 
GO top
IF kolvo_podr=0
    thisform.pageframe1.page1.container1.Visible= .F.
    MESSAGEBOX('Нету карточек на заданный период')
ELSE 
    *.grdVuborPodr.recordSource=[podrazd_al]
    *.grdVuborPodr.enabled=.t.
    thisform.pageframe1.page1.container1.Enabled= .T.
    thisform.pageframe1.page1.container1.Visible= .T.
ENDIF 
    ThisForm.Pageframe1.Page1.Container1.Command5.Visible = .F. 
    ThisForm.Pageframe1.Page1.Container1.Command6.Visible = .F. 
    ThisForm.Pageframe1.Page1.Container1.Command10.Visible = .F. 
    ThisForm.Pageframe1.Page1.Container1.Command1.Visible = .F.
    ThisForm.Pageframe1.Page1.Container1.Label6.Visible = .F.
    ThisForm.Pageframe1.Page1.Container1.grdVuborIsp.Visible = .F.
ENDWITH 
*Убираем окошко,которое просит подождать
WAIT CLEAR

...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736177
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Этот DEFINE CLASS пропиши в INIT() формы, а потом - как написано в примере,
но проще, если форма уже сделана заранее, в конструкторе перетащи
на нее ActiveX Microsoft ProgressBar и настрой его свойства Min=0, Max=RECC()
У тебя там два SCAN...ENDSCAN - вот в обоих и вызывай, Value= порядковый номер записи (не RECNO())
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736201
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540,

Да, до и между SELECT тоже можно сделать "псевдопрогрессбар"
После первого селект пишешь, например, Value=2, после второго =4 и т.д.,
после последнего =Max
Главное видно, что прога работает :)
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736251
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Приведенный код прописан в INIT() формы.
В начале, открывается другая форма, в которой выбирается интервал времени, затем, открывается форма с приведенным кодом, код прописан в INIT().
в конструкторе перетащи на нее ActiveX Microsoft ProgressBar А какой .ocx нужно выбрать что бы добавить ActiveX Microsoft ProgressBar на панель инструментов? И какой ActiveX Microsoft ProgressBar их там два?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736407
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Tools->Options->Controls->ActiveX Controls, какой ProgressBar выбрать - не вижу
особой разницы, ну выбери последний...
А тащить, видимо, придется на "другую форму, в которой..." И код из INIT
тоже туда же. Если "форма с приведенным кодом" открывается по кнопке,
то в клик кнопки, а уже после "загрузки данных", после WAIT CLEAR
- DO FORM "форма с приведенным кодом" (только уже без кода в INIT, оставь там
только передачу параметров)
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736631
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно с этого места по подробнее, я совсем запутался.
А тащить, видимо, придется на "другую форму, в которой..." И код из INIT
тоже туда же. Если "форма с приведенным кодом" открывается по кнопке,
то в клик кнопки, а уже после "загрузки данных", после WAIT CLEAR
- DO FORM "форма с приведенным кодом" (только уже без кода в INIT, оставь там
только передачу параметров)
Только я не знаю как из процедуры INIT() передавать эту форму параметры?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736755
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

А у тебя неплохо с графикой получается, может, поменять специализацию? :)

В форму "выбор интервала" в метод Click() кнопки "выбрать" сначала пишешь
код из INIT() формы "значения показателей" (т.е. отбор данных), и там же (в форме
"выбор интервала" в методе Click() кнопки) ProgressBar и Wait wind. В форме "значения показателей"
не будет никаких ProgressBar и Wait wind, все это - в форме "выбор интервала"
в методе Click()
В методе Load() формы "значения показателей" - Thisform.MyGrid.RecordSource=<имя_курсора>

Ну вот, вроде разжевал, глотай только. А вообще, и свои зубы надо иметь :)
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736758
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Кстати, тебя не повесят за публикацию кода?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736840
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у тебя неплохо с графикой получается, может, поменять специализацию?
Да у меня проблем с черчением ни когда не возникало. Раньше хотел быть проектировщиком, разрабатывать чертежи роботов трансформеров :)

Ну вот, вроде разжевал, глотай только. А вообще, и свои зубы надо иметь
Зубы есть, но когда работа не вызывает интерес, зубы использовать не хочется.

Кстати, тебя не повесят за публикацию кода?
Это еще что, когда была тема: «доступ к базе данных», вот там я действительно скинул очень много кода!
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37736952
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_AleksНу вот, вроде разжевал, глотай только. А вообще, и свои зубы надо иметь
Зубы есть, но когда работа не вызывает интерес, зубы использовать не хочется.

Буду рад, если хоть немного помог
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37737642
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Если не трудно, разжуй и ProgressBar. Что именно из ProgressBar я должен добавить в форму
"выбор интервала" в методе Click() кнопки Выбрать?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37737763
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

1. Это все давно уже жевано-пережовано.
2. Ценный совет номер раз из топика Вопрос по VFP 9.0
Dima Tсоветую взять и почитать книжку по фоксу. Любую.
3. Совет номер два - см.файл

Успехов!
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738254
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Как добавить ProgressBar я знаю, я не знаю как взаимодействуют , форма, в которой выполняется программ и ProgressBar.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738322
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,
2. Ценный совет номер раз из топика Вопрос по VFP 9.0
Dima Tсоветую взять и почитать книжку по фоксу. Любую.
Это из хэлпа:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Как передать параметр в форму, созданную в конструкторе форм
1.Создайте свойства формы, например ItemName и ItemQuantity, в которых вы будете
хранить значения параметров.
2.В обработчик события Init включите конструкцию PARAMETERS, например:
PARAMETERS cString, nNumber
3.В обработчике события Init присвойте свойствам значения параметров:
THIS.ItemName = cString
THIS.ItemQuantity = nNumber
4.Вызовите форму командой DO FORM с предложением WITH:
DO FORM myform WITH "Bagel", 24

Как вернуть значение из формы
1.Установите значение свойства формы WindowType равным 1, для того чтобы сделать ее модальной.
2.В обработчик события UnLoad включите команду RETURN с возвращаемым значением.
3.Для вызова формы используйте команду DO FORM с ключевым словом TO.
Например, если FindCustID является модальной формой, возвращающей текстовую строку, 
следующая команда присвоит возвращаемую строку переменной cCustID.
DO FORM FindCustID TO cCustID
Решение вопросов  В случае возникновения ошибки убедитесь, что значение свойства
WindowType равно 1 (модальная форма).
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738537
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во вложении пример класс progress bar. За основу взят класс Михаила Дунькина по этой ссылке http://www.foxclub.ru/sol/solution20.php с мелкими изменениями

Использовать в приложении можно так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
LOCAL lnTotal
lnTotal = reccount('MyTable')

SET CLASSLIB TO thermBar ADDITIVE
LOCAL loProgressBar
loProgressBar=CREATEOBJECT('tbrProg','Заполнение списка','Всего ' + ltrim(str(m.lnTotal)) + ' элементов', m.lnTotal)

LOCAL lnSeconds, lnI
lnI=0
lnSeconds=Seconds()
select MyTable
SCAN NOOPTIMIZE
	IF Seconds()-m.lnSeconds > 2
		loProgressBar.Visible=.T.
	   	loProgressBar.Update(recno(m.tcTable))
	ENDIF

	lnI=m.lnI+1
ENDSCAN



Здесь основная идея в том, что Progress Bar физически размещается в объекте ToolBar, как следствие, не требует отдельной формы и не может получить фокуса.

В качестве примера исполльзования здесь выбрано сканирование всех записей некоторой таблицы MyTable.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738847
Aleks_AleksЕще такой момент, может кто подскажет.
Есть программа, она считает, отображает, записывает и т.д. И когда она считает, занимает много времени. Для того чтобы пользователь видел что программа еще работает я вставил сообщение:
Код: sql
1.
2.
WAIT WINDOW "Идёт отбор данных... Ждите..." NOWAIT NOCLEAR AT SROWS()/2, SCOLS()/2
WAIT CLEAR


Но оно по словам начальника не информативно и не дает пользователю уверенности что программа еще работает!
Я вставил несколько таких сообщений с названиями отображающими этап работы программы, но в место пяти вставленных сообщений отображаются только два.
Можно что ни будь сделать, что бы, видеть, что программа еще работает?
Чем больше строчек в программе тем дольше будет выполняться код.

*Ты был на верном пути
WAIT 'Обработка'+CHR(13)+PADR[REPLICATE('.',RECNO()/RECCOUNT()*240),240,' '] WINDOW NOWAIT
*RECNO() это номер обрабатываемой записи в таблице

*Если записей в базе десятки и сотни тысяч тогда нет смысла на каждую запись выводить термометр
IF RECNO()%100=0 OR RECNO()=RECCOUNT()
WAIT 'Обработка'+CHR(13)+PADR[REPLICATE('.',RECNO()/RECCOUNT()*240),240,' '] WINDOW NOWAIT
ENDIF
*В данном примере мы двигаем термометр если остаток от деления на 100 равен 0,т.е. на каждую сотую запись двигаем термометр
*и на последок выводим термометр когда RECNO()=RECCOUNT()
*ПРИМЕЧАНИЕ - сортировка по индексу SET ORDER должна быть выключена для этой таблицы
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738856
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

Я что-то совсем запутался.
Столько разных вариантов и у меня ни чего не получается.
Вот сделал (попытался сделать) небольшой пример как оно должно работать, но оно работает ни так.
Если у кого еще остались нервы и время, помогите!
Нужно немножко подкорректировать формы. Они в архиве в месте с БД.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738872
Aleks_AleksВладимирМ,

Я что-то совсем запутался.
Столько разных вариантов и у меня ни чего не получается.
Вот сделал (попытался сделать) небольшой пример как оно должно работать, но оно работает ни так.
Если у кого еще остались нервы и время, помогите!
Нужно немножко подкорректировать формы. Они в архиве в месте с БД.
Мой вариант самый простой и быстрый, почти как твой.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738885
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.,

Вот-вот, я это и хотел написать, ни каких классов, ни каких форм, и ни каких параметров!
Скорее всего его буду и использовать.
Сейчас попробую.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37738913
Aleks_Aleksпроходящий.,

Вот-вот, я это и хотел написать, ни каких классов, ни каких форм, и ни каких параметров!
Скорее всего его буду и использовать.
Сейчас попробую.
Чем больше красоты и наворотов - тем больше тормозов при большом количестве записей.
В команде WAIT можешь ещё добавить параметр AT ... чтобы окошко wait выводилось в центре экрана.
Ещё маленькое примечание - в команде wait количество знаков-символов для вывода ограничено.
Я поставил - 'Обработка',CHR(13) и 240 знаков под термометр.
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37739102
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.,

Даже и не знаю, может я не правильно поставил сообщение но при выполнении программы отображается только:
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37739178
Aleks_Aleksпроходящий.,

Даже и не знаю, может я не правильно поставил сообщение но при выполнении программы отображается только:
Сколько записей в базе?
Этот код надо ведь в теле какого то цикла выполнять?
Например
SCAN
*тут термометр
ENDSCAN
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37739739
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.,

Работает.
А что если попробовать рисовать градусник, по количеству строчек кода?
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37739805
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
WAIT WINDOW 'Обработка '+STR(nZap)+" %"+CHR(13)+PADR[REPLICATE('|',INT(RECNO()*100/RECCOUNT())),100,' '] NOWAIT NOCLEAR AT SROWS(), SCOLS()/1000
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37740007
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.,
Сделал как ты и говорил.
Проставил по коду сообщения:
Код: sql
1.
2.
WAIT WINDOW 'Обработка '+STR(20)+" %"+CHR(13)+PADR[REPLICATE('|',20),100,' '] NOWAIT NOCLEAR AT SROWS()/2, SCOLS()/2
Inkey(1.0) && задержка 

А где код быстро выполняется, небольшую задержку для наглядности.
Всем огромное спасибо за помощь!
...
Рейтинг: 0 / 0
Запустить код на выполнение?!
    #37742332
Aleks_Aleks,

Главное принцип ты понял, остальное по вкусу.
По поводу интерфейса могу добавить только одно - делай поменьше чёрточек.
Чем меньше на экране рамок и чёрточек - тем лучше восприятие текстовой информации.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запустить код на выполнение?!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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