![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с вычисляемыми полями [D6, MSSQL]
Shtock © (2003-03-27 08:14:00)Доброе утро, мастера! Есть 2 таблицы, связанные отношением master-detail. В таблице detail есть некое поле work_wal. В таблице master есть вычисляемое поле work_val, равное, соответственно, сумме значений поля work_val соответствующих записей таблицы detail. Каким образом мне осуществить пересчет суммы (поля work_val в таблице master) при измененни записи в таблице detail.Вызов события OnCalculateFields приводит к exception: таблица master не находится в режиме Edit или Insert.
Заранее спасибо!
Anatoly Podgoretsky (2003-04-01 11:13:00) [1]Shtock © (01.04.03 11:06)
Есть неподтвержденные слухи, что это как правило программисты.
Вот ты например страдаешь излишней конкретностью :-)
Vassiliy (2003-04-01 11:08:00) [2]ADO тут вообще говоря не причем. Работа с вычисляемыми полями на клиенте идет независимо от механизма доступа к БД.
Shtock (2003-04-01 11:06:00) [3]Проверил, вычисляемое. Но ходят слухи, что Builder 5.0 порядочно глючит c ADO. Сам уже не раз убеждался. Недавно очередной глюк отловил.
Vassiliy (2003-04-01 11:03:00) [4]Наиболее вероятная причина ошибки - поле "work_val" не вычисляемое. Проверь еще раз...
Fiend (2003-04-01 10:58:00) [5]То stone:
тока не точка а ->Edit()
Это если просто поправить синтаксис который вы привели
stone (2003-04-01 10:29:00) [6]Не очень занком с синтаксисом Си
Что-то типа этого
> void __fastcall TVTKDataModule::DesignADOTablework_valChange(TField
> *Sender)
> {
CompADOTable.Edit;
> CompADOTableCalcFields(CompADOTable);
> }
Mike Kouzmine (2003-04-01 10:21:00) [7]Еще раз для Васи. Когда начинает выполняться void __fastcall TVTKDataModule::CompADOTableCalcFields(TDataSet *DataSet), то набор данных переводится в режим расчета кальк полей. Это спец режим, в котором возможно изменение только fkCalcField (или как оно там), ты же пытаешься править fkData.
Fiend (2003-04-01 10:21:00) [8]А зачем вы насильно вызываете обработчик вычисления полей?
Выходит у вас таки нету вычисляемых полей в таблице и потому он сам не вызывается!
А раз таких полей нету, значит надо Едит-Поменять-Пост - это внутри обработчика. А вообще конечно неплохо бы разобраться зачем нужны вычисляемые поля!
И в принципе то шо вы в обработчике делаете неплохо бы перенести в OnBeforePost и там преспокойненько сделать задуманное безо всяких Едит-Пост
Shtock (2003-04-01 10:12:00) [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 09:59:00) [10]То Mike Kouzminе:
согласен, это я не подумав ответил. Глянул тексты и в натуре никакого едит поста нету. Наверно он пытается действительно не вычисляемые поля править.
Mike Kouzmine (2003-04-01 09:45:00) [11]Fiend © При вычислении кальк полей НД находиться не в дседит, а в дсКальфильдз, насколько помню, просто так его не выставить. Хотя я могу ошибаться.
Mike Kouzmine (2003-04-01 09:43:00) [12]Естественно. см Johnmen.
Чтобы помочь, необходимо знать какие компоненты используешь для доступа. Если TTable, то берешь еще один экземпляр дет таблицы, вяжешь так же как и первый, на датачендж первой делаешь рефреш второй и в цикле пересчитываешь. Для TQuery та же бодяга
Fiend (2003-04-01 09:41:00) [13]так надо сделать Edit, потом поправить значения выч полей а затем сделать Post, и всё получится
Vassiliy (2003-04-01 09:31:00) [14]Ты бы код свой показал, легче было бы разобраться :)
Johnmen (2003-03-27 09:35:00) [15]Возникновение данного exception говорит о том, что указанное поле НЕ является вычисляемым !
stone (2003-03-27 09:25:00) [16]
> таблица master не находится в режиме Edit или Insert
Ну так установи режим Edit
Sava (2003-03-27 08:35:00) [17]А тригер не пробовал написать?
На изменение, на вставку и на удаление?