PeterK

IpPbx.CallingName

Recommended Posts

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

Share this post


Link to post
Share on other sites

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:

 

 

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

Regel.JPG

Share this post


Link to post
Share on other sites

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?

 

Share this post


Link to post
Share on other sites

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)

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Und auf dem Testbenutzer ist nur diese eine Regel mit dem Namen "PreProcessing" hinterlegt, sonst nichts (neben den 3 System Umleitungsregeln) ?

 

Share this post


Link to post
Share on other sites

Im IpPbx File Explorer sehe ich:

  callrouting.vbs

  crmhst.dat

  rulePreProcessing.rse

  rulePreProcessing.vbs

  user_book.srb

 

Peter

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Hallo Tom,

 

vielen, vielen Dank für die Fehlersuche!

PS: Das "Aufhübschen" wäre schon noch gekommen, aber erst wenn alles funktioniert 😏

 

Peter

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now