Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQLite Datensatz löschen - [BUG ?] (https://www.delphipraxis.net/183481-sqlite-datensatz-loeschen-%5Bbug-%5D.html)

user0815 13. Jan 2015 13:28

Datenbank: SQLite • Version: 3.8.0.2 • Zugriff über: UniDAC

SQLite Datensatz löschen - [BUG ?]
 
Hallo,
ich habe eine SQLite DB.
Ich verbinde mich über TUniConnection mit der DB.
Ein TUniQuery mit SQL Abfrage.
Eine TUniDataSource zeigt auf den TUniQuery.
Ein TDBGrid ist mit der TUniDataSource verbunden und zeigt die Daten des Query an.

Soweit ist alles OK.
Wenn ich jetzt einen Datensatz im angezeigten TDBGrid selektiere dann kann ich diesen per STRG + ENTF löschen :shock: ???

Frage: Wie kann ich dies verhindern ?

Habe jetzt zur zusätzlichen Sicherheit im TDBGrid Objektinspektor unter Options dgConfirmDelete angehakt.

Danke + Grüße
user0815

p80286 13. Jan 2015 13:33

AW: SQLite Datensatz löschen - [BUG ?]
 
Laß die Finger von Datensensitiven Controls (TDB.....)

Ja das hab ich ernst gemeint. Mit normalen Controls ist das zwar etwas aufwendiger, dafür hast Du aber alles im Griff!

Gruß
K-H

Perlsau 13. Jan 2015 13:34

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von user0815 (Beitrag 1286424)
Wenn ich jetzt einen Datensatz im angezeigten TDBGrid selektiere dann kann ich diesen per STRG + ENTF löschen :shock: ??? Frage: Wie kann ich dies verhindern ?

Indem du das DBGrid auf ReadOnly setzt. Oder willst du nur das Löschen verhindern, das Bearbeiten aber erlauben?

Zitat:

Zitat von p80286 (Beitrag 1286425)
Laß die Finger von Datensensitiven Controls (TDB.....)
Ja das hab ich ernst gemeint. Mit normalen Controls ist das zwar etwas aufwendiger, dafür hast Du aber alles im Griff!

Also ich arbeite seit Jahren mit datensensitiven Controls und kann deine Befürchtungen nicht nachvollziehen. Ich hab alles im Griff. Nur in seltenen Ausnahmefällen verwende ich auch mal ein TEdit statt eines TDBEdit oder ein TLabel statt einer TDBText-Komponente.

Daniel 13. Jan 2015 13:34

AW: SQLite Datensatz löschen - [BUG ?]
 
Moin,

das Thema war den Machern von delphi.about.com immerhin einen eigenen Eintrag wert:

http://delphi.about.com/cs/adptips19...ltip0599_3.htm

Sieht für mich nicht nach der perfekten Lösung aus, könnte aber erstmal helfen, mit dem Thema klar zu kommen.

user0815 13. Jan 2015 13:51

AW: SQLite Datensatz löschen - [BUG ?]
 
Danke.

Ich habe das Grid jetzt auf ReadOnly gesetzt.
Das eigentliche Problem ist allerdings das ich den Shortcut nicht kannte... ärgerlich, damned, .... :pale:

Perlsau 13. Jan 2015 14:20

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von user0815 (Beitrag 1286431)
Danke. Ich habe das Grid jetzt auf ReadOnly gesetzt. Das eigentliche Problem ist allerdings das ich den Shortcut nicht kannte... ärgerlich, damned, .... :pale:

Keine Ursache, gern geschehen ... aber äh ... das ist kein Shortcut, sondern ein Property :coder2:

Nachtrag: Ist der Wert dgConfirmDelete in den TDBGridOptions gesetzt, verhinderst du damit keineswegs das Löschen des Records, sondern schaltest lediglich eine Sicherheitsabfrage dazwischen.

p80286 13. Jan 2015 14:27

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von Perlsau (Beitrag 1286426)
Also ich arbeite seit Jahren mit datensensitiven Controls und kann deine Befürchtungen nicht nachvollziehen.

Bei mir ist es das genaue Gegenteil, mit Datenbanken angefangen,vor die Wand gelaufen (aber sowas von heftig) und alles fein säuberlich auseinander gerupft. Seitdem kann es mir ...egal sein woher die Daten kommen, ein DM (für jede DB eins!) definiert und gut ist.

Gruß
K-H

Perlsau 13. Jan 2015 14:38

AW: SQLite Datensatz löschen - [BUG ?]
 
Na wenn's für dich gut ist, dann lassen wir's mal gut sein :-D
Das empfiehlt mir Daniel ja sowieso ständig, jetzt kann ich ihn mal damit erfreuen :stupid:

Daniel 13. Jan 2015 14:40

AW: SQLite Datensatz löschen - [BUG ?]
 
Ich bin sprachlos.
:cheers:

user0815 13. Jan 2015 14:55

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Keine Ursache, gern geschehen ... aber äh ... das ist kein Shortcut, sondern ein Property
meinte die Tastenkombination für das Grid: STRG + ENTF

Perlsau 13. Jan 2015 15:27

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von user0815 (Beitrag 1286443)
meinte die Tastenkombination für das Grid: STRG + ENTF

Achsoooo :roll: Mit dem Hellsehen ist das halt so eine Sache: Da sieht man einen hellen Fleck, und es ist er falsche :?

jobo 13. Jan 2015 16:59

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von user0815 (Beitrag 1286424)
Wenn ich jetzt einen Datensatz im angezeigten TDBGrid selektiere dann kann ich diesen per STRG + ENTF löschen :shock: ???

Frage: Wie kann ich dies verhindern ?

Wenn ich mich richtig erinnere, sollte es auch ein
Code:
abort;
im dataset bzw. query ondelete Event tun. Das packt das Problem m.E. eher an der "Wurzel".
Alles was Grid bezogen codiert wird, verhindert nicht das Löschen über andere Controls, [strng][entf] u.U. auch schon, wenn Du ein DBEdit auf die Form ziehst.

Falls Du dann doch mal wirklich etwas löschen willst, musst Du das abort mit einer Bedingung versehen.

Perlsau 13. Jan 2015 20:48

AW: SQLite Datensatz löschen - [BUG ?]
 
Also wenn ich mich richtig erinnere, gibt es gar kein OnDelete, sondern höchstens OnBeforeDelete oder OnAfterDelete – und ich erinnere mich gewöhnlich sehr gut an solche Sachen, hab ich doch täglich damit zu tun. Ob es ein OnDelete geben sollte, vermag ich wahrlich nicht zu beurteilen, benötige es doch gar nicht. :cyclops:

Jetzt würde mich aber doch mal interessieren, welches Problem du bei der von mir präferierten und daher auch vorgeschlagenen Methode siehst. Hat der TE etwa irgendwo geschrieben, daß er das Löschen über alle anderen etwaigen Controls ebenfalls verhindern möchte? Meines Wissens nach nicht :stupid:

Ach ja, und wenn du gerade dabei bist, kannst du mir auch gleich mal zeigen, wie man mit einem TDBEdit einen Record löscht. Das würde mich fast noch brennender interessieren wie der Vorteil irgend eines Abort-Befehls im herbeiphantasierten OnDelete-Event :lol:

jobo 14. Jan 2015 10:18

AW: SQLite Datensatz löschen - [BUG ?]
 
@Perlsau
Meine "Erinnerung" hat mich etwas getäuscht. Da mir das tatsächlich nicht ganz klar war, habe ich ja auch extra von "Erinnerung" geschrieben.
Es ist natürlich OnBeforeDelete, der geneigte Leser wird bei dem Versuch, den Delete Event zu verdrahten ggF mit etwas(!) Hirnschmalz diese falsche Angabe entdecken und vielleicht auch darauf kommen, dass man besser vor dem Löschen das Löschen abbricht (also BeforeDelete:abort).
Und auch ein bloßes DBEdit reagiert nicht auf das Kommand strng entf.
Das tut aber bspw. der DBNavigator, vielleicht auch andere datensensitive Komponenten.

Ob das für den TE relevant ist oder nicht, kann der sicher selbst entscheiden. Ich glaube nicht, dass es Stil dieses Forums ist, 1:1 Frage Antwort zu spielen, das wird auch Dir wohl geläufig sein.

Perlsau 14. Jan 2015 10:41

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von jobo (Beitrag 1286491)
Ich glaube nicht, dass es Stil dieses Forums ist, 1:1 Frage Antwort zu spielen, das wird auch Dir wohl geläufig sein.

Nun, erstens bin ich nicht dieses Forum und daher so frei, einen eigenen Stil zu pflegen, zweitens sind in einem Forum Fragen und Antworten durchaus üblich, um nicht zu sagen unerläßlich, drittens geht es hier nicht um Geschmacksfragen oder Modevorlieben, sondern und programmiertechnsiche Dinge, die nunmal exakt (1:1) und nicht irgendwie so oder so ähnlich dargestellt werden sollten – und viertens hat es nichts mit für oder gegen irgend einen ominösen Stil zu tun, wenn man auf eindeutige Falschinformationen hinweist. Sich nun herausreden zu wollen stellt dagegen einen – zumindest meiner Meinung nach – äußerst schlechten Stil dar und wirkt nicht nur oberflächlich, sondern zutiefst unaufrichtig. Ich werde es daher gut sein lassen und verbleibe mit der wertvollen Empfehlung unseres allseits beliebten Dieter Nuhr :twisted:
Unser Kassenwart im Verein macht das ganz ähnlich: Bei einer Vorstandssitzung angesprochen auf die mit zahlreichen Rechtschreib- und Grammatikfehlern angefertigte Bewerbungen für unser Clientel (Arbeitslose und ALG-II-Empfänger), hat er doch glatt behauptet, die Fehler habe er absichtlich eingefügt, damit der jeweilige Empfänger nicht auf den Gedanken verfallen könne, der Bewerber habe seine Bewerbung nicht selbst angefertigt. Dabei ist seine Rechtschreibschwäche längst allen Vorstandsmitgliedern bekannt: Wir wissen, daß er sich gut verkaufen kann, aber nicht wirklich was drauf hat.

user0815 14. Jan 2015 11:17

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Und auch ein bloßes DBEdit reagiert nicht auf das Kommand strng entf.
Doch genau das passiert: STRG + ENTF funktioniert.


Eben nochmal selbst getestet, frisches TDBGrid auf die Form gepackt (nichts an den Property´s geändert) mit der DataSource verbunden, Anwendung gestartet, Datensatz selektiert dann mit STRG + ENTF gelöscht. Es gibt kein DBNavigator oder irgendeine DELETE Anweisung in der Anwendung.

Perlsau 14. Jan 2015 11:22

AW: SQLite Datensatz löschen - [BUG ?]
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn du nochmal genau lesen möchtest: Im Zitat ging es um ein TDBEdit und nicht um ein TDBGrid.

Etwas ausführlicher: Ich stelle in den meisten meiner DB-Anwendungen eine Tabelle nebst einem Formular zur Verfügung. Die Tabelle (DBGrid) dient der Auswahl des zu bearbeitenden Datensatzes. Das Eingabe-Formular dient der Änderung des aktuellen bzw. dem Einfügen eines neuen Datensatzes. Dabei ist das DBGrid stets auf ReadOnly, die DB-Eingabefelder dagegen werden in den Read-Write-Modus geschalten, sobald der Anwender das entsprechende Dataset in den Edit- oder Appendmodus versetzt. Will der Anwender den aktuellen Record bearbeiten, schaltet er um in die Formular-Darstellung und betätigt den Edit-Button. Zum Umschalten der der Komponenten habe ich immer eigene Methoden:

Delphi-Quellcode:
// ---------- Schreiben erlaubt -------------------------------------------------------------------------------------------------- Privat
Procedure TFormMain.SchreibenErlaubt;
Var
  FarbeAktuell : TColor;
begin
  GLD.EditModus             := True;
  TS_ToDo_Tabelle.Enabled   := False;
  TS_Kat.Enabled            := False;
  TS_Option.Enabled         := False;
  Navi_Liste.Enabled        := False;

  AL_DB_Close.Enabled       := False;
  AL_ED_Append.Enabled      := False;
  AL_ED_Del.Enabled         := False;
  AL_ED_Edit.Enabled        := False;
  AL_ED_Post.Enabled        := True;
  AL_ED_Cancel.Enabled      := True;
  AL_ED_Find.Enabled        := False;
  AL_ED_Import.Enabled      := False;
  AL_ED_Export.Enabled      := False;
  AL_ED_Print.Enabled       := False;

  AL_TXT_SchriftDlg.Enabled := True;
  AL_TXT_Normal.Enabled     := True;
  AL_TXT_Fett.Enabled       := True;
  AL_TXT_Kursiv.Enabled     := True;
  AL_TXT_FettKursiv.Enabled := True;
  AL_TXT_Unter.Enabled      := True;
  AL_TXT_FettUnter.Enabled  := True;
  AL_TXT_KursivUnter.Enabled := True;
  AL_TXT_Durch.Enabled      := True;
  AL_TXT_Schwarz.Enabled    := True;
  AL_TXT_Rot.Enabled        := True;
  AL_TXT_Gruen.Enabled      := True;
  AL_TXT_Blau.Enabled       := True;

  GLD.URec.Sicht            := 0;
  Sichtbar;
  AL_SICHT_Alle.Enabled     := False;
  AL_SICHT_Jahr.Enabled     := False;
  AL_SICHT_Monat.Enabled    := False;
  AL_SICHT_Woche.Enabled    := False;
  AL_SICHT_Heute.Enabled    := False;

  Bit_Append.Enabled        := False;
  Bit_Delete.Enabled        := False;
  Bit_Edit.Enabled          := False;
  Bit_Post.Enabled          := True;
  Bit_Cancel.Enabled        := True;
  Bit_Find.Enabled          := False;
  Bit_Import.Enabled        := False;
  Bit_Export.Enabled        := False;
  Bit_Print.Enabled         := False;

  DBEd_Titel.ReadOnly       := False;
  DBLU_Kategorie.ReadOnly   := False;
  DBDatePick.ReadOnly       := False;
  DBTimePick.ReadOnly       := False;
  DBCheck_OK.ReadOnly       := False;
  DBRich_Notizen.ReadOnly   := False;

  If GLD.AppendModus                        Then
     FarbeAktuell           := GLD.FarbeAppend Else
     FarbeAktuell           := GLD.FarbeEdit;

  DBEd_Titel.Color          := FarbeAktuell;
  DBLU_Kategorie.Color      := FarbeAktuell;
  DBDatePick.Color          := FarbeAktuell;
  DBTimePick.Color          := FarbeAktuell;
  DBCheck_OK.Color          := FarbeAktuell;
  DBRich_Notizen.Color      := FarbeAktuell;

  StatusBarAktuell;
  DBEd_Titel.SetFocus;
end;

// ---------- Schreiben verboten ------------------------------------------------------------------------------------------------- Privat
Procedure TFormMain.SchreibenVerboten;
begin
  GLD.EditModus             := False;
  GLD.AppendModus           := False;

  AL_DB_Close.Enabled       := True;
  AL_ED_Append.Enabled      := True;
  AL_ED_Del.Enabled         := True;
  AL_ED_Edit.Enabled        := True;
  AL_ED_Post.Enabled        := False;
  AL_ED_Cancel.Enabled      := False;
  AL_ED_Find.Enabled        := True;
  AL_ED_Import.Enabled      := True;
  AL_ED_Export.Enabled      := True;
  AL_ED_Print.Enabled       := True;

  AL_TXT_SchriftDlg.Enabled := False;
  AL_TXT_Normal.Enabled     := False;
  AL_TXT_Fett.Enabled       := False;
  AL_TXT_Kursiv.Enabled     := False;
  AL_TXT_FettKursiv.Enabled := False;
  AL_TXT_Unter.Enabled      := False;
  AL_TXT_FettUnter.Enabled  := False;
  AL_TXT_KursivUnter.Enabled := False;
  AL_TXT_Durch.Enabled      := False;
  AL_TXT_Schwarz.Enabled    := False;
  AL_TXT_Rot.Enabled        := False;
  AL_TXT_Gruen.Enabled      := False;
  AL_TXT_Blau.Enabled       := False;

  AL_SICHT_Alle.Enabled     := True;
  AL_SICHT_Jahr.Enabled     := True;
  AL_SICHT_Monat.Enabled    := True;
  AL_SICHT_Woche.Enabled    := True;
  AL_SICHT_Heute.Enabled    := True;
  GLD.URec.Sicht            := 0;
  Sichtbar;

  Bit_Append.Enabled        := True;
  Bit_Delete.Enabled        := True;
  Bit_Edit.Enabled          := True;
  Bit_Post.Enabled          := False;
  Bit_Cancel.Enabled        := False;
  Bit_Find.Enabled          := True;
  Bit_Import.Enabled        := True;
  Bit_Export.Enabled        := True;
  Bit_Print.Enabled         := True;

  DBEd_Titel.ReadOnly       := True;
  DBLU_Kategorie.ReadOnly   := True;
  DBDatePick.ReadOnly       := True;
  DBTimePick.ReadOnly       := True;
  DBCheck_OK.ReadOnly       := True;
  DBRich_Notizen.ReadOnly   := True;

  DBEd_Titel.Color          := GLD.FarbeBrowse;
  DBLU_Kategorie.Color      := GLD.FarbeBrowse;
  DBDatePick.Color          := GLD.FarbeBrowse;
  DBTimePick.Color          := GLD.FarbeBrowse;
  DBCheck_OK.Color          := PgCtrl_ToDo.Color;
  DBRich_Notizen.Color      := GLD.FarbeBrowse;

  TS_ToDo_Tabelle.Enabled   := True;
  TS_Kat.Enabled            := True;
  TS_Option.Enabled         := True;

  DatMod.V_Liste.Locate('ID',DatMod.Qset_Liste.FieldByName('ID_LISTE').AsInteger,[]);
  StatusBarAktuell;
  Navi_Liste.Enabled        := True;
  DBEd_Titel.SetFocus;
end;

Daniel 14. Jan 2015 11:49

AW: SQLite Datensatz löschen - [BUG ?]
 
Zitat:

Zitat von jobo (Beitrag 1286491)
Ich glaube nicht, dass es Stil dieses Forums ist, 1:1 Frage Antwort zu spielen

Ist es auch nicht. Ein bisschen konstruktives Mitdenken wird von allen Beteiligten erwartet und den meisten Lesern dürfte klar geworden sein, auf welche Events Du anspielst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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