0

doppelte Einträge vermeiden_mit Alert drauf hinweisen

Hello zusammen, 

folgendes ist mit gerade aufgefallen, wir triggern "ist anwesend" der einzelnen Mitarbeiter über ein Dashboard und den Vorgesetzten

Mitarbeiter ist ein Dynamisches Auswahlfeld die Meldung ist anwesend wird in neue Tabelle geschrieben, in der dann der MA_Name und das Buchungsdatum steht.

Neu hinzukam, wenn der Vorgesetzte einen MA Korrigieren muss in dessen Status, dass man ein Datumsfeld hat, sagt Korrektur = ja und dann wie gewohnt weiter macht.

Ich hab jetzt in der Anwesenheitstabelle gesehen, dass es möglich ist den gleichen Mitarbeiter mehrfach einzubuchen für den gleichen Tag...vermutlich würden dann auch noch andere Status gehen (Krank, Urlaub, Überstunden, etc) 

Sprich ich bräuchte egtl eine Funktion, die überprüft, wurde für den Mitarbeiter an dem Tag schon eine Buchung gesetzt => wenn ja Welche und mich dann fragt soll wirklich geändert werden => dann könnte man ja auch sagen Antwortoption (Krank, Urlaub, anwesend, ...)

Schwierigkeit: durchs dynamische Auswahlfeld müsste es quasi für alle angeklickten diesen Dialog mit der abfrage einzeln und nacheinander öffnen und jeweils die unterschiedlichen Antworten pro MA Speichern.

 

derzeitige Formel, die die Doppeleinträge ermöglicht:

let myDate := date(if 'Korrektur Anwesenheit' = true then
        Datum     else         today()
    end);
let myArr := numbers('Anwesende _QM');
for i in myArr do
    do as database '11_PS'
        let new := (create Anwesenheit);
        new.(Datum := myDate);
        new.(Status := 1);
        new.(Personen := first((select Personen)[number(Nr) = i]))
    end
end;
let my := first(select 'Dash Quali');
openRecord(my, "Anwesend Team QM");
'Korrektur Anwesenheit' := null;
'Anwesende _QM' := null

5 Antworten

null
    • T_Bartzsch
    • vor 11 Monaten
    • Gemeldet - anzeigen

    Ich kann das jetzt nicht testen, aber du könntest das (create Anwesenheit) davon abhängig machen, ob es schon einen Datensatz gibt, der deinen Kriterien entspricht, oder nicht..... also in etwa so:

    for i in myArr do
    do as database '11_PS'
    let new := first((select Anwesenheit where Personen = i and Datum = myDate));
    if not new then new := (create Anwesenheit);
    new.(Datum := myDate);
    ... usw

    else 
    popupRecord(Anwesenheit, new)

    Also einfach gesprochen:

    Für jedes "i" in meinem Array lasse "new" den Datensatz aus der Tabelle "Abwesenheit" sein, mit meinem Datum und der Person "i".
    Wenn "new" nix ergibt, dann ist "new" = create Abwesenheit und alles was mit "new" noch gemacht werden muss. 
    Wenn "new" doch etwas ergibt (else), dann mach mir den Datensatz auf...

      • Schu_Mel
      • vor 11 Monaten
      • Gemeldet - anzeigen

       bringt mir noch den Fehler "Ausdrücke für dann und sonst liefern unterschiedliche Datentypen zurück" und interessanterweise bei let my sagt er dann, dass ers nimmer findet.

      let myArr := numbers('Anwesende _QM');
      for i in myArr do
      do as database '11_PS'
      let new := first((select Anwesenheit where Personen = i and Datum = myDate));
      if not new then new := (create Anwesenheit);
      new.(Datum := myDate);
      new.(Status := 1);
      new.(Personen := first((select Personen)[number(Nr) = i]))
              else 
      popupRecord(Anwesenheit, new);
      let mydash := first(select 'Dash Quali');
      'Korrektur Anwesenheit' := null;

      • Ninox-Professional
      • planoxpro
      • vor 11 Monaten
      • Gemeldet - anzeigen

       

      Ungeachtet des sonstigen Codes vermute ich die Ursache der Fehlermeldung darin, dass die Rückgabewerte bei select und create unterschiedlich sind. Ich würde deshalb mal versuchen, die Werte mit ‚Nr‘ zu vereinheitlichen:

      ...
      let new := first((select Anwesenheit where Personen = i and Datum = myDate)).Nr;
      if not new then new := (create Anwesenheit).Nr;
      ...
      

      Davon abgesehen fehlt zu dem „if“ aber auch noch ein „end“. Und popupRecord() erwartet als ersten Parameter die ID (welche die Tabellenkennung bereits enthält):

      popupRecord(new);

      Optional kann zusätzlich auch noch ein String mit dem Namen einer Registerkarte angegeben werden.

    • T_Bartzsch
    • vor 11 Monaten
    • Gemeldet - anzeigen

    Ja, wie schon geschrieben, das war ohne Anspruch auf Funktion und nur ein Denkanstoß ... normalerweise versuche ich hier im Forum auch immer "copy&paste" fähige Antworten zu geben... aber manchmal wird es aus Zeitgründen eben nur ein halbgarer Lösungsvorschlag :)

      • Schu_Mel
      • vor 11 Monaten
      • Gemeldet - anzeigen

       ich bin auch erst "Neu" im programmieren, sodass mich solch Fehlermeldungen durchaus noch irritieren. allen Fortgeschrittenen hat das sicher weiter geholfen.