Min- / Max- / Sum- / Avg- Wert aus einer DB - Druckversion +- VISAM Support Forum (https://www.visam.com/forum) +-- Forum: VBASE / VisAM HMI/SCADA (https://www.visam.com/forum/forumdisplay.php?fid=1) +--- Forum: VBASE Basic (VB) Programmierung (https://www.visam.com/forum/forumdisplay.php?fid=29) +--- Thema: Min- / Max- / Sum- / Avg- Wert aus einer DB (/showthread.php?tid=189) |
Min- / Max- / Sum- / Avg- Wert aus einer DB - Kärcher Steuerungstechnik GmbH - 28.11.2013 Hallo VisAM Team, wie erhalte ich z.B. einen Durchschnittswert aus einer DB Spalte/Feld? Ich habe es mal mit Code: Dim avg As Integer = VOK.DB_Execute(dbConnection, "select AVG(feld) from `tabelle`;") probiert und bemerkt, dass das nur für löschen/erstellen von Tabellen/Feldern gedacht ist, und mir einen Rückgabewert gibt, wie er auch in der Hilfe steht (0, -1, -2, -3). Gibt es da eine einfache Möglichkeit diese Werte (min,max,avg) direkt von der DB zu erhalten oder muss ich alle werte aus einer Spalte nehmen und durch die Anzahl der Zeilen teilen? RE: Min- / Max- / Sum- / Avg- Wert aus einer DB - D.Orleth - 29.11.2013 Hallo, der Befehl "VOK.DB_Execute()" ist in der Tat für komplexere Datenbankmanipulationen gedacht. Ein "SELECT AVG..." können Sie ganz einfach über "VOK.DB_Load()" auswerten. Sie erhalten dann als Ergebnis eine Tabelle mit einer Spalte und einer Zeile, aus der Sie den gewünschten Wert mit "VOK.DB_GetValue()" auslesen können. Mit freundlichen Grüßen Daniel Orleth RE: Min- / Max- / Sum- / Avg- Wert aus einer DB - Kärcher Steuerungstechnik GmbH - 29.11.2013 Hallo Herr Orleth, so ganz versteh ich Ihre Antwort nicht. VOK.DB_Load() stellt doch nur die Verbindung her bzw aktualisiert diese. Hier erhalte ich doch nur die Rückmeldung, ob die Verbindung hergestellt werden konnte oder nicht. Mit VOK.DB_GetValue() wird mir der Inhalt einer Zelle zurück gegeben. Hier kann ich doch keinen SQL befehl übergeben, der mir einen Wert zurück gibt (in meinem bsp den Durchschnitt einer ganzen Spalte), oder? RE: Min- / Max- / Sum- / Avg- Wert aus einer DB - D.Orleth - 29.11.2013 Hallo, nein, das ist so nicht korrekt: - VOK.DB_Load() lädt Daten aus der Datenbank, d.h. die Daten sind danach lokal im Speicher vorhanden - VOK.DB_GetValue() gibt zuvor über DB_Load() geladene Daten zurück Welche Daten beim Ausführen von VOK.DB_Load() geladen werden sollen, können Sie entweder direkt bei der Konfiguration der DB-Verbindung angeben, oder auch zur Laufzeit per VOK.DB_SetSelectString() beliebig verändern. In Ihrem Fall wäre das dann das gewünschte "SELECT AVG()" Mit freundlichen Grüßen RE: Min- / Max- / Sum- / Avg- Wert aus einer DB - Kärcher Steuerungstechnik GmbH - 29.11.2013 Hallo Herr Orleth, bin in diesem Gebiet noch blutiger Anfänger damit ich nicht den ganzen Tag mit trial and error rumschlagen muss hier mal meine Vorgehensweise: [ul][li]Die DB-Verbindung habe ich in VBASE konfiguriert. Beim Select-String steht dann der allgemeine SQL-Befehl: SELECT * FROM `Tabellenname`; (Verbindung funktioniert; Daten der DB sind aufrufbar)[/li][li]Das Bit 0,0,0,1 Startet mein VB-Script, in dem folgendes drin steht:[/li][/ul] Code: VDF.WriteBitB 0,0,0,1,0 beim VOK.DB_GetValue() soll doch der record & field index 0 sein, da durch den SetSelectString befehl die Tabelle nur noch die Zeile 0 und Spalte 0 hat. leider erhalte ich so keinen wert RE: Min- / Max- / Sum- / Avg- Wert aus einer DB - D.Orleth - 29.11.2013 Hallo, kein Problem, wir helfen ja gerne weiter ;-) Der Ansatz ist soweit schon richtig, es fehlt nur noch das VOK.DB_Load(), damit die Abfrage, die Sie im Select-String festgelegt haben auch ausgeführt wird. Wenn Sie die DB-Verbindung nur für das AVG() verwenden wollen, können Sie den Select-String übrigens auch direkt in der DB-Konfiguration setzen (da wo sonst der default "SELECT * FROM..." steht) und sich somit den Aufruf von VOK.DB_SetSelectString() sparen. Weiterhin ist noch zu beachten, dass das Laden der Daten per VOK.DB_Load() in einem eigenem Thread ausgeführt wird, da dies je nach Datenmenge einige Zeit in Anspruch nehmen kann und gewährleistet sein muss, dass die Laufzeit währenddessen nicht blockiert wird. D.h.: Sie können nicht unmittelbar nach dem Aufruf von VOK.DB_Load() auf die Werte zugreifen. Die korrekte, elegante Vorgehensweise ist in etwa wie folgt (der Übersicht halber habe ich Variablendeklarationen etc. ausgelassen und nur die wesentlichen Code-Zeilen aufgeführt): Ein VB-Programm setzt (bei Bedarf) den Select-String, stößt den Ladevorgang an und setzt anschliessend ein Bit, das ein weiters VB-Programm auslöst: Code: VOK.DB_SetSelectString(dbConnection, selectStringAVG) Ein zweites VB-Programm überprüft dann, ob die Daten bereits geladen sind: Code: status = VOK.DB_IsActive(dbConnection) Mit freundlichen Grüßen RE: Min- / Max- / Sum- / Avg- Wert aus einer DB - Kärcher Steuerungstechnik GmbH - 02.12.2013 Super jetzt klappt es. Nun hab ich auch die Vorgehensweise verstanden Danke |