Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1283511204
DVM
2010-09-03 14:53
2010.12.12
Помогите с переводом на английский одного слова


15-1283257709
bss
2010-08-31 16:28
2010.12.12
Создание интерфейса без сохранения в переменную


15-1283151335
кефирчик 3.2
2010-08-30 10:55
2010.12.12
А правда, что...


2-1284977449
123456
2010-09-20 14:10
2010.12.12
работа с treeview


8-1208000814
Дмитрий Белькевич
2008-04-12 15:46
2010.12.12
Сглаживание при вызове метода blt поверхности DirectX в Висте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский