PeterK Posted April 27, 2018 #1 Share Posted April 27, 2018 Hallo, wie wird denn innerhalb der NetPhone-Anlage (v11.10.2909) die Variable „IpPbx.CallingName“ gesetzt? Leider ist diese bei uns immer leer. Ist es möglich, diese Variable z.B. durch ein VB-Script selbst zu setzen? Peter Link to comment Share on other sites More sharing options...
Tom Wellige Posted April 27, 2018 #2 Share Posted April 27, 2018 Die Variable IpPbx.CallingName enthält dann bereits einen Wert, wenn der Server bevor er das Call Routing gestartet hat, den Namen aus dem globalen Telefonbuch auflösen konnte. Man kann auch jederzeit und ganz einfach selbst einen Namen setzen: IpPbx.CallingName = "Erika Mustermann" Man kann auch einen vorhandenen Wert manipulieren. Angenommen ich möchte dem Benutzer dem der Ruf zugestellt wird, mitteilen, dass dieser Ruf ursprünglich mal für den Chef war, er von dort aber hierher weiter geleitet wurde. Ich kann dann z.B. "CHEF" mit in die Variable und damit ins Display des Clients oder Telefons schreiben: IpPbx.CallingName = "CHEF - " & IpPbx.CallingName Jetzt steht unabhängig davon, ob der Server den Anrufernamen bereits aufgelöst hat immer "CHEF" am Anfang des Displays. Mehr zu dieser Variable ist hier dokumentiert: IpPbx.CallingName Link to comment Share on other sites More sharing options...
PeterK Posted April 27, 2018 Author #3 Share Posted April 27, 2018 Vielen Dank für diese Info! Das war auch genau das, was ich hören wollte ? Ich hatte das schon ausprobiert, aber in einem Block "Variable setzen". Dort wurde mir die Zuweisung auf IpPbx.CallingName nicht akzeptiert, da der Variablenname nur Buchstaben und Zahlen beinhalten darf. Im Start-Block funktioniert es aber. Also nehme ich mal ein VBScript... Peter Link to comment Share on other sites More sharing options...
Tom Wellige Posted April 27, 2018 #4 Share Posted April 27, 2018 Der "Variable setzen" Block geht an der Stelle nicht, weil der ausschlieslich dazu benutzt werden kann, GSE eigene Variablen anzulegen bzw. zu setzen. Wenn man damit eine Variable setzt, wird dafür automatisch im generierten VBScript Code eine Variable erzeugt. Und da normale VBScript Variablen keine Objekte sind, kann man dort dann auch mittels "." keine Eigenschaften oder Methoden ansprechen. Ausserhalb von dem Block kann man aber eigentlich überall dort auf die Server Script API zugreifen, wo am Ende einer Textzeile der "x/y" Button ist. Link to comment Share on other sites More sharing options...
PeterK Posted May 2, 2018 Author #5 Share Posted May 2, 2018 Vielen Dank für die Info! Interessant - oder besser gesagt super - ist, dass sich das Setzen der Variable IpPbx.CallingName auch auf viele anderen Stellen auswirkt, so z.B. die Einträge zu den Einzelverbindungsinformationen (wir nutzen eine Datenbank, dort ist es die Spalte OriginationName), im Rufjournal der einzelnen Benutzer sowie auch im Display der Telefone. Gibt es eigentlich auch einen Weg, bei ausgehenden Rufen die Datenbank-Spalten CalledName bzw. DestinationName über ein Script zu füllen? CallRouting-Regeln funktionieren hier ja nicht, da diese nur bei eingehenden Verbindungen wirksam werden und ich habe auch keine dementsprechende Variable gefunden. Peter Link to comment Share on other sites More sharing options...
PeterK Posted May 2, 2018 Author #6 Share Posted May 2, 2018 Noch eine Frage: Ich versuche, das Script im PreProcessing laufen zu lassen. Die Regel an sich ist ganz einfach (s. Bild unten) Im Startblock steckt ein bisschen VBScript, welches in anderen Regeln problemlos läuft. Eigentlich erfolgt nur die Zuweisung IpPbx.CallingName = GetNameFromNumber(IpPbx.CallingNumber) (mit GetNameFromNumber als eigene VB-Methode) Solange ich dies nicht als PreProcessing speichere, läuft alles. Wenn ich es aber unter dem Namen PreProcessing speichere, bekomme ich Laufzeitfehler ~Code: 0 ~Src: Laufzeitfehler in Microsoft VBScript ~Desc: Objekt erforderlich: '' ~RetVal: 800a01a8 ~Line: 164 ~Column: 0 ~Source code: ~ Kann es daran liegen, dass ich die beiden Dateien noch nicht im GLOBAL Scope habe (nur im Scope des aktuellen Benutzers). Ich wollte erst mal sehen, ob es funktioniert, bevor ich es auf GLOBAL setze... Peter Link to comment Share on other sites More sharing options...
Tom Wellige Posted May 18, 2018 #7 Share Posted May 18, 2018 Ganz wichtig: es muss der Ausgang Regel übersprungen und nicht Regel ausgeführt verwendet werden. Sonst wird anschliessend keine einzoge Regel eines Benutzers mehr gestartet. Wie sieht denn die VBSkript Funktion GetNameFromNumber aus? Link to comment Share on other sites More sharing options...
PeterK Posted May 23, 2018 Author #8 Share Posted May 23, 2018 Hier ist der Code: ' FileOpen iomode Values Const fsoForReading = 1 Const fsoForWriting = 2 Const fsoForAppending = 8 Const fsoCreateIfNotExist = True ' 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 = &H8 Const adCmdText = &H1 Const adCmdTable = &H2 Const adCmdStoredProc = &H4 Function GetNameFromNumber(ByVal number) Dim sDsn Dim sSQL2 Dim rs Dim db Dim TNr Dim sReturn sDsn = "Provider=SQLOLEDB;Data Source=<MySource>;Initial Catalog=<MyDB>;User ID=CDR;Password=<MyPassword>" Set db = CreateObject("ADODB.Connection") db.Open sDsn sSQL2 = "SELECT TOP(1) Name FROM Contacts WHERE (LEFT('" & number & "', LEN(PhoneNumber)) = PhoneNumber) ORDER BY LEN(PhoneNumber) DESC" Set rs = CreateObject("ADODB.Recordset") rs.Open sSQL2, db, adOpenDynamic, adLockOptimistic, adCmdText If rs.eof = True Then sReturn = "" Else sReturn = rs("Name") End If sReturn = Trim(sReturn) rs.Close Set rs = Nothing db.Close Set db = Nothing Set sSQL2 = Nothing GetNameFromNumber = sReturn End Function IpPbx.CallingName = GetNameFromNumber (IpPbx.CallingNumber) Link to comment Share on other sites More sharing options...
Tom Wellige Posted May 23, 2018 #9 Share Posted May 23, 2018 Ich sehe da ehrlich gesagt keinen Grund für die Fehlermeldung. Da muss noch irgendetwas anderes im Call Routing des Test Benutzers stecken, was hier stört. Was ist denn, wenn das PreProcessing auf einen komplett neuen Testbenutzer an den Start gebracht wird? On 5/2/2018 at 3:03 PM, PeterK said: Kann es daran liegen, dass ich die beiden Dateien noch nicht im GLOBAL Scope habe (nur im Scope des aktuellen Benutzers). Ich wollte erst mal sehen, ob es funktioniert, bevor ich es auf GLOBAL setze... Auf gar keine Fall solltest Du ein PreProcessing global hinterlegen, welches auf dem Testbenutzer noch nicht sauber läuft. Du kannst damit alle kommenden Rufe für alle Benutzer in der SwyxWare "abschalten". Ich würde das Skript ein klein wenig anders schreiben. In der Funktion selbst ist es nur "Dekoration", beim Aufruf der Funktion aber nicht. Wenn Du mittels IpPbx.CallingName einen Namen setzt (auch wenn es nur ein Leerstring ist), werden damit voherigen Namensauflösungen (z.B. gegen das globale Telefonbuch) überschrieben. Du solltest den Namen also nur setzen, wenn Du auch einen aus den CDRs zurück bekommen hast. ' 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 = &H8 Const adCmdText = &H1 Const adCmdTable = &H2 Const adCmdStoredProc = &H4 Function GetNameFromNumber(ByVal number) Dim sDsn, sSQL Dim db, rs Dim sReturn sReturn = "" sDsn = "Provider=SQLOLEDB;Data Source=<MySource>;Initial Catalog=<MyDB>;User ID=CDR;Password=<MyPassword>" Set db = CreateObject("ADODB.Connection") db.Open sDsn sSQL = "SELECT TOP(1) Name FROM Contacts WHERE (LEFT('" & number & "', LEN(PhoneNumber)) = PhoneNumber) ORDER BY LEN(PhoneNumber) DESC" Set rs = CreateObject("ADODB.Recordset") rs.Open sSQL, db, adOpenDynamic, adLockOptimistic, adCmdText If not rs.eof = True Then sReturn = Trim(rs("Name")) End If rs.Close Set rs = Nothing db.Close Set db = Nothing GetNameFromNumber = sReturn End Function Dim sName sName = GetNameFromNumber (IpPbx.CallingNumber) if sName <> "" then IpPbx.CallingName = sName Link to comment Share on other sites More sharing options...
PeterK Posted May 24, 2018 Author #10 Share Posted May 24, 2018 Hallo, danke für Deine Hinweise! Aber leider bekomme ich das Problem einfach nicht zu fassen. Ich habe die obige Regel insofern modifiziert, dass der Ausgang des Startblocks mit "Regel übersprungen" verbunden ist (im Startblock ist der obige Code eingetragen). Wenn ich diese Regel z.B. als "Test" speichere, funktioniert alles. Sobald ich diese aber als "PreProcessing" speichere, steht im Logfile die oben erwähnte Fehlermeldung. Was mir aufgefallen ist: Auch nach dem Speichern der Regel als "PreProcessing" erscheint diese als "PreProcessing" im Call Routing Manager des entspr. Benutzers und kann wie jede andere Regel bearbeitet/verschoben etc. werden (ich hatte erwartet, dass die "PreProcessing"-Regel in der Liste nicht angezeigt wird - habe die Regel aber noch nicht auf "GLOBAL" gesetzt) Peter Link to comment Share on other sites More sharing options...
Tom Wellige Posted May 25, 2018 #11 Share Posted May 25, 2018 Es ist vollkommen normal, dass Du die Regel bei Deinem Test Benutzer siehst. Du hast sie ja sort selbst angelegt. Wenn Du das nicht machst (also bei allen anderen Benutzern) wird eine global interlegte PreProcessing Regel gestartet (aus dem System Default Scope). Diese global interlegte Regel taucht aber nirgendwo in Call Routing Managern auf. Hast Du mal einen neuen frischen Testbenutzer ausprobiert? Exportiere Deine Regel doch bitte mal als .rse Datei und schick mir die entweder per PM oder häng die hier an Deine Antwort dran. Link to comment Share on other sites More sharing options...
PeterK Posted May 28, 2018 Author #12 Share Posted May 28, 2018 Ich habe das jetzt mal mit einem komplett neu angelegten Testbenutzer probiert - es ist das Gleiche (beide Benutzer sind deaktiviert, sprich Anmelden ist nicht erlaubt; soll auch so sein, da sofortige Weiterleitung zu anderer Rufnummer) Die exportierte Regel habe ich angehängt - nur Benutzername/Passwort sind gegenüber dem Original verändert NetPhone-Version: 11.10.2909.0 Peter PreProcessing(export).zip Link to comment Share on other sites More sharing options...
Tom Wellige Posted May 30, 2018 #13 Share Posted May 30, 2018 Und auf dem Testbenutzer ist nur diese eine Regel mit dem Namen "PreProcessing" hinterlegt, sonst nichts (neben den 3 System Umleitungsregeln) ? Link to comment Share on other sites More sharing options...
PeterK Posted May 30, 2018 Author #14 Share Posted May 30, 2018 Im IpPbx File Explorer sehe ich: callrouting.vbs crmhst.dat rulePreProcessing.rse rulePreProcessing.vbs user_book.srb Peter Link to comment Share on other sites More sharing options...
Tom Wellige Posted May 30, 2018 #15 Share Posted May 30, 2018 Ich habs gefunden: das Problem ist "IpPbx.CallingNumber". So wie es aussieht ist das "IpPbx" Objekt in dem Fall noch nicht instantiiert. Wenn man statt dessen direkt auf die Server Script API zugreift ist alles ok. Ich habe Deinen Code nochmal etwas "aufgehübscht" ' 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 = &H8 Const adCmdText = &H1 Const adCmdTable = &H2 Const adCmdStoredProc = &H4 Function GetNameFromNumber (sNumber) On Error Resume Next Dim db, rs Dim sDsn, sSQL Dim sReturn sReturn = "" sDsn = "Provider=SQLOLEDB;Data Source=<MySource>;Initial Catalog=CDR;User ID=<MyUser>;Password=<MyPassword>" Set db = CreateObject("ADODB.Connection") db.Open sDsn if Err <> 0 then sSQL = "SELECT TOP(1) Name FROM Contacts WHERE (LEFT('" & sNumber & "', LEN(PhoneNumber)) = PhoneNumber) ORDER BY LEN(PhoneNumber) DESC" Set rs = CreateObject("ADODB.Recordset") rs.Open sSQL, db, adOpenDynamic, adLockOptimistic, adCmdText if Err <> 0 then if not rs.eof then sReturn = Trim(rs("Name")) end if end if rs.Close Set rs = Nothing end if db.Close Set db = Nothing GetNameFromNumber = sReturn End Function Dim sNum sNum = GetNameFromNumber (PBXCall.CallingPartyNumber) if sNum <> "" then PBXCall.CallingPartyName = sNum Link to comment Share on other sites More sharing options...
PeterK Posted May 31, 2018 Author #16 Share Posted May 31, 2018 Hallo Tom, vielen, vielen Dank für die Fehlersuche! PS: Das "Aufhübschen" wäre schon noch gekommen, aber erst wenn alles funktioniert ? Peter Link to comment Share on other sites More sharing options...
Most Valued User Christian Posted December 5, 2018 Most Valued User #17 Share Posted December 5, 2018 Hallo Zusammen, ich habe seit Version 11 ein ähnliches Problem, CallingName wird nicht mehr konsequent neu Geschrieben. Dabei ist es augenscheinlich egal ob ich PBXCall.CallingPartyName oder IpPbx.CallingName verwende. Folgendes kann ich nachvollziehen: Wenn ich mittels IpPbx.CallingName arbeite, wird beim ersten Schreiben des Namens der Name korrekt geschrieben und findet sich anschließend sowohl im ActiveCall des SDK wieder, als auch im CDR. Wenn ich in PBXCall.CallingParyName schreibe, dann ist in der CDR hinterher der CallingName leer. Sowohl in der IpPbxSrv.log, in der Callhistorie des Callroutingusers als auch beim Abfragen von PBXCall.CallingPartyName oder IpPbx.CallingName bekomme ich aber jeweils den von mir geschriebenen Wert angezeigt. if sCallingName <> "" then IpPbx.CallingName = sCallingName vzTrace "------> IpPbx.CallingName aktualisiert: " & IpPbx.CallingName end if Jemand eine Idee? Link to comment Share on other sites More sharing options...
Tom Wellige Posted December 6, 2018 #18 Share Posted December 6, 2018 Das hört sich für mich nach einem Fall für den Support an. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.