Автор | Сообщение |
|
| |
Пост N: 1
Зарегистрирован: 13.12.12
|
|
Отправлено: 13.12.12 13:28. Заголовок: Совместная работа с dbf
Здравствуйте все! Я не программист. Весь мой опыт программирования - когда-то давно (198х-199х) сделал на Клиппере 3-4 рабочих программы для себя. Сейчас возникла идея как-то автоматизировать работу нашего коллектива (7 человек). С Harbour ознакомился, сделал пару программ. Но беда в том, что необходима сетевая обработка данных. Для меня это шумерский язык С блокировками разобрался (пока теоретически). А вот как оперативно отражать изменения в базе на всех ПК не знаю. Была идея разместить на форме кнопку Обновить, но это как-то не гламурно. Обновлять автоматически по таймеру? Подскажите, как это делают профессионалы? Если кто-нибудь приведет маленький пример, буду вдвойне признателен.
|
|
|
Новых ответов нет
[см. все]
|
|
|
| moderator
|
Пост N: 496
Зарегистрирован: 06.07.06
|
|
Отправлено: 13.12.12 15:09. Заголовок: Обновлять автоматиче..
цитата: | Обновлять автоматически по таймеру? |
| Реализация зависит от того, используете ли вы какую-нибудь 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 |
|
|
|
|
|
| |
Пост N: 2
Зарегистрирован: 13.12.12
|
|
Отправлено: 13.12.12 15:27. Заголовок: С примером разобралс..
С примером разобрался. Спасибо. Я так понимаю, что обновление по таймеру - это правильный подход? Или существуют какие-нибудь настройки в MiniGUI или Harbour, обеспечивающие автоматическое обновление? Есть ли другие подходы, кроме обновления по таймеру? И еще вопрос. Допустим в Browse в момент корректировки строки, происходит обновление таблицы с добавлением строки другим пользователем. Не произойдет ли какого-нибудь сбоя (уход фокуса с корректируемой строки или еще чего?
|
|
|
|
| |
Пост N: 678
Зарегистрирован: 11.06.10
|
|
Отправлено: 13.12.12 15:30. Заголовок: Самоделкин пишет: И..
Самоделкин пишет: цитата: | И еще вопрос. Допустим в Browse в момент корректировки строки, происходит обновление таблицы с добавлением строки другим пользователем. Не произойдет ли какого-нибудь сбоя (уход фокуса с корректируемой строки или еще чего? |
|
Для этого вы блокируете запись, и ее никто никуда не сдвинет, только если вы сами комп вырубите.
|
|
|
|
| |
Пост N: 3
Зарегистрирован: 13.12.12
|
|
Отправлено: 13.12.12 15:44. Заголовок: Может я неправильно ..
Может я неправильно выразился. Я имел в виду следующее: Есть таблица с записями, в которых ID = 1, 3 и 4. Пользователь меняет запись 3 с предварительной блокировкой этой записи. Другой пользователь вносит запись с ID = 2. Через время сработал таймер у первого пользователя, который еще не закончил изменение в строке 3. Вызывается Refresh таблицы. Появляется уже 4 записи. Останется ли фокус на записи с ID 3? И можно ли продолжать изменение? Или я не правильно понимаю и обновление таблицы произойдет только после завершения корректировки? Или перед изменением надо останавливать таймер?
|
|
|
|
| |
Пост N: 679
Зарегистрирован: 11.06.10
|
|
Отправлено: 13.12.12 16:00. Заголовок: Никуда фокус не сдви..
Никуда фокус не сдвинется, корректируете себе спокойно, можете даже пойти кофе попить, никто кроме вас с этой строкой ничего не сделает. Хотя подход прямой правки базы не правильный.
|
|
|
|
| |
Пост N: 4
Зарегистрирован: 13.12.12
|
|
Отправлено: 13.12.12 16:09. Заголовок: AlexMyr пишет: Хотя..
AlexMyr пишет: цитата: | Хотя подход прямой правки базы не правильный. |
| А как правильно? Править переменные памяти, а потом обновлять запись? Так?
|
|
|
|
| |
Пост N: 680
Зарегистрирован: 11.06.10
|
|
Отправлено: 13.12.12 16:18. Заголовок: Представьте ситуацию..
Представьте ситуацию, что в строке надо изменить десять значения, и на шестом вы передумали, что будете делать?
|
|
|
|
| |
Пост N: 5
Зарегистрирован: 13.12.12
|
|
Отправлено: 13.12.12 16:25. Заголовок: Понял, спасибо. И в..
Понял, спасибо. И все-таки: обновление формы по таймеру - это оптимальный подход? И еще: при каком значении SET BROWSESYNC (ON или OFF) посоветуете работать в сети? Или это не принципиально?
|
|
|
|
| постоянный участник
|
Пост N: 51
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.12.12 18:24. Заголовок: Самоделкин пишет: И ..
Самоделкин пишет: цитата: | И все-таки: обновление формы по таймеру - это оптимальный подход? |
| Если пользователь ничего не делает (например 3 минуты), то на мой взгляд - это нормально. А если пользователь пялится в Browse с 30-40 строк и колонок 20-25, думаю мельтешение перед глазами будет только мешать. Наличие кнопки Refresh не помешает в любом случае (а часто бывает и достаточным). цитата: | Или это не принципиально? |
| Это две большие разницы. SET BROWSESYNC ON Browse value синхронизируется с RecNo - не разу не подводило SET BROWSESYNC OFF Вы сами синхронизируете Browse value и RecNo
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 13.12.12
|
|
Отправлено: 13.12.12 18:55. Заголовок: SergKis пишет: Это ..
SergKis пишет: О разнице между ними я читал SergKis пишет: цитата: | SET BROWSESYNC ON Browse value синхронизируется с RecNo - не разу не подводило |
| Хочу уточнить, речь идет именно о сетевом доступе?
|
|
|
|
| постоянный участник
|
Пост N: 52
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.12.12 21:07. Заголовок: Самоделкин пишет: Хо..
Самоделкин пишет: цитата: | Хочу уточнить, речь идет именно о сетевом доступе? |
| Вот код, выполняемый на OnChange в Browse при SET BROWSESYNC ON: Скрытый текст 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
|
|
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 13.12.12
|
|
Отправлено: 14.12.12 09:56. Заголовок: Понятно. Продолжаем:..
Понятно. Продолжаем: 1. Перед удалением записи достаточно DBRLOCK или надо блокировать весь файл FLOCKом? А при изменении? 2. Заблокированная таблица (запись) остается доступной для чтения?
|
|
|
|
| постоянный участник
|
Пост N: 808
Зарегистрирован: 27.01.07
|
|
Отправлено: 14.12.12 10:03. Заголовок: 1. Чтобы пометить за..
1. Чтобы пометить запись как удаленную, достаточно DBRLock. Чтобы физически удалить отмеченные записи, нужно блокировать весь файл или открывать его в монопольном режиме. 2. Доступность на чтение остается.
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 13.12.12
|
|
Отправлено: 14.12.12 10:13. Заголовок: Спасибо. Для тех, кт..
|
|
|
|
| постоянный участник
|
Пост N: 809
Зарегистрирован: 27.01.07
|
|
Отправлено: 14.12.12 11:28. Заголовок: Я слегка ошибся: физ..
Я слегка ошибся: физически удалить записи можно только при монопольном открытии файла. Будет ошибка, если файл открыт в разделенном режиме. Блокировка файла здесь не имеет значения.
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 13.12.12
|
|
Отправлено: 14.12.12 18:06. Заголовок: PSP пишет: Будет ош..
PSP пишет: цитата: | Будет ошибка, если файл открыт в разделенном режиме. Блокировка файла здесь не имеет значения. |
| Да. Я уже с этим столкнулся.
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 13.12.12
|
|
Отправлено: 18.01.13 11:28. Заголовок: Подскажите, пожалуйс..
Подскажите, пожалуйста, чем отличаются схемы блокировки CLIP, CL53, VFP, СL53EXT и XHB64, задаваемые в SET DBFLOCKSCHEME.
|
|
|
|