Форум: "Базы";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизПроблема с параметром компонента 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c