Home Forum Nuclos Konfiguration Vorgänge und Objekte Kontakthierarchien (rekursive SQL-Abfragen)

Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
  • Autor
    Beiträge
  • #3891

    Hallo Nuclos-Community, hallo Nuclos-Entwickler.

    Seit wenigen Tagen spiele ich mit Nuclos herum und probiere, was so alles geht.

    Zunaechst einmal spreche ich grossen Respekt an die Entwickler und Planer von Nuclos aus. Eine feine Sache.

    Mein erster Post hier ist auch keine Kritik, Fehlermeldung oder ein Problem. Vielmehr moechte ich eine Idee mit euch teilen und bin sehr an eurer Meinung dazu interessiert.

    Ein Problem bei vielen CRM- / ERP-Loesungen ist die Zuordnung von Anspechpartnern zu Firmen, Kontakten usw., irgendwann ist mann mit der gegebenen Stuktur zu unflexibel und kann tatsaechliche Strukturen nicht abbilden. Meine Idee dazu ist es, dass „alles“ ein Kontakt ist. Diese Entitaet hat auch nur die Eigenschaft (formatierter) Name und kann wiederum mit beliebig vielen Kontakten verknuepft sein (cn:cm). An einen solchen Kontakt haenge ich, je nach Kontaktart eine oder mehrere der Entitaeten Person, Organisation (Firmen, Vereine, Behoerden), Kunde, Lieferant oder Mitarbeiter (intern) oder keine der genannten, wenn es sich um einen „Strukturkontakt“ (Niederlassung, Abteilung) handelt. Es gibt naturlich weitere Entitaeten, die an den Kontakt angehangen werden koennen (Telefon, eMail, URL, Anschrift …).

    Soweit die Struktur meines „Adressbuchs“. Es koennen komplexe Hierarchien abgebildet aber auch einfache Firma – Ansprechpartner – Zuornungen vorgenommen oder auch Stammbaume abgebildet werden.

    Um nun im Kontaktformular ein Unterformular mit allen unter- und uebergeordneten Kontaken darstellen zu koennen habe ich in Nuclos eine Dynamische Entitaet erstellt. Ihr liegt folgende SQL-Abfrage zugrunde:


    select
    intid,
    intid_t_ud_genericobject,
    /* we need this outer-select-wrapper since nuclos prohibits to use
    non-select statements and maybe for appending a with clause to
    select the concerning contact */
    level,
    fn
    from (
    with recursive
    /* first, we select all contacts and initialize the level counters,
    the path arrays and cycle detectors */
    initialize(root_id, id, fn, type, parent_id, level, path, cycle) as (
    select
    k.intid,
    k.intid,
    k.strfn::text,
    null::text,
    null::numeric,
    0,
    array[k.intid::int],
    false
    from
    v_eo_kontakt k
    ),
    /* now we query for all ancestor nodes in the contact tree,
    increment the level counter, append nodes to the path and
    care for circles in the graph */
    ancestors(root_id, id, fn, type, parent_id, level, path, cycle) as (
    select
    root_id, id, fn, type, parent_id, level, path, cycle
    from
    initialize
    union all select
    t.root_id,
    o.intid_stroben,
    o.strvalue_stroben,
    o.strbeziehungstyp,
    o.intid_strunten,
    t.level + 1,
    path || o.intid_strunten::int,
    o.intid_stroben = any(path)
    from
    v_eo_kontaktordnung o
    inner join
    ancestors t on o.intid_strunten = t.id
    where
    not cycle
    ),
    /* the same for descendant contact nodes */
    descendants(root_id, id, fn, type, parent_id, level, path, cycle) as (
    select
    root_id, id, fn, type, parent_id, level, path, cycle
    from
    initialize
    union all select
    t.root_id,
    o.intid_strunten,
    o.strvalue_strunten,
    o.strbeziehungstyp,
    o.intid_stroben,
    t.level + 1,
    path || o.intid_stroben::int,
    o.intid_strunten = any(path)
    from
    v_eo_kontaktordnung o
    inner join
    descendants t on o.intid_stroben = t.id
    where
    not cycle
    )
    /* concatenate ancestors and descendant into one result set and prepend
    the level with a direction indicator
    (o = oben/over for ancestors, u = unten/under for descendants */
    select
    root_id as intid_t_ud_genericobject,
    id as intid,
    'O:' || level as level,
    fn || ' (' || type || ')' as fn
    from
    ancestors
    where
    id != root_id
    union all select
    root_id as intid_t_ud_genericobject,
    id as intid,
    'U:' || level as level,
    fn || ' (' || type || ')' as fn
    from
    descendants
    where
    id != root_id
    ) as outer_wrapper

    Das funktioniert super, ein Doppelklick in die Liste und die Detailansicht des Kontaktes wird geoffnet.

    PostgreSQL kann seit 8.4 und MSSQL seit 2005 (glaube ich gelesen zu haben) mit solch rekursiven SQL-Abfragen umgehen.

    Bitte teilt mir eure Meinung oder Erfahrung besonders hinsichtlich Performanz (meine Kontaktliste ist relativ klein) dazu mit.

    Danke

    Daniel

    #3892
    Markus Glitzner
    Teilnehmer

    Hallo Daniel!

    Ich hab mich die Letzen beiden Tage auch mit Rekursiven Strukturen herumgespeilt. Bei mir ging es allerdings um Auftragspositionen, genauer gesagt wollte ich Setartikel abbilden.

    Da ich bei der Entwicklung und Anwendung einige Probleme hatte und im Prinzip nur eine Ebene benötige, hab ich das Ganze mit separaten Tabellen gelöst.

    Hier mal meine Probleme die ich dabei hatte:

    1. Dynamischen Entitäten können in nuclos nicht direkt bearbeitet werden, daher ist immer ein eigenes Formular notwendig, was es wiederum komplizierter zum Entwickeln und Warten macht und der Benutzer ein oder sogar mehrere weitere Fenster benötigt.

    2. Recht kompliziert wird es, wenn Regeln in den Formularen hinterlegt sind und wenn es dann noch unterschiedliche Formulare gibt. Jen nach Aufbau müssen Regeln mehrfach gepflegt werden und der Überblick geht leicht verloren. Somit sind Fehler vorprogrammiert.

    3. Die größten Probleme hatte ich allerdings bei der Anwendung. Ständig kamen Fehlermeldungen, bezüglich der Datensatz wurde von einem anderen Benutzer bearbeitet, bitte neu laden. Folglich gehen sämtliche Änderungen verloren. Ebenfalls hatte ich Probleme einen neuen Datensatz anzulegen und dabei gleich Subforms auszufüllen. Hierbei ging mir immer die Relation zur Hauptentität verloren. Vielleicht gäbe es sogar eine Lösung für mein Problem, doch steht der Aufwand in keinem Zusammenhang zum Nutzen.

    Mein Fazit:
    Ich neige auch immer dazu alles möglichst flexibel und „sauber“ abzubilden doch sieht das der Kunde bzw. Anwender in den wenigsten Fällen. Für die Benutzung ist letztlich eine einfache, klar strukturierte und funktionierende Anwendung relevant. Von Anwender höre ich immer wieder, ich will keinen Schnick Schnak, ich will nur das was ich auch wirklich brauche, aber das soll einfach und zuverlässig funktionieren.

    Bitte das jetzt nicht als Kritik verstehen!

    Da ich mich selbst noch nicht allzu lang mit der nuclos Entwicklung beschäftige, hoffe ich dass ich hier nichts Falsches erzähle.

    Schöne Grüße
    Hugo

Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)