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



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

Форум: "Начинающим";
Текущий архив: 2010.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.004 c
2-1285073326
Jason Bobs
2010-09-21 16:48
2010.12.12
Из строки выудить число


15-1283442883
ProgRAMmer Dimonych
2010-09-02 19:54
2010.12.12
Хардлинки на DVD


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


15-1283856091
бумбум
2010-09-07 14:41
2010.12.12
Резервное копирование базы MS SQL 2000


15-1283324495
Dennis I. Komarov
2010-09-01 11:01
2010.12.12
XML





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский