Home › Forum › Nuclos Konfiguration › Vorgänge und Objekte › Kontakthierarchien (rekursive SQL-Abfragen)
- Dieses Thema hat 1 Antwort und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 11 Jahre, 11 Monaten von
Markus Glitzner.
-
AutorBeiträge
-
28 Juni 2011 um 14:01 Uhr #3891
Daniel Hammerschmidt
TeilnehmerHallo 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
28 Juni 2011 um 14:41 Uhr #3892Markus Glitzner
TeilnehmerHallo 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 -
AutorBeiträge