Green-sell.info

Новые технологии
101 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Объединение полей в запросе access

Объединение текстовых значений с помощью выражений

Когда вы хотите объединить значения в двух и более полях в Access, создайте выражение с оператором амперсанд (&). Предположим, что у вас есть форма «Сотрудники». вы вводите в разные поля имя и фамилию каждого сотрудника, но хотите отображать полное имя сотрудника в заголовке формы.

Для этого используйте следующее выражение:

Выражение с оператором & объединяет значения из полей «Имя» и «Фамилия». В выражении также присутствует пара двойных кавычек («) с пробелом между ними, чтобы разделить пробелом имя и фамилию. Если вы хотите вставить что-то между двумя полями, например пробел, знаки препинания или текст, это дополнительное вставляемое значение необходимо заключить в кавычки.

В качестве еще одного примера рассмотрим следующее выражение, где имя и фамилия разделяются запятой и пробелом:

В этом случае выражение вставляет между именем и фамилией запятую с пробелом, заключенные в кавычки.

В следующей процедуре предполагается, что у вас есть форма, которая основана на таблице с полями «Имя» и «Фамилия». Или же вы можете изменить выражение на шаге 6, чтобы оно соответствовало вашим данным.

Добавление текстового поля с выражением для полного имени

В области навигации щелкните правой кнопкой мыши форму или отчет, которые вы хотите изменить, и выберите в контекстном меню команду Конструктор.

На вкладке Конструктор в группе Элементы управления щелкните Поле.

Перетащите указатель в форме или отчете, чтобы создать текстовое поле.

Щелкните правой кнопкой мыши текстовое поле и выберите в контекстном меню пункт Свойства.

В области свойств откройте вкладку Данные.

Измените значение свойства Данные на =[Имя] & » » & [Фамилия].

Закройте область свойств и сохраните изменения.

Иногда одно из полей, которые вы хотите объединить, может не содержать значения. Это отсутствие данных называется значением Null. Если вы примените оператор & к полю, которое не имеет значения, Access возвращает для данного поля пустую строку. Например, если в записи сотрудника есть только фамилия, выражение в предыдущем примере возвращает строку нулевой длины для поля «Имя», пробел, а затем значение в поле «Фамилия».

1. Так как в поле «Имя» нет данных, значению «Гладких» предшествуют строка нулевой длины и пробел.

При объединении значений из нескольких полей в новой строке желательно включать значение в новой строке (например, запятую), только если в определенном поле содержатся данные. Чтобы включать значение условно, объединяйте поля с помощью оператора +, а не оператора &. Предположим, что у вас есть таблица «Клиент» с полями «Город», «Регион» и «Почтовый индекс». Вы хотите объединить значения в этих полях для отчета, но некоторые записи могут не содержать значений в поле «Регион». Если вы попытаетесь объединить поля с помощью оператора &, вы получите ненужные запятые перед почтовым индексом.

Чтобы исключить ненужные запятые, воспользуйтесь оператором «плюс» (+), как показано в следующем примере выражения:

=([Город] & («, » + [Регион]) & » » & [ПочтовыйИндекс])

Оператор + объединяет текст таким же образом, как оператор &. Однако оператор + также поддерживает так называемое распространение значения Null. Распространение значения Null позволяет возвращать значение Null для всего выражения, если хотя бы один его компонент имеет значение Null. Рассмотрим в предыдущем примере часть выражения («, » + [Регион]). Так как используется оператор +, выражение во внутренних круглых скобках возвращает запятую только в том случае, поле «Регион» содержит значение. Если в поле «Регион» отсутствует значение, срабатывает распространение значения Null, после чего все выражение во внутренних круглых скобках возвращает значение Null, тем самым «скрывая» запятую.

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

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

Объединение полей в запросе access

На этом шаге будет рассмотрено создание вычисляемых полей.

При создании запросов часто возникает необходимость не только использовать имеющиеся поля таблиц, но и создавать на их основе другие поля, которые называются вычисляемыми. Например, если в таблице какого-либо магазина имеется поле цены на товар и поле количества этого товара, то, исходя из этого, можно создать вычисляемое поле, в котором будет подсчитываться общая стоимость для каждого товара путем перемножения значений цены и количества. Другими словами, в вычисляемом поле могут использоваться арифметические операторы.

С другой стороны, при создании вычисляемого поля на основе содержимого текстовых полей, как правило, используется операция объединения текстовых значений, которая называется конкатенацией. В таблице 1 приведены операторы, которые используются в Access при построении выражений:

Очевидно, что рассмотренные операторы предоставляют достаточно узкий спектр возможностей по созданию выражений. Чтобы создать сложное выражение, используют мощное средство, которое носит название Построитель выражений. Эта программа позволяет построить выражение любой сложности с использованием самых разнообразных функций (рис. 1).


Рис. 1. Построитель выражений

С ее помощью можно выполнять различные вычисления с использованием данных, находящихся в БД — полей таблиц, запросов, форм и отчетов. Все перечисленные объекты БД находятся, соответственно, в папках Таблицы, Запросы, Forms и Reports в левой части Построителя.

Чтобы выбрать требуемый объект, например, таблицу, необходимо выполнить двойной щелчок на папке Таблицы, в результате чего раскроется список всех таблиц БД. После выбора нужной таблицы (или другого объекта) в средней части Построителя отображается список ее полей, значения которых можно включить в создаваемое выражение. Для этого необходимо выбрать требуемое поле и нажать в окне Построителя кнопку Вставить.

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

Также существует возможность использования в выражении различных функций Access. Для этого в левой части окна необходимо открыть папку Функции и выбрать пункт Встроенные функции. Затем следует в средней части Построителя определить категорию, в которой находится требуемая функция, и выбрать после этого в правой части окна название искомой функций (рис. 2, 3). Создаваемое таким образом выражение отображается в верхней части окна Построителя выражений.


Рис. 2. Построитель выражений. Встроенные функции

Читать еще:  Remote file access


Рис. 3. Построитель выражений. Текстовая функция Left

Например, необходимо в запросе ПреподавателиПредметы вместо поля Фамилия добавитъ вычисляемое поле, в котором содержались бы фамилия и инициалы преподавателя.

Для этого необходимо открыть запрос в режиме конструктора. Затем установить курсор в строку Поле первого столбца, т.е. в поле Фамилия. После этого необходимо воспользоваться кнопкой Построить , в результате чего будет отображено окно Построитель выражений (рис. 1).

Примечание. Кнопка Построить позволяет не только создавать новые выражения, с ее помощью можно также изменять уже существующее выражение, которое в этом случае должно находиться в текущем поле.

Названия полей в выражении должны указываться в квадратных скобках, однако если поле будет указано без скобок, то Access их добавит автоматически.

Для создания текстовой строки с фамилией и инициалами необходимо несколько раз последовательно выполнить операцию конкатенации следующей структуры:

Фамилия & Символ Пробела & Инициал имени & Символ точки & Инициал отчества & Символ точки.

Все текстовые символы указываются в двойных кавычках, поэтому структура выражения примет такой вид:

Фамилия & » » & Инициал имени & «.» & Инициал отчества & «.».

Таким образом, начало выражения будет следующим:

Фамилия & » » &

Для работы с текстовыми значениями используются функции категории Текстовые. Чтобы получить инициал имени, необходимо воспользоваться одной из функций данной категории, а именно — функцией Lеft, которая возвращает первые n символов указанной строки.

Чтобы добавить функцию в выражение, необходимо дважды щелкнуть на папке Функции и выбрать после этого раздел Встроенные функции (рис. 2).

Затем во втором столбце необходимо выбрать требуемую категорию, в данном случае Текстовые, и после этого в третьем столбце выбрать нужную функцию, т.е. Left (рис. 3).

После того как функция выбрана, необходимо установить курсор в то место выражения, куда она должна быть вставлена, и нажать кнопку Вставить в окне Построителя выражений. В результате этих действий в выражение будет добавлен шаблон функции Left:

Left («stringexpr»; «n») ,

в котором необходимо указать значения требуемых параметров. В частности, вместо stringexpr нужно указать поле Имя, а вместо n — количество символов, которые необходимо получить из строки, т.е. 1. Таким образом, текущее выражение примет вид:

Необходимо отметить, что для поля Имя не указывалось название таблицы Преподаватели, так как оно было выбрано ранее в строке Имя таблицы окна конструктора запросов. С другой стороны, чтобы добавить в выражение имя поля конкретной таблицы, можно раскрыть папку Таблицы, и выбрать в таблице Преподаватели поле Имя (рис. 4), после чего установить курсор в соответствующее место выражения и нажать кнопку Вставить.


Рис. 4. Построитель выражений. Поле Имя таблицы Преподаватели

Таким образом, название поля с указанием имени таблицы необходимо отображать в следующем формате:

[Имя таблщы] ! [Название поля]

После указания первого инициала необходимо поставить точку, т.е. указать в выражении строку «.». Затем аналогичным способом добавить инициал отчества и снова поставить точку. Таким образом, будет получено следующее выражение:

Чтобы вернуться в окно конструктора запросов, необходимо нажать кнопку ОК. В результате созданное выражение будет находиться в строке Поле первого столбца запроса. Для выполнения запроса следует воспользоваться кнопкой Запуск , после чего в запросе будет создано вычисляемое поле Выражение1, в котором содержатся фамилия и инициалы преподавателя.

Названия полей запроса формируются автоматически. Для полей таблиц названия совпадают с названиями соответствующих полей запроса (например, поле Название). С другой стороны, названия вычисляемых полей формируются автоматически; Выражение1, Выражение2 и т. д. Очевидно, что такие названия не являются информативными.

Чтобы установить подпись для поля в таблице или запросе, необходимо в режиме конструктора установить курсор в требуемое поле (в частности, в поле Выражение1) и нажать кнопку Свойства . После этого в диалоговом окне Свойства поля можно на вкладке Общие указать в строке Подпись то название поля, которое будет использоваться вместо исходного в режиме редактирования запроса (или таблицы), а также в формах и отчетах. В частности, для вычисляемого поля Выражение1 можно указать подпись ФИО (рис. 5).


Рис. 5. Диалоговое окно Свойства поля

Таким образом, был создан и выполнен запрос на выборку с использованием вычисляемого поля (рис. 6).


Рис. 6. Запрос на выборку с вычисляемым полем ФИО

Создание запроса с вычисляемым полем можно увидеть здесь, а взять клип здесь.

На следующем шаге вы узнаете о групповых операциях, которые можно использовать при создании запроса.

Предыдущий шаг Содержание Следующий шаг

Иллюстрированный самоучитель по Microsoft Access 2002

Внешнее соединение

Внешние соединения бывают левыми или правыми. Запрос, в котором участвуют таблицы с левым внешним соединением (LEFT JOIN или *= в SQL), выводит все записи таблицы «один», в независимости от того, имеются ли соответствующие им записи в таблице «многие». И наоборот, запрос, в котором участвуют таблицы с правым внешним соединением (RIGHT JOIN или =* в SQL), выводит все записи таблицы «многие», в независимости от того, имеются ли соответствующие им записи в таблице «один».

Рассмотрим в качестве примера, как с помощью левого внешнего соединения создать запрос в базе данных «Борей» (Northwind), который обнаруживает клиентов, не сделавших ни одного заказа:

  1. Создайте новый запрос и добавьте в него таблицы «Клиенты» (Customers) и «Заказы» (Orders). Поскольку эти таблицы связаны отношением «один-ко-многим», между ними сразу появляется соединяющая линия.
  2. Выделите и перетащите в бланк запроса поле «Название» (CompanyName) таблицы «Клиенты» и поле «КодЗаказа» (Orderld) таблицы «Заказы».
  3. Выполните запрос и посмотрите, сколько записей будет возвращать запрос: 830.
  4. Вернитесь в режим Конструктора. Щелкните правой кнопкой мыши на линии, соединяющей таблицы, и выберите из контекстного меню команду Параметры объединения (Join Properties). Появится диалоговое окно, представленное на рис. 4.26. В данном окне показаны имена связанных полей в таблицах. При этом таблица на стороне «один» считается левой (независимо от того, как она расположена в окне Конструктора), а таблица на стороне «многие» – правой. Ниже расположены три переключателя:
    • «1» задает внутреннее соединение;
    • «2» – левое внешнее соединение;
    • «3» – правое внешнее соединение.


Рис. 4.26. Диалоговое окно Параметры объединения

Замечание
Традиционно термин JOIN, который применяется к операции соединения таблиц, переводился как «объединение», хотя на самом деле операция объединения таблиц – это UNION, которая позволяет объединить все записи из одной таблицы и все записи из другой, а потом удалить дублирующиеся записи. Тем не менее, при локализации диалоговых окон Access по-прежнему, как мы видим, используется термин «объединение» по отношению к операции JOIN
.

Задайте левое внешнее соединение, выбрав значение «2». Нажмите кнопку ОК для закрытия диалогового окна. При этом на конце линии соединения появится стрелка в сторону таблицы «многие», что указывает на левое внешнее соединение (рис. 4.27).


Рис. 4.27. Отображение левого внешнего объединения в окне Конструктора запросов

  • Установите сортировку по возрастанию для поля «КодЗаказа» (Orderld) во втором столбце бланка запроса.
  • Нажмите на панели инструментов кнопку Запуск (Run) для вывода результирующего множества запроса с левым внешним – соединением (рис. 4.28). Количество записей стало равно 832, и первые две записи содержат пустое поле «КодЗаказа».


    Рис. 4.28. Результат выполнения запроса с левым внешним соединением

  • Сохраните запрос под именем «Холодные клиенты». Он нам потребуется в дальнейшем. Запросы с правым внешним соединением используются гораздо реже, т. к., если при составлении схемы данных для связи между таблицами установлена ссылочная целостность (см. раздел «Обеспечение целостности данных» гл. 2), записей в таблице «многие» (подчиненной), не связанных с записями в таблице «один» (главной), просто не может не быть.
  • Читать еще:  Access экспорт vba

    Объединение полей из одного столбца в запросе Microsoft Access

    Я хотел бы объединить поля из одного столбца в запросе. Моя таблица в Microsoft Access выглядит так:

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

    Я уже нашел несколько подобных вопросов, но они были более простыми, и я, к сожалению, не мог приспособить их к своему случаю. Я узнал, что мне нужно использовать код Concatenate VBA Аллена Брауна, и с этим я мог бы имитировать более простой пример.

    Решение Zacharey очень хорошо работает с моими тестовыми данными, но когда я пытаюсь использовать его с моими реальными данными , которые имеют около 200.000 записей с 5000 основным кластером (cluster1), это никогда не заканчивается вычислением. Только когда я чрезвычайно уменьшаю объем фильтрации строк данных только на одну букву алфавита (например, A*) я получаю через 2-4 часа результат. В настоящее время я начал запускать его вручную по каждому основному кластеру и добавлять его в таблицу, но, похоже, это не очень эффективно. У тебя есть идея, как я мог бы ускорить это? Я предполагаю, что создание фильтра (примерно 5000 С примерно 50 строками данных каждый), который обрабатывает каждый основной кластер по одному, а затем выполняет запрос, или создание временной таблицы 5000 раз и запуск запроса 5000 раз с 50 строками только ускорит обработку, но я никогда не делал ничего подобного. Есть ли у вас пример кода, который я мог бы попытаться приспособить к своей потребности ?

    2 Ответа

    Это работает для вас? Вам действительно нужно использовать ConcatRelated от Allen Browne

    вот ваше решение:

    MySQL решение

    В MySQL вы можете легко использовать функцию GROUP_CONCAT для достижения этой цели. Код для этого представлен ниже:

    И здесь вы можете получить доступ к ссылке на fiddle пример , который иллюстрирует это.

    Как использовать в Access

    В access у вас нет этой функции, естественно, но, как вы написали в своем вопросе, кто-то по имени Аллен Браун создал пользовательскую функцию для достижения того же результата ( ссылка ).

    По ссылке вы можете прочитать четкий способ его реализации в разделе How to use the function . Вам просто нужно добавить модуль с представленной функцией, скомпилировать и использовать его.

    Эквивалентный код в доступе

    Я считаю, что код в MySQL переведен на то же решение в MS Access будет:

    Похожие вопросы:

    Я знаю, что этот вопрос задавался несколько раз, но ни одно из решений не решает мою проблему. Я пытаюсь вставить строку в таблицу с именем ‘Audit Trail’ в MS Access 2007. Первичный ключ-столбец.

    Я имею дело примерно с десятком таблиц доступа MS, которые все связаны в один файл базы данных. Иногда я хотел бы иметь возможность получить объединение этих таблиц для создания полного набора.

    У меня есть форма с несвязанным combobox, который имеет все заголовки столбцов для таблицы dbo_orderheader. То, что я хочу сделать, — это использовать поле combobox в качестве заголовка столбца.

    Читать еще:  Access like в запросе

    Каковы плюсы и минусы использования полей Memo в базах данных Microsoft Access 2010 Accdb? Я изменяю базу данных Access 2010 (accdb), чтобы преобразовать 5 столбцов в таблицу из 45 000 записей.

    Я только начинаю изучать SQL и использую его с базой данных в Microsoft Access 2013. С помощью этой базы данных я импортирую CSV еженедельно, а затем получаю запрос для выбора определенных полей.

    Я использую Netbeans и Microsoft Access. В Microsoft Access у меня есть 5 полей данных, одно из которых- ID , которое является автоматическим номером, но когда я использую этот запрос от Java. int.

    Я создал таблицу запросов, используя комбинацию локальных таблиц и других запросов в Microsoft Access. Два столбца в этом запросе имеют одинаковое имя, можно ли это изменить в конструкторе запросов?

    У меня есть таблица базы данных в Microsoft Access. Я хочу присвоить значение по умолчанию одного из этих полей другому полю, которое происходит ранее в той же таблице. Я попробовал значение.

    Как получить все имена полей в таблице в Microsoft Access с помощью JET SQL? Спасибо всем

    Объединение полей в запросе access

    Есть две машины. Обе одинаковые. На обеих WinXP Pro RUS + Office 2003 + MDAC 2.8.
    На одной запрос-объединение с участием MEMO полей выполняется, на другой говорит что «Не возможно выполнить объединение с участием MEMO, OLE и . полей».
    Я не помню что и в какомпорядке ставилось на первую машину (где выполняется). На вторую уже поставил вроде все что только можно, а не выполняется.
    Может кто знает? Спасибо заранее.


    Johnmen © ( 2005-08-04 09:06 ) [1]

    Осталось сказать про СУБД.
    И компоненты доступа.


    sniknik © ( 2005-08-04 10:36 ) [2]

    кусочек из хелпа
    Дополнительные сведения
    Операцию INNER JOIN можно использовать в любом предложении FROM. Это самые обычные типы связывания. Они объединяют записи двух таблиц, если связующие поля обеих таблиц содержат одинаковые значения.

    Операцию INNER JOIN можно использовать с таблицами «Отделы» и «Сотрудники» для отбора всех сотрудников каждого отдела. Для отбора же всех отделов (в том числе тех, в которых нет ни одного сотрудника) или всех сотрудников (в том числе тех, кто не приписан ни к одному отделу) следует использовать операцию LEFT JOIN или RIGHT JOIN, которая создает внешнее объединение.

    Попытка объединить поля Memo или объекта OLE приведет к возникновению ошибки.

    Допускается объединение любых двух числовых полей подобных типов. Например, поле счетчика можно объединить с полем типа «Длинное целое». Однако нельзя объединить типы полей Single и Double.

    странно что хоть в одном случае работает. но возможно обьеденяются не по полям, а по выражениям(вычислении) с участием мемо. (тогда результат char(255))


    sniknik © ( 2005-08-04 10:46 ) [3]

    > На обеих WinXP Pro RUS + Office 2003 + MDAC 2.8.
    Jet в MDAC не входит с с версии 2.6 включительно. т.е. может быть различным раз специально не обновлял, а он указан как используемый движок.


    angel_b © ( 2005-08-04 11:29 ) [4]

    Я использовал неправильный термин. Не объединение (JOIN), а Слияние (UNION). Не знаю на сколько это меняет суть.
    Движок MS Access (Jet).

    2Johnmen: Компоненты доступа значения не имеют. Ощибка при выполнении запроса. Хоть из Delphi хоть из Access.

    2sniknik: На одной машине работает стабильно и всегда. Я не знал, что Jet не входит в MDAС. Но я не обновлял его вроде и другими средствами.


    sniknik © ( 2005-08-04 13:24 ) [5]

    > Я использовал неправильный термин. Не объединение (JOIN), а Слияние (UNION).
    ошибка
    > Не возможно выполнить объединение с участием MEMO, OLE и . полей»
    от join-а
    движок тоже термин спутал? ;о))


    AngeL B. ( 2005-08-04 15:29 ) [6]

    2sniknik: Вот запрос
    SELECT SO.Title, S.BaseCost, S.SaleCost, B.Data as TypeTitle
    FROM SaleObject AS SO, Sales AS S, [Справочник] AS B
    WHERE S.ObjectKey = SO.RecKey
    AND S.SaleDate = (SELECT Max(S2.SaleDate) FROM Sales AS S2 WHERE S2.ObjectKey=SO.RecKey)
    AND B.RecKey = SO.ObjectType
    AND S.SaleDate >= :StartDate AND S.SaleDate = :StartDate AND ContractDate = :StartDate AND ContractDate

    По отдельности, каждый запрос работает, через UNION нет. Поле Title в таблице Ground — MEMO, в таблице SaleObject — Char(200)
    По англ. в ошибке он говорит слово «union».


    sniknik © ( 2005-08-04 15:58 ) [7]

    > S.ObjectKey = SO.RecKey
    .
    > AND B.RecKey = SO.ObjectType
    .
    неявное обьеденение.


    sniknik © ( 2005-08-04 16:06 ) [8]

    > По англ. в ошибке он говорит слово «union».
    а, так ты и ошибку «перевел» !? тогда все сказаное лажа (возможно). начинай вопрос заново, только исходные данные точно приводи.

    + (тоже возможно)
    UNION неявно сортирует результат, а поле принимает тип первого в запросе, т.к. у тебя смешаны типы он возможно пытается отсортировать мемо.
    проверь
    первое поставь вместо UNION — UNION ALL (нет сортировки, но возможны дубли тогда)
    и второе на первое место поставь тот запрос в котором Title — MEMO. (чтобы не пыталось привести его к char(200) что невозможно, а наоборот его к MEMO приводило)


    Johnmen © ( 2005-08-04 16:12 ) [9]

    >Поле Title в таблице Ground — MEMO, в таблице SaleObject — Char(200)

    Вот она и проблема. Типы соответствующих полей запроса должны совпадать !


    sniknik © ( 2005-08-04 16:21 ) [10]

    > Типы соответствующих полей запроса должны совпадать !
    для accecc/jet необязательно, эта «интеллектуальная скотина» ;о)) очень много на себя берет, в том числе и автоприведение типов. беда лиш в том что это «она» делает не всегда.

    Ссылка на основную публикацию
    Adblock
    detector