Betreffend den Anworten:
- Was ist der Unterschied zwischen der "Funktion" und der "Sub"? (Also Funktion verstehe ich glaubs soweit...aber den Unterschied nicht)
Ein Sub-Prozedur ist eine Ansammlung von Anweisungen, die "nur" ausgeführt werden sollen.
Eine Funktion liefert zusätzlich noch ein Ergebnis an den Aufruf zurück, den Rückgabewert.
Ich programmiere gerne so, dass ich die Scripte nicht nur für genau einen Anwendungsfall nutzen kann, sondern versuche eher alles ein wenig universell zu halten.
In diesem Fall habe ich in meinem HMI nicht nur ein Rezept, sondern 4 von denen.
Also wollte ich das Script:
a) nicht auf ein bestimmtes sondern alle 4 Rezepte nutzen können
b) den Startwert universell und nicht von nur einer bestimmten Variablen haben
c) die Suche in beide Richtungen ermöglichen
und
d) das Ergebnis individuell für alle 4 Rezepte verarbeiten können.
Für a) bis c) habe ich daher dem Script 3 Eingangsvariablen verpasst und kann diese so für jeden Scriptaufruf individuell vorgeben
und für d) das Script als Funktion, weil ich so das Suchergebnis wieder nicht nur einer bestimmten Variablen sondern als Rückgabewert bei jedem Scriptaufruf einer individuellen Variablen zuweisen kann.
-
@hucki : Was genau macht diese Zuweisung: "vbRecordNext = StartNr". "vbRecordNext" ist ja der Funktionsname. Wieso kriegt der einen Variablenwert zugewiesen. Ist das nur, damit ein Rückgabewert der Funktion gegeben ist, falls sie sonst keine Einträge findet?
Da das Script als Funktion deklariert ist, gibt diese über ihren Namen ein Ergebnis an den Scriptaufruf zurück.
Und Du hast genau richtig erkannt, dass mit dieser Zuweisung dafür gesorgt wird, dass in jedem Fall auch ein Ergebnis vorhanden ist.
Funktion ohne Rückgabewert = Fehler
Zwischen "Loop While..." und "ResetBit..." würde ich als Nächstes noch eine Abfrage einfügen, ob "vbRecordNext = StartNr" und ggf. für den Benutzer eine Meldung ausgeben, dass kein weiterer Datensatz vorhanden ist.
Das habe ich mittlerweile auch noch umgesetzt.
Auch wenn es Dir im konkreten Fall nicht wirklich weiter hilft, weil Dir mein Info-Popup fehlt, so hilft es vielleicht zumindest als Anregung:
Code:
Function vbRecordNext(ByVal RecipeNr, ByVal StartNr, ByVal Dir)
'
'Script: vbRecordNext
'Version: 1.00
'Author: hucki
'issue Date: 09.02.2024
'last modified: 10.02.2024
'State: draft
'
'Function: determines the next existing data record in order to select it (to skip gaps in the data storage)
' -> function is controlled using the status value of the query
' Ermittelt den naechst vorhandenen Datensatz, um diesen anzuwaehlen (um Luecken im Datenspeicher zu ueberspringen)
' -> Funktion wird mittels des Statuswertes der Abfrage gesteuert
'
'changes: . Dir-Limits
' - no further record
'
Const RECORD_MN = 1, RECORD_MX = 500 ' query limits
Const QUERY_RUN = 2, QUERY_FINISHED = 4, QUERY_ERROR = 12 ' query status
Const MSG_NO_RECORD = 6 ' info message number in tlInformation
Dim DataRecordNr, Add ' needed vars
Dim X_POS, Y_POS ' Position PopUp
X_POS = PopupPosNormal_X
Y_POS = PopupPosNormal_Y
If Dir > 0 Then
Add = 1
Else
Add = -1
End If
SetBit "QueryRunning"
vbRecordNext = StartNr
DataRecordNr = StartNr
Do
' next record number
DataRecordNr = DataRecordNr + Add
If DataRecordNr < RECORD_MN Or DataRecordNr > RECORD_MX Then Exit Do
' query
GetDataRecordName RecipeNr, DataRecordNr, "RecipeName", "DataRecordName", "QueryStatus"
' wait for execution
Do
Loop Until QueryStatus > QUERY_RUN
' evaluation
If QueryStatus = QUERY_FINISHED Then vbRecordNext = DataRecordNr
Loop While QueryStatus = QUERY_ERROR
' no further record
If vbRecordNext = StartNr Then
SetTag "gdbHmi.Info.Hardware.HMI.Message", MSG_NO_RECORD ' set Msg: no further record available
ShowPopupScreen "Information", X_POS, Y_POS, hmiOn, hmiAnimationOff, hmiFast ' show popup
End If
ResetBit "QueryRunning"
End Function