Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
Добрый день!

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 выходить. Как это сделать? Я правильно делаю?
17 фев 16, 14:09    [18829607]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
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 выходить. Как это сделать? Я правильно делаю?

Ну правильно. То, что написал, то и получил.
1.
	SELECT Tempvo
	SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')
    

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

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

Если уж минимально исправлять Вашу программу, то:
	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)
17 фев 16, 14:30    [18829795]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
Станислав С...кий
1. Посчитает итоговую сумму. Всё верно.
	SELECT Tempvo
	SUM t1_n6 TO cm2 FOR INLIST(t1_bs, 'XXXXX','YYYYY')

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

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

Я ищу такие же 'XXXXX' и 'YYYYY' в подчиненной таблице proclcdt, их могут быть несколько:
	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

    tt1_n6 = 0

Вот тут, я сканирую, если m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2),
    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)


Тут у меня берет первую строку, сравнивает с m_date1, если в этот промежуток входить, тогда следующую строку не проверяет, дальше общую сумму выводить. Я должен сканировать все строки и выводить только сумму, которая входить в этот промежуток. Н-р, в табл proclcdt 2 строки по 'XXXXX' и 3 строки 'YYYYY', из 'XXXXX' в этот промежуток входить только 1 строка, ее сумма 5, а 2 строка не входить, из 'YYYYY' в промежуток входить только 2 строки, их сумма 10, а 3 строка не входить, общий результат должен быть 5+10=15. Вот это не получается. Как сделать?
17 фев 16, 19:17    [18831926]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
ularsoft
...
Тут у меня берет первую строку, сравнивает с m_date1, если в этот промежуток входить, тогда следующую строку не проверяет, дальше общую сумму выводить. Я должен сканировать все строки и выводить только сумму, которая входить в этот промежуток. Н-р, в табл proclcdt 2 строки по 'XXXXX' и 3 строки 'YYYYY', из 'XXXXX' в этот промежуток входить только 1 строка, ее сумма 5, а 2 строка не входить, из 'YYYYY' в промежуток входить только 2 строки, их сумма 10, а 3 строка не входить, общий результат должен быть 5+10=15. Вот это не получается. Как сделать?


1. Если ничего не получается - прочитайте, наконец, инструкцию (народный юмор).
Объясняю:
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
... сумму, которая входить в этот промежуток.

поэтому я и написал Вам:
...
* Обнуляем переменную, где будем хранить сумму за период
    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 обозначает переход текста на следующую строку):
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
18 фев 16, 05:49    [18832992]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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)
...
18 фев 16, 05:55    [18832994]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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)
...
18 фев 16, 05:56    [18832995]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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)
...
18 фев 16, 05:56    [18832996]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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)
...
18 фев 16, 05:56    [18832997]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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)
...
18 фев 16, 05:57    [18832998]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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)
...
18 фев 16, 05:57    [18832999]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
Станислав С...кий
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа:
...
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-конечная дата.
18 фев 16, 06:28    [18833010]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
Станислав С...кий
Guest
ularsoft,
Вы не заметили, что я написал SELECT proclcdt, то есть перешел в другую рабочую область?
Потому SUM теперь будет работать по таблице proclcdt.

И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота.
18 фев 16, 07:58    [18833101]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
Станислав С...кий
ularsoft,

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


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

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

*
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)
*

Все замечательно...
18 фев 16, 08:50    [18833232]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
ularsoft
Станислав С...кий
ularsoft,

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


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

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

*
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 должен входить в расчет. Не могу соображать как это сделать правильно?
27 июн 16, 14:56    [19340392]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Тему не читал, но почему бы не вставить в цикл проверку на совпадение текущей даты с этой "средой"? Если совпало, то делаем EXIT. Возможно, проставляем флаг выхода, чтобы дальше как-то обработать этот факт.
28 июн 16, 11:40    [19344278]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
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, это будет правильно если остаток НОЛЬ, иначе должен включится в расчет до конца недели. А у меня не включается.
29 июн 16, 06:26    [19348194]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
tanglir
Member

Откуда:
Сообщений: 28966
ularsoft
Н-р, если m_date1 = с 20.06.2016 по 26.06.2016, конечный срок pl_date2 = 22.06.2016, то в данный момент у меня включает в расчет с 20.06.2016 по 22.06.2016, это будет правильно если остаток НОЛЬ, иначе должен включится в расчет до конца недели.
ну, расчёт до конца недели делается так
m_date1>=TTOD(pl_date2)-7 
 AND m_date1<=max(TTOD(pl_date2), m_date1+7-dow(m_date1,2))
а как сюда проверку "остатка" включить - вам лучше знать.
29 июн 16, 07:16    [19348228]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
tanglir
ну, расчёт до конца недели делается так
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, но не забрал. Срок истек, а остаток не пустой.

Делаю так,
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, а должен. Как это сделать? У кого какие идеи! Заранее благодарен.
14 июл 16, 06:16    [19407140]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
tanglir
Member

Откуда:
Сообщений: 28966
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, а должен
Вы хотите, чтобы программа включала в расчёт отсутствующие в таблицах данные, что ли?..
14 июл 16, 07:06    [19407171]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
tanglir
Вы хотите, чтобы программа включала в расчёт отсутствующие в таблицах данные, что ли?


Уважаемый tanglir,
В таблице TEMPVO хранятся остатки. В таблице PROCLCDT устанавливаются сроки для любого счета.
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 включает в расчет а дальше не включает, потому что истек срок. А тетки говорят, что если срок истек, но остаток не ноль, необх вкл в расчет.
14 июл 16, 07:41    [19407189]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
tanglir
Member

Откуда:
Сообщений: 28966
ещё раз
внимательно и по пунктам

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

потому как на данный момент даже чтоб понять, кто на ком стоялm_date - параметр, а p_date - поле в курсоре или наоборот - надо листать обратно и выискивать намёки в коде.

ularsoft
если срок истек, но остаток не ноль, необх вкл в расчет.
Вроде б уже предлагал - проверить пересечение сроков, и если остаётся необработанный кусок - так обработать его отдельно (если уж прямо в том цикле почему-то нельзя). А если хочется не общих советов, а детальных, тогда надо для начала внятно, на примере объяснить, что вообще происходит.
14 июл 16, 09:41    [19407404]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ularsoft
Member

Откуда:
Сообщений: 355
[quot tanglir]ещё раз
внимательно и по пунктам

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

потому как на данный момент даже чтоб понять, кто на ком стоялm_date - параметр, а p_date - поле в курсоре или наоборот - надо листать обратно и выискивать намёки в коде.

ularsoft
SELECT * 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 даты не входит в промежуток.
14 июл 16, 11:37    [19408138]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
tanglir
Member

Откуда:
Сообщений: 28966
всё, я пас
14 июл 16, 12:24    [19408525]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
ularsoft
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. Если вместо вычитания дат использовать простое сравнение проблема останется?

SCAN FOR (...) or (TTOD(pl_date2) < m_date1)


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

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

* Для версии 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?
17 июл 16, 15:41    [19420574]     Ответить | Цитировать Сообщить модератору
 Re: Перебор строк в таблице  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Tempvo - это таблица или тоже ранее сделанная выборка? Если это выборка, то была ли она сформирована с учетом значения переменной m_date1? Т.е. а есть ли вообще запись с суммой остатка, для Вашего проблемного значения?

select * from Tempvo where Tempvo.t1_lc = '1272031100002234'
17 июл 16, 15:46    [19420587]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить