![]() |
Datenbank: ADS • Version: 7.1 • Zugriff über: SQL
ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Meine Datenbank meldet mir "Eine Datenmenge die nur zum lesen ist, kann nicht geändert werden"
In anderen Programmteilen kann ich mit der gleichen Synthax meine Datenbankwerte ändern, warum hier nicht:
Delphi-Quellcode:
Ist bestimmt wieder was ganz einfaches, aber ich sehe es nicht !!!!
//-----------------------------------------------------------------------------
// Alle Belege mit .pdf exportieren und packen, die kein Exportiert-Datum haben //----------------------------------------------------------------------------- procedure ExportBelegeAktuell; var Datei: Textfile; i: Integer; Hour, Min, Sec, MSec: Word; Zeit, ExportPath, Mo: string; LMonat,LJahr,LTag: Word; Jetzt: TDateTime; begin i := 0; ExportPath := BaseDatapath + BMandant + '\Export\'; // Datenbank Belege öffnen und leere Feld 'Exportiert' Datensätze selektieren DM.AdsQBelege.Active := False; DM.AdsQBelege.SQL.Clear; DM.AdsQBelege.SQL.ADD('Select * From Belege where Exportiert is null'); DM.AdsQBelege.open; if not (DM.AdsQBelege.EOF and DM.AdsQBelege.BOF) then begin // ersten Datensatz mit leerem Eportiert-Feld auslesen und Monat des Belegdatums auslesen // Dann nur noch Datensätze anzeigen, die Exportiert leer und Monat (Belegdatum) haben decodedate(DM.AdsQBelege.FieldByName('BelegDatum').AsDateTime,LJahr,LMonat,LTag); Mo:=IntToStr(LMonat); DM.AdsQBelege.Active := False; DM.AdsQBelege.SQL.Clear; DM.AdsQBelege.SQL.ADD('Select * From Belege where Exportiert is null AND Month(Belegdatum)='+Mo); DM.AdsQBelege.Active:=True; // Zählgröße des Vortschrittsbalkens setzen, anhand der Anzahl der Datensätze FBelege.ProgressBar1.max := DM.AdsQBelege.RecordCount; FBelege.ProgressBar1.Visible := true; // Existiert unter diesem Mandanten schon das Verz. Export ? // dann Dateien darin löschen, sonst Verz. anlegen. if not DirectoryExists(BaseDatapath + BMandant + '\Export') then ForceDirectories(BaseDatapath + BMandant + '\Export') else DeleteAll(ExportPath, '*.*'); //Delete all files in export // CSV Datei anlegen --------------------------------------------- assignfile(Datei, ExportPath + 'Belege.csv'); rewrite(Datei); Jetzt:=Now(); // Schleife zum ausgeben der Daten ins Export Verzeichnis DM.AdsQBelege.First; while (not DM.AdsQBelege.Eof) do begin PDFKopieren; // Hier die PDF-Datei aus dem Datensatz ins Exportverz kopieren // Dann den Datensatz in die CSV-Datei schreiben WriteLn(Datei, DM.AdsQBelege.FieldByName('Belegdatum').AsString + ';' + DM.AdsQBelege.FieldByName('Waehrung').AsString + ';' + FormatFloat('##,###,##0.00', DM.AdsQBelege.FieldByName('Betrag').AsFloat) + ';' + DM.AdsQBelege.FieldByName('SH').AsString + ';' + DM.AdsQBelege.FieldByName('Skontobetrag').AsString + ';' + DM.AdsQBelege.FieldByName('Gegenkonto').AsString + ';' + DM.AdsQBelege.FieldByName('StGegenkonto').AsString + ';' + DM.AdsQBelege.FieldByName('BelegNr').AsString + ';' + DM.AdsQBelege.FieldByName('Konto').AsString + ';' + DM.AdsQBelege.FieldByName('Bemerkung').AsString + ';' + DM.AdsQBelege.FieldByName('Sonstiges').AsString + ';' + DM.AdsQBelege.FieldByName('Eingabedatum').AsString + ';' + DM.AdsQBelege.FieldByName('PDFData').AsString + ';' + DM.AdsQBelege.FieldByName('Nr').AsString + ';' + DM.AdsQBelege.FieldByName('Kostenstelle').AsString + ';' + DM.AdsQBelege.FieldByName('Exportiert').AsString); // Aktuelles Datum in Feld-Exportiert schreiben DM.AdsQBelege.Edit; // <---------------------------------------------- Hier Fehler -------------- DM.AdsQBelege.FieldByName('Exportiert').AsDateTime:=Jetzt; DM.AdsQBelege.Post; DM.AdsQBelege.Next; //zum nächsten Datensatz inc(i); // Fortschrittsbalken eins weiter setzen FBelege.ProgressBar1.Position := i; end; Closefile(Datei); //CSV-Datei schließen end; |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
ts ts ts... du kannst doch nicht eine ergebnismenge ändern... du musst schon mit den delphi internen funktionen direkt auf das recordset zugreifen.
:wiejetzt: :dancer2: |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
wusste ichs doch, dass es eine ganz einfache Antwort gibt.
Wenn alle Datensätze selektiert sind hat es aber funktioniert, hatte gehofft, dass man auch in selektionen was ändern kann. Dann ist SQL wohl doch nur zum anzeigen zu gebrauchen. Schade, dann müssen wohl doch die alten Methoden mit locate und Filter herhalten. |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Herzlich willkommen in der Delphi-PRAXiS, bernid.
Wenn bestimmte Randbedingungen eingehalten sind, dann kann eine Ergebnismenge auch bearbeitet werden. Eventuell findet sich ja eine Eigenschaft ReadOnly der Query-Komponente, die auf TRUE gesetzt werden muss, bevor die Daten geändert werden können. Freundliche Grüße vom marabu |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Danke marabu für Deinen Post, du erweckst in mir die Hoffnung, dass ich doch mit SQL normal arneiten kann.
In meiner Query-Komponente gibt es kein Read-Only Attribut oder auch nur etwas ähnliches. Lediglich meine Connection-Komponente hat sowas, das steht aber schon auf False. |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Ich habe nochmal ähnliche Probleme hier nachgelesen und zwei Lösungsansätze gefunden:
1. RequestLive auf True setzen 2. Mit Update arbeiten Das mit dem RequestLive hat leider keine Wirkung gezeigt. Bei dem Update Befehl habe ich noch zwei Fragen: 1. Ich bewege mich in einer Schleife und gehe alle Datensätze aus meiner Selektion durch, wird dann beim Updatebefehl auch nicht meine derzeitige Selektion beeinflusst ? 2. Die Synthax des Updatebefehles macht mir noch Probleme, da der zu modifizierende wert ein TimeStamp ist. ich habe mir folgendes überlegt: DM.AdsQBelege.SQL.Add('Update Belege Set Exportiert= '+DateTimeToStr(Jetzt)+' Where Nr=:Nr'); Nr ist mein eindeutiger Primärindex, Jetzt ist das aktuelle Datum mit Zeit. Vieleicht schaut ja JoachimD demnächst mal hier rein, für ihn durfte das doch ganz einfach sein. |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Ich habe tatsächlich ReadOnly geschrieben - sollte RequestLive heißen - da macht das TRUE auch mehr Sinn - sorry. Ich habe ADS bei mir noch nicht installiert, deshalb auch keine Erfahrung mit diesem RDBMS. ADS scheint mit einem eigenen Komponenten-Set daher zu kommen. Wenn das so ist, dann sollte die Dokumentation Hinweise zum Thema updateable queries beinhalten.
marabu |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Ich hab mich noch mal weiter schlau gemacht.
Es geht hier ja um prinzipielle SQL-Probleme. Als erstes muss ich wohl lernen, dass man Änderungen in der Datenbank in SQL nicht in Schleifen machen sollte. Das geht einfacher mit einem Statment über einen ganzen Bereich. (Update) In meinem Fall begeutet das, dass ich meinen Datenexport erst mal getrennt von der Änderung an den Daten mache. Also erst mal nur die Daten auslesen und wegschreiben, dann nehme ich das Selektionskriterium und wende es auf den Updatebefehl an. DM.AdsQBelege.SQL.ADD('Update Belege Set Exportiert = ' + QuotedStr(DateTimeToStr(Jetzt)) + ' Where Exportiert is null AND Month(Belegdatum)='+Mo); Mit der Wandlung des DateTimeStrings hoffe ich mal, dass das funktioniert, habs noch nicht ausprobiert. Werde mich morgen mal dransetzen und das alles umstellen. Falls noch jemand was sinnvolles hierzu zu sagen hat, dann her damit. Das Thema mit dem Editieren von Feldern in SQL wurde in diesem Forum schon ein paar mal angesprochen, aber noch nicht ausreichend gelöst, wie ich meine. Eine schöne Seite für SQL-Anfänger finde ich ist ![]() |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Zitat:
|
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Prima, da kommt ja gleich die nächste Hürde auf mich zu.
Ich hänge ja noch am 'Set Exportiert =...' , das nimmt er schon nicht an, oder sollte die Fehlermeldung sich doch auf das Month() beziehen. Wäre schön, wenn mir jemand mal helfend unter die Arme greifen könnte. Ich will doch nur die Datensätze von einem Monat aus 'Belegdatum'(Date) und die dann in 'Exportiert' (TimeStamp) nichts drin stehen haben auf einen festen DateTime-Wert in 'Exportiert' setzen. Oder sollte ich doch besser zu den Table-Komponenten greifen und Query wirklich nur zum abfragen verwenden. |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Zitat:
Delphi-Quellcode:
Query.SQL.Text:= '...Set exportiert=:irgendwas...';
Query.ParamByName('irgendwas').AsDateTime:=now(); |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Zitat:
Delphi-Quellcode:
DM.AdsQBelege.SQL.ADD('Update Belege Set Exportiert = ' +
:ExportDatum + ' Where Exportiert is null AND Belegdatum Between :MonatsAnfang and :Monatsende'); DM.AdsQBelege.ParamByName('ExportDatum').AsDateTime := now; DM.AdsQBelege.ParamByName('MonatsAnfang').BeginOfTheMonth(BelegDatum); DM.AdsQBelege.ParamByName('ExportDatum').EndOfTheMonth(BelegDatum); |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Ist ja toll der Vorschlag von Union und JoachimD.
Da werden erst Variable im SQL-String eingesetzt und danach erst gefüllt.
Delphi-Quellcode:
Leider gibt es die Funktion BeginOfTheMonth() nicht, sollte das als Hinweis gedacht sein, dass ich mir die schreiben soll, oder gibt es sowas schon irgendwo ?
DM.AdsQBelege.ParamByName('MonatsAnfang').BeginOfTheMonth(BelegDatum);
DM.AdsQBelege.ParamByName('ExportDatum').EndOfTheMonth(BelegDatum); Hier und über google konnte ich nichts finden, es sei denn man programmiert in PHP. Jetzt kommen wir langsam weiter, nur noch ein kleiner Schritt. |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Sorry, es muss natürlich heissen
Delphi-Quellcode:
Ich war wohl durch die Pascal-Syntax etwas begin-geschädigt ;) Das sind ganz normale Delphi-Funktionen, zu finden in DateUtils und OH.
DM.AdsQBelege.ParamByName('MonatsAnfang').StartOfTheMonth(BelegDatum);
DM.AdsQBelege.ParamByName('ExportDatum').EndOfTheMonth(BelegDatum); |
Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit
Jetzt wirds schon besser, wieder einen Schritt weiter.
Nun noch ein paar Flüchtigkeitsfehler beseitigen und dann geht es schon.
Delphi-Quellcode:
So funktioniert das jetzt.AktMonat:=DM.AdsQBelege.FieldByName('BelegDatum').AsDate; . . . StartMonat:=StartOfTheMonth(AktMonat); EndMonat:=EndOfTheMonth(AktMonat); DM.AdsQBelege.SQL.ADD('Update Belege Set Exportiert = :ExportDatum' + ' Where Exportiert is null AND Belegdatum Between :MonatsAnfang and :MonatsEnde'); DM.AdsQBelege.ParamByName('ExportDatum').AsDateTime := Now(); DM.AdsQBelege.ParamByName('MonatsAnfang').AsDate := StartMonat; DM.AdsQBelege.ParamByName('MonatsEnde').AsDate := EndMonat; DM.AdsQBelege.ExecSQL; Hat noch jemand was daran auszusetzen, dass es nur unter bestimmten Bedingungen laufen kann oder dass noch Exceptions abgefangen werden müssen oder sonst was, das ich als begeisterter, wissbegieriger SQL-Schüler wissen sollte ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz