Страница 2 из 2

CW & MSSQL

Добавлено: 01 Апрель 2018, 16:59
kreator
Не знаю, как работает MAV, но в стандартных шаблонах при редактировании идёт отслеживание изменений текущей записи в сети. Если одну запись пытаются изменить одновременно несколько пользователей, то пройдёт первое изменение, а другим будет сообщение - "мол, запись уже кто-то изменил", и эти изменения отобразятся в форме. Очень удобно.

CW & MSSQL

Добавлено: 02 Апрель 2018, 1:39
Admin
kreator писал(а): 01 Апрель 2018, 16:59Не знаю, как работает MAV
MAV работает аналогично.
1.Начинается транзакция
2.Изменение данных
3.Фиксация транзакции
Если данные менялись кем то другим с момента открытия формы - откат транзакции и возврат из метода.
Между пунктами 1 и 3 вы также можете изменять другие таблицы связанные с основной таблицей формы.
Если что то не записывается (ошибка, проверка = false и т.д.) делаем:

Код: Выделить всё

MAVROLLBACK 
RETURN TRUE
Прекрасно в своей простоте.

CW & MSSQL

Добавлено: 02 Апрель 2018, 19:08
gromov
Согласен. Так и делаю. Но как дело обстоит в MAV:
MAVLOGOUT
IF PARENT.Completed()
RETURN 1
END
! свой код
Completed# = False
вносим изменения в таблицы и если где-то что-то не так
Completed# = True
...
IF Completed#
RETURN 1
END
! далее код MAV
MAVCOMMIT
IF SELF.Request ~= DeleteRecord
IF MAVGET(Table)
MAVSHOWERROR
END
END
SELF.Response = RequestCompleted

Т.е. по коду понятно, где транзакция открылась и где закрылась.
Где это все в Кларе закопано ?

CW & MSSQL

Добавлено: 02 Апрель 2018, 22:26
Yufil
Никто не мешает пользоваться транзакциями через Prop:SQL
File{Prop:SQL} = 'Begin Transaction'
File{Prop:SQL} = 'Rollback Transaсtion'

Ну и стоит, наверное, посмотреть на результат функций FileErrorCode() и FileError() , чтобы должным образом среагировать на ошибку.

CW & MSSQL

Добавлено: 02 Апрель 2018, 23:58
kreator
Может, у Клаши всё это на уровне драйвера, а может, вообще ничего нет. Но я, честно, не понимаю, зачем дополнительно управлять транзакциями самому. В каких-нибудь Studio'ях мы этого не делаем же. Сервер сам как-то это разруливает. Я сейчас плотно сижу на sql.ru в ветке FB. Тоже интересно. Периодически появляются TC с вопросами "а вот с транзакциями что делать?". Разработчики отвечают обычно так. "Если Вам нужен массовый, скажем, апдейт и во время этого апдейта нежелательно другим пользователям видеть изменения сразу, то используйте операторы работы с транзакциями. Иначе, сервер сам это дело отрегулирует.". Наверно, Андрей Мялин внятно бы рассказал, что у него внутри MAVCommit, MAVRollback... Я всё же склоняюсь, что Коммиты и Ролбэки прописаны на уровне драйверов. А вот явное управление транзакциями, как я посмотрю, и в MAV нет.

CW & MSSQL

Добавлено: 03 Апрель 2018, 2:15
Admin
kreator писал(а): 02 Апрель 2018, 23:58Наверно, Андрей Мялин внятно бы рассказал, что у него внутри MAVCommit, MAVRollback...
Включите в MAV логирование (через mavtrace.exe) и смотрите.

P.S. Еще лучше смотреть через https://archive.codeplex.com/?p=expressprofiler

CW & MSSQL

Добавлено: 03 Апрель 2018, 6:35
PavelNK
Сервер сам ничего не разруливает, т.к. он не знает и не может знать логику работы вашей программы.
Существуют неявные транзакции, в рамках одного оператора, т.е вы одним оператором вставляете или изменяете несколько записей.
И явные транзакции, когда ВЫ оформляете несколько операторов транзакцией. Если операторов начала-завершения транзакции нет, то и транзакций(неявных) у вас будет по кол-ву операторов. Но если у вас несколько связанных и согласованных таблиц, запись (изменение) в которые должны идти вместе, а ошибка при одной операции должна вести к откату уже сделанных, то будьте любезны BEGIN TRAN-COMMIT TRAN(ROLLBACK).

CW & MSSQL

Добавлено: 03 Апрель 2018, 18:12
gromov
О чем и речь. Откуда серверу знать, что у пограммера на уме))) Пока вижу один путь, вставлять свой код ДО и если ошибка - откат транзакции и запрет на выполнение Клашиного кода.

CW & MSSQL

Добавлено: 03 Апрель 2018, 22:17
gromov
Итак. Насколько мне позволил узнать мой отвратительный английский, за все отвечает метод TakeCompleted.
Заводим переменную-флаг всегда равную 0. и делаем так:
IF Flag
ReturnValue = PARENT.TakeCompleted()
END
ReturnValue = Level:Fatal
Казалось бы все нормально. Увы, в таблице появляется запись. Пустая (все введенные поля очищаются), непустое только ключевое поле. Кто виноват ? Первое, что пришло на ум - AUTONUM. Убрал, сделал автоинкремент вручную - все Ок !
Кстати конструкция

Table{Prop:SQL} = 'Begin Transaction'
ReturnValue = PARENT.TakeCompleted()
Table{Prop:SQL} = 'Rollback Transaction'

отрабатывает нормально. Но, только если ключ не AUTONUM.

CW & MSSQL

Добавлено: 04 Апрель 2018, 14:22
kreator
gromov писал(а): 03 Апрель 2018, 22:17 Table{Prop:SQL} = 'Begin Transaction'
ReturnValue = PARENT.TakeCompleted()
Table{Prop:SQL} = 'Rollback Transaction'
На мой взгляд это лишнее. А зачем в словаре ключ с autonum? Всё нужно делать на сервере. А вообще запись добавляется в методе PrimeAutoInc, если есть такие ключи. Кстати, можете попробовать настроить поведение таких ключей. Есть свойства PROP:ServerAutoInc, IsIdentity. Смысл вот в чём. На стороне сервера мы задаём обычный первичный ключ. А в словаре снимаем галку "autonum". Но при этом запись будет появляться только после нажатия в форме на кнопку "OK". А иногда есть желание видеть эту запись при входе в форму или знать хотя бы значение id-шника (например, чтобы добавлять дочерние записи). Вот вышеназванные свойства эмулируют такое поведение, типа как привыкли работать с файл-серверной моделью. К сожалению, обычный ODBC-драйвер глючит с этими свойствами. А вот драйвер SQLAnywhere всё хорошо отрабатывает. Драйвер MSSQL наверняка тоже правильно работает.

CW & MSSQL

Добавлено: 04 Апрель 2018, 22:03
gromov
Мы говорим каждый о своем. Мне пох, на какой стороне выполняется операция. Я ХОЧУ УПРАВЛЯТЬ ТРАНЗАКЦИЕЙ. И, что это не моя прихоть очень хорошо описал PavelNK. Теперь я знаю, как это делается. Предыдущий пост об этом. Может кому-то будет интересно.
Как работает стандартный Insert с (Autonum)
1) Инкремент ключевого поля
2) Добавление пустой записи (чтоб никто не опередил)
3) Открытие формы ввода, заполнение полей, Ок
4) Update добавленной записи
Итог - на одну операцию изменения таблицы две операции записи. Накладно, однако. Поэтому, лучше ручками. И инкремент делать непосредственно перед вызовом TakeCompleted(), а то могут опередить ))).

CW & MSSQL

Добавлено: 04 Апрель 2018, 22:14
Дед Пахом
gromov писал(а): 04 Апрель 2018, 22:03Итог - на одну операцию изменения таблицы две операции записи. Накладно, однако.
Если ЭТО накладно, то как назвать бровз всей таблицы без фильтрации?

CW & MSSQL

Добавлено: 04 Апрель 2018, 22:21
gromov
Так и назвать бровз всей таблицы без фильтрации)))

CW & MSSQL

Добавлено: 05 Апрель 2018, 11:42
kreator
Я всё же не пойму - зачем руками делать autoincrement? Тем более перед TakeCompleted()? Сервер сам это сделает во время insert. А в MS SQL ещё можно сгенерить GUID, что совсем правильно.

CW & MSSQL

Добавлено: 05 Апрель 2018, 19:28
gromov
No comments