Главная страница
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 - динамический
не делать же выборку по всем возможным хотелкам юзера..


 
Ega23 ©   (2010-09-17 13:30) [41]


> не делать же выборку по всем возможным хотелкам юзера..

Параметр в ХП.
Ну и потом, я хоть убей не понимаю, кто тебе мешает
ADOQuery.Text := ADOQuery.Text + " Order By ....";
сделать, если уж на от пошло.


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


> Параметр в ХП.


> База - переходная,

и нафига?


> Ну и потом, я хоть убей не понимаю, кто тебе мешает
> ADOQuery.Text := ADOQuery.Text + " Order By ....";

да никто :)
и так тоже делаю, бывает.
но думаю лучше смотрится add("Order By ....");
т.к. меньше в длину строка занимает, и не вылазит за экран

ps.
" dfsgdgsdg "+
"sdgsdgsgsdg" ;
тоже пишу, бывает :)

бывает, и так
     " select B.FN, B.FI, count(*) as CR from                                                              "+#13#10+
     " (                                                                                                   "+#13#10+
     "   select A.ring_id_cisco, A.FN, A.FI from                                                           "+#13#10+
     "   (                                                                                                 "+#13#10+
     "   select                                                                                            "+#13#10+
     "       ring_id_cisco,                                                                                "+#13#10+
     "       upper(s.FILIAL_NAME) as FN,                                                                   "+#13#10+
     "       s.filial_id as FI,                                                                            "+#13#10+
     "       count(*) as CountAnswert,                                                                     "+#13#10+
     "       SUBSTRING(comment, CHARINDEX("+QuotedStr("#")+",comment)+1, DATALENGTH(comment)) as NameS     "+#13#10+
     "     FROM                                                                                            "+#13#10+
     "       [ccc].[dbo].[request] r                                                                       "+#13#10+
     "       JOIN (select * from openquery(MIS2,                                                           "+#13#10+
                            QuotedStr(" SELECT S.ID_SUBSCRIBER, F.FILIAL_NAME, F.FILIAL_ID                    "  +
                                      " FROM SUBSCRIBER S JOIN SPRAVKA.FILIALS F  ON F.FILIAL_ID = S.FILIAL_ID") +
     "       )) s  ON SUBSTRING(r.comment, 1, CHARINDEX("+QuotedStr("#")+",r.comment)-1) = s.ID_SUBSCRIBER "+#13#10+
     "     where                                                                                           "+#13#10+
     "       [id_object] = 1228                                                                            "+#13#10+
     "       and R.id_sct not in (29, 4 )                                                                  "+#13#10+
     "       and start_time between :FDT and :SDT                                                          "+#13#10+
     "       and isNull(SubString(comment,1,DATALENGTH(comment)), "+QuotedStr("")+") <> "+QuotedStr("")+"  "+#13#10+
     "     group by                                                                                        "+#13#10+
     "       ring_id_cisco,                                                                                "+#13#10+
     "       s.filial_id,                                                                                  "+#13#10+
     "       SUBSTRING(comment, CHARINDEX("+QuotedStr("#")+",comment)+1, DATALENGTH(comment)),             "+#13#10+
     "       upper(s.FILIAL_NAME)                                                                          "+#13#10+
     "   ) A                                                                                               "+#13#10+
     "   group by A.ring_id_cisco, A.FN, A.FI                                                              "+#13#10+
     " ) B                                                                                                 "+#13#10+
     " group by B.FN, B.FI    ";
         

pps.
да, а SPRAVKA - знаю, что так англоязычные страны не говорят, это наследство такое.


 
Anatoly Podgoretsky ©   (2010-09-17 13:41) [43]

> Ega23  (17.09.2010 13:30:41)  [41]

" Order By %S";


 
Anatoly Podgoretsky ©   (2010-09-17 13:48) [44]

> 12  (17.09.2010 13:40:42)  [42]

но думаю лучше смотрится add("Order By ....");
т.к. меньше в длину строка занимает, и не вылазит за экран


Смотрится ужасно и по второму пункту тоже не выделживает критики


AdoDataset.CommandText := " select"+
  "   field1,"+
  ...
  "   field1,"+
  " Order by" + OrderPart;

Вот это коротко и смотрится не ужасно


 
Ega23 ©   (2010-09-17 13:49) [45]


> бывает, и так


Вот ТАКОЕ я точно в ХП или View выношу.


 
Anatoly Podgoretsky ©   (2010-09-17 13:49) [46]


> AdoDataset.CommandText := " select"+
>   "   field1,"+

и даже так
AdoDataset.CommandText :=
 " select"+
 "   field1,"+


 
Palladin ©   (2010-09-17 14:05) [47]


> Вот ТАКОЕ я точно в ХП или View выношу.

+1


 
Первокурсница ©   (2010-09-17 14:11) [48]

Всем спасибо =) Не повесилась :D А методичку писал препод нашего универа :(


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


> > Вот ТАКОЕ я точно в ХП или View выношу.

уболтали, это, конечно, слишком уже :)

просто боюсь получится, как sniknik предупреждал, - вместо того что б программу править, приходится и программу править и в БД лезть.
а так наглядно все видно, pageup нажать только


 
12 ©   (2010-09-17 14:28) [50]


> А методичку писал препод нашего универа

кто бы сомневался. Научен.
Если сдавать - то по медодичке.
А если "parametrs" да "sql.text :=  "
скажет, "че, самый умный? Умнее меня, типа? "

зы
а реальные вещи пишем так, как надо.
parametrs да sql.text :=



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

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

Наверх




Память: 0.63 MB
Время: 0.01 c
15-1283286578
Юрий
2010-09-01 00:29
2010.12.12
С днем рождения ! 1 сентября 2010 среда


15-1283459378
Юрий
2010-09-03 00:29
2010.12.12
С днем рождения ! 3 сентября 2010 пятница


15-1283776650
12
2010-09-06 16:37
2010.12.12
Что-то не понимаю tDateTime и Variant, раньше работало или путаю?


15-1283334671
Andy BitOff
2010-09-01 13:51
2010.12.12
Нужен файл от DMClient а


15-1283507963
Медвежонок Пятачок
2010-09-03 13:59
2010.12.12
про кита