AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADS Datenbank meldet 'im Lesemodus' bei Query.edit

ADS Datenbank meldet 'im Lesemodus' bei Query.edit

Ein Thema von Smiley · begonnen am 26. Jan 2006 · letzter Beitrag vom 31. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#1

ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 26. Jan 2006, 20:32
Datenbank: ADS • Version: 7.1 • Zugriff über: SQL
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:
//-----------------------------------------------------------------------------
// 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;
Ist bestimmt wieder was ganz einfaches, aber ich sehe es nicht !!!!
  Mit Zitat antworten Zitat
bernid

Registriert seit: 29. Jan 2006
1 Beiträge
 
#2

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 14:31
ts ts ts... du kannst doch nicht eine ergebnismenge ändern... du musst schon mit den delphi internen funktionen direkt auf das recordset zugreifen.

  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 17:36
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 17:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 18:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 20:28
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 20:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 29. Jan 2006, 22:21
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 w3schools.com
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#9

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 30. Jan 2006, 17:29
Zitat von Smiley:
DM.AdsQBelege.SQL.ADD('Update Belege Set Exportiert = ' +
QuotedStr(DateTimeToStr(Jetzt)) +
' Where Exportiert is null AND Month(Belegdatum)='+Mo);
Du verwendest hier eine Skalar-Funktion (month) und machst Dir somit einen Live-Cursor zunichte.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: ADS Datenbank meldet 'im Lesemodus' bei Query.edit

  Alt 30. Jan 2006, 20:06
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz