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


Anmelden zum Antworten