|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
Добрый день! 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.02.2016, 14:09 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ularsoftДобрый день! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
где, 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.
посчитает итоговую сумму (если я правильно понял) 2. Код: sql 1. 2.
выведет эту итоговую сумму. Зачем тогда селект и скан? Если уж минимально исправлять Вашу программу, то: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2016, 14:30 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
Станислав С...кий1. Посчитает итоговую сумму. Всё верно. Код: sql 1. 2.
2. Выведет эту итоговую сумму. Тоже верно. Код: sql 1. 2.
3. Зачем тогда селект и скан? Я ищу такие же 'XXXXX' и 'YYYYY' в подчиненной таблице proclcdt, их могут быть несколько: Код: sql 1. 2. 3.
Пока, ячейка ex.cells(16,4+j) = 0 Код: sql 1.
Вот тут, я сканирую, если m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2), Код: sql 1.
Тогда Код: sql 1.
Затем Код: sql 1.
и вывожу занчения Код: sql 1. 2.
Тут у меня берет первую строку, сравнивает с m_date1, если в этот промежуток входить, тогда следующую строку не проверяет, дальше общую сумму выводить. Я должен сканировать все строки и выводить только сумму, которая входить в этот промежуток. Н-р, в табл proclcdt 2 строки по 'XXXXX' и 3 строки 'YYYYY', из 'XXXXX' в этот промежуток входить только 1 строка, ее сумма 5, а 2 строка не входить, из 'YYYYY' в промежуток входить только 2 строки, их сумма 10, а 3 строка не входить, общий результат должен быть 5+10=15. Вот это не получается. Как сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2016, 19:17 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ularsoft... Тут у меня берет первую строку, сравнивает с m_date1, если в этот промежуток входить, тогда следующую строку не проверяет, дальше общую сумму выводить. Я должен сканировать все строки и выводить только сумму, которая входить в этот промежуток. Н-р, в табл proclcdt 2 строки по 'XXXXX' и 3 строки 'YYYYY', из 'XXXXX' в этот промежуток входить только 1 строка, ее сумма 5, а 2 строка не входить, из 'YYYYY' в промежуток входить только 2 строки, их сумма 10, а 3 строка не входить, общий результат должен быть 5+10=15. Вот это не получается. Как сделать? 1. Если ничего не получается - прочитайте, наконец, инструкцию (народный юмор). Объясняю: Код: sql 1. 2. 3.
проходит только по тем строкам, для которых выполняется условие: m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2) Что надо сделать когда мы идем по строкам? Правильно - посчитать ularsoft... сумму, которая входить в этот промежуток. поэтому я и написал Вам: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
2. Если хотите обойтись без цикла SCAN...ENDSCAN, то эти же значения можно посчитать в SELECT. В FoxPro хороший движок SQL, который позволяет писать сложные выражения. Должно получиться что-то вроде такого (символ ";" в FoxPro обозначает переход текста на следующую строку): Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:49 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:55 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:56 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:56 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:56 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:57 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
В конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 05:57 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
Станислав С...кийВ конце концов, можно использовать ту же команду SUM, только в условие FOR ввести условие на попадание в интервал дат... будет что-то типа: Код: sql 1. 2. 3. 4.
В таблице tempvo другие данные, в т.ч. остатки по 'XXXXX' и 'YYYYY', а в другой таблице proclcdt сроки по 'XXXXX' и 'YYYYY', pl_date1-начальная дата, pl_date2-конечная дата. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 06:28 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ularsoft, Вы не заметили, что я написал SELECT proclcdt, то есть перешел в другую рабочую область? Потому SUM теперь будет работать по таблице proclcdt. И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 07:58 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
Станислав С...кийularsoft, И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота. Уважаемый Станислав, Хочу выразить Вам огромную благодарность за то, что Вы мне помогли собраться! Я сделал немного по другому: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Все замечательно... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 08:50 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ularsoftСтанислав С...кийularsoft, И вообще, никто лучше Вас Вашу систему не знает. Потому, я только даю идеи. А уж применить их - ваша забота. Уважаемый Станислав, Хочу выразить Вам огромную благодарность за то, что Вы мне помогли собраться! Я сделал немного по другому: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Все замечательно... Уважаемые знатоки! В продолжении данного обсуждения, хочу спросить кое-что. Было все замечательно, пока m_date1>=TTOD(pl_date2)-7 AND m_date1<=TTOD(pl_date2) и остатки закрывались во время, в данный момент имею другую проблему: m_date1 - это дата в календаре. pl_date2 - конечная дата срока. Формирую отчет за неделю, т.е. с понедельника по воскресенье. Проблема в том, что m_date1 входить в данный промежуток, н-р, до среды, а после остаток в курсоре Tempvo должен входить в расчет. Не могу соображать как это сделать правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2016, 14:56 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
Тему не читал, но почему бы не вставить в цикл проверку на совпадение текущей даты с этой "средой"? Если совпало, то делаем EXIT. Возможно, проставляем флаг выхода, чтобы дальше как-то обработать этот факт. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2016, 11:40 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
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.06.2016, 06:26 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ularsoftН-р, если m_date1 = с 20.06.2016 по 26.06.2016, конечный срок pl_date2 = 22.06.2016, то в данный момент у меня включает в расчет с 20.06.2016 по 22.06.2016, это будет правильно если остаток НОЛЬ, иначе должен включится в расчет до конца недели.ну, расчёт до конца недели делается так Код: sql 1. 2.
а как сюда проверку "остатка" включить - вам лучше знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2016, 07:16 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
tanglirну, расчёт до конца недели делается так Код: sql 1. 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.
А у меня программа включает в расчет с 20.06.16 по 24.06.16, не включает с 25.06.16 по 26.06.16, а должен. Как это сделать? У кого какие идеи! Заранее благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2016, 06:16 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
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.07.2016, 07:06 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
tanglirВы хотите, чтобы программа включала в расчёт отсутствующие в таблицах данные, что ли? Уважаемый tanglir, В таблице TEMPVO хранятся остатки. В таблице PROCLCDT устанавливаются сроки для любого счета. Код: sql 1. 2.
Этим запросом получаю курсор 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.07.2016, 07:41 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ещё раз внимательно и по пунктам tanglirконкретные данные в теге [ CSV ]: -курсор procls, который вы получаете первым запросом -и выборки из tempvo на каждом шаге и желаемый результат с объяснением, как именно он получается и на каком этапе сейчас происходит затык именно на вот этих конкретных данных потому как на данный момент даже чтоб понять, кто на ком стоялm_date - параметр, а p_date - поле в курсоре или наоборот - надо листать обратно и выискивать намёки в коде. ularsoftесли срок истек, но остаток не ноль, необх вкл в расчет.Вроде б уже предлагал - проверить пересечение сроков, и если остаётся необработанный кусок - так обработать его отдельно (если уж прямо в том цикле почему-то нельзя). А если хочется не общих советов, а детальных, тогда надо для начала внятно, на примере объяснить, что вообще происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2016, 09:41 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
[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 даты не входит в промежуток. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2016, 11:37 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
всё, я пас ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2016, 12:24 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
ularsoft Код: sql 1.
А у меня программа включает в расчет с 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.
4. "Не пустой остаток" - это значение поля Tempvo.t1_n6 отлично от нуля? 5. Если в командном окне выполнить такой запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Будет ли в открывшемся Browse-окне отображена нужная запись? Есть ли в выборке "дубли" по значению поля proclc.pl_lc? Т.е. может ли быть несколько записей с одним и тем же значением proclc.pl_lc? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2016, 15:41 |
|
Перебор строк в таблице
|
|||
---|---|---|---|
#18+
Tempvo - это таблица или тоже ранее сделанная выборка? Если это выборка, то была ли она сформирована с учетом значения переменной m_date1? Т.е. а есть ли вообще запись с суммой остатка, для Вашего проблемного значения? Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2016, 15:46 |
|
|
start [/forum/topic.php?fid=41&fpage=17&tid=1582077]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 143ms |
0 / 0 |