Edycja bazy MySQL w Delphi [zeoslib]

0

Witam!
Przygotowuję program zarządzający bazą danych MySQL, korzystający z komponentów Zeos. Ponieważ to mój pierwszy projekt tego typu mam kilka problemów z którymi nie mogę sobie poradzić:

  1. Wyświetlam zawartość bazy w DBGridzie. Znalazłem już na tym forum, że edycja rekordów bazy przez grid'a jest raczej karkołomna. Jakie rozwiązanie najlepiej zastosować, żeby możliwa była edycja wybranego rekordu przez komponent który go wyświetla? (klikam w jakieś pole już istniejącego rekordu, wprowadzam modyfikacje i pole jest update'owane w bazie, po wyświetleniu message box'a z pytaniem czy chcę zapisać zmiany).

  2. (pytanie, o ile mam nadal używać Grida) Czytałem na forum, że po odświeżeniu bazy z użyciem poleceń ZQuery.Close, ZQuery.Open, aby uniknąć automatycznego przejścia do pierwszego rekordu, trzeba zapamiętać indeks rekordu "używanego" ostatnio i po komendzie open przywrócić ten indeks. Niestety nie zostało podane jak to zrobić, a sam nie potrafię tego opanować.

  3. Jaka jest różnica między poleceniami ZQuery1.Open a ZQuery.Active := true?

  4. Czy jest jakaś szansa, żeby w Delphi7 wpisywać i wyświetlać polskie znaki przy edycji bazy i te znaki wciąż pozostawały polskimi po zapisaniu w bazie? Ustawienie kodowania zajęło mi troszkę czasu i teraz mogę wpisywać w programie polskie znaki, wszystko wyświetla się jak trzeba, jednak kiedy oglądam bazę przez PhpMyAdmin widzę same "krzaczki".

Proszę o pomoc!
Pozdrawiam
m.

0
  1. poczytaj o bookmark
  2. żadna
  3. w phpmyadminie ustaw sobie kodowanie wyświetlania zgodne z kodowaniem bazy
0
  1. Podpinasz DBGrid pod DataSet i następnie w zdarzeniach tego drugiego odpowiednio ustalasz co chcesz.
0
MacGyver76 napisał(a)
  1. Podpinasz DBGrid pod DataSet i następnie w zdarzeniach tego drugiego odpowiednio ustalasz co chcesz.

Rozumiem, że dane powinny się aktualizować w bazie z wykorzystaniem zdarzenia 'OnUpdateData'. Zauważyłem jednak już wcześniej, że bez obsługi tego zdarzenia, edytując dane w gridzie, raz zmieniały się one w bazie a raz nie (nie mam pojęcia czemu tak jest- może ktoś mógłby wytłumaczyć?) Wobec tego jak zabezpieczyć bazę przed przypadkową edycją?

edit: Co do bookmark'ów - wiem już jak ustawić wskaźnik na dany wiersz, ale nie mam pojęcia czy i jak można wyłuskać z tego wiersza dane. Gdyby to mi się udało, to byłoby po problemie. Czy ktoś wie jak można to zrobić?

0
meliton napisał(a)

edit: Co do bookmark'ów - wiem już jak ustawić wskaźnik na dany wiersz, ale nie mam pojęcia czy i jak można wyłuskać z tego wiersza dane. Gdyby to mi się udało, to byłoby po problemie. Czy ktoś wie jak można to zrobić?

To powinno pomóc:

DBGrid1.DataSource.DataSet.GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i])); 
s := DBGrid1.DataSource.DataSet.FieldByName('nazwa').AsString;

Pracuję aktualnie nad podobnym projektem w Delphi&Mysql i mam spory problem z kodowaniem znaków. Czy rozwiązałeś już swój problem? Jeśli tak to czy mógłbyś zamieścić tutaj rozwiązanie?

Jeśli w Delphi wpiszę polskie znaki to w bazie danych są wyświetlane jako 'krzaki' co uniemożliwia sortowanie przez bazę danych. Jeśli w bazie danych wpiszę polskie znaki to w Delphi są interpretowane jako znaki zapytania. Próbowałem różnych kodowań w Mysqlu (utf-8 general/polish, latin2 general, jakiśtam iso), zmieniałem CHARSET we właściwościach FONT w Delphi. Nic nie pomogło.
Próbowałem też napisać funkcję w delphi konwertującą polskie znaki z mysqla, jednak delphi wszystkie te znaki odczytuje jako '?' o tym samym kodzie.

0

Sprawdzę to rozwiązanie. Póki co próbowałem StringGrida zamiast DBGrida i udaje mi się wczytywanie, modyfikacja i nawet "sortowanie" rekordów. Niestety problem kodowania wciąż nierozwiązany :( dlatego sortowanie nie działa tak jak powinno. Nie mam pojęcia jak to rozwiązać. Ponawiam prośbę o pomoc!

0

może zamiast jęczeć dałbyś coś, co da jakiekolwiek pojęcie o twojej bazie. Daj DDLa jakiejś tabeli np.

0

Co do kodowania to ustaw na komponencie TZConnection w Properties: codepage=WIN1250 . Zeos dalej sam zajmie się konwersją znaków z kodowania klienta na kodowanie bazy.

0

Próbuję tak:

ZConnection1.Database := 'klienci';
ZConnection1.Connect;
ZQuery1.SQL.Clear;
zQuery1.SQL.Add('SET NAMES `utf8` COLLATE `utf8_polish_ci`');
ZQuery1.ExecSQL;
ZQuery1.SQL.clear;
ZQuery1.SQL.Add('select * from osoby' );
ZQuery1.Active := true;

I przy pobieraniu
StringGrid1.Cells[1,i] := ZQuery1.FieldByName('imię').AsString;
wyskakuje error:
'ZQuery1:Field 'imię' not found.'
W bazie, w tabeli, mam wszędzie ustawioną metodę porównywania na utf8_polish_ci. Nazwa pola to 'imię' - w bazie mam polski znak a nie żaden krzaczek.

2
procedure TDM.DataBaseAfterConnect(Sender: TObject);
begin
  with qX do   //qX = ZQuery
    begin
      Close;
      SQL.Clear;
      SQL.Text := 'set names cp1250';
      Prepare;
      ExecSQL;
      Close;
    end;
end;
0

Działa! Bardzo dziękuję za pomoc i serdecznie pozdrawiam! :)

0

NIE NADAJE SIĘ KOLUMNOM/TABELOM/CZEMUKOLWIEK NAZW ZE ZNAKAMI NARODOWYMI!!!!!

0

Dlaczego? To na przykład w DBGridzie powinienem nadawać ręcznie nazwy wszystkim kolumnom żeby mieć tam polskie znaki? Nie znam się na tym za bardzo, więc będę mądrzejszy na przyszłość, dzięki! :)

0

Również dziękuję za pomoc z polskimi znakami. :) Zadziałał sposób pytka. Akurat dzisiaj trochę wcześniej znalazłem ten sposób gdzieś na forum, ale musiałem coś pokręcić bo wydawało mi się, że dalej nie działa.

Odnośnie DBGrida to wygląda na to, że trzeba będzie ręcznie dopisać funkcję nadającą polskie nazwy kolumnom. Tak samo będę musiał coś takiego wymyślić, żeby zmieniało szerokość kolumn, ponieważ wczytuje mi domyślnie maksymalny rozmiar ustawiony w bazie.

Na pierwszej stronie topicu pojawiło się jeszcze pytanie bez odpowiedzi dlaczego edycja pola w DBGridzie czasem ma odwzorowanie w bazie, a czasem nie. Również mam taką sytuację, że raz działa a raz nie. Czy ktoś wie dlaczego tak jest? Wolałbym uniknąć tworzenia kolejnych funkcji...

Edit: Pojawiła się jeszcze jedna wątpliwość. Nie wiem teraz czy rozumiem jak działa Zquery.Close (czy też ZQuery.Active := false). Czy przed każdym wywołaniem ZQuery.ExecSQL powinienem dać ZQuery.Close, a potem dać na nowo ZQuery.Clear, ZQuery.SQL.Add('SELECT * FROM cos) i ZQuery.Open?
Poza tym chyba najlepiej by było mieć w większości czasu kolejkę zamkniętą co jest średnio możliwe w przypadku DBGrida, a przeciwnie w przypadku StringGrida.

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