Autor Beitrag
Siluro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: Mo 10.12.07 14:29 
Hallo,
ich hab da gerade ein sehr merkwürdiges Phänomen. Ich arbeite mit einer Postgres DB und als DB-Komponenten in Delphi benutze ich die Zeoskomponenten. In meiner DB habe ich eine Tabelle mit X Datensätzen, alle über meine Anwendung erstellt. Jetzt zu meinem Problem:
Einige dieser Datensätze kann ich über die Anwendung werder veränder noch löschen, in Postgres schon. Die Änderungen werden zwar temporär durchgeführt, werden aber nach einem Refresh der ZQuery wieder rückgängig gemacht. Ich bekomme weder beim BeforePost, beim Post selbst noch beim Afterpost eine Exception. Wie gesagt, dies gilt auch nur für einige Datensätze, ich weiss einfach nichtmehr weiter. Vielleicht hat ja von euch einer eine Idee woran das liegen kann.

Gruß

Björn

EDIT:
Falls es jemandem hilft mir zu helfen, hier mal der Sourcecode zum Speichern:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure TfmParent.acBtnSaveExecute(Sender: TObject);
var
  is_insert: boolean;
  fid: integer;
  strSort: String;
begin
  edPrimary.SetFocus;
  if not (dsData.DataSet.State in dsEditModes) then exit;
  if not CanPost(dsData.DataSet) then
    abort;
  is_insert:=dsData.DataSet.State=dsInsert;
  //  dm.Connection.TransactIsolationLevel:=tiReadCommited;
  dm.Connection.StartTransaction;
  try
    try
      fid := dsData.DataSet.fieldbyname('ID').AsInteger;
    except
      fid := 0;
    end;
    try
    dnData.BtnClick(nbPost);
    except on e:exception do showmessage(e.Message); end;
    // this should work also for "KUNDEN" table
    strSort:=TZQuery(dsData.DataSet).SortedFields;
    TZQuery(dsData.DataSet).SortedFields:='id ASC';
    try
      cbList.ItemIndex:=0;
      dsData.DataSet.Close;
      TZQuery(dsData.DataSet).sql.text:='select * from '+mainView;
      dsData.DataSet.Open;
    except on e: Exception do ShowMEssage('cbList->'+e.Message);//Assert(false, e.Message);
    end;
    if (dsData.DataSet is TZQuery) then doForAllDetails(TZQuery(dsData.DataSet), doDSPost, true);
    if is_insert then dsData.DataSet.Last
      else dsData.DataSet.Locate('ID', fid, []);
    dm.Connection.Commit;
    fid:=dsData.DataSet.FieldByName('id').Value;
    PostDetailData(fid);
    TZQuery(dsData.DataSet).SortedFields:=strSort;
    dsData.DataSet.Locate('ID', fid, []);
  except on e: exception do begin
      //ShowMessage('Rollback->'+e.Message);
      Assert(false, e.Message);
      dm.Connection.Rollback;
    end;
  end;
  paGridResize(self);
end;


EDIT2: Mit manuellen SQL-Statements funktionierts, auch bei den Problemflällen. Ist zwar ne blöde Lösung, aber es geht wenigstens. Werd aber weiter versuchen das eigentliche Problem zu lösen. Hat den bisher noch keiner so ein Problem gehabt?
Hier meine aktuelle Lösung:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
procedure TfmArtikelverwaltung.acBtnSaveExecute(Sender: TObject);
var
  qry: TZQuery;
  aid: Integer;
begin
  fmArtikelverwaltung.FocusControl(edPrimary);
  qry := TZquery.Create(nil);
  qry.Connection := dm.Connection;
  with dm do begin
    if tblArtikelid.AsInteger > 0 then
      aid := tblArtikelid.AsInteger
    else
      aid := 0;

    if tblArtikel.State = dsInsert then begin
      qry.SQL.Text := 'insert into v_artikel '+
        '(artikelnr,erloesid,einheitid,wgruppeid,ugruppeid,herstid,typid,bestand,mindestbestand,hoechstbestand,kurztext,langtext,beschreibung,kommission,gebraucht,prozentual,ek_preis,preis,gewinnzuschlag)'+
        'values '+
        '('+checkVal(tblArtikelartikelnr)+','+
        checkVal(tblArtikelerloesid)+','+
        checkVal(tblArtikeleinheitid)+','+
        checkVal(tblArtikelwgruppeid)+','+
        checkVal(tblArtikelugruppeid)+','+
        checkVal(tblArtikelherstid)+','+
        checkVal(tblArtikeltypid)+','+
        checkVal(tblArtikelbestand)+ ','+
        checkVal(tblArtikelmindestbestand)+','+
        checkVal(tblArtikelhoechstbestand)+','+
        checkVal(tblArtikelkurztext)+','+
        checkVal(tblArtikellangtext)+','+
        checkVal(tblArtikelbeschreibung)+','+
        checkVal(tblArtikelkommission)+','+
        checkVal(tblArtikelgebraucht)+','+
        checkVal(tblArtikelprozentual)+','+
        checkVal(tblArtikelek_preis)+','+
        checkVal(tblArtikelpreis)+','+
        checkVal(tblArtikelgewinnzuschlag)+')';
      try
        qry.ExecSQL;
        tblArtikel.Cancel;
        tblArtikel.Refresh;
        tblArtikel.Last;
      except on e:exception do showmessage(e.Message); end;
    end;

    if tblArtikel.State = dsEdit then begin
      qry.SQL.Text := 'update v_artikel set '+
        'artikelnr = '+checkVal(tblArtikelartikelnr)+', '+
        'erloesid = '+checkVal(tblArtikelerloesid)+', '+
        'einheitid = '+checkVal(tblArtikeleinheitid)+', '+
        'wgruppeid = '+checkVal(tblArtikelwgruppeid)+', '+
        'ugruppeid = '+checkVal(tblArtikelugruppeid)+', '+
        'herstid = '+checkVal(tblArtikelherstid)+', '+
        'typid = '+checkVal(tblArtikeltypid)+', '+
        'bestand = '+checkVal(tblArtikelbestand)+ ', '+
        'mindestbestand = '+checkVal(tblArtikelmindestbestand)+', '+
        'hoechstbestand = '+checkVal(tblArtikelhoechstbestand)+', '+
        'kurztext = '+checkVal(tblArtikelkurztext)+', '+
        'langtext = '+checkVal(tblArtikellangtext)+', '+
        'beschreibung = '+checkVal(tblArtikelbeschreibung)+', '+
        'kommission = '+checkVal(tblArtikelkommission)+', '+
        'gebraucht = '+checkVal(tblArtikelgebraucht)+', '+
        'prozentual = '+checkVal(tblArtikelprozentual)+', '+
        'ek_preis = '+checkVal(tblArtikelek_preis)+', '+
        'preis = '+checkVal(tblArtikelpreis)+', '+
        'gewinnzuschlag = '+checkVal(tblArtikelgewinnzuschlag)+' '+
        'where id = '+inttostr(aid);
      try
        qry.ExecSQL;
        tblArtikel.Cancel;
        tblArtikel.Refresh;
        tblArtikel.Locate('id', aid, []);
      except on e:exception do showmessage(e.Message); end;
    end;
  end;
  qry.Free;
end;

function TfmArtikelverwaltung.checkVal(f: TField): String;
var
  p: integer;
begin
  result := 'null';
  if (f is TIntegerField) then begin
    if f.AsInteger > 0 then result := f.AsString;
  end;
  if (f is TFloatField) then begin
    if f.AsCurrency > 0 then result := f.AsString;
    p := pos(',', result);
    if (p > 0) then result := StringReplace(result, ',', '.', []);
  end;
  if (f is TBooleanField) then begin
    if f.AsBoolean then
      result := 'true'
    else
      result := 'false';
  end;
  if (f is TStringField) then begin
    if length(f.AsString) > 0 then result := quotedStr(f.AsString);
  end;
end;
Siluro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: Mo 17.12.07 15:21 
Hi,
hab jetzt endlich das Problem gefunden. Die Zeos-Komponenten verwenden alle Werte des Datensatzes in der "Where-Klausel", einige dieser Werte waren Dezimalzahlen bei denen wohl ein paar Nachkommastellen zuviel in der Datenbank gespeichert worden sind. Ich hab diese Felder im View jetzt einfach um round("Feldname", 2) erweiter und es geht.

MfG

Björn