powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор строк в таблице
88 сообщений из 88, показаны все 4 страниц
Перебор строк в таблице
    #39173170
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

SELECT Tempvo
SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ORDER BY pl_lc INTO CURSOR proclc
ex.cells(16,4+j).select
ex.cells(16,4+j)=0
SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
ex.cells(16,4+j).select
ex.cells(16,4+j)=ABS(cm2)
EXIT
ENDSCAN

где, m_date1 - текущая дата, pl_date2 - дата окончания срока
В строке ex.cells(16,4+j) EXCEl я должен вытащить сумму по 'XXXXX','YYYYY', если m_date1 входить в промежуток TTOD(pl_date2)-7 и TTOD(pl_date2)
А у меня общий итог cm2 выходить. Как это сделать? Я правильно делаю?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173203
ularsoftДобрый день!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	SELECT Tempvo
	SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')
	SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ORDER BY pl_lc INTO CURSOR proclc
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=0
    SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=ABS(cm2)
        EXIT
    ENDSCAN


где, m_date1 - текущая дата, pl_date2 - дата окончания срока
В строке ex.cells(16,4+j) EXCEl я должен вытащить сумму по 'XXXXX','YYYYY', если m_date1 входить в промежуток TTOD(pl_date2)-7 и TTOD(pl_date2)
А у меня общий итог cm2 выходить. Как это сделать? Я правильно делаю?
Ну правильно. То, что написал, то и получил.
1.
Код: sql
1.
2.
3.
	SELECT Tempvo
	SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')
    


посчитает итоговую сумму (если я правильно понял)
2.
Код: sql
1.
2.
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=ABS(cm2)


выведет эту итоговую сумму. Зачем тогда селект и скан?

Если уж минимально исправлять Вашу программу, то:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	SELECT Tempvo
	SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')
	SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ORDER BY pl_lc INTO CURSOR proclc
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=0
    tt1_n6 = 0
    SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
	    tt1_n6 = tt1_n6 + t1_n6
    ENDSCAN
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=ABS(tt1_n6)
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173526
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С...кий1. Посчитает итоговую сумму. Всё верно.
Код: sql
1.
2.
	SELECT Tempvo
	SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')


2. Выведет эту итоговую сумму. Тоже верно.
Код: sql
1.
2.
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=ABS(cm2)


3. Зачем тогда селект и скан?

Я ищу такие же 'XXXXX' и 'YYYYY' в подчиненной таблице proclcdt, их могут быть несколько:
Код: sql
1.
2.
3.
	SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ORDER BY pl_lc INTO CURSOR proclc
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=0


Пока, ячейка ex.cells(16,4+j) = 0

Код: sql
1.
    tt1_n6 = 0


Вот тут, я сканирую, если m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2),
Код: sql
1.
    SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)


Тогда
Код: sql
1.
	    tt1_n6 = tt1_n6 + t1_n6


Затем
Код: sql
1.
    ENDSCAN


и вывожу занчения
Код: sql
1.
2.
	    ex.cells(16,4+j).select
	    ex.cells(16,4+j)=ABS(tt1_n6)



Тут у меня берет первую строку, сравнивает с m_date1, если в этот промежуток входить, тогда следующую строку не проверяет, дальше общую сумму выводить. Я должен сканировать все строки и выводить только сумму, которая входить в этот промежуток. Н-р, в табл proclcdt 2 строки по 'XXXXX' и 3 строки 'YYYYY', из 'XXXXX' в этот промежуток входить только 1 строка, ее сумма 5, а 2 строка не входить, из 'YYYYY' в промежуток входить только 2 строки, их сумма 10, а 3 строка не входить, общий результат должен быть 5+10=15. Вот это не получается. Как сделать?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173701
ularsoft...
Тут у меня берет первую строку, сравнивает с m_date1, если в этот промежуток входить, тогда следующую строку не проверяет, дальше общую сумму выводить. Я должен сканировать все строки и выводить только сумму, которая входить в этот промежуток. Н-р, в табл proclcdt 2 строки по 'XXXXX' и 3 строки 'YYYYY', из 'XXXXX' в этот промежуток входить только 1 строка, ее сумма 5, а 2 строка не входить, из 'YYYYY' в промежуток входить только 2 строки, их сумма 10, а 3 строка не входить, общий результат должен быть 5+10=15. Вот это не получается. Как сделать?


1. Если ничего не получается - прочитайте, наконец, инструкцию (народный юмор).
Объясняю:
Код: sql
1.
2.
3.
SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
....
ENDSCAN


проходит только по тем строкам, для которых выполняется условие: m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
Что надо сделать когда мы идем по строкам? Правильно - посчитать ularsoft... сумму, которая входить в этот промежуток.
поэтому я и написал Вам:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
* Обнуляем переменную, где будем хранить сумму за период
    tt1_n6 = 0
    SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
* Считаем сумму за период
	    tt1_n6 = tt1_n6 + t1_n6
    ENDSCAN
* здесь, после окончания цикла, в tt1_n6 находится сумма за период!!! ее и выводим в Excel.
...



2. Если хотите обойтись без цикла SCAN...ENDSCAN, то эти же значения можно посчитать в SELECT. В FoxPro хороший движок SQL, который позволяет писать сложные выражения. Должно получиться что-то вроде такого (символ ";" в FoxPro обозначает переход текста на следующую строку):
Код: sql
1.
2.
3.
4.
5.
6.
SELECT sum(t1_n6) as tt1_n6 ;
from proclcdt ;
WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY')  and ;
          m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2) ;
ORDER BY pl_lc ;
INTO CURSOR proclc
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173702
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173703
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173704
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173705
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173706
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173707
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173714
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С...кийВ конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
Код: sql
1.
2.
3.
4.
...
SELECT proclcdt
SUM t1_n6 TO tt1_n6 FOR INLIST(SUBSTR(pl_lc,4,5), 'XXXXX','YYYYY') and m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
...



В таблице tempvo другие данные, в т.ч. остатки по 'XXXXX' и 'YYYYY', а в другой таблице proclcdt сроки по 'XXXXX' и 'YYYYY', pl_date1-начальная дата, pl_date2-конечная дата.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173728
ularsoft,
Вы не заметили, что я написал SELECT proclcdt, то есть перешел в другую рабочую область?
Потому SUM теперь будет работать по таблице proclcdt.

И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39173743
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С...кийularsoft,

И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота.

Уважаемый Станислав,

Хочу выразить Вам огромную благодарность за то, что Вы мне помогли собраться! Я сделал немного по другому:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
*
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ;
ORDER BY pl_lc INTO CURSOR proclc
	    ex.cells(19,4+j).select
	    ex.cells(19,4+j)=0
	    tt1_n6 = 0
    SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
	    EXIT
    ENDSCAN 
	    ex.cells(19,4+j).select
	    ex.cells(19,4+j)=ABS(tt1_n6)
*


Все замечательно...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39262952
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ularsoftСтанислав С...кийularsoft,

И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота.

Уважаемый Станислав,

Хочу выразить Вам огромную благодарность за то, что Вы мне помогли собраться! Я сделал немного по другому:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
*
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ;
ORDER BY pl_lc INTO CURSOR proclc
	    ex.cells(19,4+j).select
	    ex.cells(19,4+j)=0
	    tt1_n6 = 0
    SCAN FOR m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2)
	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
	    EXIT
    ENDSCAN 
	    ex.cells(19,4+j).select
	    ex.cells(19,4+j)=ABS(tt1_n6)
*


Все замечательно...

Уважаемые знатоки!
В продолжении данного обсуждения, хочу спросить кое-что.
Было все замечательно, пока m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2) и остатки закрывались во время, в данный момент имею другую проблему:

m_date1 - это дата в календаре.
pl_date2 - конечная дата срока.

Формирую отчет за неделю, т.е. с понедельника по воскресенье.

Проблема в том, что m_date1 входить в данный промежуток, н-р, до среды, а после остаток в курсоре Tempvo должен входить в расчет. Не могу соображать как это сделать правильно?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39263573
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тему не читал, но почему бы не вставить в цикл проверку на совпадение текущей даты с этой "средой"? Если совпало, то делаем EXIT. Возможно, проставляем флаг выхода, чтобы дальше как-то обработать этот факт.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39264369
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirТему не читал, но почему бы не вставить в цикл проверку на совпадение текущей даты с этой "средой"? Если совпало, то делаем EXIT. Возможно, проставляем флаг выхода, чтобы дальше как-то обработать этот факт.

Уважаемый tanglir,

В цикле условие m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2) как раз проверяет на совпадение текущей даты диапазоне со сроком. Н-р, если m_date1 = с 20.06.2016 по 26.06.2016, конечный срок pl_date2 = 22.06.2016, то в данный момент у меня включает в расчет с 20.06.2016 по 22.06.2016, это будет правильно если остаток НОЛЬ, иначе должен включится в расчет до конца недели. А у меня не включается.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39264376
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftН-р, если m_date1 = с 20.06.2016 по 26.06.2016, конечный срок pl_date2 = 22.06.2016, то в данный момент у меня включает в расчет с 20.06.2016 по 22.06.2016, это будет правильно если остаток НОЛЬ, иначе должен включится в расчет до конца недели.ну, расчёт до конца недели делается так
Код: sql
1.
2.
m_date1>=TTOD(pl_date2)-7 
 AND m_date1<=max(TTOD(pl_date2), m_date1+7-dow(m_date1,2))

а как сюда проверку "остатка" включить - вам лучше знать.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39273489
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirну, расчёт до конца недели делается так
Код: sql
1.
2.
m_date1>=TTOD(pl_date2)-7 
 AND m_date1<=max(TTOD(pl_date2), m_date1+7-dow(m_date1,2))

а как сюда проверку "остатка" включить - вам лучше знать.
Отчет формируется с 20.06.16 по 26.06.16
Если
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) or ((TTOD(pl_date2)-m_date1)<0)
то получаю следующие даты:
TTOD(pl_date2)-6< m_date1 < TTOD(pl_date2)
* 18.06.16 < 20.06.16 < 24.06.2016
* 18.06.16 < 21.06.16 < 24.06.2016
* 18.06.16 < 22.06.16 < 24.06.2016
* 18.06.16 < 23.06.16 < 24.06.2016
* 18.06.16 < 24.06.16 < 24.06.2016
* 18.06.16 < 25.06.16 < 24.06.2016
* 18.06.16 < 26.06.16 < 24.06.2016

Беру конкретный pl_lc = XXXX, по нему срок установлен с 26.02.16 по 24.06.16. Поэтому моя программа берет ХХХХ в расчет, потому что данный pl_lc входит в расчет с 20.06.16 по 26.06.16, клиент должен был забрать остаток по ХХХХ 26.06.16, но не забрал. Срок истек, а остаток не пустой.

Делаю так,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT * from proclcdt WHERE INLIST(pl_lc,'XXXX') ;
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)) or ((TTOD(pl_date2)-m_date1)<0)
 	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN
	    ex.cells(22,4+j).select
	    ex.cells(22,4+j)=ABS(tt1_n6)


А у меня программа включает в расчет с 20.06.16 по 24.06.16, не включает с 25.06.16 по 26.06.16, а должен. Как это сделать? У кого какие идеи! Заранее благодарен.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39273495
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoft,

а можно конкретные данные в теге [ CSV ]?
вот этот курсор procls, который вы получаете первым запросом
и выборки из tempvo на каждом шаге
и желаемый результат
с объяснением, как именно он получается и на каком этапе сейчас происходит затык
именно на вот этих конкретных данных

потому как я не понимаю, например, как
ularsoftконкретный pl_lc = XXXX, по нему срок установлен с 26.02.16 по 24.06.16соотносится с
ularsoftклиент должен был забрать остаток по ХХХХ 26.06.16, но не забрал, а это, в свою очередь, с
ularsoftА у меня программа включает в расчет с 20.06.16 по 24.06.16, не включает с 25.06.16 по 26.06.16, а долженВы хотите, чтобы программа включала в расчёт отсутствующие в таблицах данные, что ли?..
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39273500
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirВы хотите, чтобы программа включала в расчёт отсутствующие в таблицах данные, что ли?

Уважаемый tanglir,
В таблице TEMPVO хранятся остатки. В таблице PROCLCDT устанавливаются сроки для любого счета.
Код: sql
1.
2.
SELECT * from proclcdt WHERE INLIST(pl_lc,'ХХХХ') ;
ORDER BY pl_lc INTO CURSOR proclc


Этим запросом получаю курсор proclc с ХХХХ и проверяю m_date1 в промежутке с TTOD(proclc.pl_date2)-6 по TTOD(proclc.pl_date2). Если m_date1 с 20.06.16 по 26.06.16 входит в данный промежуток, тогда вывожу сумму из TEMPVO в Excel.

На данном примере по ХХХХ установлен срок с 26.02.16 по 24.06.16, программа до 24.06.16 включает в расчет а дальше не включает, потому что истек срок. А тетки говорят, что если срок истек, но остаток не ноль, необх вкл в расчет.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39273545
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё раз
внимательно и по пунктам

tanglirконкретные данные в теге [ CSV ]:
-курсор procls, который вы получаете первым запросом
-и выборки из tempvo на каждом шаге
и желаемый результат
с объяснением, как именно он получается и на каком этапе сейчас происходит затык
именно на вот этих конкретных данных
потому как на данный момент даже чтоб понять, кто на ком стоялm_date - параметр, а p_date - поле в курсоре или наоборот - надо листать обратно и выискивать намёки в коде.

ularsoftесли срок истек, но остаток не ноль, необх вкл в расчет.Вроде б уже предлагал - проверить пересечение сроков, и если остаётся необработанный кусок - так обработать его отдельно (если уж прямо в том цикле почему-то нельзя). А если хочется не общих советов, а детальных, тогда надо для начала внятно, на примере объяснить, что вообще происходит.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39273640
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot tanglir]ещё раз
внимательно и по пунктам

tanglirконкретные данные в теге [ CSV ]:
-курсор procls, который вы получаете первым запросом
-и выборки из tempvo на каждом шаге
и желаемый результат
с объяснением, как именно он получается и на каком этапе сейчас происходит затык
именно на вот этих конкретных данных
потому как на данный момент даже чтоб понять, кто на ком стоялm_date - параметр, а p_date - поле в курсоре или наоборот - надо листать обратно и выискивать намёки в коде.

ularsoftSELECT * from proclcdt WHERE INLIST(pl_lc,'1272031100002234') ORDER BY pl_lc INTO CURSOR proclc
ex.cells(22,4+j).select
ex.cells(22,4+j)=0
* Обнуляем переменную, где будем хранить сумму за период m_date2
tt1_n6 = 0
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))
* 18.06.16 <= 20.06.16 <= 24.06.2016
* 18.06.16 <= 21.06.16 <= 24.06.2016
* 18.06.16 <= 22.06.16 <= 24.06.2016
* 18.06.16 <= 23.06.16 <= 24.06.2016
* 18.06.16 <= 24.06.16 <= 24.06.2016
* Считаем сумму за период
SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
SELECT tmp
tt1_n6 = tt1_n6 + tmp.t1_n6
*exit
ENDSCAN
* 18.06.16 <= 25.06.16 <= 24.06.2016 && За этот день не включает в расчет, но остаток не пустой
* 18.06.16 <= 26.06.16 <= 24.06.2016 && За этот день не включает в расчет, но остаток не пустой

* здесь, после окончания цикла, в tt1_n6 находится сумма за период!!! ее и выводим в Excel.
ex.cells(22,4+j).select
ex.cells(22,4+j)=ABS(tt1_n6)

т.е. условие (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) проверяется до срока окончания и уходит в конец, потому что последние 2 даты не входит в промежуток.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39273673
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё, я пас
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39275230
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoft
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) or ((TTOD(pl_date2)-m_date1)<0)



А у меня программа включает в расчет с 20.06.16 по 24.06.16, не включает с 25.06.16 по 26.06.16, а должен.
1. Какая версия FoxPro?
2. Для одной записи таблицы PROCLCDT может существовать только одна запись таблицы TEMPVO?

Т.е. связь между таблицами Tempvo.t1_lc = proclc.pl_lc - это связь один-к-одному или тут возможен вариант много-ко-многим?

3. Если вместо вычитания дат использовать простое сравнение проблема останется?

Код: sql
1.
SCAN FOR (...) or (TTOD(pl_date2) < m_date1)



4. "Не пустой остаток" - это значение поля Tempvo.t1_n6 отлично от нуля?

5. Если в командном окне выполнить такой запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
* Для версии VFP6 или старше
m_date1 = {^2016-06-26}

select proclc.pl_lc, proclc.pl_date2, Tempvo.t1_n6 ;
from Tempvo ;
inner join proclc on Tempvo.t1_lc = proclc.pl_lc ;
where INLIST(proclc.pl_lc,'XXXX') ;
	and ((m.m_date1 between TTOD(proclc.pl_date2)-6 AND TTOD(proclc.pl_date2)) ;
		or (TTOD(proclc.pl_date2) < m.m_date1)) ;
order by proclc.pl_lc



Будет ли в открывшемся Browse-окне отображена нужная запись? Есть ли в выборке "дубли" по значению поля proclc.pl_lc? Т.е. может ли быть несколько записей с одним и тем же значением proclc.pl_lc?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39275231
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tempvo - это таблица или тоже ранее сделанная выборка? Если это выборка, то была ли она сформирована с учетом значения переменной m_date1? Т.е. а есть ли вообще запись с суммой остатка, для Вашего проблемного значения?

Код: sql
1.
select * from Tempvo where Tempvo.t1_lc = '1272031100002234'
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39279863
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
1. Какая версия FoxPro?

2. Для одной записи таблицы PROCLCDT может существовать только одна запись таблицы TEMPVO?
Т.е. связь между таблицами Tempvo.t1_lc = proclc.pl_lc - это связь один-к-одному или тут возможен вариант много-ко-многим?

3. Если вместо вычитания дат использовать простое сравнение проблема останется?

4. "Не пустой остаток" - это значение поля Tempvo.t1_n6 отлично от нуля?

5. Если в командном окне выполнить такой запрос


1. У меня FoxPro 8.0
2. Да, для одной записи таблицы PROCLCDT существует только одна запись таблицы TEMPVO
3. Да, проблема остается
4. Да, значение поля Tempvo.t1_n6 не ноль
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39279865
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМTempvo - это таблица или тоже ранее сделанная выборка? Если это выборка, то была ли она сформирована с учетом значения переменной m_date1? Т.е. а есть ли вообще запись с суммой остатка, для Вашего проблемного значения?

Tempvo - это тоже ранее сделанная выборка, сформирована с учетом значения переменной m_date1
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283653
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У кого-нибудь есть идеи?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283671
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftУ кого-нибудь есть идеи?
Начни сначала. Попробуй в одном сообщении четко изложить весь поток сознания, который выше понаписал.
Приведи структуру таблиц использованных в коде.

Тут просто непонятно ничего.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283702
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TularsoftУ кого-нибудь есть идеи?
Начни сначала. Попробуй в одном сообщении четко изложить весь поток сознания, который выше понаписал.
Приведи структуру таблиц использованных в коде.

Тут просто непонятно ничего.

Короче, имеются таблицы Tempvo и proclcdt.
Получаю отчет в EXCEL за еженедельную.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT * from proclcdt WHERE LIKE('ХХХ*',SUBSTR(pl_lc,4,5)) ;
ORDER BY pl_lc INTO CURSOR proclc

	    ex.cells(21,4+j).select
	    ex.cells(21,4+j)=0
	    * Обнуляю переменную, где буду хранить сумму за период
	    tt1_n6 = 0
    SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))
    *** ЕСЛИ ДАТА_ОКОНЧАНИЯ_ДОГОВОРА - ТЕКУЩАЯ_ДАТА<=0, ТОГДА ДОЛЖНЫ ВКЛ В РАСЧЕТ.
    
    	* Считаем сумму за период
	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 
    	* здесь, после окончания цикла, в tt1_n6 находится сумма за период!!! ее и вывожу в Excel.
	    ex.cells(21,4+j).select
	    ex.cells(21,4+j)=ABS(tt1_n6)

где, m_date1 - текущая дата, pl_date2 - дата окончания срока из proclcdt.



SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))

Тут задача такая, если ТЕКУЩАЯ_ДАТА входит в этот диапазон, то tt1_n6 = tt1_n6 + tmp.t1_n6, т.е. включается в РАСЧЕТ. Иногда бывают моменты СРОК ДОГОВОРА истекает, а клиент не закрыл счет, остаток остается. Их не включает в РАСЧЕТ. А я должен включит их.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283719
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ5. Если в командном окне выполнить такой запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
* Для версии VFP6 или старше
m_date1 = {^2016-06-26}

select proclc.pl_lc, proclc.pl_date2, Tempvo.t1_n6 ;
from Tempvo ;
inner join proclc on Tempvo.t1_lc = proclc.pl_lc ;
where LIKE('ХХХ*',SUBSTR(proclc.pl_lc,4,5))  ;
	and ((m.m_date1 between TTOD(proclc.pl_date2)-6 AND TTOD(proclc.pl_date2)) ;
		or (TTOD(proclc.pl_date2) < m.m_date1)) ;
order by proclc.pl_lc



Будет ли в открывшемся Browse-окне отображена нужная запись? Есть ли в выборке "дубли" по значению поля proclc.pl_lc? Т.е. может ли быть несколько записей с одним и тем же значением proclc.pl_lc?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283740
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoft, когда Dima T писал "четко изложить весь поток сознания", он имел в виду не "изложить в виде потока сознания", а "изложить чётко, связно, последовательно то, что до этого являлось потоком сознания".
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283741
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМВладимирМ5. Если в командном окне выполнить такой запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
* Для версии VFP6 или старше
m_date1 = {^2016-06-26}

select proclc.pl_lc, proclc.pl_date2, Tempvo.t1_n6 ;
from Tempvo ;
inner join proclc on Tempvo.t1_lc = proclc.pl_lc ;
where LIKE('ХХХ*',SUBSTR(proclc.pl_lc,4,5))  ;
	and ((m.m_date1 between TTOD(proclc.pl_date2)-6 AND TTOD(proclc.pl_date2)) ;
		or (TTOD(proclc.pl_date2) < m.m_date1)) ;
order by proclc.pl_lc



Будет ли в открывшемся Browse-окне отображена нужная запись? Есть ли в выборке "дубли" по значению поля proclc.pl_lc? Т.е. может ли быть несколько записей с одним и тем же значением proclc.pl_lc?

С одним и тем же значением в proclc.pl_lc не может. В Browse-окне отображается нужная запись, но только между TTOD(proclc.pl_date2)-6 и TTOD(proclc.pl_date2), у меня если срок истек остаток не равно 0, тогда должны вкл в РАСЧЕТ. Программа не включает, т.е. вкл только до срока.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283743
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoft
Код: sql
1.
    SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))


Тут задача такая, если ТЕКУЩАЯ_ДАТА входит в этот диапазон, то tt1_n6 = tt1_n6 + tmp.t1_n6, т.е. включается в РАСЧЕТ. Иногда бывают моменты СРОК ДОГОВОРА истекает, а клиент не закрыл счет, остаток остается. Их не включает в РАСЧЕТ. А я должен включит их.
Я так понимаю ты не знаешь как условие поправить, как-то так
Код: sql
1.
    SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) or (дата договора < TTOD(pl_date2)-6 and Остаток != 0)
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283756
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tularsoft
Код: sql
1.
    SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))


Тут задача такая, если ТЕКУЩАЯ_ДАТА входит в этот диапазон, то tt1_n6 = tt1_n6 + tmp.t1_n6, т.е. включается в РАСЧЕТ. Иногда бывают моменты СРОК ДОГОВОРА истекает, а клиент не закрыл счет, остаток остается. Их не включает в РАСЧЕТ. А я должен включит их.
Я так понимаю ты не знаешь как условие поправить, как-то так
Код: sql
1.
    SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) or (дата договора < TTOD(pl_date2)-6 and Остаток != 0)



Я так делал, но все равно в РАСЧЕТ не включает:
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) and Tempvo.t1_n6!=0



Я не понял следующее:
Код: sql
1.
or (дата договора < TTOD(pl_date2)-6
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283766
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftЯ так делал, но все равно в РАСЧЕТ не включает:
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) and Tempvo.t1_n6!=0


Разницу между AND и OR понимаешь?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283773
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftЯ не понял следующее:
Код: sql
1.
or (дата договора < TTOD(pl_date2)-6


недописал, надо "дата окончания договора", подставь туда соответствующее поле, от тебя я так и не увидел структуры таблиц. Вобщем это проверка что договор закончился раньше периода отчета.
Условие должно быть такое:
Код: sql
1.
(m_date1 попадает в период) ИЛИ (договор закончился И остаток != 0)
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283774
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TularsoftЯ так делал, но все равно в РАСЧЕТ не включает:
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) and Tempvo.t1_n6!=0


Разницу между AND и OR понимаешь?

Прости,
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2)) or Tempvo.t1_n6!=0



Все равно, если m_date1 = '18.07.2016', '19.07.2016', '20.07.2016', '21.07.2016', '22.07.2016', '23.07.2016', '24.07.2016' и срок истекает '22.07.2016', то в РАСЧЕТ включаются только по '22.07.2016', а за '23.07.2016', '24.07.2016' не включает.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283777
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TularsoftЯ не понял следующее:
Код: sql
1.
or (дата договора < TTOD(pl_date2)-6


недописал, надо "дата окончания договора", подставь туда соответствующее поле, от тебя я так и не увидел структуры таблиц. Вобщем это проверка что договор закончился раньше периода отчета.
Условие должно быть такое:
Код: sql
1.
(m_date1 попадает в период) ИЛИ (договор закончился И остаток != 0)



pl_date2 - дата окончания договора
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283790
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять все запутал. Давай пример исходных данных proclcdt. Так чтобы можно было запустить твой код. И код дополни. Чтобы можно было скопировать и запустить. Типа
Код: sql
1.
2.
3.
create cursor proclcdt (...)
insert into proclcdt ...
...


Много данных не надо, 3-5 записей и описание "эта запись не попадает, но должна попадать потому что она то-то"
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283792
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можешь пример заполненной proclc, т.е. вместо
Код: sql
1.
2.
SELECT * from proclcdt WHERE LIKE('ХХХ*',SUBSTR(pl_lc,4,5)) ;
ORDER BY pl_lc INTO CURSOR proclc


написать
Код: sql
1.
2.
3.
create cursor proclc (...)
insert into proclc ...
...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283803
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TОпять все запутал. Давай пример исходных данных proclcdt. Так чтобы можно было запустить твой код. И код дополни. Чтобы можно было скопировать и запустить. Типа
Код: sql
1.
2.
3.
create cursor proclcdt (...)
insert into proclcdt ...
...


Много данных не надо, 3-5 записей и описание "эта запись не попадает, но должна попадать потому что она то-то"

Структура таблицы proclcdt:
PL_LC - лицевой счет, PL_DATE1 - дата начала, PL_DATE2 - дата окончания.

Структура курсора TEMPVO
t1_lc CHAR(16) - лицевой счет, t1_n6 NUMERIC(15,2) - остаток

Если по счету "Х" установлен срок с 24.06.2016 по 22.07.2016, когда формирую отчет с 18.07.2016 по 24.07.2016, тогда у меня
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))


проверяет все даты, до срока 22.07.2016 включает в РАСЧЕТ, а за 23.07.2016 и 24.07.2016 не включает в РАСЧЕТ, но договор не закрыть, а значит остаток не равно 0.

Если договор не закрылся, мы должны продолжать вкл остаток в РАСЧЕТ до закрытия договора. У меня проблемы с дополнительным условием :( не получается. Уже 4 месяца мучаюсь.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283807
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята помогите.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283830
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Н-р,
в таблице PROCLCDT:
PL_LC = Х,
PL_DATE1 = 24.06.2016,
PL_DATE2 = 22.07.2016.

в курсоре TEMPVO
t1_lc = Х - лицевой счет,
t1_n6 = 5000 - остаток.
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))



Когда формирую отчет, получаю след данные в EXCEL:
18.07.2016 = 5000
19.07.2016 = 5000
20.07.2016 = 5000
21.07.2016 = 5000
22.07.2016 = 5000
23.07.2016 = 0
24.07.2016 = 0

Срок договора истек 22.07.2016, но не закрыть, а значит мы знаем, что остаток 5000 и должны вкл в РАСЧЕТ до закрытия договора.

В отчете должны быть такие цифры:
18.07.2016 = 5000
19.07.2016 = 5000
20.07.2016 = 5000
21.07.2016 = 5000
22.07.2016 = 5000
23.07.2016 = 5000
24.07.2016 = 5000
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283856
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по теме, программирование не есть Ваша основная работа. Вы просто не понимаете о чем Вас спрашивают и что Вы делаете "не так". Тогда попробуйте совсем "тупой" вариант

Код: 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.
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ;
ORDER BY pl_lc INTO CURSOR proclc

*	    ex.cells(19,4+j).select   && Это лишняя, не нужная, команда
	    ex.cells(19,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_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

*** Вот здесь делает ПОВТОРНЫЙ расчет для учета не нулевого остатка
*** Отбираем ВСЕ счета, период действия которых уже ЗАВЕРШЕН
    SCAN FOR m_date1>TTOD(pl_date2)
    	* Считаем сумму ОСТАТКА
	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

*	    ex.cells(19,4+j).select    && Это лишняя, не нужная, команда
	    ex.cells(19,4+j)=ABS(tt1_n6)
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283863
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин, ну хоть таблицу то можешь тут нарисовать?
Курсор PROCLCDT
PL_LCPL_DATE1PL_DATE2...Х24.06.201622.07.2016...............
дозаполни, добавь поля которые в коде упоминаются, и данные чтобы были те что должны попасть, те что не должны и те что должны но не попадают.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283907
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TМлин, ну хоть таблицу то можешь тут нарисовать?
Курсор PROCLCDT
PL_LCPL_DATE1PL_DATE2...Х24.06.201622.07.2016...............
дозаполни, добавь поля которые в коде упоминаются, и данные чтобы были те что должны попасть, те что не должны и те что должны но не попадают.

Курсор Tempvo:
t1_lct1_n6Х5000

Курсор PROCLCDT:
PL_LCPL_DATE1PL_DATE2Х19.11.201418.03.2015Х25.01.201621.06.2016Х24.06.201622.07.2016
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283912
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.
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ;
ORDER BY pl_lc INTO CURSOR proclc

*	    ex.cells(19,4+j).select   && Это лишняя, не нужная, команда
	    ex.cells(19,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_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

*** Вот здесь делает ПОВТОРНЫЙ расчет для учета не нулевого остатка
*** Отбираем ВСЕ счета, период действия которых уже ЗАВЕРШЕН
    SCAN FOR m_date1>TTOD(pl_date2)
    	* Считаем сумму ОСТАТКА
	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

*	    ex.cells(19,4+j).select    && Это лишняя, не нужная, команда
	    ex.cells(19,4+j)=ABS(tt1_n6)


"тупой" вариант увеличивает сумму в 3 раза.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283919
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМСудя по теме, программирование не есть Ваша основная работа. Вы просто не понимаете о чем Вас спрашивают и что Вы делаете "не так". Тогда попробуйте совсем "тупой" вариант



Заставляют :(
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283936
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftЗаставляют :(
Электричество пропадет, скажут лезь в трансформаторную будку, почини. Тоже полезешь?

Владимир правильно написал что ты даже не понимаешь что от тебя просят. Мы тут не телепаты. Я у тебя прошу то что мне необходимо увидеть чтобы понять логику работы твоего кода. Я уже самый простейший вариант предложил, от руки набить табличку и показать данные из полей которые используются в коде. И чего ты набил? Я вижу в коде поле pl_lc, а в таблице не вижу.

Если планируешь и дальше продолжать писать только "помогите", то это в форум работа, с указанием суммы вознаграждения. Помогут. Гарантирую.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283949
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TularsoftЗаставляют :(
Электричество пропадет, скажут лезь в трансформаторную будку, почини. Тоже полезешь?

Владимир правильно написал что ты даже не понимаешь что от тебя просят. Мы тут не телепаты. Я у тебя прошу то что мне необходимо увидеть чтобы понять логику работы твоего кода. Я уже самый простейший вариант предложил, от руки набить табличку и показать данные из полей которые используются в коде. И чего ты набил? Я вижу в коде поле pl_lc, а в таблице не вижу.

Если планируешь и дальше продолжать писать только "помогите", то это в форум работа, с указанием суммы вознаграждения. Помогут. Гарантирую.

Может тебе трудно понять?

Я же нарисовал 2 табл. Если ты не понял из Tempvo t1_lc ищет в proclcdt по pl_lc.
Если находить суммирует.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283955
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ularsoftDima Tпропущено...

Электричество пропадет, скажут лезь в трансформаторную будку, почини. Тоже полезешь?

Владимир правильно написал что ты даже не понимаешь что от тебя просят. Мы тут не телепаты. Я у тебя прошу то что мне необходимо увидеть чтобы понять логику работы твоего кода. Я уже самый простейший вариант предложил, от руки набить табличку и показать данные из полей которые используются в коде. И чего ты набил? Я вижу в коде поле pl_lc, а в таблице не вижу.

Если планируешь и дальше продолжать писать только "помогите", то это в форум работа, с указанием суммы вознаграждения. Помогут. Гарантирую.

Может тебе трудно понять?

Я же нарисовал 2 табл. Если ты не понял из Tempvo t1_lc ищет в proclcdt по pl_lc.
Если находить суммирует.

Курсор Tempvo:
t1_lct1_n6Х5000

Курсор PROCLCDT:
PL_LCPL_DATE1PL_DATE2Х19.11.201418.03.2015Х25.01.201621.06.2016Х24.06.201622.07.2016
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283960
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вру, вижу PL_LC. Попозже код тебе сделаю а ты покажешь что в нем не так.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283962
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВру, вижу PL_LC. Попозже код тебе сделаю а ты покажешь что в нем не так.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283967
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoft"тупой" вариант увеличивает сумму в 3 раза.

Судя по приведенной Вами картинке с содержимым таблиц, у Вас один и тот же счет может иметь несколько периодов. В данном случае, на один счет приходится 3 периода. Правильно?

Но разве у Вас в этом случае не происходит увеличение сумм, если в период отчета попадают 2 периода? Ну, например, если период расчета, скажем, с 20.06.2016 по 27.06.2016. В этом случае будет выбрано 2 записи и сумма остатка будет учтена дважды. Правильно?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283974
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftКурсор PROCLCDT:
PL_LCPL_DATE1PL_DATE2Х19.11.201418.03.2015Х25.01.201621.06.2016Х24.06.201622.07.2016
Я правильно понимаю что например 22.06 договор был недействителен, но остаток по счету X был и его надо учесть?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283979
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще мне непонятна такая конструкция
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))


при чем тут неделя до окончания договора?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283980
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМularsoft"тупой" вариант увеличивает сумму в 3 раза.

Судя по приведенной Вами картинке с содержимым таблиц, у Вас один и тот же счет может иметь несколько периодов. В данном случае, на один счет приходится 3 периода. Правильно?

Но разве у Вас в этом случае не происходит увеличение сумм, если в период отчета попадают 2 периода? Ну, например, если период расчета, скажем, с 20.06.2016 по 27.06.2016. В этом случае будет выбрано 2 записи и сумма остатка будет учтена дважды. Правильно?

Да, 3 периода, но 1 из них попадает в расчет.
Например, если период расчета, с 20.06.2016 по 27.06.2016, pl_date2 = 22.07.2016, то
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))



будет
PL_DATE2-6m_date1PL_DATE216.07.201620.07.201622.07.201616.07.201621.07.201622.07.201616.07.201622.07.201622.07.201616.07.201623.07.201622.07.201616.07.201624.07.201622.07.201616.07.201625.07.201622.07.201616.07.201626.07.201622.07.201616.07.201627.07.201622.07.2016

Как раз здесь видно у меня включает в расчет только до 22.07.2016, а за 23, 24, 25, 26, 27 в расчет не включает.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283981
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир,

клиент не закрыл договор до 27.07.2016, в этом случае остаток не 0, поэтому я должен вкл в расчет. У меня не получается.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283982
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется я понял, если остаток есть, а действующего договора нет, то надо показать последний договор который закончился? Так?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283985
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКажется я понял, если остаток есть, а действующего договора нет, то надо показать последний договор который закончился? Так?
Теперь ребята вы поняли.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283987
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftDima TКажется я понял, если остаток есть, а действующего договора нет, то надо показать последний договор который закончился? Так?
Теперь ребята вы поняли.
про неделю до окончания договора в условии объясни, по моему это ерунда какая-то 19482321
там проверка: взять записи, у которых m_date1 попадает в последнюю неделю договора.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283989
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если остаток есть, а действующего договора нет, то надо показать остаток по этому счету.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39283994
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ularsoftЕсли остаток есть, а действующего договора нет, то надо показать остаток по этому счету.
Например, если период расчета, с 20.06.2016 по 27.06.2016, pl_date2 = 22.07.2016 - дата окончания договора, то из
курсора Tempvo:
t1_lct1_n6Х5000

будет
PL_DATE2-6m_date1PL_DATE2Значение в EXCEL16.07.201620.07.201622.07.2016 500016.07.201621.07.201622.07.2016 500016.07.201622.07.201622.07.2016 500016.07.201623.07.201622.07.2016 500016.07.201624.07.201622.07.2016 500016.07.201625.07.201622.07.2016 500016.07.201626.07.201622.07.2016 500016.07.201627.07.201622.07.2016 5000

Как раз здесь видно у меня включает в расчет только до 22.07.2016, а за 23, 24, 25, 26, 27 в расчет не включает.[/quot]
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39284113
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код примера который я ожидал от тебя увидеть. Я только добавил исходные данные и заменил вывод в эксель на вывод на экран.
Запусти и напиши он так же работает как и у тебя. Т.е. также неправильно, но выводит как нужно. Если все так, то дальше будем его дорабатывать.
Код: 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.
clear
create cursor Tempvo (t1_lc c(16), t1_n6 N(15,2))
insert into Tempvo values ('123ХХХ', 5000)
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-24}, {^2016-07-22})

for i = 1 to 5
	m_date1 = {^2016-07-20} + i
	SELECT * from proclcdt WHERE LIKE('ХХХ*',SUBSTR(pl_lc,4,5)) ;
		ORDER BY pl_lc INTO CURSOR proclc

	*ex.cells(21,4+j).select
	*ex.cells(21,4+j)=0
	* Обнуляю переменную, где буду хранить сумму за период
	tt1_n6 = 0
	SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))
		*** ЕСЛИ ДАТА_ОКОНЧАНИЯ_ДОГОВОРА - ТЕКУЩАЯ_ДАТА<=0, ТОГДА ДОЛЖНЫ ВКЛ В РАСЧЕТ.

		* Считаем сумму за период
		SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
		SELECT tmp
		tt1_n6 = tt1_n6 + tmp.t1_n6
	ENDSCAN 
	* здесь, после окончания цикла, в tt1_n6 находится сумма за период!!! ее и вывожу в Excel.
	*ex.cells(21,4+j).select
	*ex.cells(21,4+j)=ABS(tt1_n6)
	? m_date1, tt1_n6
endfor

return
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39284148
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftDima TКажется я понял, если остаток есть, а действующего договора нет, то надо показать последний договор который закончился? Так?
Теперь ребята вы поняли.
Получается пофиг есть или нет договор на конкретную дату, если нет, то главное чтобы был закончившийся более ранний договор.
Если так, то можно просто свести твои данные в одну таблицу
t1_lct1_n6PL_DATE0Х500019.11.2014
где PL_DATE0 это дата открытия первого договора по данному счету.

И дальше всегда выдавать 5000 на любую m_date1 c 19.11.2014. Правильно? Если правильно то это бред какой-то.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39284220
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нормально все. Не будут они делать отчет "задним числом" и "авансовых" договоров с не погашенным остатком у них нет. Ну, и отчет они делают, скорее всего, на текущую неделю. Т.е. все возможные "не стандартные" ситуации пропускаем, как "не существующие" в данной постановке задачи и делаем предельно просто и прямолинейно

Код: 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.
*** Выборка всех счетов по маске кода
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ;
ORDER BY pl_lc INTO CURSOR proclc

	    ex.cells(19,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_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

*** Теперь надо получить список счетов без дублей, из тех, которые имеют "закрытые" договора
*** Вне зависимости от факта наличия или отсутствия остатка

select distinct proclc.pl_lc ;
from proclc ;
into cursor proclc_Uniq ;
where m_date1 > TTOD(proclc.pl_date2)


*** Вот здесь делает ПОВТОРНЫЙ расчет для учета не нулевого остатка
*** Но уже по курсору proclc_Uniq и без ограничений 
*** анализ даты уже выполнен в момент формирования этого курсора
    SCAN ALL
    	* Считаем сумму ОСТАТКА
	SELECT * from Tempvo WHERE t1_lc=proclc_Uniq.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

	    ex.cells(19,4+j)=ABS(tt1_n6)

*** Если дальше по коду есть анализ курсора proclc, то надо вернуться в его рабочую область
select proclc



С точки зрения программиста, код довольно "корявый". Есть возможность его существенно улучшить (ускорить выполнение). Но для этого надо много чего знать. Причем как Вам, чтобы понять, о чем вообще речь, так и нам, чтобы понять, как именно сделать это улучшение. Не думаю, что в этом есть необходимость...
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39284221
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМДа нормально все. Не будут они делать отчет "задним числом" и "авансовых" договоров с не погашенным остатком у них нет. Ну, и отчет они делают, скорее всего, на текущую неделю. Т.е. все возможные "не стандартные" ситуации пропускаем, как "не существующие" в данной постановке задачи и делаем предельно просто и прямолинейно
Если понятно - объясни поподробнее. Боюсь ТС не сможет. Непонятно зачем размазывать по дням какой-то конкретный остаток на счете? Он же меняться может. Сегодня пополнили, завтра потратили, на то он и счет.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39284904
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВладимирМДа нормально все. Не будут они делать отчет "задним числом" и "авансовых" договоров с не погашенным остатком у них нет. Ну, и отчет они делают, скорее всего, на текущую неделю. Т.е. все возможные "не стандартные" ситуации пропускаем, как "не существующие" в данной постановке задачи и делаем предельно просто и прямолинейно
Если понятно - объясни поподробнее. Боюсь ТС не сможет. Непонятно зачем размазывать по дням какой-то конкретный остаток на счете? Он же меняться может. Сегодня пополнили, завтра потратили, на то он и счет.

Он так коряво описал задачу отображения остатка по договору, срок действия которого закончился на текущей неделе :) Просто способ решения выбран, хм..., специфический

Кстати, если я угадал с постановкой задачи, то можно решить ее чуть попроще в том же стиле

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
*** Выборка всех счетов по маске кода
SELECT * from proclcdt WHERE INLIST(SUBSTR(pl_lc,4,5),'XXXXX','YYYYY') ;
ORDER BY pl_lc INTO CURSOR proclc

	    ex.cells(19,4+j)=0

*** Переменная, которая будет хранить вычисленную итоговую сумму
	    tt1_n6 = 0

*** Вот это есть в Вашем коде. Убираем
**    SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))
** Заменяем на вот такой анализ
    SCAN FOR (TTOD(pl_date2) >= m_date1-6 AND TTOD(pl_date2) <= m_date1)
	SELECT * from Tempvo WHERE t1_lc=proclc.pl_lc INTO CURSOR tmp
	SELECT tmp
	    tt1_n6 = tt1_n6 + tmp.t1_n6
    ENDSCAN 

	    ex.cells(19,4+j)=ABS(tt1_n6)



Цель замены: не подогнать дату окончания счета под нужную дату, а найти диапазон, внутри которого должна оказаться дата окончания

Поясню. У Вас есть дата окончания 22.07.2016. И неделя с 20.07.2016 по 27.07.2016.

Что делали Вы? Вы пытались найти пересечение диапазонов. Т.е. на основании даты окончания формировали период с 16.07.2016 по 22.07.2016 и отбирали только те договора, сформированный период по которому пересекался с периодом текущей недели

Что делаю я? Просто смотрю, попадает ли дата окончания в текущую неделю? Без дополнительных вычислений периодов.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285041
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый Владимир,

Вот так
Код: sql
1.
SCAN FOR (TTOD(pl_date2) >= m_date1-6 AND TTOD(pl_date2) <= m_date1)

делать вообще нельзя, потому что это "срочные депозиты юр. лиц со сроком погашения до 6 дней ", т.е. вот так
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))

Это значит, что текущая дата должна находиться в диапазон, н-р, с 18.07.16 до 24.07.16, но сроки продлеваются.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285049
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Представьте себе, что есть "массив счетов", в т.ч. срочные депозиты, не важно, что клиент физ. лицо или юр. лицо.
LCOSTATOKX50000Y1000Z230000
У каждого счета X, Y, Z разные сроки.
Наша задача вытащить информацию "со сроком погашения до 6 дней". Т.е. из массива берем счет, какой-то срочный депозит "Х", смотрим сроки из таблицы PROCLCDT, у него были сроки:
PL_LCPL_DATE1PL_DATE2X19/11/201418/03/2015X25/01/201621/06/2016X24/06/201622/07/2016

Я формирую отчет с 18/07/2016 по 24/07/2016, т.е. за неделю, это m_date1 и m_date2. Будем двигаться по m_date1.
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))

Т.е. данный SCAN проверяет даты с 18/07/2016 по 24/07/2016 в промежутке 16/07/2016<m_date1<22/07/2016. Выглядит так:pl_date2-6<=m_date1<=pl_date2В РАСЧЕТ16/07/2016<=18/07/2016<=22/07/2016включает16/07/2016<=19/07/2016<=22/07/2016включает16/07/2016<=20/07/2016<=22/07/2016включает16/07/2016<=21/07/2016<=22/07/2016включает16/07/2016<=22/07/2016<=22/07/2016включает16/07/2016<=23/07/2016<=22/07/2016не включает16/07/2016<=24/07/2016<=22/07/2016не включает

28/07/2016 клиент закрыл счет "Х" - это срочный депозит, но клиент может продлить сроки. Программа должна включить в расчет, если клиент не забрал деньги или не закрыл счет во время. В нашем случае за последние 2 дня в расчет не включает. Об этом и прошу помощи или идеи. Если я формирую отчет с 25/07/2016 по 31/07/2016, тогда реально будет след образом:
pl_date2-6<=m_date1<=pl_date2В РАСЧЕТ16/07/2016<=25/07/2016<=22/07/2016включает16/07/2016<=26/07/2016<=22/07/2016включает16/07/2016<=27/07/2016<=22/07/2016включает16/07/2016<=28/07/2016<=22/07/2016включает16/07/2016<=29/07/2016<=22/07/2016не включает16/07/2016<=30/07/2016<=22/07/2016не включает16/07/2016<=31/07/2016<=22/07/2016не включает
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285051
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftпотому что это "срочные депозиты юр. лиц со сроком погашения до 6 дней ", т.е. вот так
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date2)-6 AND m_date1<=TTOD(pl_date2))


" до 6 дней " и "ровно 6 дней" это разные вещи. Зачем вообще такое писать если у тебя есть дата открытия депозита? т.е. почему так нельзя?
Код: sql
1.
SCAN FOR (m_date1>=TTOD(pl_date1) AND m_date1<=TTOD(pl_date2))


И на это ответь 19483521 , если так решается, то вообще никаких сканов не надо.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285054
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftНаша задача вытащить информацию "со сроком погашения до 6 дней".
Так бы сразу и сказал. Попробуй
Код: 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.
clear
create cursor Tempvo (t1_lc c(16), t1_n6 N(15,2))
insert into Tempvo values ('123ХХХ', 5000)
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-24}, {^2016-07-22})

for i = 1 to 15
	m_date1 = {^2016-07-10} + i
	
	* Макс. даты закрытия счетов
	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 + 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)

	? m_date1, tt1_n6
endfor

return
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285057
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть в том что ты не с той стороны задачу решал. Надо перебирать не договоры, а счета, затем проверять когда он закончится или уже закончился, и исходя из этого решать надо его учитывать или нет.
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #39285073
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TСуть в том что ты не с той стороны задачу решал. Надо перебирать не договоры, а счета, затем проверять когда он закончится или уже закончился, и исходя из этого решать надо его учитывать или нет.
Короче, делаю так
Код: 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.
m_date1=ThisForm.cl_date1
m_date2=ThisForm.cl_date2
if m_date1>m_date2
   do sprg02 with 'Не верно указан период'
   Thisform.Txdate1.Setfocus
   RETURN
endif   
ex=CREATEOBJECT('Excel.Application')
ex.Visible= .t.
ex.WorkBooks.open(ALLTRIM(sysfile.s_pathfwp)+'k3_2.xlt')

***Календарь
m_sql="select * from "+mp_owner+".kalendar order by k_date"
ok=oODED.Exec_sp(m_sql,'kalendar')
***Сроки
m_sql="select * from "+mp_owner+".Proclcdt"
ok=oODED.Exec_sp(m_sql,'Proclcdt')

DO WHILE m_date1<=m_date2
	ok=OD070(m_date1,'TEMPVO') //Курсор - движение на каждый день
	ex.cells(2,4+j)=m_date1
	SELECT Tempvo

&& Срочные депозиты юр. лиц со сроком погашения до 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

    	* здесь, после окончания цикла, в tt1_n6 находится сумма за период, ее и вывожу в Excel.
	    ex.cells(22,4+j).select
	    ex.cells(22,4+j)=ABS(tt1_n6)
	m_date1=m_date1+1

	j=j+1
	SELECT kalendar
ENDDO
ENDWITH 



Дима, тут с моим кодом нельзя ничего подправить?
...
Рейтинг: 0 / 0
Перебор строк в таблице
    #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
88 сообщений из 88, показаны все 4 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Перебор строк в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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