Registerkarten in Forms unsichtbar machen

27. August 2007 16:10

Ich möchte programmgesteuert einzelne Registerkarten in Programm-Forms (nicht Reports oder Dataports) ausblenden. Gibt es eine Möglichkeit, hier per Programmcode entsprechend einzugreifen?

27. August 2007 16:20

Verstehe ich nicht ganz ...
Du möchtest z.B. auf der Artikelkarte eine ganze Registerkarte ausblenden?
Dies geht nicht dynamisch (falls erwünscht). Dauerhaft ist das aber möglich.

27. August 2007 16:24

Genau - ich möchte in Abhängigkeit von Parametern in OnInit ganze Registerkarten ausblenden. z.B. soll der Lagerarbeiter zwar die Artikelkarte sehen, jedoch die Registerkarte Fakturierung soll für ihn nicht sichtbar sein

27. August 2007 16:37

Das geht leider nicht. Die Registerkarten sind nämlich als solche gar nicht per Quelltext ansprechbar.

Und selbst, wenn du nun entscheidest, alternativ eine Registerkarte dauerhaft aus der Form zu entfernen, scheitert dieses Vorhaben meist an der Kundenlizenz. Das kommt auf die Programmierkonstellation der Form an.

27. August 2007 17:00

Wir haben bei uns die Felder auf der Artikelkarte benutzergesteuert... (d.h. jeder sieht nur das was er darf, und kann nur das ändern was er darf), ist aber mit administrativem Aufwand verbunden... Das sollte eigentlich auch mit ganzen Forms möglich sein...

27. August 2007 17:03

Da es technisch nicht möglich ist, zur Laufzeit einzelne Registerkarten auszublenden, könntest du doch alternativ auch die einzelnen Controls ausblenden.
Ist zwar deutlich aufwändiger, aber das Ziel ist erreicht: Der Anwender sieht nur das, was er sehen darf.

28. August 2007 01:40

Genau wie Timo sagt, aber das programmieren ist schwierig,
Du musst nämlich die Form so groß machen, das ausserhalb des sichtbaren bereichs die alternativen Tabcontrols platz finden. die logische Größe der Form setzt du dann auf die ursprüngliche Größe der Form und sinnvollerweise verbietest du die Größenänderung und das maximieren der Form.
Im FormOnOpen Trigger setzt du nun die X und Y Werte der verschobenen Tabcontrols auf die ursprünglichen Werde und
setzt die gerade nicht aktiven auf visible=0

28. August 2007 07:46

Ich glaube Timo meinte eher, die einzenlen Felder auf den Register zu steuern.

z.B.
Code:
IF Berechtigt then
  CurrForm."Gen. Prod. Posting Group".VISIBLE(TRUE)
else
  CurrForm."Gen. Prod. Posting Group".VISIBLE(FALSE);


das ist eigentlich nicht so schwierig, nur eine Menge Tipperei.

28. August 2007 08:01

Hi,

wir machen das auch auf Control Ebene, allerdings unterscheiden wir nur pro Company und nicht pro User. Frankreich sieht in dem Fall bestimmte Felder, die England wiederum nicht hat.
Fuer das Setup gibt es eine Tabelle, bei der man den Control Namen zusammen mit dem Company Kuerzel verwalten kann.

Bei jedem Formaufruf (OnInit) wird fuer jedes Control eine Funktion aufgerufen, die diese Eintraege durchsucht und dann entscheidet, ob das Control angezeigt werden soll oder nicht.

Auf Company Ebene ist das noch gut verwaltbar, pro User koennte das aber recht unuebersichtlich werden... :-|

Gruesse
feri

28. August 2007 09:02

rkaufmann hat geschrieben:Ich glaube Timo meinte eher, die einzenlen Felder auf den Register zu steuern.

z.B.
Code:
IF Berechtigt then
  CurrForm."Gen. Prod. Posting Group".VISIBLE(TRUE)
else
  CurrForm."Gen. Prod. Posting Group".VISIBLE(FALSE);


das ist eigentlich nicht so schwierig, nur eine Menge Tipperei.
Genau so hatte ich mir das gedacht. Anstatt die Technologie der Wizards zu verwenden, wo ganze Frames verschoben, ... werden, einfach nur die vielen einzelnen Controls aus- bzw. einblenden.

Es ist nur 1/4 soviel Tipparbeit, wenn man daraus einen Einzeiler macht:
Code:
CurrForm."Gen. Prod. Posting Group".VISIBLE(Berechtigt);
Zuletzt geändert von Timo Lässer am 28. August 2007 09:05, insgesamt 1-mal geändert.

28. August 2007 09:05

Hust, hust... :oops:

war noch zu früh.

Du hast natürlich recht. Mein Code war "nicht optimal".

28. August 2007 09:07

Wir haben für Sonderberechtigungen neue Felder in der Benutzereinrichtung angelegt - so kann man komfortabel die Berechtigungen steueren - hardcoded würde ich das im Code nicht hinterlegen.

mfG
Jürgen

28. August 2007 09:10

Klar, würde ich auch nicht machen.
Sollte ja auch nur Demo-Code sein.

Wie der Inhalt Variable "Berechtigt" zustande kommt, kann dann ja jeder selber steuern, wie's für ihn am besten passt.

28. August 2007 09:12

wilschu, hast du dazu vielleicht noch eine Frage ...? (weil spurlos verschwunden)

28. August 2007 09:23

Super - meine erste Frage hier und eine tolle Resonanz. Wird dann wohl nicht anders gehen, als die Steuerung über die einzelnen Controls durchzuführen. Vielen Dank.

Aber es geht noch weiter: Was ist bei Tabellenforms? Wenn ich da Felder auf not visible setze, kann der Anwender über die Funktion Spalten anzeigen genau diese Felder wieder zum Vorschein bringen lassen. Gibt es dafür auch eine Lösung?

28. August 2007 09:48

IMHO nicht wirklich, außer zusätzliche Forms zu erstellen, die dann je nach Berechtigung designed sind und aufgerufen werden.

Das zieht dann aber u.U. eine Menge Programmierung nach sich.

28. August 2007 10:58

wilschu hat geschrieben:Aber es geht noch weiter: Was ist bei Tabellenforms? Wenn ich da Felder auf not visible setze, kann der Anwender über die Funktion Spalten anzeigen genau diese Felder wieder zum Vorschein bringen lassen. Gibt es dafür auch eine Lösung?

Doch, dafür gibt es auch eine Lösung.
Lager den Programmcode zur Ein-/Ausblendung der Controls in eine Funktion (z. B. EnableControls) aus. (Die Funktion muss sich natürlich auf der Form befinden.
Nun packst du den Funktionsaufruf in den FormTrigger OnActivateForm().

28. August 2007 11:09

Kann der Anwender die so ausgeblendeten Felder nicht mehr einblenden?

28. August 2007 11:48

rkaufmann hat geschrieben:Kann der Anwender die so ausgeblendeten Felder nicht mehr einblenden?

Nein, kann er nicht.
Er kann zwar die Felder in der Spaltenauswahl aktivieren, jedoch sobald er auf OK klickt werden die Felder sofort wieder ausgeblendet, da es ja so im OnActivateForm() steht.
Das Ganze geht so schnell, dass der Anwender noch nicht einmal ein flackern des Bildschirmes bemerken würde.

28. August 2007 12:02

Auf die Idee bin ich noch nicht gekommen.
Wieder was gelernt. Sehr schön.

Werd ich später gleich mal ausprobieren.

24. April 2008 13:37

feri hat geschrieben:Hi,

wir machen das auch auf Control Ebene, allerdings unterscheiden wir nur pro Company und nicht pro User. Frankreich sieht in dem Fall bestimmte Felder, die England wiederum nicht hat.
Fuer das Setup gibt es eine Tabelle, bei der man den Control Namen zusammen mit dem Company Kuerzel verwalten kann.

Bei jedem Formaufruf (OnInit) wird fuer jedes Control eine Funktion aufgerufen, die diese Eintraege durchsucht und dann entscheidet, ob das Control angezeigt werden soll oder nicht.

Auf Company Ebene ist das noch gut verwaltbar, pro User koennte das aber recht unuebersichtlich werden... :-|

Gruesse
feri



Kannst du mir den C/AL Code mal zeigen, wie ruft man denn den CurrForm....Visble auf?
Wie werden die ControlNamen gespeichert?

Danke
Rainer

24. April 2008 13:53

Erst musst du dem Control in dessen Eigenschaften einen Namen geben (Name = xy).

Dann kannst du seine Eigenschaft so zur Laufzeit ändern:
Code:
CurrForm.Controlname.VISIBLE(Bool-Wert)

24. April 2008 21:37

Natalie hat geschrieben:Erst musst du dem Control in dessen Eigenschaften einen Namen geben (Name = xy).

Dann kannst du seine Eigenschaft so zur Laufzeit ändern:
Code:
CurrForm.Controlname.VISIBLE(Bool-Wert)



Soweit schon klar, aber wie mache ich das, wenn das Control aus einer Tabelle gelesen habe?

MeineTabell.lesen

CurrForm.'MeineTabelle.Controlname'.visible ????

24. April 2008 22:14

Dann hast du das falsch verstanden.
Die Funktion wird so verwendet:

Sie wird auf der Tabelle oder Form erstellt. Sie braucht einen Parameter (die Feldnummer) und gibt einen Bool-Wert zurück.
Ich nenne diese Funktion beispielhaft jetzt "FeldAnzeigen"

Die Verwendung der Funktion wird dann so auf der Form verwendet:
Code:
CurrForm.Controlname1.VISIBLE(FeldAnzeigen(FIELDNO("DerFeldname1")));
CurrForm.Controlname2.VISIBLE(FeldAnzeigen(FIELDNO("DerFeldname2")));


Falls dir die Notation nicht zusagt, dann wäre dies hier eine (längere) Alternative:

Code:
// Feld1, Control1
FeldNo := FIELDNO(Feld1);
IF FeldAnzeigen(FeldNo)  THEN
  CurrForm.Control1.VISIBLE(TRUE)
ELSE
  CurrForm.Control1.VISIBLE(FALSE);

// Feld2, Control2
FeldNo := FIELDNO(Feld2);
IF FeldAnzeigen(FeldNo)  THEN
  CurrForm.Control2.VISIBLE(TRUE)
ELSE
  CurrForm.Control2.VISIBLE(FALSE);

25. April 2008 13:22

Hallo Natalie,

danke für deine Erklärung.

Ich war nur irritiert, weil doch jemand geschrieben hat, dass er die Controls in einer Tabelle speichert. Dort ist heinterlegt, ob die Controls zu sehen sind oder nicht.
Diese Tabelle wird gelesen und dann entweder Visible TRUE oder FALSE setzt.

Die Syntax war mir nicht klar, wie man soetwas machen soll.
Wie werden die Controls dort gespeichert, als FieldNo.?