Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не кастуется поле, если текст запроса формируется в динамически [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]

А весь запрос каков?


Наверх

Титульная страница Поиск, карта сайта Написать письмо