DB + SQL + Navigator: Werte herausholen - WIE?
-
hallihallo!
in meinem programm gibts ein DBGrid das meine tabelle anzeigt und ein DBNavigator.ich möchte per sql (query) eine datenauswertung vorhnehmen und zwar folgendermaßen:
wenn ich beim DBNavigator auf "nächster eintrag" oder "voriger eintrag" bzw. "erster/letzter eingtrag" klicke,
soll in einer variable (var1) der wert, an dem der Navigator gerade steht (also zeile), geschriebn werden (also z.b. der spalte1).1.problem: welches ereigniss betrifft "nächster eintrag", "voriger eintrag" bzw. "erster/letzter eingtrag" des DBNavigators.
2.problem: welchen sql-code brauch ich dafür.wenn ich euch das hier ein bisschen konfus geschildert habe, so schreibt einfach, damit ich weitere erläuterungen geben kann.
danke, frohes programmieren.
bernd
-
Wenn du es so beschreiben könntest, dass mans versteht, könntest du es wahrscheinlich auch selber lösen.
-
also nochmal als bsp:
- datenbank mit einer spalte und mehreren werten (zeilen)
- per DBGrid und DBNavigator und Query (SQL) soll folgendes passieren:
irgendwo in der Tabelle (dbgrid) ist die aktuelle position (durch pfeil symbolisiert). mit dem dbnavigator kann ich eine zeile weiter nach oben oder unten wechseln (links-rechts-pfeile beim dbnavigator). und der wert, der an der momentanen position (pfeil) steht, soll ausgelesen werden und irgenwohin (var. od. dgl.) geschrieben werden. es soll einfach der inhalt der zelle einer spalte beim aktuellen ort (position, pfeil, in der tabelle) ausgelsesen werden.1. problem: welche routine/funktion wird verwendet wenn beim dbnavigator auf "voriger/nächster datensatz" geklickt wird?
2. problem: wie lautet der sql code zum auslesen eines wertes in der spalte an der aktuellen position (zeile)?
danke
bernd
-
zu 1: BCB-Hilfe unter TDBNavigator -> Ereignisse -> OnClick, einschließlich Beispiel
zu 2: Query->Fields->Fields[Spalte]->As... auch hier siehe BCB-Hilfe und BCB-Forum/FAQ
-
Oder Du interessierst Dich gar nicht für die Objekte DBGrid / Navigator
und benutzt gleich die Query.Das DataSet dieser hält eh die Datensätze, nicht DBGrid und auch Navigator nicht.
Die Query-Ereignisse Before/AfterScroll reagieren auf die Ändererung des aktuellen DS.
-
@caspar...: doch dbgrid benötige ich um die tabelle anzuzeigen, dbnavigator dient dazu die zeilen auf und ab zu springen.
Die Query-Ereignisse Before/AfterScroll reagieren auf die Ändererung des aktuellen DS.
was heisst DS?
@Linnea: hab mal sowas probiert:
Edit1->Text = Query1->Fields->Fields[1]->AsString;
bringt mir sowas wie "list index out of bounds"...
übrigens: in die bcb-hilfe hab ich schon nachgekuckt, bin nicht schlauer geworden, deshalb hier der neue beitrag...
thx
-
ok ... DS --->>> Datensatz
-
@Linnea: jetzt geht es (fast), ein sql-statement hat gefehlt: "SELECT Tabelle1.* FROM Tabelle1". und mit
Edit1->Text = Query1->Fields->Fields[1]->AsString;
bekomme ich immer nur den ersten wert (erste zeile) aus der jeweiligen spalte (hier: 1). ich möchte aber durch die zeilen des dbgrids auf und ab schalten, dabei sollte es mir immer den zellenwert einer spalte der jeweiligen zeile, heraulesen. ??
thx
-
schau dir mal die Hilfe zu "SelectedRows, Count, Items, DataSource, FieldCount, Fields, GotoBookmark, DataSet (Beispiel)" an
noch einen Tip dazu: statt aufs Query mußt du auf das mit dem DBGrid verknüpfte DataSource zugreifen
-
könnt ihr bitte mal konkrete ergebnisse schreiben,....ich blick da nicht ganz durch...
-
in dem Beispiel steht doch alles drin, es sollt ja nicht so schwer sein Beispielquellcode auf das eigene Programm anzupassen oder den Beispielcode mal auszuprobieren..
TDataSet *pDS = DBGrid1->DataSource->DataSet; ... s = s + pDS->Fields->Fields[j]->AsString
-
Ich habe auch nicht gesagt, Du sollst DBGrid & Navigator weglassen.
Ich wollte nur ausdrücken, daß die Events, die Du nutzen kannst direkt in der Komponente "hängen", die das DataSet hat, und daß ist DBQuery.
Das schließt Lineas Aussagen nicht aus. Es gibt oft mehrere Varianten, z.B. diese:
void __fastcall TForm1::ADOQuery1AfterScroll(TDataSet *DataSet) { int i = ADOQuery1->FieldByName("TESTSPALTE")->AsFloat; }