|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Мне необходжимо составить запрос для формирования Оборотной ведомости (в QuickReport), имеется 4 таблицы(VFP 6 ): tr016- начальные остатки,tr004-приход, tr006 -расход, tr014-список используемых мест хранения, у всех таблиц есть поле KMX -код места хранения, у трёх таблиц tr004,tr006,tr016 есть два одинаковых поля - sch,such (счёт, субсчёт),в каждой таблице так же есть поле cena(сумма) мне нужно выбрать все записи и сосчитать суммы для всех возможных наборов (кмх, счёт,субсчёт) причём в каждой записи ИЛИ tr004.cena = 0(приход) И tr016.cena <> 0(остаток),ИЛИ tr004.cena <> 0(приход) И tr016.cena = 0(остаток),выводится '0', Я использую TADOQuery для формирования запроса: Ничего не работает, суммы получаются огромные, счета + субсчета дублируются,кто может помочь, помогите пожайлуста! Может логику нужно изменить запроса, или может существует другой способ решения? SELECT distinct TR014.KMX, TR006.Sch, TR006.Such, SUM(tr016.cena) as Ostatok, SUM(tr004.cena) as Prixod, SUM(tr006.cena) as Rasxod FROM TR014 left join TR006 on TR014.KMX = TR006.KMX left join TR004 on TR014.KMX = TR004.KMX and tr006.kmx = tr004.kmx and tr004.sch = tr006.sch and tr004.such = tr006.such left join TR016 on TR014.KMX = TR016.kmx and tr016.kmx = tr006.kmx and tr016.sch = tr006.sch and tr016.such = tr006.such ПРОБОВАЛ С пОМОЩЬЮ UNION, то же самое : SELECT TR014.KMX, TR006.Sch, TR006.Such, SUM(tr016.cena) as Ostatok, 0 as Prixod, SUM(tr006.cena) as Rasxod FROM TR014,TR016,TR006 where TR014.KMX = TR016.KMX and tr006.kmx = tr016.kmx and tr016.sch = tr006.sch and tr016.such = tr006.such UNION SELECT TR014.KMX, TR006.Sch, TR006.Such, 0 as Ostatok, SUM(tr004.cena) as Prixod, SUM(tr006.cena) as Rasxod FROM TR014,TR004,TR006 where TR014.KMX = TR004.KMX and tr006.kmx = tr004.kmx and tr004.sch = tr006.sch and tr004.such = tr006.such ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2002, 10:54 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Вот в Access такая штука работает (почти правильно -суммы не те всё равно), а в Delphi 6 (+ADOQuery+OLE DB VFP7) нет: SELECT tr014.kmx, tr006.sch, tr006.such,0 AS OStatki, Sum(tr004.cena) AS Prixod, Sum( tr006.ctpok) AS Rasxod FROM tr014 INNER JOIN (tr006 INNER JOIN tr004 ON ( tr006.kmx = tr004.kmx) AND ( tr006.SCH=tr004.SCH) AND ( tr006.SUCH=tr004.SUCH)) ON tr014.kmx = tr006.kmx GROUP BY tr014.kmx, tr006.sch, tr006.such UNION SELECT tr014.kmx, tr006.sch, tr006.such, Sum(tr016.cena) AS OStatki,0 AS Prixod, Sum( tr006.ctpok) AS Rasxod from tr014 INNER JOIN (tr006 inner join tr016 ON ( tr006.kmx = tr016.kmx) AND ( tr006.SCH=tr016.SCH) AND ( tr006.SUCH=tr016.SUCH)) ON tr014.kmx = tr006.kmx GROUP BY tr014.kmx, tr006.sch, tr006.such; Кто-нить помогите, шеф живьём съест, нужен отчёт скорее! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2002, 14:11 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Сначала нужно создать временную таблицу, назовем ее Temp select sch,such,kmh sum(cena) as Saldo0, 0 as Debet, 0 as Credit from tr016 group by sch,such,kmh union select sch,such,kmh,0 as Saldo0, sum(cena) as Debet, 0 as Credit from tr004 group by sch,such,kmh union select sch,such,kmh,0 as Saldo0, 0 as Debet, sum(cena) as Credit from tr006 group by sch,such,kmh Затем выполнить запрос по таблице Temp select sch,such,”Название места хранения”, sum(saldo0) as Ostatok0, sum(Debet) as Prixod, sum(Credit) as Rasxod from temp, tr014 where temp.kmh=tr014.kmh group by sch,such,”Название места хранения” Конечный остаток вычислять в отчете через вычисляемое поле. Возможно, это не оптимальный вариант, но работать он будет железно. Я не знаю диалекта SQL для VFP и поэтому не могу сказать, позволяет ли он создават временные таблице в запросе. Если позволяет, то все это можно запихать в один запрос, но надо использовать TADODataSet. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2002, 15:02 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
А почему именно TADODataSet ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2002, 15:24 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
По моему я немного зарапортавался и не обратил внимание, что работа идет через TADOQuery. Про TQuery я точно знаю, что он не позволяет обрабатывать несколько операторов SQL в одном запросе. Насчет TADOQuery - не знаю. Я, в соответсвии с рекомендациями Borland использую только TADODataSet и TADOCommand. Эти компоненты полностью перекрывают все необходимые потребности. Все прочие введены только для облегчения перехода с BDE на ADO и, по отзывам большого числа программеров, работают довольно коряво. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2002, 17:31 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Прикол таблицу создаёт, но создаёт реальную temp.dbf, что в принципе допустимо, вот только её надо же заполнить. Может использовать несколько запросов: 1 этап: Удаление ТЕМР.dbf 2 этап: заполнение как-нить так:insert into temp (select union select union select) 3 этап: выборка из temp.dbf Я правильно понял? А вместе все три этапа в запрос не влезают. Unrecognized phrase..выдаёт.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2002, 05:02 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Да ещё UNION с ошибками выбирает такую конструкциюProvider retuned E_FAIL status) очевидно в фоксе такие запросы недопустимы..Я и через ODBC пробовал, то же самое. Select 0 as A,sum(Cena1) as B union select SUM(Cena2), 0 as B Да ещё вопрос : Последний запрос тоже через UNION? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2002, 05:18 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Ну тогда можно: Первый запрос select sch,such,kmh sum(cena) as Saldo0, 0 as Debet, 0 as Credit into temp.dbf from tr016 group by sch,such,kmh Второй запрос select sch,such,kmh,0 as Saldo0, sum(cena) as Debet, 0 as Credit into temp1.dbf from tr004 group by sch,such,kmh Третий запрос select sch,such,kmh,0 as Saldo0, 0 as Debet, sum(cena) as Credit into temp2.dbf from tr006 group by sch,such,kmh Так как эти запросы не возвращают записей, то нужно использовать ExeсSql, а не open. (Может быть поэтому не проходил запрос с union?) Затем в программе use temp append from temp1 append from temp2 close temp Затем снова запрос select sch,such,”Название места хранения”, sum(saldo0) as Ostatok0, sum(Debet) as Prixod, sum(Credit) as Rasxod from temp, tr014 where temp.kmh=tr014.kmh group by sch,such,”Название места хранения” ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2002, 18:48 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Так ведь разговор был о TADODataSet, у него нет метода ExecSQl, а потом не идёт запрос типа SELECT ...INTO .. ,а так же INSERT INTO TEMP SELECT... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2002, 07:49 |
|
Кто-нить помогите разобраться с многотабличным запросом???
|
|||
---|---|---|---|
#18+
Во дела. Я на работе вляпался точно в такую же задачу. Ничего не получалось, пока я не заменил DSN c Visual Foxpro на dBase. После этого с пол-оборота сработала следующая конструкция. With ADOCommandMain do begin try CommandText:='drop table temp'; Execute; except end; CommandText:='select ... into temp from ...'; Execute; CommandText:='insert into temp select ... from ...'; Execute; ... CommandText:='insert into temp select ... from ...'; Execute; end; ADODataSetMain.CommandText:='select ... from temp'; ADODataSetMain.open; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2002, 17:33 |
|
|
start [/forum/topic.php?fid=58&tid=2120003]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 282ms |
total: | 423ms |
0 / 0 |