dbGrid i edycja danych

0

Witam,
posiadam dbgrida + datasource + dataset.

doszedlem do tego ze gdy chce cos edytowac w bazie z poziomu dbgrida to musze wykonac na koncu POST na datasecie.

niby dziala - edytuje komorke w dbgridzie i wciskam buttona ZAPISZ ( w srodku POST) i sie zapisuje.

mam jednak DWA problemy:

  1. gdzie dac POST aby zmiany zapisywaly sie automatycznie.
  2. 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?

pozdro

dodanie znaczników <code class="sql"> - furious programming

0

ad .2
aliasy ???
tytuły kolumn można dowolnie definiować w samym DBGridzie

1
dudi1223 napisał(a):

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:

  1. 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.

  1. 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.

0

No i fajnie, dzieki za odpowiedzi, sa to dla mnie nowe rzeczy.

Ogolnie mam mala aplikacje bazodanowa i owszem uzywam dbgridow i zestawu firedac (xe5).
jednak nie edytuje danych w dbgridzie na ogol.
Jednakze tak sie zlozylo ze w jednym miejscu musze zastosowac edycje bezposrednia, czyli zmieniam zawartosc komorki, wciskam enter lub klikam nizej/wyzej i juz sie wszystko zapisuje udpateuje.

Nie wiedzialem gdzie dac POST, wiec na razie testuje pod przyciskiem.

Druga sprawa - aliasy.
Wszedzie uzywam ich z poziomu SQL, dzieki czemu nie musze sie bawic w ustawianie reczne nazw kolumn.
jak widac dla mojego opisywanego problemu to sie nie sprawdzilo, wiec bede musial ustawic to recznie.
Chyba ze uzyje TUpdateSQl - mam to wsrod Firedaca, ale nie potrafie tego uzyc.
moze jakis przyklad? Moze sie naucze czegos nowego?

a co do manuala to rozumiem chodzi o tego spod klawisza f1?

-- pozdro i dzieki i lcize ze moze jeszcze sie czegos dowiem :)

0
dudi123 napisał(a):

No i fajnie, dzieki za odpowiedzi, sa to dla mnie nowe rzeczy.

Ogolnie mam mala aplikacje bazodanowa i owszem uzywam dbgridow i zestawu firedac (xe5).
jednak nie edytuje danych w dbgridzie na ogol.
Jednakze tak sie zlozylo ze w jednym miejscu musze zastosowac edycje bezposrednia, czyli zmieniam zawartosc komorki, wciskam enter lub klikam nizej/wyzej i juz sie wszystko zapisuje udpateuje.

Nie wiedzialem gdzie dac POST, wiec na razie testuje pod przyciskiem.

Skoro tak, to po co ja to pisałem?

Druga sprawa - aliasy.
Wszedzie uzywam ich z poziomu SQL, dzieki czemu nie musze sie bawic w ustawianie reczne nazw kolumn.
jak widac dla mojego opisywanego problemu to sie nie sprawdzilo, wiec bede musial ustawic to recznie.

Tyle, że nie do tego aliasy służą... Rozumiem, że jak wpiszesz ręcznie w SQL alias pola to nie jest to ręcznie, ale jak z poziomu kodu - wtedy jest?
Moim zdaniem, to tak jakbyś używał piły do wbijania gwoździ - można, ale...

Konfigurację pól zrób w aplikacji a nie w kodzie SQL (oczywiście samą konfigurację możesz trzymać w bazie danych), zresztą tam i tak nie zrobisz wszystkiego.
Poza tym, w FireDAC można zrobić wszystko - porpawie obsłużyhć aliasy również. Ale nie powiem Ci jak bo takie uzywanie aliasów to pomysł absolutnie z czapy.
Zacznij używać Field.DisplayLabel, bo właśnie do tego to służy.

Chyba ze uzyje TUpdateSQl - mam to wsrod Firedaca, ale nie potrafie tego uzyc.
moze jakis przyklad?
Moze sie naucze czegos nowego?
a co do manuala to rozumiem chodzi o tego spod klawisza f1?

Z takim podejściem, to słabo to widzę... Nie jestem korepetytorem za friko, jasne?
Chcesz przykład - zacznij do cholery czytać dokumentację!
http://docs.embarcadero.com/products/rad_studio/firedac/uADCompClient_TADUpdateSQL.html
Poza tym przykłady masz w samym FireDAC, więc łaskawie się z nimi zapoznaj.

-- pozdro i dzieki i lcize ze moze jeszcze sie czegos dowiem :)

Masakra... może tak z łaski swojej zacznij sprawdzać swój tekst pod kątem ortografii? Literówki, błędy, brak polskich znaków... mam nadzieję, że nie jesteś dotknięty dys-lenistwo-debilizmem?

0

OK nie unoś się tak :).
Przecież podziękowałem za pomoc, POST wsadziłem w odpowiednie zdarzenie jak zaproponowałeś oraz użyłem DisplayLabel zamiast aliasów ( w tym jednym konkretnym zadaniu ).

Nawet ten post napisałem ładnie ze znakami polskimi, zobacz :), pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1