:: Архив конференции по VFP до 2005 года
Re: CursorAdapter - обработка ошибок
PaulWist
Автор

Сообщений: 14625
Дата регистрации: 01.04.2004
Привет, Aijik.

Попробую рассказать своё видение вопроса и как сам реализую, для тебя , видимо это не будет откровением, тем не менее выслушаю любую критику.

Давай рассмотрим предложенную тобой схему на примере таблиц мастер-детали с использованием RV (есс-но параметризированных)

Допущения

- RV_мастер в качестве параметра принимает ID int Idntity() PK
- RV_детали имеют ID FK на мастер и тоже имеет параметр ID мастер таблицы
- не рассматриваем триггеры на обе таблицы
- RV не модифицируемые

(на самом деле с RV не работаю, по этому поводу даже бодался с уважаемыми Igor Korolyov,Владимир Максимов, в итоге пришли ко мнению что это дело вкуса, тем не менее давай на них)

Цитата:
1. Пользователь добавил запись

а) Что делаем - открываем RV_мастер , RV_детали NODATA

Цитата:
2. Наредактировал ее

б) Делаем INSERT и туда и туда

Цитата:
3. Скинул изменения (успешно)

в) Что это значит в нашем случае
- надо создать SQLCommand_строку на основе RV_мастер , RV_детали , вложить в транзакцию и запихнуть это на сервер
- в этом же batch-e надо вернуть ID мастер таблицы

Цитата:
(- не обновляет ничего - )

г) поскольку, обновление прошло успешно можно и не обновлять (если мы не предпринимаем дальнейших действий с данными) , в противном случае достаточно выполнит REQUERY(RV_мастер , RV_детали ) с PK&FK

Цитата:
4. Удалил ее же

д) просто помечаем записи RV как удаленные

Цитата:
5. И только теперь скидывает

е) здесь возможно 2 варианта
- Batch SQLCommand с возвратом ошибки
- либо RV сказать апдейтабл и TABLEUPDATE (в этом случае другой геморой возникает с перводом транзакций соединения в ручной режим)

PS схема такая.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: CursorAdapter - обработка ошибок
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
PaulWist


Цитата:
- RV_мастер в качестве параметра принимает ID int Idntity() PK
Цитата:
Цитата:
1. Пользователь добавил запись

а) Что делаем - открываем RV_мастер , RV_детали NODATA
Пользователь добавил запись в мастер-таблицу (новый документ)?
Т.е. ты хотел поставить в последнем предложении не запятую, а "и", так? И RV_мастер NODATA и RV_детали NODATA?
Цитата:
Цитата:
2. Наредактировал ее

б) Делаем INSERT и туда и туда
А второе "туда" зачем?


Цитата:
Цитата:
3. Скинул изменения (успешно)

в) Что это значит в нашем случае
- надо создать SQLCommand_строку на основе RV_мастер , RV_детали , вложить в транзакцию и запихнуть это на сервер
- в этом же batch-e надо вернуть ID мастер таблицы
Что в качестве внешнего ключа RV_детали на мастер (давай называть его MasterID) было было передано на сервер?. Ведь первичный ключ новой записи Мастера еще не известен - мы не запрашивали его еще

Цитата:
Цитата:
4. Удалил ее же

д) просто помечаем записи RV как удаленные
Тут важен не факт именно удаления, а по-сути факт хоть какой-нибудь модификации, ибо основная проблема в отсутсвии связи <PK на сервере>-<PK на клиенте> при сбросе изменений


Цитата:
Цитата:
5. И только теперь скидывает

е) здесь возможно 2 варианта
- Batch SQLCommand с возвратом ошибки
- либо RV сказать апдейтабл и TABLEUPDATE (в этом случае другой геморой возникает с перводом транзакций соединения в ручной режим)

Читаю и чувствую что меня тоже придется придется "лечить", ибо ни фига не понятно ;)



[i][small][color=Gray]Отредактировано (22.12.04 11:16)


------------------
Ratings: 0 negative/0 positive
Re: CursorAdapter - обработка ошибок
PaulWist
Автор

Сообщений: 14625
Дата регистрации: 01.04.2004
Aijik

Цитата:
Читаю и чувствую что меня тоже придется придется "лечить", ибо ни фига не понятно

Перечитал, отвлеченно, сам своё послание и мне тоже стало непонятно

Давай, в деталях

1) Наши VIEW

RV_мастер AS Select * FROM MASTER WHERE ID = ?IDENTITY
RV_детали AS Select * FROM DETAILS WHERE MasterID = ?RV_мастер.ID

2) Открываем VIEW, предполагаем , что вводим новый документ (с редактированием старого вроде понятно - все ID есть)

USE RV_мастер IN 0 NODATA
USE RV_детали IN 0 NODATA

3) Наредактировали оба или только мастер VIEW

Цитата:
А второе "туда" зачем?

Второе туда - это в детали, можно детали не заполнять (ну мало ли - шапка есть а содержание решили ввести потом)

INSERT INTO RV_мастер.....
INSERT INTO RV_детали.....

Цитата:
Что в качестве внешнего ключа RV_детали на мастер (давай называть его MasterID) было было передано на сервер?. Ведь первичный ключ новой записи Мастера еще не известен - мы не запрашивали его еще

Пока работаем с локальными курсорами, и ес-но RV_мастер.ID & RV_детали.MasterID у нас NULL, ну или DEFAULT значение наших RV.

4) Теперь создаем пакет обновления, например

Lstring = " BEGIN TRANSACTION "
Lstring = Lstring + " INSERT INTO MASTER (FIELDMaster) VALUES (?RV_мастер.FIELDMaster) "
Lstring = Lstring + " DECLARE @IDEN int "
Lstring = Lstring + " SET @IDEN = SCOPE_IDENTITY()"
SELECT RV_детали
SCAN
Lstring = Lstring + " INSERT INTO DETAILS (MasterID,FIELDDetails) VALUES (@IDEN,?RV_детали.FIELDDetails) "
ENDSCAN
Lstring = Lstring + " if @@error <> 0 ROLLBACK ELSE COMMIT TRANS "
* ну и RAISERROR нужно до кучи к ROLLBACK
Lstring = Lstring + " SELECT @IDEN"
SQLEXEC(..., Lstring, "IDENCursor")

т.е. сформировали пакет - отправили на сервер - получили значение PK для RV_мастер (я реализую 'nj по другому, но принцип такой же)

Теперь, можно и оба RV обновить, поскольку PK известен, соответственно можно проводить любые манипуляции с RV_мастер и RV_детали (добавлять, удалять, модифицировать)

Следующий этап - как сохранить , то что мы натворили после получения PK, здесь два пути

- TABLEUPDATE на оба VIEW
- или составить batch и SQLExec-ом запихать на сервер.

PS перечитал сам, вроде понятно ;)




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: CursorAdapter - обработка ошибок
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
Ну вот.... похоже, что "лечение" все-таки удастся пока оттянуть Схема понятна. Редактируется и RV_мастер и RV_детали сколько угодно вообще не заботясь о MasterID, а получение последнего и увязка с FK деталей делается внутри батча, в котором все окружено транзакцией + последующее REQUERY по вернувшемуся @IDEN
Ratings: 0 negative/0 positive
Re: CursorAdapter - обработка ошибок
PaulWist
Автор

Сообщений: 14625
Дата регистрации: 01.04.2004
Aijik

Цитата:
Ну вот.... похоже, что "лечение" все-таки удастся пока оттянуть

"Лечить" - это относилось ко мне и если это так, то что под этим подразумевается.

Цитата:
Схема понятна.

Хорошо. Косноязычие - не порок, а болезнь, кот. исправляется общением.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: CursorAdapter - обработка ошибок
Aijik

Сообщений: 2145
Откуда: Ростов-на-Дону
Дата регистрации: 08.01.2002
Цитата:
"Лечить" - это относилось ко мне и если это так, то что под этим подразумевается.
Это относилось ко мне самому ;) Это была шутка по поводу шутки:

Цитата:
Случай тяжелый. Можно сказать, клинический. Но мы будем его лечить
....
Пациент, все-еще сопротивляется правильному лечению
(с) by Владимир Максимов

Цитата:
Цитата:
Схема понятна.

Хорошо. Косноязычие - не порок, а болезнь, кот. исправляется общением.
Да не... не в косноязычии дело, просто в первом посте ты писал о своем, а я читал о своем. В результате, как обычно и бывает в таких случаях, возник небольшой мисандерстэнд



[i][small][color=Gray]Отредактировано (22.12.04 13:13)


------------------
Ratings: 0 negative/0 positive


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

On-line: 3 (Гостей: 3)

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