:: Visual Foxpro, Foxpro for DOS
Изменение данных в удаленной БД
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
Здравствуйте
Упрощенная по максимуму ситуация такова
FoxPro и MySQL
В БД есть 2 таблицы (~ по 1000 записей):
tab1:id1, id_product, quantity1, ....
Tab2:id2, id_product, quantity2, ....
C помощью CAD получаю их курсоры, обрабатываю и в результате обработки получаю 3-й курсор, такого типа:
curs3:id_product, quantity_to_correct (количество для корректировки, может быть с + и - )(50-100 записей)
Стоит задача:
1. В каждой из этих двух таблиц произвести корректировку поля quantity на величину quantity_to_correct по совпадению id_product
2. Таблицы динамические, т.е. данные могут изменяться другими процессами, но количество для корректировки от этих изменений не зависит
3. Нельзя допустить, чтобы quantity1 или quantity2 стало <0. В такой ситуации изменения не вносить, а получить список таких id_product для принятия решения что делать с ними человеком (Можно не отдельным списком, а добавлением в curs3 поля типа result

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



Исправлено 1 раз(а). Последнее : Sandwich, 16.08.18 08:18
Ratings: 0 negative/0 positive
Re: Изменение данных в удаленной БД
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
Придумал такую схему
LOCAL lnConnHandle, lcExecString, lnCount1, lnCount2
lnConnHandle = SQLCONNECT('MyFoxSQLNT', 'myUserID', 'myPassword')
SELECT cursor1
SCAN
SQLSETPROP(lnConnHandle , "Transactions", 2)
lcExecString = "update table1 set quantity1 = quantity1 + " + cursor1.quantity_to_correct + " where id_product = " + ;
cursor1.id_product + " and quantity1 + "+ cursor1.quantity_to_correct + " > 0 "
SQLEXEC(lnConnHandle , lcExecString)
lnCount1 = { как-то узнать количество затронутых строк после запроса 1}
lcExecString = "update table2 set quantity2 = quantity2 + " + cursor1.quantity_to_correct + " where id_product = " + ;
cursor1.id_product + " and quantity2 + "+ cursor1.quantity_to_correct + " > 0 "
SQLEXEC(lnConnHandle , lcExecString)
lnCount2 = { как-то узнать количество затронутых строк после запроса 2}
IF lnCount1 = 1 AND lnCount2 = 1
SQLCOMMIT(lnConnHandle)
SELECT cursor1
replace result WITH .t.
ELSE
SQLROLLBACK(lnConnHandle)
ENDIF
ENDSCAN
SQLDISCONNECT(lnConnHandle)
Вопрос 1
работоспособна ли эта схема?
Вопрос 2
как получить данные в скобках {...} ?
Ratings: 0 negative/0 positive
Re: Изменение данных в удаленной БД
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
И что мешает делать нужную корректировку в курсорах? А затем все изменения на сервер средствами самих CAD. Зачем сразу на сервер?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Изменение данных в удаленной БД
Sandwich
Автор

Сообщений: 137
Дата регистрации: 08.02.2014
ssa
И что мешает делать нужную корректировку в курсорах? А затем все изменения на сервер средствами самих CAD. Зачем сразу на сервер?

Потому что нужно не испавить значение в таблице, а откорректировать
Поясню на примере
1. получил курсор, проверил нужное поле, оно например 5
2. выяснил, что число должно быть 6 (на момент получения курсора)
3. нужно внести исправление 5 на 6.
4. если в момент, пока я выяснял значение изменилось другим пользователем с 5 на 8, то при попытке перезаписать 8 на 6 появится ошибка совместного изменения данных.
5. НО, мне не важно какое значение в данный момент в этом поле ("моё старое" или "чужое новое"). Мне нужно к полю сделать "+1" к полю (6-5=1 см. п. 3)
6. важно только то, что бы оно не стало отрицательным (в случае если корректировка "-1")



Исправлено 1 раз(а). Последнее : Sandwich, 16.08.18 12:33
Ratings: 0 negative/0 positive
Re: Изменение данных в удаленной БД
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Sandwich
1. получил курсор, проверил нужное поле, оно например 5
2. выяснил, что число должно быть 6 (на момент получения курсора)
3. нужно внести исправление 5 на 6.
4. если в момент, пока я выяснял значение изменилось другим пользователем с 5 на 8, то при попытке перезаписать 8 на 6 появится ошибка совместного изменения данных.
5. НО, мне не важно какое значение в данный момент в этом поле ("моё старое" или "чужое новое"). Мне нужно к полю сделать "+1" к полю (6-5=1 см. п. 3)
6. важно только то, что бы оно не стало отрицательным (в случае если корректировка "-1")

Поправьте если не так
1. получил курсор, проверил нужное поле, оно например 5
2. выяснил, что число должно быть 6 (на момент получения курсора)
3. нужно внести исправление 5 на 6. +1
4. Непонятно, похоже просто лирика)
5. Добавляю к полю разницу (п.3)
6. важно только то, что бы оно не стало отрицательным (в случае если корректировка "-1")

тогда
п.5 Может триггер, что бы <0 не было? (для транзакций, что бы в момент изменения все просчитывалось)

ssa
И что мешает делать нужную корректировку в курсорах? А затем все изменения на сервер средствами самих CAD. Зачем сразу на сервер?
+100500
Поскольку всего 1000 записей, по одной, мгновенно пролетит.


------------------
Ratings: 0 negative/0 positive
Re: Изменение данных в удаленной БД
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Sandwich
работоспособна ли эта схема?
Да. Но стоит вместо конкатенации строк при формировании строки запроса использовать параметры. Типа:
lcExecString = "update table1 set quantity1 = quantity1 + ?cursor1.quantity_to_correct " + ;
"where id_product = ?cursor1.id_product and quantity1 + ?cursor1.quantity_to_correct > 0 "
Sandwich
как получить данные в скобках {...} ?
4 параметр SQLEXEC - массив aCountInfo с "числом затронутых записей" для каждой SQL команды внутри строки посланной этим SQLEXEC (т.к. вполне можно послать и батч, т.е. сразу несколько SQL команд за раз).

Вообще если речь про MSSQL, то наверное лучше было бы сделать на сервере ХП реализующую данную логику, а из фокса просто эту ХП и вызывать...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Изменение данных в удаленной БД
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Я бы смотрел в сторону ХП - (но не работал со скулем - не знаю как там видимость транзакций) ... и да, триггеры то никто не отменял.

Короче - голосую за ХП

upd: ТС указал сервер - MySQL ... там вроде тока в последних версиях ХП-ки имеются - ну тогда хотяб тригеры нужные повесить и транзакцией вручную управлять в фоксе - чтоб полностью откатить ежели что не так



Исправлено 3 раз(а). Последнее : AndyNigmatec, 16.08.18 13:55
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 Каратаев DmitryKn  (Гостей: 30)

© 2000-2024 Fox Club 
Яндекс.Метрика