Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.01.2009, 06:02
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию Значение вычисляемого поля с помощью 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;
Все это в обработчики события "OnCalcField" (Или как правильно называется?.. не важно) Conts_DataSet.

Так же есть вспомогательная табличка, 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;
Все это в теле OnCalcField Главной таблицы.

Конечно такой проверкой сжираю много ресурсов. Обдумываю сейчас другой вариант.
СУТЬ проблемы в том, что когда проглядываю этот алгоритм в отладчике, все работает совершенно правильно. После отработки, в грид выводится по всему столбцу одно и тоже значение опираясь на последнюю запись в главной таблице.

В общем буду рад любому наставлению, совету, нагоняю и т.д. =)
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
Ответить с цитированием
  #2  
Старый 28.01.2009, 11:03
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию

Кажись лишнего нагородил я ...
Попробую лучше просто в основном дата сете использовать Join в SQL коде и все. Зачем лишние объекты городить.. Как-то сразу не подумал.
О результатах отпишусь.
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
Ответить с цитированием
  #3  
Старый 28.01.2009, 19:11
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию

Моя не понимать.
Вот совершенно правильный работающий 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  
Старый 30.01.2009, 05:18
Аватар для XIO
XIO XIO вне форума
Новичок
 
Регистрация: 06.12.2007
Сообщения: 77
Репутация: 32
По умолчанию

Как все просто порой бывает, а мы этого не замечаем.
В Идеале 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

Сам я что-то не догадался так сразу сделать. Спасибо людям, помогли =)
__________________
"Люди никогда не видят то, существование чего им кажется невозможным." ©Терри Пратчетт
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter