[ gelöst] Dbgrid schreibgeschützt b. Zugriff auf mehrere Tab

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
michaschwartz
Beiträge: 14
Registriert: Do 22. Mai 2014, 13:03

[ gelöst] Dbgrid schreibgeschützt b. Zugriff auf mehrere Tab

Beitrag von michaschwartz »

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
Zuletzt geändert von michaschwartz am Mi 8. Okt 2014, 13:37, insgesamt 1-mal geändert.


michaschwartz
Beiträge: 14
Registriert: Do 22. Mai 2014, 13:03

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von michaschwartz »

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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von Michl »

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.
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.
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.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von hde »

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,

michaschwartz
Beiträge: 14
Registriert: Do 22. Mai 2014, 13:03

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von michaschwartz »

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:
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.

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.

Grüße

Michael

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von hde »

michaschwartz hat geschrieben:Vielen Dank für die Antworten, ich werde jetzt über Zeos zugreifen

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
Beiträge: 14
Registriert: Do 22. Mai 2014, 13:03

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von michaschwartz »

[
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.

SQL schreckt mich auch nicht, mich schreckt momentan Lazarus.

Michael

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von hde »

michaschwartz hat geschrieben:SQL schreckt mich auch nicht, mich schreckt momentan Lazarus

warum? was ist da schrecklich? :wink:

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von Michl »

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.
Wie hast Du denn Deine Datensätze definiert? Ist dort eine ID vergeben, wenn ja, dann kannst Du diese z.B. so auslesen:

Code: Alles auswählen

    myID:=SQLQuery1.FieldByName('id').AsInteger

und so könnte z.B. ein Update für MySQL aussehen (musst Du natürlich für Dich anpassen, ich kenne ja Deine Datenbank nicht):

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; 

michaschwartz
Beiträge: 14
Registriert: Do 22. Mai 2014, 13:03

Re: Dbgrid schreibgeschützt bei Zugriff auf mehrere Tabellen

Beitrag von michaschwartz »

Vielen Dank,

Ihr habt mir sehr geholfen! Wenn es erst einmal klar ist, dann ist es in der Tat auch einfach.
LG

Michael

Antworten