Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Min- / Max- / Sum- / Avg- Wert aus einer DB
#1
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`;")
VDF.WriteInt 1,0,avg

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?
Kärcher Steuerungstechnik GmbH
Hofener Straße 56
D-70736 Fellbach
_________________________________
Antworten
#2
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
Daniel Orleth
Softwareentwicklung
Tel: +49 (0)2631 941288-0
Antworten
#3
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?
Kärcher Steuerungstechnik GmbH
Hofener Straße 56
D-70736 Fellbach
_________________________________
Antworten
#4
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
Daniel Orleth
Softwareentwicklung
Tel: +49 (0)2631 941288-0
Antworten
#5
Hallo Herr Orleth,

bin in diesem Gebiet noch blutiger Anfänger Wink
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

dim dbConnection as string = "DBname"
dim selectStringAVG as string = "SELECT AVG(Spalte2) FROM `Tabellenname`;"
dim selectStringDefault as string = "SELECT * FROM `Tabellenname`;"
dim avgWert as integer

VOK.DB_SetSelectString(dbConnection, selectStringAVG)

avgWert = VOK.DB_GetValue(dbConnection, 0, 0)

DEBUG.dPRint avgWert

VOK.DB_SetSelectString(dbConnection, selectStringDefault) 'Select-String auf default

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 Dodgy
Kärcher Steuerungstechnik GmbH
Hofener Straße 56
D-70736 Fellbach
_________________________________
Antworten
#6
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)
VOK.DB_Load(dbConnection)

VDF.WriteBitB 0,0,1,1,1 'Zweites Skript auslösen


Ein zweites VB-Programm überprüft dann, ob die Daten bereits geladen sind:
Code:
status = VOK.DB_IsActive(dbConnection)

Select Case status
   Case 0
       'Ladevorgang abgeschlossen
        VDF.WriteBitB 0,0,1,1,0
        avgWert = VOK.DB_GetValue(dbConnection, 0, 0)
   Case 1
        'DB-Verbindung noch aktiv, weiter warten, Bit nicht zurücksetzen
   Case -1
         'Fehler beim Laden, Bit zurücksetzen, evtl. Fehlerbehandlung
         VDF.WriteBitB 0,0,1,1,0
End Select



Mit freundlichen Grüßen
Daniel Orleth
Softwareentwicklung
Tel: +49 (0)2631 941288-0
Antworten
#7
Thumbs Up 
Super jetzt klappt es. Nun hab ich auch die Vorgehensweise verstanden Rolleyes

Danke
Kärcher Steuerungstechnik GmbH
Hofener Straße 56
D-70736 Fellbach
_________________________________
Antworten


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste