zu einem bestimmten Datensatz gehen
-
Hallo!
Ich möchte eine Marke an einen bestimmten Datensatz einer Tabelle setzen. Gibt es da (BCB 3 Prof.) so was wie "Marke an einem bestimmten Datensatz setzen" oder "gehe zu Datensatz Nr. xxxxx"?
Ich könnte es in einer Schleife mit
Table->Next();
machen bis zu einem bestimmten Datensatz.
Kann man das nicht anders machen?In der Hilfe habe ich "GetBookmark" gefunden, mit der man eine Marke findet, was mir aber nicht hilft.
Danke im Voraus
BCBuilder Anfänger
-
also ich benutze meistens Locate
mfg
VergissEs
-
BCBuilder Anfänger schrieb:
Hallo!
Ich möchte eine Marke an einen bestimmten Datensatz einer Tabelle setzen. Gibt es da (BCB 3 Prof.) so was wie "Marke an einem bestimmten Datensatz setzen" oder "gehe zu Datensatz Nr. xxxxx"?
Marken setzen kannst Du mit TBookmark (habe ich aber noch nie wirklich gebraucht).
-
du kannst auch über
Table1->RecNo
zu einem bestimmten datensatz springen.
mußt aber aufpassen, wenn du deine tabelle sortierst oder irgendeinen index änderst, dann stimmt evtl. der datensatz den du dir bei RecNo gemerkt hast nicht mehr mit dem nach der sortierung überein.
-
Allen vielen herzlichen Dank für die Hilfe.
Ich habe zu den Tips in der Hilfe nachgeschlagen. Was ich zur Lösung meines Problems brauche, ist die Eigenschaft RecNo, was ich in meinem Programm auch realisiert habe, jedoch ohne Erfolg. Der Cursor springt einfach nicht zu dem eingegebenen Datensatz.
ICh habe eine Tabelle, die ich nicht ganz bearbeiten möchte, sondern nur (als Beispiel mal) die letzten 5 Datensätze. Ich habe es folgendermaßen gemacht:
int iRecAnz = Tabelle->RecordCount; Tabelle->First(); /*iDatensatz ist die Nummer des Datensatzes, ab dem die Bearbeitung erfolgen soll. von außen steuerbar.*/ if (iDatensatz <= 0) iDatensatz = 1; if (iDatensatz <= iRecAnz) { Tabelle->RecNo = iDatensatz; //<----- Hier möchte ich anfangen!! for (int j = 0; j < iRecAnz - iDatensatz+1 ; j++) { //Hier werden die Datensätze bearbeitet }//for (int j = 0; j < iRecAnz - iDatensatz+1 ; j++) }//if (iDatensatz <= iRecAnz)
Funktioniert leider nicht so richtig. Zwar wird die richtige Anzahl von Datensätzen bearbeitet, aber nicht die richtigen Datensätze.
Wenn ich statt
Tabelle->RecNo = iDatensatz;
for (int k=0; k<iDatensatz; k++) Tabelle->Next();
schreibe, dann funktioniert es:
Hat jemand eine Idee?
Vielen Dank
BCBuilder Anfänger
-
BCBuilder Anfänger schrieb:
Funktioniert leider nicht so richtig. Zwar wird die richtige Anzahl von Datensätzen bearbeitet, aber nicht die richtigen Datensätze.
Hi,
mir ist so, als hätte die RecNo-Property nichts mit der jeweils aktuellen Reihenfolge der Datensätze in der Tabelle zu tun. Setzt Du z.B. einen anderen Index, bleiben die RecNo's zwar ihren Datensätzen zugeordnet, die Reihenfolge der Datensätze kann sich aber total ändern - eben je nach Index. Das bedeutet,table->RecNo = table->RecNo + 1;
bringt Dich i.allg. nicht zu dem selben Datensatz, den Du mit table->Next() erreichst. (Leider hast Du in Deiner for-next-Schleife die alles entscheidende Zeile auskommentiert, die zeigen könnte, wie Du durch die Tabelle iterierst.)
Man sollte besser die Werte des Primärschlüssel-Feldes verwenden.
-
Danke sehr für die Antwort.
dschensky schrieb:
Das bedeutet,
table->RecNo = table->RecNo + 1;
bringt Dich i.allg. nicht zu dem selben Datensatz, den Du mit table->Next() erreichst.
Dachte ich mir auch, nachdem es nicht funktioniert hat, wie ich es mir vorstelle.
dschensky schrieb:
(Leider hast Du in Deiner for-next-Schleife die alles entscheidende Zeile auskommentiert, die zeigen könnte, wie Du durch die Tabelle iterierst.)
Die for-Schleife enthält eigentlich nichts, was mit dem Problem zu tun haben könnte. deshalb habe ich sie weggelassen. Hier ein Auszug:
for (int j = 0; j < iRecAnz - iDatensatz+1 ; j++) { //Felder lesen!! sText = Tabelle->FieldByName("name")->AsString.Trim() + ";"; sText += Tabelle->FieldByName("vorname")->AsString.Trim() + ";"; //usw. //Felder werden in einer Textdatei zeilenweise geschrieben //nächster Datensatz Tabelle->Next(); }//for (int j = 0; j < iRecAnz - iDatensatz+1 ; j++)
Wie gesagt, wenn ich vor der for-Schleife zum vorgegebenen Datensatz mit dem nachstehendem Code springe, dann funktioniert es:
for (int k=0; k<iDatensatz; k++) Tabelle->Next();
Das heißt, es liegt wirklich an RecNo:
Tabelle->RecNo = iDatensatz;
Geht es überhaupt, zwischen zwei vorgegebenen Datensätzen liegende Datensätze zu bearbeiten? (Z.B. von Datensatz Nr. 15 bis zum Datensatz Nr. 20)
Vielen Dank
BCBuilder Anfänger
-
BCBuilder Anfänger schrieb:
Die for-Schleife enthält eigentlich nichts, was mit dem Problem zu tun haben könnte.
doch, tut sie:
Tabelle->Next();
BCBuilder Anfänger schrieb:
Geht es überhaupt, zwischen zwei vorgegebenen Datensätzen liegende Datensätze zu bearbeiten? (Z.B. von Datensatz Nr. 15 bis zum Datensatz Nr. 20)
Ja und nein, denn was zwischen zwei Datensätzen liegt, hängt immer von der Sortier-Reihenfolge ab. Angenommen, Du hast ein indiziertes Primärschlüssel-Feld "ID" vom Typ integer und Du setzt die property IndexName auf "ID", dann begrenzen die Datensätze mit ID=15 und ID=20 eine Menge von Datensätzen für die gilt 15 <= ID <= 20.
Recno ID Text --------------- 3 15 Hallo 2 16 Ballo 55 17 Knallo 8 20 Lallo
(RecNo gehört natürlich nicht in die Tabelle.)
Bei IndexName = "Text" sieht das dann so aus:Recno ID Text --------------- 2 16 Ballo 3 15 Hallo 55 17 Knallo 8 20 Lallo
-
Dankeschön für die Hilfe, dschensky!
Nun, angenommen ich habe folgende Tabelle:
ID Text -------- 11 Hallo 12 Ballo 13 Kallo 14 Zallo 15 Lallo
Die Tabelle ist aufsteigend sortiert (ID) und indiziert (auch ID).
wie sähe dann die RecNo aus? etwa folgendermaßen?RecNo ID Text --------------- 1 11 Hallo 2 12 Ballo 3 13 Kallo 4 14 Zallo 5 15 Lallo
Oder nicht?
Nun möchte ich nur die letzten beiden Datensätze bearbeiten. sollte das nicht so gehen:Tabelle->First(); Tabelle->RecNo = 4; for (int i=0; i<2; i++) { ShowMessage(Tabelle->FieldByName("Text")->AsString); Tabelle->Next(); }
egal, was ich tue, erhalte ich im ShowMessage-Box beim ersten Durchlauf "Hallo" und beim zweiten "Ballo", also die Werte der beiden ersten Datensätze.
Was habe ich da nicht so richtig verstanden?Vielen herzlichen Dank
BCBuilder Anfänger
-
BCBuilder Anfänger schrieb:
Die Tabelle ist aufsteigend sortiert (ID) und indiziert (auch ID).
wie sähe dann die RecNo aus?Keine Ahnung, vergiß einfach RecNo. Auf diese Werte hast Du keinen Einfluß, warum sie also verwenden. Wenn Du bestimmte Datensätze anspringen willst, benutze den Primär-Schlüssel.
BCBuilder Anfänger schrieb:
Nun möchte ich nur die letzten beiden Datensätze bearbeiten
String index = "ID"; int id = 14; TLocateOptions opt; table->IndexName = index; // nicht nötig für Locate; nur für Reihenfolge if (table->Locate(index, id, opt) == true) // Datensatz anspringen ? { while (table->Eof == false) // bis zum Ende { // tu was ... table->Next(); } }
-
Ok, ich hab es!
Da es mit RecNo nicht geklappt hat, habe ich nach anderen Alternativen gesucht und gefunden:/* iDatensatz ist die Nummer des Datensatzes, ab dem die Bearbeitung erfolgen soll. von außen steuerbar. */ Tabelle->MoveBy(iDatensatz); //<--- Damit funktioniert es!! for (int j = 0; j < iRecAnz - iDatensatz+1 ; j++) { //Felder bearbeiten Tabelle->Next(); }//for (int j = 0; j < iRecAnz - iDatensatz+1 ; j++)
Damit geht es.
Vielen herzlichen Dank, dschensky, für Deine Hilfe und Geduld.
Schöne Grüße
BCBuilder Anfänger