powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор строк в таблице
13 сообщений из 88, страница 4 из 4
Перебор строк в таблице
    #39285076
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй заменить это
ularsoft
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
&& Срочные депозиты юр. лиц со сроком погашения до 6 дней
SELECT * from proclcdt WHERE INLIST(pl_lc,'Х','Y') ;
ORDER BY pl_lc INTO CURSOR proclc
	    ex.cells(22,4+j).select
	    ex.cells(22,4+j)=0
	    * Обнуляю переменную, где буду хранить сумму за период
	    tt1_n6 = 0
    SCAN FOR m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)
    	* Считаю сумму за период
	SELECT * from Tempvo WHERE t1_n6!=0 AND t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN


на это
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	* Макс. даты закрытия счетов
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'Х','Y') ;
		group by pl_lc;
		having pl_dt_max <= m_date1 + 6; && те что закрыты или закроются в течении 6 дней
		into cursor proclc
	
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		into cursor tmp

	tt1_n6 = nvl(tmp.nSum, 0)


Если я все правильно понимаю, то должно помочь.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285966
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tна это
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	* Макс. даты закрытия счетов
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'Х','Y') ;
		group by pl_lc;
		having pl_dt_max <= m_date1 + 6; && те что закрыты или закроются в течении 6 дней
		into cursor proclc
	
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)


Если я все правильно понимаю, то должно помочь.

Дима, снова я.
Тут получается по 2 счетам 'Х', 'Y' находим максимальную дату?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285968
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что если по этим счетам разные сроки?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285987
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftТут получается по 2 счетам 'Х', 'Y' находим максимальную дату?
Находим отдельно по каждому. Посмотреть ведь можно, поставь сразу после селекта
Код: sql
1.
brow
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286001
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TularsoftТут получается по 2 счетам 'Х', 'Y' находим максимальную дату?
Находим отдельно по каждому. Посмотреть ведь можно, поставь сразу после селекта
Код: sql
1.
brow



Спасибо, я посмотрел. Находить по каждому счету максимальную дату. С этим пока все в порядке.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286041
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ularsoftDima Tпропущено...

Находим отдельно по каждому. Посмотреть ведь можно, поставь сразу после селекта
Код: sql
1.
brow



Спасибо, я посмотрел. Находить по каждому счету максимальную дату. С этим пока все в порядке.

Но, я делаю так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE LIKE('203*',SUBSTR(pl_lc,4,5)); && Здесь группа
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0 AND (Tempvo.t1_bs!='20512') AND (Tempvo.t1_lc!='12720311********'); && Исключаю счета по балансовому счету '20512' и счет '12720311********'
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
    	* здесь, сумма за период, ее и выводим в Excel.
	    ex.cells(20,4+j).select
	    ex.cells(20,4+j)=ABS(tt1_n6)



Отдельно делаю по счету '12720311********'
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'12720311********'); && Здесь счет
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0;
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
    	* здесь, сумма за период, ее и выводим в Excel.
	    ex.cells(21,4+j).select
	    ex.cells(21,4+j)=ABS(tt1_n6)


По данному счету установлены сроки:
pl_date1pl_date226/02/2016 24/06/201627/06/2016 08/08/2016

По факту 08/08/2016 - 29 = 10/07/2016, программа должна была вкл. в расчет с 10/07/2016. Не могу понять, почему не включает?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286046
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь отчет формирую за месяц.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверяй исходные данные.
У меня все работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create cursor proclcdt (PL_LC c(16), PL_DATE1 t, PL_DATE2 t)
insert into proclcdt values ('123ХХХ', {^2014-11-19}, {^2015-03-18})
insert into proclcdt values ('123ХХХ', {^2016-01-25}, {^2016-06-21})
insert into proclcdt values ('123ХХХ', {^2016-06-27}, {^2016-08-08})

m_date1 = {^2016-07-10}
	
* Макс. даты закрытия счетов
select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
	from proclcdt;
	WHERE LIKE('ХХХ*',SUBSTR(pl_lc,4,5));
	group by pl_lc;
	having pl_dt_max <= m_date1 + 29; 
	into cursor proclc

brow
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286135
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И это
Код: sql
1.
WHERE INLIST(pl_lc,'12720311********'); && Здесь счет


лучше писать так
Код: sql
1.
WHERE pl_lc = '12720311********';
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286920
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПроверяй исходные данные.
У меня все работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create cursor proclcdt (PL_LC c(16), PL_DATE1 t, PL_DATE2 t)
insert into proclcdt values ('123ХХХ', {^2014-11-19}, {^2015-03-18})
insert into proclcdt values ('123ХХХ', {^2016-01-25}, {^2016-06-21})
insert into proclcdt values ('123ХХХ', {^2016-06-27}, {^2016-08-08})

m_date1 = {^2016-07-10}
	
* Макс. даты закрытия счетов
select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
	from proclcdt;
	WHERE LIKE('ХХХ*',SUBSTR(pl_lc,4,5));
	group by pl_lc;
	having pl_dt_max <= m_date1 + 29; 
	into cursor proclc
brow



Дима, у меня тоже за 1 день все работает. Когда формирую отчет за период с 01/07/2016 по 31/07/2016 не работает. Есть идеи?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39286937
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftДима, у меня тоже за 1 день все работает. Когда формирую отчет за период с 01/07/2016 по 31/07/2016 не работает. Есть идеи?
Где код?

Я не вижу где у тебя расчет за период, есть только этот цикл, который дни перебирает и каждый день пишет в отдельную клетку экселя
Код: sql
1.
2.
3.
4.
5.
6.
7.
DO WHILE m_date1<=m_date2
...
	m_date1=m_date1+1

	j=j+1
	SELECT kalendar
ENDDO
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39287008
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TularsoftДима, у меня тоже за 1 день все работает. Когда формирую отчет за период с 01/07/2016 по 31/07/2016 не работает. Есть идеи?
Где код?

Я не вижу где у тебя расчет за период, есть только этот цикл, который дни перебирает и каждый день пишет в отдельную клетку экселя
Код: sql
1.
2.
3.
4.
5.
6.
7.
DO WHILE m_date1<=m_date2
...
	m_date1=m_date1+1

	j=j+1
	SELECT kalendar
ENDDO



Дима, код слишком длинный:
Код: 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.
WAIT WINDOW NOWAIT [Идет формирование отчета...]
m_date2=ThisForm.cl_date2
i=6
ex=CREATEOBJECT('Excel.Application')
ex.Visible= .t.
ex.WorkBooks.open(ALLTRIM(sysfile.s_pathfwp)+'k3_1.xlt')
*************Заполняем форму К3.1***********
j=0
d=0
***Proclcdt
m_sql="select * from "+mp_owner+".Proclcdt"
ok=oODED.Exec_sp(m_sql,'Proclcdt')
*
ex.WorkBooks(1).Sheets(2).select
WITH ex.WorkBooks(1).Sheets(2)
*
***Calendar
m_sql="select * from "+mp_owner+".kalendar order by k_date"
ok=oODED.Exec_sp(m_sql,'kalendar')
*
SELECT kalendar
GO TOP
*
SCAN FOR k_priz=0 AND MONTH(m_date2)=MONTH(kalendar.k_date) AND YEAR(m_date2)=YEAR(kalendar.k_date)
m_date1=kalendar.k_date

ok=OD070(m_date1,'Tempvo')
	ex.cells(2,4+j).select
	ex.cells(2,4+j)=m_date1
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE (LIKE('106*',SUBSTR(pl_lc,4,5)) OR LIKE('107*',SUBSTR(pl_lc,4,5))) AND (pl_lc!='12710604********');
		group by pl_lc;
		having pl_dt_max <= m_date1 + 6; && те что закрыты или закроются в течении 7 дней
		into cursor proclc
	
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0 AND (pl_lc!='12710604********');
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE LIKE('203*',SUBSTR(pl_lc,4,5));
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0 AND (Tempvo.t1_bs!='20512') AND (Tempvo.t1_lc!='12720311********');
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
	    ex.cells(20,4+j).select
	    ex.cells(20,4+j)=ABS(tt1_n6)
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'12720311********');
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0;
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
	    ex.cells(21,4+j).select
	    ex.cells(21,4+j)=ABS(tt1_n6)
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'12720311********');
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0;
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
	    ex.cells(22,4+j).select
	    ex.cells(22,4+j)=ABS(tt1_n6)
***
	j=j+1
	SELECT kalendar

ENDSCAN 
ENDWITH 

if USED('Tempvo')
   use in Tempvo
endif

if USED('kalendar')
   use in kalendar
ENDIF

if USED('Proclcdt')
   use in Proclcdt
ENDIF

if USED('Tmp')
   use in Tmp
endif

ThisForm.Release
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39287024
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftДима, код слишком длинный:
Код: 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.
WAIT WINDOW NOWAIT [Идет формирование отчета...]
m_date2=ThisForm.cl_date2
i=6
ex=CREATEOBJECT('Excel.Application')
ex.Visible= .t.
ex.WorkBooks.open(ALLTRIM(sysfile.s_pathfwp)+'k3_1.xlt')
*************Заполняем форму К3.1***********
j=0
d=0
***Proclcdt
m_sql="select * from "+mp_owner+".Proclcdt"
ok=oODED.Exec_sp(m_sql,'Proclcdt')
*
ex.WorkBooks(1).Sheets(2).select
WITH ex.WorkBooks(1).Sheets(2)
*
***Calendar
m_sql="select * from "+mp_owner+".kalendar order by k_date"
ok=oODED.Exec_sp(m_sql,'kalendar')
*
SELECT kalendar
GO TOP
*
SCAN FOR k_priz=0 AND MONTH(m_date2)=MONTH(kalendar.k_date) AND YEAR(m_date2)=YEAR(kalendar.k_date)
m_date1=kalendar.k_date

ok=OD070(m_date1,'Tempvo')
	ex.cells(2,4+j).select
	ex.cells(2,4+j)=m_date1
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE (LIKE('106*',SUBSTR(pl_lc,4,5)) OR LIKE('107*',SUBSTR(pl_lc,4,5))) AND (pl_lc!='12710604********');
		group by pl_lc;
		having pl_dt_max <= m_date1 + 6; && те что закрыты или закроются в течении 7 дней
		into cursor proclc
	
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0 AND (pl_lc!='12710604********');
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE LIKE('203*',SUBSTR(pl_lc,4,5));
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0 AND (Tempvo.t1_bs!='20512') AND (Tempvo.t1_lc!='12720311********');
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
	    ex.cells(20,4+j).select
	    ex.cells(20,4+j)=ABS(tt1_n6)
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'12720311********');
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0;
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
	    ex.cells(21,4+j).select
	    ex.cells(21,4+j)=ABS(tt1_n6)
***
	select pl_lc, max(TTOD(pl_date2)) as pl_dt_max;
		from proclcdt;
		WHERE INLIST(pl_lc,'12720311********');
		group by pl_lc;
		having pl_dt_max <= m_date1 + 29; && те что закрыты или закроются в течении 30 дней
		into cursor proclc
	select sum(Tempvo.t1_n6) as nSum;
		from Tempvo join proclc on Tempvo.t1_lc = proclc.pl_lc;
		WHERE Tempvo.t1_n6!=0;
		into cursor tmp
	tt1_n6 = nvl(tmp.nSum, 0)
	    ex.cells(22,4+j).select
	    ex.cells(22,4+j)=ABS(tt1_n6)
***
	j=j+1
	SELECT kalendar

ENDSCAN 
ENDWITH 

if USED('Tempvo')
   use in Tempvo
endif

if USED('kalendar')
   use in kalendar
ENDIF

if USED('Proclcdt')
   use in Proclcdt
ENDIF

if USED('Tmp')
   use in Tmp
endif

ThisForm.Release


Длинные коды прячь под спойлер. Нет тут у тебя никакого расчета за месяц, есть цикл расчетов за отдельные дни.
Код: sql
1.
2.
3.
4.
5.
6.
7.
SCAN FOR k_priz=0 AND MONTH(m_date2)=MONTH(kalendar.k_date) AND YEAR(m_date2)=YEAR(kalendar.k_date)
m_date1=kalendar.k_date
...
j=j+1
	SELECT kalendar

ENDSCAN 


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


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