CW & MSSQL

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

CW & MSSQL

Сообщение kreator »

Не знаю, как работает MAV, но в стандартных шаблонах при редактировании идёт отслеживание изменений текущей записи в сети. Если одну запись пытаются изменить одновременно несколько пользователей, то пройдёт первое изменение, а другим будет сообщение - "мол, запись уже кто-то изменил", и эти изменения отобразятся в форме. Очень удобно.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

CW & MSSQL

Сообщение Admin »

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

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

MAVROLLBACK 
RETURN TRUE
Прекрасно в своей простоте.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

CW & MSSQL

Сообщение 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

Т.е. по коду понятно, где транзакция открылась и где закрылась.
Где это все в Кларе закопано ?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

CW & MSSQL

Сообщение Yufil »

Никто не мешает пользоваться транзакциями через Prop:SQL
File{Prop:SQL} = 'Begin Transaction'
File{Prop:SQL} = 'Rollback Transaсtion'

Ну и стоит, наверное, посмотреть на результат функций FileErrorCode() и FileError() , чтобы должным образом среагировать на ошибку.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

CW & MSSQL

Сообщение kreator »

Может, у Клаши всё это на уровне драйвера, а может, вообще ничего нет. Но я, честно, не понимаю, зачем дополнительно управлять транзакциями самому. В каких-нибудь Studio'ях мы этого не делаем же. Сервер сам как-то это разруливает. Я сейчас плотно сижу на sql.ru в ветке FB. Тоже интересно. Периодически появляются TC с вопросами "а вот с транзакциями что делать?". Разработчики отвечают обычно так. "Если Вам нужен массовый, скажем, апдейт и во время этого апдейта нежелательно другим пользователям видеть изменения сразу, то используйте операторы работы с транзакциями. Иначе, сервер сам это дело отрегулирует.". Наверно, Андрей Мялин внятно бы рассказал, что у него внутри MAVCommit, MAVRollback... Я всё же склоняюсь, что Коммиты и Ролбэки прописаны на уровне драйверов. А вот явное управление транзакциями, как я посмотрю, и в MAV нет.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

CW & MSSQL

Сообщение Admin »

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

P.S. Еще лучше смотреть через https://archive.codeplex.com/?p=expressprofiler
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

CW & MSSQL

Сообщение PavelNK »

Сервер сам ничего не разруливает, т.к. он не знает и не может знать логику работы вашей программы.
Существуют неявные транзакции, в рамках одного оператора, т.е вы одним оператором вставляете или изменяете несколько записей.
И явные транзакции, когда ВЫ оформляете несколько операторов транзакцией. Если операторов начала-завершения транзакции нет, то и транзакций(неявных) у вас будет по кол-ву операторов. Но если у вас несколько связанных и согласованных таблиц, запись (изменение) в которые должны идти вместе, а ошибка при одной операции должна вести к откату уже сделанных, то будьте любезны BEGIN TRAN-COMMIT TRAN(ROLLBACK).
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

CW & MSSQL

Сообщение gromov »

О чем и речь. Откуда серверу знать, что у пограммера на уме))) Пока вижу один путь, вставлять свой код ДО и если ошибка - откат транзакции и запрет на выполнение Клашиного кода.
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

CW & MSSQL

Сообщение 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.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

CW & MSSQL

Сообщение 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 наверняка тоже правильно работает.
We are hard at work… for you. :)
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

CW & MSSQL

Сообщение gromov »

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

CW & MSSQL

Сообщение Дед Пахом »

gromov писал(а): 04 Апрель 2018, 22:03Итог - на одну операцию изменения таблицы две операции записи. Накладно, однако.
Если ЭТО накладно, то как назвать бровз всей таблицы без фильтрации?
С уважением, ДП
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

CW & MSSQL

Сообщение gromov »

Так и назвать бровз всей таблицы без фильтрации)))
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

CW & MSSQL

Сообщение kreator »

Я всё же не пойму - зачем руками делать autoincrement? Тем более перед TakeCompleted()? Сервер сам это сделает во время insert. А в MS SQL ещё можно сгенерить GUID, что совсем правильно.
We are hard at work… for you. :)
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

CW & MSSQL

Сообщение gromov »

No comments
Ответить