0

Abfrage Tabelle1/Untertabelle/Datumsfeld im Bereich Tabelle2/Untertabelle/Terminfeld

hallo, ich suche ein script ob das Datumsfeld aus Tabelle1 verglichen mit den Urlaubsterminen in Tabelle2 wahr oder falsch ist.. schlüsselfeld für beide Tabellen ist das Textfeld/Namen..

der Hintergrund, ich befülle mit einem Button einen Monat(Schleife 15x) jeden zweiten Tag als eigenen Datensatz. Dieser Datensatz verfügt über ein Auwahlfeld (Dienst, Frei,Urlaub, Krank,usw) mit der Vorgabe Dienst Wert =1. Der Urlaub der in einer anderen Tabelle liegt wird schon ein halbes Jahr vorher eingetragen und nun sollte automatisiert beim anlegen der Datensätze für den Dienst abgefragt werden ob er in den Bereich Urlaub fällt und das Auswahlfeld statt auf Dienst auf Urlaub = 2 gestellt werden.

 

ich hoffe ich habe das halbwegs verständlich erklären können.

vlG

13 Antworten

null
    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ich habe das hier im Bild nochmals versucht darzustellen und möchte in einem FX Feld des Ergebnis darstellen ob Datum in Termin enthalten ist.

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Sind Urlaubstermine als Text eingetragen?

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

     Nein als TerminFeld und das andere in der Dienstuntertabelle ist ein Datumsfeld..

    in der Dienstuntertabelle sollte ein Auswahlfeld damit als  Dienst =1 oder Urlaub = 6 gesteuert werden , wenn ich per Button 15 Tage vorschreiben lasse..

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Das ist der Code für die Vorschreibung

    let my := this;
    let mystartDatum := max(Diensttabelle.Datum);
    let myRest := min(Diensttabelle.DFTage);
    let myRestKR := max(Diensttabelle.KR);
    let myRestDIG := max(Diensttabelle.'Dienste Gesamt');
    let myAuswahl := 1;
    let myAbloese := 0;
    if Personal.Wache = "L" then myAbloese := 1 end;
    if Personal.Wache = "KM" then
    myAbloese := 2
    end;
    if ninoxApp() = "web" then
    do as server
    if Diensttabelle.Datum = "" then
    let mystartDatum := today();
    let myRest := 48;
    let myRestKR := 0;
    let myRestDIG := 1;
    for i in range(0, 1) do
    let myD := (create Diensttabelle);
    myD.(Datum := date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)));
    myD.(DFTage := myRest);
    myD.(KR := myRestKR);
    myD.('Dienste Gesamt' := myRestDIG);
    myD.(Diensteinteilung := my);
    myD.(Auswahl := myAuswahl);
    myD.('Versieht Dienst' := myAbloese);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1)
    end
    else
    for i in range(0, 15) do
    let myRestDIG := max(Diensttabelle.'Dienste Gesamt');
    let myD := (create Diensttabelle);
    myD.(Datum := date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)));
    myD.(DFTage := myRest);
    myD.(KR := myRestKR);
    myD.('Dienste Gesamt' := myRestDIG + 1);
    myD.(Diensteinteilung := my);
    myD.(Auswahl := myAuswahl);
    myD.('Versieht Dienst' := myAbloese);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1)
    end
    end
    end
    end

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Martin,

    Wie hast du es geschafft, das Terminfeld ohne Zeitangaben darzustellen? Die Formel kann man so nicht analysieren, weil man die Hintergründe nicht kennt. Das Berechnungsfeld in der Diensttabelle kann man so gestallten:

    let myDate:=Datum;

    if cnt(Personal.Urlaub[date(start(Termin))<=myDate and date(endof(Termin))>=myDate])=0 then true else false end

     

    Diese Formel kannst dann auch für deine Schleife anpassen. 

     

    Leo

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    sorry Leo, dass ist nur ein  Beispiel wie ich es gerne hätte in numbers schnell hingeschrieben..

    ich werde die Formel gleich mal testen in einer meiner Test-Beispieldatenbank danke vielmals

    übrigens dein do as server Tip funktioniert klasse..

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Morgen Leo, deine Tip erst getestet und danach in den Sourcecode eingepflegt..  funktioniert 1A habe aber noch einige Fragen an dich wenn ich darf..

     

    hier ist der Code 

    for i in range(0, 1) do
    let myD := (create Diensttabelle);
    myD.(Datum := date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)));
    myD.(DFTage := myRest);
    myD.(KR := myRestKR);
    myD.('Dienste Gesamt' := myRestDIG);
    myD.(Diensteinteilung := my);
    if cnt(Personal.Urlaubsplaner.Urlaub[date(start('Von - Bis')) <= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)) and date(endof('Von - Bis')) >= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1))]) = 0 then
    myD.(Auswahl := myAuswahl);
    myD.('Versieht Dienst' := myAbloese);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    myD.(Infos := "")
    else
    myD.(Auswahl := myAuswahl + 5);
    myD.('Versieht Dienst' := 0);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    myD.(Infos := "DA")
    end
    end

    mit myD.(Infos := "DA") möchte ich den Dienstantritt  aus (Personal.Urlaubsplaner.Urlaub[date(endof('Von - Bis')+1)])   eintragen lassen..

    myD.(Infos := "DA" + (Personal.Urlaubsplaner.Urlaub[date(endof('Von - Bis')+1)]))

    funktioniert nicht.. Fehlermeldung findet die Tabelle Personal nicht. 

    das Datenmodel sieht so aus

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Morgen Leo ich hätte noch ein Problem mit select und der Anzahl der Auswertung.

    das ist der Code

    let my := this;
    let myName := Name;
    let myDate := Datum;
    let MyDA := (select Urlaub).Personal.Tabelle5[Personal.Name = myName and date(start(Termin)) <= myDate and date(endof(Termin)) >= myDate].text(date(endof(Termin)));
    MyDA

    es rechnet soweit richtig nur bekomme ich in meinem FX Feld zu testen  die korrekten Werte so oft angezeit wie Datensätze zu diesem Namen als Termin vorhanden sind und nicht nur den einen

    hast einen Tip woran es liegt.

    vg MartinK.

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Martin, 

    Wofür ist die Tabelle 5 gut? Nach deinem Datenmodell sollte die Formel etwa so aussehen:

     

    let myName := Name;
    let myDate := Datum;
    let MyDA := first (select Urlaub [Urlaubsplaner.Personal.Name = myName and date(start(Termin)) <= myDate and date(endof(Termin)) >= myDate]).text(date(endof(Termin)));
    MyDA

     

    Leo

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Da hat er die Tabelle Urlaubsplaner nicht gefunden... so passt die Syntax

    let myName := Name;
    let myDate := Datum;
    let MyDA := first((select Urlaub)[Personal.Name = myName and date(start(Termin)) <= myDate and date(endof(Termin)) >= myDate]).text(date(endof(Termin)));
    MyDA

     

    ich möcht mich gleich mal entschuldigen dafür das ich ab und an den Wald voller Bäume nicht sehe..

    Tabelle 5 hatte ich vergessen zu benennen  nach dem ich die Tabelle generell umbenannt hatte.. da heißt es obacht geben sonst kommt ein Durcheinander heraus..

     Danke jedenfalls für die Hilfe nun muss ich noch die Formel ans Projekt anpassen..

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    ich habe das nun versucht einzupflegen.. wieder alle Datumsauszüge..

     

    hier ist ein Teil des Codes

    if ninoxApp() = "web" then
    do as server
    let myName := Diensttabelle.Name;
    let MyDA := "";
    let my := this;
    let mystartDatum := max(Diensttabelle.Datum);
    let myRest := min(Diensttabelle.DFTage);
    let myRestKR := max(Diensttabelle.KR);
    let myRestDIG := max(Diensttabelle.'Dienste Gesamt');
    let myAuswahl := 1;
    let myAbloese := 0;
    if Personal.Wache = "L" then myAbloese := 1 end;
    if Personal.Wache = "KM" then
    myAbloese := 2
    end;
    if Diensttabelle.Datum = "" then
    let mystartDatum := today();
    let myRest := 48;
    let myRestKR := 0;
    let myRestDIG := 1;
    for i in range(0, 1) do
    let myD := (create Diensttabelle);
    myD.(Datum := date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)));
    myD.(DFTage := myRest);
    myD.(KR := myRestKR);
    myD.('Dienste Gesamt' := myRestDIG);
    myD.(Diensteinteilung := my);
    if cnt(Personal.Urlaubsplaner.Urlaub[date(start('Von - Bis')) <= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)) and date(endof('Von - Bis')) >= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1))]) = 0 then
    myD.(Auswahl := myAuswahl);
    myD.('Versieht Dienst' := myAbloese);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    myD.(Infos := "")
    else
    myD.(Auswahl := myAuswahl + 5);
    myD.('Versieht Dienst' := 0);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    myD.(MyDA := "DA " + first((select Urlaubsplaner)[Personal.Name = myName and Urlaub.date(start('Von - Bis')) <= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)) and Urlaub.date(endof('Von - Bis')) >= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1))]).Urlaub.text(date(endof('Von - Bis')) + 1));
    myD.(Infos := MyDA)
    end
    end

    bei der Zeile hebt es mir die Schädeldecke ab.. sorry

    hier ist das Datenmodel

     

    myD.(MyDA := "DA " + first((select Urlaubsplaner)[Personal.Name = myName and Urlaub.date(start('Von - Bis')) <= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)) and Urlaub.date(endof('Von - Bis')) >= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1))]).Urlaub.text(date(endof('Von - Bis')) + 1));
    myD.(Infos := MyDA)

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Tut mir leid, ich verstehe leider nichts hier. Du deklarierst am Anfang die Variablen einer Untertabelle Diensttabelle. Da es sich um eine Tabelle handelt, solltest du eigentlich auch mit first() hantieren um die Variablen als Einzelndaten zu sichern. Dazu kommt noch dass du die Daten in der Schleife verarbeitest, was auch zur Bildung von Arrays führt.

    Leo

    • Martin_K
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Morgen Leo  das verstehe ich nur zu gut..:))

    ich versuche das nochmals zu beschreiben.. ich hatte als Projekt zwei Datenbanken  Dienst und Urlaubsplanung und die wurden zusammengelegt..

    Sprich zwei Tabellen mit je einer Untertabelle..

    Beide holen sich das Peersonal aus einer Tabelle Personal..

     Die Urlaube werden von anderen Personen gepflegt ais die die den Dienst vorschreiben..

    Sprich, ich habe den Urlaub für ein halbes Jahr voraus geplant und nun muss der Dienstplan für zwei Monate im voraus geplant werden. 

    hier ist das Foto wie es sich auf der Maske darstellt.

     

    über den Button Vorschreibung werden pro Monat 15 24 h Dienste voreingetragen und alle Parameter vortlaufend berechnet.(DIF,KR usw.) 

    was ich nun wollte und teilweise umgesetzt habe dank deiner Hilfe mit der kleinen Beispieldemo..

    1. Wenn ein Dienst in einem Urlaubsbereich liegt(aus der Urlaubstabelle ausgelesen) wird das Auswahlfeld von 1 auf 2 gestellt... funktioniert 1A

    2. im Feld Infos sollte die information DA für Dienstantritt und TT.MM + 1 eingetragen werden..

    und das ist der aktuelle verwendete Code dazu

    let my := this;
    let myName := Diensttabelle.Name;
    let MyDA := "";
    let mystartDatum := max(Diensttabelle.Datum);
    let myRest := min(Diensttabelle.DFTage);
    let myRestKR := max(Diensttabelle.KR);
    let myRestDIG := max(Diensttabelle.'Dienste Gesamt');
    let myAuswahl := 1;
    let myAbloese := 0;
    if Personal.Wache = "L" then myAbloese := 1 end;
    if Personal.Wache = "KM" then
    myAbloese := 2
    end;
    if Diensttabelle.Datum = "" then
    let mystartDatum := today();
    let myRest := 48;
    let myRestKR := 0;
    let myRestDIG := 1;
    for i in range(0, 1) do
    let myD := (create Diensttabelle);
    myD.(Datum := date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)));
    myD.(DFTage := myRest);
    myD.(KR := myRestKR);
    myD.('Dienste Gesamt' := myRestDIG);
    myD.(Diensteinteilung := my);
    if cnt(Personal.Urlaubsplaner.Termine[date(start('Von - Bis')) <= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)) and date(endof('Von - Bis')) >= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1))]) = 0 then
    myD.(Auswahl := myAuswahl);
    myD.('Versieht Dienst' := myAbloese);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    myD.(Infos := "")
    else
    myD.(Auswahl := myAuswahl + 5);
    myD.('Versieht Dienst' := 0);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    MyDA := "DA ";
    myD.(Infos := MyDA)
    end
    end
    else
    for i in range(0, 15) do
    let myRestDIG := max(Diensttabelle.'Dienste Gesamt');
    let myD := (create Diensttabelle);
    myD.(Datum := date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)));
    myD.(DFTage := myRest);
    myD.(KR := myRestKR);
    myD.('Dienste Gesamt' := myRestDIG + 1);
    myD.(Diensteinteilung := my);
    if cnt(Personal.Urlaubsplaner.Termine[date(start('Von - Bis')) <= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1)) and date(endof('Von - Bis')) >= date(year(mystartDatum), month(mystartDatum), day(mystartDatum) + 2 * (i + 1))]) = 0 then
    myD.(Auswahl := myAuswahl);
    myD.('Versieht Dienst' := myAbloese);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    myD.(Infos := "")
    else
    myD.(Auswahl := myAuswahl + 5);
    myD.('Versieht Dienst' := 0);
    myD.Diensteinteilung.Diensttabelle.(DienstDrucken := 1);
    myD.Diensteinteilung.Diensttabelle.(OldStat := 1);
    MyDA := "DA ";
    myD.(Infos := MyDA)
    end
    end
    end

    Bitte keinen Stress, das ganze ist nur Kosmetik und eher ein Erleichterung um die Geschichte automatisieren zu können.

    ich würde dich gerne reinsehen lassen per einladung .. müsste aber erstmal die Datenbank leeren zur demo..

    vg MK

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 13Antworten
  • 4656Ansichten