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


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