Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 После TableUpdate() записи в курсоре помечаются как удалённые  [new]
DenDen79
Member

Откуда:
Сообщений: 7
Есть удалённое представление

View no05_1
*UpdateType 1
*WhereType 1
*FetchMemo TRUE
*ShareConnection TRUE
*SendUpdates TRUE
*Prepared FALSE
*CompareMemo TRUE
*FetchAsNeeded FALSE
*UseMemoSize 255
*FetchSize -1
*MaxRecords -1
*Tables no05_1
*SQL select c_lg,c_us,date_b,prav_vl,q_ld,proc_lg,type_nr,nrpp,nor_lg,nor_dp,bg_1,bg_2,form_co from no05_1
*ConnectName city2000s01
*SourceType 2
*BatchUpdateCount 1

выполняю след. код

open database ...
use no05_1 in 0
select no05_1
? cursorsetprop('buffering',5) && возвр. .Т.
repl all bg_1 with 0
? tableupdate(.T.,.T.) && возвр. .Т.

в результате строки курсора, в которых bg_1 равнялось 0 помечаются на удаление, в других значение меняется, записи как удалённые не помечаются

ВОПРОС: почему записи помечаются на удаление, что я делаю не правильно
27 окт 09, 16:05    [7845388]     Ответить | Цитировать Сообщить модератору
 Re: После TableUpdate() записи в курсоре помечаются как удалённые  [new]
DenDen79
Member

Откуда:
Сообщений: 7
Добавлю, что на сервер данные уходят нормально. и после requery() в курсоре видны те зименения которые нужно. Но почему после TableUpdate записи помечаются на удаление не могу найти ответа. Подскажите где искать плз!
27 окт 09, 16:38    [7845594]     Ответить | Цитировать Сообщить модератору
 Re: После TableUpdate() записи в курсоре помечаются как удалённые  [new]
DenDen79
Member

Откуда:
Сообщений: 7
нашёл что нужно сделать чтобы такого небыло. вместо tableupdate(.t.,.t.) использовать tableupdate(.f.,.t.) или tableupdate(). только пока не совсем чётко представляю почему..... буду разбираться.

если использовать tableupdate(.t.) aerror выдаёт ошбку update conflict in cursor....

может кто подскажет где можно найти толковую информацию, чтобы разобраться во всех этих буферизациях?
27 окт 09, 17:39    [7846065]     Ответить | Цитировать Сообщить модератору
 Re: После TableUpdate() записи в курсоре помечаются как удалённые  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
TableUpdate() ничего не удаляет. Он всего-лишь сбрасывает изменения из буфера View в таблицу-источник.

TableUpdate(.F.) - сбрасывает буфер одной (текущей) записи View
TableUpdate(.T.) - сбрасывает буфер всех записей View

Сообщение Update Conflict говорит о том, что пока Вы вносили изменения во View какой-то другой пользователь изменил те же самые данные. Причем "другой пользователь" не обязательно "другой человек". Это может быть и другое View, например.

Если данные оказались удалены, значит либо их удалил другой пользователь, либо в базе данных сработал триггер при модификации поля.
27 окт 09, 21:30    [7846751]     Ответить | Цитировать Сообщить модератору
 Re: После TableUpdate() записи в курсоре помечаются как удалённые  [new]
DenDen79
Member

Откуда:
Сообщений: 7
Разобрался в чём была причина, но для меня по прежнему загадка что такого делает VFP, что в результате сброса буфера в удалённую таблицу, запись в локальном курсоре становится удалённой.

ОЧЕНЬ БЫ ХОТЕЛОСЬ УСЛЫШАТЬ МНЕНИЕ ДРУГИХ УЧАСТНИКОВ ФОРУМА. А ТО ВДРУГ Я ЧТО-НИБУДЬ ОПЯТЬ ПРОГЛЯДЕЛ ))))

Итак проводил следующие эксперименты

1 компьютер. На нём запущен MySQL сервер

В VFP на этом же компьютере делаю следующее:

1) create database data1
2) создаю соединение в Database disiner
3) добавляю Remote View на таблицу no05_1
4) выставляю нужные настройки

В итоге получился вот такой листинг команды LIST DATABASE

+

Database Name: DATA1
Database Path: h:\city2000s1\data1.dbc
Database Version: 10

Database StoredProceduresDependencies

-----------------------------------------------------------------------------------
Connection conn | View no05_1
-----------------------------------------------------------------------------------
*Asynchronous FALSE | *UpdateType 1
*BatchMode TRUE | *WhereType 1
*DispWarnings TRUE | *FetchMemo TRUE
*DispLogin 1 | *ShareConnection FALSE
*Transactions 1 | *SendUpdates TRUE
*ConnectTimeOut 15 | *Prepared FALSE
*QueryTimeOut 0 | *CompareMemo TRUE
*IdleTimeOut 0 | *FetchAsNeeded FALSE
*WaitTime 100 | *UseMemoSize 255
*PacketSize 4096 | *FetchSize -1
*Datasource CITY2000S | *MaxRecords -1
*UserId cityadmin | *Tables no05_1
*Password city | *SQL SELECT * FROM no05_1 No05_1
*Database city2000s01 | *ConnectName conn
| *SourceType 2
| *BatchUpdateCount1
-----------------------------------------------------------------------------------
Field c_lg | Field c_us | Field date_b
-----------------------------------------------------------------------------------
*KeyField TRUE | *KeyField TRUE | *KeyField TRUE
*Updatable FALSE | *Updatable FALSE | *Updatable FALSE
*UpdateName no05_1.c_lg | *UpdateName no05_1.c_us | *UpdateName no05_1.date_b
*DataType C(2) | *DataType C(2) | *DataType C(10)
-----------------------------------------------------------------------------------
Field nor_dp | Field bg_1 | Field bg_2
-----------------------------------------------------------------------------------
*KeyField FALSE | *KeyField FALSE | *KeyField FALSE
*Updatable TRUE | *Updatable TRUE | *Updatable TRUE
*UpdateName no05_1.nor_dp | *UpdateName no05_1.bg_1 | *UpdateName no05_1.bg_2
*DataType N(3) | *DataType N(2) | *DataType N(2)
-----------------------------------------------------------------------------------


Создаю процедуру след. вида:
CLEAR
CLOSE DATABASE ALL
OPEN DATABASE data1 EXCLUSIVE
USE no05_1 IN 0
CURSORSETPROP ('buffering',3) && хотя и так данный тип буферизации используется по умолчанию
GO TOP
REPLACE bg_1 WITH 0
? GETFLDSTATE('bg_1')
? OLDVAL('bg_1')
? bg_1
IF ! TABLEUPDATE () && здесь варианты описанные ниже 
   AERROR (atmp)
   ? ALLTRIM (STR (atmp(1)))+' '+atmp(2)
   TABLEREVERT ()
ELSE
   ? 'ok'
ENDIF
BROW

далее следующие варианты выполнения:

1) если до выполнения команды REPLACE в поле bg_1 находилась 1
то при использовании команды TABLEUPDATE(.F.,.F.)
выводится следующее:
2
1
0
ок
Лог на серваке показывает, что пришла команда
UPDATE no05_1 SET bg_1=0 WHERE c_lg='01' AND c_us='01' AND date_b='01.01.2001';

2) если до выполнения команды REPLACE в поле bg_1 находился 0
то при использовании команды TABLEUPDATE(.F.,.F.)
выводится следующее:
2
0
0
1585 Update conflict !!!!!!!!!!!!!!!!!
ТЕМ НЕ МЕНЕЕ лог на серваке показывает, что пришла команда
UPDATE no05_1 SET bg_1=0 WHERE c_lg='01' AND c_us='01' AND date_b='01.01.2001';

3)
если до выполнения команды REPLACE в поле bg_1 находилась 1
то при использовании команды TABLEUPDATE(.T.,.T.)
выводится следующее:
2
1
0
ок
Лог на серваке показывает, что пришла команда
UPDATE no05_1 SET bg_1=0 WHERE c_lg='01' AND c_us='01' AND date_b='01.01.2001';

4)если до выполнения команды REPLACE в поле bg_1 находился 0
то при использовании команды TABLEUPDATE(.T.,.T.)
выводится следующее:
2
0
0
ок !!!!!!!!!!!!!!!!!!!!
Лог на серваке показывает, что пришла команда
UPDATE no05_1 SET bg_1=0 WHERE c_lg='01' AND c_us='01' AND date_b='01.01.2001';
ВРОДЕ ВСЁ ПУТЁМ, НО ОБНОВЛЯЕМАЯ СТРОКА КУРСОРА ПОМЕЧАЕТСЯ НА УДАЛЕНИЕ!!!

Переключаюсь на программу MySQL query browser
Выполняю запрос
UPDATE no05_1 SET bg_1=0 WHERE c_lg='01' AND c_us='01' AND date_b='01.01.2001';
и вижу следующее:
если данные действительно обновились, то выводится "1 row affected", если нет (когда bg_1 уже и так = 0) то выводится "query returned no result". вот тут у меня в голове начинает брезжить что-то похожее на решение проблемы.
Открываю администратора источников данных ODBC, смотрю настройки своего источника данных (connector/ODBC 3.51.27 Configure Data Source Name).
Среди всех прочих нахожу такую "Return Matching Rows". Описание для данной настройки следующее:
The client can`t handle that MySQL returns the true value of affected rows. If this flag is set, MySQL returns ``found rows" instead. You must have MySQL 3.21.14 or newer to get this work.

Ну собственно и ставлю эту галочку. И ВСЁ ЗАРАБОТАЛО КАК НАДО!!!!!! Покрайней мере я очень расчитываю, что ничего не проглядел ))))
28 окт 09, 11:27    [7848492]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить