Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

Как добавить запись в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.014 c
3-1133720931
_kostet
2005-12-04 21:28
2006.02.05
Взаимодействие программ через хранимую процедуру


15-1137138666
data
2006-01-13 10:51
2006.02.05
Ищу книгу Иосифа Дика "В дебрях Кара-Бумбы". Нужно сыну


4-1132828786
Jmen
2005-11-24 13:39
2006.02.05
WinSocket, наложенное событие ввода/вывода, код 997


15-1137151161
Хинт
2006-01-13 14:19
2006.02.05
Редактор HTML/PHP


1-1135935500
__oleg
2005-12-30 12:38
2006.02.05
Scrool в TStringGrid





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