Страницы: 1 2 вся ветка
Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Работа с Interbase 


MAxiMum   (2002-03-26 12:29) [0]

У меня, вообще-то, куча вопросов по Interbase. Ответьте, хотя бы на некоторые.
1. Как клиент может послать обновлённые (добавленные) данные?
2. Как сервер может узнать об обновлении?
Пока всё. ПОМОГИТЕ!!!



Ё   (2002-03-26 13:17) [1]

1. В общем случае Table1.Post
2. Он их чуствует :))



MAxiMum   (2002-03-26 13:21) [2]


Ни фига он не чувствует. Даже полное открытие и закрытие он не понимает. Пока клиент не закроется, данные не обновятся.



Ё   (2002-03-26 13:25) [3]

Так не сервер должен узнать, а клиент.
Тогда Table1.Refresh - и применит обновления и перечитает их.
А вообще, самое время тебе почитать какую-нибудь книжку.



Johnmen   (2002-03-26 13:26) [4]

>Даже полное открытие и закрытие ...
Чего ???
>Пока клиент не закроется, данные не обновятся
Это какая-то пурга...

Ты сам-то понимаешь, что хочешь спросить ?



Slava   (2002-03-26 13:29) [5]

> MAxiMum

Commit тебя спасет



Ura   (2002-03-26 13:42) [6]

Ты через что коннектишся к IB?



MAxiMum   (2002-03-26 14:00) [7]


На сервере же тоже прога работает. И там изменения нужны. И другим клиентам не помешают. Повторяю Refresh не перечитает. Попробуй сам, а!?
>Johnmen
Ты сам-то работал или так выпендриваешься? Для одарённых - полное открытие и закрытие базы данных TIBDatabase.
>Ura
В смысле через IB? Это вроде в теме есть. Или это про IBConsole. Тогда нет, своей программой.
>Всем
Книги я читал, но такого там не нашёл. Прошу за ламера меня не считать, Ок? Просто я с Interbase ещё не работал.



Alexandr   (2002-03-26 14:07) [8]

если человек не ламер, а просто не работал с Interbase, то он внимательно прислушивается к тому, что ему говорят, а не спорит.
И тем более не грубит помогающим ему людям.

Вопросы твои говорят о полном незнании основ работы с базами данных и с Interbase в частности.

Так что тебе учиться, учиться и учиться. Не знаю уж какие ты книги читал, но читать надо было про работу с базами данных в Delphi.

Если б ты не дерзил и яснее выражался, то тебе давно бы уж помогли...



Johnmen   (2002-03-26 14:14) [9]

>MAxiMum © : Ну зачем же так возмущаться, или ты такой обидчивый ? Я и не думал, как ты говоришь, "выпендриваться" !

А вообще-то, ты знаком с транзакциями, например ?
И не надо быть таким мнительным - я спрашиваю совершенно спокойно...



MAxiMum   (2002-03-26 14:16) [10]

>Alexandr
А Johnmen культурно ответил.
Остальные извините, погоричился из-за него. Я всегда работал с локальными БД. Знаю концепции реляционных СУБД. Хороший опыт работы с Delphi. Просто я прошу помощи. ПЛЗ!



Ura   (2002-03-26 14:21) [11]

Повторяю вопрос через что доступ?
IBX ADO Express BDE ???



MAxiMum   (2002-03-26 14:22) [12]

>Ura
Нет через компоненты страница Interbase.



Slava   (2002-03-26 14:29) [13]

IBTransaction.Commit



Johnmen   (2002-03-26 14:30) [14]

Это и есть IBX...
Используй IBDatabase, IBTransaction - это обязательно,
остальное - по вкусу...



Ura   (2002-03-26 14:31) [15]

Тогда попробуй сделать явно Commit для транзакции к которой привязана таблица...



alexandervasjuk   (2002-03-26 14:37) [16]

CommitRetail рекомендую для IBX
Для BDE в BDE Administrator поройся в настройках своего Alias"а



Alexandr   (2002-03-26 14:38) [17]

2All:для тех, кто не понял- он через IBX работает.

2MAxiMum: В поставке Дельфи есть пример по работе с IBX посмотри (называется что -то вроде MastAppIB)



MAxiMum   (2002-03-26 16:44) [18]

Я работаю без BDE. После явного IBTransaction.Commit всё закрывается (IBDatabase, IBTransaction, все IBTable и IBQuery). Приходится всё переоткрывать.
Порекоммендуйте, как:
1) это можно обойти (переоткрытие);
2) как делать Commit: кнопкой, на OnPost или по таймеру.
3) сервер узнает об изменениях;
4) организовать на клиенте обзор базы (я думаю запрос к серверу, чтобы он выдавал информацию о паках и файлах своего компьютера, но это гемморно).
>Johnmen
С транзакциями я знаком.



Johnmen   (2002-03-26 16:56) [19]

-CommitRetaining,RollbackRetaining
-кнопкой
-так все изменения и делает только сервер !



MAxiMum   (2002-03-26 20:21) [20]

А как насчёт вопроса №3(обновления не появятся на сервере) и вопроса №4(подскажите насчёт этого).



MAxiMum   (2002-03-27 14:09) [21]

Повторю, кто не слышал. Как сервер или клиент может узнать об изменениях в БД на сервере. Подскажите, плз.



Fay   (2002-03-27 14:15) [22]

POST_EVENT вроде



MAxiMum   (2002-03-27 14:21) [23]

Т.е. нужно добавить Event"ы везде и потом ловить на TIBEvents?



dymka   (2002-03-27 17:31) [24]

Вообще принципы клиент-серверного программирования не допускают автоматического узнавания другими клиентами изменения в базе, а сделано это для минимизации сетевого траффика, т.к. база сетевая... В айби можно создать событие - тока будь осторожен, стандартный TIBEvent немного глюкует... Но, если ты скажем на триггер будешь генерировать событие, а на клиентах перечитывать данные по нему, то ты здорово напряжешь свой сервак и сеть...
Если уж очень такое надо, то перечитывай базу скажем после 10 евентов... или подбери число экспериментально...
Далее... Если использовать IBX, то при Commit все наборы данных в текущее сессии закроются... Выход первый - сразу открыть все и восстановить букмарки, которые ты предварительно сделал...
Второе - воспользоваться компонентами FIBPlus, где есть поддержка CommitRetaining и что еще приятно после BDE, CommitOnPost...



MAxiMum   (2002-03-27 17:54) [25]

Надо, чтобы изменения были видны сразу.
Кстати, CommitRetaining есть и у IBTransaction.
Ну, а с трафиком ничего не поделаешь. Неохота, тяжело, но придётся ещё везде и Event"ы ставить. Эх!
А на сервере, интересно, как может получиться. Если он сам изменил, генерируется событие и он обновляет то, что сам и исправил. Я думаю это не порядок. Подскажите, как обойти это!



dymka   (2002-03-27 17:59) [26]

Не понял сути вопроса в следущем месте:

Если он сам изменил, генерируется событие и он обновляет то, что сам и исправил.

Бррр... Как сам изменил??? Как обновляет??? Что исправил???



MAxiMum   (2002-03-27 18:52) [27]

Если программа изменяет что-то в БД. То, если использовать события, обновится сама база везде, даже на той машине, где и произошли изменения. А это не нужно.



dymka   (2002-03-28 07:17) [28]

БАЗА НЕ ВЕЗДЕ! Она только в одном месте, именуемом сервером...
Чтобы я мог хорошо понимать вопрос нужно задавать их, используя по возможности "правильную" терминологию...
На клиенте это локальная копия данных... Когда ты подключаешься к серверу и открываешь набор, то стартует транзакция и часть данных копируется тебе в память, с которой и работает клиент.
Ничего страшного нет, если ты обновишь локальные данные...
Вот интересно - насколько часты обновления у тебя? Если база многопользовательская и обновления идут каждую секунду, то работа станет невозможной, всвязи с частыми обновлениями...
Это не так быстро - переоткрыть набор...



GrayMage   (2002-03-28 07:34) [29]

Хорошо dymka, а выход где? Да я, например, сузил диапазон обрабатываемый Query. И мне необходимо видеть все изменения которые делает пользователь (база складского учета, выписка накладных, в накладную вбивается позиция - сумма изменяется - требуется обновление; меняется признак накладной - требуется обновление; и т.д.). И как это сделать без большого трафика?

To MAxiMum:
> даже на той машине, где и произошли изменения. А это не
> нужно.

Интересно, а как эта машина узнает что IB принял эти изменения? Commit он такой ... Конечно этот вопрос справедлив если ты используешь для отображения Query.



dymka   (2002-03-28 07:38) [30]

2 GrayMage:
Насколько часто тебе нужно видеть эти изменения??? Или ты хочешь чтобы лампочка загоралась, если пользователь что-нибудь сменил???
Обоснуй частое обновление, ведь можно обновлять локальные данные при новом запросе. Т.е. нужно узнать - нажал на кнопку... а автоматически то зачем... не спорю - такие ситуации возникают, только нужно хорошее обоснование...



GrayMage   (2002-03-28 07:56) [31]

2 dymka:
Обоснование: выписывание накладных при отпуске товара.
Отдел 1: на 4 - 8 компах выписывают эти накладные - в реальном времени меняются остатки - количество позиций небольшое, порядка 15 000 - 20 000 (при запросе сужаю диапазон переноса остатков до текущей группы).
Отдел 2: Менеджер склада (обязанности: своевременная доработка, контроль и отсылка данных накладных на удаленный склад, исправления накладных и т.д.)
Отдел 3: Бухгалтерия, касса.
Отдел 4: Контрольно-ревизионный отдел.

Ну и самое дурацкое, то что пользователи привыкли видеть все (только не говори что они должны отвыкнуть, я уже на этом язык сломал)



dymka   (2002-03-28 08:46) [32]

Захотять увидеть новое - пусть нажмут кнопку обновить, где и переоткроешь все наборы данных...
Или вешай события на триггеры, раз уж очень важно следить за изменениями...



MAxiMum   (2002-03-28 08:46) [33]

2dymka
Да, обновления нужно видеть сразу. Этого требует моя совесть и это - требования постановщика и заказчика. Это и правильно.
Почему ты подумал, что я буду обновлять данные.
Хорошо, поясню подробнее, клиент меняет запись. Тогда на всех клиентах и сервере данных должны переоткрываться. Это я решил организовать с помощью триггеров и событий. Но я не хочу, чтобы и клиент, сделавший изменения, перечитывал данные.
2GrayMage
Машина узнаёт об изменениях с помощью триггеров и событий.



GrayMage   (2002-03-28 09:34) [34]

Да знаю я о триггерах и событиях, знаю. И делаю события по максимуму отсекая ненужные для обновления. Но трафик то при этом не снижается! Представь 4-8 компов выписывающих накладные, добавляем позицию - изменяются остатки + изменилась сумма накладной - и представь себе трафик!

Ладно это ерунда - сузим Query до минимума.

Вопрос вот в чем: как обычная BDE работает с таблицами, скажем DBase? Где-то кто-то писал, что она тоже строит Query и каждый раз ее перечитывает? Если это так, то остается одна проблема - как сделать по нормальному так, чтобы у пользователя при изменениях в окне (активном, неактивном) все приложение на некоторое время не подвисало.



Alexandr   (2002-03-28 09:35) [35]

если действительно данные у клиентов на экране должны быть постоянно актуальными, тогда

1) Это сделать сложно для разработчика
2) Это не надо в 99% случаев, даже когда сначала кажется, что именно так надо.
3) Это ресурсоемко
4) нужно использовать свой механизм получения информации об изменениях, а не events от Interbase, только тогда можно получить приемлимое качество работы. Реализация этого не такая простая, но без него как правило ничего путнего не получится.
5) BDE не умеет обновлять одну запись в dataset, поэтому нужно использовать IBX, FIBplus, IBO
6) Практически ни одна программа, работающая с базами данных такое не позволяет делать, а если и позволяет, то этим мало кто пользуется из-за тормозов и прочих ограничений.
7) Идеальный вариант-обновление по нажатию на кнопку в программе.



GrayMage   (2002-03-28 09:52) [36]

2 Alexandr:

> BDE не умеет обновлять одну запись в dataset, поэтому нужно
> использовать IBX, FIBplus, IBO

То же самое, но по медленнее - как с помощью IBX, FIBplus обновить только одну запись?



dymka   (2002-03-28 09:54) [37]

Alexandr, браво!
Есть еще вариант - посылать UDP Broadcast всем клиентам, а там при получении сообщений переокрывать набор...
Но я просто представляю ситуация, когда с сервера приходит событие или по сети броадкаст, моя машина вдруг начинает жужжать, клиент подвисает на время... все исчезает, а потом опять появляется, или мигает, или ни с чего курсор становится SQL...
Если нужно делать обновления, то думаю нужно полностью сменить архитектуру системы...
А если кто-то редактирует данные, которые редактируешь ты?
у тебя бац и все на глазах сменится... не... клиент-сервер не для этого создавался... а если условия поменяются работы и нужно будет пару компов поставить на линию DSL??? или еще хуже на модем...



Alexandr   (2002-03-28 10:06) [38]

2Graymage: Задай RefreshSQL для обновления одной записи и обновляй текущую запись командой refresh.
2dymka: вот вот. Тута думать сильно надо.



GrayMage   (2002-03-28 10:10) [39]

2 Alexandr
При чем тут текущая запись? А если запись не текущая то что?



Alexandr   (2002-03-28 10:12) [40]

тогда надо исходники в FIBplus или IBX править,что бы обновлять не текущую запись, а любую заданную.



GrayMage   (2002-03-28 10:18) [41]

Когда-то тему обновления поднимали, как я помню ниче путного предложить никто не смог. Думал с появлением 6 Delphi что-то изменилось. А так, единственная правильная мысль в Реальном времени обновлять только самые необходимые данные, остальные только по таймеру совместно с совокупностью 5 - n эвентов или по кнопке.



Alexandr   (2002-03-28 10:27) [42]

да ничего тут не может измениться.

Такова природа вещей



kalex77   (2002-03-28 10:46) [43]

А если использовать сервер приложений?
Пусть работа с БД идет через него, а он при минимальной функциональности оповещает клиента об обновлениях.

Кроме нужно подбирать уровень изоляции под свою задачу.



Mad_Vad   (2002-03-28 10:51) [44]

Ну чего спорить то?

ib.demo.ru

Там Вы найдете все ответы на интересующие Вас вопросы по Interbase/Firebird.



Fareader   (2002-03-28 11:17) [45]

на Ib.demo.ru был предложен вариант обновления данных на клиентах, без использование событий IB, с помощью дополнительной таблицы, в общем то нелохое решение. А у меня по таймеру обновляются данные на клиентах через каждые 5 минут и нормально, а чтобы не переоткрылось пока чего-то редактируется - выбрасываем флаг и таймер не переоткрывает dataset пока он в редакции, можно это углубить и расширить, но это дело вкуса. вы проблему раздули из ничего я полностью согласен с Alexandr`ом:
"Это не надо в 99% случаев, даже когда сначала кажется, что именно так надо". человек все равно не сможет обработать данные, которые будут ему предлагаться каждую секунду.



Alexandr   (2002-03-28 11:21) [46]

на fibplus.com.ua такая статья

а в остальном согласен



Vladimir_Shk   (2002-03-28 12:06) [47]

Вообще я так думаю, данная проблема решается через использование ADO и ServerCursor - Dynamic. Тогда на каждой машине данные будут актуальными. Хотя сами они конечно не перерисовываются, а обновляются при Dataset.Refresh или просто пролистывании содержимого экрана.



MAxiMum   (2002-03-28 13:14) [48]

Ну что касается лично меня, то у меня клиентов может и не быть вовсе, а может и 3-4 максимум. Реально - 1-2. Думаю, если переоткрывать всё при обновлении, ничего с ними не случится.
Другое дело, что действительно, переоткрытие может быть плохим помощником, когда пользователь редактирует данные.
Кстати, я придумал, как можно обновлять данные только на всех клиентах, кроме того, кто сделал изменения: послыать сообщение типа: POST_TABLENAME_COMPNAME. Тогда по имени я смогу определить тип события, имя таблицы и имя компьютера.
А зачем нужно BDE? Я лично без него работаю. Связь без алиасов через IBDatabase.



GrayMage   (2002-03-28 14:04) [49]

Я не говорил что нужно BDE. Я говорю про то, что BDE таскает по сети всю базу, и при обновлении скажем одной строки, как, повторюсь я где-то слышал, BDE должна обновлять тот же самый набор перечитыванием всей базы. И делает она это сравнительно быстро. То есть, теоретически, при клиент-серверном подходе, скорость даже при обновлении не должна падать если грамотно подойти к организации эвентов, Query, и использованию многопоточности.



MAxiMum   (2002-03-28 14:10) [50]

Конечно, в большом приложении, да, нужно грамотно подходить к организации событий. Но когда клиент - один-два человека. Я считаю это ненужным. Просто обновление после редактирования.




Страницы: 1 2 вся ветка
Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.84 MB
Время: 0.033 c
1-57812           Di_wind               2002-04-06 18:38  2002.04.18  
Калькулятор.


14-57850          drpass                2002-03-08 16:37  2002.04.18  
Вся наша жизнь - дерьмо


14-57880          VuDZ                  2002-03-12 05:59  2002.04.18  
Задачка ::>


1-57788           Kostia                2002-04-06 12:51  2002.04.18  
Как запустить *.exe на сетевой машине?


1-57781           UDS                   2002-04-06 00:37  2002.04.18  
Как двигать объект стрелками клавиатуры?