Problemy związane z MySQLem w Delphi 2007

0

Właśnie pisze swój pierwszy program bazodanowy w delphi i mam pewne wątpliwości.
Mam nadzieje że pomożecie mi je rozwiać.

A więc:

  1. Jak pobrać (wyciądnoąć) zawartość komurki rekordu i następnie przypisać ją do zmiennej w programie

  2. JAK W ZAPYTANIU SQLowym NAPISAĆ KIEDY CHCE ZROBIĆ PRZYRÓWNANIE np. pisząc warunek, A JAK PRZYPISANIE np. zmiennej z programu DO konkretnej KOMURKI W TABELI BAZY DANYCH W CELU ZMIANY JEJ WARTOŚCI ?? Czy w zapytaniu SQLowym jest tak samo jak w Delphi że znak przyrównania to "=" a znak przypisania to ":=" czy może jest inaczej??

  3. użytkownik wyszukał w bazie danych interesujący go rekord (zna już ID interesującego go rekordu). Następnie chce zmienić wartość komurki ILOŚĆ_PRODUKTÓW (na większą) w tabeli PRODUKTY. Ową wartośc wpisuje do pola edit1, a ID rekordu w którym chce wprowadzić zamiany wpisuje do pola edit2.
    JAK POWNNA WYGLĄDAĆ PROCEDURKA ZNAJDUJĄCA SIĘ POD PRZYCISKIEM Button1 PO WCIŚNIĘCIU KTÓREGO OWA PROCEDURKA MA SIĘ WYKONAĆ ??

  4. Czy W DBGrid da się jakoś ustawić aby nagłowki kolumn tabeli bazy danych były wyświetlane po polsku (nazwy które wprowadziłbym podczas tworzenia programu z klawiatury) zamiast oryginalnych angielskich nazw widniejących w tabeli bazy danych ??

  5. Czy w DBGrid da się ustawić aby tylko niektóre kolumy tabeli bazy danych się wyświetlały zamiast całej Tabeli (pozostałe kolumy miały by być niewidoczne dla urzytkownika programu)??

Na koniec dodam tylko że korzystam z Delphi 2007 oraz komponentów ZEOSlib, a baza danych znajduje się na serwerze WWW.

Z góry dziękuje za pomoc.

0
JA-CEK napisał(a)

Właśnie pisze swój pierwszy program bazodanowy w delphi i mam pewne wątpliwości.
Mam nadzieje że pomożecie mi je rozwiać.

A więc:

  1. Jak pobrać (wyciądnoąć) zawartość komurki rekordu i następnie przypisać ją do zmiennej w programie

Po pierwsze - naucz się języka. Program z błędami ortograficznymi jest nie do przyjęcia.
Po drugie, opisywałem tu kiedyś to, ale masz. To jest dla ADO, Ty musisz zmienić analogicznie dla swojego providera:

function ExecuteQueryWithVal(Query: string; Connection: TADOConnection = nil; MessageOnError: Boolean = true): Variant;
var
  Ado: TADOQuery;
begin
  result:=null;
  if Connection = nil then Connection := Base.MainConnection; //ta linijka ma sens w moich aplikacjach :)
  try
    Ado:=TADOQuery.Create(Application);
    Ado.Connection:=Connection;
    ado.CommandTimeout:=ado.Connection.CommandTimeout;
    ADO.SQL.Text:=Query;
    ADO.Open;
    if ADO.RecordCount>0 then
    begin
      ADO.First;
      result:=ADO.FieldByName('Val').AsVariant;
    end;
  except
    on E: Exception do
    begin
      if MessageOnError then
         application.MessageBox(PChar('Wystąpił błąd: '+#13+#10+e.Message), PChar(Application.Title), mb_OK+mb_IconStop);
    end;
  end;

  if ADO<>nil then FreeAndNil(ADO);
end;

Zapytanie do tego powinno wyglądać tak:

SELECT kolumna as VAL FROM tabela WHERE....blabla

Chodzi oczywiście o alias: "as VAL". Możesz sobie to zmienić.

  1. JAK W ZAPYTANIU SQLowym NAPISAĆ KIEDY CHCE ZROBIĆ PRZYRÓWNANIE np. pisząc warunek, A JAK PRZYPISANIE np. zmiennej z programu DO konkretnej KOMURKI W TABELI BAZY DANYCH W CELU ZMIANY JEJ WARTOŚCI ?? Czy w zapytaniu SQLowym jest tak samo jak w Delphi że znak przyrównania to "=" a znak przypisania to ":=" czy może jest inaczej??

Nie wiem o co Ci chodzi. Operator przyrównania w MySQL jest taki sam, jak przypisania: "="
kom<font size="4">Ó</span>rki

  1. użytkownik wyszukał w bazie danych interesujący go rekord (zna już ID interesującego go rekordu). Następnie chce zmienić wartość komurki ILOŚĆ_PRODUKTÓW (na większą) w tabeli PRODUKTY. Ową wartośc wpisuje do pola edit1, a ID rekordu w którym chce wprowadzić zamiany wpisuje do pola edit2.
    JAK POWNNA WYGLĄDAĆ PROCEDURKA ZNAJDUJĄCA SIĘ POD PRZYCISKIEM Button1 PO WCIŚNIĘCIU KTÓREGO OWA PROCEDURKA MA SIĘ WYKONAĆ ??

U<font size="4">Ż</span>ytkownik

To nie kwestia procedury, tylko zapytania:

UPDATE tabela SET kolumna = nowa_wartosc WHERE ID = id_rekordu

A jak wykonać zapytanie, no to już chyba wiesz.
Ado.ExecSQL - dla ADO.

  1. Czy W DBGrid da się jakoś ustawić aby nagłowki kolumn tabeli bazy danych były wyświetlane po polsku (nazwy które wprowadziłbym podczas tworzenia programu z klawiatury) zamiast oryginalnych angielskich nazw widniejących w tabeli bazy danych ??

A robiłeś cokolwiek w celu uzyskania odpowiedzi na to pytanie, poza marudzeniem?
Wystraczyło dwa razy kliknąć na DBGrid, wybrać kolumnę z listy i zobaczyć ObjectInspectora :|

  1. Czy w DBGrid da się ustawić aby tylko niektóre kolumy tabeli bazy danych się wyświetlały zamiast całej Tabeli (pozostałe kolumy miały by być niewidoczne dla urzytkownika programu)??

jw.

Po któreś tam: Kup sobie jakąś książkę i przeczytaj. Albo chociaż znajdź jakiś kurs w necie, bo Twoje pytania nie kwalifikują się w ogóle do tego działu(Delphi). </span></span>

0

ad.1

Pobranie danych z bazy i przypisanie jej do zmiennej rozwiązałem tak:

var
ilosc, id:integer;
id_s:string;
  begin

      try

         //polaczenie z baza
         DM.ZConnection1.Connect;
         DM.ZQuery1.Close;
         DM.ZQuery1.SQL.Clear;


id:=StrToInt(form3.Edit7.Text);
id_s:=form3.Edit7.Text;
DM.ZQuery1.SQL.Add('select product_in_stock from jos_vm_product where product_id="'+id_s+'"');
ilosc:=DM.ZQuery1.ParamByName('product_in_stock').AsInteger;
form3.Label11.Caption:=IntToStr(ilosc);
 
          //otwarcie bazy
         DM.ZQuery1.Open;

      except
             //jesli wystapil blad bazy danych
         ShowMessage('Blad !');

      end;
  end;

program się kompiluje bez problemu, ale kiedy podczas pracy programu użytkownik naciska przycisk pod którym jest owa procedurka. Wyskakuje błąd i po wciśnięciu OK program kończy prace.
Gdzie zrobiłem błąd ??

0

U<font size="6">Ż</span>ytkownik [!!!] [!!!] [!!!]

A co do pytania, gdzie Ty wywołujesz OPEN? [glowa]
Tak ciężko spojrzeć na kod, który Ci dałem?

0

JA-CKU tutaj masz błąd i tutaj też leży odpowiedź na postawione przez Ciebie pytanie w punkcie drugim:

ilosc:=DM.ZQuery1.ParamByName('product_in_stock').AsInteger;  

Próbujesz pobrać wartość paramatru a nie wartość kolumny z aktualnego rekordu.

Dodatkowo, chcesz pobrać tą wartość przed otwarciem Datasetu (metoda Open). Najpierw musisz otworzyć zbiór danych ażeby pobrać z niego wartość, brzmi logicznie?;)

Przypisanie i pobieranie danych do/z kolumny recordu realizujemy na dwa sposoby (poczytaj o TField) :

powinno być tak:

ilosc:=DM.ZQuery1['product_in_stock'];  

lub

ilosc:=DM.ZQuery1.FieldByName('product_in_stock').AsInteger;  

Natomiast Twoje query należałoby przerobić własnie na parametr produckt_id, ażebyś za każdym razem nie ładował query i nie robił replace w stringu.

pozdrawiam

0

Zastosowałem się do waszych uwag i sugestii i poprawiłem swoją procedurkę. Teraz ona wygląda tak:

procedure TForm3.Button6Click(Sender: TObject);

var
ilosc, id:integer;
sql, nazwa, id_s:string;
begin
id:=StrToInt(form3.Edit7.Text);
id_s:=form3.Edit7.Text;
      try

         //polaczenie z baza
         DM.ZConnection1.Connect;
         DM.ZQuery1.Close;
         DM.ZQuery1.SQL.Clear;
sql:= 'select product_in_stock from jos_vm_product where product_id='+id_s;
ilosc:=DM.ZQuery1.FieldByName('product_in_stock').AsInteger;
          //otwarcie bazy
         DM.ZQuery1.Open;
         DM.ZQuery1.SQL.Add(sql);

      except
             //jesli wystapil blad bazy danych
         ShowMessage('Blad !');

      end;
form3.Label11.Caption:=IntToStr(ilosc);
end;

Niestety nadal wywala błąd. Dokładnie tak jak wcześniej. Kompilacja jest prawidłowa, natomiast błąd i zakończenie pracy programu następuje po wciśnięciu przycisku pod którym napisana jest procedurka widoczna powyrzej.

0

JA-CEK a czy Ty wiesz co robi ZQuery1.Open?
Otóż wykonuje ono polecenie SQL znajdujące się w ZQuery1.SQL.

A co Ty robisz?

Najpierw wywołujesz ZQuery1.Open a dopiero później dodajesz utworzone zapytanie.
To pierwsza uwaga.

Druga uwaga jest taka, ze powinienes podawac tresc bledu zwracanego przez obiekt (i samemu ta tresc sprawdzic. Wtedy, moze nie musialbys marnowac czasu na pisanie posta bo sam rozwiazalbys problem.)

I pozwole sobie jeszcze na jedna uwage: unikaj bezsensownych komentarzy.
Przed ZQuery1.Open piszesz komentarz "otwarcie bazy". Ktory w dodatku jest nieprawdziwy, bo jak juz to jest to otwarcie Dataseta. Po except piszesz "jesli wystapil blad bazy", czyli co - opisujesz rzeczy oczywiste? Choc i tu ten komentarz jest nieprawdziwy...

Reasumujac:

  1. Komentuj to, co komus (lub Tobie po pewnym czasie) moze wydac sie niejasne. Nie komentuj oczywistosci.
  2. Najpierw powinienes dodac tresc zapytania a nastepnie wywolac jego wykonanie.

pozdrawiam.

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