Как сделать поиск в delphi из таблицы access?

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

Простая база данных «Телефонная книжка»

В качестве хранилища данных будем использовать обычную таблицу tab1.dbf с полями name и tel, где будем хранить ФИО человека и его телефон.

Сама табличка tab1.dbf может быть создана разными способами, или может быть табличкой какой нибудь учетной системы, например 1С.

В принципе, аналогичным образом можно использовать любое хранилище, например SQL сервер или базу Microsoft Access.

Таблица tab1.dbf находится в папке с исходниками.  В описанном ниже примере эта таблица лежит в корне диска D.

Сначала откройте Администратор источника данных ODBC, и в закладке Пользовательский DNS нажмите кнопку Добавить.

Как сделать поиск в delphi из таблицы access?

В открывшемся окне выберите Microsoft dBase Driver (.dbf) и нажмите Готово.

  • Как сделать поиск в delphi из таблицы access?

    В Установках драйвера ODBC для dBase придумайте название источника данных (у нас «dbf»).

  • Затем снимите галочку «Использовать текущий каталог » и выберите место, где лежит наша таблица tab1.dbf, в примере это D:
  • После ввода имени источника данных и каталога нажмите ОК, и затем в Администраторе источника данных ODBC нажмите OK, Администраторе источника данных ODBC закроется.
  • Следующим этапом создаем новый проект.
  • На форме размещаем два элемента для ввода ФИО и телефона — Edit1 и Edit2, и Label1 и Label2 для обозначения названий этих полей.
  • Как сделать поиск в delphi из таблицы access?
  • Затем размещаем две кнопки —  Button1 и Button2.
  • Как сделать поиск в delphi из таблицы access?
  • Затем в свойство Caption элементов вводим названия элементов Label1 — ФИО, Label2-Телефон.
  • Для кнопок в свойство Caption вносим для Button1-Добавить, в ней будет код для добавления записей в базу, и для Button2-Удалить, в ней будет код для удаления записей.
  • Как сделать поиск в delphi из таблицы access?
  • Затем из закладки Data Access на панели компонентов помещаем на форму компонент DataSource1.
  • Как сделать поиск в delphi из таблицы access?
  • Затем переходим в закладку BDE и оттуда помещаем на форму компонент Table1.
  • Как сделать поиск в delphi из таблицы access?
  • Затем переходим в закладку Data Controls и оттуда помещаем на форму компонент DBGrid1.
  • Как сделать поиск в delphi из таблицы access?
  • Затем мышкой выделите компонент DataSource1 и на панели Object Inspector установите для него свойство DataSet равным значению Table1 (можно выбрать из выпадающего списка).
  • Как сделать поиск в delphi из таблицы access?
  • Затем раскройте плюсиком ветку DataSet  на панели Object Inspector и для свойства DatabaseName выберите источник данных dbf, который мы добавили в источники данных ODBC в самом начале урока.
  • Затем для свойства TableName выберите нашу табличку tab1, которую мы добавили как источник данных «dbf» в самом начале урока.
  • Для компонента Table1  параметр DatabaseName должен стоять «dbf», а параметр TableName должен быть равен значению «tab1».
  • Для компонента DBGrid1  параметр DataSource должен стоять «DataSource1», а параметр  DataSet должен быть «Table1».
  • Затем в свойствах компонента DataSource1 сделаем свойство Active равным True, сделав этот источник данных активным.
  • Теперь вставим код в кнопки.
  • Сначала дважды щелкнем мышкой по кнопке Добавить и в событие Button1Click вставим следующий код:

procedure TForm1.Button1Click(Sender: TObject);
begin

with Table1 do
begin

Insert;
FieldByName('name').AsString := trim(Edit1.Text);
FieldByName('tel').AsString := trim(Edit2.Text);
Post;

end;

Edit1.Text:='';
Edit2.Text:='';

end;

  1. Это код для добавления строчки в таблицу tab1.
  2. Сначала добавляется строчка со значениями ФИО и Телефона, потом эти два поля ввода делаются снова пустыми, для следующего ввода.
  3. Потом дважды щелкнем мышкой по кнопке Удалить и в событие Button2Click вставим следующий код:

procedure TForm1.Button2Click(Sender: TObject);
begin

with table1 do
begin
Delete;
end;

end;

  • Для полноты картины добавим еще два компонента, Edit3 и Button3 И сделаем из них поиск по таблице.
  • Дважды щелкнем мышкой по кнопке «поиск» и в событие Button3Click вставим следующий код:

procedure TForm1.Button3Click(Sender: TObject);
begin

if trim(Edit3.Text)='' then
begin

Table1.Filtered:=false;

end
else begin

Table1.Filter:='name='+chr(39)+trim(Edit3.Text)+chr(39);
Table1.Filtered:=true;

end;

end;

Данный код осуществляет поиск по ФИО и отображает в таблице tab1 записи, где поле name совпадает с введенным в Edit3 текстом, а если поле поиска пустое, то фильтр при нажатии на Button3 снимается.

В конце дважды щелкнем мышкой по основной форме и в событие FormCreate вставим следующий код:

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
end;

  1. Этот код делает все поля ввода (ФИО, телефон и поиск) пустыми при загрузке формы.
  2. Ну и по итогам разместим все элементы формы в удобном виде и введем название основной формы нашей программы- «ТЕЛЕФОННАЯ КНИЖКА».
  3. Запускаем проект на выполнение и получается вот такая простенькая база данных «ТЕЛЕФОННАЯ КНИЖКА».
  4. Сначала вводится ФИО и телефон в поля ввода
  5. Затем нажимаем кнопку Добавить и строчка с ФИО и телефоном добавляется в таблицу.
  6. При вводе в поле поиска искомого ФИО и нажатия кнопки «поиск» в таблице отобразятся строки, где есть искомое ФИО.
  7. Для снятия фильтра очищаем поле поиска и снова нажимаем кнопку «поиск».
  8. Для удаления человека из базы выбираем строчку и нажимаем кнопку Удалить.
  9. Естественно, Вы можете сделать в базе любые другие столбцы в зависимости от потребностей.
  10. Скачать исходники базы данных «ТЕЛЕФОННАЯ КНИЖКА» на Delphi7

Когда я уже сделал этот урок, то наткнулся в интернете на  Пошаговое описание создания базы данных (на www.araxgroup.ru ), которое очень похоже по смыслу на изложенную выше информацию, там тоже разбирается пример создания «Телефонной книжки» и он может быть также интересен тем, кто начинает знакомство с базами данных.

И там-же для себя нашел очень неплохую бесплатную программку для учета клиентов и заказов, называется Клиенты 2.0.9

Источник: https://ds-release.ru/borland-delphi-7/prostaya-baza-dannyx-na-delphi7/

Изучаем Delphi — Запросы к базам данных и язык SQL

В предыдущих главах, посвященных работе с СУБД, мы рассмотрели базовые аспекты работы с данными с использованием средств VCL. Вместе с тем, при работе с СУБД очень часто возникает необходимость в выполнении более сложных операций.

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

Для таких целей используют специальный язык, который «понимают» СУБД — язык SQL, а для создания обращений к СУБД на этом языке в VCL имеется специальный компонент — Query.

Язык SQL

Все современные клиент-серверные СУБД имеют одну общую черту — работа с ними строится на языке SQL — Structured Query Language (структурированный язык запросов).

Кроме того, чтобы не лишать разработчиков БД на Delphi возможности работать при помощи SQL с обычными файловыми СУБД типа dBase и Paradox, BDE предоставляет возможность прозрачного использования SQL и для них, используя свои внутренние механизмы.

Стандарт языка SQL определяется ANSI (Американским национальным институтом стандартов). Вместе с тем, каждый производитель СУБД считает своим долгом дополнить язык собственными расширениями которые, как они считают, будут весьма полезны.

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

Здесь мы будем рассматривать SQL на основе наиболее полно поддерживаемых всеми СУБД вариантами ANSI-89 и ANSI-92.

Язык SQL предназначен для манипулирования данными в реляционных базах данных, определения структуры баз данных и для управления правами доступа к данным в многопользовательской среде. По этой причине язык SQL состоит из 3 составных частей:

  • Языка манипулирования данными (Data Manipulation Language, DML);
  • Языка определения данных (Data Definition Language, DDL);
  • Языка управления данными (Data Control Language, DCL).

Все эти языки являются составной частью языка SQL. Фактически, каждый из них содержит набор команд SQL, предназначенных для своей области. В процессе работы с БД, пожалуй, чаще всего используется язык манипулирования данными, состоящий из 4 основных команд — SELECT, INSERT, UPADTE и DELETE, при помощи которых производится, соответственно, выборка, вставка, обновление и удаление данных.

Язык определения данных служит для создания и изменения структуры БД — таблиц, индексов и т.д.

Он состоит из 3 групп команд — CREATE, ALTER и DROP (создание, изменение и удаление, соответственно), каждая из которых может манипулировать с одним из 6 объектов — базой данных, таблицей, виртуальной таблицей, индексом, триггером или хранимой процедурой. Таким образом, например, для команды CREATE мы получаем следующие 6 вариантов:

  • CREATE DATABASE — создать базу данных;
  • CREATE TABLE — создать таблицу;
  • CREATE VIEW — создать виртуальную таблицу;
  • CREATE INDEX — создать индекс;
  • CREATE TRIGGER — создать триггер;
  • CREATE PROCEDURE — создать хранимую процедуру.

Впрочем, триггеры и, в особенности, хранимые процедуры относятся исключительно к компетенции промышленных СУБД, которые мы в этой книге рассматривать не будем. То же самое относится и к языку управления данными (иногда его еще называют языком управления доступом) — он состоит из 2 основных команд — GRANT (дать права) и REVOKE (забрать права).

ПРИМЕЧАНИЕ На самом деле, для современных клиент-серверных СУБД существует ряд дополнительных команд SQL, позволяющих, например, определять собственные функции для обработки данных (CREATE FUNCTION), создавать резервные копии таблиц, преобразовывать типы таблиц и т.д. Далеко не все они входят в состав стандарта языка SQL, поэтому информацию по ним следует брать из поставляемой вместе с конкретной СУБД документации.

Мы не будем рассматривать точный синтаксис всех команд SQL, поскольку это потребовало бы объема, соизмеримого с целой книгой.

Вместо этого мы рассмотрим основные команды на примерах, что намного более важно для понимания SQL, чем точный синтаксис, который, при необходимости, всегда можно посмотреть в документации на используемую СУБД. А начнем с рассмотрения команд языка манипулирования данными.

Команда SELECT

Наиболее важной командой языка манипулирования данными является команда SELECT (выбрать). За кажущейся простотой ее синтаксиса скрывается огромное число возможностей.

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

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

SELECT выражения_для_выборки FROM таблицы [параметры выборки]

В качестве выражения для выборки обычно перечисляют поля таблиц. Если требуется вывести все поля, то используют символ «*»:

SELECT BILL_ID, BILL_SUMM FROM BILL
SELECT * FROM BILL

В первом случае будут выведены поля BILL_ID и BILL_SUMM из таблицы BILL, а во втором — все поля из этой же таблицы. В этом нетрудно убедиться, воспользовавшись утилитой SQL Explorer для написания запроса.

Для этого запустите SQL Explorer, откройте нужную БД, например, DATA1 (или предварительно создайте новый алиас для более полной версии БД, созданной для примера DBApp), и в правой части окна щелкните по закладке Enter SQL, после чего введите нужный код и нажмите на кнопку Execute Query.

Результат выполнения запроса незамедлительно будет выведен в таблицу внизу (рис. 21.1).

Как сделать поиск в delphi из таблицы access?

СОВЕТ Если у вас установлена версия Delphi, не имеющая этого инструмента, то для экспериментов с командой SELECT вы можете использовать приложение SQLELE, которое можно найти в каталоге ToolsSQLE_LE.

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

SELECT * FROM bill ORDER BY BILL_SUMM

Если бы требовалось выполнить сортировку не по возрастанию, а по убыванию, то в конце выражения следовало бы добавить ключевое слово DESC:

SELECT * FROM bill ORDER BY BILL_SUMM DESC

Выборка записей из таблицы производится при помощи условия, определяемого после ключевого слова WHERE. Например, если надо выбрать только те счета, которые были после 15 декабря, следует написать следующий SQL-запрос (формат написания даты в данном случае зависит от системных установок):

SELECT * FROM bill WHERE BILL_DATE>'15.12.2005'

Если при этом так же требуется еще и выполнить сортировку, то в конец выражения добавляют определение ORDER BY:

SELECT * FROM bill WHERE BILL_DATE>'15.12.2005' ORDER BY BILL_SUMM

В случае, когда условий больше одного, то их объединяют при помощи логических AND или OR:

SELECT * FROM bill WHERE BILL_DATE>'15.12.2005' AND BILL_SUMM>100
SELECT * FROM bill WHERE BILL_DATE>'15.12.2005' OR BILL_SUMM>300

Все эти примеры иллюстрируют общую форму команды SELECT в языке SQL (для одной таблицы): SELECT (выбрать) указанные поля FROM (из) указанной таблицы WHERE (где) заданные условия истинны.

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

В этом случае придется задействовать 2 таблицы — bill и customer, причем связующим полем будет номер клиента, т.е. поле BILL_CUST в таблице счетов и поле CUST_ID в таблице клиентов.

В результате, мы получаем следующее выражение:

SELECT CUST_NAME, BILL_SUMM FROM bill, customer WHERE CUST_ID = BILL_CUST

Опять-таки, к данному условию, связывающему поля таблиц, можно добавить дополнительные, скажем, ограничивающие даты или суммы, равно как и определить упорядочивание вывода. Например, можно добавить условие, что сумма счета должна быть свыше 250, а так же задать упорядочивание по имени клиента (рис. 21.2).

Как сделать поиск в delphi из таблицы access?

Следует учитывать, что подобное связывание таблиц — путем указания условия в конструкции WHERE, является устаревшим и применяется лишь тогда, когда требуется добиться совместимости с SQL89. Более новый стандарт, SQL92, рекомендует использовать для связывания таблиц ключевое слово JOIN. Таким образом, предыдущий пример можно переписать следующим образом:

SELECT CUST_NAME, BILL_SUMM FROM customer JOIN bill ON CUST_ID = BILL_CUST

Важно отметить, что условия объединения помещают после ключевого слова ON, в то время, как остальные условия можно указать после WHERE. Таким образом, если бы нам надо бы добавить ограничения на сумму, то можно было бы написать 2 равнозначных варианта:

SELECT CUST_NAME, BILL_SUMM FROM customer JOIN bill ON CUST_ID = BILL_CUST AND BILL_SUMM>250;
SELECT CUST_NAME, BILL_SUMM FROM customer JOIN bill ON CUST_ID = BILL_CUST WHERE BILL_SUMM>250;

Для удобства можно задавать локальные «имена» как для полей, так и для таблиц. Это бывает полезным в тех случаях, когда в большом и сложном запросе используется множество условий с длинными именами полей и таблиц:

SELECT EXTRA_USER_DATA_INFO AS a, EXTRA_USER_DATA_NAME as b FROM USER_TABLE WHERE a > 10 AND a < 100 AND b != 'Super' ORDER BY b

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

SELECT BILL_DATE, BILL_SUMM, BILL_SUMM * 1.18 as WITH_TAX FROM BILL ORDER BY WITH_TAX

В таком случае названием столбца с вычисленным значением будет «WITH_TAX» (см. рис. 21.3).

Как сделать поиск в delphi из таблицы access?

При подобном переименовании столбцов следует быть внимательным, поскольку использование идентификаторов, совпадающих с ключевыми словами SQL, приведет к ошибке. Кроме того, следует избегать использования символов кириллицы, поскольку они не поддерживаются многими СУБД в данном контексте.

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

SELECT COUNT(*) FROM bill

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

SELECT COUNT(*) FROM bill WHERE BILL_DATE < '01.01.2006'

Помимо COUNT, в стандартном SQL предусмотрено еще 4 агрегирующих функции — для вычисления суммы (SUM), максимального (SUM) и минимального (MIN) значений столбцов, а так же среднего арифметического (AVG). Результатом выполнения запроса по всем этим функциям для таблицы счетов будет таблица, состоящая из 4 столбцов, в каждом из которых будет находиться результат вычислений (рис. 21.4).

Как сделать поиск в delphi из таблицы access?

Что касается заданий ограничений на обрабатываемые данные, ровно, как и на выводимые при помощи «обычного» запроса строки, то помимо реляционных операторов сравнения — больше (>), меньше (=), меньше или равно (

Источник: http://www.snkey.net/books/delphi/ch4-5.html

Простой поиск дубликатов записей в таблицах (на примере Access)

Перейти к содержимому

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

В этой статье мы рассмотрим простой поиска дубликатов. В качестве примера используем СУБД Access.

Допустим у нас имеется таблица «Товары», которой хранится название товара и его цена. При этом один и тот же товар не может продаваться по разным ценам. Но, если мы посмотрим на скриншот для таких товаров, как хлеб и макароны существует 3 и 2 варианта цены соответственно, хотя по постановке задачи этого быть не должно.

Как сделать поиск в delphi из таблицы access?

По-хорошему, при создании таблицы нужно было добавить уникальный индекс для поля «Название», но это сделано не было.

Сейчас это сделать пока невозможно, т.к. добавление уникального индекса для поля с неуникальными записями вызовет ошибку и такой индекс не будет добавлен.

Поэтому перед добавлением индекса нужно найти и затем удалить не нужные дубликаты.

Сразу отметим, что дубликаты могут быть полными (совпадают все поля, кроме первичного ключа (id)) или частичными (совпадает только часть полей). В нашем примере мы имеет дело с последними.

Для поиска любых дубликатов мы можем воспользоваться одним простым способом. Это запрос с группировкой для подсчёта количества записей при помощи функции count и отбором записей количество которых составляет 2 и более.

В нашем случае требуется найти дубликаты по полю «Название» и потому данный запрос будет выглядеть следующим образом.

SELECT Название, COUNT(Код) AS Дубликатов FROM Товары GROUP BY Название HAVING COUNT(Код) >=2;

SELECT Название, COUNT(Код) AS Дубликатов FROM Товары GROUP BY Название HAVING COUNT(Код) >=2;
  • Результат его выполнения:
  • Как сделать поиск в delphi из таблицы access?
  • Если при поиске дубликатов нужно учитывать несколько полей, то они добавляются в предложения SELECT и GROUP BY как показано ниже.

SELECT Артикул, Название, Категория, COUNT(Код) AS Дубликатов FROM Товары GROUP BY Артикул, Название, Категория HAVING COUNT(Код) >=2;

SELECT Артикул, Название, Категория, COUNT(Код) AS Дубликатов FROM Товары GROUP BY Артикул, Название, Категория HAVING COUNT(Код) >=2;

Отличительной чертой метода рассматриваемого в данной статье является его универсальность, т.к. в нём используется стандартный функционал SQL, который позволяет не только искать почти любые дубликаты, но применять его в любой реляционной СУБД.

Источник: http://streletzcoder.ru/prostoj-poisk-dublikatov-zapisej-v-tablitsah-na-primere-access/

Работа с базой данных Access в Delphi

В данной статье рассмотрим как можно реализовать программу, которая сможет работать с данными, размещенными в файле СУБД MS Access. Программе необходимо подключиться к внешнему файлу БД. Затем, в ней должна быть реализована форма, в которой пользователь сможет просматривать записи из таблицы БД, добавлять новые записи, удалять или редактировать их.

Обычно, для работы с текстовым файлом в Delphi достаточно использовать простые команды связи внешнего файла с файловой переменной и команды чтения и записи.

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

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

  • Чтобы организовать работу программы с БД, потребуется следующие компоненты:
  • ADOConnection – используется для подключения к БД (закладка палитры ADO, в некоторых версиях dbGO);
  • ADOTable – связывается с конкретной таблицей БД (закладка ADO);
  • DataSource – компонент, используется как связка данных из таблиц, с отображающими и управляющими компонентами Delphi (закладка Data Access);
  • DBGrid – таблица, позволяющая вывести содержимое таблицы БД на пользовательскую форму (закладка Data Controls);
  • DBNavigator – кнопочная панель, способная управлять данными в привязанной к ней таблице (закладка Data Controls).

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

Свойство ConnectionString компонента ADOConnection

Свойство ConnectionString удобно настраивается в специальных окнах. Открываем редактор свойства ConnectionString в инспекторе объектов кнопкой «…». В появившемся окне оставляем все настройки как они были по умолчанию и нажимаем кнопку «Build…».

Получаем еще одно окно с несколькими закладками.

В первой закладке «Поставщик данных» выбираем в списке «Microsoft.Jet.OLEDB.4.0» и жмем «Далее >>».

Во второй закладке «Соединение» в поле «1. Выберете или введите имя базы данных:» жмем «…» и привычным окном выбираем нужный файл БД. Здесь стоит отметить, что при выборе адреса, будет указан полный путь, начиная от корневой директории.

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

Если в этом поле указать только имя файла БД, то программа будет открывать ее из той же директории, где она находится, в какую бы директории ее не разместили. Естественно файл БД должен находиться в той же папке, куда вы сохраняете свой проект Delphi.

Нажимаем кнопку «ОК».

Снова видим предыдущее окно, но уже с заполненной строкой. Снова нажимаем «ОК». Все, настройка свойства ConnectionString завершена.

Свойство LoginPrompt компонента ADOConnection

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

Свойство Connected компонента ADOConnection

Свойство определяет, выполнено ли подключение в данный момент. Чтобы не подключаться к БД программно после запуска приложения, указываем True. Если после присвоению свойству значения True, Delphi не вывел никаких сообщений об ошибках, значит, все выполнено правильно. В случае ошибок, стоит проверить, правильно ли указано имя файла БД или «Поставщик данных».

Свойство Connection компонента ADOTable

Выбираем из списка созданный и настроенный компонент ADOConnection. Как альтернатива этому свойству у компонента ADOTable есть собственное свойство ConnectionString, которым точно так же можно настроить подключение прямо к БД. Но если планируется работать с несколькими таблицами, гораздо удобней настроить подключение один раз и далее для всех таблиц пользоваться им.

Свойство TableName компонента ADOTable

Выбираем из списка необходимую таблицу из БД.

Свойство Active компонента ADOTable

Свойство, определяющее режим работы компонента. Указываем значение True. Если сообщений об ошибках нет, все нормально. Если есть, проверьте предыдущие два свойства.

Свойство DataSet компонента DataSource

Из списка выбираем нужную таблицу, если их несколько. Обычно для удобства каждой таблице в БД соответствует своя пара ADOTable + DataSource.

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

Свойство DataSource компонентов DBGrid и DBNavigator

Свойство настраивается выбором из списка нужного компонента DataSource.

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

Источник: https://space-base.ru/library/?book=11

Поиск в базе данных

CodeNet / Языки программирования / Delphi & Kylix / Базы данных
перевод одноимённой статьи с delphi.about.com

Самая распространённая задача, которую решают приложения работающие с базами данных — это поиск необходимых записей по заданному критерию. В Delphi, компоненты ADOExpress включают в себя методы поиска записей, аналогичные тем, которые используются в BDE.

  • В данной статье будут рассмотрены различные способы поиска данных разработке ADO-приложений в Delphi
  • Обычно алгоритм поиска строится по следующей схеме: начинаем поиск с начала таблицы, проверяем поле в каждой строке на предмет удовлетворения нашему критерию, останавливаем цикл на выбранной записи.
  • Давайте рассмотрим несколько способов расположения данных, полученных из БД посредствам компонента ADODataset (для Таблицы и для Запроса).

Locate

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

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

В приведённом ниже коде, метод Locate ищет первую запись, содержащую строку 'Zoom' в поле 'Name'. Если вызов Locate возвращает True — то запись найдена и установлена как текущая.

AdoTable1.Locate('Name','Zoom',[]);

{…или…}

var ffield, fvalue: string;
opts : TLocateOptions;

ffield := 'Name';
fvalue := 'zoom';
opts := [loCaseInsensitive];

if not AdoTable1.Locate(ffield, fvalue, opts) then
ShowMessage(fvalue + ' not found in ' + ffield);

Lookup

Метод Lookup не перемещает курсор в соответствующую строку, а только возвращает её значение. Lookup возвращает массив переменных, содержащих значения из полей, указанных в разделённом точкой с запятой списке имён, значения которых должны быть возвращены из интересующей нас строки. Если соответствующих нашему запросу строк не найдено, то Lookup вернёт пустую (Null) переменную.

Следующий пример заполняет заполняет массив переменных LookupRes

var LookupRes: Variant;

LookupRes := ADOTable1.Lookup
('Name', 'Zoom', 'Author; Description');

if not VarIsNull(LookupRes) then
ShowMessage(VarToStr(LookupRes[0])) //имя автора

Одно из преимуществ методов Locate и Lookup, состоит в том, что они не требуют, чтобы таблица была проиндексирована. Однако, функция Locate будет работать намного быстрее, если таблица будет проиндексирована.

Индексирование

Источник: http://www.codenet.ru/progr/delphi/stat/DB-Search.php

Delphi: Подскажите поиск по базе -> Форум на Исходниках.Ру

 Delphi: Подскажите поиск по базе

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему
Подскажите как Зделать поиск по базе данных если я ввожу в Edit1 и мне надо чтобы точно я ввёл в поле Edit1 нашлось в поле базы Сообщение отредактировано: vot — 18.02.03, 18:36
if Table1.Locate(SomeFieldName,Edit1.Text,[]) then ShowMessage('Запись найдена !');
Дважды щелкнуть по Эдиту и написать:edit1.Text:=AnsiUpperCase (edit1.Text);TTable.SetKey;TTable.FieldByName('  тут пишеш имя поля по которому искать   ').AsString:=Edit1.Text;Как только начинаеш вводить сразу идет поиск. (особый шик что без кнопки  ;D);
2Lexus: Да, но ведь база может быть огромной… и соответственно поиск может занимать уйму времени…2All: Как произвести поиск через ADO по части слова находящемся в любом месте… т.е. например: есть база с одним полем «модели» и строками «BMV M3», «BMV M5», «Mercedes 320», «BMV Z3», ….. мне надо найти все записи где есть цифра «3» или буква «M»…Спасибо!
BDQ: насчет скорости ты ошибаешся т.к. я достал БД телефонов и адресо своего города и написал прогу под нее, так вот у меня именно такой поиск и я незамечаю задержки. Потому что допустим ты набрал цифру «4», он покажет тебе первыйже номер начинающийся с нее, а не все существующие с первой цифрой «4».
Newbie Рейтинг (т): 0 Цитата Lexus, 16.02.03, 18:03:26BDQ: насчет скорости ты ошибаешся т.к. я достал БД телефонов и адресо своего города и написал прогу под нее, так вот у меня именно такой поиск и я незамечаю задержки. Потому что допустим ты набрал цифру «4», он покажет тебе первыйже номер начинающийся с нее, а не все существующие с первой цифрой «4».Я называю это контекстным поиском. Когда-то я тоже написал телефонный справочник для своего города. Но добавил еще такую функциональную возможность, что-бы пользователь ChekBox-м  мог переключать с режима контекстного поиска, на режим фильтрации, который осуществляется методом SetRange:procedure TfMain.Edit1Change(Sender: TObject);begin  if Edit1.Text ''    then begin      if Length(Edit1.Text)

Источник: https://forum.sources.ru/index.php?showtopic=24606

Несколько вопросов по Delphi и Access

0.Подключиться к access
Кидаем на форму adoconnection1
в connectionstring указываем
provider=microsoft.jet.oledb.4.0;data source=c:ПУТЬИМЯ.mdb;persist security info=false (
microsoft.jet.oledb.4.0… — строку подключения можно менять как обычную текстовую. Может быть довольно много параметров
s:='provider=microsoft.jet.oledb.4.

0;'+
'user id=admin;'+ {id пользователя}
'data source='+basename+';'+ {цепляемся к базе}
'mode=readwrite;extended properties=»»;'+
'jet oledb:system database=»»;'+
'jet oledb:registry path=»»;'+
'jet oledb:database password=»1234″;'+ {а вот и пароль}
'jet oledb:engine type=5;'+
'jet oledb:database locking mode=1;'+
'jet oledb:global partial bulk ops=2;'+
'jet oledb:global bulk transactions=1;'+
'jet oledb:new database password=»»;'+
'jet oledb:create system database=false;'+
'jet oledb:encrypt database=false;'+
'jet oledb:don''t copy locale on compact=false;'+
'jet oledb:compact without replica repair=false;'+
'jet oledb:sfp=false';
adoconnection1.loginprompt:=false; // не использовать логин
) Кидаем adotable и/или adoqwery
у них в connection указываем adoconnection1
До работы с таблицами выполняем
adoconnection1.open; // подключение к базе
Дальше по обычной схеме работы с базой Если не знаешь как работать с базами, то читай уроки

http://articles.org.ru/cfaq/index.php?qid=1450&catid=96

или лекции

http://articles.org.ru/lection/sozdbd.php

http://articles.org.ru/lection/compbd.php
http://articles.org.ru/lection/query.php Там все про bde, но идея таже за исключением того, что вместо например table надо использовать adotable вместо qwery adoqwery
Т.е. не закладку bde, а закладку ado.
dataacces и datacontrols остаются те же

1. Как через delphi создать базу данных access?

procedure createmsaccessdatabase(filename: string);
var
dao: variant;
i: integer;
const
engines: array[0..2] of string = ('dao.dbengine.36', 'dao.dbengine.35',
'dao.dbengine');

  • function checkclass(oleclassname: string): boolean;
  • begin
  • end;

var
res: hresult;
result := cocreateinstance(progidtoclassid(oleclassname), nil,
clsctx_inproc_server or clsctx_local_server, idispatch, res) = s_ok;
begin
for i := 0 to 2 do
if checkclass(engines[i]) then
begin
dao := createoleobject(engines[i]);
dao.workspaces[0].createdatabase(filename,
';langid=0x0409;cp=1252;country=0', 32);
exit;

end;

raise exception.create('dao engine could not be initialized');

end;

2. Как создать таблицу?

var
access, db, td, recordset: variant; массив констант соответствия типов данных (между полями в delphi и типами полей dao) arrmdbtypes: array[tfieldtype] of integer =
({dbtext} 10 {ftunknown},
{dbtext} 10 {ftstring},
{dbinteger} 3 {ftsmallint},
{dblong} 4 {ftinteger},
{dbinteger} 3 {ftword},
{dbboolean} 1 {ftboolean},
{dbdouble} 7 {ftfloat},
{dbcurrency} 5 {ftcurrency},
{dbdouble} 7 {ftbcd},
{dbdate} 8 {ftdate},
{dbtime} 22 {fttime},
{dbdate} 8 {ftdatetime},
{dblongbinary} 11 {ftbytes},
{dblongbinary} 11 {ftvarbytes},
{dbinteger} 3 {ftautoinc},
{dblongbinary} 11 {ftblob},
{dbmemo} 12 {ftmemo},
{dblongbinary} 11 {ftgraphic},
{dbmemo} 12 {ftfmtmemo},
{dblongbinary} 11 {ftparadoxole},
{dblongbinary} 11 {ftdbaseole},
{dbbinary} 9 {fttypedbinary},
{dbtext} 10 {ftcursor} {$ifdef ver120}
,
{dbtext} 10 {ftfixedchar},
{dbtext} 10 {ftwidestring},
{dbbigint} 16 {ftlargeint},
{dbtext} 10 {ftadt},
{dbtext} 10 {ftarray},
{dbtext} 10 {ftreference},
{dbtext} 10 {ftdataset}

  1. {$else}
  2. {$else}
  3. end;
  4. end;

{$ifdef ver125}
,
{dbtext} 10 {ftfixedchar},
{dbtext} 10 {ftwidestring},
{dbbigint} 16 {ftlargeint},
{dbtext} 10 {ftadt},
{dbtext} 10 {ftarray},
{dbtext} 10 {ftreference},
{dbtext} 10 {ftdataset}
{$ ,
{dbtext} 10 {ftfixedchar},
{dbtext} 10 {ftwidestring},
{dbbigint} 16 {ftlargeint},
{dbtext} 10 {ftadt},
{dbtext} 10 {ftarray},
{dbtext} 10 {ftreference},
{dbtext} 10 {ftdataset},
{dblongbinary} 11 {ftorablob},
{dblongbinary} 11 {ftoraclob},
{dbtext} 10 {ftvariant},
{dbtext} 10 {ftinterface},
{dbtext} 10 {ftidispatch},
{dbguid} 15 {ftguid}
{$endif}
{$endif}
{$endif} ); // загружаем dao:
try
access := getactiveoleobject('dao.dbengine.35');
except
access := createoleobject('dao.dbengine.35'); // открываем базу данных
try
db := access.opendatabase(yourdatabasename);
except
exit // создаtм новую таблицу в открытой базе данных
td := db.createtabledef(yourtablename, 0, '', ''); // добавляем в таблицу поле с описаниями
td.fields.append(td.createfield(strfieldname,
arrmdbtypes[intdatatype], size)); // например,
td.fields.append(td.createfield('id', arrmdbtypes[intdatatype], size));
td.fields.append(td.createfield('name', arrmdbtypes[intdatatype], size)); // добавляем таблицу в список таблиц
db.tabledefs.append(td); // открываем созданную таблицу
recordset := db.opentable(yourtablename, 0); // добавляем новую запись в открытую таблицу
recordset.addnew; // изменяем значения поля

curfield := recordset.fields[0].value := 1;

curfield := recordset.fields[1].value := 'first record'; // помещаем новую запись в базу
recordset.update(dbupdateregular, false);
// где
const
dbupdateregular = 1; // закрываем recordset
recordset.close; // закрываем базу данных
db.close; // освобождаем экземпляр dao
access := unassigned;

3. Как получить список таблиц существующей БД? (заполнить ими например stringlist)

var
x: tstrings;

begin

x:=tstringlist.create; adoconnection.gettablenames(x, false или true) операции с x… x.free;

4. Как получить список полей существующей таблицы БД?

Это уже смешно, если Вы знаете имена таблиц adottable.fields[xxx].filedname где xxx порядковый номер поля

fieldscount — как всегда 🙂

Источник: http://www.realcoding.net/article/view/4429

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