Форум » [x]Harbour » Совместная работа с dbf » Ответить

Совместная работа с dbf

Самоделкин: Здравствуйте все! Я не программист. Весь мой опыт программирования - когда-то давно (198х-199х) сделал на Клиппере 3-4 рабочих программы для себя. Сейчас возникла идея как-то автоматизировать работу нашего коллектива (7 человек). С Harbour ознакомился, сделал пару программ. Но беда в том, что необходима сетевая обработка данных. Для меня это шумерский язык С блокировками разобрался (пока теоретически). А вот как оперативно отражать изменения в базе на всех ПК не знаю. Была идея разместить на форме кнопку Обновить, но это как-то не гламурно. Обновлять автоматически по таймеру? Подскажите, как это делают профессионалы? Если кто-нибудь приведет маленький пример, буду вдвойне признателен.

Ответов - 17

alkresin: Обновлять автоматически по таймеру? Реализация зависит от того, используете ли вы какую-нибудь GUI библиотеку, или пишете для консольного режима. Для GUI - в каждой библиотеке есть соответствующий класс ( типа Timer ). Для консольного - вот простейший пример, написан на основе Harbour\tests\testidle.prg : PROCEDURE MAIN() Local s := Space( 30 ), choice := 1 CLS ? "DEFAULT IDLEREPEAT =", SET( _SET_IDLEREPEAT ) ? ? "Idle Block should be displayed multiple times until key or 10 seconds elapsed!" ? "Press any key to begin..." ? Inkey(0) CLS HB_IDLEADD( {|| TF() } ) @ 01, 06 PROMPT " ОБРАБОТКА РЕЗУЛЬТАТОВ " @ 02, 06 PROMPT " В Ы Х О Д " MENU TO choice ? RETURN Function TF() Local nSec := Seconds() Static nCount := 0, nSec0 := 0 IF nSec0 == 0 .OR. nSec - nSec0 >= 1 nSec0 := nSec nCount++ @ 5, 24 SAY Str(nCount,5) + " Idle Block " + Str(Seconds()) COLOR "GR+/N" ENDIF Return Nil

Самоделкин: С примером разобрался. Спасибо. Я так понимаю, что обновление по таймеру - это правильный подход? Или существуют какие-нибудь настройки в MiniGUI или Harbour, обеспечивающие автоматическое обновление? Есть ли другие подходы, кроме обновления по таймеру? И еще вопрос. Допустим в Browse в момент корректировки строки, происходит обновление таблицы с добавлением строки другим пользователем. Не произойдет ли какого-нибудь сбоя (уход фокуса с корректируемой строки или еще чего?

AlexMyr: Самоделкин пишет: И еще вопрос. Допустим в Browse в момент корректировки строки, происходит обновление таблицы с добавлением строки другим пользователем. Не произойдет ли какого-нибудь сбоя (уход фокуса с корректируемой строки или еще чего? Для этого вы блокируете запись, и ее никто никуда не сдвинет, только если вы сами комп вырубите.


Самоделкин: Может я неправильно выразился. Я имел в виду следующее: Есть таблица с записями, в которых ID = 1, 3 и 4. Пользователь меняет запись 3 с предварительной блокировкой этой записи. Другой пользователь вносит запись с ID = 2. Через время сработал таймер у первого пользователя, который еще не закончил изменение в строке 3. Вызывается Refresh таблицы. Появляется уже 4 записи. Останется ли фокус на записи с ID 3? И можно ли продолжать изменение? Или я не правильно понимаю и обновление таблицы произойдет только после завершения корректировки? Или перед изменением надо останавливать таймер?

AlexMyr: Никуда фокус не сдвинется, корректируете себе спокойно, можете даже пойти кофе попить, никто кроме вас с этой строкой ничего не сделает. Хотя подход прямой правки базы не правильный.

Самоделкин: AlexMyr пишет: Хотя подход прямой правки базы не правильный. А как правильно? Править переменные памяти, а потом обновлять запись? Так?

AlexMyr: Представьте ситуацию, что в строке надо изменить десять значения, и на шестом вы передумали, что будете делать?

Самоделкин: Понял, спасибо. И все-таки: обновление формы по таймеру - это оптимальный подход? И еще: при каком значении SET BROWSESYNC (ON или OFF) посоветуете работать в сети? Или это не принципиально?

SergKis: Самоделкин пишет: И все-таки: обновление формы по таймеру - это оптимальный подход? Если пользователь ничего не делает (например 3 минуты), то на мой взгляд - это нормально. А если пользователь пялится в Browse с 30-40 строк и колонок 20-25, думаю мельтешение перед глазами будет только мешать. Наличие кнопки Refresh не помешает в любом случае (а часто бывает и достаточным). Или это не принципиально? Это две большие разницы. SET BROWSESYNC ON Browse value синхронизируется с RecNo - не разу не подводило SET BROWSESYNC OFF Вы сами синхронизируете Browse value и RecNo

Самоделкин: SergKis пишет: Это две большие разницы. О разнице между ними я читал SergKis пишет: SET BROWSESYNC ON Browse value синхронизируется с RecNo - не разу не подводило Хочу уточнить, речь идет именно о сетевом доступе?

SergKis: Самоделкин пишет: Хочу уточнить, речь идет именно о сетевом доступе? Вот код, выполняемый на OnChange в Browse при SET BROWSESYNC ON: [pre2]Static Procedure _BrowseSync (i) *-----------------------------------------------------------------------------* Local _Alias Local _BrowseArea Local _RecNo Local _CurrentValue _Alias := Alias() _BrowseArea := _HMG_aControlSpacing If Select (_BrowseArea) == 0 Return EndIf Select &_BrowseArea _RecNo := RecNo() _CurrentValue := _BrowseGetValue ( '' , '' , i ) // Получить номер записи из сохранёного массива // По выбраной строки на экране If _RecNo != _CurrentValue Go _CurrentValue EndIf If Select( _Alias ) != 0 Select &_Alias Else Select 0 Endif Return [/pre2]

Самоделкин: Понятно. Продолжаем: 1. Перед удалением записи достаточно DBRLOCK или надо блокировать весь файл FLOCKом? А при изменении? 2. Заблокированная таблица (запись) остается доступной для чтения?

PSP: 1. Чтобы пометить запись как удаленную, достаточно DBRLock. Чтобы физически удалить отмеченные записи, нужно блокировать весь файл или открывать его в монопольном режиме. 2. Доступность на чтение остается.

Самоделкин: Спасибо. Для тех, кто тоже интересуется этой темой - нашел статью "Использование Clippera в локальной сети". Правда не знаю, соответствует ли все Harbour на 100%.

PSP: Я слегка ошибся: физически удалить записи можно только при монопольном открытии файла. Будет ошибка, если файл открыт в разделенном режиме. Блокировка файла здесь не имеет значения.

Самоделкин: PSP пишет: Будет ошибка, если файл открыт в разделенном режиме. Блокировка файла здесь не имеет значения. Да. Я уже с этим столкнулся.

Самоделкин: Подскажите, пожалуйста, чем отличаются схемы блокировки CLIP, CL53, VFP, СL53EXT и XHB64, задаваемые в SET DBFLOCKSCHEME.



полная версия страницы