Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Создание БД MS Access


Автор: Сарт 20.9.2006, 18:40
Собственно, сабж.
Если можно, простой примерчик, скажем для переменнны a и b, вводимых через Edit.
+поиск по БД, подключение БД ну и т.д.=)
Заранее спасибо=)

Автор: Rodman 20.9.2006, 19:31
Если у тебя уже есть база данных на Access... то тебе необходимо к ней подключиться...

Проще всего использовать ADO компоненты на соответсвующей закладке...

ADOConnection - добавляешь на форму и заполняешь свойство ConnectionString... т.к. у тебя база на Access, то выбирай драйвер Jet 4...

После этого добавляешь на форму ADOQuery и в нем добавляешь в поле Connection свой ADOConnection... 

и на конец в поле SQL пишешь запрос
Код

INSERT INTO TableName (Field1, Field2, ...)
VALUES (:Prm1, :Prm2, ...);


а в делфях пишешь
Код

ADOQuery.ParamByName('Prm1').value:=Edit1.Text;
ADOQuery.ParamByName('Prm2').value:=Edit2.Text;
ADOQuery.ExecSQL;


и будет тебе счастье...  если нет - пиши, спрашивай...

Автор: Сарт 20.9.2006, 20:51
К сожалению, у меня нету БД Аксесс=).
у меня есть чисто форма=) 
И есть кнопка Сохранить в БД. И есть кнопка поиск по БД. И если я не сделаю так,чтобы они заработали не будет меня=).

Так что, пожалуйста, ооочень подробно. 
Я бы хотел сделать так примерно:
При нажатии на кнопку искать в папке файл, скажем, 1.mdb При отсутсвии--создавать его, (ну и заполнять данными едитов). При наличии--открывать на запись.

Ну и поиск нужно реализовать по значению Едита А(стринговая переменная)
и по значению Едита Б(тож стринговая, фио хранит).

Также, нужно чтобы совпадение по значению Едита А было не строгим, то есть ,допустим, я ввожу 2 000 000, и оно находит все данные, начинающиеся на 2 000 000 (2 100 000, 2 999 999 например).

Помогите плиз=).

На всяк случай кидаю архив с проектом.

Автор: Rodman 20.9.2006, 20:54
Какой файл??? Где???

Добавлено @ 20:56 
Или ты программно хочешь создавать БД???

Автор: Сарт 20.9.2006, 20:59
Отредактил,все лежит=)

Автор: Rodman 22.9.2006, 18:19
Понимаешь... с Access у меня не удавалось не то что саму базу создать... а таблицу добавить в уже существующую базу...


Цитата(Сарт @  20.9.2006,  20:51 Найти цитируемый пост)
Также, нужно чтобы совпадение по значению Едита А было не строгим, то есть ,допустим, я ввожу 2 000 000, и оно находит все данные, начинающиеся на 2 000 000 (2 100 000, 2 999 999 например).


ну частичный поиск можно реализовать с помощью функции pos... но у ты хочешь найти совпадения в разных частях слова... такое возможно, если сравнивать посимвольно (т.е. на одном месте, по счету, долна стоять такая же цыфра или буква)... Сколько символов тебе нужно чтобы совпадало???

Я ща не могу твой проект глянуть...

Ты ответь на вышестоящие вопросы и вот на эти, а я на выходных твой проект посмотрю... попробую помоч...

1. 
Цитата(Сарт @  20.9.2006,  20:51 Найти цитируемый пост)
И есть кнопка Сохранить в БД.
 Как должна выглядить таблица в которую сохранять и одна ли она???
2.
Цитата(Сарт @  20.9.2006,  20:51 Найти цитируемый пост)
И есть кнопка поиск по БД. 
 Поиск в той же таблице по добавленным данным???
3. 
Цитата(Сарт @  20.9.2006,  20:51 Найти цитируемый пост)
Ну и поиск нужно реализовать по значению Едита А(стринговая переменная)
и по значению Едита Б(тож стринговая, фио хранит).
 Поиск производить если оба эдита заполнены???
4. Данные какого типа в базе???

Жду... Постараюсь помочь...

Автор: Сарт 22.9.2006, 20:10
Постараюсь ответить попонятнее=)
Мне нужно, чтобы можно было выбирать-строгое соответствие или нет. В случае строгого-думаю, все понятно. В случае не строгого--совпадала первая цифра. НО! при этом совпадал и порядок числа(то есть при вводе 2 000 000 выводилась информация о кредитах на суммы от 2 000 000 до 2 999 999, которые есть в базе...и никаких лишних кредитов на сумму, скажем в 200 000.)

1)Таблица, я так думаю, должна выглядетьпримерно так:

ФИО   Дата рождения Место работы Телефон домашний(в проекте-телефон фактический) Место проживания Сумма Кредита 

Думаю, делать 1 таблицу...смысл делать больше то?

2)Поиск по всей таблице (по старым и добавленным данным)

3)Не совсем. В проекте посмотришь- у меня 1 едит на поиск. Думаю, сделать поиск вначале по столбцу ФИО, а потом по Сумме кредита

4)Стринговые переменные только.В проекте только 2 переменные типа не стринг, но они для БД не нужны....я так надеюсь=).

Автор: Rodman 22.9.2006, 20:43
А по какому полю искать строгое и не строгое соответствие??? По кредитам???

Автор: Сарт 22.9.2006, 22:54
Да, по сумме кредита.

Автор: Fighter 23.9.2006, 04:26
SQL - рулит. 
В SQL есть такая фига как INSERT TABLE. Вот разберись с ней.

Автор: Сарт 23.9.2006, 10:40
Проблема останется только одна-как запустить потом эту БД на компе=)
короче, требования доп. такие-сделать бд. сделать поиск. Но при этом прога должна работать на сиандартном оффисном компе. То есть без SQL, Framework-а и т.д. Стоят на машинах тока оффисы. Поэтому наш выбор- Акксесс....Так как блокнот не потянет столько записей.

Автор: Rodman 23.9.2006, 12:16
Цитата(Сарт @  23.9.2006,  10:40 Найти цитируемый пост)
сиандартном оффисном компе
 - что это, клавиши западают smile ???

Вот я кое что добавил тебе...

а вот про 
Код

INSERT TABEL...


Fighter если можно то пример покажи, у меня не получаеться (SQL знаю)...

Автор: Savek 23.9.2006, 14:50
Цитата(Rodman @  23.9.2006,  12:16 Найти цитируемый пост)
а вот про 

Код    
INSERT TABEL...

Это глюк

для создания таблицы
Код

Create Table  MyTab (Field1  varchar(50), ....)


для вставки строки в таблицу
Код

insert into MyTable (Field1, ...) values ('value', ...)

Автор: Rodman 23.9.2006, 16:13
Я на SQL напишу любой запрос.. не нужно мне приводить примеры запросов... мне нужен исходник в делфяхк который поможет мне создать базу и в ней таблицы в Access... 

Savek,  при надобности я и сам тебе расскажу SQL...

Автор: Fighter 24.9.2006, 00:50
Цитата(Rodman @  23.9.2006,  16:13 Найти цитируемый пост)
Я на SQL напишу любой запрос.. не нужно мне приводить примеры запросов... мне нужен исходник в делфяхк который поможет мне создать базу и в ней таблицы в Access... 


Ну так если с сиквелом у тебя нет проблем то кидай AdoQuery на форму и пользуйся на здоровье. 

Автор: Rodman 24.9.2006, 22:10
Fighter, понимаешь с MySQL получится и создать базу и таблицы в ней... а вот с Access не в какую не проходят эти запросы... я так думаю что там структура какая-то не как везде...

Вот просто и хочу увидеть пример на Delphi который сделал бы это...

Если у кого-то получалось подобное, то выложи (но только если сам пробовал, а не в инете видел)...

Автор: Сарт 24.9.2006, 22:43
Как я понял, тема животрепещуща=)
Могу дать подсказку..что умные люди посоветовали....Мне правда не помогает=)
Итак, совет:
Совсем ",tp доп.требований к установленным программам" - естественно никак. 
Cамый простой вариант - БД MS Access (сама СУБД не нужна) и интерфейс к ней ну пусть на той же Delphi. Доступ через ADO. ну если совсем АПИ, то через ODBC.

Автор: Savek 25.9.2006, 12:47
Вот процедура создает базу Аксес
Код

procedure CreateMSAccessDB(filename : String);
var
  DBEngine, Workspace: Variant;
const
  {Important to use the following constant as is}
  dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0';
  dbVersion30 = 64;
begin
if not FileExists(FileName+'.mdb') then begin
  //DBEngine := CreateOleObject('DAO.DBEngine');
  DBEngine := CreateOleObject('DAO.DBEngine.36'); //For DAO 3.5
  Workspace := DBEngine.Workspaces[0];
  try
    Workspace.CreateDatabase(filename, dbLangGeneral, dbVersion30);
  except on EOleException do
    ShowMessage('Невозможно создать!');
  end;
  end;
end;


Автор: SergeBS 25.9.2006, 12:56
Сарт, 
Цитата

Могу дать подсказку..что умные люди посоветовали....Мне правда не помогает=)

Гони этих "умных" в шею.
Если это учебная задача, то лепи DBF-ки - потянет, а если нет, то подумай: что с тобой сделают, когда в результате, например, нажатия на Reset, скачка в розетке или особо "продвинутого" юзера у тебя вся база Access грохнется.  Особенно если через 3-4 месяца после начала эксплуатации. Сервера ставят не от жира, а чтобы данные не терялись. Поскольку дешевле будет один комп запереть в кладовке, чтобы никто не мог подойти, подоткнуть к нему стриммер, навесить SQL сервер и спать спокойно.  
Цитата

интерфейс к ней ну пусть на той же Delphi. Доступ через ADO.

Через ADO я тебе к любому серваку достучусь. А если в укромном уголке "вдруг" MS SQL заведется, то доп. требование: MDAC 2.8 + DCOM98 для Win95/98 (или IE >=5.5, который его молча впихнет).
Цитата

ну если совсем АПИ, то через ODBC

Пальцы об клаву до костей сотрешь smile. Пиши тогда сразу на VC++.

Автор: Сарт 25.9.2006, 19:54
Задача НЕ учебная.. производственная=) Попросил директор настойчиво=) Была бы возможность с SQL я бы особо и не парился=)
А как насчет записи??Подскажи плиз, вельми дзенкуе скажу пану

Автор: SergeBS 26.9.2006, 08:10
Сарт,
 
Цитата

Задача НЕ учебная.. производственная=) Попросил директор настойчиво=) Была бы возможность с SQL я бы особо и не парился=)

Ну так и объясни директору, что либо в кладовке/подсобке/... (короче под замком, а ключ только у него и у тебя) сервер будет стоять, либо он через 4-5 месяцев от инфаркта помрет, когда все данные о кредитах грохнутся без возможности восстановления. И нефиг тут париться. Из говна пуля только говенная выйдет.
Насчет SQL: в комплекте Офиса есть MSDE - MS SQL server Developer Edition. Т.е. есть лицензия на Офис - можешь его поставить. Папка с инсталляшкой так и зовется - MSDE. От настоящего сервака отличается тем, что:
1. Одновременно - не более 5 транзакций, остальные - в очередь. Но все равно шустрее, умнее и надежнее, чем Access. 
2. Док в комплекте - никаких. И тулз тоже. Однако берем дистрибутив нормального сервера, при установке на не-серверную ОС (если не мухлевать smile ) встанет именно MSDE со всем комплектом док и инструментов. Серьезным дядям показываем лицензию на Офис - имеем право юзать сервер, а доки и инструменты предметом лицензирования не являются smile. Да и нужны они в основном на машине разработчика.

Автор: Сарт 26.9.2006, 14:29
Я работаю тока 2 недели=) Так что вряд ли твой вариант мной осуществим=). Так что план пока--сделать БД на 1 компе, резервно вручную его втихомолку копировать, потом, когда накроется---достать из рукава=).Ну получить премию, а заодно и объяснить чем сервер хорош=)

В общем, базу , похоже, мне создатьь помогли... помогите плиз реализовать по ней еще и поиск=) 

Автор: SergeBS 27.9.2006, 08:22
Сарт, 
Цитата

Я работаю тока 2 недели=) Так что вряд ли твой вариант мной осуществим=). 

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

Цитата

 Так что план пока--сделать БД на 1 компе, резервно вручную его втихомолку копировать, потом, когда накроется---достать из рукава=).

Ну-ну. Так БД и останется на 1 компе. Размечтался. От тебя втихомолку расползется и будешь только копированием заниматься. Пока вконец не запутаешься. Нет смысла такие задачи иметь в 1 экземпляре - не окупится даже разработка: дешевле тебя сразу на учет кредитования усадить, чем кого-то на нем держать, а тебе для него программу писать.

Файл-сервер в конторе наверняка есть. Поэтому:
1. Ставишь втихомолку SQL-сервер. Бэкапишь - на файл-сервер. Каждый вечер - недельным циклом + помесячно - в долгое хранение. Если очень хочется  секса стоя в гамаке на лыжах smile - на 1 машине крутишь MS Jet, а с остальных клиентами с Jet-ом работаешь. Упаси боже с БД напрямую работать - потом больно будет вспоминать.
2. СРАЗУ обеспечиваешь парольный вход - клиент БД уже не расползется по юзерам бесконтрольно и при небольшом старании (читай Уфимцева на SQL.RU) всегда будет известно, кто насвинячил. С датой, временем и т.п.

Ну и вдогонку: читай http://forum.vingrad.ru/index.php?showtopic=98366 Пока не поздно.

Автор: RideX 27.9.2006, 09:01
Сарт, вот тебе основа, проверки и всё остальное, думаю, сам сможешь накрутить. База данных MS Access, обращение через запросы, думаю ты этого хотел? На пустую форму положи DBGrid, Edit и две кнопки. Всё остальное создаём в runtime и работаем как обычно.
Код

unit Project1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, ExtCtrls, DBCtrls, ComCtrls;

type
  TfmMain = class(TForm)
    btnNewDB: TButton;
    DBGrid1: TDBGrid;
    btnSearch: TButton;
    Edit1: TEdit;
    procedure btnNewDBClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnSearchClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmMain: TfmMain;

implementation

{$R *.dfm}

uses DB, ADODB, ComObj;

const
  dbName            : String = 'mybase.mdb';
  MasterTable       : String = 'MyMasterTable';

var
  ADOCommand        : TADOCommand;
  ADOConnection     : TADOConnection;
  ADODataSetMaster  : TADODataSet;
  MasterDataSource  : TDataSource;
  strCmdText        : String;
  strConnectString  : String;


procedure TfmMain.FormCreate(Sender: TObject);
begin
  // Строка для подключения к базе
  strConnectString := 'Provider=Microsoft.Jet.OLEDB.4.0' +
                      ';Data Source=' + dbName +
                      ';Jet OLEDB:Engine Type=5';

  // Создаём переменные и подключаемся к базе
  ADOConnection := TADOConnection.Create(nil);
  ADOConnection.ConnectionString := strConnectString;
  ADOConnection.LoginPrompt := False;
  ADOConnection.Mode := cmReadWrite;
  ADOConnection.Connected := True;

  ADOCommand := TADOCommand.Create(nil);
  ADOCommand.Connection := ADOConnection;
  ADOCommand.CommandType := cmdText;

  ADODataSetMaster := TADODataSet.Create(nil);
  ADODataSetMaster.Connection := ADOConnection;
  ADODataSetMaster.CommandType := cmdText;
  ADODataSetMaster.CommandText := 'SELECT * FROM ' + MasterTable;
  ADODataSetMaster.Active := True;

  MasterDataSource := TDataSource.Create(nil);
  MasterDataSource.DataSet := ADODataSetMaster;

  // Выводим данные в DBGrid
  DBGrid1.DataSource := MasterDataSource;
end;

procedure TfmMain.btnNewDBClick(Sender: TObject);
var
  ADOX: OLEVariant;
  i: integer;
  j: int64;
begin
  // Создаем базу
  ADOX := CreateOleObject('ADOX.Catalog');
  ADOX.Create(strConnectString);
  ADOX := NULL;

  // Подключаемся к созданной базе
  ADOConnection := TADOConnection.Create(nil);
  ADOConnection.ConnectionString := strConnectString;
  ADOConnection.LoginPrompt := False;
  ADOConnection.Mode := cmReadWrite;
  ADOConnection.Connected := True;

  ADOCommand := TADOCommand.Create(nil);
  ADOCommand.Connection := ADOConnection;
  ADOCommand.CommandType := cmdText;

  // Создаём в базе таблицу
  strCmdText := 'CREATE TABLE ' + MasterTable +
                '([id] COUNTER,'+
                '[ИНН] DECIMAL PRIMARY KEY NOT NULL UNIQUE,' +
                '[Имя] VARCHAR(150) WITH COMPRESSION,' +
                '[Адрес] VARCHAR(150) WITH COMPRESSION,' +
                '[Телефон] VARCHAR(150) WITH COMPRESSION)';
  ADOCommand.CommandText := strCmdText;
  ADOCommand.Execute;

  // Просто пример, добавляем данные в таблицу
  j := 665906037862;
  for i := 193 to 196 do begin
    strCmdText := 'INSERT INTO ' + MasterTable +
                  '(ИНН, Имя, Адрес, Телефон) VALUES'+
                  '("' + IntToStr(j) + '", "'+Chr(Ord(i))+'иванов", "улица, дом", "(343)123-45-67")';
    ADOCommand.CommandText := strCmdText;
    ADOCommand.Execute;
    Inc(j, 100000000000);
  end;
end;

procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Освобождаем переменные
  if ADOConnection <> nil then begin
    ADOConnection.Connected := False;
    ADOConnection.Free;
    ADOConnection := nil;
  end; 
  if ADOCommand <> nil then begin
    ADOCommand.Free;
    ADOCommand := nil;
  end;
  if ADODataSetMaster <> nil then begin
    ADODataSetMaster.Active := False;
    ADODataSetMaster := nil;
  end;
  if MasterDataSource <> nil then begin
    MasterDataSource.Free;
    MasterDataSource := nil;
  end;
end;

procedure TfmMain.btnSearchClick(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.DisableControls;

  // Пример, поиск в таблице по полю [Имя], по известному началу строки
  ADODataSetMaster.Active := False;
  strCmdText := 'SELECT * FROM '+ MasterTable + ' WHERE [Имя] LIKE "'+ Edit1.Text + '%"';
  ADODataSetMaster.CommandText := strCmdText;
  ADODataSetMaster.Active := True;

  DBGrid1.DataSource.DataSet.EnableControls;
end;

end.


Добавлено @ 09:13 
Поиск по любому вхождению делай так:
Код

LIKE "%искомая_строка%"


если только по концу, то соответственно так:
Код

LIKE "%искомая_строка"


Hint: например, через поле таблицы [ИНН] удобно привязать связанную подчинённую таблицу, а то бывает такой кошмар, что люди делают по две, чуть ли в точности не дублирующие друг-друга таблицы. Получается, естественно, огромная избыточность. Образец этого недавно здесь видел, если найду ссылку, добавлю сюда для ознакомления.

P.S. Конечно, если будешь обращаться к данным из других форм, перенеси переменные fmMain в глобальные для всего приложения.

Автор: Сарт 27.9.2006, 15:20
Сенкс, завтра испробуем на практике, отпишусь какие траблы возникнут=)
Блин со второго раза ткоа воткнул в чем разница между поисками=) а разница то в--%.

Автор: Rodman 27.9.2006, 18:57
Savek, а у тебя нет подобный примеров для других СУБД??? или откуда ты вытянул напиши... пожалуйста...

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