[ gelöst] Dbgrid schreibgeschützt b. Zugriff auf mehrere Tab
-
- Beiträge: 14
- Registriert: Do 22. Mai 2014, 13:03
[ gelöst] Dbgrid schreibgeschützt b. Zugriff auf mehrere Tab
Ich bin nach wie vor neu bei Lazarus und am Probieren, per Lazarus Zugriff auf eine Firebird-Datenbank zu realisieren.
ich habe auf Form1 eine Minianwendung erstellt, die auf meine Tabellen zugreift. (IBConnection, SQLTransaction, SQLQuery, Datasource, DBGrid, DBNavigator.
Ein select * from Kunde funktioniert wunderbar, alles wird in der DBGrid angezeigt, ich kann die Daten auch ändern.
Sobald ich aber Tabellen miteinander verknüpfe, z.B.
'select * from vertrag, kunde where vertrag.kundennummer ' +
' = Kunde.kundennummer';
werden die Daten zwar auch angezeigt, aber die DBGrid ist schreibgeschützt, die Updatefunktionen im DBNavigator sind grau unterlegt, ein Änderung ist nicht möglich.
Geht das einfach nicht oder mache ich einen Fehler, hat jemand eine Idee?
LG
Michael
ich habe auf Form1 eine Minianwendung erstellt, die auf meine Tabellen zugreift. (IBConnection, SQLTransaction, SQLQuery, Datasource, DBGrid, DBNavigator.
Ein select * from Kunde funktioniert wunderbar, alles wird in der DBGrid angezeigt, ich kann die Daten auch ändern.
Sobald ich aber Tabellen miteinander verknüpfe, z.B.
'select * from vertrag, kunde where vertrag.kundennummer ' +
' = Kunde.kundennummer';
werden die Daten zwar auch angezeigt, aber die DBGrid ist schreibgeschützt, die Updatefunktionen im DBNavigator sind grau unterlegt, ein Änderung ist nicht möglich.
Geht das einfach nicht oder mache ich einen Fehler, hat jemand eine Idee?
LG
Michael
Zuletzt geändert von michaschwartz am Mi 8. Okt 2014, 13:37, insgesamt 1-mal geändert.
-
- Beiträge: 14
- Registriert: Do 22. Mai 2014, 13:03
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
Sorry,
auch den verlinkten Beitrag bin ich auch schon gestoßen, aber ich konnte das für mich nicht voll umsetzen und brauche noch eine wenig Hilfe:
Erst heißt es: "Die Fehlermeldung sagt einfach aus, dass man den Schreibzugriff nur verwenden kann, wenn man nicht mehr als eine Tabelle benutzt."
das wäre ja klar, aber es geht noch weiter. Die Empfehlung, über einen View zu arbeiten, habe ich auch versucht. Hier bekomme ich aber bei Updates im dann beschreibbaren DBGrid eine Fehlermeldung, die besagt, dass Zugriffe auf den View nur Readonly möglich seien.
Der Tipp, die Updates händisch zu schreiben, funktioniert bei mir nicht, da ja DBGrid und auch DBedit-Felder schreibgeschützt sind.
Meine Verwirrung ist erst einmal groß.
LG
Michael
auch den verlinkten Beitrag bin ich auch schon gestoßen, aber ich konnte das für mich nicht voll umsetzen und brauche noch eine wenig Hilfe:
Erst heißt es: "Die Fehlermeldung sagt einfach aus, dass man den Schreibzugriff nur verwenden kann, wenn man nicht mehr als eine Tabelle benutzt."
das wäre ja klar, aber es geht noch weiter. Die Empfehlung, über einen View zu arbeiten, habe ich auch versucht. Hier bekomme ich aber bei Updates im dann beschreibbaren DBGrid eine Fehlermeldung, die besagt, dass Zugriffe auf den View nur Readonly möglich seien.
Der Tipp, die Updates händisch zu schreiben, funktioniert bei mir nicht, da ja DBGrid und auch DBedit-Felder schreibgeschützt sind.
Meine Verwirrung ist erst einmal groß.
LG
Michael
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
Ich arbeite z.Zt. mit verschiedenen Datenbanken, einige mit Zugriff per SQLDB, zumeist nutze ich aber Zeos. Da ich zur Ansicht öfters komplexe Selects einsetze, nutze ich dort für Insert, Update und Delete ausschließlich SQL in einer eigenen Klasse und das ist auch gut so.
Das verstehe ich nicht. Das DataSet (Query) vom DBGrid/DBEdit zeigt auf einen Eintrag (Record) mit einer ID / primary Key, mit dessen Angabe du einfach per SQL ein Update oder sonstiges machen kannst.michaschwartz hat geschrieben:Der Tipp, die Updates händisch zu schreiben, funktioniert bei mir nicht, da ja DBGrid und auch DBedit-Felder schreibgeschützt sind.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
eine SQL-Datenbank kennt die Befehle Insert, Update und Delete. Eigentlich müsste man die selbst formulieren. SQLQuery bzw ZQuery bei Zeos machen das für dich automatisch, aber nur dann, wenn du nur eine Tabelle ansprichst, also nur bei einem Select ohne Join.
In deinem Fall musst also den Update selbst schreiben oder ZUpdateSQL by Zeos nutzen,
In deinem Fall musst also den Update selbst schreiben oder ZUpdateSQL by Zeos nutzen,
-
- Beiträge: 14
- Registriert: Do 22. Mai 2014, 13:03
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
Vielen Dank für die Antworten, ich werde jetzt über Zeos zugreifen und schaue, wie mich das weiterbringt.
Eines konnte ich aber noch nicht herausbekommen:
Grüße
Michael
Eines konnte ich aber noch nicht herausbekommen:
Mir ist noch nicht klar, wie ich im Programm erkennen kann, welcher Satz im DataSet der gerade aktuelle ist. Gibt es hier vielleicht auch irgendwo einen Beispielcode, ich konnte das bisher nichts passendes finden.michl hat geschrieben:Das verstehe ich nicht. Das DataSet (Query) vom DBGrid/DBEdit zeigt auf einen Eintrag (Record) mit einer ID / primary Key, mit dessen Angabe du einfach per SQL ein Update oder sonstiges machen kannst.
Grüße
Michael
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
Egal welche Tools du nimmst, wenn du mehrere Tabellen per join zusammenfasst kommst du um SQL-Kenntnisse nicht herum und musst ggf. was selbst formulieren.michaschwartz hat geschrieben:Vielen Dank für die Antworten, ich werde jetzt über Zeos zugreifen
-
- Beiträge: 14
- Registriert: Do 22. Mai 2014, 13:03
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
[
Michael
SQL schreckt mich auch nicht, mich schreckt momentan Lazarus.hde hat geschrieben:Egal welche Tools du nimmst, wenn du mehrere Tabellen per join zusammenfasst kommst du um SQL-Kenntnisse nicht herum und musst ggf. was selbst formulieren.
Michael
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
warum? was ist da schrecklich?michaschwartz hat geschrieben:SQL schreckt mich auch nicht, mich schreckt momentan Lazarus

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
Wie hast Du denn Deine Datensätze definiert? Ist dort eine ID vergeben, wenn ja, dann kannst Du diese z.B. so auslesen:michaschwartz hat geschrieben:Mir ist noch nicht klar, wie ich im Programm erkennen kann, welcher Satz im DataSet der gerade aktuelle ist. Gibt es hier vielleicht auch irgendwo einen Beispielcode, ich konnte das bisher nichts passendes finden.
Code: Alles auswählen
myID:=SQLQuery1.FieldByName('id').AsInteger;
Code: Alles auswählen
procedure TForm1.bUpdateFieldClick(Sender: TObject);
var
ID: Integer;
NeuName: String;
begin
try
ID:=SQLQuery1.FieldByName('id').AsInteger;
Caption:=IntToStr(ID);
NeuName:='Zufallsname'+IntToStr(Random(1000));
SQLQuery3.SQL.Text:='UPDATE personen SET vorname = :avorname WHERE id = :aid;';
SQLQuery3.ParamByName('avorname').AsString:=NeuName;
SQLQuery3.ParamByName('aid').AsInteger:=ID;
SQLQuery3.ExecSQL;
// SQLTransaction1.Commit;
SQLQuery1.Refresh;
except
on e:exception do
ShowMessage(e.Message);
end;
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 14
- Registriert: Do 22. Mai 2014, 13:03
Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen
Vielen Dank,
Ihr habt mir sehr geholfen! Wenn es erst einmal klar ist, dann ist es in der Tat auch einfach.
LG
Michael
Ihr habt mir sehr geholfen! Wenn es erst einmal klar ist, dann ist es in der Tat auch einfach.
LG
Michael