Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизНе кастуется поле, если текст запроса формируется в динамически Найти похожие ветки
← →
KIR (2004-08-23 17:47) [0]Народ, ситуация след.
Пишу запрос, в котором среди прочего, есть стока типа
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, если это играет роль...
← →
Sergey13 © (2004-08-23 17:50) [1]А весь запрос каков?
← →
KIR (2004-08-23 17:54) [2]Весь запрос (правда есть ли смысл?):
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 18:00) [3]Не понял чего ты кастуешь. Может так надо
Add("SUM(CAST(D_NAKL.COST * (1+D_NAKL.NDS/100) * D_NAKL.KOLVO) AS NUMERIC(15,2)) AS SUMMA");
← →
KIR (2004-08-23 18:04) [4]Не-не-не, кастовать надо только первое произведение, я уже про это целую ветку развил:
http://delphimaster.net/view/3-1092909509/
← →
KIR (2004-08-23 18:05) [5]Да и потом, я же говорю в IBExpert"e все работает, так что проблема не в том, что именно кастуется
← →
Sergey13 © (2004-08-23 18:06) [6]Тогда может так?
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:08) [7]Нет, нужно именно произведение. Еще раз говорю, проблема не в том, где пишется Cast, а в чем-то еще. Кстати, что такое "trasaction is inquiry only"?
← →
Sergey13 © (2004-08-23 18:20) [8]А если в дизайне запрос загнать в компонент?
← →
KIR (2004-08-23 18:24) [9]Не проходит...
← →
kaif © (2004-08-23 23:51) [10]Я даже вникать не буду. CAST работает всегда в третьем диалекте. Хочешь запрос динамически конструируй, хочешь руками набирай. Ошибка в чем-то другом. Правда я работаю с IBX... Если компоненты FIBPlus делают какой-то свой парсинг - я молчу.
← →
KIR (2004-08-24 11:32) [11]>kaif © (23.08.04 23:51) [10]
Можно и не вникать (я, кстати, для этого изначально только одну строчку и привел.
Но что это мистика? Из IBExpert"a все - ок, при формировании текста запроса динамически - вышеуказанная ошибка...
← →
kaif © (2004-08-24 13:03) [12]Вообще-то сначала нужно понять, чье это сообщение. Судя по тексту сообщения, дело здесь не в CAST вообще, а в том, как стартовала транзакция. Возможно это какой-то случай активизации какой-то фоновой транзакции, которая не вправе менять метаданные, изменять данные или еще что-то... В IBX сейчас такие транзакции не используются (транзакции с неявным стартом). Но я смутно припоминаю старую литературу, в которой говорилось, что такие транзакции в природе IB существуют и в них нельзя изменять данные, так как их нельзя корректно откатить. Они в старых версиях IBX стартовали, если просто оставить запрос на форме открытым. То есть если Query1.Open происходило до того, как вызвали Transaction1.StartTransaction явно.
Мне почему-то кажется, что природа ошибки кроется где-то здесь, а не в синтаксисе. Проверь, как стартуют транзакции, нет ли вызовов Query.Open до StartTransaction, не остались ли открытыми (Active) какие-то компоненты запросов на формах или в модулях данных.
В конце-концов можно временно упростить запрос до просто SELECT COUNT чтобы убедиться, что дело не в CAST или, наоборот, в CAST.
← →
Johnmen © (2004-08-24 23:41) [13]А ешё смысл указанного CAST совершенно не понятен...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.048 c