[gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 11:29

Hallo

ich habe folgendes Problem, ich soll eine Codeunit schreiben die von jedem Benutzer registriert, welche Tabelle, Form usw. er geöffnet hat.
Jetzt meine Frage: Woher bekomme ich die Informationen über die Tabelle, Form sprich die ID und den Namen???

Ich hoffe ihr könnt mir helfen.
Zuletzt geändert von flowerdog am 30. Juli 2009 16:02, insgesamt 2-mal geändert.

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 13:41

Schau mal in der Onlinehilfe nach OBJECTID.

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 14:04

Soweit ich es verstanden habe gibt es die Obectid aber nur bei Forms und Reports. Ich brauche aber von jedem die Id den type und den namen.

also nochmal ich soll eine Codeunit schreiben die im hintergrund alles was ein user öffnet und beendet registriert. Sprich wen einer eine form öffnet soll da stehen wer die Form geöffnet hat, wann, welche form (id) type= form (oder auch alle anderen) und den namen der form und das ganze dann auc wann es geschlossen wird.

aber mir fehlt die idee wie ich das umsetzen kann. wäre über jede idee sehr dankbar.

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 14:30

Vielleicht eine Idee:

Du könntest jeweils in den Start- und Ende-Triggern der Objekte entsprechende Einträge in einer Protokolltabelle hinterlassen. Allerdings müsstest du dann ALLE Objekte anpassen ...
Das funktioniert für Forms, Reports und Dataports, nicht für Tabellen.
Tritt ein Fehler auf, sind aber auch die Protokolleinträge weg, durch das fehlende COMMIT.

> Soweit ich es verstanden habe gibt es die Obectid aber nur bei Forms und Reports

Nein, alle Objekte haben eine eindeutige Objekt-ID.


Gruß Torsten

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 14:33

Du könntest eine CodeUntit erstellen, die die gewünschten Parameter erwartet.
Diese in jedem Objekt, das Protoklliert werden soll auf dem OnInit Trigger plazieren (bzw. OnCloseForm), z.b.


Code:
// Auf dem OnInit oder OnOpenForm Tigger
Protokollierung.SchreibeEintrag(USERID,DATE,TIME,CurrForm.OBJECTID,'Open')

// Auf dem OnCloseForm Trigger
Protokollierung.SchreibeEintrag(USERID,DATE,TIME,CurrForm.OBJECTID,'Close')


Du musst den Aufruf je nach Objekttyp anpassen, z.B.
Form = CurrForm.OBJECTID
Report = CurrReport.OBJECTID
usw.

Ggg. in der Codeunit die Tabelle 2000000001 mit einbinden, falls du weitere Infoamationen zu den Objekten benötigst.
Ebenso mit dem übersetzten der UserID in Benutzername.

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 14:39

Vielleicht solltest du mal schauen, ob das Änderungsprotokoll nicht eher dem entspricht, was du suchst. Denn da werden Änderungen an den Daten festgehalten, und das ist ja wohl, worum es geht?

Wer will schon wissen, dass ich mir 2 Stunden eine Artikelkarte angeschaut habe ...

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 14:45

Danke mikka! das werde ich gleichmal probieren ob das funktioniert. Kann ich diese idee auch für codeunits und dataports nutzen. wie gesgt ich weiß nur das es die currform.objectid --> für Forms und reports (currreport) gibt.

HI mclane!

auf die idee bin ich auch schon gekommen aber mein Ausbilder möchte das so haben wieso auch immer :( Und ich soll das programmieren :-)

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 14:59

sorry das ich so blöd frage aber kann mir mal jemand genau erklären, wie ich in einer Form eine codeunit mit funktion aufrufe bzw. die funktion der codeunit aufrufe. Ich habe da noch nie gemacht.

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 15:12

  1. Erstelle eine "Protokoll-Tabelle"
    • Datum [Date]
    • Zeit [Time]
    • User ID [Code20]
    • Objektart [Option:Table,Form,Report,Dataport,XMLport,Codeunit]
    • Objekt-ID [Integer]
    • Objekt Aktion [Text30]
  2. Erstelle eine neue Codeunit
    • Erstelle dort eine Funktion "SchreibeEintrag"
    • Definiere dort über die Locals die Parameter ObjectType [Integer], ObjectID [Integer], ObjectAction [Text30]
    In dieser Funktion schreibst du die übergebenen Werte in die neue Tabelle
    Code:
    Log.INIT;
    Log.Datum := TODAY;
    Log.Zeit := TIME;
    Log."User ID" := USERID;
    [...]
    Log.INSERT;
  3. In den zu protokollierenden Objekten:
    • Definiere eine globale Variable vom Typ Codeunit, welche auf deine neue Codeunit verweist
    • Schreibe in den OnOpenForm-Trigger
      Code:
      LogCU.SchreibeEintrag(1,4711,'Open'); // 1 = Form, 4711 = Form-ID
    • Sinngemäß gehört dann in den OnClose-Trigger
      Code:
      LogCU.SchreibeEintrag(1,4711,'Close'); // 1 = Form, 4711 = Form-ID

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 15:15

flowerdog hat geschrieben:auf die idee bin ich auch schon gekommen aber mein Ausbilder möchte das so haben wieso auch immer :( Und ich soll das programmieren

Für alle 5000 (oder wieviel auch immer) Objekte? Hast du ihn geärgert? :wink:

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 15:34

Danke Timo :-)!

der dritte punkt hätte auch ausgereicht. wollte nur wissen wie ich die codeunit in einer Form aufrufe. Ich programme nochmaler forms, tabellen und reports aber codeunits habe ich zwar schon programmiert aber noch nie aufgerufen. :-) bin halt Lehrling da muss man nicht alles können

für Mclane

nein nicht das ich wüsste, ich bin doch ganz brav :-)!

Re: Hilfe!!! Wie Komme ich an die ID von Forms usw.?

30. Juli 2009 16:41

flowerdog hat geschrieben:Danke mikka! das werde ich gleichmal probieren ob das funktioniert. Kann ich diese idee auch für codeunits und dataports nutzen. wie gesgt ich weiß nur das es die currform.objectid --> für Forms und reports (currreport) gibt.


Ich denke das Timo dir bereits das wesentliche geschrieben hat.
In Objekten in denen die ID nicht ausgelesen werden kann, kannst du wie Timo geschrieben hat statt "CurrForm.OBJECTID" auch 50012 (also die Nummer des Objektes) "zu Fuß" eintragen.

:greenarrow: Heißer Tipp
Bzgl. des Eintragen in in allen Objekten. Exportiere alle auf einmal als Textdatei (am Besten je Typ 1x).
Im Texteditor die korrekte Stelle (also den Aufruf der CodeUnit) per Suchen & Ersetzten einfügen.
Dann wieder Importieren und Compilieren (mach das aber auf jeden Fall auf einer Test-DB!!!)
Das sollte dir ein paar Tage Arbeit ersparen :mrgreen:
(Müsste zumindest bei Forms und Reports klappen, da hier die ID ausgelesen werden kann)

<Offtoppic> Du must es nicht hervorheben, das du im ersten Lehrjahr bist. Jeder hat irgendwann mal angefangen. Ich fühle mich auch manchmal als wäre ich noch im Praktikum und muss alles neu lernen :lol: </Offtoppic>

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 08:30

Morgen!

Ich habe da nochmal eine Anfängerfrage: von welchem Typ sind die USERID und die OBJECTID? Bzw. gibt es eine Möglichkeit die Typen (int, text boolean usw.) von den genannten Sachen raus zu bekommen?
Zuletzt geändert von flowerdog am 31. Juli 2009 09:46, insgesamt 1-mal geändert.

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 09:26

flowerdog hat geschrieben:Morgen!

Ich habe da nochmal eine Anfängerfrage: von welchem Typ sind die USERID und die OBJECTID? Bzw. gibt es eine Möglichkeit die Typen (int, text boolean usw.) von den genannten Sachen raus zu bekommen?

Bitte künftig nicht einen Beitrag Posten und wieder löschen, das bringt den Thread durcheinander


USERID = CODE(20) (Das kann u.a. daran erkannt werden, das diese automatisch groß geschrieben werde und Leerstellen am Anfang und Ende gelöscht werden)
ObjektId )= Text(30)

:greenarrow: Noch ein Tipp (Ab welcher Version das geht, weiß ich nicht!).
Bei mir hat es Jahre gedauert, dieses zu entdecken :roll:

Bei den "versteckten" Tabellen können wir leider nicht sehen von welchem Typ die Felder sind (zumindest nicht direkt!).
(Dieses ist auch beim täglichen Programmieren hilfreich, um nicht ständig nachschauen zu müssen: "was für ein Feld bist du"!)
Eine Variante sich den Typ und die Länge anzeigen zu lassen ist,
a. die Tabelle in irgendeinen Objekt in den Variablen definieren
b. Das gewünschte Feld im Code plazieren
c. Mit der Maus (bzw. dem Cursur) auf das Feld gehen (rechts vom Punkt!)
-->Es wird unten links in der Statusleiste das Feld angezeigt (siehe Screenshot)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 09:33

mikka hat geschrieben:USERID = CODE(20) (Das kann u.a. daran erkannt werden, das diese automatisch groß geschrieben werde und Leerstellen am Anfang und Ende gelöscht werden)

Wenn die DB auf SQL läuft, kann die UserId allerdings auch klein sein, also text.

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 09:44

Hallo Flowerdog,

Die USERID sollte vom Type Code20 sein (Tabelle User), die OBJECTID vom Typ integer.

Aber ich muss MacLane beipflichten, entweder du hast deinen Ausbilder geärgert, oder wollte dich für eine Woche loswerden :mrgreen:.
(Einen KFZ-Auszubildenden würde man ins Lager schicken, um einen Liter Hubraum zu holen. :-D )

Was du allerdings hierbei lernen kannst, wo es Sinn macht deine Funktion einzufügen. Denn es ist sicherlich Blödsinn, die Funktion im OnOpen einer Auftragssubform einzubauen, denn die kann man immer nur zusammen mit der Hauptform benutzen. Für Tabellen und Codeunits kannst du das eh nicht benutzen, da es kein OnOpen einer bei einer Tabelle gibt. Du könntest das nur über die FORM lösen, die mit einer Tabelle verknüpft ist. Bei einer Codeunit müsstest du den Aufruf deiner Codeunit in jede globale Funktion der CU einbauen, da es auch hier kein OnOpen gibt.
Was du dann noch berücksichtigen müsstest, sind die Transaktionen. Fängst du in einem Form eine Schreibtransaktion (dein Protokoll wäre sowas) an, darfst du danach keine RunModals mehr machen, bis ein Commit gemacht wurde. Machst du aber bei jedem Eintrag in dein Protokoll, bringst du die Transaktionssicherheit des Systems durcheinander.
Was passiert denn, wenn deine Transaktion abgebrochen wurde, soll das Protokoll dann trotzdem geschrieben werden? (Das geht nicht, siehe oben).
Wenn du es aber wider erwarten doch geschafft hast, das ganze zum laufen zu bringen, hast du dir mal vorgestellt, was mit deinem Protokoll passiert, wenn jemand eine Rechnung bucht? :roll:

Was du machen sollst, gleicht etwa dem hier :wink:

Gruß, Fiddi

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 09:48

so alles wieder gerade gerückt.

Danke für die antwort.

Die genannte Tabelle 2000000001 ist bei mir nicht zu sehen also unsichtbar.

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 09:51

DieObjectID ist nicht vom Typ integer sie gibt folgendes zurück den typ und den namen also bei einer form zum beispiel Form Kfz Daten. Nicht die nummer die diese Form hat das ist jetzt das nächste Problem, wie bekomme ich diese nummer???

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 10:08

So zB:
Code:
evaluate(DeinInt,DELCHR(DeinText,'=',(DELCHR(DeinText,'=','0123456789'))));

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 10:09

Du hast recht, ObjectID ist eine Funktion des Reports oder der Form (und NUR der, zumindest laut C/Side-Hilfe :wink: ), die einen Text zurückliefert. Dieser Text enthält je nach Parameter den Namen oder die Nummer mit Typ vornedran.

Die Tabelle Object sehe ich auch nicht. Es gibt aber einen Trick um an die versteckten Tabellen heranzukommen: Mache eine neue Form mit der Tabelle z.B. Object als Basis.

Gruß, Fiddi

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 10:14

fiddi hat geschrieben:Die Tabelle Object sehe ich auch nicht. Es gibt aber einen Trick um an die versteckten Tabellen heranzukommen: Mache eine neue Form mit der Tabelle z.B. Object als Basis.


Danke werde ich gleich mal ausprobieren

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 11:38

Wir müssen hier zwischen dem Befehl OBJECTID und der Object.ID unterscheiden.

OBJECTID(TRUE) liefert einen Text zurück, welcher aus dem Objekttyp und der Object-Caption besteht. Da alleine schon die Caption 80 Zeichen lang werden kann, müsste das aufnehmende Feld mindestens 87 Zeichen groß sein (Report ReportCaption).
OBJECTID(FALSE) liefert einen Text zurück, welcher aus dem Objekttyp und der Object-ID besteht. Diesen kann man wunderbar in Objecttyp und Object-ID zerlegen und spart massig Platz und Programmieraufwand. (Report 4711)

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

31. Juli 2009 12:40

Danke Timo!

das macht die sache leichter.

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

26. November 2009 10:51

Hallo,

ich brauche ebenfalls eine Möglichkeit alle aufgerufenen Reports zu protokollieren.
Der Hintergrund ist, das es bei uns im System sehr viele Reports gibt, die nicht benutzt werden und um festzustellen welche benutzt werden hätten wir jetzt auch an eine derartige Codeunit gedacht. So möchten wir dann nach einiger Zeit die Reports die nicht in der Protokoll-Tabelle auftauchen aus dem System entfernen um wieder freie Report-ID´s zu schaffen.
Wir haben jetzt die Codeunit und die Tabelle nach der Anleitung von Timo nachgebaut und das funktioniert soweit auch schon ganz gut!
Als erstes Feld in der Tabelle haben wir jetzt zusätzlich noch eine laufende Nummer eingebunden.
Jetzt habe ich allerdings folgendes Problem. Beim ersten mal einen Report ausführen klappt noch alles wunderbar, also wenn die Tabelle noch leer ist.
Beim zweiten mal Report ausführen kommt aber die Fehlermeldung ""Protokoll Tabelle Nummer '1' existiert bereits." Jetzt bin ich auf der Suche nach einer Möglichkeit diese laufende Nr. hochzählen zu lassen. Mit folgendem Code funktioniert es aber noch nicht:
Code:
Log.INIT;
Log.Nummer := Log.Nummer + 1;
Log.Datum := TODAY;
Log.Zeit:= TIME;
Log."User ID":= USERID;
Log."Objekt ID":= ObjectID;
Log."Objekt Aktion" := ObjectAction;
Log.INSERT;

Hat von euch vielleicht jemand eine Idee wie ich das lösen könnte??

Gruß,
D_Gross

Re: [gelöst] Hilfe!!! Wie Komme ich an die ID von Forms usw.?

26. November 2009 10:58

Code:
if Log2.findlast then
  Log.Nummer:=Log2.Nummer+1
else
  Log.Nummer:=1;

Oder Nummer auf Autoincrement stellen. Wobei die Meinungen darüber wohl zweigeteilt sind.