Конфликт записи... опять (ADP)

DiDis
Дата: 19.02.2008 10:14:39
Ситуация:
Есть оракловская БД в которой храняться все остановки оборудования, необходимо вытащить их оттуда и у себя на сервере (MSSQL2000) дописывать к ним 1 поле (причину остановки).

Сделал так, прилинковал сервер Оракл, данной процедурой тащу оттуда данные (сначала удаляю все, и заново записываю, время запроса прибл. 1сек... так что устраивает)

ALTER PROCEDURE dbo.prodCreateTempFromOracleStops
AS DELETE FROM dbo.prodTempSTOPSORA
                          INSERT      
                           INTO            dbo.prodTempSTOPSORA 
SELECT *
FROM OPENQUERY(asutp, 'SELECT работа_оборудования.Время_начало, работа_оборудования.время_конец, 
работа_оборудования.key, работа_оборудования.user_last_update, работа_оборудования.смена,
Работа_оборудования.код_состояния, состояния_оборудования_.наименование_состояния
FROM ДИСП.Работа_оборудования INNER JOIN Дисп.состояния_оборудования_ on ДИСП.Работа_оборудования.код_состояния =Дисп.состояния_оборудования_.код_состояния 
where работа_оборудования.номер_оборудования=''Установка ГБЖ-2'' and работа_оборудования.код_состояния<>2003
order by работа_оборудования.key')

сделал табличку у себя на серваке (см. рис) и связал их 1-1
сама проблема:
если записывать данные (данные записываються только в мою табличку prodStops) из таблиц (типа входишь в prodTempSTOPSORA, нажимаешь "+", снизу появляеться sub табличка prodStops) то все ок (как в принципе и должно быть).

делаю такой запрос (да в принципе любой запрос)
SELECT     CONVERT(datetime, CONVERT(varchar(10), prodTempSTOPSORA.dtmStopsStar, 104), 104) AS Дата, prodTempSTOPSORA.intStopsSmena AS Смена, 
                      CONVERT(datetime, CONVERT(varchar(10), prodTempSTOPSORA.dtmStopsStar, 108), 108) AS Остановка, CONVERT(datetime, CONVERT(varchar(10), 
                      prodTempSTOPSORA.dtmStopsEnd, 108), 108) AS Пуск, CONVERT(datetime, CONVERT(varchar(10), 
                      prodTempSTOPSORA.dtmStopsEnd - prodTempSTOPSORA.dtmStopsStar, 108), 108) AS Время, prodTempSTOPSORA.txtStopsNameSost, 
                      prodTempSTOPSORA.intKey, prodStops.intIDKEYStops, prodStops.txtName, prodStops.tmstm
FROM         prodTempSTOPSORA LEFT OUTER JOIN
                      prodStops ON prodTempSTOPSORA.intKey = prodStops.intIDKEYStops
и тут начинаються проблемы с конфликтом записи, не могу абсолютно ничего вставить...
сделал форму на основе этого запроса, поставил однозначную таблицу - та же хрень...
я уже хз что дальше делать... помогите...

п.с. сори что много написал... может и не надо было...
DiDis
Дата: 19.02.2008 10:49:23
я невнятно написал или чёйто недописал?
п.с. конфликт записи - окошко которое выпадает при переходе на след.запись после изменения текущей - добавить в буфер, сохранить изменения, отмена... эт так на всякий..
Latuk
Дата: 19.02.2008 11:02:49
кроме однозначной таблицы нужна еще команда синхронизации
(запрос аналогичный источнику но с where по ключевому полю однозначной таблицы)
значение ключа форма передаст в то место выражения где будет стоять"?"
...where intIDKey=?
DiDis
Дата: 19.02.2008 11:22:19
есть команда синхронизации (забыл написать), но та же ошибка
вообще алгоритм правильный или есть решения быстрее и удобнее?

п.с. команда синхронизации анологичная источнику....

SELECT     CONVERT(datetime, CONVERT(varchar(10), prodTempSTOPSORA.dtmStopsStar, 104), 104) AS Дата, prodTempSTOPSORA.intStopsSmena AS Смена, 
                      CONVERT(datetime, CONVERT(varchar(10), prodTempSTOPSORA.dtmStopsStar, 108), 108) AS Остановка, CONVERT(datetime, CONVERT(varchar(10), 
                      prodTempSTOPSORA.dtmStopsEnd, 108), 108) AS Пуск, CONVERT(datetime, CONVERT(varchar(10), 
                      prodTempSTOPSORA.dtmStopsEnd - prodTempSTOPSORA.dtmStopsStar, 108), 108) AS Время, prodTempSTOPSORA.txtStopsNameSost, 
                      prodTempSTOPSORA.intKey, prodStops.intIDKEYStops, prodStops.txtName, prodStops.tmstm
FROM         prodTempSTOPSORA LEFT OUTER JOIN
                      prodStops ON prodTempSTOPSORA.intKey = prodStops.intIDKEYStops 
where prodStops.intIDKEYStops=?

кстати, после окошка о конфликте записи, появляеться окошко о неверном параметре "параметр задан не верно" и 1 кнопка "ОК"...
VladimirKr
Дата: 19.02.2008 12:03:16
Нельзя ли поподробней. Непонятны следующие моменты:
Когда вызывается процедура импорта (если после открытия формы, то надо делать Requery)?
Когда открывается форма?
У вас однозначная таблица стоит справа в Left join, что из филосовcких соображений неверно: ключ может оказаться пустым.
DiDis
Дата: 19.02.2008 12:12:23
кароче...
сделал 2 таблицы

temp1
intID - ключ, автоинкремент
txt - тектовый
tt - timestamp

temp2
intIDUniq - ключ
txtName - тектовый
t - timestamp

заполнил temp1, temp2 - пустой

связь 1-1 с обновлением

делаю форму на основе запроса
SELECT     dbo.Temp1.intID, dbo.Temp1.txt, dbo.Temp2.intIDUniq, dbo.Temp2.txtName, dbo.Temp2.t, dbo.Temp1.tt
FROM         dbo.Temp1 LEFT OUTER JOIN
                      dbo.Temp2 ON dbo.Temp1.intID = dbo.Temp2.intIDUniq

однозначная таблица - Temp2

команда синхронизации

SELECT dbo.Temp1.intID, dbo.Temp1.txt, dbo.Temp2.intIDUniq, dbo.Temp2.txtName,
 dbo.Temp2.t, dbo.Temp1.tt FROM dbo.Temp1 LEFT OUTER JOIN dbo.Temp2 ON 
dbo.Temp1.intID = dbo.Temp2.intIDUniq where intIDUniq=?

конфликт записи + появляеться окошко о неверном параметре.... 100% это изза того что в Temp2 нет записей... но как это сделать чтоб работало?
VladimirKr
Дата: 19.02.2008 12:22:51
Если связь 1-1, то перепишите запрос без как inner join и слева поставьте однозначную таблицу. В строке синхронизанции - аналогично
VladimirKr
Дата: 19.02.2008 12:24:42
VladimirKr
Если связь 1-1, то перепишите запрос без как inner join и слева поставьте однозначную таблицу. В строке синхронизанции - аналогично

SELECT     CONVERT(datetime, CONVERT(varchar(10), prodTempSTOPSORA.dtmStopsStar, 104), 104) AS Дата, prodTempSTOPSORA.intStopsSmena AS Смена, 
                      CONVERT(datetime, CONVERT(varchar(10), prodTempSTOPSORA.dtmStopsStar, 108), 108) AS Остановка, CONVERT(datetime, CONVERT(varchar(10), 
                      prodTempSTOPSORA.dtmStopsEnd, 108), 108) AS Пуск, CONVERT(datetime, CONVERT(varchar(10), 
                      prodTempSTOPSORA.dtmStopsEnd - prodTempSTOPSORA.dtmStopsStar, 108), 108) AS Время, prodTempSTOPSORA.txtStopsNameSost, 
                      prodTempSTOPSORA.intKey, prodStops.intIDKEYStops, prodStops.txtName, prodStops.tmstm
FROM         prodStops inner JOIN prodTempSTOPSORA 
                      ON prodTempSTOPSORA.intKey = prodStops.intIDKEYStops
DiDis
Дата: 19.02.2008 12:30:46
VladimirKr
Если связь 1-1, то перепишите запрос без как inner join и слева поставьте однозначную таблицу. В строке синхронизанции - аналогично


нее, мне надо видеть что есть в Temp1...
типа так

ID txt txtName
1 1 пусто
2 2 пусто
3 3 пусто
4 4 а вот сюда я захочу чтонить вписать

а как вы предлагаете я вообще записей не вижу, только новую строку для добавления записей...
VladimirKr
Дата: 19.02.2008 12:39:08
DiDis
VladimirKr
Если связь 1-1, то перепишите запрос без как inner join и слева поставьте однозначную таблицу. В строке синхронизанции - аналогично


нее, мне надо видеть что есть в Temp1...
типа так

ID txt txtName
1 1 пусто
2 2 пусто
3 3 пусто
4 4 а вот сюда я захочу чтонить вписать

а как вы предлагаете я вообще записей не вижу, только новую строку для добавления записей...


Вы хотите записать не в новую строчку, а в ту, где есть "пустота справа"? То есть, с точки зрения сервера сделать insert, а не update? Если так - в лоб не получится. Хотя, задача интересная....