Table->First() ohne gewünschten Ansichtseffekt im DBGrid?



  • Hallo,

    habe ein kleines Proggie, wo ich eine DB-tabelle aus einem Alias öffne und in einem DBGrid anzeige. Nun hab ich festgestellt, dass wenn ich die Tabelle öffne, der Cursor des DBGrid irgendwie nie beim ersten Datensatz steht. Daher hab ich mir gedacht, dass ich beim Öffnen, also nachdem ich

    Table->Active = true;
    

    gesetzt habe, ich einfach ein

    Table->First();
    

    hinzufüge. Doch leider hat keinen Effekt. Auch die Möglichkeit

    Table->Active = true;
    table->First();
    Table->UpdateCursorPos()
    

    bringt rein gar nichts.

    Nun dachte ich mir, simulierst du halt den FirstButton des DBNavigator. Nun lese ich hier im Forum dass dieser auch bloß TDataSet::First() kapselt.

    Was mache ich also falsch? Wie bekomme ich, dass der Cursor (dieses schwarze Dreieck) im DBGrid auf dem ersten Datensatz steht.

    mfg
    Steffen 😕 😕

    [ Dieser Beitrag wurde am 15.01.2003 um 13:14 Uhr von skho editiert. ]



  • *hochschieb und nachtrag*

    wie ich grad nochmal testete, steht der Cursor des DBGrid immer auf dem letzten Datensatz??

    Hat denn keiner eine Idee, wie ich den auf den ersten zeigen lassen kann? muss ich noch etwas anderes beachten wenn ich First() nehme?? Gibts eine Möglichkeit die Anzeige des DBGrid zu refreshen? Solche Methoden gibts ja nur für DataSet, warum nicht für das DBGrid?

    erbitte antwort
    thx

    Steffen



  • also mit diesen standardkomponenten kenn ich mich zwar nicht so gut aus aber das dbgrid hat doch immer eine datasource , oder? wenn ja muss du doch nur die dataset refreshen bzw. aktive = false, aktive = true setzen und fertig oder
    DataSource->DataSet->First();

    oder geht das nicht ???



  • Grüß dich,
    ich kanns leider im Moment nicht ausprobieren, aber vielleicht hilft ja

    DBGrid1->SetFocus();
    

    Gruß von eilig



  • Danke erstmal für die Vorschläge. Habe beide Vorschläge gleich getestet, aber es will irgendwie nichts werden.

    Ich frage mich wozu es First() überhaupt gibt. *grrr* Ich meine in meiner Routine zum Durchsuchen der Datensätze funktionierte das ja auch mit First(), aber scheinbar bezieht sich das nicht auf die Visuellen Komponenten wie DBGrid... frage mich daher nur wie das bei dem NavigationsButton des DBNavigators funzt, ich denke dort wird auch First() gekapselt * 😕 *

    SetFocus() und DataSource->DataSet->First() leider nicht funzten nicht.

    Danke trotzdem.
    Noch jemand ne andere Idee? Kann ich DBNavigation::nbFirst simulieren?

    mfg
    Steffen



  • also bei mir funktioniert es wunderbar :

    DataSource->DataSet->Active = false;
    DataSource->DataSet->Active = true;

    oder :

    DS->DataSet->Active = false;
    DS->DataSet->Active = true;
    DS->DataSet->Last();

    bzw :

    DS->DataSet->Active = false;
    DS->DataSet->Active = true;
    DS->DataSet->First();



  • Schau dir mal TCustomDBGrid::SelectedIndex an.



  • mmmh funzt alles nix. 😞 😮

    DS->DataSet = false/true und dann First keine Wirkung, und

    SelectedIndex gibt mir die Markierung der Spalten nicht der Zeilen. Und SelectedRows schreibt den Wert auf eine TBookmarkList und da blick grad überhaupt nicht durch, wie man da zugreifen kann. *grübel* 😡 😕

    sehr merkwürdig.... hat einer schonmal den DBNavigation auseinander genommen, wie es dort gehandhabt wird?

    mfg
    Steffen



  • und wenn du es mittels den navigator machst ?

    also :

    DBNavigator->DataSource->DataSet->FindFirst();

    muss doch gehen !!!!



  • wie ist denn Dein Dataset (oder Table) oder ??? aufgebaut ?

    ich benutze zur Laufzeit generierte Query, die funktionieren eigentlich problemlos.. Kann Deine Abfrage das Problem sein
    Wilfrid



  • Jetzt versteh ich gar nix mehr

    Er bring mir eine Fehlermeldung, dass DataSource kein Member von DbCtrls::TDbNavigator ist:

    *merkwürdig, merkwürdig* dabei steht DataSource doch als Eigenschaft in der Hilfe *guckwieBahnhof*

    hier mal mein OpenCode für die DB, vielleicht stehts ja auch an der falschen Stelle.

    try
            {
            Tab_Db->Active = false;
            //ComboListen als Auswahlliste für Alias und die tabellen
            Tab_Db->DatabaseName = Combo_AliasList->Text;
            Tab_Db->TableType = ttParadox;
            Tab_Db->TableName = Combo_Dbnamen->Text;
            Tab_Db->Active = true;
            if ((DBNavigator1->DataS_db->DataSet->FindFirst()) == true)
            Status->SimpleText = "DB geöffnet";
            //TreeView Aktualisieren        
            TreeV_aktualisieren();
            }
        catch(EDatabaseError &e)
            {
            Status->SimpleText = "DB konnte nicht geöffnet werden!";
            }
    

    da wo jetzt die Zeile mit DBNavigator1 steht, hatte ich vorher immer das andere getestet, also nachdem Tab_Db->Active auf true gesetzt hat, weil sonst hat er mir immer gesagt, dass es an einer nicht geöffneten Tabelle nicht funzt.

    Ich versteh nun gar nix mehr, wieso ist DataSource kein Member von Navigator ist doch eine Eigenschaft?!?? 😕 😕 😕 😕 😕 😕 😕

    [edit]
    hab nichts mit SQL oder so gemacht, nur ne Table,DataSource und nen DBGrid mit Navigator und übergebe nur dann den Alias auf DatabaseName der Table und die Tabelle auf TableName der Table... ganz einfach... nur ich verstehs nicht, NavigatorClick auf First funzt ohne Probleme... warum er jetzt meckert weiß ich net.
    [/edit]

    [ Dieser Beitrag wurde am 16.01.2003 um 10:35 Uhr von skho editiert. ]



  • hab mir jetzt noch mal die Hilfe der Fehlermeldung angesehen, BezeichnerÜbergabe sagte die, also hab ich mal folgendes geschrieben:

    if ((DBNavigator1->DataSource->DataSet->FindFirst()) == true)
         Status->SimpleText = "Db geöffnet";
    

    nun compiliert er wieder richtig, aber er ist dennoch auf dem letzten Datensatz. Hab nun mal debuggt an der Stelle und festgestellt, dass FindFirst()auf true steht, er deshlab auch status ausgibt, aber gesetzt hat er trotzdem nicht. ich blick net mehr durch.

    navigatorClick funzt nach wie vor ... bin irgendwie ratlos.

    [ Dieser Beitrag wurde am 16.01.2003 um 13:31 Uhr von skho editiert. ]



  • *hochschieb*

    *grummel* --> will net gehen was ich auch mache!



  • Hi,

    table->First();

    muss gehen. Wenn nicht, machst du was anderes Falsch !

    §1: Such de Fehelr nicht in den Komponenten sondern in dein Quellcode. 99,99 % aller Fehler sind Hausgemacht.

    Überprüfe:

    - Arbeitest du auf der richtigen TTable rum oder zeigst du eine andere an ?
    - Hast du irgendwas verwechselt ?



  • @Andreas
    Ich habe nur eine TTable, ein DBGrid, eine DataSource. Ich wähle einen Alias aus einer ComboBox aus. Daraufhin bekommen ich in einer zweiten ComboBox die Tabellen zu dem Alias angezeigt. Mit einem ButtonClick lege ich den Alias auf DatabaseName der Tabelle und den Tabellennamen auf TableName. Die Tabelle wird ordnungsgemäß geöffnet.meine Table heißt Tab_db. Ich habe Tab_db->First() mit in ButtonClick geschrieben und zwar direkt nachdem dem Tab_db->Active auf true gesetzt worden ist.

    Ich kann gar nicht auf eine andere Tabelle verweisen, hab ja nur eine. Unmöglich. Hab ja auch schon die o.g. Möglichkeiten probiert und nichts haut hin.Immer steht der Cursor auf dem letzten Datensatz im DBGrid. Wenn ich auf dem DBNavigator1 auf [symbol] |< [/symbol] springt er anstandslos den ersten Datensatz an.

    Tab_db->First() haut bei mir nur intern hin, wenn ich z.B. meine Datensätze in einer Schleife abhandeln tue und beim Ersten anfange, das funktioniert, aber das hat keine Auswirkungen auf das DbGrid und dessen Cursor.

    Habe meine Quellcode schon x-mal angeschaut und halb neu geschrieben. Kann ich dir meine .cpp und .h vll mal zuschicken? hängt das vll. an der BCB Version? hab die 3.0 ...

    mfg
    Steffen 😕 😕

    ---totally confused---



  • lalala ... äähm Andreas *hust* ich muss dir leider recht geben :p 🙄

    hatte folgendes ja geschrieben: 🕶 :p

    try
            {
            Tab_Db->Active = false;
            //ComboListen als Auswahlliste für Alias und die tabellen
            Tab_Db->DatabaseName = Combo_AliasList->Text;
            Tab_Db->TableType = ttParadox;
            Tab_Db->TableName = Combo_Dbnamen->Text;
            Tab_Db->Active = true;
            Tab_Db->First();        
            //TreeView Aktualisieren        
            TreeV_aktualisieren();
            }
        catch(EDatabaseError &e)
            {
            Status->SimpleText = "DB konnte nicht geöffnet werden!";
            }
    

    Nun ist mir ein Licht aufgegangen ... wie man sieht rufe ich nach dem First() ja noch eine Funktion auf und in dieser geht er der Reihe nach alle Werte in der Table durch, zum Schluß dieser Funktion ist der Cursor also auf dem letzten Datensatz. (o:

    nun habe ich einfach Table_Db->First() ans Ende des Try-Blocks also nach TreeV_aktualisieren() gesetzt und Voilá es funktioniert *DummDummDumm*

    Ich hoffe ihr könnt mir vergeben (o:

    mfg und thx for ure mühes
    Steffen 🙄 🙄

    [ Dieser Beitrag wurde am 20.01.2003 um 13:20 Uhr von skho editiert. ]



  • 😃


Anmelden zum Antworten