DBGrid - aktualizacja zawartości bazy poprzez siatkę

0

Witam mam pytanie dotyczące DBGrida

Mam wykonane połączenie następująco

SQLDataSet -> DataSetProvider -> ClientDataSet -> DataSource -> DBGrid

Chciałbym aby po zmianie danych na siatce w DBGridzie również zmieniała się zawartość bazy MySQL-owej

Pomimo oprogramowania zdarzenia AfterPost komponentu ClientDataSet zmiany nie są zapisywane w bazie

Zdarzenie AfterPost oprogramowuje następująco

ClientDataSet1.ApllyUpades(-1);

Pomimo poszukiwań na forum nie znalazłem odpowiedzi na to pytanie ani w artykułach ani w poruszonych tematach.

0

Czy Ty rozumiesz to : 'DBGrid nie przechowuje danych, tylko je wyświetla' ?
Bo z tego co piszesz to wynika, że nie.

Pomimo oprogramowania zdarzenia AfterPost komponentu ClientDataSet zmiany nie są zapisywane w bazie

I nie będą :/

Po zmianie czegoś w DBGridzie, należy także uaktualnić bazę :

     with Twoja_Baza, SQL do begin
       Close;
       Clear;
       Add('UPDATE nazwa_tabeli SET nazwa_pola1=:wartosc_pola1, nazwa_pola2=:wartosc_pola2, nazwa_pola3:wartosc_pola3');
       ParamByName('wartosc_pola1').AsString   := 'bla bla';
       ParamByName('wartosc_pola2').AsString   := 'la la la';
       ParamByName('wartosc_pola3').AsInteger  := 1024;
       ExecSQL;
       // zatwierdzenie transakcji   -  Transaction.Commit;
     end;

Tylko zanim wkleisz ten kod na pałę do edytora, to lepiej trochę poczytaj o programowaniu baz.

0

Jeśli chodzi o dodawanie rekordów do tabeli to wykonuje poprzez skrypt mysql-owy.

Ale mimo to dziękuję.

Umiem sobie dodawać nowe rekordy z danymi ale interesuje mnie jak to wykombinować aby zmienianie się wyświetlanych danych wpływało na zawartość bazy.

Dokładnie chodzi mi oto aby :

  1. Dodawać puste rekordy przyciskiem -> to umiem zrealizować
  2. Klikając na komórki w DBGridzie i uzupełniając je chcę zmieniać zawartość bazy

Z kodu powyżej wynika (jeśli się nie mylę) że wystarczy pobrać potrzebne dane po edycji danej i wykonać procedurę której przykład podał kolega ?

0

Mam kilka niewiadomych ponieważ utrudnia mi to że program nie będzie stosowny do konkretnej tabeli.

Nazwę konkretnej tabeli na której prowadzę operacje mam wyświetlaną w comboboxsie na 1 formie. Na drugiej mam wyświetlane również w comboboxsie nazwy kolumn z mojej tabeli

W tej chwili nie wiem :

1.Jak pobierać wartości z comboboxa i wstawiać je w odpowiednie miejsca do zapytania bo niestety nie mam konkretnie jednej tabeli.

2.Jak zmusić program do pobierania danych z DBGrida aby również znalazły się w odpowiednim miejscu w poleceniu SQL-owym ?

3.W jakim zdarzeniu DBGrida umieścić treść kodu by wykonywał się po edycji i naciśnięciu klawisza enter w danej komórce ?

4.Ewentualnie w jaki sposób można by to zrealizować jeśli nie bezpośrednio na DBGridzie ?

0

Witam

Wszystkie problemy rozwiązałem tylko nurtuje mnie pytanie czy klikając na daną komórkę i wywołując procedurę, procedura odniesie się do danej komórki w bazie czy to będzie jednak zależało od zapytania SQL-owego ?

Zdarzenie które wykorzystuje to OnCellClick

0

Witam

Wszystkie problemy rozwiązałem tylko nurtuje mnie pytanie czy klikając na daną komórkę i wywołując procedurę, procedura odniesie się do danej komórki w bazie czy to będzie jednak zależało od zapytania SQL-owego ?

Zdarzenie które wykorzystuje to OnCellClick

0
blue_17 napisał(a)

...do danej komórki w bazie...

W bazach są tablice, pola, rekordy itp, nie ma komórek.

blue_17 napisał(a)

czy to będzie jednak zależało od zapytania SQL-owego ?

Tak.

0

A ewentualnie jakie zdarzenie było by najlepsze do wykonywania takich operacji

Czy zdarzenie komponentu DataSource, OnDataChange czy może zdarzenie DBgrida, OnCellClick, a może jeszcze inne zdarzenie ?

Od razu mówię, że już wiem że DBGrid nie przechowuje danych.

0

Najlepiej to zrobić osobną formę do dodawania/edycji rekordów.
Nigdy nie bawiłem się w edycję przez siatke więc specjalnie nie pomogę ale pamiętaj aby podczas edycji zablokować możliwość przejścia do innego rekordu, jest pewnie więcej pułapek przy tym podejściu.
Zainteresuj się kontrolką DBNavigator, ma chyba obsługę dodawania i edycji rekordów.

0

Może to i faktycznie lepsze rozwiązanie lecz za bardzo nie wiem jak to wykonać bo na pewno w grę wchodziło by dynamiczne tworzenie editów lub innych komponentów do wprowadzania danych i dynamiczne tworzenie i dopasowywanie formy.

Wracając do mojego pomysłu z tego co wyczytałem przy moim połączeniu

SQLDataSet -> DataSetProvider -> ClientDataSet -> DataSource -> DBGrid

Po edycji w siatce danych i wykonaniu procedury uaktualniającej bazę dane powinny się zmienić, a u mnie nie da rady :-/

Chociaż przeczytałem wszystkie tematy dotyczące DBGrida na forum znalazłem tylko szczątkowe informacje ale odpowiedzi na moje pytanie nie znalazłem

0
blue_17 napisał(a)

Po edycji w siatce danych i wykonaniu procedury uaktualniającej bazę dane powinny się zmienić, a u mnie nie da rady :-/

Może najpierw pokaż tą procedurę, nikt nie jest jasnowidzem.

0

Takiego kodu użyłem aby uaktualniać zawartość tablicy po zmianie zawartości jednego pola w DBGridzie

if SQLDataSet1.State in [dsEdit, dsInsert]  then
  SQLDataSet1.Post;

Czy te wszystkie komplikacje mogę być spowodowane np ograniczeniami mojego konta w bazie danych ?

0
blue_17 napisał(a)

Takiego kodu użyłem aby uaktualniać zawartość tablicy po zmianie zawartości jednego pola w DBGridzie

if SQLDataSet1.State in [dsEdit, dsInsert]  then
  SQLDataSet1.Post;

Ty dalej nie rozumiesz, że DBGrid nie przechowuje danych !!!
Co to jest [glowa] [???]
I w jaki sposób baza ma wiedzieć, które pole chcesz uaktualnić i z której komórki DBGrida pobrać nową wartość, a zapytanie SQL, tu nie ma praktycznie nic co miało by uaktualnić bazę [glowa]

Czy te wszystkie komplikacje mogę być spowodowane np ograniczeniami mojego konta w bazie danych ?

To nie ograniczenia w bazie, Ty po prostu nie masz zielonego pojęcia, co chcesz zrobić i jak to zrobić :-[
Może lepiej zajmij się hodowlą jedwabników.

0

Jeśli miał bym jedną konkretną tabelę dał bym sobie rade za pomocą np editów i to bez problemów ale nie mam określonej jednej konkretnej tabeli w tym cały mój problem. :-|

A czy kolega był by mi łaskaw wytłumaczyć w jaki sposób delphi 7 dało rady wykonać tą operację poprzez oprogramowanie zdarzenia AfterPost w sposób jaki pokazałem w pierwszym poście ?

O dziwo zawartość w bazie się zmienia :-|

To mnie zastanawia i to chciałbym wiedzieć od początku.

0
blue_17 napisał(a)

O dziwo zawartość w bazie się zmienia :-|

Należy po uaktualnieniu bazy odświeżyć DBGrida, czyli np. rozłączyć się z bazą i połączyć na nowo.

0

A czy dotyczy to wszystkich połączeń czy tylko połączenia poprzez które dokonuję zmiany ?

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