AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DBGRID Insert verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

DBGRID Insert verhindern

Ein Thema von moebus · begonnen am 9. Nov 2005 · letzter Beitrag vom 11. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
moebus

Registriert seit: 3. Aug 2005
7 Beiträge
 
Delphi 7 Professional
 
#1

DBGRID Insert verhindern

  Alt 9. Nov 2005, 18:47
Datenbank: Mysql • Zugriff über: MYSQL Access Komponenten
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: DBGRID Insert verhindern

  Alt 9. Nov 2005, 19:00
Du hast normalerweise in deiner MySQL Komponente die Ereignisse BeforeDelete und BeforeInsert. Probier dort mal einfach ein
Abort ; um die Aktion abzubrechen. Zumindest beim BeforeDelete klappt das, beim BeforeInsert hab ich das noch nie probiert.
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#3

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 00:24
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
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#4

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 08:56
Hallo,

ich würde im AfterInsert der Query Cancel ausfhren:
Delphi-Quellcode:
procedure TForm1.Query1AfterInsert(DataSet: TDataSet);
begin
  DataSet.Cancel;
end;
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#5

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 09:37
Zitat von Garby:
ich würde im AfterInsert der Query Cancel ausfhren:
Wieso im AfterInsert? Er will doch gar nix einfügen!?!

Dann besser Jellys Methode im BeforeInsert!
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#6

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 09:44
@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.
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#7

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 09:52
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).
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#8

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 09:59
OK, hast ja recht.
In diesem Fall würde ich kein Problem sehen, das mit Abort zu realisieren.
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
moebus

Registriert seit: 3. Aug 2005
7 Beiträge
 
Delphi 7 Professional
 
#9

Re: DBGRID Insert verhindern

  Alt 10. Nov 2005, 17:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#10

Re: DBGRID Insert verhindern

  Alt 11. Nov 2005, 08:51
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;
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:13 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