NEWS
Verständnisproblem: sql Abfrage in Function, Ergebnis als Rückgabewert
-
Hallo,
ich habe eine Funktion, bei der ich ein Ergebnis aus einer sql Abfrage zurückgeben möchte.//Funktionsaufruf var niedrigsterTagesWert=wert_tagesanfang(ID_PV_PRODUKTION); log ("minimal: "+niedrigsterTagesWert); .... // Funktion: function wert_tagesanfang(obj) { var ergebnis; var myQuery="SELECT min(val) as minwert FROM iobroker.ts_number WHERE id=(select id from iobroker.datapoints where name='"+obj+"') AND (FROM_UNIXTIME(substring(ts,1,10))) >= concat(DATE_FORMAT(NOW(), '%Y-%m-%d'), ' 00:00:00');"; //log(myQuery); sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { log(result.error); } else { ergebnis=result.result[0].minwert; log("ergebnis in func:"+ergebnis); } }); return ergebnis; }
Obwohl in der Function das richtige Ergebnis im Log ausgegeben wird, wird für den übergebene Wert ein undefined im Log ausgegeben, auch scheint der Rückgabewert laut Timestamp VOR dem Ergebnis aus der SQL Abfrage ausgegeben
2019-05-28 22:06:52.274 - info: javascript.1 script.js.History_Werte_+_DB_Pflege.SQL_Tagesstatsistik: minimal: undefined 2019-05-28 22:06:52.274 - info: javascript.1 script.js.History_Werte_+_DB_Pflege.SQL_Tagesstatsistik: NaN 2019-05-28 22:06:52.378 - info: javascript.1 script.js.History_Werte_+_DB_Pflege.SQL_Tagesstatsistik: ergebnis in func:1271882
kann mir das jemand erklären, wie ich mit der Rückgabe auf die SQl Abfrage "warten" kann?
-
@ehome return ergebnis wird ausgeführt, bevor sendTo() abgearbeitet ist (asynchrone Abarbeitung von sendTo()). Lösung:
function auswertung(res) { var niedrigsterTagesWert = res; log ("minimal: "+niedrigsterTagesWert); } // Funktion: function wert_tagesanfang(obj) { var ergebnis; var myQuery="SELECT min(val) as minwert FROM iobroker.ts_number WHERE id=(select id from iobroker.datapoints where name='"+obj+"') AND (FROM_UNIXTIME(substring(ts,1,10))) >= concat(DATE_FORMAT(NOW(), '%Y-%m-%d'), ' 00:00:00');"; //log(myQuery); sendTo('sql.0', 'query', myQuery, function (result) { if (result.error) { log(result.error); } else { ergebnis=result.result[0].minwert; log("ergebnis in func:"+ergebnis); auswertung(ergebnis); } }); } //Funktionsaufruf wert_tagesanfang(ID_PV_PRODUKTION);
-
Danke Paul,
dazu eine Verständnisfrage: Es gibt keine Möglichkeit einen "return" wert am Ende von "wert_tagesanfang" zurückzugeben, da die sendTo parallel und unabhängig läuft. Die Funktion Auswertung dient nur dazu, direkt um NACH dem Lauf von sendTo etwas auszuführen zu können - richtig ?
-
@ehome sagte:
Die Funktion Auswertung dient nur dazu, direkt um NACH dem Lauf von sendTo etwas auszuführen zu können - richtig ?
Richtig, deshalb habe ich sie auswertung genannt.
-
@paul53 Danke
-
@paul53
Vielen Dank, das leuchtet ein.Wenn am Programmende nur ein log("blabla") erforderlich ist, dann geht das ja noch.
Wenn man aber im Programm mit dem Rückgabewert weiterarbeiten will, dann passiert das in
der Callback Funktion "auswertung".Das wird bei mehreren Abfragen dann sehr unübersichtlich.
Siehe: https://forum.iobroker.net/topic/35344/sql-abfrage-universal/10Gibt es dafür eine Lösung?