Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

Проблема с параметром компонента TQuery ()   Найти похожие ветки 

 
ScareCrow   (2002-11-14 13:02) [0]

Уважаемые Cпециалисты DELPHI!!!
ПОМОГИТЕ ПОЖ. !!!
З А Р А Н Е Е Б Л А Г О Д А Р Ю З А В Н И М А Н И Е !!!


На форме имеются след. компоненты:
H :TTable;
dsH :TDataSource;
Income :TQuery;
dsIncome :TDataSource;

Установлено отношение (OneToMany):
Income.DataSource:=dsH;

Что это за сообщение возникает,
когда пытаешься сделать Income.Active:=true;


Текст сообщения: "Could not find object"


Income.SQL.Text следующий
(принципиален только выделенный жирным шрифтом блок):


/* ================================================ */
/* ВСЕ ПРИХОДЫ ДО ДАТЫ ТЕКУЩЕГО.ДОК-ТА ВКЛЮЧИТЕЛЬНО */
/* ================================================ */
/* InCome */
/* ================================================ */
/* Все поставки нам (0) */
/* до даты тек. расходного док-та включительно */
/* ================================================ */
SELECT
:USER_ID AS USER_ID,
D.D_ID,
H.HTYPE,
H.HDATE,
H.ORDNOBYTYPE,
H.H_ID,
H.CNTR_ID,
H.InternalExchRate As BaseExchRate ,
D.OBJID,
D.PriceS as BasePriceS,
D.PriceN as BasePriceN,
D.Quantity As InCome
FROM
H,
D
WHERE
H.HTYPE=0
AND
H.H_ID=D.H_ID
AND
H.HDATE<=:HDate
AND
H.InitStore_ID=:InitStore_ID
UNION
/* ================================================ */
/* Все возвраты нам (2) */
/* до даты тек. расходного док-та включительно */
/* исключая возвраты по самому текущему документу, */
/* если даже они были сделаны в тот же день, */
/* что и сам документ */
/* ================================================ */

SELECT
:USER_ID AS USER_ID,
D.D_ID,
H.HTYPE,
H.HDATE,
H.ORDNOBYTYPE,
H.H_ID,
H.CNTR_ID,
H.InternalExchRate As BaseExchRate ,
D.OBJID,
D.PriceS as BasePriceS,
D.PriceN as BasePriceN,
D.Quantity As InCome
FROM
H,
D
WHERE
H.HTYPE=2
AND
H.H_ID=D.H_ID
AND
H.HDATE<=:HDate
AND
H.InitStore_ID=:InitStore_ID
AND
D.Root NOT IN
(SELECT
DISTINCT D_ID
FROM
D
WHERE
H.H_ID<>:H_ID)

UNION

/* ================================================ */
/* Все поставки нам с других складов (3) */
/* до даты тек. расходного док-та включительно */
/* ================================================ */
SELECT
:USER_ID AS USER_ID,
D.D_ID,
H.HTYPE,
H.HDATE,
H.ORDNOBYTYPE,
H.H_ID,
H.CNTR_ID,
H.InternalExchRate As BaseExchRate ,
D.OBJID,
D.PriceS as BasePriceS,
D.PriceN as BasePriceN,
D.Quantity As InCome
FROM
H,
D
WHERE
H.HTYPE=3
AND
H.H_ID=D.H_ID
AND
H.HDATE<=:HDate
AND
H.CNTR_ID=:OWNER_ID
AND
H.CNTR_STORE_ID=:InitStore_ID
ORDER BY
H.HDATE,
H.ORDNOBYTYPE

ТЕПЕРЬ ВНИМАНИЕ!!!

если в подзапросе параметр :H_ID заменить на явное значение,
например 801, то В С Е Р А Б О Т А Е Т !!!
И ЭТО ПРИ ТОМ, ЧТО H:TTable ЕСТЬ ТАКОЕ ПОЛЕ !!!
ПОЛЕ АВТОИНКРЕМЕНТНОЕ (PARADOX)

К О Ш М А Р ! ! !


 
Leran2002 ©   (2002-11-14 13:05) [1]

Income.Prepare;
Income.Open; {Income.Active:=true;}


 
Leran2002 ©   (2002-11-14 13:14) [2]

Хотя мож я и ошибаюсь...


 
ScareCrow   (2002-11-14 13:28) [3]

Уважаемый Leran2002 !!!
НЕ ПОМОГАЕТ


Вообще-то, мне еще на стадии DesignTime необходимо создать
в FieldExplorer поля для Income:TQuery.
Там-то и возникает Эта ошибка.
Самое интересное, что ранее (в предыдущей версии программы)
у меня происходило подобное и мне удалось, к сожалению
безотчетно, устранить проблему. Непонятна природа этой ошибки.


 
Виталий Панасенко   (2002-11-14 13:32) [4]

Попробуй убрать коментарии, у меня только что тоже было


 
ЮЮ ©   (2002-11-14 13:35) [5]

Для начала убери Income.DataSource
Если ругаться перестанет проблема в H:TTable


 
ScareCrow   (2002-11-14 13:46) [6]

Уважаемые Виталий и ЮЮ!!!
Все равно "Could not find object"...

Кстати, ЮЮ, что значит проблема в в H:TTable ???


 
ЮЮ ©   (2002-11-14 13:53) [7]

если и при Income.DataSource=nil ругается, значит нет проблем :-)
Помнится такое же сообщение возникало, когда я пытался ставить RequestLeave или CashUpdates в true без указания UpdateObject


 
ScareCrow   (2002-11-14 14:43) [8]

Дааа... вон как оно ...

Может Кто еще подскажет ???

Спасибо Ребята...

...хочется рыдать...

... интересно, а в самом Borland знают ?


 
ScareCrow   (2002-11-14 14:59) [9]

Если кто-то еще изучает эту беду,
то извините за абсурдность выделенного блока.Произошла очепятка.
В программе он выглядит след.образом и именно таковым он не работает:

...
(SELECT
DISTINCT D_ID
FROM
D
WHERE
D.H_ID=:H_ID)
...


Но если этот Подзапрос (будь он неладен!) поместить
в отдельный компонент TQuery, то все Ok... Где логика???


 
ЮЮ ©   (2002-11-15 03:45) [10]

А можно узнать зачем используется Union трех совершенно одинаковых (по структуре используемых таблиц и выбираемых полей) запросов? В этом случае надо подумать над WHERE


 
ScareCrow   (2002-11-15 12:31) [11]

Уважаемый ЮЮ!

Различия в каждом из трех основных SELECTов следующие:

Первый берем как есть.
Второй исключает ряд записей при помощи злосчастного подзапроса.
Третий в условии WHERE имеет отличие от двух других.
Вот смотрите, что в первом и втором :

WHERE
...
AND
H. InitStore_ID=:InitStore_ID
...
А теперь, что в третьем :

WHERE
...
AND
H. CNTR_STORE_ID=:InitStore_ID
...

Если даже и объединять первый со вторым (надо попробовать),
то снижается читабельность (по крайней мере для меня), а
помимо этого, в перспективе не исключены взаимосключающие изменения в секции WHERE. (Извините за плохой русский...)
С этой точки зрения, я считаю, не стоит мудрить: сами знаете, будучи программистом, как иногда, особенно по неопытности, трудно найти компромисс между лаконичностью алгоритма и той-же оптимальностью.

Вчера до девяти вечера "Could not find object"...

Оставил пока подстановку явного значения.
Но Я не Я буду, если не выясню все эти выверты.

P.S. По личному опыту считаю, что оптимизация SQL не такая уж тривиальная штука. Интересно Ваше мнение.


 
VAleksey ©   (2002-11-15 14:08) [12]

Это не выверты. В LocalSQL.hlp так и написано, что BDE не позволяет использование параметров в подзапросах.
:)) Сам в свое время над эти голову поломал.


 
ScareCrow   (2002-11-15 14:17) [13]

VAleksey! Спасибо, я посмотрю LocalSQL.hlp, но, честное слово, в предыдущей версии этот подзапрос,
но с другим параметром, выполняется "НА УРА"


 
AME   (2002-11-15 14:48) [14]

Ещё путь:
Query.SQL.Clear;
Query.SQL.Add("* "+
"(SELECT DISTINCT D_ID FROM D WHERE D.H_ID=61")



 
ScareCrow   (2002-11-15 15:22) [15]

Уважаемый AME !!!
Можно прокомментировать. Особенно *
:)


 
ЮЮ ©   (2002-11-18 03:54) [16]

to ScareCrow (15.11.02 12:31)
Понятно, что все три подзапроса выбирают разные записи, но структура то одна и та же, т.е. следует избавиться от union и всё перенести в WHERE:

SELECT
:USER_ID AS USER_ID,
D.D_ID,
H.HTYPE,
H.HDATE,
H.ORDNOBYTYPE,
H.H_ID,
H.CNTR_ID,
H.InternalExchRate As BaseExchRate ,
D.OBJID,
D.PriceS as BasePriceS,
D.PriceN as BasePriceN,
D.Quantity As InCome
FROM
H,
D
WHERE
H.HDATE<=:HDate
AND
H.H_ID=D.H_ID
AND

/* ================================================ */
/* ВСЕ ПРИХОДЫ ДО ДАТЫ ТЕКУЩЕГО.ДОК-ТА ВКЛЮЧИТЕЛЬНО */
/* ================================================ */
/* InCome */
/* ================================================ */
/* Все поставки нам (0) */
/* до даты тек. расходного док-та включительно */
/* ================================================ */
(
H.HTYPE=0
AND
H.InitStore_ID=:InitStore_ID
) OR (
/* ================================================ */
/* Все возвраты нам (2) */
/* до даты тек. расходного док-та включительно */
/* исключая возвраты по самому текущему документу, */
/* если даже они были сделаны в тот же день, */
/* что и сам документ */
/* ================================================ */
H.HTYPE=2
AND
H.InitStore_ID=:InitStore_ID
AND
D.Root NOT IN
(SELECT DISTINCT D_ID FROM D WHERE D.H_ID=:H_ID)
) OR (
/* ================================================ */
/* Все поставки нам с других складов (3) */
/* до даты тек. расходного док-та включительно */
/* ================================================ */
H.HTYPE=3
AND
H.CNTR_ID=:OWNER_ID
AND
H.CNTR_STORE_ID=:InitStore_ID
)
ORDER BY
H.HDATE,
H.ORDNOBYTYPE
H.H_ID<>:H_ID)


 
ЮЮ ©   (2002-11-18 04:27) [17]

А теперь "тонкое место"
Вместо
AND
D.Root NOT IN
(SELECT DISTINCT D_ID FROM D WHERE D.H_ID=:H_ID)
// другими словами, исключаем те записи у которых D.Root = D.D_ID и при этом D.H_ID=:H_ID
можно просто
AND
NOT (D.Root=D.D_ID AND D.H_ID=:H_ID)


 
ScareCrow   (2002-11-21 13:06) [18]

Уважаемый ЮЮ!

Извините, я приболел и не имел доступа к сетке.
22/11/2002 изучу Ваши варианты.
СПАСИБО!



Страницы: 1 вся ветка

Текущий архив: 2002.12.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
1-27950
Vikuksa
2002-11-29 11:48
2002.12.09
AdvColumnGrid


7-28312
gluka
2002-10-05 01:32
2002.12.09
Service & Desktop


1-28005
mike-d
2002-11-29 22:05
2002.12.09
Перезапуск приложения


7-28302
@Ujin
2002-10-06 15:41
2002.12.09
Как просто и быстро зарегистрировать расширение?


1-28072
alvin
2002-11-28 06:47
2002.12.09
Нажатие клавиш в Word