Доступ к SQL

ODBC

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Есть база на MSSQL
Задача: взять табличку в базе и поправить запись.
Сделал словарь, импортировал таблицу, создал приложение 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)
Гость

Сообщение Гость »

Андрей, а ты пробовал поля datetime проинициализировать через GetDate() ? И желательно, чтоб в таблице было не меньше 20-ти строк. Попробуй...

Михаил

попробую, но я так понимаю, что Илья не юзает GetData().

Andrew Myalin

(Добавление)

Прикол в том, что я нашел одну! запись, которая апдейтится!
Ищу теперь 10 отличий.... или хотя-бы одно....
Ща в триггерах поищу.

С уважением
Мосолов Илья

Наверняка где апдейтится, там в дате что-то типа '2004-16-03 12:25:32.670', а где нет, '2004-16-03 12:25:32.667'

Дуга Михаил <mikeduglas@intercare.ru>

и действительно!!!
если последний нулик то всё Ok, иначе - засада.

Andrew Myalin

Вот, нашёл.
SQL Server Books Online, статья "datetime and smalldatetime"

datetime
Date and time data from January 1, 1753 through December 31, 9999, to an accuracy of one three-hundredth of a second (equivalent to 3.33 milliseconds or 0.00333 seconds). Values are rounded to increments of .000, .003, or .007 seconds, as shown in the table.
Из-за этого и вся бяка

Михаил

(Добавление)

Это здорово. А как это обойти?

Илья Мосолов

Выкинь такие DATETIME структуры из описание таблицы в словаре и инициализируй черех триггера и хранимые процедуры

Andrew Myalin

Можно обновить таблицу, к примеру
UPDATE tbl
SET RegDate=CONVERT(datetime,CONVERT(varchar(30),RegDate,120),120)
округлит до секунд

Михаил
Написал: ClaList(2)
Ответить