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
-
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.
-
Sind Urlaubstermine als Text eingetragen?
-
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..
-
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 -
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
-
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..
-
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
endmit 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
-
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)));
MyDAes 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.
-
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)));
MyDALeo
-
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)));
MyDAich 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..
-
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
endbei 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)
-
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
-
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
endBitte 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