Створення спеціальних форм звітів для CUCM
У цій статті ми розглянемо приклади створення форм звітів з використанням Дизайнера Форм Звітів системи Tariscope для розширених параметрів CDR формату від Cisco Unified Communications Manager (CUCM). Під розширеними параметрами маються на увазі ті поля CDR файлів від CUCM, які не використовуються в цілях тарифікації викликів. Вони, як правило, не потрапляють в поданння Tariscope, але містяться у вихідних CDR файлах, і при відповідному налаштуванні в Tariscope обробляються і зберігаються в базі даних Tariscope. Їх інформація може бути корисна для виконання різних аналізів, відмінних від аналізу витрат на телефонні розмови. Також ця стаття може бути корисна просто як приклад по самостійному створенню необхідних форм звітів в системі Tariscope.
Зауважимо, що крім Дизайнера форм звітів, для створення форм звітів для Tariscope можна використовувати Microsoft SQL Server Report Builder.
Кілька слів про Дизайнер Форм Звітів
Дизайнер форм звітів є програмою, яка входить до складу білінгової системи Tariscope, яка призначена для редагування користувачем Tariscope форм звітів, що входять в інсталяційний пакет, або створення власних форм звітів, графіків, процедур, які працюють з базою даних.
Форма звіту являє собою шаблон звіту, що містить його структуру у вигляді таблиці, кожна з комірок якої може містити текстову інформацію, малюнки, змінні величини або функції. Кожна з комірок може мати власні параметри формату: шрифт тексту, заливку, кордони. В якості змінних величин можуть виступати змінні, створені користувачем, визначені поля з баз даних Tariscope або результати обробки цих полів.
Внутрішньо форма звіту складається з команд мови Visual Basic Script (VBScript) з декількома додатковими функціями, розробленими спеціально для цієї мети. Тому користувач, який добре знає мову VBScript може редагувати існуючу форму звіту або створювати власну в будь-якому текстовому редакторі. Однак, навіть для професійного програміста на VBScript дана робота в звичайному текстовому редакторі може викликати істотні ускладнення, не кажучи вже про більшість користувачів, які мало знайомі або взагалі не знайомі з мовою VBScript. Саме з метою полегшення роботи при редагуванні або створення нових форм звітів і була розроблена програма Дизайнер Форм Звітів.
Проте, слід зазначити, що для роботи з Дизайнером Форм Звітів користувачам буде потрібно розібратися зі структурою баз даних біллінгового комплексу Tariscope і створенням SQL запитів до баз даних.
Файли форм звітів мають розширення ABR. Вони зберігаються в папці: \Program Files (x86)\SoftPI\Tariscope4\Reports\. Підпапки є назвами груп форм звітів.
Звіт за причинами завершення викликів
Отже, припустимо, що нас цікавить: з яких причин завершуються виклики. Тобто це можуть бути: нормальне завершення виклику, абонент не відповідав, якісь помилки і т.п. Взагалі-то інформація про причини завершення міститься в поданні у відповідному полі. І застосувавши функцію групування можна отримати узагальнену інформацію про причини завершення викликів. Але спробуємо самі створити звіт за допомогою Дизайнера форм звітів.
Що для цього потрібно?
Во-первых, точно представлять, что хотим получить. Например, мы хотим иметь таблицу содержащую наименования причин завершения вызовов, их коды (коды отсутствуют в представления вызовов Tariscope), и соответствующее количество вызовов. Иметь информацию, за какой период времени обработаны данные, и, наконец, дату формирования отчета.
Откуда брать эту информацию?
Для це відкриємо документ "Tariscope 4.x. Каталог баз даних". Розділ 2 цього документа містить перелік всіх таблиць і подань бази даних Tariscope. Переглянувши цей перелік, знаходимо, що таблиця CallsCCM містить детальну інформацію про виклики. Далі переходимо до опису цієї таблиці (розділ 2.13). У ній знаходимо, що код причини завершення виклику міститься в поле origCause_value. Запам'ятовуємо цю назву та ім'я таблиці. Інші поля в цій таблиці нас для цього звіту не цікавлять.
Відкриваємо Дизайнер Форм Звітів, у вікні програми, в меню Файл, вибираємо Створити. Вікно програми набуде вигляду, як показано на малюнку 1.
Малюнок 1
У лівій частині вікна відображається форма звіту, а в правій (Декларація звіту) основні параметри звіту. З неї і почнемо створення звіту.
У позиції Назва вводимо назву звіту (не плутайте з ім'ям файлу форми звіту): Коди завершення викликів CUCM.
У позиції Опис вводимо короткий опис звіту. Він буде відображатися в режимі Звіти програми Tariscope.
Позиції Автор і Версія не є обов'язковми для заповнення.
У позиції Посилання вводиться посилання для відкриття інтернет сторінки, де наводиться докладний опис звіту. Якщо цією формою звіту можуть користуватися різні співробітники вашої компанії, і ви можете розмістити такий опис на сайті вашої компанії, то вкажіть відповідне посилання.
У позиції Дата за замовчуванням встановлюється поточна дата.
У списку Видимість залишаємо значення за замовчуванням: Always.
Заповнена декларація звіту показана на малюнку 2.
Малюнок 2
Щоб введені нами дані випадково не пропали, збережемо їх, вибравши в меню програми Файл → Зберегти як. Відкриється вікно для збереження файлу, де буде відображатися вміст папки Reports. Вибираємо потрібну підпапку і зберігаємо файл.
Тепер, щоб нам не заважала декларація звіту, встановлюємо курсор на кордоні вікна декларації та форми звіту, натискаємо ліву кнопку миші і приховуємо праву частину вікна.
Далі дещо змінимо загальні параметри форми звіту. Для цього виберемо в меню Звіт → Властивості звіту. З'явиться вікно Властивості звіту (рисунок 3). Змінимо параметри шрифту, заданих за замовчуванням. Ці параметри будуть за замовчуванням застосовуватися до кожної клітинки таблиці форми звіту. При необхідності кожна клітинка може мати власні параметри шрифту.
Малюнок 3
Введемо найменування звіту, додамо рядки і створимо SQL запит, який буде отримувати мінімальну і максимальну дату, яка міститься в поданні викликів, на базі якого буде формуватися звіт. Подібний SQL запит використовується в багатьох формах звіту, що поставляються з Tariscope. Тому його можна просто скопіювати з будь-якої іншої форми звіту:
SELECT MIN(CallDateTime) As MinDate, MAX(CallDateTime) as MaxDate FROM $Calls$ WHERE NOT CallDateTime IS NULL
Поле MinDate буде містити найбільш ранню дату / час виклику в поданні виклику, а поле MaxDate найбільш пізню дату / час в цьому поданні.
Ці дані відобразимо в позиції Період звіту. Також створимо позицію Дата звіту. Поточну дату для цієї позиції отримаємо за допомогою функції: Now.
Форма звіту набере вигляду, показаного на малюнку 4.
Малюнок 4
Зараз сформуємо основний запит, який буде групувати дані по полю origCause_value і підраховувати кількість викликів з конкретним кодом:
SELECT origCause_value, COUNT(origCause_value) as CauseNumber FROM CallsCCM WHERE CallID IN (SELECT ID FROM $Calls$) GROUP BY origCause_value ORDER BY origCause_value
origCause_value після слова SELECT означає, що потрібно відбирати таке поле.
COUNT(origCause_value) – буде підраховувати кількість викликів для конкретного коду і зберігатися в CauseNumber ("as CauseNumber").
Дані повинні вибиратися з (FROM) таблиці CallsCCM.
Слова WHERE і GROUP вказують на умови для відбору даних. Якщо ви обробляєте в Tariscope дані тільки від одного CUCM, то слово WHERE і все, що до слова GROUP, можна не вказувати. Якщо ж обробляються кілька CUCM, то щоб в таблиці CallsCCM знайти дані, що стосуються лише тих викликів, які відображаються в поданні, необхідно ввести вираз CallID IN (SELECT ID FROM $ Calls $).
Після GROUP BY вказується поле, по якому повинні групуватися дані.
І, нарешті, щоб дані були впорядочені за кодом завершення, вказується відповідне поле після ORDER BY.
Форма звіту буде мати вигляд, як показано на малюнку 5.
Малюнок 5
Далі в частині заголовка SQL запиту (в структурі звіту виділено червоним кольором) вводимо заголовок звіту.
У рядку тіла таблиці (знаходиться між рядками виділеними червоним і зеленим кольором) вводимо у відповідних стовбчиках поля запиту.
У рядку підсумків (виділена зеленим кольором) підраховуємо загальну кількість викликів. Для цього праворуч від заголовку таблиці вводимо: =MarkRow
Це означає, що підрахунок буде виконуватися з рядка нижче цього. А в підсумковому рядку введемо: =SumCol(3), що означатиме, що обчислюється сума рядків 4-го стовпця (нумерація стовпців відображається у верхній частині вікна звіту).
Все, форма звіту готова (малюнок 6).
Малюнок 6
Запускаємо її на виконання в програмі Tariscope і отримуємо результат (малюнок 7).
Малюнок 7
Проаналізувавши результат, можна забажати додати до звіту опис причини завершення виклику.
На даний момент ця інформація відсутня в базі даних, тому вирішити питання можливо, написавши невеликий код на VBScript. Створимо в ньому двомірний масив, що містить коди завершення і їх опис, і створимо функцію, яка повертає опис причини завершення виклику на основі отриманого аргументу - коду завершення. Для створення коду необхідно вибрати в меню програми Звіт → Загальний код. З'явиться вікно Загальний код, де і слід ввести програмний код, наведений нижче:
Dim codes (1,135)
codes (0,0)= 0
codes (0,1)= 1
codes (0,2) = 2
codes (0,3) = 3
codes (0,4) = 4
codes (0,5) = 5
codes (0,6) = 6
codes (0,7) = 7
codes (0,8) = 8
codes (0,9) = 9
codes (0,10) = 16
codes (0,11) = 17
codes (0,12) = 18
codes (0,13) = 19
codes (0,14) = 20
codes (0,15) = 21
codes (0,16) = 22
codes (0,17) = 26
codes (0,18) = 27
codes (0,19) = 28
codes (0,20) = 29
codes (0,21) = 30
codes (0,22) = 31
codes (0,23) = 34
codes (0,24) = 38
codes (0,25) = 39
codes (0,26) = 40
codes (0,27) = 41
codes (0,28) = 42
codes (0,29) = 43
codes (0,30) = 44
codes (0,31) = 46
codes (0,32) = 47
codes (0,33) = 49
codes (0,34) = 50
codes (0,35) = 53
codes (0,36) = 54
codes (0,37) = 55
codes (0,38) = 57
codes (0,39) = 58
codes (0,40) = 62
codes (0,41) = 63
codes (0,42) = 65
codes (0,43) = 66
codes (0,44) = 69
codes (0,45) = 70
codes (0,46) = 81
codes (0,47) = 82
codes (0,48) = 83
codes (0,49) = 84
codes (0,50) = 84
codes (0,51) = 86
codes (0,52) = 87
codes (0,53) = 88
codes (0,54) = 90
codes (0,55) = 91
codes (0,56) = 95
codes (0,57) = 96
codes (0,58) = 97
codes (0,59) = 98
codes (0,60) = 99
codes (0,61) = 100
codes (0,62) = 101
codes (0,63) = 102
codes (0,64) = 103
codes (0,65) = 110
codes (0,66) = 111
codes (0,67) = 122
codes (0,68) = 123
codes (0,69) = 125
codes (0,70) = 126
codes (0,71) = 127
codes (0,72) = 129
codes (0,73) = 131
codes (0,74) = 132
codes (0,75) = 133
codes (0,76) = 134
codes (0,77) = 135
codes (0,78) = 136
codes (0,79) = 137
codes (0,80) = 138
codes (0,81) = 139
codes (0,82) = 140
codes (0,83) = 141
codes (0,84) = 142
codes (0,85) = 143
codes (0,86) = 144
codes (0,87) = 145
codes (0,88) = 146
codes (0,89) = 147
codes (0,90) = 148
codes (0,91) = 262144
codes (0,92) = 393216
codes (0,93) = 458752
codes (0,94) = 16777257
codes (0,95) = 33554453
codes (0,96) = 50331669
codes (0,97) = 67108885
codes (0,98) = 83886081
codes (0,99) = 100663359
codes (0,100) = 117440591
codes (0,101) = 134217749
codes (0,102) = 150995046
codes (0,103) = 184549398
codes (0,104) = 201326719
codes (0,105) = 234881151
codes (0,106) = 251658367
codes (0,107) = 268435535
codes (0,108) = 285212799
codes (0,109) = 83886207
codes (0,110) = 369098879
codes (0,111) = 402653311
codes (0,112) = 419430421
codes (0,113) = 1073741842
codes (0,114) = 1090519081
codes (0,115) = 1107296281
codes (0,116) = 1124073497
codes (0,117) = 1140850716
codes (0,118) = 1157627905
codes (0,119) = 1174405137
codes (0,120) = 1191182367
codes (0,121) = 1207959583
codes (0,122) = 1258291217
codes (0,123) = 1291845649
codes (0,124) = 1409286185
codes (0,125) = 1442840614
codes (0,126) = 1459617833
codes (0,127) = 2801795135
codes (0,128) = 1476395110
codes (0,129) = 1493172351
codes (0,130) = 1509949567
codes (0,131) = 2701131793
codes (0,132) = 2717909013
codes (0,133) = 2734686209
codes (0,134) = 2751463455
codes (0,135) = 79
codes (1,0)= "No error"
codes (1,1)= "Unallocated (unassigned) number"
codes (1,2) = "No route to specified transit network (national use)"
codes (1,3) = "No route to destination"
codes (1,4) = "Send special information tone"
codes (1,5) = "Misdialed trunk prefix (national use)"
codes (1,6) = "Channel unacceptable"
codes (1,7) = "Call awarded and being delivered in an established channel"
codes (1,8) = "Preemption"
codes (1,9) = "Preemption—circuit reserved for reuse"
codes (1,10) = "Normal call clearing"
codes (1,11) = "User busy"
codes (1,12) = "No user responding"
codes (1,13) = "No answer from user (user alerted)"
codes (1,14) = "Subscriber absent"
codes (1,15) = "Call rejected"
codes (1,16) = "Number changed"
codes (1,17) = "Non-selected user clearing"
codes (1,18) = "Destination out of order"
codes (1,19) = "Invalid number format (address incomplete)"
codes (1,20) = "Facility rejected"
codes (1,21) = "Response to STATUS ENQUIRY"
codes (1,22) = "Normal, unspecified"
codes (1,23) = "No circuit/channel available"
codes (1,24) = "Network out of order"
codes (1,25) = "Permanent frame mode connection out of service"
codes (1,26) = "Permanent frame mode connection operational"
codes (1,27) = "Temporary failure"
codes (1,28) = "Switching equipment congestion"
codes (1,29) = "Access information discarded"
codes (1,30) = "Requested circuit/channel not available"
codes (1,31) = "Precedence call blocked"
codes (1,32) = "Resource unavailable, unspecified"
codes (1,33) = "Quality of Service not available"
codes (1,34) = "Requested facility not subscribed"
codes (1,35) = "Service operation violated"
codes (1,36) = "Incoming calls barred"
codes (1,37) = "Incoming calls barred within Closed User Group"
codes (1,38) = "Bearer capability not authorized"
codes (1,39) = "Bearer capability not presently available"
codes (1,40) = "Inconsistency in designated outgoing access information and subscriber class"
codes (1,41) = "Service oroptionnot available, unspecified"
codes (1,42) = "Bearer capability not implemented"
codes (1,43) = "Channel type not implemented"
codes (1,44) = "Requested facility not implemented"
codes (1,45) = "Only restricted digital information bearer capability is available"
codes (1,46) = "Invalid call reference value"
codes (1,47) = "Identified channel does not exist"
codes (1,48) = "A suspended call exists, but this call identity does not"
codes (1,49) = "Call identity in use"
codes (1,50) = "No call suspended"
codes (1,51) = "Call having the requested call identity has been cleared"
codes (1,52) = "User not member of CUG"
codes (1,53) = "Incompatible destination"
codes (1,54) = "Destination number missing and DC not subscribed"
codes (1,55) = "Invalid transit network selection"
codes (1,56) = "Invalid message, unspecified"
codes (1,57) = "Mandatory information element is missing"
codes (1,58) = "Message type nonexistent ornot implemented"
codes (1,59) = "Message isnot compatible with the call state"
codes (1,60) = "An information element does not exist orisnot implemented"
codes (1,61) = "Invalid information element contents"
codes (1,62) = "The message isnot compatible with the call state"
codes (1,63) = "Call terminated when timer expired"
codes (1,64) = "Parameter nonexistent ornot implemented"
codes (1,65) = "Message with unrecognized parameter discarded"
codes (1,66) = "Protocol error, unspecified"
codes (1,67) = "Precedence Level Exceeded"
codes (1,68) = "Device not Preemptable"
codes (1,69) = "Out of bandwidth (Cisco specific)"
codes (1,70) = "Call split (Cisco specific)"
codes (1,71) = "Interworking, unspecified"
codes (1,72) = "Precedence out of bandwidth"
codes (1,73) = "Call Control Discovery PSTN Failover"
codes (1,74) = "IME QOS Fallback"
codes (1,75) = "PSTN Fallback locate CallError"
codes (1,76) = "PSTN Fallback wait for DTMF Timeout "
codes (1,77) = "IME Failed Connection Timed out "
codes (1,78) = "IME Failed not enrolled"
codes (1,79) = "IME Failed socket error"
codes (1,80) = "IME Failed domain blacklisted"
codes (1,81) = "IME Failed prefix blacklisted"
codes (1,82) = "IME Failed expired ticket"
codes (1,83) = "IME Failed remote no matching route"
codes (1,84) = "IME Failed remote unregistered"
codes (1,85) = "IME Failed remote IME disabled"
codes (1,86) = "IME Failed remote invalid IME trunk URI"
codes (1,87) = "IME Failed remote URI not E164"
codes (1,88) = "IME Failed remote called number not available"
codes (1,89) = "IME Failed Invalid Ticket"
codes (1,90) = "IME Failed unknown"
codes (1,91) = "Conference Full"
codes (1,92) = "Call split"
codes (1,93) = "Conference drop any party/Conference drop last party"
codes (1,94) = "CCM_SIP_400_BAD_REQUEST"
codes (1,95) = "CCM_SIP_401_UNAUTHORIZED"
codes (1,96) = "CCM_SIP_402_P A YMENT_REQUIRED"
codes (1,97) = "CCM_SIP_403_FORBIDDEN"
codes (1,98) = "CCM_SIP_404_NOT_FOUND"
codes (1,99) = "CCM_SIP_405_METHOD_NOT_ALLOWED"
codes (1,100) = "CCM_SIP_406_NOT_ACCEPT ABLE"
codes (1,101) = "CCM_SIP_407_PROXY_AUTHENTICA TION_REQUIRED"
codes (1,102) = "CCM_SIP_408_REQUEST_TIMEOUT"
codes (1,103) = "CCM_SIP__410_GONE"
codes (1,104) = "CCM_SIP_411_LENGTH_REQUIRED"
codes (1,105) = "CCM_SIP_413_REQUEST_ENTITY_TOO_LONG"
codes (1,106) = "CCM_SIP_414_REQUEST_URI_TOO_LONG"
codes (1,107) = "CCM_SIP_415_UNSUPPORTED_MEDIA_TYPE"
codes (1,108) = "CCM_SIP_416_UNSUPPORTED_URI_SCHEME"
codes (1,109) = "CCM_SIP_420_BAD_EXTENSION"
codes (1,110) = "CCM_SIP_421_EXTENSION_REQUIRED"
codes (1,111) = "CCM_SIP_423_INTER V AL_TOO_BRIEF"
codes (1,112) = "CCM_SIP_424_BAD_LOCA TION_INFO"
codes (1,113) = "CCM_SIP_480_TEMPORARIL Y_UNA V AILABLE"
codes (1,114) = "CCM_SIP_481_CALL_LEG_DOES_NOT_EXIST"
codes (1,115) = "CCM_SIP_482_LOOP_DETECTED"
codes (1,116) = "CCM_SIP_483_TOO_MANY_HOOPS"
codes (1,117) = "CCM_SIP_484_ADDRESS_INCOMPLETE"
codes (1,118) = "CCM_SIP_485_AMBIGUOUS"
codes (1,119) = "CCM_SIP_486_BUSY_HERE"
codes (1,120) = "CCM_SIP_487_REQUEST_TERMINATED"
codes (1,121) = "CCM_SIP_488_NOT_ACCEPT ABLE_HERE"
codes (1,122) = "CCM_SIP_491_REQUEST_PENDING"
codes (1,123) = "CCM_SIP_493_UNDECIPHERABLE"
codes (1,124) = "CCM_SIP_500_SER VER_INTERNAL_ERROR"
codes (1,125) = "CCM_SIP_502_BAD_GATEWAY"
codes (1,126) = "CCM_SIP_503_SER VICE_UNAVAILABLE"
codes (1,127) = "CCM_SIP_503_SER VICE_UNAVAILABLE_SER_OPTION_NOAV"
codes (1,128) = "CCM_SIP__504_SER VER_TIME_OUT"
codes (1,129) = "CCM_SIP_505_SIP_VERSION_NOT_SUPPORTED"
codes (1,130) = "CCM_SIP_513_MESSAGE_TOO_LARGE"
codes (1,131) = "CCM_SIP_600_BUSY_EVERYWHERE"
codes (1,132) = "CCM_SIP_603_DECLINE"
codes (1,133) = "CCM_SIP_604_DOES_NOT_EXIST_ANYWHERE"
codes (1,134) = "CCM_SIP_606_NOT_ACCEPT ABLE"
codes (1,135) = "Service oroptionnot implemented, unspecified"
Function CodeDescription(code)
For i=0to135
if codes(0,i) = code then
CodeDescription = codes(1,i)
ExitFor
Endif
next
EndFunction
Описи причини завершення викликів наведені на англійській мові. При бажанні можливо легко їх перевести на українську мову.
Можливі й інші варіанти реалізації цієї функції.
Зараз повернемося до форми звіту і додамо ще один стовпець, де буде відображатися опис причини завершення виклику. Форма звіту при цьому прийме вид, як показано на малюнку 8.
Малюнок 8
Як видно з малюнка 8, функція, що повертає опис причини завершення виклику, названа CodeDescription.
Тому вона і вказана в таблиці (малюнок 8), а аргументом її є значення коду завершення origCause_value: $CodeDEscription(#origCause_value#)$
Знову формуємо звіт. Результат звіту показаний на малюнку 9.
Малюнок 9
При необхідності цю форму звіту можливо вдосконалювати і далі, наприклад, змінивши сортування з поля Код завершення на поле Кількість викликів, додавши ще поле Відсоток, де відображати відсоток викликів з певним кодом завершення від загальної кількості викликів, тощо.
Звіт по кодекам
У деяких випадках для адміністраторів CUCM можуть представляти інтерес кодеки, які використовуються при виконанні викликів. Ця інформація може бути корисна, наприклад, для виявлення причин з якістю передачі голосу, займаємою смугою пропускання, тощо.
Тому стовремо форму звіту, де будуть відображатися:
- код кодека;
- його опис;
- кількість викликів з конкретним кодеком.
Щоб скоротити час на створення звіту, використовуємо вище розглянуту форму звіту як шаблон.
Відкриємо форму звіту, показану на малюнку 8 і збережемо її під іншим ім'ям.
Внесемо відповідні зміни в декларативну частину форми звіту.
Замінимо заголовок звіту.
Перший SQL запит, що отримує дату та час найдавнішого виклику в поданні і самого останнього, залишимо без зміни.
Перейдемо до основного запиту звіту. Перед внесенням до нього змін відкриємо документ "Tariscope 4.x. Каталог баз даних" і в розділі 2.13 знайдемо поле, яке містить інформацію про кодек. Це поле origMediaCap_payloadCapability.
Зараз внесемо зміни в запит, на підставі якого формується таблиця з результатами, записавши його наступним чином:
SELECT origMediaCap_payloadCapability, COUNT(origMediaCap_payloadCapability) as CodecNumber FROM CallsCCM WHERE CallID IN (SELECT ID FROM $Calls$) GROUP By origMediaCap_payloadCapability ORDER BY CodecNumber DESC
Отже, запит відбирає (SELECT) поле origMediaCap_payloadCapability і обчислює число записів з конкретним значенням цього поля COUNT(origMediaCap_payloadCapability) as CodecNumber.
Дані вибираються з таблиці CallsCCM: FROM CallsCCM.
Відбиратимуться лише ті записи, які мають відповідні записи про виклики в поданні, на основі якого формується звіт: WHERE CallID IN (SELECT ID FROM $Calls$) GROUP By origMediaCap_payloadCapability
Результати запиту упорядковано відповідно до поля CodecNumber - кількість викликів з конкретним кодеком.
Змінимо код програми (меню: Звіт → Загальний код), як показано нижче:
Dim codes (1,43)
codes (0,0)= 0
codes (0,1)= 1
codes (0,2) = 2
codes (0,3) = 3
codes (0,4) = 4
codes (0,5) = 5
codes (0,6) = 6
codes (0,7) = 7
codes (0,8) = 8
codes (0,9) = 9
codes (0,10) = 10
codes (0,11) = 11
codes (0,12) = 12
codes (0,13) = 13
codes (0,14) = 14
codes (0,15) = 15
codes (0,16) = 16
codes (0,17) = 18
codes (0,18) = 19
codes (0,19) = 20
codes (0,20) = 25
codes (0,21) = 32
codes (0,22) = 33
codes (0,23) = 40
codes (0,24) = 41
codes (0,25) = 42
codes (0,26) = 43
codes (0,27) = 44
codes (0,28) = 45
codes (0,29) = 46
codes (0,30) = 47
codes (0,31) = 48
codes (0,32) = 80
codes (0,33) = 81
codes (0,34) = 82
codes (0,35) = 83
codes (0,36) = 84
codes (0,37) = 86
codes (0,38) = 89
codes (0,39) = 100
codes (0,40) = 101
codes (0,41) = 102
codes (0,42) = 103
codes (0,43) = 106
codes (1,0) = "Indefinite"
codes (1,1) = "NonStandard"
codes (1,2) = "G711Alaw 64k"
codes (1,3) = "G711Alaw 56k"
codes (1,4) = "G711mu-law 64k"
codes (1,5) = "G711mu-law 56k"
codes (1,6) = "G722 64k"
codes (1,7) = "G722 56k"
codes (1,8) = "G722 48k"
codes (1,9) = "G7231"
codes (1,10) = "G728"
codes (1,11) = "G729"
codes (1,12) = "G729AnnexA"
codes (1,13) = "Is11172AudioCap"
codes (1,14) = "Is13818AudioCap"
codes (1,15) = "G.729AnnexB"
codes (1,16) = "G.729 Annex A wAnnexB"
codes (1,17) = "GSM Full Rate"
codes (1,18) = "GSM Half Rate"
codes (1,19) = "GSM Enhanced Full Rate"
codes (1,20) = "Wideband 256K"
codes (1,21) = "Data 64k"
codes (1,22) = "Data 56k"
codes (1,23) = "G7221 32K"
codes (1,24) = "G7221 24K"
codes (1,25) = "AAC-LD (mpeg4-generic)"
codes (1,26) = "AAC-LD (MP4A-LA TM) 128K"
codes (1,27) = "AAC-LD (MP4A-LA TM) 64K"
codes (1,28) = "AAC-LD (MP4A-LA TM) 56K"
codes (1,29) = "AAC-LD (MP4A-LA TM) 48K"
codes (1,30) = "AAC-LD (MP4A-LA TM) 32K"
codes (1,31) = "AAC-LD (MP4A-LA TM) 24K"
codes (1,32) = "GSM"
codes (1,33) = "ActiveVoice"
codes (1,34) = "G726 32K"
codes (1,35) = "G726 24K"
codes (1,36) = "G726 16K"
codes (1,37) = "iLBC"
codes (1,38) = "iSAC"
codes (1,39) = "H261"
codes (1,40) = "H263"
codes (1,41) = "Video"
codes (1,42) = "H264"
codes (1,43) = "H224"
Function CodecDescription(code)
For i=0to43
if codes(0,i) = code then
CodecDescription = codes(1,i)
ExitFor
Endif
next
EndFunction
Далі вносимо відповідні зміни в таблицю форми звітів. В результаті отримуємо форму, як показано на малюнку 10.
Малюнок 10
Формуємо звіт на основі створеної форми. Приклад сформованого звіту по кодекам показаний на малюнку 11.
Малюнок 11
На закінчення відзначимо, що використовуючи ці приклади, користувачі Tariscope і Cisco Unified Communications Manager можуть створювати будь-які звіти за даними, отриманими з CDR файлів.
Додаткова інформація
Контроль якості VoIP викликів, виконаних через CUCM, використовуючи Tariscope
Налаштування Tariscope для використання функції обмеження з CUCM
Обробка CDR з CUCM в Tariscope
Коди завершення викликів в CUCM
Функції редакції Tariscope Enterprise
Функції редакції Tariscope Provider
Рішення на основі Tariscope