Forum

 
  Forums  Client  Configuration -...  VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)
Previous Previous
 
Next Next
New Post 10/2/2008 12:43 PM
Resolved
User is offline dbaur
14 posts
9th Level Poster


VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

folgendes Szenario: ich brauche ein Call-Routing in dem ich per DTMF-Zeichenfolge eine Postleitzahl (PLZ) Abfrage und diese in einer Access Datenbank Prüfe. Je nach Ergebnis steht in der Tabelle in der 2. Spalte eine anderes Ergebnis. Das Ergebnis sind 3 verschiedene andere Tabellen die sich auch in der Datenbank befinden.
Danach soll in der 2. Tabelle ein Datumsbereich geprüft werden. Wenn das Datum ein Treffer ergibt, dann wird der Variable Callnbr der Wert des Feldes "Supporter" zugewiesen (Das ist immer eine Telefonnummer).
An diese Telefonnummer soll dann durch gestellt werden.

Nun habe ich das Problem, dass ich mich nicht besonders gut mit VB Script auskenne. Ich hatte jedoch ein Script welches ich abändern konnte. Das Problem ist, dass in meinem Script irgendwo ein Fehler sein muss, welchen ich nicht finde, denn sobald ich das Script in meinem Call-Routing verwende kommt überhaupt keine Verbindung zu diesem Call-Routing-User mehr zu Stande.

Möglicherweise hat ja jemand der sich mit VB etwas besser aus kennt ja die Möglichkeit mal einen Blick auf dieses Script zu werfen. Vielleicht sieht man den Fehler ja direkt, wenn man sich damit auskennt.

Das Script sieht folgendermaßen aus:

-------------------------------------------------------------------------

 Dim sDSN
sDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\CallRoutingDB\Service24.mdb"

Const adOpenKeyset = 1
Const adLockOptimistic = 3
Const adCmdTable = &H0002

Dim db, rs, result1, CallSeq, PLZ, Callnbr

Set db = CreateObject("ADODB.Connection")
db.Open sDSN

Set rs = CreateObject("ADODB.Recordset")
rs.Open "PLZ-Liste", db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
if rs.Fileds("PLZ").Value != PLZ then
rs.MoveNext
else
CallSeq = rs.Fields("Bezirk").Value
Exit do
end if

rs.close
set rs = nothing

Set rs = CreateObject("ADODB.Recordset")
rs.Open CallSeq, db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
result1 = now() > rs.Fileds("StartDate").Value AND now() < rs.Fields("EndDate").Value

if result1= 0 then
rs.MoveNext
else
Callnbr = rs.Fields("Supporter").Value
Exit do
end if

rs.close
set rs = nothing

db.close
set db = nothing

-------------------------------------------------------------------------

Wenn ich hier irgendwo Dateien hochladen kann, dann könnte ich die Datenbank und das Call-Routing Script auch noch hoch laden, dass würde die Sache vielleicht etwas anschaulicher machen.

 

Vielen Dank

Dennis

 
New Post 10/2/2008 1:00 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Was sagt denn das Event Log zu dem Thema ?

Wenn ein Laufzeitfehler waehrend des Call Routings auftritt wird er dort vermerkt. Das sollte auf alle Faelle weiter helfen.

Beliebter Fehler bei Access Datenbanken ist, dass der SwyxServer keine Zugriffsrechte auf die MDB Datei hat. Der Benutzer unter dem der SwyxServer Service laeuft muss ueber entsprechende Rechte (lesen, schreiben) verfuegen.

Tom.


Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 1:05 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Wo finde ich das Event Log um mir das anzugucken?

Also der Zugriff auf die Datenbank funktioniert. Ich hab mir ein einfaches Script gebaut um das zu Testen:

--------------------------

Dim sDSN
sDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\CallRoutingDB\Service24.mdb"

Const adOpenKeyset = 1
Const adLockOptimistic = 3
Const adCmdTable = &H0002

Dim db, rs, result1, CallSeq, PLZ, Callnbr

Set db = CreateObject("ADODB.Connection")
db.Open sDSN

Set rs = CreateObject("ADODB.Recordset")
rs.Open "VBO", db, adOpenKeyset, adLockOptimistic, adCmdTable

Callnbr = rs.Fields("Supporter").Value

rs.close
set rs = nothing

db.close
set db = nothing

---------------------------------------------

Damit ruf ich einfach eine der Telefonnummern an, die in der Datenbank hinterlegt sind. Daraus hab ich auch geschlossen, dass oben in dem Script irgendwo ein Fehler sein muss.

 

 
New Post 10/2/2008 1:11 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Eigenschaften "My Computer" / Manage / System Tools / Event Viewer / Application oder SwyxWare.

Alternativ kannst Du auch in der Server Trace File schauen:

C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Swyx\Traces\SwyxServer.log

Merkt Dir wann Du einen Testanruf in das Skipt gemacht hast und such Dir den Ruf anhand des Zeitstempels aus der Datei raus. Laufzeitfehler sollten einfach zu finden sein, in dem Du nach "Laufzeitfehler" oder "Runtime Error" suchst.


Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 1:18 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

ja deiner Vermutung war genau richtig, das Log sagt folgendes:

Ein Skript wurde wegen eines Skript-Fehler beendet oder nicht ausgeführt.

 

Skript: callrouting.vbs (User, Test-CallRouting)

Fehler: Kompilierungsfehler in Microsoft VBScript, Name erneut definiert, 800a0411

 

Weitere Informationen finden Sie in der Dokumentation oder unter http://www.swyx.de/support/event.html

 
New Post 10/2/2008 1:53 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Vielleicht hat ja jemand Zeit mal über mein VB Script zu gucken, denn ich habe den Fehler bisher nicht finden können.

 
New Post 10/2/2008 2:00 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Nimm den Zeitstempel aus dem Eventlog und schau damit ins Server Trace. Die Fehlermeldung dort sollte aussagekraeftiger sein.

Hast Du zufaellig mehrere Skipte auf dem Benutzer in denen Du gleichnamige Variablen oder Konstanten definierst ?

 


Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 2:18 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

also Aktiv auf dem User ist immer nur 1 Script, ich hab natürlich zum testen verschiedene Scripte die zum Teil auch gleichen Variablen benutzen. (Aber nie mehrere gleichzeitig Aktiv)

Das SwyxServer.log sagt folgendes aus:

2008/10/02 12:13:07 001198 *ERR SrvScrAPI  013B7B70 00000deb SPBXScriptSite::OnScriptError    ()
~Code:   0
~Src:    Kompilierungsfehler in Microsoft VBScript
~Desc:   Name erneut definiert
~RetVal: 800a0411
~Line:   15845
~Column: 38
~Source code:
~        Dim db, rs, result1, CallSeq, PLZ, Callnbr
~                                      ^ error position
2008/10/02 12:13:07 001198 *ERR SrvScrAPI  013AC940 00000deb SH::ScriptEngineThread::Main     () failed, errorUnknown error 0x80020101
2008/10/02 12:13:07 000908 *ERR SrvScrAPI  0B6E9440 00000deb SScriptHost::Initialize          (Test-CallRouting) failed, error Unknown error 0x80020101
2008/10/02 12:13:07 000908 *ERR SrvPBXCtl  0B5F4DE0 00000deb SScrServer::ActionOnScrStart     (26, Test-CallRouting) script host init failed, 1
2008/10/02 12:13:07 000908 Info SrvScrAPI  0B6E9440 00000deb SScriptHost::Delete              () script finished, remove SScriptSrvItf ref, confCnt= 0
2008/10/02 12:13:07 000908 Info SrvPBXCtl  0B5F4DE0 00000deb SScrServer::ProcessFSM           ()

-------------------------------------------

Ich hoffe damit habe ich den Teil erwischt, der relevant ist, denn in dieser einen Sekunde sind Logs über mehrere Seiten.

 
New Post 10/2/2008 2:39 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)
Modified By dbaur  on 10/2/2008 1:39:33 PM)

so ich bin etwas weiter gekommen, der 1. Fehler war, dass ich die Variable PLZ in dem Script definiere obwohl ich diese schon vorher in dem Block DTMF-Zeichen empfangen entgegen nehmen. Den Fehler hab ich behoben und dann hatte ich noch den Syntax fehler das bei VB ungleich nicht != sondern <> sein muss. Das hab ich nun angepasst und dafür einen neuen Fehler:

----------------------------------------------------

Dim sDSN
sDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\CallRoutingDB\Service24.mdb"

Const adOpenKeyset = 1
Const adLockOptimistic = 3
Const adCmdTable = &H0002

Dim db, rs, result1, CallSeq, PLZ2, Callnbr
PLZ2=PLZ

Set db = CreateObject("ADODB.Connection")
db.Open sDSN

Set rs = CreateObject("ADODB.Recordset")
rs.Open "PLZ-Liste", db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
if rs.Fileds("PLZ").Value <> PLZ2 then
rs.MoveNext
else
CallSeq = rs.Fields("Bezirk").Value
Exit do
end if

rs.close
set rs = nothing

Set rs = CreateObject("ADODB.Recordset")
rs.Open CallSeq, db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
result1 = now() > rs.Fields("StartDate").Value AND now() < rs.Fields("EndDate").Value

if result1= 0 then
rs.MoveNext
else
Callnbr = rs.Fields("Supporter").Value
Exit do
end if

rs.close
set rs = nothing

db.close
set db = nothing

--------------------------

Ich habe die Änderungen fett makiert.

Die neue Fehlermeldung ist folgende:

~Code:   0
~Src:    Kompilierungsfehler in Microsoft VBScript
~Desc:   Anweisung erwartet
~RetVal: 800a0400
~Line:   15937
~Column: 6
~Source code:
~      Case "ConnectTo6"
~      ^ error position
2008/10/02 13:29:36 000914 *ERR SrvScrAPI  06851840 00000dfb SH::ScriptEngineThread::Main     () failed, errorUnknown error 0x80020101
2008/10/02 13:29:36 000ce8 *ERR SrvScrAPI  068C7F88 00000dfb SScriptHost::Initialize          (Test-CallRouting) failed, error Unknown error 0x80020101
2008/10/02 13:29:36 000ce8 *ERR SrvPBXCtl  0B732010 00000dfb SScrServer::ActionOnScrStart     (26, Test-CallRouting) script host init failed, 1
2008/10/02 13:29:36 000ce8 Info SrvScrAPI  068C7F88 00000dfb SScriptHost::Delete              () script running, delay deletion, confCnt= 0
2008/10/02 13:29:36 000ce8 Info SrvPBXCtl  0B732010 00000dfb SScrServer::ProcessFSM           ()

 
New Post 10/2/2008 3:12 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Du hast 2 "Do" Schleifen in Deinem Code, aber nirgendwo ein "Loop".

Damit ist es kein Wunder dass die Skripting Engine anschliessend irgendwann ins Straucheln geraet. Ich wuerde den Code mal nehmen und ein wenig einruecken was die IFs und DOs angeht. Dann solltest Du sehr rasch die fehlerhaften Stellen finden.


Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 3:37 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

das mit dem loop war schonmal ein guter Rat. Damit bin ich wieder ein kleines Stück weiter gekommen.

Der Code sieht nun folgendermaßen aus:

--------------------------------

Dim sDSN
sDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\CallRoutingDB\Service24.mdb"

Const adOpenKeyset = 1
Const adLockOptimistic = 3
Const adCmdTable = &H0002

Dim db, rs, rs2, result1, CallSeq, PLZ2, Callnbr
PLZ2=PLZ

Set db = CreateObject("ADODB.Connection")
db.Open sDSN

Set rs2 = CreateObject("ADODB.Recordset")
rs.Open "PLZ-Liste", db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
 if rs2.Fields("PLZ").Value <> PLZ2 then
  rs.MoveNext
 else
  CallSeq = rs2.Fields("Bezirk").Value
Exit do
 end if
loop

rs2.close
set rs2 = nothing

Set rs = CreateObject("ADODB.Recordset")
rs.Open CallSeq, db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
 result1 = now() > rs.Fields("StartDate").Value AND now() < rs.Fields("EndDate").Value

  if result1= 0 then
   rs.MoveNext
  else
   Callnbr = rs.Fields("Supporter").Value
Exit do
  end if
loop

rs.close
set rs = nothing

db.close
set db = nothing

--------------------------------------

Nun hab ich zwar einige Fehler ausgemerzt. Jedoch bin ich leider immer noch nicht am Ziel, ich hab leider nun wieder einen neuen Fehler:

~Code:   0
~Src:    Microsoft JET Database Engine
~Desc:   Syntaxfehler in FROM-Klausel.
~RetVal: 80040e14
~Line:   15852
~Column: 8
~Source code:
~        Set rs2 = CreateObject("ADODB.Recordset")

~        ^ error position
2008/10/02 14:27:28 001580 Info SrvPBXCtl  0B732010 00000e11 SScrServer::OnScriptFinished     ()
2008/10/02 14:27:28 001580 Info SrvPBXCtl  0B732010 00000e11 SScrServer::ActionOnScrFinish    () script finished -> inform main FSM to finish call
2008/10/02 14:27:28 001580 Info SrvScrAPI  06743AF8 00000e11 SScriptHost::Delete              () script running, delay deletion, confCnt= 31
2008/10/02 14:27:28 001580 Info SrvPBXCtl  0B732010 00000e11 SScrServer::ProcessFSM           ()

--------------------------

Nun Frage ich mich wieso der an dieser Stelle den Fehler macht, zuvor funktionierte das ja Problemlos, zumindest in meinem Datenbank test.

 
New Post 10/2/2008 3:46 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Du instantiierst "rs2", rufst aber anschliessend die Open Methode eines noch nicht existierenden "rs" auf.


Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 4:00 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

ja du hast vollkommen recht, das mit dem rs2 hatte ich nur eben zum Testen eingebaut damit ich sehe an welcher Stelle der Fehler kommt, da ich ja 2. mal ein rs benutzt hatte. Ich hab das nun wieder geändert auf:

 

Dim sDSN
sDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\CallRoutingDB\Service24.mdb"

Const adOpenKeyset = 1
Const adLockOptimistic = 3
Const adCmdTable = &H0002

Dim db, rs, result1, CallSeq, PLZ2, Callnbr
PLZ2=PLZ

Set db = CreateObject("ADODB.Connection")
db.Open sDSN

Set rs = CreateObject("ADODB.Recordset")
rs.Open "PLZ-Liste", db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
 if rs.Fields("PLZ").Value <> PLZ2 then
  rs.MoveNext
 else
  CallSeq = rs.Fields("Bezirk").Value
Exit do
 end if
loop

rs.close
set rs = nothing

Set rs = CreateObject("ADODB.Recordset")
rs.Open CallSeq, db, adOpenKeyset, adLockOptimistic, adCmdTable

do while not rs.EOF
 result1 = now() > rs.Fields("StartDate").Value AND now() < rs.Fields("EndDate").Value

  if result1= 0 then
   rs.MoveNext
  else
   Callnbr = rs.Fields("Supporter").Value
Exit do
  end if
loop

rs.close
set rs = nothing

db.close
set db = nothing

---------------------------------

Der Fehler den ich dabei bekommen ist dieser:

~Code:   0
~Src:    Microsoft JET Database Engine
~Desc:   Syntaxfehler in FROM-Klausel.
~RetVal: 80040e14
~Line:   15852
~Column: 8
~Source code:
~        Set rs = CreateObject("ADODB.Recordset")

~        ^ error position
2008/10/02 14:54:30 000d34 Info SrvPBXCtl  0B6D2708 00000e25 SScrServer::OnScriptFinished     ()
2008/10/02 14:54:30 000d34 Info SrvPBXCtl  0B6D2708 00000e25 SScrServer::ActionOnScrFinish    () script finished -> inform main FSM to finish call
2008/10/02 14:54:30 000d34 Info SrvScrAPI  06743AF8 00000e25 SScriptHost::Delete              () script running, delay deletion, confCnt= 31
2008/10/02 14:54:30 000d34 Info SrvPBXCtl  0B6D2708 00000e25 SScrServer::ProcessFSM           ()

 
New Post 10/2/2008 4:22 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Ich vermute mal dass das Problem an der Stelle auftritt, an der Du das Recordset das zweite mal aufmachst. Bist Du Dir sicher, dass in der CallSeq Variable in dem Augenblick in gueltiger Tabellenname drin steht ?

Mittels PBXScript.OutputTrace kannst Du selbst etwas in das Server Trace File schreiben. Pflaster Deinen Code doch mal mit Tracing, mindestens die CallSeq Variable ist vor dem zweiten Oeffnen des Recordsets von Interesse.



Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 4:48 PM
User is offline dbaur
14 posts
9th Level Poster


Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

das Problem tritt schon an dem 1. Recordset auf, um das zu testen hatte ich das ja rs2 genannt. Ich habs mitlerweile wieder auf rs umbenannt, aber ich hab mal das  PBXScript.OutputTrace getestet. Wenn ich vor dem 1. Recordset das  PBXScript.OutputTrace benutze, dann taucht die Zeile auch im Log auf, wenn ich das dahinter machen, dann taucht die Zeile nicht im Log auf, daraus schließe ich, dass der schon beim 1. Recordset den Fehler hat und an dieser Stelle abbricht. Oder irre ich mich da?

 
New Post 10/2/2008 5:05 PM
User is offline Tom Wellige
821 posts
www.swyx.com
1st Level Poster








Re: VB Script Problem (Call-Routing mit DTMF und MS Access Datenbank)  (Germany)

Kann es sein, dass die Jet Engine keine Bindestriche in Tabellen Namen mag ? Versuch mal den Tabellen Namen in eckigen Klammern [ ] anzugeben.

Was ich mich die ganze Zeit schon frage, ist warum Du so verschwenderisch mit Performance auf Deinem Rechner umgehst, und nicht einfach die Datenbank Dir die Dinge ermitteln laesst, die Du haben willst. Dafuer hat man die doch schliesslich.

Im ersten Fall saehe das SQL Statement dann etwa so aus:

Dim sSQL
sSQL = "select Bezirk from [PLZ-LISTE] where PLZ = '" & PLZ & "'"

(vorausgesetzt das PLZ Feld ist ein String Feld, sonst kannst Du die einfachen Anfuehrungszeichen weg lassen)

Ebenso solltest Du aus Performance-Gruenden das Recordset grundsaetzlich als adOpenForwardOnly aufmachen. Ebenso reicht Dir ein adLockReadOnly vollkommen aus.


Tom Wellige
(Lead Solution Consultant, Swyx)

"It is a capital mistake to theorize before you have all the evidence. It biases the judgment."
Sir Arthur Conan Doyle - Sherlock Holmes - A Study in Scarlet

 
New Post 10/2/2008 5:57 PM