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

Вниз

Не кастуется поле, если текст запроса формируется в динамически   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
3-1092898465
mouse_web
2004-08-19 10:54
2004.09.19
Изменение курсора


3-1092975265
Князев Сергей
2004-08-20 08:14
2004.09.19
BDE не встает и все тут


3-1093005560
happyandry
2004-08-20 16:39
2004.09.19
Как изменить программно свойства dbgrid


4-1091787305
Dmitry V. Averuanov
2004-08-06 14:15
2004.09.19
Получить информацию, аналогичную Application.EXEName


1-1094191748
Vilkkkka
2004-09-03 10:09
2004.09.19
Как перехватить открытие файла?