Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильное вычисление computed by поля 
V
    Опции темы
rodnover
Дата 11.9.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Здравствуйте. Возникла проблема в работе с Firebird 2.5 есть таблица:

Код

CREATE TABLE ACCOUNT_M (
    ID_ACM          INTEGER NOT NULL,
    AMOUNT      NUMERIC(18,2) COMPUTED BY ((
            select PAY.OUT
            from PAYMENTS_ACM_AMOUNT_PAYMENT(ACCOUNT_M.ID_ACM) PAY))
);


В процедуре  PAYMENTS_ACM_AMOUNT_PAYMENT вычисляется ACCOUNT_M.AMOUNT используя довольно сложную логику по другим данным. Проблема в том, что с недавнего времени запрос 

Код

select ACCOUNT_M.AMOUNT
from ACCOUNT_M
where ACCOUNT_M.ID_ACM = :ID_ACM


возвращает 0. Этот же запрос, но вызванный в IBExpert возвращает правильное значение, которое отлично от нуля. Методом ковыряния было выяснено, что все computed by поля, использующиеся в процедуре PAYMENTS_ACM_AMOUNT_PAYMENT возвращают null, а в IBExpert эти значения соответствуют реальным.

В чем может быть разница поведения между запросом в программе и IBExpert. Программа написана на Delphi XE + FibPlus 7.0.15.

параметры транзакции в приложении, в которой проявляется ошибка: 
Код

read
isc_tpb_nowait
read_committed
rec_version


Такое поведение СУБД началось буквально недавно. До этого эта процедура и вычисляемое поле работало около 2х лет без изменений.

UPD. Если создать копию процедуры с именем, например, PAYMENTS_ACM_AMOUNT_PAYMENT2, то вновь созданная процедура возвращает в программе правильные значения, но стоит сделать
Код


alter table ACCOUNT_M
alter column AMOUNT computed by ((
            select PAY.OUT
            from PAYMENTS_ACM_AMOUNT_PAYMENT2(ACCOUNT_M.ID_ACM) PAY));

как перестает. При этом PAYMENTS_ACM_AMOUNT_PAYMENT начинает возвращать правильные значения.


Это сообщение отредактировал(а) rodnover - 11.9.2012, 18:23
PM MAIL   Вверх
rodnover
Дата 11.9.2012, 20:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



Методом построчной вставки кода

Код

  ShowMessage(dme.FibDB.QueryValueAsStr('select * from PAYMENTS_ACM_AMOUNT_PAYMENT(30108)', 0));


было выявлено что ошибка возникала после создания древней формы, содержащей в себе компонент TFFibDataSet с запросом

Код

select * 
from GOODS
where GOODS.ID_EC_PARENT = :PARENT 
    and GOODS.ISNODE >= :ONLY_NODES and GOODS.ID_EC <> 0


каким местом данный запрос был связан с начальным непонятно. Но после комментирования куска кода использующего этот DataSet, PAYMENTS_ACM_AMOUNT_PAYMENT стал возвращать правильные данные.

Это сообщение отредактировал(а) rodnover - 11.9.2012, 20:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.