Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение значений полей в 2х таблицах ADO, Delphi, базы данных, ADO 
V
    Опции темы
RuthlessD
  Дата 16.6.2011, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.6.2011

Репутация: нет
Всего: нет



Доброе время суток, подскажите пожалуйста как можно выполнить задачу -
имеются 2 таблицы, в первой таблице 1 поле - специальность, оно же и ключевое. Во второй таблице поля специальность и дисциплина(дисциплина ключевое). Вопрос состоит в том, как сделать возможным изменение специальности в первой таблице, с последующими заменами этих же специальностей на новое значение, во второй таблице.

Добавлено через 1 час 2 минуты
Вот код того как я изменяю изменяю данные в первой таблице:

Жму на форме кнопку изменения данных.
procedure TForm12.Button2Click(Sender: TObject);
begin
Form13.show;
Adotable1.Edit;
end;



это кнопка на другой форме, с помощью которых я изменяю на введенные значение в dbedit
procedure TForm13.Button1Click(Sender: TObject);
begin
if dbedit1.text='' then begin messagebox(0,'Введите специальность!','Внимание',MB_OK); Abort; end else
form12.adotable1.post;
Form13.Close;
end;
  
PM MAIL   Вверх
Akella
Дата 16.6.2011, 23:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Наверное скоро откроем специальный раздел в Delphi для студентов
PM MAIL   Вверх
Данкинг
Дата 16.6.2011, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Если каждая специальность имеет своё значение ключа, то заменить запросом - с условием WHERE - не составит труда. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
RuthlessD
Дата 17.6.2011, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.6.2011

Репутация: нет
Всего: нет



Я не использую ADOQuery...
PM MAIL   Вверх
14SatanA88
Дата 17.6.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 1
Всего: 5



Цитата(RuthlessD @  16.6.2011,  19:54 Найти цитируемый пост)
TForm12 TForm13
  smile 

по сабжу
ну пройдись for'ом и поменяй

и еще.
пользуйся кнопкой "код", а то невозможно читать.

Это сообщение отредактировал(а) 14SatanA88 - 17.6.2011, 08:42
PM MAIL ICQ   Вверх
RuthlessD
Дата 17.6.2011, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.6.2011

Репутация: нет
Всего: нет



14SatanA88, Я только учусь, название форм я не менял потому что мне так реально удобно, я знаю что где есть, хоть и не красиво.
А насчет фора, я даже не представляю как это сделать. У меня была чуть другая мысль: изменяя какую либо специальность, в первую переменную записывалось бы изменяемое значение, а во вторую то на что изменили. Потом в другой таблице через локейт(locate) сделать сортировку по первой переменной и заменить на значение из 2й переменной. Но как это организовать хоть убейте не знаю, не могу....
PM MAIL   Вверх
14SatanA88
Дата 17.6.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 1
Всего: 5



Цитата

Я только учусь


я сам недавно только колледж окончил

Цитата

название форм я не менял потому что мне так реально удобно


рекомендую менять название компонентов (и форм в частности) на свои. это реально удобней. сам прошел этот этап.

Цитата

через локейт(locate) сделать сортировку


вообще locate - это поиск

ну сделай замену так
Код

adotable1.first; // таблицу в начало
adotavle1.edit; // разрешаем редактирование, иначе вылетит
for i:=1 to adotable1.recordcount do // от 1 (первая запись) до recordcoun (число записей вообще)
begin
if (adotable1.fieldbyname('spec').asstring=old_spec) then adotable1.fieldbyname('spec').asstring:=new_spec; // проверка и замена 
adotable1.post; // сохранить изменения записи
adotable1.next; // перейти к следующей
end;


if (adotable1.fieldbyname('spec').asstring=old_spec) then adotable1.fieldbyname('spec').asstring:=new_spec; 
здесь у тебя будет:
spec - имя поля, где специальность
old_spec - строковая переменная, где ты запишешь старую специальность
new_spec - строковая переменная, где новая специальность

а вообще sql-ем лучше. но я в нем не шарю практически
PM MAIL ICQ   Вверх
chip_and_dayl
Дата 17.6.2011, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 2
Всего: 9



Цитата(RuthlessD @  16.6.2011,  19:54 Найти цитируемый пост)
Вопрос состоит в том, как сделать возможным изменение специальности в первой таблице, с последующими заменами этих же специальностей на новое значение, во второй таблице.


Организовать правильно структуру базы и тогда такого извращения не будет. + знание СКЛ запросов не помешало бы

Добавлено через 3 минуты и 21 секунду
НО если уже пошли извращаться, то лучше сделать обновление через запрос, иначе если будет записей свыше 1 000, то будет не гуд.

Запрос типа

Код

update Таблица set ПОЛЕ_СПЕЦИАЛЬНОСТЬ = НОВОЕ ЗНАЧЕНИЕ where ПОЛЕ_СПециальность=СТАРОЕ_ЗНАЧЕНИЕ



--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
RuthlessD
Дата 17.6.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.6.2011

Репутация: нет
Всего: нет



14SatanA88,  Появляется ошибка, когда я жму на кнопку изменить ...... raised exception class EDatabaseError with message 'ADOTable2: Dataset not in edit or insert mode'.



Вот кнопка зименить. 
procedure TForm13.Button1Click(Sender: TObject);
var spec,newspec:string; I:integer;
begin
spec:=form12.ADOTable1.FieldByName('Specialnost').Value;
if dbedit1.text='' then begin  messagebox(0,'Введите специальность!','Внимание',MB_OK); Abort; end  else
newspec:=dbedit1.Text;
form12.adotable1.post;

form12.adotable2.edit;        // разрешаем редактирование, иначе вылетит
form12.adotable2.first; // таблицу в начало
for i:=1 to form12.adotable2.recordcount do // от 1 (первая запись) до recordcoun (число записей вообще)
begin
if (form12.adotable2.fieldbyname('Specialnost').asstring=spec) then form12.adotable2.fieldbyname('Specialnost').asstring:=newspec; // проверка и замена
form12.adotable2.post; // сохранить изменения записи
form12.adotable2.next; // перейти к следующей
Form13.Close;
end;
end;


Эта кнопка находится на форме, которую открываю с помощью 
procedure TForm12.Button2Click(Sender: TObject);
begin
Form13.show;
Adotable1.Edit; // Тут я в эдит 1й дататэйбл перевожу. 
end;



chip_and_dayl,  Да понимаю, но структуру уже поздно менять, мне этот проект надо доделывать....
В ADotable вроде же нельзя SQL пользоваться (?
PM MAIL   Вверх
Данкинг
Дата 17.6.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Какой нафиг цикл, если запросом это будет наиболее быстро.

Добавлено через 1 минуту и 15 секунд
Цитата(RuthlessD @ 17.6.2011,  05:39)
Я не использую ADOQuery...

А, так это принцип такой, что ли? smile Ну, тогда перебирай в цикле и юзай .Edit ... .Post.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
14SatanA88
Дата 17.6.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 1
Всего: 5



Цитата(RuthlessD @  17.6.2011,  09:38 Найти цитируемый пост)
Появляется ошибка, когда я жму на кнопку изменить ...... raised exception class EDatabaseError with message 'ADOTable2: Dataset not in edit or insert mode'.


значит ты пытаешься записать значение в таблицу, к которой доступ закрыт.

пользуйся кнопкой "код", когда постишь код.

на какой строке ошибка?

Добавлено через 39 секунд
Цитата(Данкинг @  17.6.2011,  09:38 Найти цитируемый пост)
запросом это будет наиболее быстро

плюсую.
да и кода меньше

PM MAIL ICQ   Вверх
RuthlessD
Дата 17.6.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.6.2011

Репутация: нет
Всего: нет



На какой строке не пишиь, жму Break, экран показывает просто весь код, нигде ничего не выделяя, а программа продолжает работать.


Код

procedure TForm13.Button1Click(Sender: TObject);
var spec,newspec:string; I:integer;
begin
spec:=form12.ADOTable1.FieldByName('Specialnost').Value;
if dbedit1.text='' then begin  messagebox(0,'Введите специальность!','Внимание',MB_OK); Abort; end  else
newspec:=dbedit1.Text;
form12.adotable1.post;

form12.adotable2.edit;        // разрешаем редактирование, иначе вылетит
form12.adotable2.first; // таблицу в начало
for i:=1 to form12.adotable2.recordcount do // от 1 (первая запись) до recordcoun (число записей вообще)
begin
if (form12.adotable2.fieldbyname('Specialnost').asstring=spec) then form12.adotable2.fieldbyname('Specialnost').asstring:=newspec; // проверка и замена
form12.adotable2.post; // сохранить изменения записи
form12.adotable2.next; // перейти к следующей
Form13.Close;
end;
end;



Может я дурачек и не правильно определяю старое значение 
Код

spec:=form12.ADOTable1.FieldByName('Specialnost').Value;


Это сообщение отредактировал(а) RuthlessD - 17.6.2011, 09:54
PM MAIL   Вверх
14SatanA88
Дата 17.6.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 1
Всего: 5



Код

procedure TForm13.Button1Click(Sender: TObject);
var spec,newspec:string; I:integer;
begin
spec:=form12.ADOTable1.FieldByName('Specialnost').Value;
if dbedit1.text='' then begin  messagebox(0,'Введите специальность!','Внимание',MB_OK); Abort; end  else
newspec:=dbedit1.Text;
form12.adotable1.post;

form12.adotable2.edit;        // разрешаем редактирование, иначе вылетит
form12.adotable2.first; // таблицу в начало
for i:=1 to form12.adotable2.recordcount do // от 1 (первая запись) до recordcoun (число записей вообще)
begin
if (form12.adotable2.fieldbyname('Specialnost').asstring=spec) then form12.adotable2.fieldbyname('Specialnost').asstring:=newspec; // проверка и замена
form12.adotable2.post; // сохранить изменения записи
form12.adotable2.next; // перейти к следующей
Form13.Close;
end;
end;


ну попробуй строку 9 перенести в начало процедуры.

Цитата

Может я дурачек и не правильно определяю старое значение 
spec:=form12.ADOTable1.FieldByName('Specialnost').Value;


тогда другой тип еррора был бы.
тут именно попытка изменения данных таблицы, доступ к которой не открыт

Это сообщение отредактировал(а) 14SatanA88 - 17.6.2011, 09:59
PM MAIL ICQ   Вверх
RuthlessD
Дата 17.6.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.6.2011

Репутация: нет
Всего: нет



Не помогло, я даже при нажатии на кнопку - вызове формы с кнопкой изменения, добавил кол Adotable2.edit...

PM MAIL   Вверх
14SatanA88
Дата 17.6.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 1
Всего: 5



ну тогда надо отслеживать где ошибка
прицепи исходник, я посмотрю

Это сообщение отредактировал(а) 14SatanA88 - 17.6.2011, 10:04
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.