0

Doppelte Einträge verhindern

Über folgende aufwendige Filter Funktion füge ich über die Ansicht der Tabelle "Medienpartner" und mehrere Auswahlfelder eben diese zu einer verknüpften Untertabelle "Kampagne" in der Tabelle "Produkte" über einen Trigger hinzu:

let my := this;
let myFilterTyp := 'Filter Typ';
let myFilterGenreA := text('Genre A');
let myFilterGenreB := text('Genre B');
let myFilterGenreC := text('Genre C');
let myFilterBevorzugt := 'Filter Bevorzugt';
let myFilterLand := 'Filter Land';
for myContact in select Medienpartner where Typ = myFilterTyp and Bevorzugt = myFilterBevorzugt and Land = myFilterLand and (contains(concat(text(Genre)), myFilterGenreA) or contains(concat(text(Genre)), myFilterGenreB) or contains(concat(text(Genre)), myFilterGenreC)) do
let new := (create Kampagne);
new.(Produkte := my);
new.(Medienpartner := myContact)
end 

Da es nun immerwieder Überschneidungen geben kann, möchte ich doppelte Einträge unbedingt verhindern. Es muss also geprüft werden, ob sich der "Medienpartner" bereits in der verknüpften Untertabelle "Kampagne" in der Tabelle "Produkte" befindet. Hier hängts gerade mal wieder, ich bitte um Hilfe, DANKE :)

22 Antworten

null
    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Nachtrag:

    Hatte noch vergessen, dazu zu schreiben, dass die doppelten Einträge bei erneutem Button-Klick verhindert werden sollen ;)

    Danke!

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Halllo Reinhard,

    ich würde die Formel in der Schleife ergänzen:

    ---

    ....

    ....

    ....

    do

    if cnt (select Kampage [Produkte:=my and Medienpartner=myContact])=0 then
    (let new := (create Kampagne);
    new.(Produkte := my);
    new.(Medienpartner := myContact))

    end
    end 

    ---

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo, 

     

    funktioniert wie immer bestens! Danke :)

     

    Weil wir gerade an der Formel sind: Hier gibt es noch ein kleines Problem, beim Filtern nach Genres: da ich hier mit

    (contains(concat(text(Genre))

    Arbeite werden beim Selektieren des Genres "Rock" auch alle gefiltert die "...Rock..." enthalten, wie beispielsweise "Post Rock", "Classic Rock" etc. Wie kann ich hier nur eine eindeutige Übereinstimmung zu lassen? Ich hatte versucht alle text(...) Funktionen wegzulassen, so dass die ID verwendet würde, das hat vermutlich wegen contains oder concat aber nicht funktioniert. 

     

    Danke für Deinen Input ;)

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    let my := this;
    let myFilterTyp := 'Filter Typ';
    let myFilterGenreA := text('Genre A');
    let myFilterGenreB := text('Genre B');
    let myFilterGenreC := text('Genre C');
    let myFilterBevorzugt := 'Filter Bevorzugt';
    let myFilterLand := 'Filter Land';
    for myContact in select Medienpartner where Typ = myFilterTyp and Bevorzugt = myFilterBevorzugt and Land = myFilterLand and (

    let myFlag:=false;

    for i in chosen(Genre) do

    myFlag:= if i=myFilterGenreA or i=myFilterGenreB or myFilterGenreC then true end end;

    myFlag=true)

    do

    if cnt (select Kampage [Produkte:=my and Medienpartner=myContact])=0 then
    (let new := (create Kampagne);
    new.(Produkte := my);
    new.(Medienpartner := myContact))

    end
    end 

    ----

    Sollte so funktionieren

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Okay, das sieht interessant aus, ich bräuchte allerdings auch noch eine verkürzte Formel um die Ergebnisse in der Ansichtstabelle der "Medienpartner" dementsprechend angezeigt zu bekommen. Sorry, das hatte ich vergessen zu erwähnen. Mein Code sieht aktuell dort so aus:

     

    let myFilterTyp := 'Filter Typ';
    let myFilterGenreA := text('Genre A');
    let myFilterGenreB := text('Genre B');
    let myFilterGenreC := text('Genre C');
    let myFilterBevorzugt := 'Filter Bevorzugt';
    let myFilterLand := 'Filter Land';
    select Medienpartner where Typ = myFilterTyp and Bevorzugt = myFilterBevorzugt and Land = myFilterLand and (contains(concat(text(Genre)), myFilterGenreA) or contains(concat(text(Genre)), myFilterGenreB) or contains(concat(text(Genre)), myFilterGenreC)) 

     

    Danke, Reinhard

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    let my:=this;
    select Medienpartner where Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my. 'Filter Land' and (

    let myFlag:=false;

    for i in chosen(Genre) do

    myFlag:= if i=my.text('Genre A') or i=my.text('Genre B') or i=my.text('Genre C') then true end end;

    myFlag=true)

    ---

    und in der ersten Formel habe ich gerade einen Fehler endekt:

    ---

    let my := this;
    let myFilterTyp := 'Filter Typ';
    let myFilterGenreA := text('Genre A');
    let myFilterGenreB := text('Genre B');
    let myFilterGenreC := text('Genre C');
    let myFilterBevorzugt := 'Filter Bevorzugt';
    let myFilterLand := 'Filter Land';
    for myContact in select Medienpartner where Typ = myFilterTyp and Bevorzugt = myFilterBevorzugt and Land = myFilterLand and (

    let myFlag:=false;

    for i in chosen(Genre) do

    myFlag:= if i=myFilterGenreA or i=myFilterGenreB or i=myFilterGenreC then true end end;

    myFlag=true)

    do

    if cnt (select Kampage [Produkte:=my and Medienpartner=myContact])=0 then
    (let new := (create Kampagne);
    new.(Produkte := my);
    new.(Medienpartner := myContact))

    end
    end 

    ---

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo, das klappt leider nicht :( In der Ansichtstabelle bekomme ich egal bei welcher Eingabe keine Ergebnisse...

    Gibt es eine Möglichkeit nicht nach enthaltenen Text, sondern nach ID über die Filter Auswahlfelder filtern zu lassen.

    Zwischenzeitlich helfe ich mir, in dem ich doppeldeutige Genres umbenenne zB "Progressive R"

    Geht auch, nur für die Mitarbeiter nicht so schön...

     

    Danke trotzdem und liebe Grüße, Reinhard

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Reinhard, 

    Ich wuste nicht, dass Genre A, Genre B, Genre C - Auswahlfelder sind. Natürlich kann man auch die IDs prüfen, mann muss nur sicher sein, dass die IDs bei Gnre und Filter die gleiche sind. 

    ----

    let my:=this;
    select Medienpartner [ Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my. 'Filter Land' and (

    let myFlag:=false;

    for i in numbers(Genre) do

     if i=my.'Genre A' or i=my.'Genre B' or i=my.'Genre C' then myFlag:=true end end;

    myFlag=true)]

    ---

    Ich würde aber anstatt drei Auswahlfelder lieber ein Mehrfachuswahlfeld ansetzen. Dann kann man auch mehr als Drei begriffe setzen. Angenommen das neue Feld hätte den Namen Genre Filter, dann wäre die Formel:

    ---

    let my:=this;
    select Medienpartner [ Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my. 'Filter Land' and

    (let myFlag := false;
    for i in my.'Genre Filter' do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    myFlag = true)]

    ----

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Oh, letzte Formel hat einen Fehler:

    let my:=this;
    select Medienpartner [ Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my. 'Filter Land' and

    (let myFlag := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    myFlag = true)]

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo, 

    ich finds toll wie Du Dich in das Datenmodell vertiefst und Dir Zeit nimmst, das ist echt Hammer.

    Entschuldige bitte mein Verschweigen, dass alle Filter Felder Auswahlfelder sind.

    Formel funktioniert nahezu perfekt. Wenn ich es richtig sehe, werden alle Medienpartner hinzugefügt, sobald mindestens 1 Genre übereinstimmt. Optimal.

    Das Einzige was nicht mehr so ist wie zuvor, ist dass 'Filter Typ' nicht leer sein darf. Dann wird nichts angezeigt. Das Feld sollte natürlich auch nie leer sein, aber vor allem wenn neue Einträge noch nicht vollständig sind, kann es mal passieren.

    'Filter Bevorzugt' und 'Filter Land' dürfen hingegen leer sein (es werden dann alle Medienpartner gezeigt, die hier noch keine Einträge haben). Es wäre toll wenn wir das noch für 'Filter Typ' hinkriegen, dann kann ich die andere Variante mit den 3 Auswahlfeldern löschen, da diese hier viel komfortabler ist :)

     

    Danke 1x mehr ;)

    Reinhard

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Reinhard,

    man kann es so versuchen:

    ----

    if not 'Filter Typ' then select Medienpartner else 

    ........DIE FORMEL------ end

    ----

    So prüft Ninox zuerst ob Filter Typ leer ist und wenn Ja dann werden alle Datensätze angezeigt. Wenn Filter Typ nicht leer ist dann wir die Formel verwendet.

     

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

    sorry, hab mich lange nicht mehr drum gekümmert. Das System funktioniert perfekt in der Ansichtstabelle wir wie folgt gefiltert:

    let my := this;
    let myFilterTyp := 'Filter Typ';
    let myFilterBevorzugt := 'Filter Bevorzugt';
    let myFilterLand := 'Filter Land';
    (select Medienpartner)[Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my.'Filter Land' and (
    let myFlag := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    myFlag = true
    )]

    Und über die Schaltfläche "Kampagne hinzufügen" wie folgt hinzugefügt:

    let my := this;
    let myFilterTyp := 'Filter Typ';
    let myFilterBevorzugt := 'Filter Bevorzugt';
    let myFilterLand := 'Filter Land';
    for myContact in (select Medienpartner)[Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my.'Filter Land' and (
    let myFlag := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    myFlag = true
    )] do
    if cnt((select Kampagne)[Produkte = my and Medienpartner = myContact]) = 0 then
    let new := (create Kampagne);
    new.(Produkte := my);
    new.(Medienpartner := myContact)
    end
    end

    Wir hatten das jetzt mehrmals im Einsatz und stellen fest, es wäre noch um ein Vielfaches einfacher wenn wir die Auswahlfelder "Filter Land" "Filter Typ" und "Filter Bevorzugt" ebenfalls durch Mehrfachauswahlfelder ersetzen könnten um nach allen selektierten Begriffen die passende Schnittmenge zu bilden. Zum Beispiel, sollen alle Typen gefiltert werden die in der Ursprungstabelle entweder als "Review" oder als "Radio" oder zu einer anderen Selektion der Filter Mehrfachauswahl passen. Oder alle in der Filter Mehrfachauswahl gewählten Länder sollen angezeigt werden.

    Die Felder in der Quelltabelle sind allerdings nur einfache Auswahlfelder. Wie würde das funktionieren?

     

    Danke gleich vorweg wieder :)

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Reinhard,

    vorausgesetzt die IDs simmen überein:

    ---

    let my := this;
    let myFilterTyp := 'Filter Typ';
    let myFilterBevorzugt := 'Filter Bevorzugt';
    let myFilterLand := 'Filter Land';
    (select Medienpartner)[Typ = my.'Filter Typ' and Bevorzugt = my.'Filter Bevorzugt' and Land = my.'Filter Land' and (
    let myFlag := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    for i in my.numbers('Filter Typ') do
    if i=number(Typ) then
    myFlag:=true
    end
    end;
    for i in my.numbers('Filter Bevorzugt') do
    if i=number(Bevorzugt) then
    myFlag:=true
    end
    end;
    for i in my.numbers('Filter Land') do
    if i=number(Land) then
    myFlag:=true
    end
    end;
    myFlag = true
    )]

    ---

     

    Leo

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    let my := this;
    (select Medienpartner)[ (
    let myFlag := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    for i in my.numbers('Filter Typ') do
    if i=number(Typ) then
    myFlag:=true
    end
    end;
    for i in my.numbers('Filter Bevorzugt') do
    if i=number(Bevorzugt) then
    myFlag:=true
    end
    end;
    for i in my.numbers('Filter Land') do
    if i=number(Land) then
    myFlag:=true
    end
    end;
    myFlag = true
    )]

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

    danke für die schnelle Rückmeldung. Die IDs habe ich abgeglichen.

    Als Einstieg befasse ich mich mit der Ansichtstabelle und lasse zur Vereinfachung "Filter Bevorzugt" vorerst weg.

    Hier habe ich nach anlegen der entsprechenden Mehrfachauswahlfelder folgende Formel eingegeben:

     

    let my := this;
    (select Medienpartner)[let myFlag := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag := true end
    end
    end;
    for i in my.numbers('Filter Typ') do
    if i = number(Typ) then myFlag := true end
    end;
    for i in my.numbers('Filter Land') do
    if i = number(Land) then myFlag := true end
    end;
    myFlag = true]

     

    Es ist nun so, dass die Filter alleinstehend wunderbar funktionieren, allerdings nur wenn die jeweils anderen LEER sind. Ich würde sie gerne kombinieren so dass alle gewählten Genres in den gewählten Ländern des gewählten Typs angezeigt werden. Hab mit AND und + ausprobiert, aber ohne Erfolg... 

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Dann vielleicht so:

    ---

    let my := this;
    (select Medienpartner)[let myFlag1 := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag1 := true end
    end
    end;

    let myFlag2 := false
    for i in my.numbers('Filter Typ') do
    if i = number(Typ) then myFlag2 := true end
    end;

    let myFlag3 := false
    for i in my.numbers('Filter Land') do
    if i = number(Land) then myFlag3 := true end
    end;
    myFlag1 = true or myFlag2 = true or myFlag3 = true]

    ---

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    auch das klappt leider nicht... alleinstehend funktionieren die Filter nach wie vor. sobald kombiniert wird nicht.

    Im Grunde suche ich eigentlich nichts anderes, wie die Standard-Filtermöglichkeit von Ninox in den Spaltenbezeichnungen. Nur dass ich eben nach dem Filtern alle Ergebnisse per Button einer 'Kampagne' zuweisen möchte... 

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Reinhard

    ---

    let my := this;
    (select Medienpartner)[let myFlag1 := false;
    for i in my.numbers('Genre Filter') do
    for j in numbers(Genre) do
    if j = i then myFlag1 := true end
    end
    end;
    let myFlag2 := false;
    for i in my.numbers('Filter Typ') do
    if i = number(Typ) then myFlag2 := true end
    end;
    let myFlag3 := false;
    for i in my.numbers('Filter Land') do
    if i = number(Land) then myFlag3 := true end
    end;
    (myFlag1 or not my.'Genre Filter') and (myFlag2 or not my.'Filter Typ') and (myFlag3 or not my.'Filter Land')]

    ---

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Das läuft jetzt perfekt! Danke Leo!

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi Leo,

    ich würde bei oben genannter Funktion gerne noch eine Filter Option (Flag) nach einem JA/NEIN Feld einbauen. Hier nimmt mir Ninox aber weder den 'numbers' als auch den 'text' Befehl. Gibt es dafür einen anderen Weg?

    let myFlag4 := false;
    for i in my.numbers('Filter Mailing') do
    if i = number(Mailing) then myFlag4 := true end
    end;

    Das Feld 'Mailing' wäre die Option ob die Adressaten das Mailing genrell bekommen wollen oder nicht.

    Danke, Reinhard

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Reinhard, bei Ja7Nein Felder braucht man keinen Flag. 

    (myFlag1 or not my.'Genre Filter') and (myFlag2 or not my.'Filter Typ') and (myFlag3 or not my.'Filter Land') and (my.'Filter Mailing'=Mailing]

    Leo

    • Reinhard
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Klappt wie immer, Danke :)

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 22Antworten
  • 5213Ansichten