Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Модификация записей в Access с помощью Delphi


Страницы:   1 2 3

Первокурсница ©   (2010-09-16 20:59:00) 

Доброго времени суток!
Задали на самостоятельное изучение тему "Как с помощью программы Delphi добавлять, удалять и редактировать записи в таблице Access".
Написала программу, следуя указаниям методички, она должна соответственно добавлять, удалять и редактировать записи.
Но возникло 2 проблемы:
- Программа не редактирует записи, только удаляет и добавляет нормально
- После нажатия кнопок "Добавить" или "Удалить" DBGrid1 на форме очищается, а этого быть не должно, нужно чтобы добавленные/удалённые/изменённые записи сразу же отображались на DBGrid1, без перезапуска программы.
вот код:
unit LAB3;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;

type
 TForm1 = class(TForm)
   ADOConnection1: TADOConnection;
   ADOQuery1: TADOQuery;
   DataSource1: TDataSource;
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Button1: TButton;
   DBGrid1: TDBGrid;
   Button2: TButton;
   Button3: TButton;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure DBGrid1CellClick(Column: TColumn);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 X: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); {Добавление записей}
begin
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Таблица1');
ADOQuery1.SQL.Add('(TovarName,Price,Sklad)');
ADOQuery1.SQL.Add('VALUES("'+ Edit1.Text +'",'+Edit2.Text+','+ Edit3.Text+')');
ADOQuery1.ExecSQL;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
X:=DataSource1.DataSet.FieldByName('IDCode').AsInteger;
end;

procedure TForm1.Button2Click(Sender: TObject); {Удаление записей}
begin
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM Таблица1');
ADOQuery1.SQL.Add('WHERE IDCode='+ IntToStr(X));
ADOQuery1.ExecSQL;
end;

procedure TForm1.Button3Click(Sender: TObject); {Редактирование записей}
begin
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE Таблица1');
ADOQuery1.SQL.Add('SET TovarName='+'"'+ Edit1.Text+'"'+
                                ',Price='+Edit2.Text+
                                ',Sklad='+Edit3.Text);
ADOQuery1.SQL.Add('WHERE IDCode='+IntToStr(X));
ADOQuery1.ExecSQL;
end;

end.

Помогите кто чем может! :(


И. Павел   (2010-09-17 11:07:00) [41]

> SQL.Add - этим грешат только ламеры

Этим грешат те, кто не знает о предварительном парсинге запроса и по каким-то причинам использует Add (например, при динамической генерации запроса по частям, или просто так нравится - ведь метод открыт, значит должен работать).


Ega23   (2010-09-17 11:04:00) [42]


> то предполагается, что вы болжны понимать:


Для тех кто в танке: SQL.Add - этим грешат только ламеры и Влад Ошин баловаться любил ещё.
Есть SQL.Text, как у любого TStrings.


12   (2010-09-17 11:03:00) [43]


> Это что ж за методички с такими рекомендациями?

+ А нафига делать сначала SQL.Clear, потом SQL.Add несколько раз, если можно сразу SQL.Text := ....

сплошь и рядом..
у меня приличная БД скопилась подобных проектов, пока первокам решал лабы по их методичкам(когда работы не было другой)

поначалу писал было нормально (ну, относительно :))
стали заворачивать, появлялись претензии от лаборантов - от "неправильно", до "не сам писал"

а мне это надо - еще и объяснить каждому в 51й раз, что это такое написано..

Чувачок написал методичку, она была утверждена, преподает по ней.
Еще пару напечатает - зп повысят, за методологическую работу.
И тут один умный нашелся..

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


И. Павел   (2010-09-17 11:01:00) [44]

Если вы с уверенностью пишете пишете:
> А какие-такие ошибки могут возникнуть при использовании
> ADODataSet и ADOCommand действительно лучше использовать. Но совершенно по другой причине.

И считаете себя:

> это не для Начинающих

то предполагается, что вы болжны понимать:

> А какие-такие ошибки могут возникнуть при использовании
> SQL.Add?


Ошибки связаны с парсированием только части запроса - этот вопрос обсуждался тут раньше, да и на delphikingdom всплывал. А метод Add провоцирует пользователя вводить запрос по частям.


Ega23   (2010-09-17 10:55:00) [45]


>  Лучше использовать ADODataSet и ADOCommand, т.к. с ADOQuery1
> можно получить странные ошибки: например при использовании
> SQL.Add.


1. ADODataSet и ADOCommand действительно лучше использовать. Но совершенно по другой причине. По какой - добро пожаловать в Базы и там понесётся, это не для Начинающих.
2. А какие-такие ошибки могут возникнуть при использовании SQL.Add?
3. А нафига делать сначала SQL.Clear, потом SQL.Add несколько раз, если можно сразу SQL.Text := ....  ?


Плохиш   (2010-09-17 10:47:00) [46]


> ADOQuery1.Active:=false;
> ADOQuery1.Close;
>

Масло маслянное.

Это что ж за методички с такими рекомендациями?


12   (2010-09-17 10:18:00) [47]

не,


> Написала программу, следуя указаниям методички,


думаешь  возможно возможного автора ткнуть носом и получить нормальную оценку?
:)


Anatoly Podgoretsky   (2010-09-17 10:14:00) [48]

> 12  (17.09.2010 10:12:02)  [2]

AdoDataset + параметры


12   (2010-09-17 10:12:00) [49]

> Скорее всего, DBGrid1 связан с ADOQuery1,
да 100 пудов, других не объявлено

procedure TForm1.Button1Click(Sender: TObject); {Добавление записей}
var
s:string;
begin
s:= ADOQuery1.sql.text;

ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Таблица1');
ADOQuery1.SQL.Add('(TovarName,Price,Sklad)');
ADOQuery1.SQL.Add('VALUES("'+ Edit1.Text +'",'+Edit2.Text+','+ Edit3.Text+')');
ADOQuery1.ExecSQL;

ADOQuery1.sql.text := s;
ADOQuery1.open;
end;

и т.д.


И. Павел   (2010-09-17 09:52:00) [50]

> DBGrid1 на форме очищается

Скорее всего, DBGrid1 связан с ADOQuery1, а при Active := false вы закрываете выборку. Потом делаете запросы INSERT/DELETE/UPDATE. Значит, после этого вам нужно снова открыть выборку:

ADOQuery1.Active := false;
ADOQuery1.SQL.Text := 'SELECT * FROM Таблица1';
ADOQuery1.Open;

PS:
 Лучше не использовать русские имена таблиц и полей.
 При передаче текстовых (да и других не целых) величин в запрос лучше использовать параметры.
 Лучше использовать ADODataSet и ADOCommand, т.к. с ADOQuery1 можно получить странные ошибки: например при использовании SQL.Add.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо