Ich habe eine Softschaltuhr programmiert und in dieser sollen nach Terminen die Außenbeleuchtung ein bzw ausgeschaltet werden.
Allerdings bekomme ich es nicht hin, dass zum Ende des Termins auch wieder alles ausgeschaltet wird.
if (channel[0]=false) AND (channel[1]=false) AND (channel[2]=false) AND (channel[3]=false) AND (beginn<=time) AND (ende>time) then
SetOutputsFromDB();
if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
SetOutputsFromDB();
ist wahrscheinlich einfach nur ein logik Fehler aber ich bin grad zu beschränkt um es zu checken
Vielen Dank schon mal
Zuletzt geändert von m.fuchs am Di 6. Jun 2017, 16:47, insgesamt 1-mal geändert.
Grund:Highlighter hinzugefügt
Ich kann nur eines Sagen: Die Verzweigung scheint syntaktisch richtig zu sein aber ob die Semantik stimmt vermag ich mit den gegeben Informationen nicht zu beantworten.
if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
function ChannelActivated: Boolean;
begin
Result := channel[0] or channel[1] or channel[2] or channel[3]; // könnte man auch in eine Schleife packen
end;
...
if not ChannelActivated and (beginn <= time) and (ende > time) then ...
if ChannelActivated and (ende < time) then ...
if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
SetOutputsFromDB();
Hier ist vermutlich nur das "ende < time " falsch, mach mal ein ende >=time raus.
Ich kenne zwar die Datentypen nicht, aber es könnte die Ursache sein für den "Fehler".
Edit01: Außerdem rufst du in beiden fällen SetOutputsFromDB auf, die vermutlich in beiden Fälle einfache das gleiche macht.....
if (channel[0]=false) AND (channel[1]=false) AND (channel[2]=false) AND (channel[3]=false) AND (beginn<=time) AND (ende>time) then
SetOutputsFromDB();
if ((channel[0]=true) AND (ende<time)) OR ((channel[1]=true) AND (ende<time)) OR ((channel[2]=true) AND (ende<time)) OR ((channel[3]=true) AND (ende<time)) then
SetOutputsFromDB();
l
ein Paar Zusatzinformationen
die Channel stehen für die Lampen die angesteuert werden. ende und beinn sind zeiten die ich aus Terminen aus einer Datenbank beziehe und time ist die aktuelle Zeit.
Mit SetOutputsFromDB werden die in den Datensätzen angegebenen channel umgeschaltet. Die Datensätze werden nach Datum gefiltert also immer nur die Datensätze die das aktuelle Datum betreffen.
Ursprünglich wurden die Datensätze nur nach Wochentag oder Wochenende gefiltert. solange ich die Filter so lasse ist alles in Ordnung sobald ich den Filter für das Datum hinzufüge funktioniert es nicht mehr.
Kann mir jemand sagen warum das so ist oder gibt es noch offene Fragen?
lass dir die Werte für 'ende' und 'time' einmal numerisch anzeigen. Aus deiner Beschreibung her könnte es sein, das du beim hinzufügen des Filters die Werte zerstörst. Ich gehe davon aus, das du TDateTime für 'ende' und 'time' verwendest.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).