|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Добрый день, всем! Проблема у меня следующая. Я к сожалению, ни разу нормально не работал с сетевой версией. Дело в том, что нужно (сделать) построить сетевую версию. Есть такой вариант - работа с курсорами - т.е. один человек выхватывает запись и редактирует (выхватывание происходит на уровне) курсора, но как потом происходит возвращение в общую базу данных данной записи. А если другой способ работы: редактировать запись , а другой человек может параллельно работать с другой записью....но как так лучше сделать - я не пробовал. Про первый способ - я делал, но мне кажется как -то происходит все кривовато - у меня так по крайней мере получалось. Быть может дадите какой -нибудь самый простой примерчик, как Вы реализуете данный способ организации данных (орган. сетевой версии). Большое спасибо. помогите пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 12:18 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
В частности, интересует такой момент - хотя бы на покажите пример на такой простой ситуации. На форме есть грид и с фио, и мы допустим редактируем фио - людей (записи , поля) и вот один человек править человека "А", второй одновременно человека "B" и чтобы они друг другу не мешали. Конфликтов не было при совместной работе с записями. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 12:39 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Вы определитесь что значит сетевая версия? Для начало что есть для вас база данных и где будут храниться данные, как только определитесь, то вот именно под эту платформу и будете писать программу. Если же вы планипруете использовать DBF и/или DBC, то тут свои правила есть. У вас пока что как я понял, нет чёткого понимаю, что вы делаете и зачем ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 15:20 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
AngelOKES, я буду использовать dbc - т.е. фоксовое субд. База будет лежать на сетевом диске. Обращаться все (пользователи) будут по сети ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 15:26 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Ну тогда открываешь все таблице в режиме shared, а там блокировки и протоколирование. Тут не всё так просто... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 15:29 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
2dima_18, Читать: 1. свойство DataSession объекта Form 2. функция CURSORSETPROP 3. функция TABLEUPDATE статью buffering data в букваре если коротко, то на форме ставишь приватную сессию данных, в методе лоад, открываешь нужные таблици и устанавливаешь через CURSORSETPROP тип буферизации для таблиц. В результате каждая форма будет иметь отдельное независимое окружение данных. Плюс при обновлении таблиц будет использоваться буферизация. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 15:34 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Большое спасибо, Grin, AngelOKES! Подскажите, тогда вот что, пожалуйста. Какие статьи и книги посоветуйте. Последний вопрос касается ответа, Grin! И еще....быть может есть у кого какие -нибудь простенькие примеры?! или адреса в интернет, где и что посмотреть. Пришлите, пожалуйста что -нибудь по этому вопросу! Спасибо большое! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 21:29 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Извините, еще за беспокойство. Можно я пришлю (приложу) проект - я все убрал, очень примитивный, чтобы только прочувствовать как будет выглядеть (работать) блокировка. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 21:57 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Я к сожалению не очень понял по статьям ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2017, 21:58 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Можно использовать фоксовые блокировки или даже транзакции, я лично использую самописные блокировки. Как бы это на пальцах объяснить. Есть основная таблица, у всех клиентах она открывается в режиме Shared У каждого есть свой изменяемый курсор, привязанный например к объекту Grid. При разработке БД добавляй как минимум 3 поля дополнительно, поле блок (код оператора), дату последнего изменения (это как вариант проверки и протоколирования) и универсальный код записи (алгоритмы сам ищи, вариантов масса). И вот как это примерно можно организовать, встал оператор на любую запись и блокирует её своим кодом (если запись не была заблокирована другим оператором) и меняешь данные, изменил, вышел из строки, передал с таблицу. Встал на новую запись, считал актуальные данные, считал блокировки, ну и так далее. Тут для тебя самое главное расписать алгоритм работы, вариантов масса, я лишь представил один из возможных. Как лично ты организуешь, решать тебе, но повторюсь, тут уже намного сложнее решать такие задачи (но возможно). И если это возможно переходи на нормальные СУБД (если использовать сеть) такие как MySQL, SQL Server, Oracle. С ними работать намного интереснее и надёжнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 06:39 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Доброе утро, AngelOKES! Большое спасибо за ответ последний. Разрешите, я тогда опишу как я это делаю (начал делать по статье): в настройках ставлю: SET MULTILOCKS ON Есть у меня formset. В нем есть форм1 и форм2. На форме 1 есть грид - в котором только фио. На load formset я навешиваю (путь я специально для себя руками прописал - конечно - я буду по другому писать - т.е. не привязываясь к пути ): Public newdata,newdata1,f3,dpath08 OPEN DATABASE 'baza_1.dbc' SHARED dpath08 = 'p:\Baza\Basedata\' f3 = 'p:\Baza\Report\' IF !USED('fio_t2') USE dpath08+'fio_t' ALIAS fio_t2 IN 0 SHARED ENDIF SELECT fio_t2 SET ORDER TO TAG id GO TOP CURSORSETPROP('Buffering',4,'fio_t2') На form1 есть грид: Операция добавления у меня следующая: на form1 есть кнопка добавить -> открывается форма два и там след. код добавления: public f1_1,ot1_1,na1,na1_1,str1 SELECT fio_t2 DO CASE CASE pnom =1 r_zapros = FLOCK() IF r_zapros insert into fio_t2(fio); values (thisformset.form2.text1.value) flush ENDIF UNLOCK ALL CASE pnom =2 SELECT fio_t2 Replace fio_t2 WITH thisformset.form2.text1.value CASE pnom = 3 select fio_t2 name_znach1 = (fio_t2.fio) podtvergdenie = MESSAGEBOX('Âû óâåðåíû â òîì, ÷òî õîòèòå äàòó ïîñåþåùíèÿ ó "&xf" îò "&name_znach1" !.', 36, "Óäàëåíèå") *Ñîîáùåíèå âû äåéñòâèòåëüíî õîòèòå óäàëèòü äàííóþ çàïèñü(Âîçâðàùåíèå íà ok) IF podtvergdenie = 6 DELETE ENDIF ENDCASE ThisFormset.Form1.GridPerson.SetFocus() ThisFormSet.Form2.AlwaysOnTop = .F. ThisFormSet.Form1.Enabled = .T. ThisFormSet.Form2.Enabled = .F. ThisFormSet.Form2.Visible = .F. *thisformset.form1.GridObsled.Refresh *thisformset.form1.GridObsled.SetFocus *thisformset.form1.GridPerson.Refresh *thisformset.form1.GridPerson.SetFocus ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 07:47 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Посмотрите, пожалуйста, как я делаю.....может что подправите. Очень прошу помочь. По поводу других субд: согласен, это намного лучше. Но тут программа уже была рабочая, но не сетевая и поэтому надо как знаете, всегда, как можно быстрее - т.е. уже вчера и быстро. Спасибо большое. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 07:50 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Я тебе так скажу быстро в любом случае не получится и то что по сути придётся писать новую программу прими как факт, либо использовать параллельно две программы, старую и новую (в ней как раз делаешь то что нужно делать по сети). С твоим уровнем я думаю это будет очень сложно сделать: 1) сократи или полностью откажись от использования глобальных переменных. 2) При отображении данных перечитывай данные из оригинальной dbf. 3) При перемещении используй блокировки на уровне записи свои или встроенные И самое главное распиши алгоритм на бумаге, как ты это видишь, что конретно тебе нужно, если это всего одна маленькая табличка, то всё можно сделать проще, если же это целая база данных, то просто уже не получится и нужно всё сразу делать по уму, чтобы потом не переделывать, для этого надо чтобы в голове у тебя был точный план действий, как это запрограммировать будешь думать потом. Тут тебе никто не даст готовый ответ в 2 строчки, твой проект "псевдосетевой" очень гемморойный и просто так за день-два его не решить. Потом когда будет полный алгоритм раздели его не подзадачи и постепенно решай их ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 08:20 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Да и кстати необязательно писать всегда SHARED, достаточно в начале программы задать установку SET EXCLUSIVE OFF И тогда все таблицы будут открываться по умолчанию в режиме SHARED И вот эту установку SET MULTILOCKS ON тоже один раз задать в самом начале проекта ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 08:28 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
AngelOKES, спасибо большое за ответ! Я сразу вот что спрошу. Про последнюю установку SET MULTILOCKS ON - я сделал сразу и только один раз. Я вот что не понимаю: Вы видите, как я добавляю запись, используя insert и саму таблицу - alias я прописал. Я не понимаю следующее: я работаю с таблицей или курсором при сетевой версии? TableUpdate или TableRevert где в моем случае писать (кусок данный)?! Спасибо большое ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 08:41 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Я таким методом не пользуюсь, поэтому ничего сказать не могу, у меня был проект где всё реализовал сам по своим алгоритмам, у каждого клиента была открыта копии таблицы, но вот перенос в неё я делал сам, как и блокировки и всё остальное. Может быть тут кто-нибудь подскажет по твоему выбранному методу (это не означает что твой метод хуже или лучше, просто лишь один из вариантов реализации) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 08:47 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
AngelOKES, понятно. Большое спасибо все равно за большую помощь. Буду далее думать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 08:49 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Я что-то написал, но выполняется конечно. Но как-то странно - я одновременно добавляю в открытой программе, запущенной два раза . Одни с сетевого диска, другой со своего диска и в одном месте добавляю, в другом месте в гриде отображается но после перехода на другую запись - т.е. во время не изменяется. Я правда выбросил строку: cursorsetprop(buffering, 5) Я ее не понял. И нет у меня команды: TableUpdate() Я не понимаю в какое место ее записать ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 10:01 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 11:15 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18, Хелп VFP9 Полезніе статьи (обязательно читать Максимова, советы начинающим) ну и в целом на форуме foxclub громадное количество знаний и решений ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 13:34 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18Но как-то странно - я одновременно добавляю в открытой программе, запущенной два раза . Одни с сетевого диска, другой со своего диска и в одном месте добавляю, в другом месте в гриде отображается но после перехода на другую запись - т.е. во время не изменяется.А ожидали что-то другое? На каком основании? Вы собрались редактировать данные в таблице или на всех экранах, показывающих эту таблицу? И все должны видеть весть процесс редактирования? Я правда выбросил строку: cursorsetprop(buffering, 5)Ну и зря. Я ее не понял.Оно и видно.И нет у меня команды: TableUpdate()Ибо она бессмысленна при выкидывании непонятой команды. Я не понимаю в какое место ее записатьВ то, в котором таки надо сохранить данные в таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2017, 19:58 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Спасибо большое, всем за помощь и подсказки! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2017, 12:42 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
2dima_18, Есть разные подходы при работе в сети cursorsetprop(buffering, ...) - нужен, для того чтобы определить как изменения будут попадать в таблицу почитай в букваре статьи по optimistic buffering \ pessimistic data buffering С помощью буферизации, вы можете легко находить и разрешать конфликты в операциях обновления данных: текущая запись копируется в память или на диск, обслуживаемые Visual FoxPro. Другие пользователи могут одновременно с вами обращаться к оригинальной, неизменной еще записи. Когда вы уходите с записи или пытаетесь обновить данные программно, Visual FoxPro попытается заблокировать запись, проверяет: нет лит изменений, сделанных другим пользователем во время вашего редактирования этой записи и затем записывает ее на диск. После того, как вы попытаетесь обновить данные, вы должны быть готовы разрешать возможные конфликты, что предовратит запись некорректных изменений в оригинальную запись таблцы TableUpdate() - сбрасывает данные из буфера в таблицу + возвращает статус выполнения сброса анализируя результат TableUpdate - определяете успех операции сохранения что-то типа Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2017, 13:32 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Grin, большое спасибо за ответ! Остается следующий вопрос у меня по cursorsetprop(buffering, ...) я поставил установку: SET MULTILOCKS ON и у меня cursorsetprop(buffering, ...) - выдает ошибку - ругается на это и еще: я, как понимаю, могу использовать операцию сброса: FLUSH - это не эквивалент операции: TABLEUPDATE ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2017, 14:12 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
Когда я выставляю однозначно в настройках: SET MULTILOCKS ON и выставляю cursorsetprop(buffering, 5,'fio_t2') у меня выдается ошибка: Table or row buffering requires that set multilocks is set to on что я не так делаю...... подскажите пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2017, 14:25 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
2dima_18, ошибка однозначно говорит, что SET MULTILOCKS не установлен SET MULTILOCKS ON должен ставиться в каждой сессии данных тоесть если у тебя несколько форм с приватной сессией, то в каждой форме должна быть установка MULTILOCKS ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2017, 16:47 |
|
Проблема с организацией сетевой версией
|
|||
---|---|---|---|
#18+
dima_18Grin, большое спасибо за ответ! Остается следующий вопрос у меня по cursorsetprop(buffering, ...) я поставил установку: SET MULTILOCKS ON и у меня cursorsetprop(buffering, ...) - выдает ошибку - ругается на это и еще: я, как понимаю, могу использовать операцию сброса: FLUSH - это не эквивалент операции: TABLEUPDATE ? FLUSH - команда принудительно записывает данные на жёсткий диск и вам в данном проекте маловероятно, что понадобиться. TABLEUPDATE - передаёт данные в вашу базу данных из буфера и как бы должна их записать, она вам как раз и нужна, но необходимо почитать более внимательно как ей пользоваться ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2017, 07:13 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1581849]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 279ms |
total: | 410ms |
0 / 0 |