Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК! / 12 сообщений из 12, страница 1 из 1
28.06.2004, 10:29
    #32579087
andrewFOX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Причем выборка из измененной таблицы, показывает измененную запись, НО...
Если рефрешим таблицу в ФОКСЕ, запись старая, уходим из фокса, загружаем по новой, вновь грузим таблицу-запись старая. Если кто наступал на грабли поделитесь, чтоб не больно полбу било КАК...или проблема в провайдере?
...
Рейтинг: 0 / 0
28.06.2004, 10:34
    #32579094
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Слишком мало информации. Вообще-то у мяня все работает...

Нельзя ли более конкретно?

- какие приложения
- куски кода
- буферизация
- это свободные таблицы?
- транзакции?
...
Рейтинг: 0 / 0
28.06.2004, 11:36
    #32579193
andrewFOX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Слишком мало информации. Вообще-то у мяня все работает...

Нельзя ли более конкретно?

- какие приложения
1c
- куски кода
Con = CreateObject("ADODB.Connection");
Com = CreateObject("ADODB.Command");
recset = CreateObject("ADODB.RecordSet");
StrCon="Provider=Microsoft.Jet.OLEDB.4.0;
|Data Source=d:\ADODBTEL\;
|Extended Properties=dBASE IV";
Con.Open(strCon);
Cmd.ActiveConnection = Con;
StrCom="UPDATE tel SET id_N='XXXXXX' where num='НННННН' and ret is null";
recset.CursorType=2;
recset.LockType=2;
recset=Execute(strcom);
StrCom="select num,id_n,ret from tel where num='8462458488'";
recset=Execute(strcom);
Так вот здесь select выдает измененную строку!
- буферизация
чего?
- это свободные таблицы?
да.
- транзакции?
вот здесь мне кажется что нужно явное подтверждение транзакции
я прав?
...
Рейтинг: 0 / 0
28.06.2004, 14:12
    #32579541
andrewFOX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Проблема уточнилась, оказывается не может измениться поле на котором стоит курсор-указаталь, т.е. в режиме редактирования поля. Как это поббороть, хотя бы получить сведения, редактируется ли в данный момент поле или нет?
...
Рейтинг: 0 / 0
28.06.2004, 23:06
    #32580117
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Раз никто не берется ответить, прийдется продолжить:

Копать надо тут:

recset.LockType=2; ('Pessimistic Lock)

Таким образом если Вы начали что-то делать с записью, то уже никто больше сделать ничего не сможет. Если поменять значение на 3 то сохраняться будут последние изменения...

Как проверить заблокирована запись или нет? Если в FoxPro то очень просто:

Код: plaintext
1.
2.
3.
4.
if lock() then
* можно что-то делать
else
* запись кем-то блокирована, делать ничего нельзя...
endif

- транзакции со свободными таблицами можно применять только в VFP 9.0 :(

авторПроблема уточнилась, оказывается не может измениться поле на котором стоит курсор-указаталь, т.е. в режиме редактирования поля. Как это поббороть, хотя бы получить сведения, редактируется ли в данный момент поле или нет?

Если указатель стоит в FoxPro - то надо там поставить оптимистическую блокировку строки или таблицы - например

Код: plaintext
1.
SELECT tel
=CURSORSETPROP("Buffering" , 3 ) 

И не забыть потом сохранить изменения (хотя при перемещении указателя запись сохранится автоматически, подавив любые изменения которые были внеснены кем-то за время вашего бездействия):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
k=SELECT( )
FOR I =  1  TO k
  IF NOT EMPTY ( ALIAS(I) )
    SELECT (I)
    DO CASE
    CASE CURSORGETPROP("Buffering")= 5 
      DO chbuf
    CASE CURSORGETPROP("Buffering")= 3 
      DO chbufr
    OTHERWISE
    ENDCASE
  ENDIF
ENDFOR

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
* check for all table
PROCEDURE chbuf
  IF CURSORGETPROP("Buffering")= 5 
    LOCAL llOverwrite,llChanged, lnField,lcField, lnRec
    GO TOP
    lnRec=GETNEXTMODIFIED( 0 )
    DO WHILE lnRec<> 0 
      GOTO lnRec
      llCnanged=.F.
      llOverwrite=.F.
      FOR lnField= 1  TO FCOUNT()
        lcField=FIELD(lnField)
        IF CURVAL(lcField)<>OLDVAL(lcField)
          llCnanged=.T.
          EXIT
        ENDIF
      ENDFOR
      IF llCnanged
        lnResult=MESSAGEBOX("Somebody locked your table. What we have to do?", 4 ,"Try again")
        IF lnResult= 6 
          llOverwrite=.T.
        ENDIF
      ENDIF
      IF llCnanged AND NOT llOverwrite
        =TABLEREVERT()
      ELSE
        IF m.gltransact
          BEGIN TRANSACTION
          =TABLEUPDATE(.F.,.T.)
          END TRANSACTION
        ELSE
          =TABLEUPDATE(.F.,.T.)
        ENDIF
      ENDIF
      lnRec=GETNEXTMODIFIED(lnRec)
    ENDDO
  ENDIF
  RETURN

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
* check for only one row in table
PROCEDURE chbufr
  IF CURSORGETPROP("Buffering")= 3 
    LOCAL lnField,lcField && llOverwrite,llChanged,
    glCnanged=.F.
    glOverwrite=.F.
    FOR lnField= 1  TO FCOUNT()
      lcField=FIELD(lnField)
      IF CURVAL(lcField)<>OLDVAL(lcField)
        glCnanged=.T.
        EXIT
      ENDIF
    ENDFOR
    IF glCnanged
      lnResult=MESSAGEBOX("Somebody locked your table. What we have to do?", 4 ,"Try again")
      IF lnResult= 6 
        glOverwrite=.T.
      ENDIF
    ENDIF
    IF glCnanged AND NOT glOverwrite
      =TABLEREVERT()
    ELSE
      IF m.gltransact
        BEGIN TRANSACTION
        =TABLEUPDATE(.F.,.T.)
        END TRANSACTION
      ELSE
        =TABLEUPDATE(.F.,.T.)
      ENDIF
    ENDIF
  ENDIF
  RETURN
...
Рейтинг: 0 / 0
28.06.2004, 23:17
    #32580127
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Да, кстати я тут у Вас не увидел OLE DB Provider VFP 8.0

У Вас Microsoft.Jet.OLEDB.4.0 - это абсолютно разные вещи, причем в первом намного меньше ошибок и проблем, чем в Jet :(
...
Рейтинг: 0 / 0
29.06.2004, 09:21
    #32580295
andrewFOX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
2 Sergey Ch: Спасибо за очень содержательный ответ!, Но вся проблема заключается в том, чтобы рулить(апдейтить, делать вставки, просмотр и т.д) таблицами из 1с(это как раз основное направление), потому что невозможно на данный момент отследить все изменения сделанные пользвателями в базе. А с помощью 1с, происходит регистрация пользователя, и логируются все действия с таблицами-таблицы свободные! Так вот чтобы отойти от оболочки Фокса, было принято решение сделать доступ из 1с, но в тоже время есть некоторые критические пользователи, которым все таки нужно оставить доступ к таблицам из Фокса, и вот тут и назрела проблема, как из 1с, делать изменения, когда на поле записи в Фоксе стоит указатель, а в это время 1с делает изменения, тут и получаетсЯ все описанное, т.е. 1с делает изменения, получает выборку, что изменения произошли, а на самом деле, никаких изменений нет и впомине. Так вот с этой проблемой как? ПЕРВИЧНО не ФОКС, а правильность изменений из 1с через OLE или ODBC!
...
Рейтинг: 0 / 0
29.06.2004, 10:57
    #32580526
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Попробуем разобраться:

1. Можете ли Вы включить буферизацию в старую программу FoxPro? Если да, то ответ как это сделать смотрите выше...

2. Нельзя ли попробовать вместо Microsoft.Jet.OLEDB.4.0 использовать OLE DB VFPRO 8.0? Что - то я смутно припоминаю - в MS.JET были какие-то проблемы с обновлением данных (да и старый он очень как и глючный)...

3. Попробуйте поиграть с настройками:

recset.CursorType=2;
recset.LockType=2;

Good luck!

P.S. Может попробовать задать данный вопрос на форуме 1С?
...
Рейтинг: 0 / 0
29.06.2004, 13:14
    #32581006
Chuveljov Andrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
А написать OLE сервер для вашего набора данных не судьба?
___________________
Всё вышеизложенное есть моё частное мнение и не претендует на полноту изложения.
...
Рейтинг: 0 / 0
29.06.2004, 13:18
    #32581024
Chuveljov Andrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
Я имел ввиду написать на Фоксе..
Единственный минус - необходимость держать фоксовые библиотеки.
___________________
Всё вышеизложенное есть моё частное мнение и не претендует на полноту изложения.
...
Рейтинг: 0 / 0
29.06.2004, 13:36
    #32581106
andrewFOX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
2 Chuveljov Andrew: Таблички на файловом сервере, доступ практически со всех раб. мест, на все раб местах используется 1с, зачем OLE server, когда совершенно ноормально использовать ОЛЕ клиента, проблема-то только в фоксе.
2 all: Спасибо всем за участие в разговоре. Проблема разрешилась. Все просто банально. Использовали JET, а надо было использовать нормальный ОЛЕ провайдер, сами короче накосячили, поставили нормальное ПО, и все заиграло! Спасибо!
...
Рейтинг: 0 / 0
29.06.2004, 14:00
    #32581179
Chuveljov Andrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК!
andrewFOX2 Chuveljov Andrew: Таблички на файловом сервере, доступ практически со всех раб. мест, на все раб местах используется 1с, зачем OLE server, когда совершенно ноормально использовать ОЛЕ клиента, проблема-то только в фоксе.


Та программа, которая обрабатывает OLE вызовы, называется OLE server, а та, которая пользучает результат - OLE client.

Я сам в своё время пытался скрестить 1С с Фоксом. Отказался ввиду несостоятельности 1С на тех объёмах данных.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема! Если заблокировать запись в таблице под VFPRO, а потом другим приложением с OLE DB VFPRO 8.0 делать изменения все ОК! / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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