Zellen in einem TIB_Grid editieren ? (erl.)

Alles, was den Programmierer beschäftigt

Moderator: SYNERPY

Antworten
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Zellen in einem TIB_Grid editieren ? (erl.)

Beitrag von Geri12 »

Hallo

Wir haben Masken, in denen die Daten ganz normal in Editfeldern bearbeitet werden, zudem werden die Daten dieser Tabelle aber auch noch in einem TIB_Grid speziell sortiert angezeigt.

Zur Vereinfachung wäre es nun durchaus hilfreich, direkt in dem TIB_Grid in der Zelle den Wert editieren zu können. Keine abhängigen Felder aus anderen Tabellen mit Relationen, nur einfache varchar-Werte. Auf das Grid greifen die selben Rechte wie auf die Maske.

Bestenfalls kann die Änderung in dem Grid direkt vorgenommen werden.
Schlimmstenfalls müsste ich wohl durch ein OnCellClick feststellen, welche Zeile+Spalte angeklickt wurden, die entspr. Zelle rausfinden, dessen Position in der Maske feststellen, ein verstecktes Editfeld genau dorthin positionieren in passender Größe, den Inhalt der Zelle ins Editfeld übertragen, beim Verlassen des Editfeldes über OnExit den editierten Wert in die Zelle bzw. das entspr. Tabellenfeld zurückschreiben und speichern inkl. commit

Hat jemand von Euch so etwas schon einmal gemacht ?
Zuletzt geändert von Geri12 am Mi Jun 17, 2009 1:19 pm, insgesamt 1-mal geändert.
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Alles kein Problem :)

Einfach im ObjectInsector für die Datasource d_1 die Eigenschaft AutoEdit := true setzen.

Jetzt sind alle Spalten allerdings editierbar. Um einzelne zu sperren pro Feld im OnFormShow ReadOnly setzen. (Siehe OnFormShow der FRMV_BQMMINS).

Komplizierter wird es, wenn Spalten einer anderen Query (q_2, q_3 etc.) geändert werden sollen (diesen Teil in Ihrem Fall ignorieren, nur der Komplettheit halber gepostet):
Bei Query > 1
- diese auf ReadOnly := False im OnFormShow setzen (NICHT im ObjectInspector).
- im AfterPost die entsprechende Query refreshen, damit Gespeichert verändert wird (sonst ist ein erneutes Ändern nicht möglich ("Datensatz wurde bereits von einer anderen Person geändert")).
- in der Resource-Datei das AfterPost-Skript aus dem q_1.AfterPost-Event dem AfterPost-Event von Q_x übertragen (Danach Maske einlesen).
- ein Abspeichern der Q_x führt zu einem Refresh der kompletten Maske, wenn das AfterPost der q_1 eingebunden ist. Damit hier nicht sinnlos beispielsweise Sachmerkmale aktualisiert werden, muss dies mittels PostedState abgefangen werden:

Begin
if q_x.PostedState = dssEdit then
#Code#
if q_1.PostedState = dssInsert then
#Code#
End;


(Sollte das Editieren nicht funktionieren, kann das eine lange Reihe von Gründen haben. In diesem Fall bitte die Maske posten.)
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

Hallo admin,
vielen Dank für die schnelle und besonders ausführliche Erklärung. Ich habe die einfachere Variante schon an einer unserer Masken ausprobiert und es funktioniert prima :D Ich bin mir sicher, die 2.Variante wird auch bald zum Einsatz kommen :wink:

Eine kleine Rückfrage hätte ich allerdings noch: das zu ändernde varchar-Feld war ein Pflichtfeld und hatte die Einschränkung auf die Wertemenge {0, 1, 2}. Im Grid kann ich das Feld beim Editieren allerdings leer verlassen bzw. Werte außerhalb des erlaubten Wertebereichs eintragen. Wie wäre so etwas beim Im-Grid-Editieren abzufangen :oops: (Im OnCellLoseFocus-Script ?)
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Immer wieder lustig. Jahrelang braucht das niemand, und nun, wie es der Zufall so will: Wir programmieren das gerade. Genauer gesagt erstellen wir derzeit die Möglichkeit, im Grid für einzelne Felder ComboBoxen zu erstellen. Diese können dann auch mit den möglichen Feldwerten bestückt werden.

Zur NULL-Sache: Hier gibt der Anwender nicht NULL sondern '' ein. Im Feld wird das abgefangen, im Grid allerdings nicht. Dazu im Trigger einfach folgende Zeile einfügen:

Code: Alles auswählen

IF (F_LRTRIM(NEW.FELDXY) = '') THEN NEW.FELDXY = NULL;
Geri12
Beiträge: 589
Registriert: Mi Apr 16, 2008 7:51 am

Beitrag von Geri12 »

So, bin dann jetzt endlich dazu gekommen, mein Beispiel fertigzustellen und ...

:D PRIMA ! :D Vielen Dank ! :D

Habe die Sache noch ein wenig abgerundet, indem ich im BeforeUpdate-Trigger der View bei leerer Rückgabe eine Exception aufrufe.
Ist schöner als eine einfache ISC-Fehlermeldung ...
Gruß
Geri12

Software-Version: V4.2.5.2
FDB-Version: AvERP2008-A.14
MaWi
Beiträge: 3
Registriert: Fr Feb 03, 2012 1:22 am

Re:

Beitrag von MaWi »

admin hat geschrieben:Komplizierter wird es, wenn Spalten einer anderen Query (q_2, q_3 etc.) geändert werden sollen (diesen Teil in Ihrem Fall ignorieren, nur der Komplettheit halber gepostet):
Bei Query > 1
- diese auf ReadOnly := False im OnFormShow setzen (NICHT im ObjectInspector).
- im AfterPost die entsprechende Query refreshen, damit Gespeichert verändert wird (sonst ist ein erneutes Ändern nicht möglich ("Datensatz wurde bereits von einer anderen Person geändert")).
- in der Resource-Datei das AfterPost-Skript aus dem q_1.AfterPost-Event dem AfterPost-Event von Q_x übertragen (Danach Maske einlesen).
- ein Abspeichern der Q_x führt zu einem Refresh der kompletten Maske, wenn das AfterPost der q_1 eingebunden ist. Damit hier nicht sinnlos beispielsweise Sachmerkmale aktualisiert werden, muss dies mittels PostedState abgefangen werden:

Begin
if q_x.PostedState = dssEdit then
#Code#
if q_1.PostedState = dssInsert then
#Code#
End;


(Sollte das Editieren nicht funktionieren, kann das eine lange Reihe von Gründen haben. In diesem Fall bitte die Maske posten.)
Hallo,
gibt es dafür ein Beispiel in einer Maske, das man sich mal anschauen kann?

Im Idealfall würde ich gerne noch einen Schritt weitergehen und das Grid (egal welche Query) erst auf "Knopfdruck" editierbar machen, ist das möglich?
Gruß,
Martin
Antworten