Форум: "Базы";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизРабота с вычисляемыми полями Найти похожие ветки
← →
Shtock (2003-03-27 08:14) [0]Доброе утро, мастера! Есть 2 таблицы, связанные отношением master-detail. В таблице detail есть некое поле work_wal. В таблице master есть вычисляемое поле work_val, равное, соответственно, сумме значений поля work_val соответствующих записей таблицы detail. Каким образом мне осуществить пересчет суммы (поля work_val в таблице master) при измененни записи в таблице detail.Вызов события OnCalculateFields приводит к exception: таблица master не находится в режиме Edit или Insert.
Заранее спасибо!
← →
Sava (2003-03-27 08:35) [1]А тригер не пробовал написать?
На изменение, на вставку и на удаление?
← →
stone (2003-03-27 09:25) [2]
> таблица master не находится в режиме Edit или Insert
Ну так установи режим Edit
← →
Johnmen (2003-03-27 09:35) [3]Возникновение данного exception говорит о том, что указанное поле НЕ является вычисляемым !
← →
Vassiliy (2003-04-01 09:31) [4]Ты бы код свой показал, легче было бы разобраться :)
← →
Fiend (2003-04-01 09:41) [5]так надо сделать Edit, потом поправить значения выч полей а затем сделать Post, и всё получится
← →
Mike Kouzmine (2003-04-01 09:43) [6]Естественно. см Johnmen.
Чтобы помочь, необходимо знать какие компоненты используешь для доступа. Если TTable, то берешь еще один экземпляр дет таблицы, вяжешь так же как и первый, на датачендж первой делаешь рефреш второй и в цикле пересчитываешь. Для TQuery та же бодяга
← →
Mike Kouzmine (2003-04-01 09:45) [7]Fiend © При вычислении кальк полей НД находиться не в дседит, а в дсКальфильдз, насколько помню, просто так его не выставить. Хотя я могу ошибаться.
← →
Fiend (2003-04-01 09:59) [8]То Mike Kouzminе:
согласен, это я не подумав ответил. Глянул тексты и в натуре никакого едит поста нету. Наверно он пытается действительно не вычисляемые поля править.
← →
Shtock (2003-04-01 10:12) [9]Для Vassiliy:
void __fastcall TVTKDataModule::CompADOTableCalcFields(TDataSet *DataSet)
{
AnsiString Query;
Query="SELECT SUM(design.work_val) AS work_val FROM design,vedomost,complect WHERE((design.id_comp=complect.id)";
Query+="AND(complect.id_ved=vedomost.id)AND(vedomost.id="+VedADOQuery->FieldByName("id")->AsString+")AND(";
Query+="complect.id="+CompADOTable->FieldByName("id")->AsString+"))" ;
OpenQuery(VTKDataModule->WorkADOQuery,Query);
CompADOTable->FieldByName("work_val")->AsFloat=WorkADOQuery->FieldByName("work_val")->AsFloat;
}
void __fastcall TVTKDataModule::DesignADOTablework_valChange(TField *Sender)
{
CompADOTableCalcFields(CompADOTable);
}
← →
Fiend (2003-04-01 10:21) [10]А зачем вы насильно вызываете обработчик вычисления полей?
Выходит у вас таки нету вычисляемых полей в таблице и потому он сам не вызывается!
А раз таких полей нету, значит надо Едит-Поменять-Пост - это внутри обработчика. А вообще конечно неплохо бы разобраться зачем нужны вычисляемые поля!
И в принципе то шо вы в обработчике делаете неплохо бы перенести в OnBeforePost и там преспокойненько сделать задуманное безо всяких Едит-Пост
← →
Mike Kouzmine (2003-04-01 10:21) [11]Еще раз для Васи. Когда начинает выполняться void __fastcall TVTKDataModule::CompADOTableCalcFields(TDataSet *DataSet), то набор данных переводится в режим расчета кальк полей. Это спец режим, в котором возможно изменение только fkCalcField (или как оно там), ты же пытаешься править fkData.
← →
stone (2003-04-01 10:29) [12]Не очень занком с синтаксисом Си
Что-то типа этого
> void __fastcall TVTKDataModule::DesignADOTablework_valChange(TField
> *Sender)
> {
CompADOTable.Edit;
> CompADOTableCalcFields(CompADOTable);
> }
← →
Fiend (2003-04-01 10:58) [13]То stone:
тока не точка а ->Edit()
Это если просто поправить синтаксис который вы привели
← →
Vassiliy (2003-04-01 11:03) [14]Наиболее вероятная причина ошибки - поле "work_val" не вычисляемое. Проверь еще раз...
← →
Shtock (2003-04-01 11:06) [15]Проверил, вычисляемое. Но ходят слухи, что Builder 5.0 порядочно глючит c ADO. Сам уже не раз убеждался. Недавно очередной глюк отловил.
← →
Vassiliy (2003-04-01 11:08) [16]ADO тут вообще говоря не причем. Работа с вычисляемыми полями на клиенте идет независимо от механизма доступа к БД.
← →
Anatoly Podgoretsky (2003-04-01 11:13) [17]Shtock © (01.04.03 11:06)
Есть неподтвержденные слухи, что это как правило программисты.
Вот ты например страдаешь излишней конкретностью :-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c