Witam,
posiadam dbgrida + datasource + dataset.
Dobrze...
doszedlem do tego ze gdy chce cos edytowac w bazie z poziomu dbgrida to musze wykonac na koncu POST na datasecie.
I tak powinno być.
niby dziala - edytuje komorke w dbgridzie i wciskam buttona ZAPISZ ( w srodku POST) i sie zapisuje.
mam jednak DWA problemy:
- gdzie dac POST aby zmiany zapisywaly sie automatycznie.
Co to znaczy automatycznie?
Tj. kiedy wg Ciebie ma być automatycznie?
Może być np. tak: obsługujemy zdarzenie DataSource.OndataChange w ten sposób:
procedure TfMain.DataSourceDataChange(Sender: TObject; Field: TField);
begin
if Assigned(Field) and (Field.DataSet.State in dsEditModes) then
Field.DataSet.Post;
end;
Powyższy kod zapisze wszelkie zmiany w DataSecie, podpiętym do danego TDataSource
.
Kiedy to zrobi?
Poczytaj w manula kiedy wołane jest w/w zdarzenie, ale będzie to np. przed przejściem do nowego rekordu czy wciśnięciu Enter podczas edycji komórki dbGrida.
- nie moge zrobic POSTA gdyz uzywam aliasow kolumn np.
gdy dbgrid wyswietla mi rekordy z:
SELECT auto_kod FROM auta
to moge edytowac, ale gdy jednak uzyje aliasu kolumny np tak:
SELECT auto_kod "Kod auta" FROM auta
to podczas proby zapisu zwraca mi ze nie ma kolumny 'Kod auta' i nie moze uaktualnic danych. Aliasy stosuje oczywiscie do tego aby naglowki kolumn w dbgridzie wygladalu przyzwoicie. Jak temu zaradzic?
Najlepiej i najprościej - zacznij czytać manuala.
Po drugie - taki kod zadziała poprawnie, ale z wykorzystaniem odpowiednich komponentów - nie napisałeś czego używasz, a to podstawa...
Np. kod z aliasami zadziała dla FireDAC, zadziała i dla innych komponentów jeśli powiążesz danego DataSet'a z odpowiednikiem komponentu TUpdateSQL. Ale pewnie nie wiesz o czym piszę, a więc zostawmy to...
Możesz zrobić tak, jak napisał to grzegorz_so - ale moim zdaniem to nie jest dobry pomysł. Lepiej zejść niżej, a więc do konkretnego pola w DataSecie.
polecam Manual dla klasy TField - zapoznaj się ze wszystkimi właściwościami w/w klasy.
I teraz tak - możesz ustawić niezbędne dane w edytorze pól DataSeta, ale też możesz zrobić to z poziomu kodu (co zdecydowanie bardziej zalecam od klikania w IDE).
Jak? Prościutko, a więc obsługując zdarzenie AfterOpen
DataSeta:
procedure TfMain.DataSetAfterOpen(DataSet: TDataSet);
begin
DataSet.FieldByName('auto_kod').DisplayLabel := 'Kod auta'.
end;
Oczywiście musisz pozbyć się aliasów z SQL'a - one nie będą potrzebne.
Analogicznie możesz ułatwić pozostałe pola dla DataSetu.
Dlaczego tak jest lepiej niż bezpośrednie gmeranie w kolekcji 'DBGrid.Columns'?
Dlatego, że zmiana DisplayLabel
dla pola zadziała dla każdej kontrolki dbAware, która będzie podłączona dla w/w DataSetu.
Dla każdej kontrolki niczego nie musisz ponownie ustawiać.
Dla typów numerycznych, polecam od razu ustawić w odpowiedni sposób właściwości DisplayFormat
i EditFormat
.