Jump to content

IpPbx.CallingName


PeterK

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

Link to comment
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:

 

 

 

Link to comment
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

 

Link to comment
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.

Link to comment
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

 

Link to comment
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

Link to comment
Share on other sites


  • 3 weeks later...

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


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


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


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


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


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


  • 6 months later...
  • Most Valued User

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


Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and have taken note of our Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.