Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.12;
Скачать: CL | DM;

Вниз

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

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

Доброго времени суток!
Задали на самостоятельное изучение тему "Как с помощью программы 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 09:52) [1]

> 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.


 
12 ©   (2010-09-17 10:12) [2]

> Скорее всего, 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;

и т.д.


 
Anatoly Podgoretsky ©   (2010-09-17 10:14) [3]

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

AdoDataset + параметры


 
12 ©   (2010-09-17 10:18) [4]

не,


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


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


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


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

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

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


 
Ega23 ©   (2010-09-17 10:55) [6]


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


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


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

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

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

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

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

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


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


 
12 ©   (2010-09-17 11:03) [8]


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

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

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

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

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

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

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


 
Ega23 ©   (2010-09-17 11:04) [9]


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


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


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

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

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


 
Ega23 ©   (2010-09-17 11:08) [11]

Посмотрел. Действительно, вообще не стОит им пользоваться. Зачем компонент ввели - непонятно.


 
Palladin ©   (2010-09-17 11:08) [12]


> И. Павел ©

расслабся... ошибка с парсером параметров была только в драйвере jet и в старых версиях....


 
12 ©   (2010-09-17 11:11) [13]

SQL.Add - написано во многих методичках. Значит, так правильно :)
не стоит переубеждать тех, кому "все это программирование" не нужно.


> Ega23 ©   (17.09.10 11:04) [9]

а его еще, кажись, DimkaMaslov, кажись, в 2006-7м гг отучил..


 
Ega23 ©   (2010-09-17 11:12) [14]


> Этим грешат те, кто не знает о предварительном парсинге запроса

ну.... понеслось г..но по трубам.
Предварительного парсинга может и не быть, если чё.
Тебе показать, как будет абсолютно корректно работать код
with ADOQuery1.SQL do
begin
 Clear;
 Add("Select");
 Add("*");
 Add("from");
 Add("Table1");
end;

?


 
И. Павел ©   (2010-09-17 11:18) [15]


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

Может и не быть, а может и быть. Вам показать, как время-от времени корректно завершается процедура:

procedure a(b: integer);
var obj: TObj;
begin
 if b>100 then
   obj.v := 100;
end;

?

> ну.... понеслось г..но по трубам.

А кто был инициатором?


 
Ega23 ©   (2010-09-17 11:20) [16]


> SQL.Add - написано во многих методичках.

Не знаю, я никаких методичек в силу возраста не видел. SQL.Add вообще никогда не писал, даже под BDE (а нафига?).

> а его еще, кажись, DimkaMaslov, кажись, в 2006-7м гг отучил.

Ему многие этим тыкали. :)


 
12 ©   (2010-09-17 11:22) [17]

ну SQL.Add использовать можно все-таки
когда сортировку надо сделать, например. Там ему самое место, имхо.


 
Ega23 ©   (2010-09-17 11:24) [18]


> когда сортировку надо сделать, например. Там ему самое место,
>  имхо.


ADODataSet.Sort


 
Ega23 ©   (2010-09-17 11:27) [19]


> Вам показать, как время-от времени корректно завершается процедура:

Если ты считаешь, что чем-то удивил, то нет:

type

 TMyObj = class (TObject)
 public
   procedure Work;
 end;

 TForm7 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form7: TForm7;

implementation

{$R *.dfm}

{ TMyObj }

procedure TMyObj.Work;
begin
 ShowMessage("TMyObj.Work");
end;

procedure TForm7.Button1Click(Sender: TObject);
var
 obj: TMyObj;
begin
 obj.Work;
end;

end.


 
И. Павел ©   (2010-09-17 11:34) [20]

> Если ты считаешь, что чем-то удивил, то нет:

Удивить я никого не хотел. Хотел показать, что [15] (как и [19]) - такой же частный случай, как в [14], на основе которого нельзя делать выводы.


 
Ega23 ©   (2010-09-17 11:37) [21]

Никакого частного случая, всё в рамках документации.
Собственно, твоё препарирование запросов - такой же частный случай, когда ADOConnection подсоединён либо ConnectionString задан.


 
Anatoly Podgoretsky ©   (2010-09-17 11:38) [22]


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

А .Text разбивать его на части :-)


 
Anatoly Podgoretsky ©   (2010-09-17 11:41) [23]


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

Можно динамически генерировать по частя и без АДД, а то как бя я жил с TAdoDatase, ведь там нет ADD


 
Anatoly Podgoretsky ©   (2010-09-17 11:42) [24]


> Посмотрел. Действительно, вообще не стОит им пользоваться.
>  Зачем компонент ввели - непонятно.

Объясняли - это любимая фишка Борланда, у любого компонента должен быть механизм Query с его методом Add - а то не дай бог программист не сможет написать запрос без ADD


 
И. Павел ©   (2010-09-17 11:42) [25]

> Собственно, твоё препарирование запросов - такой же частный
> случай,

Верно. Но если в частном случае возникает ошибка - это ошибка. А если в частном случае программа работает правильно - это еще не значит, что программа работает правильно в других ситуациях.


 
Anatoly Podgoretsky ©   (2010-09-17 11:44) [26]

> Palladin  (17.09.2010 11:08:12)  [12]

А Jet никуда не делся.
А что скажешь про оптимальность, постоянные преобразования в Text и обратно.
Не так давно тут был вопрос про скорость, после того как автор ушел на
TAdoDataset у него скорость повысилась в два раза.


 
Anatoly Podgoretsky ©   (2010-09-17 11:46) [27]

> 12  (17.09.2010 11:22:17)  [17]

Зачем для сортировка ADD?


 
Ega23 ©   (2010-09-17 11:47) [28]


> А что скажешь про оптимальность, постоянные преобразования
> в Text и обратно.
> Не так давно тут был вопрос про скорость, после того как
> автор ушел на
> TAdoDataset у него скорость повысилась в два раза.


Давайте уже срач в Базы перенесём? Или из небытия последний подымем?
Тут всё-таки для начинающих...


 
Ega23 ©   (2010-09-17 11:48) [29]


> Зачем для сортировка ADD?


Он не знает про Sort.


 
Anatoly Podgoretsky ©   (2010-09-17 11:49) [30]

> Ega23  (17.09.2010 11:47:28)  [28]

Вот именно что для начинающих, поэтому нафиг это в Базы, тема для
начинающих - как не надо делать.


 
Ega23 ©   (2010-09-17 11:52) [31]


> Вот именно что для начинающих, поэтому нафиг это в Базы, тема для
> начинающих - как не надо делать.

Ну тебе виднее.


 
12 ©   (2010-09-17 11:58) [32]


> Зачем для сортировка ADD?


> Он не знает про Sort.

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

к тому же, как написать такую сортировку, например

order by SUBSTRING(r.comment, CHARINDEX("#",r.comment)-1), CHARINDEX("^",r.comment)+1)


 
Anatoly Podgoretsky ©   (2010-09-17 12:00) [33]

А так и писать, но только нужна соответствующая СУБД


 
Ega23 ©   (2010-09-17 12:08) [34]


> к тому же, как написать такую сортировку, например

Поля именовать нормально надо.


 
Плохиш ©   (2010-09-17 12:15) [35]

Я надеюсь первокурсница ещё не повесилась...


 
Amoeba_   (2010-09-17 12:21) [36]


> Плохиш ©   (17.09.10 12:15) [35]

Не сглазь!


 
Anatoly Podgoretsky ©   (2010-09-17 12:28) [37]

> Плохиш  (17.09.2010 12:15:35)  [35]

Она со страхом смотрит на вас.


 
Palladin ©   (2010-09-17 12:34) [38]

Висит и смотрит.


 
Anatoly Podgoretsky ©   (2010-09-17 12:52) [39]

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


 
12 ©   (2010-09-17 13:06) [40]


> Поля именовать нормально надо.

База - переходная, все мало значимое свалено в одно поле. Comment.
order - динамический
не делать же выборку по всем возможным хотелкам юзера..



Страницы: 1 2 вся ветка

Текущий архив: 2010.12.12;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.01 c
2-1284721761
set
2010-09-17 15:09
2010.12.12
Куб


2-1285046320
И. Павел
2010-09-21 09:18
2010.12.12
Сортировка в TListView через stdcall функцию


15-1283286924
NailMan
2010-09-01 00:35
2010.12.12
Продолжаю радовать себя китайским товарами


15-1283203920
TIF
2010-08-31 01:32
2010.12.12
Google не работает?!


15-1283342686
12
2010-09-01 16:04
2010.12.12
Скажите, а дрова на ноут от vista или 7 подойдут для XP?