Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Текущий остаток и Sql-запрос / 12 сообщений из 12, страница 1 из 1
06.08.2008, 18:41
    #35474642
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
Имеется таблица TDV со структурой:

kod n(5)-код контрагента
data d(8)-дата операции
N_dok c(10)-№ докум.
op n(1)-операция:0-приход,1-расход
suma (12,2)-Сумма операции

Тогда ведомость дебеторов-кредиторов на дату NADAT формируется с помощью запроса:

Код: plaintext
1.
SELECT KOD,SUM(SUMA*( 1 - 2 *OP)) AS OST,MAX(DATA) AS P_DAT FROM TDV WHERE DATA < NADAT GROUP BY KOD ;
 HAVING SUM(SUMA*( 1 - 2 *OP)) #  0  ORDER BY  2  INTO CURSOR CDEB

Можно ли с помощью одних SQL-запросов сформировать таблицу (для акта сверки на дату NADAT )
со структурой:

data d(8)-дата операции
N_dok c(10)-№ докум.
SUM_P N(12,2)-сумма прихода (0 ,если документ расход.)
SUM_R N(12,2)-сумма расхода (0, если документ приход.)
OST_TEK N(12,2)-остаток текущий


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
*Пусть код контрагента kod_a ,тогда для формирования этой таблицы используем SQL-запрос:

select data,n_dok,suma*( 1 -op) as sum_p,suma*op as sum_r,suma* 0  as ost_tek from TDV ;
WHERE KOD=KOD_A AND DATA <NADAT  ORDER BY DATA,OP INTO tablе AKT

*Для вычисления поля OST_TEK:
m.ost= 0 
sele akt
SCAN
	M.OST=M.OST+SUM_P-SUM_R
	REPLACE OST_TEK WITH M.OST
ENDSCAN
Можно ли построить SQL-запрос,чтобы избежать последних кодов
...
Рейтинг: 0 / 0
06.08.2008, 19:24
    #35474724
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
Нарастающий итог?

Если на одну дату - один документ, то легко

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select ;
	TDV.data, ;
	TDV.n_dok, ;
	TDV.suma*( 1 -TDV.op) as sum_p, ;
	TDV.suma*TDV.op as sum_r, ;
	SUM(TDV2.suma) as ost_tek ;
from TDV ;
inner join TDV as TDV2 ON TDV.KOD = TDV2.KOD and TDV.data >= TDV2.data ;
where TDV.KOD = m.KOD_A and TDV.data < m.NADAT
group by ;
	 1 , 2 , 3 , 4 

Если же на одну дату может быть несколько документов, то нужен "порядок следования". Т.е. некое поле, по содержимому которого можно сказать, какой документ был "первым", а какой - "вторым". Соответственно, именно это поле и использовать в условии связки таблиц, чтобы ограничить количество записей "второй" таблицы.
...
Рейтинг: 0 / 0
07.08.2008, 09:31
    #35475252
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
ВладимирМ Cпасибо ,предложенную Вами схему Sql-запроса буду использовать в своих разработках.
...
Рейтинг: 0 / 0
07.08.2008, 10:27
    #35475380
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
ВладимирМ

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select ;
	TDV.data, ;
	TDV.n_dok, ;
	TDV.suma*( 1 -TDV.op) as sum_p, ;
	TDV.suma*TDV.op as sum_r, ;
	SUM(TDV2.suma) as ost_tek ;
from TDV ;
inner join TDV as TDV2 ON TDV.KOD = TDV2.KOD and TDV.data >= TDV2.data ;
where TDV.KOD = m.KOD_A and TDV.data < m.NADAT
group by ;
	 1 , 2 , 3 , 4 


В выше указанном Sql запросе не учтена операция в нарастающем итоге,поэтому запрос в данном случае имеет таой вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select ;
	TDV.data, ;
	TDV.n_dok, ;
	TDV.suma*( 1 -TDV.op) as sum_p, ;
	TDV.suma*TDV.op as sum_r, ;
	SUM(TDV2.suma*( 1 - 2 *TDV2.op)) as ost_tek ;
from TDV ;
inner join TDV as TDV2 ON TDV.KOD = TDV2.KOD and TDV.data >= TDV2.data ;
where TDV.KOD = m.KOD_A and TDV.data < m.NADAT
group by ;
	 1 , 2 , 3 , 4 
...
Рейтинг: 0 / 0
08.08.2008, 16:28
    #35478983
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
Благодаря ВладимирМ у меня получился следующий работоспособный код для формирования акта сверки с поставщиками:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT Tdv.*  FROM rsp!tdv;
 WHERE Tdv.data <= NADAT AND Tbdv.KOD = m.KOD_A order by Tdv.data, Tdv.op, Tdv.n_dok, Tdv.scet into cursor CORD

SELECT RECNO() AS NZ,CORD.*  FROM CORD ORDER BY  1  INTO CURSOR CDV 

USE IN CORD

SELECT CDV.data, CDV.n_dok, CDV.sklad, CDV.scet, CDV.dog,;
  CDV.suma*( 1 -CDV.op) AS SUM_P, CDV.suma* CDV.op AS SUM_R, ;
 SUM(CDV2.suma*( 1 - 2 *CDV2.op)) AS OST, CDV.op;
from CDV,CDV as CDV2 WHERE CDV.NZ >= CDV2.NZ ;
group by CDV.NZ INTO CURSOR CAKT

Вопрос:можно ли первые 2 запроса объединить в один
...
Рейтинг: 0 / 0
08.08.2008, 16:37
    #35479008
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
LUCIANБлагодаря ВладимирМ у меня получился следующий работоспособный код для формирования акта сверки с поставщиками:

Код: plaintext
1.
2.
3.
SELECT Tdv.*  FROM rsp!tdv;
 WHERE Tdv.data <= NADAT AND Tbdv.KOD = m.KOD_A order by Tdv.data, Tdv.op, Tdv.n_dok, Tdv.scet into cursor CORD

SELECT RECNO() AS NZ,CORD.*  FROM CORD ORDER BY  1  INTO CURSOR CDV 
Вопрос:можно ли первые 2 запроса объединить в один
Можно заменить на такое:
Код: plaintext
1.
2.
3.
4.
5.
SELECT cast( 0  as ineger) as NZ,Tdv.*  FROM rsp!tdv;
 WHERE Tdv.data <= NADAT AND Tbdv.KOD = m.KOD_A order by Tdv.data, Tdv.op, Tdv.n_dok, Tdv.scet into cursor CORD readwrite
update cord set NZ= recno()
или 
replace all NZ with RecNo()
...
Рейтинг: 0 / 0
08.08.2008, 16:45
    #35479031
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
LUCIANВопрос:можно ли первые 2 запроса объединить в один
Думаю что нет. Встречный вопрос - в твоем первом посте описано наиболее быстрое и понятное решение. Чем тебе SCAN не понравился?

Любая попытка решить задачу (которая связана с порядком записей) средствами SQL заканчивается кучей нечитабельных селектов, т.к. в теории реляционных БД нет такого понятия номер записи, как следствие нет понятия следующая/предыдущая запись, поэтому нумерацию изобретают и запихивают в таблицу отдельным полем и отдельно извращаются со связыванием соседних записей. В итоге огромные нечитебельные и медленные селекты. XBASE же наоборот заточен на работу с последовательностями записей с учетом их порядка.

Попробуй померить время твоего решения со SCAN`ом и твоих трех SELECT`ов
...
Рейтинг: 0 / 0
08.08.2008, 16:56
    #35479058
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
Sergey Sizov. Можно заменить на такое:

SELECT cast(0 as ineger) as NZ,Tdv.* FROM rsp!tdv;
WHERE Tdv.data <= NADAT AND Tbdv.KOD = m.KOD_A order by Tdv.data, Tdv.op, Tdv.n_dok, Tdv.scet into cursor CORD readwrite
update cord set NZ= recno()
или
replace all NZ with RecNo()

Спасибо ,SELECT-SQL здесь один ,но всё равно получается 2 строки операторов.
Хотелось бы видеть один SELECT-SQL оператор
...
Рейтинг: 0 / 0
08.08.2008, 17:09
    #35479090
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
Если в итоге это надо для формирования отчета, то нарастающий итог можно рассчитать средствами отчета.
...
Рейтинг: 0 / 0
08.08.2008, 17:16
    #35479110
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
Dima T LUCIANВопрос:можно ли первые 2 запроса объединить в один
Думаю что нет. Встречный вопрос - в твоем первом посте описано наиболее быстрое и понятное решение. Чем тебе SCAN не понравился?

Вариант программы со SCAN сделал в 1996 г.Сейчас эту программу пришлось переписывать под нового
пользователя,и чтоб появился азарт к работе решил обойтись без SCAN.
...
Рейтинг: 0 / 0
08.08.2008, 17:19
    #35479116
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
LUCIANСпасибо ,SELECT-SQL здесь один ,но всё равно получается 2 строки операторов.
Хотелось бы видеть один SELECT-SQL оператор
1. Батенька, я тебе сделал две строки вместо трех и ты еще чем-то недоволен?
2. Хотеть не вредно, но в фоксе нет функций нумерования строк результирующего набора.
...
Рейтинг: 0 / 0
08.08.2008, 17:28
    #35479139
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текущий остаток и Sql-запрос
LUCIANВариант программы со SCAN сделал в 1996 г.Сейчас эту программу пришлось переписывать под нового
пользователя,и чтоб появился азарт к работе решил обойтись без SCAN.
Старое не значит худшее.

Думаю есть и другие точки приложения азарта :), иначе остается только пожелать удачи в "битве с ветряными мельницами".

PS Сколько времени потребовалось чтобы понять что делает код написанный 12 лет назад? А теперь представь что тебе же потребуется разобраться через пару лет в твоих трех чудо-селектах ... или того хуже если кто-то другой твою поделку сопровождать будет. О нем ты подумал?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Текущий остаток и Sql-запрос / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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