Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2012, 21:30   #1
Esoone
 
Регистрация: 02.05.2012
Сообщений: 8
По умолчанию изменение полей в бд

У меня есть stringgrid в котором после выборки занесены значения из бд, мне нужно по клику на ячейку изменить значение в гриде и отправить его в бд. Например в гриде у меня есть поле фио со значение ИВАНОВ по клику я изменяю значение на ПЕТРОВ и по двойному клику отправляю в таблицу.

Я никак не могу додуматься, как мне проверять из какой таблицы ИВАНОВ и как его заменить на ПЕТРОВа
Esoone вне форума Ответить с цитированием
Старый 18.10.2012, 21:48   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

А что мешает пользовать DBGrid или DBGridEh?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.10.2012, 09:29   #3
Esoone
 
Регистрация: 02.05.2012
Сообщений: 8
По умолчанию

тем что условием дан stringgrid
Esoone вне форума Ответить с цитированием
Старый 19.10.2012, 09:35   #4
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Цитата:
никак не могу додуматься, как мне проверять из какой таблицы ИВАНОВ и как его заменить на ПЕТРОВа
Никак не додуматься ни о первом, ни о втором, если нигде нет информации о том из какой таблицы БД выбраны данные.
Karabash вне форума Ответить с цитированием
Старый 19.10.2012, 10:03   #5
Esoone
 
Регистрация: 02.05.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Karabash Посмотреть сообщение
Никак не додуматься ни о первом, ни о втором, если нигде нет информации о том из какой таблицы БД выбраны данные.
Информация берется из запроса, и заносится в стринггрид.
Esoone вне форума Ответить с цитированием
Старый 19.10.2012, 10:18   #6
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Значит нужно сохранять (если еще не заносится) в каждую строку стринггрида (вернее, в список Objects, например, первой колонки) идентификатор строки из таблицы БД. А имя таблицы есть в тексте запроса.

---
В продолжении (знать идентификатор строки мало).
1 вариант.
Объявить массив строк с именами полей таблицы из которой берутся данные. Имена полей в массиве должны располагаться в том порядке, в каком их значения заносятся в стрингрид.
В этом случае замена значения будет выглядеть примерно так:
Код:
'update <table> set '+arr[SG.Col]+' = '+QuotedStr(SG.Cells[SG.Col, SG.Row]+' where ID = '+
IntToStr(Integer(SG.Objects[SG.Col, SG.Row]))
где arr - упомянутый массив; SG - наш стринггрид; ID - имя поля идентифицирующего строку в таблице БД.

Последний раз редактировалось Karabash; 19.10.2012 в 10:29.
Karabash вне форума Ответить с цитированием
Старый 19.10.2012, 10:56   #7
Esoone
 
Регистрация: 02.05.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Karabash Посмотреть сообщение
Значит нужно сохранять (если еще не заносится) в каждую строку стринггрида (вернее, в список Objects, например, первой колонки) идентификатор строки из таблицы БД. А имя таблицы есть в тексте запроса.

---
В продолжении (знать идентификатор строки мало).
1 вариант.
Объявить массив строк с именами полей таблицы из которой берутся данные. Имена полей в массиве должны располагаться в том порядке, в каком их значения заносятся в стрингрид.
В этом случае замена значения будет выглядеть примерно так:
Код:
'update <table> set '+arr[SG.Col]+' = '+QuotedStr(SG.Cells[SG.Col, SG.Row]+' where ID = '+
IntToStr(Integer(SG.Objects[SG.Col, SG.Row]))
где arr - упомянутый массив; SG - наш стринггрид; ID - имя поля идентифицирующего строку в таблице БД.
Спасибо, попробую когда включат бд
Esoone вне форума Ответить с цитированием
Старый 19.10.2012, 18:34   #8
Esoone
 
Регистрация: 02.05.2012
Сообщений: 8
По умолчанию

написал код по типу вашего
Код:
procedure TForm1.btn3Click(Sender: TObject);
var
st,st1,st2:string;
begin
ShowMessage(string1);
ShowMessage(IntToStr(q1));
ShowMessage(IntToStr(w1));
st1:=StringGrid1.Cells[q1,w1];
ShowMessage(st1);
st2:=StringGrid1.Cells[q1,0];
ibqry1.SQL.add('UPDATE inn SET '+quotedstr(st2)+'='+quotedstr(st1)+'  WHERE '+quotedstr(st2)+'='+quotedstr(string1));

end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin
q1:=StringGrid1.Col;
w1:=StringGrid1.Row;
string1:=StringGrid1.Cells[q1,w1];
и ничего не происходит, запрос обрабатывается но изменений не несет
Esoone вне форума Ответить с цитированием
Старый 19.10.2012, 18:45   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
ibqry1.SQL.add('UPDATE inn SET '+quotedstr(st2)+'='+quotedstr(st1)+'  WHERE '+quotedstr(st2)+'='+quotedstr(string1));
запрос сформирован, НО пока еще НЕ передан на сервер (в БД) (не выполнен!).

Код:
ibqry1.ExecuteSQL //Выполнить запрос!
чтобы увидеть результаты надо закрыть и заново открыть соотетствующие НДю
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.10.2012, 19:37   #10
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Код:
UPDATE inn SET '+quotedstr(st2)+'='+quotedstr(st1)+'
С помощью функии quotedstr в тексте запроса обрамляются одинарными кавычками строковые ЗНАЧЕНИЯ, но никак не имена полей. Это как раз тот случай, когда кашу маслом легко испортить.
Karabash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение полей таблицы Mashul'ka БД в Delphi 2 04.10.2011 22:31
Изменение полей DBGrid virtuhay266 БД в Delphi 9 05.06.2011 16:14
Изменение размеров полей 30gb PHP 1 08.02.2011 13:03
DbGrid изменение ширины полей Paul Hindenburg Компоненты Delphi 4 21.09.2009 10:35
Объеденение полей запроса в для отображения нескольких полей в одном списке mrCreator Microsoft Office Access 3 08.08.2009 00:53