![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO+MSAccess+Update [D6]
msguns © (2004-10-06 13:44:00)Не катит такой запрос:
UPDATE TblRes R
SET Key4=
(SELECT T1.Key4 FROM Tbl1 T1
WHERE (T1.Key1=R.Key1) AND
(T1.Key2=R.Key2) AND
(T1.Key3=R.Key3))
Говорит, что требуется запрос на обновление. Запускал и из Access, и из TADOCommand.
Nikolay M. (2004-10-07 13:15:00) [1]
> Но послать сабж в форум не дает - орет, что произошла ошибка
> сервера
Сегодня пару ответов запостил в МС СКЛ-ном форуме - без проблем :(
msguns (2004-10-07 12:59:00) [2]>Nikolay M. © (07.10.04 12:26) [17]
Был там. Даже зарегился. Но послать сабж в форум не дает - орет, что произошла ошибка сервера (N раз подряд да и сегодня та же картина)
>sniknik © (07.10.04 12:27) [18]
Списибо за помощь, но придется все же брать лопату ;((
sniknik (2004-10-07 12:27:00) [3]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1096621509&n=1
приведена конструкция синоним IN, попробуй поменять.
Nikolay M. (2004-10-07 12:26:00) [4]Я имел ввиду, что ему не нравится это в апдейте.
Вылазий лучше сюда
http://www.sql.ru/forum/actualtopics.aspx?bid=4
там спецы есть серьезные, а тут только sniknik © :)
msguns (2004-10-07 12:23:00) [5]>Nikolay M. © (07.10.04 12:17) [15]
>Думаю, аксесу не нравится внешняя база и я его понимаю.
А вот это проскакивает на-ура:
INSERT INTO FONDSR ( FLT, FLA, Letter, FondNumber, FondType, Category, TFID, TArcId, TCountry, TSDate, TEDate, TFSize, TQDI, TQMF, TQS, TAvl, TPassT, TPassL, TPassN, TJoinL, TJoinN, TUtil, TLossId, TLossDt, TLossDc )
SELECT 1, 0, Letter, FondNumber, FondType, Category, FID, ArcId, Country, StartDate, EndDate, FondSize, DontInvent, Microfished, Secret, Availability, PassTo, PassLetter, PassNumber, JoinLetter, JoinNumber, UtilDate, LossCauseId, LossDate, LossDoc
FROM Fonds IN 'e:\DMsArch\FondsCmp\TatDB\Data.mdb';
Наверное, поэтому я асксес и не понимаю.
Чего и вылазию сюда :(
Nikolay M. (2004-10-07 12:17:00) [6]Думаю, аксесу не нравится внешняя база и я его понимаю.
msguns (2004-10-07 12:14:00) [7]А вот это что:
Проходит ->
UPDATE TblRes AS R
INNER JOIN Tbl1 AS T1
ON (R.Key1=T1.Key1) AND (R.Key2=T1.Key2) AND (R.Key3=T1.Key3)
SET R.Key4 = T1.Key4, R.Data1 = T1.Data1, R.Data2 = T1.Data2, R.Data3 = T1.Data3;
Не проходит (вопит, что неверная конструкция UPDATE)->
UPDATE FONDSR AS R
INNER JOIN Fonds IN 'e:\DMsArch\FondsCmp\AlexDB\Data.mdb' AS TA
ON (R.Letter=TA.Letter) AND (R.FondNumber=TA.FondNumber) AND
(R.FondType=TA.FondType) AND (R.Category=TA.Category)
SET R.AFID = TA.FID, R.AArcID = TA.ArcID;
Она, что IN для джоинов не хавает ?
Nikolay M. (2004-10-06 17:55:00) [8]
> sniknik © (06.10.04 17:20) [7]
Хм, практически такой же вариант я в [1] предлагал, не знал такой формы для аксеса.
msguns (2004-10-06 17:54:00) [9]Спасибо всем, а особенно sniknik © !
Буду использовать новый (для меня) прием на реальных таблицах.
msguns (2004-10-06 17:45:00) [10]>sniknik © (06.10.04 17:20) [7]
Все отработало ! Все дело в том, что комбинации логических ключей в каждой из исходных таблиц являются уникальными в пределах этих таблиц. Можно, конечно, создать индекс по этим полям и сделать его уникальным, но дело в том, что в реальных БД (а перед запуском объединеняющего приложения БД просто копируются с компов узеров) таких индексов нет. Соответственно и я не могу их туда добавить.
sniknik (2004-10-06 17:39:00) [11]ну так всетаки всю таблицу а не одно поле в неизвестном месте (аксес понимает именно так, судя по ошибке в [0]), попробуй запрос в [7].
msguns (2004-10-06 17:34:00) [12]Запрос вообще-то не бредовый. По крайней мере в IB все тип-топ.
А смысл простой:
Есть 2 схожие по стуктуре таблицы с полями
ID AutoInc
Key1 - поле логическогоключа 1
...
KeyN - поле логическогоключа N
Data1 - поле данных 1
...
DataN - поле данных N
Есть 3-я таблица такой же структуры, которая должна "объединить" данные 2-х первых
Делаю раз - удаление из Т3 всех записей
Делаю два - вставляю в Т3 все записи Т1
Делаю три - вставляю в Т3 все записи Т2, логические ключи которой отсутствуют в Т1
Делаю чертыре - в записях Т3, логические ключи в которой совпадают с лог.ключами Т2, замену полей данных
Вообще-то реальный пример, конечно, существенно сложнее, но смысл я передал достаточно точно. Что-то вроде репликации, а точнее объединение 2-х баз с разных компов в одну итоговую.
Раньше с IB подобная задачка для меня не представляла проблем, но вот пришлось иметь дело с ADO+Access, который я не знаю. Выкачал с sql.ru документацию, проутюжил ее всю, но там с UPDATE совсем куцые примеры :((
Nikolay M. (2004-10-06 17:21:00) [13]Может, он данные просто переносит?
Говорит, что хочет Updateable query.
sniknik (2004-10-06 17:20:00) [14]вот так еще смысл есть
UPDATE TblRes R
INNER JOIN Tbl1 T1 ON
R.Key1 = T1.Key1 AND
R.Key2 = T1.Key2 AND
R.Key3 = T1.Key3
SET R.Key4 = T1.Key4
(обновить все Key4 в таблице, а в оригинале неизвестно какой и значением из списка)
sniknik (2004-10-06 17:03:00) [15]а вообще то не буду (проверять), т.к. по смыслу запрос бредовый, не может быть чтобы именно этого хотели.
sniknik (2004-10-06 17:00:00) [16]> А почему должен сработать?
не знаю. но в током виде как был приведен идет присвоение еденичному полю массива значений (рекордсета), агрегатная функция гарантирует что запрос тоже выдаст еденичное значение.
> У меня и твой тоже не работает.
счас проверю. а что говорит?
скорее и подзапрос неверен, ну хотя бы потому что в нем ссылка на внешнюю (по отношению к нему) таблицу R, в этом случае просто внутри нужно обьеденение сделать.
Nikolay M. (2004-10-06 16:45:00) [17]
> sniknik © (06.10.04 16:25) [3]
У меня и твой тоже не работает. А почему должен сработать?
sniknik (2004-10-06 16:25:00) [18]вот так должон
UPDATE TblRes R
SET Key4=
(SELECT Max(T1.Key4) FROM Tbl1 T1
WHERE (T1.Key1=R.Key1) AND
(T1.Key2=R.Key2) AND
(T1.Key3=R.Key3))
msguns (2004-10-06 15:16:00) [19]>Nikolay M. © (06.10.04 14:03) [1]
Кричит, что FROM без SELECT не канает ;(
(запускаю из-под аксеса)
Nikolay M. (2004-10-06 14:03:00) [20]Попробуй. Под SQL Server работает.
UPDATE
TblRes
SET
Key4 = T1.Key4
FROM
TblRes R,
Tbl1 T1
WHERE
(T1.Key1=R.Key1) AND
(T1.Key2=R.Key2) AND
(T1.Key3=R.Key3)