Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGRID Insert verhindern (https://www.delphipraxis.net/56676-dbgrid-insert-verhindern.html)

moebus 9. Nov 2005 17:47

Datenbank: Mysql • Zugriff über: MYSQL Access Komponenten

DBGRID Insert verhindern
 
Hallo,

folgende Problematik. Ich stelle in einem DBGRID eine Datenbanktabelle dar. Der User soll innerhalb des Grides die Daten verändern können.Er soll aber nicht am Ende der Tabelle durch PFEIL UNTEN oder STRG+EINFG einen neuen Datensatz anlegen können.

Wäre nett wenn jemand ne Idee hätte wie man dieses Insert verhindern kann ohne dem Grid die Editiermöglichkeit zu rauben.

Mfg

Moebus

P.S. Das verhindern der Datensatzlöschung habe ich schon über das onkeydown Ereigniss gelöst in dem ich die Tastenkombination STRG+ENTF abfange und den Wert nulle. Falls da jemand ein effizienteren Weg weis - z.B. einen Schalter im OI den ich einfach nicht sehe - bitte auch mal posten.

Jelly 9. Nov 2005 18:00

Re: DBGRID Insert verhindern
 
Du hast normalerweise in deiner MySQL Komponente die Ereignisse BeforeDelete und BeforeInsert. Probier dort mal einfach ein
Delphi-Quellcode:
Abort ;
um die Aktion abzubrechen. Zumindest beim BeforeDelete klappt das, beim BeforeInsert hab ich das noch nie probiert.

eddy 9. Nov 2005 23:24

Re: DBGRID Insert verhindern
 
Hallo Moebus,

setze DBGrid.Options.dgEditing auf false, dann werden keine Sätze mehr angehangen.

Delphi-Quellcode:
dbg.Options := dbg.Options - [dgEditing, dgAlwaysShowEditor]
                           + [dgRowSelect, dgAlwaysShowSelection]
Für den Fall, daß das DBGrid editierbar bleiben soll, hatte ich auch mal eine Lösung, weiß nur nicht wo.
Im Notfall käme ich aber wieder dahinter, wie ich das Problem gelöst hatte.

Die Version von Jelly funktioniert natürlich auch, aber nur, wenn Du garantiert keine Sätze einfügen oder löschen willst. (dgEditing ist dann völlig egal)


mfg
eddy

Garby 10. Nov 2005 07:56

Re: DBGRID Insert verhindern
 
Hallo,

ich würde im AfterInsert der Query Cancel ausfhren:
Delphi-Quellcode:
procedure TForm1.Query1AfterInsert(DataSet: TDataSet);
begin
  DataSet.Cancel;
end;

dfried 10. Nov 2005 08:37

Re: DBGRID Insert verhindern
 
Zitat:

Zitat von Garby
ich würde im AfterInsert der Query Cancel ausfhren:

Wieso im AfterInsert? Er will doch gar nix einfügen!?! :gruebel:

Dann besser Jellys Methode im BeforeInsert!

Garby 10. Nov 2005 08:44

Re: DBGRID Insert verhindern
 
@dfried: Du solltest mal ausprobieren wann AfterInsert ausgelöst wird.
Das passiert nämlich nach dem Append.
Hier habe ich die Möglichkeit den Status der Query mit Cancel zu beeinflussen, was ich als saubere Methode halten würde.
Natürlich funktioniert das Auslösen einer stummen Exception im BeforeInsert auch. Damit werden aber alle anderen Aktionen abgebrochen, was unter Umständen nicht erwünscht ist.

Lange Rede... es ist wohl Geschmackssache.

dfried 10. Nov 2005 08:52

Re: DBGRID Insert verhindern
 
Zitat:

Zitat von Garby
Natürlich funktioniert das Auslösen einer stummen Exception im BeforeInsert auch. Damit werden aber alle anderen Aktionen abgebrochen, was unter Umständen nicht erwünscht ist.

Welche anderen Aktionen sollen dadurch abgebrochen werden? In dem Fall wird nur der "Insert" abgebrochen (bevor überhaupt was eingefügt wird und evtl. andere Events auslöst).

Garby 10. Nov 2005 08:59

Re: DBGRID Insert verhindern
 
OK, hast ja recht.
In diesem Fall würde ich kein Problem sehen, das mit Abort zu realisieren.

moebus 10. Nov 2005 16:01

Re: DBGRID Insert verhindern
 
Die Ideen sind Grundsätzlich alle in Ordnung nur haben Sie ein Gedankfehler.

Das Query steht in einem Datamodul da aus mehreren Formulare drauf zu gegriffen wird. Dadurch kann ich das Insert nicht im Query abfangen, da in einigen Routinen Importfilter laufen die auf dieses Query zugreifen.

Beim DgEditing habe ich das Problem, das meines Wissens neben dem Insert auch das Editieren gesperrt wird.

Die einzigste Möglichkeit die ich im Moment sehe, besteht darin das Query zu duplizieren, den Insert abzufangen, wie oben von Garby beschrieben und dieses zweite Query auschlieslich zur Darstellung und zum Editieren zu nutzen. Allerdings ist dies eine sehr umständliche Lösung.

In meiner Anwendung die noch keine 5% der Zielgrösse hat sind bereits jetzt rund ein dutzend Querys von dem Problem betroffen, da ich viele Bearbeitungsmöglichkeiten über DBGRID's geregelt habe und nicht über eigene Formulare oder ähnliches. Man kann sich nun vorstellen, das der Aufwand masiv steigt, wenn ich immer zwei Query's erstellen muss um eins für den Insert und eins zum darstellen und editieren zu haben.

Eigentlich hatte ich gehofft einfach nur einen Schalter ähnlich dem dgediting übersehen zu haben.

Das löschen der Datensätze via STRG+Entf musste ich auch schon durch die Hintertür lösen, indem ich in dem Keydownereigniss besagte Tastenkombinationabfangen und nulle.

Sollte keiner eine Idee haben wie ich das Insert innerhalb des Grides verhindere, so stellt sich nun die Frage ob es evtl. irgendwelche Kombonenten von Fremdentwicklern gibt, die ein entsprechendes leistungsfähiges und flexibles DBGRID zur Verfügung stellen. Selbst verständlich bevorzugt kostenlos ;-)

Mfg

Moebus

P.S. Jaja, wer lesen kann ist klar im Vorteil. Habe gerade eben beim zweiten mal lesen erst gesehen das Eddy das Problem richtig erkannt hat. Hoffe ihm fällt wieder ein wie ich trotz dgEditing = false das editieren ermöglichen kann, dann wäre das Problem perfekt gelöst.

Garby 11. Nov 2005 07:51

Re: DBGRID Insert verhindern
 
Hallo,

wenn du deine Queries im Datenmodul hast ist das natürlich etwas anderes.
Vorausgesetzt du hast die zugehörige DataSource beim Grid liegen, könntest du das Ereignis OnStateChange der DS verwenden um das Insert abzufangen:
Delphi-Quellcode:
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
  if (Sender as TDataSource).DataSet.State = dsInsert then
    (Sender as TDataSource).DataSet.Cancel;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.
Seite 1 von 2  1 2      

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