Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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 править,что бы обновлять не текущую запись, а любую заданную.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.006 c
1-57670
Lion
2002-04-07 10:02
2002.04.18
печать StringGrid a


1-57683
Roman9
2002-04-07 16:33
2002.04.18
Как запустить из одной программы другую


14-57871
DFG
2002-03-11 21:27
2002.04.18
Кто-то устанавливал Delphi на карманный компьютер?


1-57728
$hiC0
2002-04-08 16:38
2002.04.18
Цвета в TChart


4-57925
eagle7
2002-02-13 10:20
2002.04.18
Как принудительно закрыть программу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский