| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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" Если "нет", как реализовать задуманное? Заранее спасибо. |
| Автор: AlexB 16.2.2011, 13:26 | ||
Спасибо за критику. Однако кроме критики я ожидал немного конструктива: При чтении Вашего сообщения, я понял, что вы поняли, что под термином "ячейка" я имел ввиду "поле записи". Не могли бы Вы всё-таки ответить на вопрос? Ожидалось как минимум "да" или "нет". Наличие примера сняло бы дальнейшие вопросы и сэкономило Вам (да и мне) время. Вы пишете "неправильный синтаксис". Хорошо, пусть так. Тем не менее, в приложении есть файл, в которм сохранён запрос построенный мастером в Access, который синтаксически правилен. Он тоже не работает. Соответственно ошибка носит принципиальный характер. Задачу я описал, и сам решить её не смог. Что-нибудь более конкретное чем RTFM посоветуете? Спасибо. |
| Автор: Akina 16.2.2011, 13:46 | ||||
Да нет, наверное, хотя... Более определённо сказать не могу.
У нас тут технический форум. И потому ожидается грамотное и правильное применение технических терминов. Иной раз неплохо и в справку залезть... как ты собираешься понимать ответы, не зная терминологии?
А у меня нет задачи экономить тут время. Моя задача - заставить человека самостоятельно работать и мыслить, лишь пытаясь указать ему направление для самообразования. Готовые решения "без понимания" просят в разделе "Помощь студентам". |
| Автор: 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 | ||
Нет. Это значит, что Вы так и не прочитали справку по многотабличному UPDATE. Правильно. Из текста запроса (только !!! запроса, а не всей БД) совершенно неясно, что это за хрень такая - Importer. |
| Автор: AlexB 16.2.2011, 14:07 |
| Спасибо. Ваш высокий профессонализм поражает. Надеюсь, Вам никогда не придётся срочно искать информацию вне Вашей компетенции. |
| Автор: Akina 16.2.2011, 14:35 | ||
Сплошь и рядом. Я часто стараюсь отвечать на вопросы за пределами своей компетенции, перекапывая кучу вроде ненужной мне документации. И порой у меня это даже получается. Плюс остаются полученные знания. |
| Автор: AlexB 16.2.2011, 14:49 | ||
Большинство многотабличных запросов приводится в форме
где отсутствуют специфические для Access разделители. В чистом виде этот код не работает - и здесь точно ошибка синтаксиса. Если вы знаете, ПОЖАЛУЙСТА, напишите пример кода, или дайте ссылку на страницу, где такие придурки как я могут это узнать. |
| Автор: Akina 16.2.2011, 15:02 | ||||||
Вот хоть и был убеждён, что ты написАл хрень, но не поленился - создал 2 указанные таблицы с указанными полями, заполнил, скопипастил текст и запустил на выполнение. Обновление выполнено, причём ровно так, как должно быть выполнено. Они и не нужны. Совершенно правильная форма. В отличие от твоей, где в секции использованных таблиц перечислены не все таблицы, используемые в запросе, а только одна - обновляемая. Потому Аксесс и не может понять, что есть Importer. Удали из своего последнего запроса ссылку на необновляемую таблицу, как в запросе из первого поста:
и немедленно получишь то сообщение, которое огребаешь по исходному посту.
См. закреплённую тему форума. |
| Автор: AlexB 16.2.2011, 15:44 | ||
В моём случае код
приводит к ошибке: Недопустимое использование '.', '!' или '()'. В выражении запроса 'Importer'. '. А у Вас, как я понял, срабатывает. Исчерпывающе. Код (с присвоением цен), который был приведён выше я нагуглил после первого же совета про синтаксис многотабличного UPDATE... |
| Автор: Akina 16.2.2011, 15:50 | ||
На сей раз Ваша ошибка - несоблюдение правил присвоения имён полям таблиц. Но уж коли использованы недопустимые имена - следует сообщить Аксессу, что это имена полей, а не что-то иное.
Добавлено через 2 минуты и 12 секунд Да. |
| Автор: AlexB 16.2.2011, 16:19 |
| Спасибо, разобрались. Последний вопрос: в обеих таблицах ключевое поле Time в формате "полный формат даты", однако запрос на выборку или обновление возвращает 0 совпадений. Здесь-то что не так? |
| Автор: Akina 16.2.2011, 17:15 |
Это ужасно. Это - формат ОТОБРАЖЕНИЯ, а не хранения. Хранится - с секундочками... потому сравнение и не срабатывает... |
| Автор: AlexB 18.2.2011, 10:04 | ||||
Как выглядит формат переменной типа "дата/время" в Access я не знаю. Кстати, я пытался заставить Access показывать в таблице "ноль часов, ноль минут", но не преуспел (отсюда сентенция про "полный формат"). Я понимаю, что формат отображения не сильно влияет на сравнение двух переменных. Но я пытался сравнивать именно записи, имеющие одинаковый тип: "дата/время". Одно из сравниваемых полей формата "дата-время" было получено импортом из Excel'a; значение другого поля того же типа - сгенерировано с помощью простенького цикла на VBA
Результат был визуально неотличим, однако выборка по совпадению поля возвращалась нулевая. Почему - не знаю. Будучи ограниченным во времени и имея короткую базу ~100 тыс. записей решил задачу "в лоб" - создал в обеих таблицах функцией CStr копию даты в текстовом формате и сравнивал по ней. Ещё раз спасибо. Постараюсь с идиотскими вопросами больше приставать. |
| Автор: bopoha 18.2.2011, 11:38 |
| AlexB, проковырялся полчаса, но так и не понял почему запрос не работает поиск по дате. |
| Автор: AlexB 18.2.2011, 12:22 |
| То есть у Вас выборка возвращается ненулевой, и Вы не смогли понять, почему это не сработало у меня? Или у Вас тоже не получилось? |
| Автор: Akina 18.2.2011, 12:39 | ||||
| У него выборка - тоже нулевая. Это очевидно. Создайте два запроса:
Откройте оба. Рядом. Прокрутите до визуально одной и той же даты. Видите разницу? |