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

Есть таблица PROCLCDT.
На фоксе написал такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select pl_lc, max(TTOD(pl_date2)) as max_date;
	from proclcdt;
	WHERE INLIST(SUBSTR(pl_lc,4,5),'10603') AND TTOD(pl_date2)>m_date;
	group by pl_lc;
	into cursor proclc1
tt1_n6 = 0	
SELECT proclc1


где, m_date = 20180228

Результат запроса:
pl_lc_____________max_date___pl_sum
XXX106032000YYYY 2018-04-01 1000.00
XXX106032000YYYY 2018-04-04 5000.00
XXX106032000YYYY 2018-04-08 2000.00
XXX106032000YYYY 2018-04-09 3000.00
XXX106032000YYYY 2018-04-11 7000.00
XXX106032000YYYY 2018-04-12 9000.00
XXX106032000YYYY 2018-04-17 1500.00
XXX106032000YYYY 2018-04-25 2500.00
XXX106032000YYYY 2018-04-26 3500.00
XXX106032000YYYY 2018-05-06 5550.00
XXX106032000YYYY 2018-06-26 1250.00
XXX106032000YYYY 2019-03-14 4000.00
XXX106032000YYYY 2070-01-01 4500.00

Далее, необходимо получить сумму, которая входить в срок от 1 дня до 30 дней:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	tt1_n6 = 0	
	SELECT proclc1

	GO top
	IF not EOF()
		srok=proclc1.max_date - '20180228'
		IF srok>=1 AND srok<31
			tt1_n6 = tt1_n6 + proclc1.pl_sum
		ENDIF
	ENDIF
	* Результат записываю в ячейку С15 - Excel
  	.Range('C15').Select
	xl.Selection.Value=ABS(tt1_n6/1000)


В ячейке С15 получаю 0. А должен был получить 4000.00 за дату 2019-03-14. Подскажите пожалуйста... Где я неправильно делаю?
...
Рейтинг: 0 / 0
Сумма
    #39625722
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отладчиком смотри, один из IF`ов не срабатывает и остается 0 заданный изначально
Код: sql
1.
tt1_n6 = 0	
...
Рейтинг: 0 / 0
Сумма
    #39625723
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже не зная FoxPro, замечу, что между 28-02-2018 и всеми остальными датами больше 30 дней, поэтому
в указанное условие ничего не попадает.
...
Рейтинг: 0 / 0
Сумма
    #39625726
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d7iДаже не зная FoxPro, замечу, что между 28-02-2018 и всеми остальными датами больше 30 дней, поэтому
в указанное условие ничего не попадает.
сколько дней до 1 марта?
...
Рейтинг: 0 / 0
Сумма
    #39625729
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d7i, извиняюсь, понял по листингу, который с 1 апреля начинается.
...
Рейтинг: 0 / 0
Сумма
    #39625819
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TОтладчиком смотри, один из IF`ов не срабатывает и остается 0 заданный изначально
Код: sql
1.
tt1_n6 = 0	

Даже если
Код: sql
1.
tt1_n6 = 1

все равно в ячейке 0. Все счета, у которых срок в промежутке
Код: sql
1.
srok>=31 AND srok<90

Должны суммироваться и записать в ячейку D15.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	tt1_n6 = 0	
	SELECT proclc1
	GO top
    IF not EOF()
	srok=(proclc1.max_date)-m_date
		IF srok>=31 AND srok<90
			tt1_n6 = tt1_n6 + Tempvo.t1_n6
		ENDIF
	ENDIF
	* Результат записываю в ячейку D15 - Excel
  	.Range('D15').Select
	xl.Selection.Value=ABS(tt1_n6/1000)

Не могу понять, где ошибка?
...
Рейтинг: 0 / 0
Сумма
    #39625820
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ularsoftВсе равно в ячейке 0. Все счета, у которых сроки в промежутке
Код: sql
1.
srok>=31 AND srok<90

Должны суммироваться и записать в ячейку D15.
Должна быть D15 = 34500
...
Рейтинг: 0 / 0
Сумма
    #39625822
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	tt1_n6 = 0	
	SELECT proclc1

	GO top
	IF not EOF()
		srok=proclc1.max_date - '20180228'
		IF srok>=1 AND srok<31
			tt1_n6 = tt1_n6 + proclc1.pl_sum
		ENDIF
	ENDIF
	* Результат записываю в ячейку С15 - Excel
  	.Range('C15').Select
	xl.Selection.Value=ABS(tt1_n6/1000)



А почему не так:

Код: sql
1.
sum(pl_sum) where beetween(max_date - '20180228',1,30)
...
Рейтинг: 0 / 0
Сумма
    #39625833
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TОтладчиком смотри, один из IF`ов не срабатывает и остается 0 заданный изначально
Код: sql
1.
tt1_n6 = 0	

Смотрел отладчиком, цикл не работает. Т.е. берет дату первой строки в таблице. Следующие строки не берет. Что делать?
...
Рейтинг: 0 / 0
Сумма
    #39625834
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя нет команды перехода на следующую строку
нужен SCAN, а лучше SQL функция
...
Рейтинг: 0 / 0
Сумма
    #39625836
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftСмотрел отладчиком, цикл не работает. Т.е. берет дату первой строки в таблице. Следующие строки не берет. Что делать?
У тебя в коде нет цикла. Только проверка первой строки
Код: sql
1.
2.
	GO top && Перейти на первую запись
	IF not EOF() && если не конец таблицы
...
Рейтинг: 0 / 0
Сумма
    #39625837
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
sum pl_sum for between(max_date - '20180228',1,30)
...
Рейтинг: 0 / 0
Сумма
    #39625840
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если надо обработать все записи в proclc1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
	SELECT proclc1

	GO top
	IF not EOF()
		srok=proclc1.max_date - '20180228'
		IF srok>=1 AND srok<31
			tt1_n6 = tt1_n6 + proclc1.pl_sum
		ENDIF
	ENDIF


то IF надо заменить на SCAN
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	SELECT proclc1

	SCAN
		srok=proclc1.max_date - '20180228'
		IF srok>=1 AND srok<31
			tt1_n6 = tt1_n6 + proclc1.pl_sum
		ENDIF
	ENDSCAN
...
Рейтинг: 0 / 0
Сумма
    #39625849
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем цикл то?
Чем не страивает
982183
...
Рейтинг: 0 / 0
Сумма
    #39626485
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче, я сделал следующим образом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	select pl_lc, max(TTOD(pl_date2)) as max_date;
		from proclcdt;
		WHERE INLIST(SUBSTR(pl_lc,4,5),'10603') AND TTOD(pl_date2)>m_date;
		group by pl_lc ORDER BY max_date;
		into cursor proclc1
	tt1_n6 = 0	
	SCAN 
	SELECT proclc1
	srok=(proclc1.max_date)-m_date
	IF srok>=1 AND srok<31
		...
		...
	    tt1_n6 = tt1_n6 + proclc1.pl_sum
	ENDIF
  	    .Range('C15').Select
	    xl.Selection.Value=ABS(tt1_n6/1000)
	ENDSCAN

Где m_date - 28.02.2018
Спасибо Вам ребятки за обсуждения и помощь!
...
Рейтинг: 0 / 0
Сумма
    #39626487
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftКороче, я сделал следующим образом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
		...
		...
	    tt1_n6 = tt1_n6 + proclc1.pl_sum
	ENDIF
  	    .Range('C15').Select
	    xl.Selection.Value=ABS(tt1_n6/1000)
	ENDSCAN

Где m_date - 28.02.2018
Спасибо Вам ребятки за обсуждения и помощь!
Выделенные строки надо после ENDSCAN. Так тоже работать будет, но ты тормоз создал, т.к. в каждом проходе к экселю обращаешься.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сумма
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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