Datenbankzugriff im BCB5



  • Hallo...
    bin ein Newbie, und habe ein Problem mit dem BCB und einer Access Tabelle.
    Die Verbindung der Tabelle und meinem Programm steht schon (Folgende Teile sind eingebunden: DataSource, DataBase, TTable, DBGrid und Query).
    Die Anzeige meiner Tabelle im DBGrid klappt auch.
    Nun habe ich in meiner Tabelle (für eine Fehlerauswertung) die Spalten: "Kommt" und "Geht" jeweils im DateTime Format aus diesen Werten möchte ich die "Dauer" (ebenfalls eine Spalte) errechnen und den Wert in meine Tabelle zurückschreiben. Das auslesen der Werte von "Kommt" und "Geht" und das errechnen von dem Wert Dauer klappt auch, nur wie schreibe ich den Wert der Dauer in den dazugehörigen bestehenden Datensatz?

    So lese ich die Werte aus:

    double datetime_kommt, datetime_geht;
         DBGrid1->DataSource->DataSet->First();
         for(int i = 0;i<=anzahl;i++)  //anzahl=Anzahl der Datensätze
         {
            DBGrid1->DataSource->DataSet->MoveBy(i);
            datetime_kommt = DBGrid1->Fields[1]->AsDateTime;
            datetime_geht  = DBGrid1->Fields[2]->AsDateTime;
    
    //Versuch die Dauer zurückzuschreiben mit der Fehlermeldung: EDatabaseError Meldung: Query1: Datenmenge weder im Editier- noch im Einfügemodus
    
            DBGrid1->Fields[3]->AsDateTime=TDateTime(datetime_geht-datetime_kommt);
    
         }
    

    Wenn ich den errechneten Wert in ein Edit Feld schreibe klappts und die Dauer stimmt auch.

    Hab im Netz schon alles mögliche abgeklappert und nichts gefunden, wahrscheinlich ist das Problem zu einfach.... 😕

    Danke für eine schnelle und einfache Hilfe im Voraus!

    Edit:
    Bitte die Code-Tags benutzen. Danke!

    [ Dieser Beitrag wurde am 02.03.2003 um 01:31 Uhr von Jansen editiert. ]



  • Sieh mal in der Hilfe nach unter:
    Inhalt -> Datenbankanwendungen entwickeln -> Datenmengen -> Das Einfügen neuer Datensätze ermöglichen



  • Danke für die Antwort, hat mich aber nicht wirklich weitergebracht...
    Habe einiges ausprobiert aber nur mit mäßigem Erfolg. Wie könnte sowas denn als Beispiel (die in der Borland-Hilfe sind entweder " 😕 merkwürdig 😕 " oder fehlen an den interessanten Stellen) denn aussehen?

    Eigentlich kann es doch garnicht so schwer sein, ich möchte bloss die Werte der Felder "Kommt" und "Geht" voneinander abziehen und das Ergebnis nach Dauer schreiben und das nur in den Datensätzen in denen im Feld "Geht" auch was drin steht. Ich habe auch schon die Hilfe über "OnCalcFields" gelesen bin daraus aber auch nicht schlau geworden.

    Der Verzweiflung nahe Gruß Holger Sprick...



  • Ich erinnere mich dunkel daran, daß ich solch einen Fehler auch mal hatte.

    Kann es sein, dass möglicherweise readonly false ist?
    Versuch doch einfach mal testweise ein anderes Feld zu ändern. Wenn es dann nicht geht, hat es nichts mit dem AsDateTime-Feld zu tun.

    Ich bin mir aber sicher, daß irgendetwas eingestellt werden mußte bevor man die Daten ändern kann. Wenn nicht readonly, dann such mal nach was anderem dass so ähnlich ist.
    [EDIT]: Mir ist gerade eingefallen, da gab es noch CanModify. [Edit]

    Habe schon in einem alten Programm gesucht, aber nichts gefunden.

    Du könntest auch mal den Table->State abfragen ob der dsEdit oder dsInsert ist.

    [ Dieser Beitrag wurde am 02.03.2003 um 15:53 Uhr von aheim editiert. ]



  • Hallo ich schon wieder...

    Also ReadOnly ist False, muß es aber doch auch oder?

    Wie navigiere ich denn durch meine Datensätze, vom Ersten bis zum letzten (ausser die bei denen der Wert in "Geht" noch nicht existiert, diese Fehler stehen dann noch an) und erechne für jeden die Dauer und schreib sie in das betreffende Feld???

    Das Beispiel unten funktioniert nicht da beschwert er sich über eine "Ungültige Variant-Typumwandlung" 😡
    Das Format DateTime ist doch eine double Zahl und wenn ich die Zahlen voneinander abziehe erhalte ich den Zeitunterschied meine "Dauer".

    double DateTimeKommt, DateTimeGeht, Dauer;
         Table1->Open();
         Table1->Edit();
         Table1->Insert();
         Dauer = StrToDateTime(Table1->FieldValues["Geht"]) -
         StrToDateTime(Table1->FieldValues["Kommt"]);
         Table1->FieldValues["Dauer"] = TDateTime(Dauer);
         Table1->Post();
    

    Die Spalten: Kommt, Geht sind vom Typ Datum/Uhrzeit und Dauer ist ein String.
    Nehm ich ne einfache Int-Zahl schreibt er sie mir braf ins Feld Dauer.

    Nen Quell-Code Beispiel wär schön oder nen Ort wos sowas gibt!

    Ich weiß wirklich nicht mehr weiter....

    Gruß Holger Sprick



  • Stimmt Readonly muss false sein habe ich mich vertan.

    Versuch mal bei google mit "Kosch" und "Datenbank" oder "Tabellen" oder so was in der Richtung zu suchen.
    Es gibt ein Buch zu Delphi und Datenbanken von dem. Das ist ganz gut.
    Habe ich letztlich irgendwo gefunden. Dort sind auch Beispiele.
    Statt Table.First machst Du dann nur Table->First() usw.
    Ich vermute, dass es an deiner Feldstruktur der kommt/geht-Felder liegt und es deshalb nicht geht.



  • Betrifft Dein Posting

    double DateTimeKommt, DateTimeGeht, Dauer;
    Table1->Open();
    Table1->Edit();
    Table1->Insert();
    Dauer = StrToDateTime(Table1->FieldValues["Geht"]) -
    StrToDateTime(Table1->FieldValues["Kommt"]);
    Table1->FieldValues["Dauer"] = TDateTime(Dauer);
    Table1->Post();

    Wenn Du bei dem Feld "Dauer" eine Umwandlung von DateTime in String vornimmst, darfst Du es nicht als "double" sondern als "AnsiString" definieren. Versuch es doch mal mit folgendem Code:

    Dauer = Table1->FieldValues["Geht"]-Table1->FieldValues["Kommt"];
    Table1->FieldValues["Dauer"] = Dauer;

    Gruß
    TomS 😉


Anmelden zum Antworten