Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > обновление данных UPDATE'ом


Автор: AlexB 16.2.2011, 11:01
Добрый день!
Вопрос заключается в следующем: можно ли при выполнении команды UPDATE передавать с параметром SET не константу, а ссылку на ячейку, её содержащую?
Если "да", тогда что неправильно в команде 
UPDATE RS2009 SET [RS2009]![1] = [Importer]![1] WHERE [RS2009]![Time] = [Importer]![Time], 
которая по моей задумке должна обновить записи поля "1" таблицы RS2009 значениями из поля "1" таблицы Importer при совпадении связанного ключвого поля "Time"
Если "нет", как реализовать задуманное?

Заранее спасибо.

Автор: Akina 16.2.2011, 11:36
Цитата(AlexB @  16.2.2011,  12:01 Найти цитируемый пост)
можно ли при выполнении команды UPDATE передавать с параметром SET не константу, а ссылку на ячейку, её содержащую?

Что тут было названо "ячейкой"? Это не Эксель, в Аксессе такого термина НЕТ.
Цитата(AlexB @  16.2.2011,  12:01 Найти цитируемый пост)
что неправильно в команде 
Код

UPDATE RS2009 SET [RS2009]![1] = [Importer]![1] WHERE [RS2009]![Time] = [Importer]![Time]

Всё. Абсолютно всё. Начиная от синтаксиса, и кончая ссылками.
1) Прочтите ВНИМАТЕЛЬНО справку по синтаксису многотабличного UPDATE и исправьте синтаксис запроса.
2) Разберитесь, чем разделитель "!" отличается от разделителя ".", и исправьте синтаксис ссылок.

Автор: AlexB 16.2.2011, 13:26
Цитата(Akina @ 16.2.2011,  11:36)
Что тут было названо "ячейкой"? Это не Эксель, в Аксессе такого термина НЕТ.
1) Прочтите ВНИМАТЕЛЬНО справку по синтаксису многотабличного UPDATE и исправьте синтаксис запроса.
2) Разберитесь, чем разделитель "!" отличается от разделителя ".", и исправьте синтаксис ссылок.

Спасибо за критику. Однако кроме критики я ожидал немного конструктива:

При чтении Вашего сообщения, я понял, что вы поняли, что под термином "ячейка" я имел ввиду "поле записи".  Не могли бы Вы всё-таки ответить на вопрос? Ожидалось как минимум "да" или "нет". Наличие примера сняло бы дальнейшие вопросы и сэкономило Вам (да и мне) время. 

Вы пишете "неправильный синтаксис". Хорошо, пусть так. Тем не менее, в приложении есть файл, в которм сохранён запрос построенный мастером в Access, который синтаксически правилен. Он тоже не работает. Соответственно ошибка носит принципиальный характер. Задачу я описал, и сам решить её не смог. 
Что-нибудь более конкретное чем RTFM посоветуете?

Спасибо.


Автор: Akina 16.2.2011, 13:46
Цитата(AlexB @  16.2.2011,  14:26 Найти цитируемый пост)
Ожидалось как минимум "да" или "нет"

Да нет, наверное, хотя...
Более определённо сказать не могу.

Цитата(AlexB @  16.2.2011,  14:26 Найти цитируемый пост)
я понял, что вы поняли, что под термином "ячейка" я имел ввиду "поле записи".

У нас тут технический форум. И потому ожидается грамотное и правильное применение технических терминов. Иной раз неплохо и в справку залезть... как ты собираешься понимать ответы, не зная терминологии?

Цитата(AlexB @  16.2.2011,  14:26 Найти цитируемый пост)
Наличие примера сняло бы дальнейшие вопросы и сэкономило Вам (да и мне) время. 

А у меня нет задачи экономить тут время. Моя задача - заставить человека самостоятельно работать и мыслить, лишь пытаясь указать ему направление для самообразования. Готовые решения "без понимания" просят в разделе "Помощь студентам".

Автор: AlexB 16.2.2011, 13:54
Попробую ещё раз:

Пытался обновить записи поля "1" таблицы RS2009 значениями из поля "1" таблицы Importer при совпадении связанного ключвого поля "Time", для чего соорудил с помощью мастера Access следующее: 
UPDATE RB2009 SET RB2009.[1] = [Importer]![1], RB2009.[2] = [Impoter]![2] WHERE (((RB2009.Time)=[Impoter]![Time])).  
Однако, вместо ожидаемого обновления Access начинает запрашивать значения Importer!1, Importer!2 etc.  
Значит ли это, что при выполнении команды UPDATE нельзя передавать с параметром SET вместо константы, ссылку на поле записи, её содержащую? 
 
Что поправить, чтобы заработало? 
Спасибо. 

Автор: Akina 16.2.2011, 13:58
Цитата(AlexB @  16.2.2011,  14:54 Найти цитируемый пост)
Значит ли это, что при выполнении команды UPDATE нельзя передавать с параметром SET вместо константы, ссылку на поле записи, её содержащую? 

Нет.
Это значит, что Вы так и не прочитали справку по многотабличному UPDATE.

Цитата(AlexB @  16.2.2011,  14:54 Найти цитируемый пост)
Access начинает запрашивать значения Importer!1, Importer!2 etc.  

Правильно. Из текста запроса (только !!! запроса, а не всей БД) совершенно неясно, что это за хрень такая - Importer. 

Автор: AlexB 16.2.2011, 14:07
Спасибо. 
Ваш высокий профессонализм поражает.
Надеюсь, Вам никогда не придётся срочно искать информацию вне Вашей компетенции.

Автор: Akina 16.2.2011, 14:35
Цитата(AlexB @  16.2.2011,  15:07 Найти цитируемый пост)
Надеюсь, Вам никогда не придётся срочно искать информацию вне Вашей компетенции.

Сплошь и рядом. Я часто стараюсь отвечать на вопросы за пределами своей компетенции, перекапывая кучу вроде ненужной мне документации. И порой у меня это даже получается. Плюс остаются полученные знания.

Автор: AlexB 16.2.2011, 14:49
Большинство многотабличных запросов приводится в форме
Код
 UPDATE items, month SET items.price=month.price WHERE items.id=month.id; 

где отсутствуют специфические для Access разделители. В чистом виде этот код не работает - и здесь точно ошибка синтаксиса.
Если вы знаете, ПОЖАЛУЙСТА, напишите пример кода, или дайте ссылку на страницу, где такие придурки как я могут это узнать.

Автор: Akina 16.2.2011, 15:02
Цитата(AlexB @  16.2.2011,  15:49 Найти цитируемый пост)
В чистом виде этот код не работает - и здесь точно ошибка синтаксиса.

Вот хоть и был убеждён, что ты написАл хрень, но не поленился - создал 2 указанные таблицы с указанными полями, заполнил, скопипастил текст и запустил на выполнение. Обновление выполнено, причём ровно так, как должно быть выполнено.

Цитата(AlexB @  16.2.2011,  15:49 Найти цитируемый пост)
отсутствуют специфические для Access разделители

Они и не нужны.

Цитата(AlexB @  16.2.2011,  15:49 Найти цитируемый пост)
Большинство многотабличных запросов приводится в форме

Совершенно правильная форма. В отличие от твоей, где в секции использованных таблиц перечислены не все таблицы, используемые в запросе, а только одна - обновляемая. Потому Аксесс и не может понять, что есть Importer. Удали из своего последнего запроса ссылку на необновляемую таблицу, как в запросе из первого поста:
Код

UPDATE items SET items.price=month.price WHERE items.id=month.id; 

и немедленно получишь то сообщение, которое огребаешь по исходному посту.

Цитата(AlexB @  16.2.2011,  15:49 Найти цитируемый пост)
дайте ссылку на страницу, где такие придурки как я могут это узнать.

См. закреплённую тему форума.

Автор: AlexB 16.2.2011, 15:44
В моём случае код
Код
UPDATE RB2009, Importer SET RB2009.1 = Importer.1, RB2009.2 = Importer.2 WHERE RB2009.Time=Importer.Time

приводит к ошибке: Недопустимое использование '.', '!' или '()'. В выражении запроса 'Importer'. '.
А у Вас, как я понял, срабатывает. Исчерпывающе.

Код (с присвоением цен), который был приведён выше я нагуглил после первого же совета про синтаксис многотабличного UPDATE...

Автор: Akina 16.2.2011, 15:50
На сей раз Ваша ошибка - несоблюдение правил присвоения имён полям таблиц. Но уж коли использованы недопустимые имена - следует сообщить Аксессу, что это имена полей, а не что-то иное.
Код

UPDATE RB2009, Importer 
SET RB2009.[1] = Importer.[1], RB2009.[2] = Importer.[2] 
WHERE RB2009.[Time] = Importer.[Time]


Добавлено через 2 минуты и 12 секунд
Цитата(AlexB @  16.2.2011,  16:44 Найти цитируемый пост)
А у Вас, как я понял, срабатывает. Исчерпывающе.

Да.

Автор: AlexB 16.2.2011, 16:19
Спасибо, разобрались.
Последний вопрос: в обеих таблицах ключевое поле Time в формате "полный формат даты", однако запрос на выборку или обновление возвращает 0 совпадений. Здесь-то что не так?

Автор: Akina 16.2.2011, 17:15
Цитата(AlexB @  16.2.2011,  17:19 Найти цитируемый пост)
ключевое поле Time 

Это ужасно.
Цитата(AlexB @  16.2.2011,  17:19 Найти цитируемый пост)
в формате "полный формат даты"

Это - формат ОТОБРАЖЕНИЯ, а не хранения. Хранится - с секундочками... потому сравнение и не срабатывает...


Автор: AlexB 18.2.2011, 10:04
Цитата(Akina @ 16.2.2011,  17:15)
Это - формат ОТОБРАЖЕНИЯ, а не хранения. Хранится - с секундочками... потому сравнение и не срабатывает...

Как выглядит формат переменной типа "дата/время" в Access я не знаю. Кстати, я пытался заставить Access показывать в таблице "ноль часов, ноль минут", но не преуспел (отсюда сентенция про "полный формат"). Я понимаю, что формат отображения не сильно влияет на сравнение двух переменных. Но я пытался сравнивать именно записи, имеющие одинаковый тип: "дата/время". 
Одно из сравниваемых полей формата "дата-время" было получено импортом из Excel'a; значение другого поля того же типа  - сгенерировано с помощью простенького цикла на VBA 
Код

Private Const cTimeZero As Date = "01.01.2009 00:00:00"
Private Const cTimeOut As Date = "01.01.2010 00:00:00"
Private Const cTimeShift As Date = #12:05:00 AM#
...
Dim dTimeShift As Date
...
For dTimeShift = cTimeZero To cTimeOut Step cTimeShift

    rsRB.AddNew
    rsRB.Fields(0) = dTimeShift
    rsRB.Update

Next

Результат был визуально неотличим, однако выборка по совпадению поля возвращалась нулевая. Почему - не знаю.
Будучи ограниченным во времени и имея короткую базу ~100 тыс. записей решил задачу "в лоб" - создал в обеих таблицах функцией CStr копию даты в текстовом формате и сравнивал по ней.

Ещё раз спасибо. Постараюсь с идиотскими вопросами больше приставать.

Автор: bopoha 18.2.2011, 11:38
AlexB, проковырялся полчаса, но так и не понял почему запрос не работает поиск по дате.

Автор: AlexB 18.2.2011, 12:22
То есть у Вас выборка возвращается ненулевой, и Вы не смогли понять, почему это не сработало у меня? 
Или у Вас тоже не получилось?

Автор: Akina 18.2.2011, 12:39
У него выборка - тоже нулевая. Это очевидно.

Создайте два запроса:
Код

SELECT CDbl([Time]), [Time]
FROM Impoter;

Код

SELECT CDbl([Time]), [Time]
FROM RB2009;

Откройте оба. Рядом. Прокрутите до визуально одной и той же даты. 
Видите разницу?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)