Макрос GetA.

 OK! Это самая первая статья в разделе посвященном DOP. В свое время, обратился ко мне человек, не знакомый с DOPом, по поводу зависшей квитанции. Чего с ней можно поделать, как ее убрать, а то достала она телефонисток. Да и работать мешает, в конце концов! Сколько можно?! А я в то время знал про самый подходящий, в этой ситуации, макрос GETALL. Мол, показывает все ожидающие квитанции по конкретному SOTRACE. Круто! Только одна загвоздка есть: - применить результаты работы макроса на практике, лично для меня, проблематично (по крайней мере - раньше было).

>GETALL:ZYXW
  TKT# POINTER   #REC STAT  POS# TKTHD_STATUS  TKT STATE
1 0042 0710:6A2A 0004 BUSY   4   CUT THROUGH   CALL HELD
2 0086 0700:12DA 0004 BUSY   6   SET UP        SET UP POS
3 0094 0700:7514 0004 BUSY   4   SET UP        CALL HELD
4 00A3 0720:BA88 0004 BUSY   4   CONVERSATION  CALL HELD

 Такое впечатление, что вся нужная информация ушла сквозь пальцы. Ну, знаете вы, после запуска макроса, номер квитанции (его же надо еще перевести из одной системы в другую), позицию знаете, состояние квитанции. Уже не мало! Согласен. Но без определенных навыков искать вам и искать нужную квитанцию.

И так, макрос!

 Обладая определенной эрудицией, можно догадаться что макрос как-то связан с макросом GETALL. Так оно и есть! За основу взят именно макрос GETALL (ну, а чего поделаешь? Описанием SSMки не обладаем, приходится пользоваться тем, что есть). Только, в отличие от GETALL, выводятся другие поля, т.к. макрос заточен под одну задачу (что не мешает его использовать не по назначению). Нужен он для сброса "зависших" квитанций. Алгоритм прост (хотя и не проверен мною на практике до конца, т.к. случая, просто, не представилось):

  1. Запустить макрос и найти по номерам абонентов или позиции нужную квитанцию
  2. Фиксируем адреса (пишем на бумажку, запоминаем и проч.)
  3. Присваиваем новые значения по соответствующим адресам (для сброса должно помочь 4 и 9, соответственно, для TKT STAT и CALL STA)

Трепанация

REM MAC GETA Если макрос уже в памяти - убираем его
DEF MAC GETA и определяем новый макрос (собственно, начало тела макроса)
IF '%0' = '' А запустили с параметром, или без?
WRI 'GIVE NA OF SOTRACE: ',& Ага! Без!
DEF .NA=%Q Присваиваем переменной .NA полученное от пользователя значение
ELSE иначе...
DEF .NA=%0 .NA у нас становится равной параметру, с которым запускали макрос
ENDIF Окончание выражения IF [тыры-пыры-растопыры] END
ACT .NA Активируем контрольный элемент
:SCB -70T,,NODISP ;FFQTZP4A С помощью макроса получаем информацию для дальнейшей работы
AD .CALL_REF=(WOR LWA+2):0 ;Z_CALL_REF_ARRAY Начинаем пользоваться полученной информацией
AD .TKT_PTRS=(WOR LWA+2):30DC ;Z_TKT_PTR_TAB К сожалению, остается только догадываться
AD .BASE=WOR (WOR LWA+2):4E2C ;Z_BASE_OP_CALL_NBR о назначении этих переменных.
AD .I=0,.ST=0,.REF=0,.SEQ=1,.STATE=0,.PTR=FFFF:FFFF,.POS=FFFF
AD .PTRA=FFFF:FFFF,.J=0,.PTRB=FFFF:FFFF,.P
WRI 'POS# A SUB # B SUB # TKT STAT ADDRES CALL STA ADDRES'
 Выводим заголовок будующей таблицы
COUNT 250T Поехали считать до 250-ти. Почему? Спросите что по-легче!
.ST =BYT .CALL_REF+6
.REF=WOR .CALL_REF
IF .ST <> 0
BAS=H
 Переходим на вывод в шестнадцетиричной форме
.PTR =POI(.TKT_PTRS+(.REF*4)+4) Получаем адрес PROCESS-RECORD
.STATE=BYT .PTR+36T Получаем TICKET STATE
.POS=WOR .PTR+62 Получаем номер позиции, на которой ведется обработка
IF .POS <>FFFF Если позиция предстваляет из себя чего-нибудь осмысленное
WRI .POS,' ',& выводим номер позиции
ELSE в другом случае
WRI ' ',& выводим пробелы
ENDIF
.PTRA=POI(.PTR)
 Получаем адрес A_SUBSCRIBER RECORD
.PTRB=POI(.PTRA) Получаем адрес B_SUBSCRIBER RECORD
BAS=A Переходим на вывод в формате ASCII
COU 12T;OUTPUT A# Далее выводим номер абона А
WRI BYT .PTRA+48T+.J,&
.J=.J+1
ENDC
.J=0
WRI ' ',&
COU 12T;OUTPUT B#
 Далее выводим номер абона Б
WRI BYT .PTRB+34T+.J,&
.J=.J+1
ENDC
.J=0
IF .STATE > 11T
 Если TICKET STATE есть что-то не обычное
WRI ' ???? ',& мы удивляемся
ELSE
BAS=H
WRI ' ',.STATE,' ',&
 иначе выводим состояние квитанции
ENDIF
WRI ' ',(.PTR+36T),&
 и заодно, адрес, по которому его можно найти
.STATE=BYT .PTR+39T
IF .STATE > 10T
 принимаемся за CALL STATE OF TICKET
WRI ' ???? ',& история повторяется
ELSE
BAS=H
WRI ' ',.STATE,' ',&
ENDIF
WRI ' ',(.PTR+39T)
.SEQ=.SEQ+1
ENDIF
.I=.I+1
.CALL_REF=.CALL_REF+8
ENDC
EM
 Макросу конец!

Иформация к размышлению:
Ticket State (состояние квитанции)
  1. E_MINI_FREE
  2. E_SET_UP_POS
  3. E_IN_CONVERSATION
  4. E_CALL_HELD
  5. E_TICKET_HELD
  6. E_CTRL_CADIS
  7. E_CTRL_POSITION
  8. E_CTRL_SHORT_DLYHD
  9. E_CTRL_INTERNAL
  10. E_CTRL_TERMINATED
  11. E_QUEUED_CNF
Call State Of Ticket (состояние вызова)
  1. INCOMING
  2. SET UP
  3. CUT THROUGH
  4. CONVERSATION
  5. TERMINATE
  6. TICKET RETRIEVED (FROM IDLE POSITION)
  7. HISTORICAL TICKET RETRIEVED
  8. EXTERNAL CALL
  9. TICKET FROM HOLD
  10. TICKET RETRIEVED (FROM BUSY POSITION)
Отступление

 И еще про макросы, наболело. Сколько раз меняли пакет, столько раз переписывали библиотеки макросов. Ну неужели сложно в RoboCopy поставить нужную отметку, или вообще убрать эти файлы из пакета? Надоело потом искать свои макросы на дисках и заново помещать их в библиотеки. Сервис, блин, за собственные деньги!

Заключение

 Хочу сказать спасибо инженерам сервис центра за оказанную помощь (правда, собственным макросом они поделились, когда уже все было сделано).

Взять макрос.

 

 

Максим Осташов
Размещено на www.s12most.mailru.com 7 апреля 2001

Есть вопросы или дополнения, конструктивная критика? Пишите!

Hosted by uCoz