This record changed by another station
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Andrew Listiev
- Активист
- Сообщения: 166
- Зарегистрирован: 07 Июль 2005, 11:16
- Откуда: Латвия, Рига
This record changed by another station
Привет всем!
На Кларионе уже не пишу, но так случилось что надо помочь выявить почему появляется данная ошибка в старом проекте. База данных MS SQL 2005. Шаблоны ABC. Я уже решал подобную проблему, но хоть убейте не помню в чём причина возникновения данной ошибки.
Заранее спасибо!
На Кларионе уже не пишу, но так случилось что надо помочь выявить почему появляется данная ошибка в старом проекте. База данных MS SQL 2005. Шаблоны ABC. Я уже решал подобную проблему, но хоть убейте не помню в чём причина возникновения данной ошибки.
Заранее спасибо!
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Re: This record changed by another station
Добрый день!
Бывает - если есть в таблице REAL данные.
Оно по разному хранит целые. 1 может быть как 0.9999999 или 1.0000000000
и т.д.
Меняем на Decimal.
Алексей
Бывает - если есть в таблице REAL данные.
Оно по разному хранит целые. 1 может быть как 0.9999999 или 1.0000000000
и т.д.
Меняем на Decimal.
Алексей
- Andrew Listiev
- Активист
- Сообщения: 166
- Зарегистрирован: 07 Июль 2005, 11:16
- Откуда: Латвия, Рига
Re: This record changed by another station
К сожалению нету поля с таким типом данных:
Код: Выделить всё
CardFlow FILE,DRIVER('ODBC'),OWNER(ConnectionString),NAME('dbo.CardFlow'),PRE(CardFlow),BINDABLE,THREAD !
ByGroupName KEY(CardFlow:GroupName),OPT !
ByUrgentStatusDate KEY(-CardFlow:Urgent,CardFlow:CardFlowStatusID,CardFlow:Date),OPT !
PK_CardFlow KEY(CardFlow:ID),PRIMARY !
FK_CardFlow_CardType KEY(CardFlow:CardTypeID),DUP !
FK_CardFlow_CardFlowStatus KEY(CardFlow:CardFlowStatusID),DUP !
Record RECORD,PRE()
ID LONG,NAME('ID') !
CardTypeID LONG,NAME('CardTypeID') !
CardFlowStatusID LONG,NAME('CardFlowStatusID') !
Date STRING(8),NAME('Date') !
Date_GROUP GROUP,OVER(Date) !
Date_DATE DATE !
Date_TIME TIME !
END !
ClientCode CSTRING(7),NAME('ClientCode') !
FirstName CSTRING(33),NAME('FirstName') !
LastName CSTRING(33),NAME('LastName') !
Urgent BYTE,NAME('Urgent') !
GroupName CSTRING(26),NAME('GroupName') !
UserName CSTRING(33),NAME('UserName') !
Description CSTRING(257),NAME('Description') !
END
END
- Дед Пахом
- Старичок
- Сообщения: 3134
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Re: This record changed by another station
Сталкивался. Если в таблице есть поле типа datetime, то велика вероятность, что из-за него. Clarion сравнивает "старый" буфер записи с "новым" и находит, что они не совпадают (там что-то с округлением в datetime) и решает, что запись изменили с другой машины.
Насколько помню, мы решали это триггером, отсекая миллисекунды.
Насколько помню, мы решали это триггером, отсекая миллисекунды.
С уважением, ДП
- Andrew Listiev
- Активист
- Сообщения: 166
- Зарегистрирован: 07 Июль 2005, 11:16
- Откуда: Латвия, Рига
Re: This record changed by another station
Ага, спасибо, начинаю вспоминать!!! Trace показывает что миллисекунды не изменяются, хотя он почему-то показывает только 2 знака миллисекунд. Кстати только что вычитал: так как в Clarion при изменении записи через стандартную форму watch делается на все поля в записи, а непосредственно при записи проверяется значения всех полей. Так вот в Clarion 8 есть возможность делать watch только по тем полям, которые нам необходимы.
В общем спасибо, вы дали мне таблетку ноотропила.
upd. Оказывается такая возможность была и в 6ке. Напрочь всё позабыл
В общем спасибо, вы дали мне таблетку ноотропила.
upd. Оказывается такая возможность была и в 6ке. Напрочь всё позабыл
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Re: This record changed by another station
добрый день!
Были и еще варианты, вызывающие такое сообщение!
когда сами неявно портим буфер записи.
например, когда присваиваем структуру структуре ( или передаем подпрограмме структуру). И структуры имеют разные длины.
это бывает, когда меняешь длину элемента структуры , забыв скорректировать этот элемент в другой структуре.
или массив изменили, но это ловится быстро включением проверки выхода за пределы массива.
Алексей
Были и еще варианты, вызывающие такое сообщение!
когда сами неявно портим буфер записи.
например, когда присваиваем структуру структуре ( или передаем подпрограмме структуру). И структуры имеют разные длины.
это бывает, когда меняешь длину элемента структуры , забыв скорректировать этот элемент в другой структуре.
или массив изменили, но это ловится быстро включением проверки выхода за пределы массива.
Алексей
Re: This record changed by another station
Небольшое уточнение по DATETIME.
MS SQL хранит время, условно говоря, с точностью до миллисекунд (до 1/1000 секунды).
Почему "условно говоря"? Потому что, если совсем быть точным, то до 3/1000. По крайней мере в х86-й архитектуре. Но это сейчас не важно -- в любом случае 3 знака.
Кларион время хранит с точностью до сотых долей секунды.
Поэтому, если вы используете для сохранения времени только кларионовскую функцию CLOCK(), то коллизии не будет.
Коллизии также не будет, если вы используете sql-функцию GETDATE(), но при этом никогда не пересохраняете такую запись в Кларионе.
Возникнет же она в том случае, если вы пользуетесь sql-функцией GETDATE() при создании/сохранении записи в БД да ещё и пытаетесь открыть такую запись формой с последующим сохранением. Тогда Кларион при открытии формы преобразует время в свой формат с округлением до сотых и откроет форму, но при попытке сохранить такую запись Кларион через SQL сравнит это округлённое значение с исходным и обнаружит разницу, о чём собственно и сообщит сообщением "This record changed by another station".
Если вам нужно использовать и кларионовское присваивание, и sql-ное попеременно, то здесь может помочь sql-ный триггер/хранимая процедура/скалярная функция (выбор за вами) с усечением тысячных долей, например вот таким варварским способом:
MS SQL хранит время, условно говоря, с точностью до миллисекунд (до 1/1000 секунды).
Почему "условно говоря"? Потому что, если совсем быть точным, то до 3/1000. По крайней мере в х86-й архитектуре. Но это сейчас не важно -- в любом случае 3 знака.
Кларион время хранит с точностью до сотых долей секунды.
Поэтому, если вы используете для сохранения времени только кларионовскую функцию CLOCK(), то коллизии не будет.
Коллизии также не будет, если вы используете sql-функцию GETDATE(), но при этом никогда не пересохраняете такую запись в Кларионе.
Возникнет же она в том случае, если вы пользуетесь sql-функцией GETDATE() при создании/сохранении записи в БД да ещё и пытаетесь открыть такую запись формой с последующим сохранением. Тогда Кларион при открытии формы преобразует время в свой формат с округлением до сотых и откроет форму, но при попытке сохранить такую запись Кларион через SQL сравнит это округлённое значение с исходным и обнаружит разницу, о чём собственно и сообщит сообщением "This record changed by another station".
Если вам нужно использовать и кларионовское присваивание, и sql-ное попеременно, то здесь может помочь sql-ный триггер/хранимая процедура/скалярная функция (выбор за вами) с усечением тысячных долей, например вот таким варварским способом:
Код: Выделить всё
dt = dateadd(millisecond,0-datepart(millisecond,GETDATE()),GETDATE())
Последний раз редактировалось Shur 05 Декабрь 2012, 14:58, всего редактировалось 2 раза.
Re: This record changed by another station
Недавно был случай. В текстовом реквизите, являющемся элементом ключа пользователь использовал букву я. Также выдавалось это сообщение, плюс попытка преобразовать данные из текста в целое
Любить и обещать ничего не стоит