![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не кастуется поле, если текст запроса формируется в динамически [D7, IB6.x]
KIR © (2004-08-23 17:47:00)Народ, ситуация след.
Пишу запрос, в котором среди прочего, есть стока типа
CAST(SOMEVALUE AS NUMERIC(10,2))
В SQL-редакторе IB EXPERT'a все проходит без сучка...
Если же текст запроса формируется в динамически:
...
With MyDS.SQLs.SelectSQL do
begin
Clear;
Add('CAST(SOMEVALUE AS NUMERIC(10,2))');
...
То выдается ошибка:
"MyDS.SelectQuery: The insert, update, delete, ddl or authorization statement cannot be executed because the trasaction is inquiry only. Dynamic SQL Error. SQL error code = -187. Metadata update statement is not allowed by the current database SQL dialect 3."
Все это начало случаться, после того, как я перевел базу да 3-й диалект...
P.S. Использую FIBPlus, если это играет роль...
Johnmen (2004-08-24 23:41:00) [1]А ешё смысл указанного CAST совершенно не понятен...
kaif (2004-08-24 13:03:00) [2]Вообще-то сначала нужно понять, чье это сообщение. Судя по тексту сообщения, дело здесь не в CAST вообще, а в том, как стартовала транзакция. Возможно это какой-то случай активизации какой-то фоновой транзакции, которая не вправе менять метаданные, изменять данные или еще что-то... В IBX сейчас такие транзакции не используются (транзакции с неявным стартом). Но я смутно припоминаю старую литературу, в которой говорилось, что такие транзакции в природе IB существуют и в них нельзя изменять данные, так как их нельзя корректно откатить. Они в старых версиях IBX стартовали, если просто оставить запрос на форме открытым. То есть если Query1.Open происходило до того, как вызвали Transaction1.StartTransaction явно.
Мне почему-то кажется, что природа ошибки кроется где-то здесь, а не в синтаксисе. Проверь, как стартуют транзакции, нет ли вызовов Query.Open до StartTransaction, не остались ли открытыми (Active) какие-то компоненты запросов на формах или в модулях данных.
В конце-концов можно временно упростить запрос до просто SELECT COUNT чтобы убедиться, что дело не в CAST или, наоборот, в CAST.
KIR (2004-08-24 11:32:00) [3]>kaif © (23.08.04 23:51) [10]
Можно и не вникать (я, кстати, для этого изначально только одну строчку и привел.
Но что это мистика? Из IBExpert'a все - ок, при формировании текста запроса динамически - вышеуказанная ошибка...
kaif (2004-08-23 23:51:00) [4]Я даже вникать не буду. CAST работает всегдав третьем диалекте. Хочешь запрос динамически конструируй, хочешь руками набирай. Ошибка в чем-то другом. Правда я работаю с IBX... Если компоненты FIBPlus делают какой-то свой парсинг - я молчу.
KIR (2004-08-23 18:24:00) [5]Не проходит...
Sergey13 (2004-08-23 18:20:00) [6]А если в дизайне запрос загнать в компонент?
KIR (2004-08-23 18:08:00) [7]Нет, нужно именно произведение. Еще раз говорю, проблема не в том, где пишется Cast, а в чем-то еще. Кстати, что такое 'trasaction is inquiry only'?
Sergey13 (2004-08-23 18:06:00) [8]Тогда может так?
Add('SUM(D_NAKL.COST *CAST(1+D_NAKL.NDS/100) AS NUMERIC(15,2)) * D_NAKL.KOLVO) AS SUMMA');
KIR (2004-08-23 18:05:00) [9]Да и потом, я же говорю в IBExpert'e все работает, так что проблема не в том, что именно кастуется
KIR (2004-08-23 18:04:00) [10]Не-не-не, кастовать надо только первое произведение, я уже про это целую ветку развил:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1092909509&n=1
Sergey13 (2004-08-23 18:00:00) [11]Не понял чего ты кастуешь. Может так надо
Add('SUM(CAST(D_NAKL.COST * (1+D_NAKL.NDS/100) * D_NAKL.KOLVO) AS NUMERIC(15,2)) AS SUMMA');
KIR (2004-08-23 17:54:00) [12]Весь запрос (правда есть ли смысл?):
With NaklArcDS.SQLs.SelectSQL do
begin
Clear;
Add('SELECT');
Add('M_NAKL.ID,');
Add('M_NAKL.PARTNERID,');
Add('IN_BILLS.NUMB AS IN_BILLS_SPR_NUMB,');
Add('IN_BILLS.DAT AS IN_BILLS_SPR_DAT,');
Add('IN_BILLS.PAYDAT,');
Add('IN_BILLS.ID AS IN_BILLS_SPR_ID,');
Add('M_NAKL.NUMB AS M_NAKL_SPR_NUMB,');
Add('PARTNERS.PARTNAME,');
Add('M_NAKL.DAT AS M_NAKL_SPR_DAT,');
Add('M_NAKL.INDAT,');
Add('M_NAKL.NAL,');
Add('M_NAKL.DEL,');
//так не работает
Add('SUM(CAST(D_NAKL.COST * (1+D_NAKL.NDS/100) AS NUMERIC(15,2)) * D_NAKL.KOLVO) AS SUMMA');
//а так работает
// Add('SUM(D_NAKL.COST * (1+D_NAKL.NDS/100) * D_NAKL.KOLVO) AS SUMMA');
Add('FROM');
Add('M_NAKL LEFT OUTER JOIN IN_BILLS');
Add('ON IN_BILLS.ID = M_NAKL.BILLID,');
Add('PARTNERS,');
Add('D_NAKL');
Add('WHERE');
Add('M_NAKL.PARTNERID = PARTNERS.ID');
Add('AND');
Add('M_NAKL.ID = D_NAKL.MASTERID');
Add('AND');
Add('((M_NAKL.DAT >= :BEGDAT');
Add('AND');
Add('M_NAKL.DAT <= :ENDDAT)');
Add('OR');
Add('(M_NAKL.DAT IS NULL))');
Add('GROUP BY');
Add('M_NAKL.ID,');
Add('M_NAKL.PARTNERID,');
Add('IN_BILLS.NUMB,');
Add('IN_BILLS.DAT,');
Add('IN_BILLS.PAYDAT,');
Add('IN_BILLS.ID,');
Add('M_NAKL.NUMB,');
Add('PARTNERS.PARTNAME,');
Add('M_NAKL.DAT,');
Add('M_NAKL.INDAT,');
Add('M_NAKL.NAL,');
Add('M_NAKL.DEL');
Add('ORDER BY');
Add('M_NAKL.DAT DESC');
end;
Sergey13 (2004-08-23 17:50:00) [13]А весь запрос каков?