[Gelöst] Flow Field auf Object Tabelle

12. August 2010 12:11

Hallo,

ich bastel ja fleißig an meinem Objektverwaltungs-Tool, und bin dabei auf ein kurioses Problem gestossen, auf dass niemand eine Antwort zu haben scheint.

Ich habe eine Übersicht in welcher ich Objekte eintragen kann, die zur Programmierung "reserviert" werden können. Dazu habe ich eine neue Tabelle erstellt. Als Grundlage diente mir die Object-Tabelle + ein paar zusätzliche Felder die wir gerne dabei hätten. Den Object Namen habe ich als FlowField auf die System object Tabelle verwiesen. Funktioniert alles einwandfrei.

Jetzt haben wir festgestellt, dass wenn ich eine Codeunit mit einer ID >= 100 eintrage, das FlowField mir den Namen nicht zieht. Bis Codeunit 100 klappt das super und auch bei den anderen Types gibt es keine Probleme mit dem Namen.
Nur in der Konstellation Codeunit & >= 100 setzt es aus.

Ich dachte schon ich hab den Namen im Option-Feld falsch geschrieben, aber dann würde es ja bei gar keiner CU klappen.
Ein CalcFields mach ich auch beim Aufruf der Form... also woran könnte es denn sonst noch liegen?

Navision 2009 SP1

Bitte, habt Ihr vielleicht eine Idee?

Dankeschön
Juliane
Zuletzt geändert von JuDra am 30. August 2010 09:12, insgesamt 1-mal geändert.

Re: Flow Field auf Object Tabelle

12. August 2010 12:30

Ich revidiere:

Codeunits lassen sich nur bis 13 eintragen. Ab dann zieht er den Namen nicht mehr :-?

Re: Flow Field auf Object Tabelle

12. August 2010 12:45

Das lässt sich zumindest in Nav5 nicht nachvollziehen :-?

Re: Flow Field auf Object Tabelle

13. August 2010 13:06

1. Es gibt bereits ein kostenloses Tool zur Objektverwaltung http://www.mibuso.com/dlinfo.asp?FileID=826. Muß man sich etwas mit beschäftigen, aber dann ist es richtig gut.
2. Bei der CalcFormula des FlowFields darauf achten, daß "Company Name" auch richtig gefiltert ist [Company Name=FILTER('')].
3. Funktioniert bei mir einwandfrei in NAV 2009 SP1 Classic Client.

Re: Flow Field auf Object Tabelle

23. August 2010 09:48

Entschuldigt, ich war im Urlaub :wink:

@McClane:
Komisch, gell?! Ich hab keine Ahnung wo ich ansetzen soll.

@HattrickHorst:
zu 1.: Ziel war die Umsetzung einer eigenen Lösung, und die ist ja fast fertig, bis auf den "lustigen" Fehler.
zu 2.: Worauf bezieht sich diese Antwort? Auf das Tool von Mibuso, oder allgemein auf die Object-Tabelle?

Vielleicht hat ja noch Jemand ein Idee????

VG
Juliane

Re: Flow Field auf Object Tabelle

23. August 2010 12:40

JuDra hat geschrieben:zu 1.: Ziel war die Umsetzung einer eigenen Lösung, und die ist ja fast fertig, bis auf den "lustigen" Fehler.

Ich wollte ja nur sagen, daß man das Rad nicht neu erfinden muß und man sich hier auch noch ein paar Ideen abkupfern kann. Kommt ja auch immer darauf an, was man für Ansprüche an eine Lösung hat. Vielleicht paßt das ja gar nicht für euch, aber ein paar Tipps kann man sich an der Stelle bestimmt holen.

JuDra hat geschrieben:zu 2.: Worauf bezieht sich diese Antwort? Auf das Tool von Mibuso, oder allgemein auf die Object-Tabelle?

Allgemein. Einige NAV Versionen haben ein Problem mit CONST('') und kommen nur mit FILTER('') klar. Einfach mal testen, CONST durch FILTER zu ersetzen.
Zuletzt geändert von HattrickHorst am 24. August 2010 14:01, insgesamt 1-mal geändert.

Re: Flow Field auf Object Tabelle

24. August 2010 12:14

Dankeschön, ich schau mir das mal an und meld mich wieder...

Grüße
Juliane

Re: Flow Field auf Object Tabelle

26. August 2010 09:51

Hallo, ich bins mal wieder...

Also es scheint wirklich ein Problem mit dem FlowField - Filter zu sein! Danke für den Tipp!

Kann mir vielleicht jemand den Primary Key von der Objects Tabelle sagen?
Bis jetzt bin ich von Type,Company Name, ID ausgegangen...

Dankeschön
Juliane

Re: Flow Field auf Object Tabelle

26. August 2010 09:55

JuDra hat geschrieben:Kann mir vielleicht jemand den Primary Key von der Objects Tabelle sagen?
Bis jetzt bin ich von Type,Company Name, ID ausgegangen...

Ist auch korrekt.

Re: Flow Field auf Object Tabelle

26. August 2010 10:00

Dankeschön, die Suche geht weiter.... :wink:

Re: Flow Field auf Object Tabelle

26. August 2010 10:12

Du könntest ja mal dein FlowField-Objekt hier als Txt einstellen, dann können wir dir sicher besser weiterhelfen. Immerhin haben schon zwei Leute bestätigt, daß es bei ihnen geht. Also ist es wahrscheinlich wieder mal so ein winziger Haken oder sowas, der einfach nicht sofort ins Auge fällt. :wink:

Re: Flow Field auf Object Tabelle

26. August 2010 10:55

Ok, ich mußte jetzt erstmal nachlesen, wie das mit dem Code einfügen funktioniert, sorry.
Ich hab jetzt die komplette Tabelle kopiert. Feld Nr. 7 und 8 sind die FlowFields.

Ich hab auch schon versucht den Company Name Filter von Field auf Filter("") zu setzen, aber das bringt leider gar nichts...

Bin für jeden Vorschlag dankbar.
Juliane

Code:
OBJECT Table 61954 Obj. Admin. ReserveObject
{
  OBJECT-PROPERTIES
  {
    Date=26.08.10;
    Time=10:07:47;
    Modified=Yes;
    Version List=ESCA#JD#00004#1.01;
  }
  PROPERTIES
  {
    OnInsert=BEGIN
               CALCFIELDS("Object Name","Version List");
               IF NOT fktNewObject THEN
                 new:= TRUE;
               IF fktblockObject(No) THEN
                 reserved:=TRUE
               ELSE BEGIN
                 blocked:= TRUE;
               END;
             END;

    CaptionML=[DEU=Obj. Verwaltung Reservierte Objekte;
               ENU=Obj. Admin Reserved Objects];
  }
  FIELDS
  {
    { 1   ;   ;No                  ;Code20         }
    { 2   ;   ;Type                ;Option        ;OptionString=TableData,Table,Form,Report,Dataport,XMLport,Codeunit,MenuSuite,Page }
    { 3   ;   ;Company Name        ;Text30         }
    { 4   ;   ;ID                  ;Integer        }
    { 5   ;   ;Object Name         ;Text100       ;FieldClass=FlowField;
                                                   CalcFormula=Lookup(Object.Name WHERE (Type=FIELD(Type),
                                                                                         Company Name=FILTER(''),
                                                                                         ID=FIELD(ID)));
                                                   CaptionML=[DEU=Objekt Name;
                                                              ENU=Object Name] }
    { 6   ;   ;blocked             ;Boolean       ;CaptionML=[DEU=gesperrt;
                                                              ENU=blocked] }
    { 7   ;   ;modified            ;Boolean       ;FieldClass=FlowField;
                                                   CalcFormula=Lookup(Object.Modified WHERE (Type=FIELD(Type),
                                                                                             Company Name=FIELD(Company Name),
                                                                                             ID=FIELD(ID))) }
    { 8   ;   ;Version List        ;Text80        ;FieldClass=FlowField;
                                                   CalcFormula=Lookup(Object."Version List" WHERE (Type=FIELD(Type),
                                                                                                   Company Name=FIELD(Company Name),
                                                                                                   ID=FIELD(ID))) }
    { 9   ;   ;new                 ;Boolean       ;CaptionML=[DEU=neu;
                                                              ENU=new] }
    { 10  ;   ;reserved            ;Boolean       ;CaptionML=[DEU=reserviert;
                                                              ENU=reserved] }
    { 11  ;   ;DatabaseName        ;Option        ;CaptionML=[DEU=DatenbankName;
                                                              ENU=Database Name];
                                                   OptionString=w1,_DE_addon }
  }
  KEYS
  {
    {    ;No,Type,Company Name,ID                 ;Clustered=Yes }
  }
  FIELDGROUPS
  {
  }
  CODE
  {
    VAR
      Text001@1000000003 : TextConst 'DEU=Dieses Objekt;ENU=This Object';
      Text002@1000000002 : TextConst 'DEU=wird bereits von ObjverwaltungsNr.;ENU=is already blocked by Object Administration No.';
      Text003@1000000001 : TextConst 'DEU=gesperrt.;ENU=.';
      recObjAdminHeader@1000000000 : Record 61950;
      recobject@1105100000 : Record 2000000001;

    PROCEDURE fktNewObject@1000000000() : Boolean;
    BEGIN
      IF recobject.GET(Type,"Company Name",ID) THEN BEGIN
        CALCFIELDS("Object Name", "Version List");
        IF ("Object Name" <> '') OR ("Version List" <> '') THEN
          EXIT(TRUE);
        EXIT(FALSE);
      END;
    END;

    PROCEDURE fktblockObject@1000000001(parObjAdminHeaderNo@1000000001 : Code[20]) : Boolean;
    VAR
      recReservedObj@1000000000 : Record 61954;
    BEGIN
      recObjAdminHeader.INIT;
      recObjAdminHeader.GET(parObjAdminHeaderNo);
      //Wenn Objekt bereits woanders! gesperrt, dann reservieren
      recReservedObj.INIT;
      recReservedObj.SETRANGE(recReservedObj.Type,Type);
      recReservedObj.SETRANGE(recReservedObj."Company Name","Company Name");
      recReservedObj.SETRANGE(recReservedObj.ID,ID);
      recReservedObj.SETRANGE(recReservedObj.DatabaseName,DatabaseName);

      //wenn Status im Kopf nicht abgeschlossen ist
      IF recObjAdminHeader.Status <> recObjAdminHeader.Status::abgeschlossen THEN BEGIN
        IF recReservedObj.FINDSET(FALSE,FALSE) THEN BEGIN //ist dieses Objekt bereits woanders vorhanden?
          REPEAT
            IF recReservedObj.blocked THEN BEGIN //wenn dieses bereits gesperrt, dann reservieren
              MESSAGE(Text001 + ' ' + FORMAT(Rec.Type) + ' ' + FORMAT(Rec.ID) + ' ' + Rec."Object Name"
              + ' ' + Text002 + ' ' + recReservedObj.No + ' ' + Text003);
              recObjAdminHeader.Status:=recObjAdminHeader.Status::reserviert;
              recObjAdminHeader.MODIFY;
              EXIT(TRUE);
            END;
          UNTIL recReservedObj.NEXT = 0;
        END ELSE BEGIN //ansonsten sperren
          recObjAdminHeader.Status:=recObjAdminHeader.Status::freigegeben;
          recObjAdminHeader.MODIFY;
          EXIT(FALSE);
        END;
      END;
    END;

    PROCEDURE fktreserveObject@1000000002();
    VAR
      recReservedObject@1000000000 : Record 61954;
    BEGIN
      //reserviert alle Objekte obwohl manche auch gesperrt h„tten werden k”nnen
      recReservedObject.INIT;
      recReservedObject.SETRANGE(recReservedObject.No,No);
      recReservedObject.SETRANGE(recReservedObject.Type,Type);
      recReservedObject.SETRANGE(recReservedObject."Company Name","Company Name");
      recReservedObject.SETRANGE(recReservedObject.ID,ID);
      recReservedObject.SETRANGE(recReservedObject.DatabaseName, DatabaseName);

      IF recReservedObject.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          blocked:= FALSE;
          reserved:= TRUE;
          MODIFY;
        UNTIL recReservedObject.NEXT = 0
        END;
    END;

    BEGIN
    END.
  }
}

Re: Flow Field auf Object Tabelle

26. August 2010 11:08

JuDra hat geschrieben:Ich hab auch schon versucht den Company Name Filter von Field auf Filter("") zu setzen, aber das bringt leider gar nichts...

Ist das ein Tippfehler? Es müssen zwei einzelne Hochkommata ' sein, keine Anführungszeichen ".

Ist das Feld Company Name immer ordentlich gefüllt?

Re: Flow Field auf Object Tabelle

26. August 2010 11:16

War ein Tippfehler, sorry :wink:

Company Name ist immer leer. Sowohl in der Objects Tabelle als auch in meiner... Ich weiß nicht woran das liegt.
Wenn ich die Objects-Tabelle öffne, kommen zuerst alle Objekt ohne Mandanten und danach folgen die gleichen mit den einzelnen Mandanten...

Juliane

Re: Flow Field auf Object Tabelle

26. August 2010 11:26

Also, bei mir geht es.
Company Name brauchst du nicht als eigenes Feld, wenn du das nur in den FlowFields verwenden möchtest. Hier reicht wie gesagt FILTER('').

JuDra hat geschrieben:Wenn ich die Objects-Tabelle öffne, kommen zuerst alle Objekt ohne Mandanten und danach folgen die gleichen mit den einzelnen Mandanten...

Es müßte umgekehrt sein. Erst kommen die einzelnen Mandanten und dann alles ohne Mandant. Das liegt daran, daß hier unterschiedliche Dinge in einer Tabelle stehen. Und hier wird auch dein Problem sein. Die ersten Einträge sind vom Type TableData, d.h. es geht um die Definition der Daten, die in den einzelnen Tabellen gespeichert werden. Dann kommt der Type Table, damit ist die reine Tabellendefinition gemeint. Und auf diesen Type mußt du auch bei den FlowFields filtern. Das siehst du auch, wenn du vorne in deiner Tabelle unter Type Table, statt TableData angibst, dann geht es auch.

P.S. Nicht vergessen, den Datensatz zu aktualisieren.

Re: Flow Field auf Object Tabelle

26. August 2010 11:55

Ich würde mal vermuten, dass es daran liegt, dass deine Optionen für das Feld Type sich von denen der Tabelle Object unterscheiden. Du hast XMLport und Codeunit vertauscht.
Code:
Dein Feld Type:
TableData,Table,Form,Report,Dataport,XMLport,Codeunit,MenuSuite,Page

Object:
TableData,Table,Form,Report,Dataport,Codeunit,XMLport,MenuSuite,Page,,System,FieldNumber

Re: Flow Field auf Object Tabelle

30. August 2010 09:02

Vielen lieben Dank McClane, dass wars!
Ich hab's gerade ausführlich getestet.

Gehört der Rest nach Page auch noch alles dazu?

Wo finde ich das, wenn ich nochmal in diese Verlegenheit gerate? Auf die Objects kann ich ja nicht so ohne Weiteres zugreifen?

Dankeschön
Juliane

Re: [Gelöst] Flow Field auf Object Tabelle

31. August 2010 09:38

JuDra hat geschrieben:Gehört der Rest nach Page auch noch alles dazu?

Wo finde ich das, wenn ich nochmal in diese Verlegenheit gerate? Auf die Objects kann ich ja nicht so ohne Weiteres zugreifen?

Die Optionen hinter Page sagen mir nichts. In meinen Objects gibt es auch nichts, wenn ich darauf filtere.

Und an den Optionstring des Feldes Type kommst du zB, indem du dir fix im Formdesigner eine Form auf die Tabelle Objects erstellst und dort in die Eigenschaften des Feldes schaust. Das dürfte so am Schnellsten gehen.