[gelöst]Probleme mit Editierbarkeit

10. Februar 2009 14:31

Hallo,

ich habe folgendes Problem:

Ich greife über das MainForm auf das entsprechende Subform zu. Dort ändere ich die Eigenschaft der Editierbarkeit, wenn gewisse Voraussetzungen gegeben sind. Den Zugriff aufs Subform passiert wie folgt:
[code]
Currform.MySubform.FORM.setEditableTrue;
[\code]
In der Funktion setEditableTrue ist im Subform hinterlegt und dort ganz einfach die Editierbarkeit geändert. Wenn ich es nun in den Forms/Karten teste, Funktioniert es bei einigen Datensätzen und bei anderen nicht. Die Funktion die geschrieben habe ist in den Triggern OnOpenform, OnValidat, OnAfterGetRecord hinterlegt.

Hat jemand eine Idee, warum es mit einigen Datensätzen funktioniert und mit anderen nicht?

Vielen Dank.
Zuletzt geändert von rom am 12. Februar 2009 15:27, insgesamt 1-mal geändert.

Re: Probleme mit Editierbarkeit

10. Februar 2009 15:23

evtl. heisst die Zauber-Zeile:
Currform.UpdateControls();

Re: Probleme mit Editierbarkeit

10. Februar 2009 15:38

MatthiasKönig hat geschrieben:evtl. heisst die Zauber-Zeile:
Currform.UpdateControls();


Hi, leider nicht, aber danke für den Hinweis

Re: Probleme mit Editierbarkeit

10. Februar 2009 18:03

Hallo

Was passiert denn, wenn Du in Deiner Funktion Currform.MySubform.FORM.setEditableTrue;
ein CurrForm.Update(FALSE) aufrufst?

Gruss

Re: Probleme mit Editierbarkeit

10. Februar 2009 23:26

Hallo rom,

kannst du bitte der Quellcode der Funktion zeigen und auch genau beschreiben, wie es deiner Meinung nach funktionieren sollte. Was genau im Unterformular willst auf Editierbar/Nicht editierbar setzen: das ganze Formular, ein Feld durchgehend, eine gewiesse Zeile, oder ein Feld in einer gewissen Zeile? Dann könnte man das Problem sachlich angehen.

Bisher habe ich gesehen, dass das Editieren im Unterformular abhängig von den daten im Hauptformular gesteuert wird, aber nicht vom Hauptformular selbst.

Gruß, Michael

Re: Probleme mit Editierbarkeit

11. Februar 2009 11:20

Hallo,

also im MainForm hab ich eine kleine Funktion, die folgendermaßen aussieht:

Code:
CurrForm.SalesLines.FORM.EDITABLE(TRUE);
IF  ("Sell-to Customer No." <> '') OR ("Sell-to Customer Template Code" <> '') THEN
  CurrForm.SalesLines.FORM.setEditableTrue
ELSE
  CurrForm.SalesLines.FORM.setEditableFalse;


die Funktion setEditableTrue sehen so aus:
Code:
CurrForm.EDITABLE(TRUE);


die False Funktion entsprechend mit False

die obere Funktion wird im onOpenForm- und im OnAfterGetRecord- Trigger aufgerufen. Diese Funktion soll das gesamte Subform auf nicht editierbar setzen, wenn es keine Debitoren gibt.
Wenn ich es auf einen Datensatz stelle und das Form dann neun öffne, funktioniert es. Wenn so durch die Datensätze gehe nicht. Welche Trigger sind denn fürs durch schalten der Datensätze verantwortlich?


Lg

Re: Probleme mit Editierbarkeit

11. Februar 2009 11:35

Hallo noch mal,

ich habe das ganze noch mal debugged und finde es merkwürdig, dass er in dem OnAfterGetRecord-Trigger springt, die Funktion, laut Debuggen, richtig ausführt, ich habe auf dem Subform nichts erkennen kann. Muss ich noch eine andere Funktion ausführen?

Re: Probleme mit Editierbarkeit

11. Februar 2009 11:45

Direkt erkennen kann man da auch nichts, man merkt nur, ob's geklappt hat, wenn man versucht, etwas zu editieren.

Den Code im OnOpen kannst du löschen, der bewirkt da nichts. Es reicht im OnAfterGetRecord ein
Code:
CurrForm.SalesLines.FORM.EDITABLE:=(("Sell-to Customer No." <> '') OR ("Sell-to Customer Template Code" <> ''));


.. sollte es zumindest :-/

Re: Probleme mit Editierbarkeit

11. Februar 2009 12:19

Es klappt leider auch nicht! Schade!

Merkwürdig finde ich, das er die Zeilen auf editierbar setzt, wenn Zeilen hinterlegt sind.

Es funktioniert ganz wunderbar, wenn die Datensätze editerbar sind und dann auf nicht editierbar gesetzt werden sollen. Andersrum funktioniert es nur, wenn es Verkaufszeilen gibt. Dann werden da die Zeilen wieder editierbar. Bei den anderen Funktioniert es dann auch. Ich finde es merkwürdig.

Ist es eventuell ratsam, im Subform die Prüfung zu machen ob im MainForm die Daten vorhanden sind.

Re: Probleme mit Editierbarkeit

11. Februar 2009 13:23

Ich hab das mal nachgebaut. Vielleicht ist es dir ja ein Trost, dass ich das hier nachvollziehen kann ...

Re: Probleme mit Editierbarkeit

12. Februar 2009 08:12

Hallo rom,

wenn du das ganze Subform für Das Editieren sperren willst, ist die von McClane vorgeschlagene Lösung die beste und die einfachste.

Das einzige Problem ist dann, wenn noch keine Zeilen im Subform vorhanden sind. Ich habe das ganze mit verschiedenen Tricks ausprobiert. Wenn aus dem Quellcode das Subform auf EDITABLE := FALSE gesetzt wird, bleibt es ‚taub‘ zu weiteren Aufrufen wie EDITABLE := TRUE. Das ist die Standardeigenschaft eines tabellarischen Formulars. Ich habe auch erreicht, dass es auf die Signalen des Mainforms reagiert, aber mit dem ‚Wiederbeleben‘ klappt es nicht. Ich kann den Benutzer verstehen: wenn die Zeilen vorhanden sind – funktioniert alles wunderbar. Aber wenn er mit der Erfassung beginnt, sicherlich sind die prüfenden Felder noch leer und als Folge die Zeilen noch nicht editierbar. Nach der Eingabe in den beiden Feldern wird von ihm erwartet, dass das Subform sich zum Editieren öffnet. Aber dieses bleibt ‚taub‘. Der geärgerte Benutzer muss das Formular schließen und wieder öffnen bzw. zu anderem Datensatz wechseln und zurück, um mit den Eingaben im Zeilen Bereich fortsetzen zu können. Aber das ist der Preis für solche kundenspezifischen Anpassungen.

Den gewünschten Effekt habe ich doch erreicht. Was Ähnliches habe ich nirgendwo gesehen. Nach langem Testen ist mir eingefallen. Ob du das einsetzen möchtest, ist dir überlassen. Es funktioniert unabhängig von den vorhandenen bzw. nicht vorhandenen Zeilen im Subform. Hier ist die Lösung:

Im Mainform wird das Subform SalesLine kopiert, unter den Namen SalesLineNotEditable eingefügt und genau über/unter dem SalesLines platziert. Das Formular SalesLineNotEditable kriegt die Standard Eigenschaft Editable = No.
Eine Funktion wird definiert:

Code:
SetEditableSalesLines()
IF ("Sell-to Customer No." = '') OR ("Sell-to Customer Template Code" = '') THEN BEGIN
  CurrForm.SalesLines.VISIBLE := FALSE;
  CurrForm.SalesLinesNotEditable.VISIBLE := TRUE;
END ELSE BEGIN
  CurrForm.SalesLines.VISIBLE := TRUE;
  CurrForm.SalesLinesNotEditable.VISIBLE := FALSE;
END;


Die Funktion wird in Form – OnAfterGetRecord(), und OnAfterValidate() jeweiligen Feldes aufgerufen. Das war’s eigentlich. Hier wird einfach mit der anderen Eigenschaft gespielt.

Der einzige Nachteil – wenn die Größe der Felder in z.B. SalesLines geändert wird und im SalesLineNotEditable nicht. Dann wird sich der Benutzer wundern, dass das Subform im editierbaren und nicht editierbaren Modus unterschiedlich aussieht.

Gruß, Michael