Задача: взять табличку в базе и поправить запись.
Сделал словарь, импортировал таблицу, создал приложение browse-form (ABC,C5.5)
Записи в списке есть. Открываю форму, правлю поле, жму ОК , получаю:"Запись изменена с другой станции, че-то там нажмите и откатите изменения."
Лезу через Enterprise Manager - все нормально, все меняется, ничего не заблокировано.
Ключ в бровсе по строке, уникальный.
Может, кто сталкивался? А то я до сих пор только читал с MSSQL, писать не доводилось...
С уважением
Мосолов Илья
mosolov@mtbank.ru
(Добавление)
Привет
Это вполне может быть из-за полей типа datetime. Я столкнулся с тем, что, когда в форму грузится запись, datetime округляется до тысячной доли секунды, и при попытке сохранения записи дата в буфере не совпадает с датой в таблице, и драйвер думает, что запись изменили с другой станции. Я теперь поля с датой по GetDate() не инициализирую.
Михаил
трассировочку клашину на соответствующий драйвер включи и посмотри.
какая струтура таблицы в БД и какая в словаре?
Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
IRC: IRC.RINET.RU:6669, Channel #Clarion, AndrewM
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com
Resetting Parameters Statement 15633e8 Time Taken:0.00 secs
Preparing Statement 15633e8 : UPDATE dbo.CARD_CONTRACT SET "CREDIT_LIMIT" = ? WHERE "ID_CONTRACT" = ? AND "NUM_CARD" = ? AND "ID_CONTRACT_MAIN" = ? AND "ID_ACCOUNT_MAIN" = ? AND "ID_PRODUCT" = ? AND "ID_CLIENT_OWNER" = ? AND "ID_CLIENT_MAIN" = ? AND "DATE_OPEN" = ? AND "DATE_CLOSE" = ? AND .....
........
Binding ? 1 for input with C type CHAR as 3 for Statement 15633e8 Time Taken:0.00 secs
Binding ? 2 for input with C type SLONG as 4 for Statement 15633e8 Time Taken:0.00 secs
Binding ? 3 for input with C type CHAR as 12 for Statement 15633e8 Time Taken:0.00 secs
Вот.
Смущает
Binding ? 1 for input with C type CHAR as 3 for Statement 15633e8 Time Taken:0.00 secs
В то время как credit_limit(как я понимаю, поле 1) это money в базе и decimal в словаре.
Из-за это не может быть?
Честно говоря, смущает фантастическая конструкция where - все значения всех полей....
Илья Мосолов
Наверное, в словаре нет ни одного ключа с реквизитом Primary, вот и приходится искать по всем полям. Если есть ключ, однозначно идентифицирующий запись, надо у него поставить флажок Primary. А если нет, придётся создать.
---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439
(Добавление)
это правильно, это последствия использования функции WATCH(File)
Andrew Myalin
а вот что там с полями DATETIME ? имеют место быть?
это как раз правильная конструкция, проста как 2 копейки, но правильная, WHERE по содержанию всех полей прочитанной записи, если UPDATE не проходит, то это и означает что запись уже имеет другое наполнение, т е изменена с другой рабочей станции.
я ж просил струкутру таблицы в БД и в словаре!
Andrew Myalin
Да есть datetime, как не быть:
Извини, тормознул:
Код: Выделить всё
CARD_CONTRACT FILE,DRIVER('MSSQL'),OWNER(Glo:Ownerstring),NAME('dbo.CARD_CONTRACT'),PRE(CAR),BINDABLE
PK_CARD_CONTRACT KEY(CAR:ID_CONTRACT),PRIMARY
IDX_CARD_CONTR__CLI_NUM_CARD KEY(CAR:ID_CLIENT_OWNER,CAR:ID_CONTRACT,CAR:NUM_CARD),DUP,NAME('CARD_CONTRACT.IDX_CARD_CONTR__CLI_NUM_CARD')
IDX_CARD_CONTR_NUM_CARD KEY(CAR:NUM_CARD),NAME('CARD_CONTRACT.IDX_CARD_CONTR_NUM_CARD')
IDX_CARD_CONTR_PROD_EXEC KEY(CAR:ID_PRODUCT,CAR:ID_EXECUT),DUP,NAME('CARD_CONTRACT.IDX_CARD_CONTR_PROD_EXEC')
IDX_CARD_CONTR_PROP_MAIN KEY(CAR:ID_CONTRACT_MAIN,CAR:ID_ACCOUNT_MAIN),DUP,NAME('CARD_CONTRACT.IDX_CARD_CONTR_PROP_MAIN')
Record RECORD,PRE()
ID_CONTRACT LONG
NUM_CARD CSTRING(17)
ID_CONTRACT_MAIN LONG
ID_ACCOUNT_MAIN LONG
ID_PRODUCT SHORT
ID_CLIENT_OWNER LONG
ID_CLIENT_MAIN LONG
DATE_OPEN STRING(8)
DATE_OPEN_GROUP GROUP,OVER(DATE_OPEN)
DATE_OPEN_DATE DATE
DATE_OPEN_TIME TIME
END
DATE_CLOSE STRING(8)
DATE_CLOSE_GROUP GROUP,OVER(DATE_CLOSE)
DATE_CLOSE_DATE DATE
DATE_CLOSE_TIME TIME
END
ID_CURRENCY SHORT
CODE_WORD CSTRING(31)
ID_EXECUT SHORT
ID_USER_CREATE SHORT
TIME_CREATE STRING(8)
TIME_CREATE_GROUP GROUP,OVER(TIME_CREATE)
TIME_CREATE_DATE DATE
TIME_CREATE_TIME TIME
END
ID_USER_EDIT SHORT
TIME_EDIT STRING(8)
TIME_EDIT_GROUP GROUP,OVER(TIME_EDIT)
TIME_EDIT_DATE DATE
TIME_EDIT_TIME TIME
END
NOTE_CONTRACT CSTRING(256)
IS_CREDIT_CARD BYTE
CREDIT_LIMIT DECIMAL(19,4)
CREDIT_RISK BYTE
DATE_CREDIT_OFF STRING(8)
DATE_CREDIT_OFF_GROUP GROUP,OVER(DATE_CREDIT_OFF)
DATE_CREDIT_OFF_DATE DATE
DATE_CREDIT_OFF_TIME TIME
END
CARD_EXPIRE_DATE STRING(8)
CARD_EXPIRE_DATE_GROUP GROUP,OVER(CARD_EXPIRE_DATE)
CARD_EXPIRE_DATE_DATE DATE
CARD_EXPIRE_DATE_TIME TIME
END
END
END
CREATE TABLE [dbo].[CARD_CONTRACT] (
[ID_CONTRACT] [int] IDENTITY (1, 1) NOT NULL ,
[NUM_CARD] [varchar] (16) COLLATE Cyrillic_General_CI_AS NOT NULL ,
[ID_CONTRACT_MAIN] [int] NOT NULL ,
[ID_ACCOUNT_MAIN] [int] NOT NULL ,
[ID_PRODUCT] [smallint] NOT NULL ,
[ID_CLIENT_OWNER] [int] NOT NULL ,
[ID_CLIENT_MAIN] [int] NOT NULL ,
[DATE_OPEN] [datetime] NULL ,
[DATE_CLOSE] [datetime] NULL ,
[ID_CURRENCY] [smallint] NOT NULL ,
[CODE_WORD] [varchar] (30) COLLATE Cyrillic_General_CI_AS NULL ,
[ID_EXECUT] [smallint] NOT NULL ,
[ID_USER_CREATE] [smallint] NOT NULL ,
[TIME_CREATE] [datetime] NOT NULL ,
[ID_USER_EDIT] [smallint] NOT NULL ,
[TIME_EDIT] [datetime] NOT NULL ,
[NOTE_CONTRACT] [varchar] (255) COLLATE Cyrillic_General_CI_AS NULL ,
[IS_CREDIT_CARD] [tinyint] NULL ,
[CREDIT_LIMIT] [money] NULL ,
[CREDIT_RISK] [tinyint] NULL ,
[DATE_CREDIT_OFF] [datetime] NULL ,
[CARD_EXPIRE_DATE] [datetime] NULL
) ON [PRIMARY]
Мосолов Илья
(Добавление)
сделал визардом приложение на этих структурах, у меня всё работает. C55 ABC, может прислать тебе .APP юВСЕ или может у тебя там ещё на таблицу навешаны какие нибудь триггера?
Andrew Myalin
Привет.
В качестве эксперимента - сделай все поля в описании таблицы на сервере как Null и попробуй.
У меня похожие грабли были, только у меня С5 + MySQL.
Nikita Vlasov <nvlasov@bytebratsk.ru>
Написал: ClaList(2)