Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Как добавить запись в DBGrid?   Найти похожие ветки 

 
JazY   (2005-12-03 17:02) [0]

Мне нужно записывать текст в одном поле DBGrid, если в другом поле появился определенный текст. К примеру, я забил в поле "Товар", текст "ТоварА", тут же автоматически в DBGrid, но в поле "Завод" должен появиться текст "Завод 1". Как отловить появления текста в ячейке, я наверное, понял:
В OnDrawColumnCell я пишу
if (Column.FieldName = "Товар") then
if (Column.Field.Asstring = "ТоварА") then begin


Но вот как добавить текст в той же строке, но в другое поле никак не разберусь, т.к только начал работать с БД. Подскажите исходник, а? Заранее спасибо.


 
JazY   (2005-12-04 20:01) [1]

Ответ нашел. Тему можно закрывать.


 
JazY   (2005-12-05 00:56) [2]

Я, наверное, несколько преувеличил, что задача решена. Вот использую такой код:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
holdColor: TColor;
begin
if (Column.FieldName = "Производство") then
if (Column.Field.Asstring = "*") then begin
adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";
end;

Но проблема в том, что это событие происходит на событие DrawColumnCell. Мне кажется, что это неправильно. Первоначально это событие использовалось для выделения ячеек определенным цветом, но отлавливать появления новых значений (для чего собственно и создавался выше указанный код) необходимо видимо в другом событии? Как вы считаете в каком событие нужно отлавливать появление определенного текста и как изменится тогда код?


 
Плохиш ©   (2005-12-05 01:09) [3]

TDataSource.OnDataChange


 
JazY   (2005-12-05 03:04) [4]

Попробовал в этом событие. Вот какой код использую:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].FieldName = "Ïðоизводство") then
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].Field.AsString="*") then begin
adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";
end;

Выдает ошибку типа "Stack overflow". Точно не скажу, поскольку в результате все напрочь виснет, а если запускать программу, то при выполнение этого кода вообще все напрочь виснет. Как лечить? Что делать?

Еще раз оговорюсь, что цель поймать появление определенного текста в столбце "Производство" и затем в той же строке, но в другом поле (Готовность) указать текст "ок"!


 
ЮЮ ©   (2005-12-05 03:29) [5]

>К примеру, я забил в поле "Товар", текст "ТоварА", тут же автоматически в DBGrid, но в поле "Завод" должен появиться текст "Завод 1".

А почему "Завод 1"? Это что "пятничная загадка"? "ЗаводА" было бы логичнее :)

>Подскажите исходник, а? Заранее спасибо.
Похоже, ты создаещь нечто уникальное, так что исходники только у тебя :)


 
ЮЮ ©   (2005-12-05 03:42) [6]

>Как лечить? Что делать?
Понять, что единожды вызвавшись, этот обработчик будет вызываться непрерывно, ибо после  

adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";

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


 
JazY   (2005-12-05 15:53) [7]


> состояние грида никак не изменилось, а набор данных был
> опять изменен, что вновь приведет к вызову этого обработчика.
>

Етить колотить! Вот оно как! Люди! Объясните ламеру от Делфи, как же изменить состояние грида? Как сделать чтобы не зацикливалось? Мне действительно очень важно выполнить указанную задачу!


 
Anatoly Podgoretsky ©   (2005-12-05 16:02) [8]

Какое состояние грида надо изменить?


 
Sergey13 ©   (2005-12-05 16:03) [9]

2 [7] JazY   (05.12.05 15:53)
Ты не с того конца вообще к задаче подошел. В гриде нет данных, они там только отображаются. И работать с гридом в данном случае - это все равно что причесывать зеркало.

>Мне действительно очень важно выполнить указанную задачу!
Тогда читать книжки надо. По другому никак, ИМХО.


 
ANB ©   (2005-12-05 16:07) [10]


> ЮЮ ©   (05.12.05 03:42) [6]

Ключевое слово - Calculated.


 
JazY   (2005-12-05 16:37) [11]

Хорошо. Начнем с начала.
Вот такой код:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].FieldName = "Производство") then
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].Field.AsString="*") then begin
adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";
end;

Насколько я понял, в результате выполнения такого кода произойдет зацикливание.... А это не есть хорошо. Как быть? Половина кода работает как надо!
Т.е:
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].FieldName = "Производство") then
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].Field.AsString="*") then begin

Вот этот код помогает отлавить появление звездочки в столбце ""производcтво"". Далее необходимо в этой же строке, но в другое поле ("Готовность") добавить запись ""ok"". Вот и все. Как отлавить появление нужного текста, я кажется понял, но как после этого отлавливания добавить запись не разберусь. Вот в этом и прошу помочь.


 
ANB ©   (2005-12-05 16:44) [12]


> JazY   (05.12.05 16:37) [11]

Может уточним термин "добавить запись" ?


 
JazY   (2005-12-05 16:55) [13]


> Может уточним термин "добавить запись" ?

Чтобы в ячейке текст появился. Т.е есть строка, и в этой строке в определенном поле появляется "*" тут же в той же строке, но в другом поле появляется "ок". Иными словами, просто нужно добавить текст в определенную ячейку уже имеющейся строки.


 
ANB ©   (2005-12-05 17:01) [14]


> JazY   (05.12.05 16:55) [13]

См. вычисляемые поля. Это попроще будет.


 
JazY   (2005-12-05 17:08) [15]


> См. вычисляемые поля. Это попроще будет.

Может без них можно обойтись?


 
Плохиш ©   (2005-12-05 17:23) [16]


> JazY   (05.12.05 16:37) [11]
> Хорошо. Начнем с начала.
> Вот такой код:
> procedure TForm1.DataSource1DataChange(Sender: TObject;
> Field: TField);

Вот здесь сказоно изменение какого поля вызвало данное событие, это поле и проверяй.
Перед вызовом Edit надо проверить, а не находится ли набор данных уже в состоянии редактирования или вставки записи.


 
JazY   (2005-12-05 17:37) [17]


> а не находится ли набор данных уже в состоянии редактирования

Т.е если находится, то тогда режим редактирования не включаем, а сразу adotable1.FieldByName("Готовность").AsString:="ok";

Правильно я понял?


 
Плохиш ©   (2005-12-05 17:39) [18]

Да


 
JazY   (2005-12-05 20:46) [19]

А как определить, что набор данных уже в состояние редактирования. Понимаю, что уже задолбал со своими вопрос, но задачу мне надо решить как можно быстрее, поэтому и надоедаю. Подскажите, а?


 
Virgo_Style ©   (2005-12-05 21:44) [20]

JazY   (05.12.05 20:46) [19]
if ADOQuery1.State = dsEdit...


 
Плохиш ©   (2005-12-05 22:14) [21]


> JazY   (05.12.05 20:46) [19]
> А как определить, что набор данных уже в состояние редактирования.
>  Понимаю, что уже задолбал со своими вопрос, но задачу мне
> надо решить как можно быстрее, поэтому и надоедаю. Подскажите,
>  а?

Читай справку, там всё написано


 
JazY   (2005-12-05 23:29) [22]

Все. Не понимаю чего происходит:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].FieldName = "Ïðоизводство") then
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].Field.AsString="*") then begin
if adotable1.State=dsEdit then begin
adotable1.FieldByName("Готовность").AsString:="ok";
end
else begin
adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";
end;
end;
end;

Не работает... и все тут.

Накрылась идея автоматизировать нашу контору... представителя малого бизнеса. :) Чего делать не знаю.


 
Плохиш ©   (2005-12-06 00:19) [23]


procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 if Field <> nil then
   if (Field.FieldName = "Производство") and (Field.AsString = "*") then
   begin
      if not (adotable1.state in [dsEdit, dsInsert]) then adotable1.edit;
      adotable1.FieldByName("Готовность").AsString := "ok";
   end;
end;


 
JazY   (2005-12-06 01:07) [24]

2 Плохиш
Большое спасибо! Я не знаю смогу ли я в будущем создавать такие элегантные решения, но по крайней мере буду стремиться. Еще раз спасибо, что указали решение задачи.


 
msguns ©   (2005-12-06 09:40) [25]

Неверно использование события OnDataChange в этом контексте из-за [6].
Если надо перед записью изменений в БД присвоить значения некоторым полям, разумнее использовать событие BeforePost, которое происходит ОДИН РАЗ НЕПОСРЕДСТВЕННО ПЕРЕД ЗАПИСЬЮ В БД, а не после изменения любого поля записи НД.


 
msguns ©   (2005-12-06 09:43) [26]

То, что написано в [23] может иметь смысл в одном единственном случае - если необходимо визуализировать дополнительно заполненное поле непосредственно СРАЗУ после изменения юзером основного, но ДО записи в БД.
Сам Плохиш так, как советует, вряд ли делает ;))


 
JazY   (2005-12-06 15:28) [27]


> если необходимо визуализировать дополнительно заполненное
> поле непосредственно СРАЗУ после изменения юзером основного,
>  но ДО записи в БД.

Вот как раз это и нужно.


 
Плохиш ©   (2005-12-06 15:47) [28]


> Сам Плохиш так, как советует, вряд ли делает ;))

У меня как-то такой необходимости не возникало ;-)



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

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.04 c
3-1133526802
Vedun
2005-12-02 15:33
2006.02.05
Структура файлов баз данных


15-1137343469
Maximsms
2006-01-15 19:44
2006.02.05
Что это за алгоритм? Help! Завтра экзамен.


2-1137402207
Делфёст
2006-01-16 12:03
2006.02.05
Печать HTML таблиц без разрыва - это возможно?


3-1134114728
ligor
2005-12-09 10:52
2006.02.05
FastReport 2.5


1-1135797029
deamon_t
2005-12-28 22:10
2006.02.05
Алгоритм захвата экрана