0

Wie kann ich in einer anderen Tabelle nach Datum und dazu passenden Datensatz Treffern suchen?

Ich sitze grad an der letzten Nuss meiner aktuellen kleinen Anwendung. Hier möchte ich in einer anderen Tabelle nach möglichen Treffer Datensätzen über Datumangaben suchen lassen und wenn Treffer vorhanden sind, von dort bestimmte Felder in meine Suchtabelle in entsprechende Felder eintragen lassen.

Um zu verdeutlichen welche Felder in beiden Tabellen für die Suchaktion zur Verfügung stehen, habe ich dazu ein kleines Beispiel gebastelt - siehe Screenshot. Hat hier vielleicht jemand eine Idee?

32 Antworten

null
    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Idee schon..., wie soll die Suche ausgelöst werden?

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ... einen Button in der Abfragetabelle mit Code:

    let SuchDatum := 'Heutiges Datum Abfragetabelle';

    let Satz := first(select 'Haupttabelle' where 'Datum A' = SuchDatum);

    if Satz != null and '1. Suchtext aus Haupttabelle' != null then

        '1. Suchtext aus Haupttabelle' := Satz.'Text 1';

    end;

     

    so sollte es mit dem ersten Datum gehen, ist nur ein Beispiel...

    testen und weiter machen...

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hi Bernd.

    Ich danke vielmals. Das klappt ja wirklich :-) Und sogar genau so wie ich es vorhabe. Ich habe zwar eine Stunde geflucht weil es erst nicht ging in gefühlt 70 Variationen, dann aber - VON ALLEINE! und durch Zufall - gemerkt, dass es in der vorletzten Zeile  "=null then" heissen muss und nicht "!=null then". Er hatte dann nur was eingetragen wenn schon was im Suchtext drin stand und es soll ja andersherum sein :-)

    Vielen, vielen Dank! Nun kann es weiter gehen mit der Bastelei :-)

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wie bekomme ich es dann noch hin wenn mehrere Treffer in der Haupttabelle gefunden werden, diese an den ersten Treffer anzuhängen?

    Es können ja auch mehrere Treffer mit Datum A vorhanden sein. In diesem Fall trägt er nur den ersten gefundenen Treffer in Suchtext 1 ein. So zwei bis vier sollten aber ruhig übertragen werden - wenn denn soviele vorhanden.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    let SuchDatum := 'Heutiges Datum Abfragetabelle';

    var Text := "";

    for Satz in (select 'Haupttabelle' where 'Datum A' = SuchDatum) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    if Satz != null and '1. Suchtext aus Haupttabelle' != null then

        '1. Suchtext aus Haupttabelle' := Text;

    end;

     

    hier wird eine Schleife durchlaufen, alle Datensätze mit dem gleichen Datum. Getrennt werden die einzelnen Texte durch ein "; " (if - Anweisung), damit besser unterschieden werden kann. Kann natürlich auch geändert werden...

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wie wäre es mit einer Ansichtstabelle mit der Formel:

    ---

    let SuchDatum:='Heutiges Datum Abfragetabelle';

    select 'Haupttabelle' where 'Datum A' = SuchDatum

    ---

    dann kannst du direkt zu den jeweiligen Datensätzen in der Haupttabelle springen

     

    Leo

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wow.... Klappt auch :-)

    Nun brauche ich nur noch eines: Dass er auch die Datum B, Datum C und Datum D Einträge findet falls vorhanden und an die Textkette anhängt. Aber das nur dann wenn sich der Datensatz nicht in einem der vorherigen Datumstreffern befindet. Also wenn ein Datensatz z.B. bei Datum A und Datum B gefunden wurde, reicht es den Datensatzfund einmal als Text anzuhängen.

    Ich habe es mit 4 Textfeldern probiert und bekomme dann zwar Datum A Funde ins erste Feld, Datum B ins zweite Feld usw. Aber eben auch wenn ein Treffer in Datum A schon gefunden wurde, trägt er es in Datum B auch noch mal ein. Genau das soll nicht.

    Eigentlich will ich alles in einem Textfeld gesammelt haben was am Suchtag gefunden wurde. Aber max. eben nur einen Datensatz und keine Doppelten.

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hi Leo....

    Ich brauche die Ergebnisse nur als Textausgabe. Das reicht mir für diesen Fall bzw. ist der Sinn. Es ist immer noch für meine Reisekostengeschichte. Eigentlich soll nur geschaut werden welche Aufträge wurden am heutigen Tag bearbeitet und diese Auftragsadressen werden dann in das Textfeld "Reisegrund" eingetragen. Das klappt im Kern schon besser als ich dachte und spart einem später wieder viel Tipparbeit auf der Straße :-)

     

    Ich habe da aber - neben der Datum A, B, C, D Nummer noch ein letztes Schmankerl:

    Angenommen ich fahre los um einen Auftrag zu bearbeiten. Die Fahrt ist lang und man kommt erst spät an, macht nichts mehr beim Kunden. Dann fehlt der Eintrag Datum A, Datum B, Datum C oder Datum D ja in dem Auftrag. Was dann nur im noch leeren Auftrag drin steht wäre nur der Termin. In diesem Falle könnte Ninox erstmal diesen als Vergleich herannehmen und den Reisegrund daraufhin eintragen.

    Bernds Formel funktioniert aber irgendwie nicht bei dem Terminfeld (Datum und Uhrzeit Feld). Das wäre also quasi das dritte Datumsfeld was noch durchsucht werden könnte. Aber eben nur zum Einsatz kommen soll wenn in den anderen A,B,C,D Datumsfeldern nichts gefunden wurde.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ich würde Leo's Variante auch vorziehen..., gibt mehrere Möglichkeiten dadurch...

     

    let SuchDatum := 'Heutiges Datum Abfragetabelle';

    var Text := "";

    for Satz in (select 'Haupttabelle' where 'Datum A' = SuchDatum) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

    for Satz in (select 'Haupttabelle' where 'Datum B'= SuchDatum) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    for Satz in (select 'Haupttabelle' where 'Datum C'= SuchDatum) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    for Satz in (select 'Haupttabelle' where 'Datum D'= SuchDatum) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    if Satz != null and '1. Suchtext aus Haupttabelle' != null then

        '1. Suchtext aus Haupttabelle' := Text;

    end;

     

    erst wird Datum A abgefragt, dann Datum B, ...

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich würde die Formel von Bernd so modernisieren:

    ---

    let SuchDatum := 'Heutiges Datum Abfragetabelle';

    '1. Suchtext aus Haupttabelle':= join (select  'Haupttabelle' where 'Datum A' = SuchDatum or 'Datum B' = SuchDatum or 'Datum C' = SuchDatum or 'Datum D' = SuchDatum or date(Terminfeld)=Suchdatum.'Text 1',"

    ");

    '2. Suchtext aus Haupttabelle':= join (select  'Haupttabelle' where 'Datum A' = SuchDatum or 'Datum B' = SuchDatum or 'Datum C' = SuchDatum or 'Datum D' = SuchDatum date(Terminfeld)=Suchdatum.'Text 2',"

    ")

    ---

    Wenn du die beiden Textfelder in der Suchtabelle noch höher machst, dann werden die Suchergebnisse  untereinander geschrieben.

     

    Leo

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ja, aber dann ist die Priorität von A, B, C, D nicht mehr gegeben 🙄

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich denke, es solte aber passen. Ninox prüft in einem Datensatz ob das gesuchte Datum in einem der 4 Datumsfelder oder in dem Terminfeld vorhanden ist. Trifft es zu - wird der Text übernommen. Wenn es auch mehrmalls vorkommt, wird der Text trotzdem nur einmal übernommen. Dann geht es zu den zweiten Datensatz und wenn dort etwas gefunden wird, wird der Text untendrunter geschrieben.

    Leo

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Leos Variante benötige ich wahrscheinlich für den dritten und letzten Part meiner aktuellen Sache. Dann wird noch mein "Informations System" dran geflanscht. Das ist gefüllt mit - wie der Name schon sagt - Informationen, Tipps & Tricks sowie vielen PDFs, Fotos usw. Technische Beschreibungen, Anleitungen für technische Geräte usw.

    Hier möchte ich sowas wie eine Suche a la Google haben statt ewig zu blättern. Schlagwort eingeben, Ergebnis bzw.

    Ergebnisse zum direkten anwählen vor einem.

     

    Ich mach mich nun mal daran, die Sache mit A, B, C und D nun zu probieren :-)

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich danke Euch so sehr! Es klappt! Alles wird korrekt der Reihe nach durchsucht, Treffer die schon gefunden wurden werden nicht nochmal eingetragen. Was will man mehr? Perfekt!

     

    Habe nur noch ein "Terminproblem":

    Wenn ich das Terminfeld als allerletztes auch noch durchsuchen lassen will. Das Terminfeld wird irgendwie von der Formel nicht als Datumsfeld erkannt. Dann habe ich ein Berechnungsfeld genommen um den Termin dort hinein zu spiegeln und wollte das dann absuchen lassen. Aber im Berechnungsfeld erscheinen nur Zahlenkolonnen anstatt ein Datum (siehe Screenshot). Habs schon ohne die kleinen Gänsefüsschen davor und dahinter probiert, dann kommt gleich eine Fehlermeldung im Scriptfenster.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    date(start(Terminfeld))

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    BING! Das wars! :-)

    DAANKEE!

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ich dachte das wars.

    Irgendwie findet er doch noch doppelte Einträge. Wenn ein Auftragssatz z.B. Datum A und Datum B mit dem gesuchten Datum enthält, dann schreibt er diesen Auftrag als Reisegrund 2x rein.

     

    Mein originaler Code sieht nun so aus:

    let SuchDatum := 'Datum Mo.';
    var Reisegrundtext := "";
    for AuftragsSatz in select AUFTRAG where Datum_A = SuchDatum do
    if Reisegrundtext > "" then Reisegrundtext := Reisegrundtext + " & " else void end;
    Reisegrundtext := Reisegrundtext + AuftragsSatz.'Adresse für Reisekosten'
    end;

    for AuftragsSatz in select AUFTRAG where Datum_B = SuchDatum do
    if Reisegrundtext > "" then Reisegrundtext := Reisegrundtext + " & " else void end;
    Reisegrundtext := Reisegrundtext + AuftragsSatz.'Adresse für Reisekosten'
    end;

    for AuftragsSatz in select AUFTRAG where Datum_C = SuchDatum do
    if Reisegrundtext > "" then Reisegrundtext := Reisegrundtext + " & " else void end;
    Reisegrundtext := Reisegrundtext + AuftragsSatz.'Adresse für Reisekosten'
    end;

    for AuftragsSatz in select AUFTRAG where Datum_D = SuchDatum do
    if Reisegrundtext > "" then Reisegrundtext := Reisegrundtext + " & " else void end;
    Reisegrundtext := Reisegrundtext + AuftragsSatz.'Adresse für Reisekosten'
    end;

    for AuftragsSatz in select AUFTRAG where date(start('Geplanter Termin')) = SuchDatum do
    if Reisegrundtext > "" then Reisegrundtext := Reisegrundtext + " & " else void end;
    Reisegrundtext := Reisegrundtext + AuftragsSatz.'Adresse für Reisekosten'
    end;

    if Reisegrundtext != null and 'Reisegrund Mo.' != null or 'Reisegrund Mo.' = null then
    'Reisegrund Mo.' := Reisegrundtext
    end

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    👍👍👍

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    oben war irrläufer...

    das ist richtig, er schreibt jetzt für jedes gefundene Darum den Text..., wie soll es denn richtig sein?

    • Ninox-Professional
    • planoxpro
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Falls ich die Aufgabenstellung aus dem Screenshot richtig interpretiere, erscheint mir Leos Vorschlag als der sinnvollste. Mit der Einschränkung, dass mir nicht klar ist, was das join() bewirken soll. Ich würde statt dessen zu first() tendieren:

     

    let SuchDatum := 'Heutiges Datum Abfragetabelle';
    '1. Suchtext aus Haupttabelle' := first(select Haupttabelle where 'Datum A' = SuchDatum or 'Datum A' = SuchDatum or 'Datum C' = SuchDatum or 'Datum D' =SuchDatum or date(start('Geplanter Termin')) =SuchDatum).'Text 1';
    '2. Suchtext aus Haupttabelle' := first(select Haupttabelle where 'Datum A' = SuchDatum or 'Datum A' =SuchDatum or 'Datum C' = SuchDatum or 'Datum D' = SuchDatum or date(start('Geplanter Termin')) =SuchDatum).'Text 2'

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Nabend Jungs... Komme grad von einer OP zurück und bin heim geflüchtet. Ninox hat heilende Kräfte scheint mir :-)

     

    Also: Es mag ja sein, dass der oder der Code nun besser wäre. Aber: Es funktioniert ja nun und was da unter der Haube passiert ist mir dann auch egal. Bei der nächsten App kann ich dann den anderen Weg ausprobieren.

    @Bernd:

    Also es ist so: Pro Auftrag können bis zu vier Tage mit Datum drinstehen. An dem einen war ich nur einen Tag beschäftigt, an einem anderen Auftrag 2 oder auch 3 oder seltener 4 Tage. Das notiere ich in dem Auftrag und daher stehen eben bis zu 4 Tage in einem Auftrag drin. An diesen Tagen die Datum A,B,C oder D ausgefüllt haben war ich dann dort definitiv vor Ort. Soweit das Einfache, was auch keine Probleme machen würde.

    Nun gibts Sonderfälle: Ich habe zweimal den selben Tag in Datum A und Datum B aber beides in nur einem Auftrag. Das sind z.B. Jobs zu denen ich von zuhause aus hinfahre aber auch von dort wieder zurück nach Hause. Dann werden zwei Zeilen ausgefüllt - für die Rückfahrt - Daher sind manchmal eben zwei gleiche Tage in einem Auftrag zu finden. Und hier soll die Suche natürlich nur einmal zuschlagen und nur einmal einen Treffer eintragen.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Möchte nicht aufdringlich und besserwisserisch wirken, aber wenn der Code funktioniert, warum hast du dann Probleme?

    probier folgendes aus. 

    ---

    let SuchDatum := 'Datum Mo.';

    'Reisegrund Mo.':= join (select  'Haupttabelle' where 'Datum A' = SuchDatum or 'Datum B' = SuchDatum or 'Datum C' = SuchDatum or 'Datum D' = SuchDatum or date(start('Geplanter Termin'))=Suchdatum.AuftragsSatz.'Adresse für Reisekosten',"

    ")

    ----

    @Copytexter,

    join ist hier erforderlich, weil damit auch andere Aufträge (aus anderen Datensätzen) an selben Tag gezählt werden.

    Leo

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ok, dann meine Variante:

     

    let SuchDatum := 'Heutiges Datum Abfragetabelle';

    var Text := "";

    for Satz in (select 'Haupttabelle' where 'Datum A' = SuchDatum) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

    for Satz in (select 'Haupttabelle' where 'Datum B'= SuchDatum and not 'Datum A' = 'Datum B') do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    for Satz in (select 'Haupttabelle' where 'Datum C'= SuchDatum and not('Datum A' = 'Datum C' or 'Datum B' = 'Datum C')) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    for Satz in (select 'Haupttabelle' where 'Datum D'= SuchDatum and not ('Datum A' = 'Datum D' or 'Datum B' = 'Datum D' or 'Datum C' = 'Datum D')) do

        if Text >"" then

            Text := Text + "; "

        else

            void

        end;

        Text := Text + Satz.'Text 1';

    end;

     

    if Satz != null and '1. Suchtext aus Haupttabelle' != null then

        '1. Suchtext aus Haupttabelle' := Text;

    end;

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo.

    Ich habe deine Formel ja ausprobiert, kam bisher aber noch nicht drauf wo der Fehler liegt. Liegt ja an mir und dass ich irgendwo sicherlich eine Klammer oder Punkt anders setzen müsste nehme ich an. Ich habe nun schon 2 Buttons: Bernd und Leo :-)

    Variante 1:

     

    Variante 2:

     

    Dass die Formel funktionierte bezog ich auf Bernds Formel der nur das aussortieren der Doppelten fehlte. Mit der letzten Formel von Bernd gehts. Es wird nur ein Auftrag pro Suche angezeigt, egal wie oft das Datum in dem Auftrag vorkommt.

     

    Hotelbelege auf die selbe Weise suchen:

    Da ich nun Geschmack gefunden habe, wollte ich mit der selben Methode auch gleich Hotelbelege suchen die - wenn vorhanden - in den Aufträgen als PDF anhängen. Das funktioniert - so halb. Irgendwie findet er das PDF und zeigt es mir im Zielfeld (Bild Feld) auch an wenn ich auf "Sichern unter" gehe. Dann sieht man, dass er da was speichern will aber wohl nicht kann. Wenn ich sichern will, kommt ein Copy sonstwas Fehler. Wenn ich als Zielfeld ein Berechnungsfeld wähle funktioniert die Formel gar nicht. Ich denke es fehlt eine Art Copy Anweisung?!

    Die Hotelbelegeformel ist nun die von Bernd mit den Feldern für die Hotelbelege. Aber weil PDF gehts wohl nicht wie ich dachte.

     

    let SuchDatum := 'Datum Mo.';
    var HotelZettel := "";
    for Satz in select AUFTRAG where Datum_A = SuchDatum do
    if HotelZettel > "" then
    HotelZettel := HotelZettel + " & "
    else
    void
    end;
    HotelZettel := HotelZettel + Satz.HOTELBELEG
    end;
    for Satz in select AUFTRAG where Datum_B = SuchDatum and not Datum_A = Datum_B do
    if HotelZettel > "" then
    HotelZettel := HotelZettel + " & "
    else
    void
    end;
    HotelZettel := HotelZettel + Satz.HOTELBELEG
    end;
    for Satz in select AUFTRAG where Datum_C = SuchDatum and not (Datum_A = Datum_C or Datum_B = Datum_C) do
    if HotelZettel > "" then
    HotelZettel := HotelZettel + " & "
    else
    void
    end;
    HotelZettel := HotelZettel + Satz.HOTELBELEG
    end;
    for Satz in select AUFTRAG where Datum_D = SuchDatum and not (Datum_A = Datum_D or Datum_B = Datum_D or Datum_C = Datum_D) do
    if HotelZettel > "" then
    HotelZettel := HotelZettel + " & "
    else
    void
    end;
    HotelZettel := HotelZettel + Satz.HOTELBELEG
    end;
    for Satz in select AUFTRAG where date(start('Geplanter Termin')) = SuchDatum and not (Datum_A = date(start('Geplanter Termin')) or Datum_B = date(start('Geplanter Termin')) or Datum_C = date(start('Geplanter Termin')) or Datum_D = date(start('Geplanter Termin'))) do
    if HotelZettel > "" then
    HotelZettel := HotelZettel + " & "
    else
    void
    end;
    HotelZettel := HotelZettel + Satz.HOTELBELEG
    end;
    if HotelZettel != null and 'Hotelbeleg aus Auftrag' != null or 'Hotelbeleg aus Auftrag' = null then
    'Hotelbeleg aus Auftrag' := HotelZettel
    end

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen