![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уведомление о полученном сообщении [D7, XP]
uno © (2007-12-05 08:24:00)Привет всем! Помогите пожалуйста! Я писал модуль сообщений, его прицип в том что: ползователь A отсылает сообщение пользователю B,
это сообщение записываеться в Базу данных, а пользователю B приходит широкополосное сообщение по локальной сети, о том что пришло сообщение, и позже письмо уже извлекаеться из Б.Д. , как прописать это широкополоссное уведомление?
Sergey13 (2007-12-05 10:04:00) [1]> [7] uno © (05.12.07 09:38)
+ к [11] Sergey13 © (05.12.07 09:53)
> ParamByName('MESSAGE_SAND_DATE').AsString := TimeToStr(Time) ;// дата отправки сообщения
Работать с датой/временем надо как с датой/временем, а не как со строкой. Иначе неизбежно нарвешься на какой нибудь 25-й месяц.
Sergey13 (2007-12-05 09:53:00) [2]> [7] uno © (05.12.07 09:38)
> если не трудно то покскажите в чем заклю чаеться странность
> SQL.Add('insert into MESSAGE_EXT( MESSAGE_ID, MESSAGE_SENDER,MESSAGE_SAND_DATE, MESSAGE_SUBJECT)values (gen_id(MESSAGES_GEN,
> 1), :MESSAGE_SENDER, :MESSAGE_SAND_DATE)');// в таблице > MESSAGE_EXT заносятья данные:ID сообщения, отправитель, дата отправки
> DataModule1.IBQShared.ParamByName('MESSAGE_ID').AsInteger := MESSAGE_ID;|| ID сообщения генерируеться
> DataModule1.IBQShared.ParamByNam('MESSAGE_SENDER').AsString := USER_ID;// прописанно в тригере таблицы, MESSAGE_SENDER есть USER_ID
> DataModule1.IBQShared.ParamByName('MESSAGE_SAND_DATE').AsString := TimeToStr(Time);// дата отправки сообщения
Ты
1. В 4 указанных поля пишешь 3 значения.
2. Присваиваешь значения параметрам, которых нет в запросе
3. Присваиваешь в клиенте значения, которые логичнее было бы присваивать на сервере.
4. НЕ присваиваешь единственное значение, которое реально знать только в клиенте (адресата)
5. Не даешь команды на выполнение составленного запроса.
> SQL.Add('insert into MSGBODIES(MESSAGEBODY_ID, MESSAGE_TEXT)
> values (gen_id(MSGBODIES_GEN, 1), :MESSAGE_TEXT)');// запись
> тела сообщения в таблицу MSGBODIES
Ты
1. добавил к тексту запроса вторую строку. Теперь там две строки - старая и новая.
2. не пишешь идентификатор родительской таблицы. У тебя его похоже просто нет. Непонятен вообще смысл таблицы MSGBODIES. Модет быть несколько сообщений в один момент времени? Сомневаюсь.
Kolan (2007-12-05 09:53:00) [3]> Вот мне, как пользователю, первая часть твоего предложения
> глубоко фиолетова
Ну это я придумал для ускорения работы. Можно всегда делать
SELECT COUNT(*) FORM
WHERE
ЗЫ
Это мой вариант решения, который пришел в голову. Подобную задачу не решал.
Плохиш (2007-12-05 09:51:00) [4]
> Если с прощлого раза кол-во изменилась, то узнаешь изменилось
> ли кол-во для конкретного пользователя
Прикольно, предлагаешь делать двойную работу. Вот мне, как пользователю, первая часть твоего предложения глубоко фиолетова...
Kolan (2007-12-05 09:46:00) [5]Сканировать стаблицу через интервылы времени оч простое решение, можно начать с него.
Ты можешь делатьSELECT COUNT(*) FORM.
Если с прощлого раза кол-во изменилась, то узнаешь изменилось ли кол-во для конкретного пользователя
SELECT COUNT(*) FORM
WHERE
Если изменилось, то делать селект записей.
Ессно это плохо нагрузкой на сеть, но это просто, имхо.
uno (2007-12-05 09:38:00) [6]Проверить не было возможности так как он еще не дописан, восможно есть ошибки, но так как я еще только начинающий я их не вижу, если не трудно то покскажите в чем заклю чаеться странность
uno (2007-12-05 09:38:00) [7]Да имеено так
Kolan (2007-12-05 09:36:00) [8]Я понял, он хочет чтобы один человек что-то записал в БД, а другой об этом тут же узнал, так?
Sergey13 (2007-12-05 09:32:00) [9]> [4] uno © (05.12.07 09:26)
Странный код (мягко сказать). Только не говори мне, что он работает.
uno (2007-12-05 09:26:00) [10]Я создал процедуру при нажатии кнопки отправить
procedure TMessagesForm.btnSend1Click(Sender: TObject);
begin
with DataModule1.IBQShared do begin
SQL.Clear;
SQL.Add('insert into MESSAGE_EXT( MESSAGE_ID, MESSAGE_SENDER, MESSAGE_SAND_DATE, MESSAGE_SUBJECT)values (gen_id(MESSAGES_GEN, 1), :MESSAGE_SENDER, :MESSAGE_SAND_DATE)');// в таблице MESSAGE_EXT заносятья данные:ID сообщения, отправитель, дата отправки
DataModule1.IBQShared.ParamByName('MESSAGE_ID').AsInteger := MESSAGE_ID;|| ID сообщения генерируеться
DataModule1.IBQShared.ParamByNam('MESSAGE_SENDER').AsString := USER_ID;// прописанно в тригере таблицы,MESSAGE_SENDER есть USER_ID
DataModule1.IBQShared.ParamByName('MESSAGE_SAND_DATE').AsString := TimeToStr(Time);// дата отправки сообщения
SQL.Add('insert into MSGBODIES(MESSAGEBODY_ID, MESSAGE_TEXT)values (gen_id(MSGBODIES_GEN, 1), :MESSAGE_TEXT)');// запись тела сообщения в таблицу MSGBODIES
DataModule1.IBQShared.ParamByName('MESSAGE_TEXT').AsBlob := redtSender1.Text;// вставка текста сообщения в поле
Далее пользавателю приходит уведамление что полученни сообщение и уже после идет извлеченипе из таблицы и прочтение его, как извлеч я знаю, а прописать отправку уведомления я не могу( из-за недостатка опыта и знаний наверно)
Sergey13 (2007-12-05 09:23:00) [11]> [0] uno © (05.12.07 08:24)
Как вариант - пользователь B может и сам сканировать свой ящик например по таймеру.
Kolan (2007-12-05 09:10:00) [12]Непонятно что такое «широкополосное сообщение». Если это широковещательное сообщение, то нах оно надо если посылается 1 пользователю.
pavel_guzhanov (2007-12-05 08:47:00) [13]Напиши подробнее, что использовал для расылки сообщений, какая БД, и структуру программы.
В общем это представляется так: В базе должен быть триггер на вставку данных, триггер дает сообщение программе, а программа уже отсылает сообщение по сети и отправляет письмо. Программа вероятнее всего должна быть на сервере.