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

Вниз

Как узнать название поля DBGridEh -где изменилось значение?   Найти похожие ветки 

 
Igor'   (2009-01-06 09:49) [0]

Хочу синхронизировать два компонента: как только меняется значение какой-то ячейки DBGridEh - автоматически пересчитыварь во втором компоненте:
Select <Field1>, count(<Field1>) from <TableName> group by <Field1>
Так вот - как после редактирования ячейки получить название "Field_n"?


 
KilkennyCat ©   (2009-01-06 10:11) [1]

меняется значение в ячейке контрола, или в записи БД?


 
Igor'   (2009-01-06 10:19) [2]

DBGridEh.ReadOnly:=false т.е. меняю значение ячейки => меняется и запись в БД! И, кстате, если это имеет значение - поле lookup-ное!


 
Igor'   (2009-01-06 11:32) [3]

И событие какое правильно выбрать: AfterColEdit, BeforeInsert...? Нашёл пока только dbgrid1.SelectedField.FieldName - но пользователю то нужно кликнуть по другой ячейке, чтобы запись сохранилась!? - выходит ячейка то уже будет другая, и, скорее всего, в каком-нибудь из соседних полей!


 
Юрий Зотов ©   (2009-01-06 12:42) [4]

> Igor"   (06.01.09 11:32) [3]

Посмотрите TDataSource.OnDataChange


 
MsGuns ©   (2009-01-06 13:02) [5]

Идея сама по себе порочная, т.к. создает иллюзию изменения данных без собственно изменения в БД


 
Igor'   (2009-01-06 13:19) [6]

Да, посмотрел:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if Field.Name ="Field1" then ...
 // обновляем данные во 2-м компоненте
end;
Но, как правильно сказал :
> Изменение может быть любым из следующего: пользователь перешел
> к новой записи

Можно как-то исключить перемещение по записям?


 
Igor'   (2009-01-06 13:23) [7]

OnUpdateData подходит, но Field: TField - параметра нет ((((


 
Юрий Зотов ©   (2009-01-06 13:32) [8]

> Igor"   (06.01.09 13:19) [6]

> Можно как-то исключить перемещение по записям?

Навскидку:
if (Field <> nil) and (UpperCase(Field.Name) = "FIELD1") then ...


 
Юрий Зотов ©   (2009-01-06 13:38) [9]

> Igor"   (06.01.09 13:19) [6]

Еще - если интересует конкретное поле (или несколько конкретных полей), то у компонента TField есть события OnChange и OnValidate.


 
Igor'   (2009-01-06 13:40) [10]

Изменение может быть любым из следующего: пользователь перешел к новой записи, поле было модифицировано, изменились содержимое или макет.
Юрий, т.е. получается, что если происходит переход к новой записи, то Field = nil ?


 
Igor'   (2009-01-06 13:43) [11]

> Еще - если интересует конкретное поле (или несколько конкретных
> полей), то у компонента TField есть события OnChange и OnValidate.
>

А как эти события реагируют на перемещение по записям?


 
Юрий Зотов ©   (2009-01-06 13:44) [12]

> Igor"   (06.01.09 13:40) [10]

См. справку. Если меняется сразу несколько полей, то Field = nil. При переходе к другой записи (и при вставке новой записи) именно это и происходит.


 
Юрий Зотов ©   (2009-01-06 13:53) [13]

> Igor"   (06.01.09 13:43) [11]

> А как эти события реагируют на перемещение по записям?

Так же, естественно. Они реагируют на любое изменение данных в активной записи датасета, независимо от причины этого изменения. А навигация тоже приводит к изменению данных в активной записи датасета.

Впрочем, навигацию можно отловить в событиях датасета и выставить логический флажок, а при обработке его проверять и сбрасывать.

Только это неправильно будет. Правильно - это когда второй компонент ТОЧНО и ВСЕГДА отображает то, что должен. И если активная запись сменилась, то его тоже надо обновлять. То есть, его надо обновлять при ЛЮБОМ изменении поля, независимо от причины этого изменения.


 
Igor'   (2009-01-06 16:40) [14]

C OnDataChange - облом! В этом событии получаю данные - до редактирования!


 
KilkennyCat ©   (2009-01-06 17:48) [15]

Write an OnDataChange event handler to take specific actions when a field in the current record has been edited and the application moves to another field, or when the current record in the associated dataset changes. OnDataChange is especially useful in applications that must synchronize data display in controls that are not data-aware. This event is typically used to make sure the control reflects the current field values in the dataset, because it is triggered by all changes.  

Methods that can trigger this event include the Next or Prior methods for the dataset. Data-aware controls notify a data source of a data change when:

Scrolling to a new record.

Modifications to a field"s data.  

Delphi Examples:

{
This example uses a button to copy the value of a field in
the previous record into the corresponding field in the
current record.  The field to copy is specified by using
FindField and the name of the field.
}
procedure TForm1.Button1Click(Sender: TObject);
var
  SavePlace: TBookmark;
  PrevValue: Variant;
begin
 Close;
  with Customers do
  begin
   { get a bookmark so that we can return to the same record }
   SavePlace := GetBookmark;
   try
     { move to prior record}
     FindPrior;
     { get the value }
     { This is the safe way to get "CustNo" field }
     PrevValue := FindField("Field2").Value;
     { This is *not* the safe way to change "CustNo" field }
//    PrevValue := Fields[1].Value;
     { Move back to the bookmark
     this may not be the next record anymore
     if something else is changing the dataset asynchronously }
     GotoBookmark(SavePlace);
     { Set the value }
     Edit;
     { This is the safe way to change "CustNo" field }
     FindField("Field2").AsString := PrevValue;
     { This is *not* the safe way to change "CustNo" field }
//      Fields[1].AsString := PrevValue;
     { Free the bookmark }
   finally
     FreeBookmark(SavePlace);
   end;
 end;
end;

{
To ensure that the button is disabled when there is no
previous record, the OnDataChange event of the DataSource
detects when the user moves to the beginning of file (BOF
property becomes true), and disables the button.  Detection
occurs on scrolling and editing, not selection with the mouse.
}
procedure TForm1.DS2DataChange(Sender: TObject; Field: TField);
begin
 if Customers.Bof then
   Button1.Enabled := False
 else
   Button1.Enabled := True;
end;
{
This example uses a button to copy the value of a field in
the previous record into the corresponding field in the
current record.
}
procedure TForm1.Button1Click(Sender: TObject);
var
  SavePlace: TBookmark;
  PrevValue: Variant;
begin
  with Customers do
  begin
   { get a bookmark so that we can return to the same record }
   SavePlace := GetBookmark;
   try
     { move to prior record}
     FindPrior;
     { get the value }
     PrevValue := FindField("Field2").Value;
     {Move back to the bookmark
     this may not be the next record anymore
     if something else is changing the dataset asynchronously }
     GotoBookmark(SavePlace);
     { Set the value }
     Edit;
     FindField("Field2").Value := PrevValue;
     { Free the bookmark }
   finally
     FreeBookmark(SavePlace);
   end;
 end;
end;

{
To ensure that the button is disabled when there is no
previous record, the OnDataChange event of the DataSource
detects when the user moves to the beginning of file (BOF
property becomes true), and disables the button.  Detection
occurs on scrolling and editing, not selection with the mouse.
}
procedure TForm1.DS2DataChange(Sender: TObject; Field: TField);
begin
 if Customers.Bof then
   Button1.Enabled := False
 else
   Button1.Enabled := True;
end;


 
KilkennyCat ©   (2009-01-06 17:49) [16]

Могу и на остальные события справку скопировать...


 
Igor'   (2009-01-06 19:17) [17]

> KilkennyCat ©   (06.01.09 17:49) [16]
> Могу и на остальные события справку скопировать...

Спасибо, Kilkenny! ) не надо! Лучше подскажи:
- значит в OnDataChange я могу получить имя редактируемого поля! А каким тогда событием воспользоваться, чтобы обновить данные во втором компоненте? Т.е. мне нужно получить количество ПОСЛЕ изменений:
Select <Field1>, count(<Field1>) from <TableName> group by <Field1>!!!


 
Юрий Зотов ©   (2009-01-06 20:53) [18]

> Igor"   (06.01.09 19:17) [17]

Редактируется поле датасета (на клиенте), а Select берет данные из БД (с сервера). Угадайте, что выберет Select, если изменение поля еще не было закоммичено?


 
Igor'   (2009-01-06 20:54) [19]

> Юрий Зотов ©   (06.01.09 20:53) [18]

Ну ни мучайте! Скажите - какое событие мне нужно?


 
Юрий Зотов ©   (2009-01-06 21:12) [20]

> Igor"   (06.01.09 20:54) [19]

> Скажите - какое событие мне нужно?

OnDataChange. Но для того, чтобы новое значение (которое получилось после редактирования поля) записалось в таблицу БД, это изменение надо закоммить. Иначе получается, что редактируются данные только на клиенте, а на сервере ничего не меняется. Естественно, при этом select все время выбирает одни и те же старые данные.


 
Igor'   (2009-01-07 09:15) [21]

> это изменение надо закоммить
что это значит? закомментировать? законнектить? как?

Перелистывая справки нахожу:
procedure TForm1.ClientDataSet1AfterEdit(DataSet: TDataSet);
begin
  Memo2.Lines.Add("After editing record" + IntToStr(DataSet.RecNo));
end;


Хотя, будь мне хоть чуточку по-понятнее, что Вы имеете в виду под словами:
> OnDataChange. Но для того, чтобы новое значение (которое
> получилось после редактирования поля) записалось в таблицу
> БД, это изменение надо закоммить.

куда удобнее было-бы всё делать в одной процедуре, чем перекидываться через переменную значением!


 
Юрий Зотов ©   (2009-01-07 14:56) [22]

> Igor"   (07.01.09 09:15) [21]

> что это значит?

Это описка. Имелось в виду "закоммитить" (от слова COMMIT). То есть, перенести в таблицы БД изменения данных, сделанные на клиенте.

Игорь, если Вы хотите понять всю эту кухню и больше в ней не путаться, придется начинать с самого начала. И для начала найдите ответы на такие вопросы:

1. Что такое сервер БД и клиентская часть программы?
2. Для чего нужен датасет?
3. Откуда и куда перекачиваются данные при выполнении select?
4. Как эти данные отображаются на экране?
5. Где происходит изменение данных, когда они редактируются пользователем?
6. Что такое Post и для чего он нужен?
7. Что такое Commit и для чего он нужен?


 
MsGuns ©   (2009-01-07 15:34) [23]

>Igor"   (06.01.09 20:54) [19]
>Ну ни мучайте! Скажите - какое событие мне нужно?

Вам давно было сказано, что Вам нужны не события, а ПОНИМАНИЕ того, что происходит в вашем приложении при работе с ним пользователя и как на это ПРАВИЛЬНО реагировать не в смысле какие нужно "отлавливать" события, а как и в какие именно моменты воздействовать на датасет, объекты БД (таблицы), отображающие сетки и т.д. ИМХО, у Вас же в голове за "событиями" потеряна общая идея ЧТО Вы делаете и ЗАЧЕМ. Как говорится, за деревьями потерялся лес

Вы [5] проигнорировали, а совершенно напрасно ибо там - корень всех сабжевых проблем


 
MsGuns ©   (2009-01-07 15:37) [24]

В общем случае программа из [22] должна Вам помочь

Я бы еще добавил пункт:

8) Связанные данные. Обеспечение динамики связок "Мастер-детал", в том числе при редактировании.



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

Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
15-1229613114
Andy BitOff
2008-12-18 18:11
2009.02.15
DevExpress и BandedView или как-то по другому.


2-1230969991
N_SSS
2009-01-03 11:06
2009.02.15
Подключение справочников (Lookup) для DbGridEh


15-1229516250
Knight
2008-12-17 15:17
2009.02.15
У меня тоже дочька завтра родится... три месяца назад.


15-1229929327
Slider007
2008-12-22 10:02
2009.02.15
С днем рождения ! 21 декабря 2008 воскресенье


3-1214849398
arturich
2008-06-30 22:09
2009.02.15
Соединение с Oracle через Database Explorer





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