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

This record changed by another station

Добавлено: 09 Ноябрь 2012, 12:50
Andrew Listiev
Привет всем!

На Кларионе уже не пишу, но так случилось что надо помочь выявить почему появляется данная ошибка в старом проекте. База данных MS SQL 2005. Шаблоны ABC. Я уже решал подобную проблему, но хоть убейте не помню в чём причина возникновения данной ошибки.

Заранее спасибо!

Re: This record changed by another station

Добавлено: 09 Ноябрь 2012, 13:58
Алексей- Софт-Центр
Добрый день!
Бывает - если есть в таблице REAL данные.
Оно по разному хранит целые. 1 может быть как 0.9999999 или 1.0000000000
и т.д.
Меняем на Decimal.

Алексей

Re: This record changed by another station

Добавлено: 09 Ноябрь 2012, 14:18
Andrew Listiev
К сожалению нету поля с таким типом данных:

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

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                       

Re: This record changed by another station

Добавлено: 09 Ноябрь 2012, 15:12
Дед Пахом
Сталкивался. Если в таблице есть поле типа datetime, то велика вероятность, что из-за него. Clarion сравнивает "старый" буфер записи с "новым" и находит, что они не совпадают (там что-то с округлением в datetime) и решает, что запись изменили с другой машины.
Насколько помню, мы решали это триггером, отсекая миллисекунды.

Re: This record changed by another station

Добавлено: 09 Ноябрь 2012, 16:23
Andrew Listiev
Ага, спасибо, начинаю вспоминать!!! Trace показывает что миллисекунды не изменяются, хотя он почему-то показывает только 2 знака миллисекунд. Кстати только что вычитал: так как в Clarion при изменении записи через стандартную форму watch делается на все поля в записи, а непосредственно при записи проверяется значения всех полей. Так вот в Clarion 8 есть возможность делать watch только по тем полям, которые нам необходимы.

В общем спасибо, вы дали мне таблетку ноотропила. :)

upd. Оказывается такая возможность была и в 6ке. Напрочь всё позабыл :)

Re: This record changed by another station

Добавлено: 11 Ноябрь 2012, 14:29
Алексей- Софт-Центр
добрый день!
Были и еще варианты, вызывающие такое сообщение!
когда сами неявно портим буфер записи.
например, когда присваиваем структуру структуре ( или передаем подпрограмме структуру). И структуры имеют разные длины.
это бывает, когда меняешь длину элемента структуры , забыв скорректировать этот элемент в другой структуре.
или массив изменили, но это ловится быстро включением проверки выхода за пределы массива.

Алексей

Re: This record changed by another station

Добавлено: 26 Ноябрь 2012, 15:25
Shur
Небольшое уточнение по DATETIME.

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())

Re: This record changed by another station

Добавлено: 05 Декабрь 2012, 10:15
Артур
Недавно был случай. В текстовом реквизите, являющемся элементом ключа пользователь использовал букву я. Также выдавалось это сообщение, плюс попытка преобразовать данные из текста в целое