Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-60478
DVM
2003-04-18 19:35
2003.06.19
Запрет изменения размеров окна с трех сторон


1-60170
deedlit
2003-06-06 15:19
2003.06.19
Оскомина работы с эксплорером...


3-60065
sony1
2003-05-28 13:08
2003.06.19
Как выбрать из view первые 100 записей например ?


3-60062
sunrider
2003-05-28 00:04
2003.06.19
Обработка информации по типу удаленных процедур


8-60270
Карелин Артем
2003-03-07 06:49
2003.06.19
Проигрывание видео и аудио из базы. Не сохраняя на винт.





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