Edycja bazy MySQL w Delphi [zeoslib]

Edycja bazy MySQL w Delphi [zeoslib]
ME
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:6
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.

edytowany 1x, ostatnio: meliton
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0
  1. poczytaj o bookmark
  2. żadna
  3. w phpmyadminie ustaw sobie kodowanie wyświetlania zgodne z kodowaniem bazy

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
MG
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 7 lat
  • Postów:29
0
  1. Podpinasz DBGrid pod DataSet i następnie w zdarzeniach tego drugiego odpowiednio ustalasz co chcesz.

"Jeżeli miałbyś 1.000.000.000 komputerów, które próbkowałyby 1.000.000.000 klawiszy na sekundę, to znalezienie klucza kodowania trwałoby dłużej niż istnieje wszechświat"
Patryk27
Twój nick nie pasuje do stopki...
ME
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:6
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ć?

edytowany 1x, ostatnio: meliton
AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:4
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:

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

edytowany 2x, ostatnio: alatar
ME
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:6
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!

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
AsYlum
  • Rejestracja:prawie 19 lat
  • Ostatnio:około miesiąc
  • Postów:29
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.


<uninitialized object="object">
ME
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:6
0

Próbuję tak:

Kopiuj
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
Kopiuj
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;
ME
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:6
0

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

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
ME
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:6
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! :)

AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:4
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.

edytowany 1x, ostatnio: alatar

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.