Форум: "Базы";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
ВнизПомогите, пожалуйста, с редактированием связанных таблиц! Найти похожие ветки
← →
Troy_piter (2003-05-27 01:17) [0]Профессионалы – помогите, пожалуйста, разобраться!
Есть локальная БД (Paradox), состоящая из 4 таблиц. Основная таблица, в принципе, обобщает в себе данные трех остальных. Т.е. дело обстоит так: БД якобы абонентов сотовой компании. В первой таблице – данные об абонентах (ФИО, паспорт и т.п.), во второй – информация о тарифах (название, аб. Плата и т.п.), в третьей – возможные регионы (где подключен абонент). Четвертая таблица – основная – объединяет три предыдущие, выдавая полную инфу о каждом абоненте и номере (есть еще и свои поля). Связаны по отдельным ключевым полям.
Далее, необходимо создать приложение для просмотра, поиска, редактирования, добавления/удаления записей. Это все нужно оформить с помощью SQL-запросов, через Query, соответственно. С просмотром и поиском я разобрался, все работает. Но никак не могу разделаться с изменением, добавлением и удалением записей =((. Постоянно выдается ошибка, что набор данных не находится в режиме редактирования. Оно вроде бы и понятно, т.к. данные берутся из нескольких таблиц, но ведь должен же быть способ их туда записать, не прибегая к каким-то особенным ухищрениям? Помогите, пожалуйста!
На всякий случай привожу код добавления строки (пытаюсь в основную таблицу записать ее уникальные поля, которых нет в других таблицах):
if MessageDlg("Добавить новую запись?", mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
If Query1.CanModify then begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("INSERT INTO MainTable (Number, Balance, Dop_uslugi) VALUES (:Number1, :Balance1, :Dop_uslugi1)");
Query1.ParamByName("Number1").AsString:=Edit6.Text;
Query1.ParamByName("Balance1").AsString:=Edit7.Text;
Query1.ParamByName("Dop_uslugi1").AsString:=Edit13.Text;
Query1.Open;
end
else begin
Beep;
MessageDlg("Редактирование запрещено!", mtInformation, [mbOK], 0);
exit;
end;
end;
Пробовал через ExecSQL – результат тот же…. =(
Может быть, таблицы нужно связать как-то по-другому? Подскажите, пожалуйста! Я человек малоопытный в этом деле, трудно вот так просто разобраться, особенно когда сроки поджимают! =(
← →
Соловьев (2003-05-27 09:52) [1]
> Пробовал через ExecSQL – результат тот же…. =(
не может такого быть. Insert, Update, Dalate и Create table выполняются методом ExecSQL; и только!!!!
← →
TROY_Piter (2003-05-27 11:41) [2]Может быть, я его использую неправильно? Какова должна быть последовательность действий в данном случае???
И еще: можно ли принудительно изменить режим набора данных (State)? Каков синтаксис, если возможно?
← →
plans (2003-05-27 11:49) [3]
> Query1.Open;
Заменить на Query1.ExecSQL;
> И еще: можно ли принудительно изменить режим набора данных
> (State)? Каков синтаксис, если возможно?
У Table или "живого запроса" Query.ReqvestLive=true - Insert, Edit, Cancel - меняют State. А зачем тебе? Делаешь с ActionList что-то?
← →
Соловьев (2003-05-27 11:50) [4]
> Может быть, я его использую неправильно? Какова должна быть
> последовательность действий в данном случае???
А что хоть пишет? и попробуй все-таки заменить open на execsql
← →
I_C_E_ (2003-05-27 13:02) [5]А так ли необходимо ввод удаление и изменение делать через Query?
вводи через таблицы.
← →
I_C_E_ (2003-05-27 13:14) [6]Попробуй Все таблицы входящие в Query перевести в режим редактирования
← →
Соловьев (2003-05-27 13:26) [7]
> Попробуй Все таблицы входящие в Query перевести в режим
> редактирования
ничего не даст.
← →
TROY_Piter (2003-05-27 17:05) [8]Значится, отредактировал код вот так:
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("UPDATE MainTable.db SET MainTable.Number = :Number1 WHERE (Abonenty..Last_name = :Last_name1)";
Query1.ParamByName("Number1").AsString:=Edit6.Text;
Query1.ParamByName("Last_name1").AsString:=Edit1.Text;
Query1.ExecSQL;
end;
Теперь выдает такую ошибку:
"DEBUGGER EXCEPTION NOTIFICATION
Project Project1.exe raised exception class EDBEngineError with message "Invalid field name.Last_name". Process stopped. Use Step or Run to continue"
Если код сделать в таком виде:
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("SELECT A.Last_name, A.First_name, A.Second_name, A.Passport, A.Address, M.Number, M.Balance, T.Tariff, T.Abon_pl, T.Rab_den, T.Vyh_den, R.Region, M.Dop_uslugi");
Query1.SQL.Add("FROM "MainTable.db" M INNER JOIN "Abonenty.db" A ON (M.Key_ab = A.Key_ab) INNER JOIN "Region.db" R ON (M.Key_reg = R.Key_reg) INNER JOIN "Tariff.db" T ON (M.Key_tar = T.Key_tar);");
Query1.SQL.Add("UPDATE "MainTable.db" SET "MainTable.db".Number = :Number1 WHERE ("Abonenty.db".Last_name = :Last_name1)");
Query1.ParamByName("Number1").AsString:=Edit6.Text;
Query1.ParamByName("Last_name1").AsString:=Edit1.Text;
Query1.ExecSQL;
То, соответственно, такая ошибка:
"DEBUGGER EXCEPTION NOTIFICATION
Project Project1.exe raised exception class EDBEngineError with message "Invalid use of keyword. Token: UPDATE Line number:3". Process stopped. Use Step or Run to continue"
А если попытаться вот так:
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("SELECT A.Last_name, A.First_name, A.Second_name, A.Passport, A.Address, M.Number, M.Balance, T.Tariff, T.Abon_pl, T.Rab_den, T.Vyh_den, R.Region, M.Dop_uslugi");
Query1.SQL.Add("FROM "MainTable.db" M INNER JOIN "Abonenty.db" A ON (M.Key_ab = A.Key_ab) INNER JOIN "Region.db" R ON (M.Key_reg = R.Key_reg) INNER JOIN "Tariff.db" T ON (M.Key_tar = T.Key_tar);");
Query1.SQL.Add("UPDATE "MainTable.db" SET "MainTable.db".Number = :Number1 WHERE ("Abonenty.db".Last_name = :Last_name1)");
Query1.ParamByName("Number1").AsString:=Edit6.Text;
Query1.ParamByName("Last_name1").AsString:=Edit1.Text;
Query1.Post;
Query1.ExecSQL;
Выдает следующее:
"DEBUGGER EXCEPTION NOTIFICATION
Project Project1.exe raised exception class EDatabaseError with message "Query1: Dataset not in edit or insert mode". Process stopped. Use Step or Run to continue"
Такая же байда (как последняя) у меня и раньше была... =(
← →
TROY_Piter (2003-05-27 17:15) [9]В первом коде между Abonenty и Lаst_name одна точка =)
← →
Соловьев (2003-05-27 17:19) [10]
> Query1.SQL.Add("UPDATE MainTable.db SET MainTable.Number
> = :Number1 WHERE (Abonenty..Last_name
Abonenty - а это что? у тебя же MainTable.db без псевдонима!
← →
TROY_Piter (2003-05-27 23:43) [11]Abonenty - это таблица абонентов =)
На самом деле, уже разобрался с этой бодягой... Сделал так, если кому интересно:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("UPDATE MainTable SET MainTable.Number = :Number1, MainTable.Balance = :Balance1, MainTable.Dop_uslugi = :Dop_uslugi1 WHERE MainTable.ID = :ID1;");
Query1.ParamByName("Number1").AsString:=Edit6.Text;
Query1.ParamByName("Balance1").AsString:=Edit7.Text;
Query1.ParamByName("Dop_uslugi1").AsString:=Edit13.Text;
Query1.ParamByName("ID1").AsInteger:=StrToInt(Edit14.Text);
Query1.ExecSQL;
То есть проблема, в принципе, была именно в запросе...
Но теперь появилась другая =))
В главной таблице есть ключевое поле автоинкрементного типа.
Остальные поля других типов, неключевые. Всего 7 полей (с автоинкрементным).
При попытке добавить запись таким методом (указание значений всех полей):
"INSERT INTO MainTable VALUES (значение1, значение2, значение3, значение4, значение5, значение6, значение7")
Ругается, что "INSERT and UPDATE operations are not supported on autoincrement field type"
Если попробовать указать все поля, кроме автоинкрементного, т.е. вот так:
"INSERT INTO MainTable (MainTable.Key_ab, MainTable.Key_reg, MainTable.Key_tar, MainTable.Number, MainTable.Balance, MainTable.Dop_uslugi)
VALUES (значение2, значение3, значение4, значение5, значение6, значение7);"
То говорит, что "Field value required"...
Что делать? Поскажите, плз! То есть как заставить автоинкрементное поле (ключевое) автоматически увеличиваться на единицу при добавлении новой записи???
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c