powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кто-нить помогите разобраться с многотабличным запросом???
10 сообщений из 10, страница 1 из 1
Кто-нить помогите разобраться с многотабличным запросом???
    #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
Кто-нить помогите разобраться с многотабличным запросом???
    #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
Кто-нить помогите разобраться с многотабличным запросом???
    #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
Кто-нить помогите разобраться с многотабличным запросом???
    #32030004
Dmitry2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему именно TADODataSet ?
...
Рейтинг: 0 / 0
Кто-нить помогите разобраться с многотабличным запросом???
    #32030013
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему я немного зарапортавался и не обратил внимание, что работа идет через TADOQuery. Про TQuery я точно знаю, что он не позволяет обрабатывать несколько операторов SQL в одном запросе. Насчет TADOQuery - не знаю. Я, в соответсвии с рекомендациями Borland использую только TADODataSet и TADOCommand. Эти компоненты полностью перекрывают все необходимые потребности. Все прочие введены только для облегчения перехода с BDE на ADO и, по отзывам большого числа программеров, работают довольно коряво.
...
Рейтинг: 0 / 0
Кто-нить помогите разобраться с многотабличным запросом???
    #32030040
Dmitry2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикол таблицу создаёт, но создаёт реальную temp.dbf, что в принципе допустимо, вот только её надо же заполнить. Может использовать несколько запросов:
1 этап: Удаление ТЕМР.dbf
2 этап: заполнение как-нить так:insert into temp (select union select union select)
3 этап: выборка из temp.dbf
Я правильно понял? А вместе все три этапа в запрос не влезают. Unrecognized phrase..выдаёт..
...
Рейтинг: 0 / 0
Кто-нить помогите разобраться с многотабличным запросом???
    #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
Кто-нить помогите разобраться с многотабличным запросом???
    #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
Кто-нить помогите разобраться с многотабличным запросом???
    #32030161
Dmitry2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так ведь разговор был о TADODataSet, у него нет метода ExecSQl, а потом не идёт запрос типа
SELECT ...INTO .. ,а так же
INSERT INTO TEMP SELECT...
...
Рейтинг: 0 / 0
Кто-нить помогите разобраться с многотабличным запросом???
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кто-нить помогите разобраться с многотабличным запросом???
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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