Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Текущий остаток и Sql-запрос  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
Имеется таблица TDV со структурой:

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

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

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)-остаток текущий


*Пусть код контрагента 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-запрос,чтобы избежать последних кодов
6 авг 08, 18:41    [6036051]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Нарастающий итог?

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

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

Если же на одну дату может быть несколько документов, то нужен "порядок следования". Т.е. некое поле, по содержимому которого можно сказать, какой документ был "первым", а какой - "вторым". Соответственно, именно это поле и использовать в условии связки таблиц, чтобы ограничить количество записей "второй" таблицы.
6 авг 08, 19:24    [6036177]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
ВладимирМ Cпасибо ,предложенную Вами схему Sql-запроса буду использовать в своих разработках.
7 авг 08, 09:31    [6037153]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
ВладимирМ


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 запросе не учтена операция в нарастающем итоге,поэтому запрос в данном случае имеет таой вид:
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
7 авг 08, 10:27    [6037421]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
Благодаря ВладимирМ у меня получился следующий работоспособный код для формирования акта сверки с поставщиками:

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 запроса объединить в один
8 авг 08, 16:28    [6045784]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
Sergey Sizov.
Guest
LUCIAN
Благодаря ВладимирМ у меня получился следующий работоспособный код для формирования акта сверки с поставщиками:

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 запроса объединить в один

Можно заменить на такое:
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()
8 авг 08, 16:37    [6045851]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15288
LUCIAN
Вопрос:можно ли первые 2 запроса объединить в один

Думаю что нет. Встречный вопрос - в твоем первом посте описано наиболее быстрое и понятное решение. Чем тебе SCAN не понравился?

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

Попробуй померить время твоего решения со SCAN`ом и твоих трех SELECT`ов
8 авг 08, 16:45    [6045915]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
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 оператор
8 авг 08, 16:56    [6045998]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15288
Если в итоге это надо для формирования отчета, то нарастающий итог можно рассчитать средствами отчета.
8 авг 08, 17:09    [6046113]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
LUCIAN
Member

Откуда: Беларусь г.Лида
Сообщений: 192
Dima T
LUCIAN
Вопрос:можно ли первые 2 запроса объединить в один

Думаю что нет. Встречный вопрос - в твоем первом посте описано наиболее быстрое и понятное решение. Чем тебе SCAN не понравился?

Вариант программы со SCAN сделал в 1996 г.Сейчас эту программу пришлось переписывать под нового
пользователя,и чтоб появился азарт к работе решил обойтись без SCAN.
8 авг 08, 17:16    [6046173]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
Sergey Sizov.
Guest
LUCIAN
Спасибо ,SELECT-SQL здесь один ,но всё равно получается 2 строки операторов.
Хотелось бы видеть один SELECT-SQL оператор

1. Батенька, я тебе сделал две строки вместо трех и ты еще чем-то недоволен?
2. Хотеть не вредно, но в фоксе нет функций нумерования строк результирующего набора.
8 авг 08, 17:19    [6046198]     Ответить | Цитировать Сообщить модератору
 Re: Текущий остаток и Sql-запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15288
LUCIAN
Вариант программы со SCAN сделал в 1996 г.Сейчас эту программу пришлось переписывать под нового
пользователя,и чтоб появился азарт к работе решил обойтись без SCAN.

Старое не значит худшее.

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

PS Сколько времени потребовалось чтобы понять что делает код написанный 12 лет назад? А теперь представь что тебе же потребуется разобраться через пару лет в твоих трех чудо-селектах ... или того хуже если кто-то другой твою поделку сопровождать будет. О нем ты подумал?
8 авг 08, 17:28    [6046259]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить