powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Зависание программы по команде replace
24 сообщений из 24, страница 1 из 1
Зависание программы по команде replace
    #38488052
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Два пользователя подключаются к базе данных. Первый открывает справочник товара, заходит на корректировку строки, в каком-нибудь поле textbox начинает вводить информацию. Второй пользователь в это время пытается зайти в этот же справочник товара, но программа подвисает на команде: repl all pr_v&v with 0 на init формы. Пока первый не закончит ввод в textbox, у второго все висит.
Подобное происходит в разных местах программы, где есть аналогичная ситуация. Сама программа была когда-то локальной, потом ее переработали под сетевую самым минимальным способом: убрали команды, требующие эксклюзивного доступа, организовали рабочие файлы для каждого пользователя в отдельные папки. Короче, она уже много лет работала, но оказалось, что было всего 2 пользователя, которые не особо пересекались на вводе информации. Теперь добавился третий пользователь и вылезло то, о чем никто не подозревал. Подскажите, пожалуйста, что можно предпринять?
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488074
Penner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем?

repl all pr_v&v with 0
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488079
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно простио по всей таблице вычистить колонку, напр., для checkbox.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488082
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_BuchНужно простио по всей таблице вычистить колонку, напр., для checkbox.И почему кто-то один у всех чистит эту колонку?
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488086
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это колонка как раз для каждого пользователя своя. поле pr_v&v, где v - номер пользователя. там до 10 сделано, на большее количество пользователей не рассчитано.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488090
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_Buchэто колонка как раз для каждого пользователя своя. поле pr_v&v, где v - номер пользователя. там до 10 сделано, на большее количество пользователей не рассчитано.Тем более непонятно, почему эту колонку чистит не тот для кого она, а кто-то другой?
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488092
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov,

кстати, проверьте, а не с одним ли номером эти пользователи?
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488099
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пользователи с разными номерами. Один с номером 1, второй сномером 2. Первый чистит колонку pr_v1, второй pr_v2. У каждого своя колонка. Тут что-то глобально не так в программе... В другом месте, например, висит на команде
scan for !empty(ostoper)
repl ostoper with 0
ends
тут чистится другая колонка, в которую рассчитывается оперативный остаток по товару. Таже картина: один что-то вводит в документе (там открыт справочник товаров командой select), второй просто не может у себя этот справочник открыть, пока первый не закончит ввод.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488110
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_BuchТут что-то глобально не так в программе...Ага. Разделение данных разных пользователей по колонкам, а не по записям. В результате один пользователь постоянно что-то меняет в записях, с которыми работает другой пользователь. Дурдом.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488153
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну да, так и получается. а как по другому сделать?
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488159
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_Buchну да, так и получается. а как по другому сделать?Думать надо. Первое, что приходит в голову - убрать таки all из repl all pr_v&v with 0.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488171
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pr_v1, prv2, и т.д. это поля, куда заносится 1, когда пользователь ставит птичку при выборе товара. их по-любому нужно когда-то чистить. ну , если снимать пометку сразу после выбора товара, от этого можно избавиться. а как быть в других местах с аналогичной ситуацией, напр. когда удаляются записи из того же справочника в специальное поле pr_del заносится цифра 2, чтобы потом при упаковке эти строки удалить. так вот это тоже происходит при помощи команды repl all for или scan for. и на этом месте тоже висит. я вот не пойму, это зависание что, стандартная ситуация? так вообще никто не делает?
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488198
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_Buchpr_v1, prv2, и т.д. это поля, куда заносится 1, когда пользователь ставит птичку при выборе товара. их по-любому нужно когда-то чистить.Ну, это очень спорное утверждение. :) ну , если снимать пометку сразу после выбора товара, от этого можно избавиться. а как быть в других местах с аналогичной ситуацией, напр. когда удаляются записи из того же справочника в специальное поле pr_del заносится цифра 2, чтобы потом при упаковке эти строки удалить. так вот это тоже происходит при помощи команды repl all for или scan for. и на этом месте тоже висит. я вот не пойму, это зависание что, стандартная ситуация? так вообще никто не делает?Так, скорее всего, никто не делает. Не используют справочник еще и как временную таблицу одновременно для всех пользователей.
Короче, надо, для начала, хорошенько подумать.
Рассмотрим на примере галочек.
Для расстановки галочек совершенно необязательно редактировать всем одну и ту же таблицу. Точнее, для расстановки галочек сам справочник лучше совсем не трогать. Давно отработана схема с получением каждым пользователем выборки из справочника с необходимыми ему данными и расстановкой галочек в этой выборке. Тогда никто никому не будет мешать.
Что там еще есть мы не знаем и потому что-либо посоветовать не можем.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488214
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завтра попробую переделать, где придумаю. Большое спасибо за советы.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488233
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anna_Buch,

если с минимальными усилиями, то замените
Код: sql
1.
repl all pr_v&v with 0



на
Код: sql
1.
2.
3.
scan
   replace pr_v&v with 0
endscan



сразу попустит ;)
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488263
Anna_Buch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я пробовала, не помогает. Похоже нужно вообще как-то от replace избавляться. Буду завтра думать.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488308
Anna_Buch Похоже нужно вообще как-то от replace избавляться. Буду завтра думать.
Нужно избавляться не от replace, а от взаимных блокировок.
В общем, приложение нужно перерабатывать, желательно полностью. И с применением принципов клиент-серверных технологий:
- на клиента должны попадать только те данные, которые необходимы в данный момент
- данные обрабатываются и изменения отсылаются на сервер.
- с сервера перезапрашиваются измененные данные и отображаются клиенту....
Хоть тут некоторые и ругают книгу Попова по FoxPro 2.5/2.6, но там описывается различие локального и сетевого приложений и даются рекомендации как писать приложения, работающие как локально, так и в сети... Почитайте на досуге...
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38488334
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кий

А когда у ней возникнет следующая подобная проблема, вы ей калькулятор посоветуете?
Избавляться нужно от таких программ.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38489002
sg12Станислав С...кий
А когда у ней возникнет следующая подобная проблема, вы ей калькулятор посоветуете?


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

sg12Станислав С...кий
Избавляться нужно от таких программ.
Нужно. Но не всегда возможно... Ибо заменить их просто нечем...
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38489373
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кий

Ну вы и нашли Библию и ее Христа - Попова. Больше на секстанство смахивает.
И уж по товарам программу не найти ... 1С-шникам такое не отпустите - засмеют.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38489516
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение что пользователю выведена в грид та самая таблица.
Грид накладывает блокировку на текущую запись.
При этом если установлено
Код: sql
1.
SET REPROCESS TO AUTOMATIC


то второй пользователь "зависнет" на
Код: sql
1.
repl all pr_v&v with 0


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

Если попытаться обойтись малой переделкой, то
Код: sql
1.
repl for pr_v&v != 0 pr_v&v with 0


Так же у repl есть другие проблемы с блокировками, не помню детали, т.к. не использую.
Поэтому лучше заменить repl на
Код: sql
1.
update MyTable set pr_v&v = 0 where pr_v&v != 0


Тут проблема подвисания не снимается полностью, но вероятность ее появления уменьшается.

Ну а по-хорошему использовать какой-то локальный курсор с записью в базу каждого изменения.
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38490772
fore5ta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторDima T,
Есть подозрение что пользователю выведена в грид та самая таблица.
Грид накладывает блокировку на текущую запись.
Не обязательно, если я правильно понял ТС, то : автор Первый открывает справочник товара, заходит на корректировку строки, в каком-нибудь поле textbox
м.б. и форма где GET на прямую из таблицы, и exclusive off не поможет при replace all у второго пользователя.

Если ТС не хочет менять устоявшуюся модель обработки данных и так сильно любит своих пользователей, что при каждом открытии формы делает replace всей таблицы, а выше приведенные советы по отбору и обновлениям через запросы просто пугают, могу посоветовать разделить эту таблицу на две, в одной собственно данные, а вторая для "галочек", ее создавайте перед открытием основной формы, связывайте с основной, обрабатывайте ее как хотите, и после работы с формой уничтожайте. По крайней мере это уменьшит пересечение с другими пользователями. Имя второй таблицы генерите динамически )).
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38492972
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_BuchДва пользователя подключаются к базе данных. Первый открывает справочник товара, заходит на корректировку строки, в каком-нибудь поле textbox начинает вводить информацию. Второй пользователь в это время пытается зайти в этот же справочник товара, но программа подвисает на команде: repl all pr_v&v with 0 на init формы. Пока первый не закончит ввод в textbox, у второго все висит.
Подобное происходит в разных местах программы, где есть аналогичная ситуация. Сама программа была когда-то локальной, потом ее переработали под сетевую самым минимальным способом: убрали команды, требующие эксклюзивного доступа, организовали рабочие файлы для каждого пользователя в отдельные папки. Короче, она уже много лет работала, но оказалось, что было всего 2 пользователя, которые не особо пересекались на вводе информации. Теперь добавился третий пользователь и вылезло то, о чем никто не подозревал. Подскажите, пожалуйста, что можно предпринять?
В общем, дело, разумеется, в блокировках.

1. Первый пользователь начал редактировать запись и заблокировал ее
2. Второй пользователь "бесконечно" ждет снятия блокировки с записи, чтобы внести в нее изменения

Варианты действия у Вас следующие

1. Переделать программу с тем, чтобы процесс редактирования записи не приводил к ее блокировке
2. Переделать программу с тем, чтобы не требовалась глобальное обновление всех записей таблицы
3. Перед глобальным обновлением записей таблицы попытаться вручную наложить блокировку

Насколько я понимаю, первые два варианта для Вас в настоящее время не приемлемы. Тогда остается только третий вариант, как некая "затычка". Делается это примерно так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
* В главном стартовом файле приложения делается глобальная настройка
SET REPROCESS TO 3

* Собственно обновление всей таблицы выполняется так
* INIT - формы
select MyTab
if flock()                            && Пытаемся "вручную" заблокировать всю таблицу
    repl all pr_v&v with 0            && Вносим изменения во все записи
    unlock                            && "Вручную" снимаем сделанные блокировки
else
    MessageBox('Одна из записей редактируется другим пользователем')
    return .F.                        && Закрытие формы без ее открытия
endif
...
Рейтинг: 0 / 0
Зависание программы по команде replace
    #38492985
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anna_Buchpr_v1, prv2, и т.д. это поля, куда заносится 1, когда пользователь ставит птичку при выборе товара. их по-любому нужно когда-то чистить. ну , если снимать пометку сразу после выбора товара, от этого можно избавиться.
Как уже заметил Сергей, использование постоянных таблиц для хранения временных данных (в данном случае "птичек") крайне не удачное решение. "Птички", очевидно, должны ставится в каких-то временных данных.

Идеальное решение - это выборка с дополнительным полем (Local View, CursorAdapter, Select-SQL). Решение несколько хуже - временная таблица (курсор), которая создается в момент открытия формы и содержит только два поля: идентификатор записи и поле для "птички". Еще одно решение - табличная буферизация. Перед сбросом буфера откатить все "птички"

Однако, как Вы понимаете, все эти решения требуют серьезной переделки приложения.

Anna_Buch а как быть в других местах с аналогичной ситуацией,
Каждый случай требует отдельного рассмотрения.

Anna_Buch напр. когда удаляются записи из того же справочника в специальное поле pr_del заносится цифра 2, чтобы потом при упаковке эти строки удалить. так вот это тоже происходит при помощи команды repl all for или scan for. и на этом месте тоже висит.
Это как? Групповое удаление записей в справочнике? В смысле, Вы цифру 2 ставите через replace all? Как-то у меня воображения не хватает на такое

Если же речь идет о последующем физическом удалении, так этот процесс требует монопольного доступа. Конфликт с другими пользователями невозможен.

Anna_Buchя вот не пойму, это зависание что, стандартная ситуация? так вообще никто не делает?
Никто. При написании приложений, с которыми одновременно могут работать несколько пользователей, всегда используется, так называемая, оптимистическая буферизация. Либо "самопальная" (на курсорах или переменных памяти) или стандартная - cursorSetProp("Buffering").

Основная идея заключается в том, чтобы разделить процесс редактирования данных пользователем и собственно сохранение внесенных изменений в таблицах.

Т.е. пока у пользователя открыта для редактирования форма, данные никак не блокируется. Пользователь вносит изменения в некий "буфер данных". Можете считать это некой прозрачной "калькой" положенной на лист с данными. И пользователь "чиркает" именно эту "кальку".

А вот когда пользователь завершил процесс редактирования и, условно, нажал кнопку "Сохранить", то только в этот момент данные блокируются и в них переносятся все изменения с "кальки" (из буфера).

В результате, собственно блокировка данных всегда занимает крайне незначительное время. Даже если два пользователя "одновременно" нажали кнопку "Сохранить", но ждать им придется не очень долго.

Разумеется, при подобной стратегии возникают конфликты совместного доступа (два пользователя изменили одни и те же данные). Но как их решать зависит уже от конкретной постановки задачи. Проблема носит не столько технический, сколько организационный характер.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Зависание программы по команде replace
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]