|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Значение вычисляемого поля с помощью ADOQuery
Всем доброго времени суток.
Что-то застрял на одной задачке простенькой, 2 вечера просидел с ней, так и не понял в чем я неправ. Может кто подскажет? Есть Таблица Conts. В ней по сути контакты различных лиц. в качестве ID использую поле по имене Kod (старая история..). Реализация в дельфи: ADOConnection -> DataSource -> ADODataSet В ADODataSet есть вычисляемые поля. Два из этих полей, работают отлично. Первое по датам вычисляется, второе примерно так: Код:
If Not DataSet.FieldByName('Foto').IsNull then DataSet.FieldByName('FotoInk').AsInteger := 3 else DataSet.FieldByName('FotoInk').AsInteger := 0; Так же есть вспомогательная табличка, Alarms_DataSet. Напоминания для каждого лица главной таблицы. Так вот задача сводится к тому что бы в Гриде вывести картинку в вычисляемой колонке у тех лиц, у которых есть хотя бы одно напоминание. Сделал ADOQuery. SQL: Код:
Select Count(*) as Cnt From CONTS_ALARMS where Cont_ID = :Cont_ID DataSource для запроса выбрал именно Alarms Далее в событии "OnCalcField" основной таблицы присваиваю к параметру ":Cont_ID" значение Kod из главной таблици. Открываю Запрос. Делаю проверку: Код:
Query.Parametrs.ParamByName('Cont_ID').Value := DataSet.FieldByName('Kod').Value; Query.Open; If Query.FieldByName('Cnt').AsInteger > 0 then DataSet.FieldByName('AlarInk').AsInteger := 4 else DataSet.FieldByName('AlarInk').AsInteger := 0; Query.Close; Конечно такой проверкой сжираю много ресурсов. Обдумываю сейчас другой вариант. СУТЬ проблемы в том, что когда проглядываю этот алгоритм в отладчике, все работает совершенно правильно. После отработки, в грид выводится по всему столбцу одно и тоже значение опираясь на последнюю запись в главной таблице. В общем буду рад любому наставлению, совету, нагоняю и т.д. =) "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |
#2
|
||||
|
||||
Кажись лишнего нагородил я ...
Попробую лучше просто в основном дата сете использовать Join в SQL коде и все. Зачем лишние объекты городить.. Как-то сразу не подумал. О результатах отпишусь. "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |
#3
|
||||
|
||||
Моя не понимать.
Вот совершенно правильный работающий SQL запрос: Код:
Select *, AlarInk = (Select Count(*) from CONTS_REMEMBER Alar where Con.Kod = Alar.Cont_ID), DosInk = (Select Count(*) from CONTS_DOSYE Dos where Con.Kod = Dos.Cont_ID) From Conts Con В MS SQL отрабатывает на ура. Дает нужный результ. Когда помещаю его в TDataSet, он мне придумывает чо AlarInk это параметры. Бог бы с ними... Так если задать этим параметрам свойста: Direction = pdOutput запрос не выполняется. Дата Сет перестает работать. В других случаях значения параметров получить не удается. Получаются левые значения... Когда добавляю в ДатаСети ещё два поля, автоматом они обзываются как Expr1000 и Expr1001 то и их значения равны непонятно чему... уффф.. Скажите пожалуйста, что я неправильно делаю?? Как уже добить эту фичу? "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |
#4
|
||||
|
||||
Как все просто порой бывает, а мы этого не замечаем.
В Идеале SQL должен выглядить так: Код:
Select *, (Select Count(*) from CONTS_REMEMBER Alar where Con.Kod = Alar.Cont_ID) as AlarInk, (Select Count(*) from CONTS_DOSYE Dos where Con.Kod = Dos.Cont_ID) as DosInk From Conts Con Сам я что-то не догадался так сразу сделать. Спасибо людям, помогли =) "Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт |