Форум: "Начинающим";
Текущий архив: 2010.12.12;
Скачать: [xml.tar.bz2];
ВнизМодификация записей в 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;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.005 c