This record changed by another station

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

This record changed by another station

Сообщение Andrew Listiev »

Привет всем!

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

Заранее спасибо!
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: This record changed by another station

Сообщение Алексей- Софт-Центр »

Добрый день!
Бывает - если есть в таблице REAL данные.
Оно по разному хранит целые. 1 может быть как 0.9999999 или 1.0000000000
и т.д.
Меняем на Decimal.

Алексей
Аватара пользователя
Andrew Listiev
Активист
Сообщения: 166
Зарегистрирован: 07 Июль 2005, 11:16
Откуда: Латвия, Рига

Re: This record changed by another station

Сообщение 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                       
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 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

Сообщение Andrew Listiev »

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

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

upd. Оказывается такая возможность была и в 6ке. Напрочь всё позабыл :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: This record changed by another station

Сообщение Алексей- Софт-Центр »

добрый день!
Были и еще варианты, вызывающие такое сообщение!
когда сами неявно портим буфер записи.
например, когда присваиваем структуру структуре ( или передаем подпрограмме структуру). И структуры имеют разные длины.
это бывает, когда меняешь длину элемента структуры , забыв скорректировать этот элемент в другой структуре.
или массив изменили, но это ловится быстро включением проверки выхода за пределы массива.

Алексей
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Re: This record changed by another station

Сообщение 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())
Последний раз редактировалось Shur 05 Декабрь 2012, 14:58, всего редактировалось 2 раза.
Аватара пользователя
Артур
Ветеран
Сообщения: 329
Зарегистрирован: 01 Июнь 2006, 12:33
Откуда: Новороссийск

Re: This record changed by another station

Сообщение Артур »

Недавно был случай. В текстовом реквизите, являющемся элементом ключа пользователь использовал букву я. Также выдавалось это сообщение, плюс попытка преобразовать данные из текста в целое
Любить и обещать ничего не стоит
Ответить