persistente Variable
Hallo Tom,
kurze Frage zu persistenten Variablen. Einrichten kein Problem, nutzen kein Problem. Aber folgendes Szenario:
In einer externen DB (SQL) liegt eine Tabelle mit Rufnummern. Diese abzufragen und in persistente Variablen zu schreiben ist kein Thema. Auch das Auswerten ist kein Thema, solange die externe DB erreichbar ist.
Jetzt komme ich aber zum Fehlerfall. Ich habe erwartet, daß wenn der externe Server nicht erreichbar ist, das Skript den schon in der DB der persistenten Variablen gespeicherten Wert liest und nutzt. Leider ist das nicht der Fall, denn der Wert wird, weil die externe DB nicht erreichbar ist, scheinbar mit "" (Null) überschrieben. Somit kann der Wert nicht ausgelesen werden.
Ich gehe davon aus, daß ich bei der Anwendung einen Fehler mache und bitte um Hilfe.
' CursorTypeEnum Values
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
' LockTypeEnum Values
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4
' CommandTypeEnum Values
Const adCmdUnknown = &H0008
Const adCmdText = &H0001
Const adCmdTable = &H0002
Const adCmdStoredProc = &H0004
' Globale Variablen deklarieren
Dim sHL, sHL1, sHL2, sRB1a, sRB1b, sRB1, sRB2, sRB3
Dim nHL1, nHL2, nRB1a, nRB1b, nRB2, nRB3
Dim db, rs, sDsn, sSQL, nReturn
nReturn = 0
' --- Verbindung zur Datenbank ---
PBXScript.OutputTrace "***Skript Pre-HL gestartet***"
sDsn = "Provider=SQLOLEDB;" & _
"Data Source=SQL01;" & _
"Initial Catalog=HL;" & _
"Integrated Security=SSPI;"
Set db = CreateObject("ADODB.Connection")
db.Open sDsn
If Err.Number <> 0 Then
PBXScript.OutputTrace "Error opening database: " & Err.Number & " - " & Err.Description
nReturn = 2
Else
sSQL = "SELECT [Person1], [Person2], [Nummer1], [Nummer2] FROM [EDV].[dbo].[Hotline];"
Set rs = CreateObject("ADODB.Recordset")
rs.Open sSQL, db, adOpenForwardOnly, adLockReadOnly, adCmdText
If Err.Number <> 0 Then
PBXScript.OutputTrace "Error accessing database: " & Err.Number & " - " & Err.Description
nReturn = 2
ElseIf rs.EOF Then
PBXScript.OutputTrace "No Data found"
nReturn=2
Else
' --- Variablen befuellen ---
nHL1 = NullToEmpty(rs("Person1").Value)
nHL2 = NullToEmpty(rs("Person2").Value)
sHL1 = NullToEmpty(rs("Nummer1").Value)
sHL2 = NullToEmpty(rs("Nummer2").Value)
sHL = sHL1 & ";" & sHL2
' --- Logging ---
PBXScript.OutputTrace "nHL1=" & nHL1 & ", nHL2=" & nHL2
PBXScript.OutputTrace "sHL1=" & sHL1 & ", sHL2=" & sHL2 & ", sHL=" & sHL
PBXScript.OutputTrace "sHL=" & sHL
nReturn = 0
End If
rs.Close
Set rs = Nothing
End If
db.Close
Set db = Nothing
Dim psHL
Set psHL = new PersistentVariable
psHL.Name = "psHL"
psHL.Value = sHL
UseExit = nReturn
Gruß
Thomas
-
Hallo Thomas,
gaaaaanz wichtig: mache aus Deinem Code bitte eine VBScript Funktion und platziere sie im Start Block.
Warum?
Nur so kannst Du eine eigene Fehlerbehandlung vernünftig implementieren. Dir fehlt ein
On Error Resume Next
an Anfang Deines Codes, um die Standard Fehlerbehandlung der SwyxWare auszuschalten um dann selbst auf Err <> 0 prüfen zu können.
Wenn Du das allerdings im "Skript Code einfügen" Block machst, schaltest Du im GESAMTEN Call Routing die Standard Fehlerbehandlung aus, und damit auch das Tracing von Fehlern.
Wenn Du Deinen Code in einer VBScript Funktion hast, und in dieser Funktion ganz am Anfang die Standard Fehlerbehandlung ausschaltest, dann ist sie nur innerhalb Deiner Funktion ausgeschaltet. Der Rest vom Call Routing verwendet nach wie vor die Standard Fehlerbehandlung.
Wie Du eigenen Code im Start Block anwendest wird Dir im Swyx Forum Archiv erklärt.
Wenn Du Dir da z.B. die Funktion CheckCallerInDatabase anschaust, dann siehst Du, dass dort wie oben beschrieben die Fehlerbehandlung in die eigenen Hände genommen wird.
Viele Grüße, Tom.
-
Hallo Tom,
wenn ich den Code in den Startblock als Funktion packe habe ich das gleich Problem. Das mit der Fehlerbehandlung ist eine Sache, das nutzen des schon in der persistenten Variable gespeicherte Wert als Rufnummer ist eine andere. Letzteres ist mir wichtiger. Es scheint zu sein, daß der Wert von psHL.Value immer mit "" überschrieben wird, wenn der SQL Server nicht erreichbar ist. Dann versucht der Server natürlich auch "" zu wählen.
Ich müsste ja gar keine Fehlerbehandlung machen, wenn der schon gespeicherte Wert in der lokalen DB IpPbxExtensions gewählt werden würde. Das geht aber nicht, weil der immer überschrieben wird.
Gruß
Thomas
-
Ich hatte mir Deinen Code nicht im Detail angeschaut. Du initialisierst die sHL Variable die Du ganz am Ende in die persistente Variable schreibst nur im Gut-Fall. In jedem der möglichen Fehler-Fälle ist die Varaible leer, und damit ist am Ende dann auch Deine persistene Variable leer.
Setze den Code zum befüllen der persistenten Variable einfach etwas höher, direkt unter das setzen der sHL Variable. Dann wird sie nur um Gut-Fall neu gesetzt.
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.

Kommentare
4 Kommentare