Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.009 c
3-27835
Vint
2002-11-20 11:03
2002.12.09
Проверка целостности таблицы


3-27898
Alexey Goosev
2002-11-21 22:44
2002.12.09
Нид хелп!!!Зверски разрастается dbt файл (мемо-поля) dBase 4 базы


1-27991
pavel_ak
2002-11-29 14:21
2002.12.09
TOleContainer не хочет создавать объект


1-27941
sammy
2002-11-29 07:28
2002.12.09
certifiation


6-28187
grvakh
2002-10-15 11:13
2002.12.09
Ускорение обменом сообщениями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский