Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кто-нить помогите разобраться с многотабличным запросом??? / 10 сообщений из 10, страница 1 из 1
13.05.2002, 10:54
    #32029969
Dmitry2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Мне необходжимо составить запрос для формирования Оборотной ведомости (в 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
...
Рейтинг: 0 / 0
13.05.2002, 14:11
    #32029994
Dmitry2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Вот в 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;
Кто-нить помогите, шеф живьём съест, нужен отчёт скорее!
...
Рейтинг: 0 / 0
13.05.2002, 15:02
    #32030002
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Сначала нужно создать временную таблицу, назовем ее 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.
...
Рейтинг: 0 / 0
13.05.2002, 15:24
    #32030004
Dmitry2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
А почему именно TADODataSet ?
...
Рейтинг: 0 / 0
13.05.2002, 17:31
    #32030013
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
По моему я немного зарапортавался и не обратил внимание, что работа идет через TADOQuery. Про TQuery я точно знаю, что он не позволяет обрабатывать несколько операторов SQL в одном запросе. Насчет TADOQuery - не знаю. Я, в соответсвии с рекомендациями Borland использую только TADODataSet и TADOCommand. Эти компоненты полностью перекрывают все необходимые потребности. Все прочие введены только для облегчения перехода с BDE на ADO и, по отзывам большого числа программеров, работают довольно коряво.
...
Рейтинг: 0 / 0
14.05.2002, 05:02
    #32030040
Dmitry2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Прикол таблицу создаёт, но создаёт реальную temp.dbf, что в принципе допустимо, вот только её надо же заполнить. Может использовать несколько запросов:
1 этап: Удаление ТЕМР.dbf
2 этап: заполнение как-нить так:insert into temp (select union select union select)
3 этап: выборка из temp.dbf
Я правильно понял? А вместе все три этапа в запрос не влезают. Unrecognized phrase..выдаёт..
...
Рейтинг: 0 / 0
14.05.2002, 05:18
    #32030043
Dmitry2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Да ещё UNION с ошибками выбирает такую конструкциюProvider retuned E_FAIL status) очевидно в фоксе такие запросы недопустимы..Я и через ODBC пробовал, то же самое.

Select 0 as A,sum(Cena1) as B
union
select SUM(Cena2), 0 as B

Да ещё вопрос : Последний запрос тоже через UNION?
...
Рейтинг: 0 / 0
14.05.2002, 18:48
    #32030127
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Ну тогда можно:

Первый запрос
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,”Название места хранения”
...
Рейтинг: 0 / 0
15.05.2002, 07:49
    #32030161
Dmitry2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Так ведь разговор был о TADODataSet, у него нет метода ExecSQl, а потом не идёт запрос типа
SELECT ...INTO .. ,а так же
INSERT INTO TEMP SELECT...
...
Рейтинг: 0 / 0
18.05.2002, 17:33
    #32030549
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто-нить помогите разобраться с многотабличным запросом???
Во дела. Я на работе вляпался точно в такую же задачу.
Ничего не получалось, пока я не заменил 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;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кто-нить помогите разобраться с многотабличным запросом??? / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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