Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Tabellenfeld NOT NULL erkkennen

  Alt 26. Mai 2021, 17:27
Bin mir nicht sicher, ob das vor oder nach OnBeforPost passiert, aber Try-Except geht da drin eh nicht.
[EDIT] es wird nach OnBeforePost gepürft

Aber beim .Post kannst ein Try-Except auf EDatabaseError machen,
oder auf OnPostError reagieren.

Delphi-Quellcode:
procedure TDataSet.Post;
begin
  UpdateRecord;
  case State of
    dsEdit, dsInsert:
      begin
        DataEvent(deCheckBrowseMode, 0);
        DoBeforePost;
        CheckOperation(InternalPost, FOnPostError); // <-----
        FreeFieldBuffers;
        SetState(dsBrowse);
        Resync([]);
        DoAfterPost;
      end;
  end;
end;

procedure TDataSet.InternalPost;
begin
  CheckRequiredFields;
end;

procedure TDataSet.CheckRequiredFields;
var
  I: Integer;
begin
  for I := 0 to FFields.Count - 1 do
    with FFields[I] do
      if Required and not ReadOnly and (FieldKind = fkData) and IsNull then
      begin
        FocusControl;
        DatabaseErrorFmt(SFieldRequired, [DisplayName]{, Self}); // k.A. warum Self auskommentiert ist, aber für die Fehlersuche wäre es eigentlich besser, wenn es das nicht wäre ... in XE auskommentiert und in 10.4 ganz weg o_O
      end;
end;

...

procedure DatabaseError(const Message: string; Component: TComponent = nil);
begin
  if Assigned(Component) and (Component.Name <> '') then
    raise EDatabaseError.Create(Format('%s: %s', [Component.Name, Message])) else
    raise EDatabaseError.Create(Message);
end;



procedure TDataSet.CheckOperation(Operation: TDataOperation; ErrorEvent: TDataSetErrorEvent);
var
  Done: Boolean;
  Action: TDataAction;
begin
  Done := False;
  repeat
    try
      UpdateCursorPos;
      Operation; // <------
      Done := True;
    except
      on E: EDatabaseError do
      begin
        Action := daFail;
        if Assigned(ErrorEvent) then ErrorEvent(Self, E, Action); // <------
        if Action = daFail then raise;
        if Action = daAbort then SysUtils.Abort;
      end;
    end;
  until Done;
end;



// unit DBConsts;
resourcestring
  SFieldRequired = 'Feld '#39'%s'#39' muss einen Wert haben';
$2B or not $2B

Geändert von himitsu (26. Mai 2021 um 17:36 Uhr)
  Mit Zitat antworten Zitat