Подключение к веб-сервисам NAV из VBScript

Серия статей про подключение к веб-сервисам NAV подходит к концу. Думаю, что охватил большинство платформ, на которых оно могло потребоваться — в некоторых случаях это было просто, иногда немного сложнее. Я не писал про Flash, так же как и не писал про вещи типа iPhone или iPod Touch, в основном потому, что не думаю, что это кому-то нужно. Если какая-то платформа или язык оказались забытыми – дайте мне знать, и, если спрос на это действительно есть, я заставлю эту вещь заработать.

Почему VBScript?

Подключение VBScript позволяет работать с веб-сервисами из скриптом, например, из скриптов обслуживания, логина, остановки работы. Знаю, что его можно использовать в некоторых броузерах (IE :), но пишу я о них не поэтому, а для того, чтобы дать возможность работы из командной строки.

Пожалуйста, прочитайте эту заметку, чтобы получить краткое представление о том, что я собираюсь реализовать с помощью VBScript.

Также просьба прочесть эту статью про подключение к веб-сервисам NAV из JavaScript, чтобы досконально понять работу XML Web Services, а также как работать без сгенерированных прокси-классов и т.п.

Основное различие между Javascript и VBScript – синтаксис, а большинство операций делаются схожим образом.

Файл скрипта

Я создал файл TestWS.vbs, код для реализации вышеописанного сценария выглядит следующим образом:

function InvokeNavWS(URL, method, nameSpace, returnTag, parameters)
Set xmlhttp = CreateObject(«MSXML2.XMLHTTP»)

request = «<Soap:Envelope xmlns:Soap=»»»+SoapEnvelopeNS+»»»><Soap:Body><«+method+» xmlns=»»»+nameSpace+»»»>»+parameters+»</»+method+»></Soap:Body></Soap:Envelope>»

‘ Use Post and non-async
xmlhttp.open «POST», URL, false
xmlhttp.setRequestHeader «Content-type», «text/xml; charset=utf-8»
xmlhttp.setRequestHeader «Content-length», len(request)
xmlhttp.setRequestHeader «SOAPAction», method

‘ send request synchronously
xmlhttp.send request

‘ 200 == OK
if xmlhttp.status = 200 then
Set xmldoc = xmlhttp.responseXML
xmldoc.setProperty «SelectionLanguage», «XPath»
xmldoc.setProperty «SelectionNamespaces», «xmlns:tns=»»»+nameSpace+»»»»
Set InvokeNavWS = xmldoc.selectNodes(«//tns:»+returnTag)
else
Set InvokeNavWS = nothing
end if

end function

‘ Get the Company list
function SystemService_Companies()
Set SystemService_Companies = InvokeNavWS(systemServiceURL, «Companies», systemServiceNS, «return_value», «»)
end function

‘ Read one customer
function CustomerPage_Read(no)
Set CustomerPage_Read = InvokeNavWS(CustomerPageURL, «Read», CustomerPageNS, «Customer», «<No>»+no+»</No>»)
end function

‘ Read Customers
function CustomerPage_ReadMultiple(filters)
Set CustomerPage_ReadMultiple = InvokeNavWS(CustomerPageURL, «ReadMultiple», CustomerPageNS, «Customer», filters)
end function

sub display(str)
WScript.echo str
end sub

baseURL = «http://localhost:7047/DynamicsNAV/WS/»
systemServiceURL = baseURL + «SystemService»

soapEnvelopeNS = «http://schemas.xmlsoap.org/soap/envelope/»
systemServiceNS = «urn:microsoft-dynamics-schemas/nav/system/»
customerPageNS = «urn:microsoft-dynamics-schemas/page/customer»

Set Companies = SystemService_Companies()
display «Companies:»
for i = 0 to Companies.length-1
display Companies(i).text
next
cur = Companies(0).text

customerPageURL = baseURL+escape(cur)+»/Page/Customer»
display «»
display «URL of Customer Page:»
display customerPageURL

Set Customer10000 = CustomerPage_Read(«10000»)
display «»
display «Name of Customer 10000: «+Customer10000(0).childNodes(2).firstChild.nodeValue

Set Customers = CustomerPage_ReadMultiple(«<filter><Field>Country_Region_Code</Field><Criteria>GB</Criteria></filter><filter><Field>Location_Code</Field><Criteria>RED|BLUE</Criteria></filter>»)
display «»
display «Customers in GB served by RED or BLUE warehouse:»
for i = 0 to Customers.length-1
display Customers(i).childNodes(2).firstChild.nodeValue
next

display «»
display «THE END»

Код – это практически брат-близнец кода для Javascript (т.к. я использовал одну и ту же объектную модель), основные различия следующие:

— на VBSCript кодирование URL происходит с помощью функции escapte() – обратите внимание, что escape есть и в Javascript, и в .NET – но там оно работает по-другому;

— отображение данных выполнение с помощью WScript.echo – результат будет выведен в MessageBox, если вы используете Wscript для запуска скрипта, или вывод в командную строку – если вы будете использовать CScript (я использую CScript).

Запуск скрипта

Используйте команду:

C:\users\freddyk>SCript /nologo testws.vbs

При этом я получаю на экране следующее:

И, естественно, вы можете перенаправить вывод в файл и далее вывести этот файл или сделать в нем поиск:

В этом сильны системные администраторы – не буду с ними соревноваться.

Надеюсь, статья поможет вам.

Удачи!

Оригинал можно прочитать здесь: http://blogs.msdn.com/b/freddyk/archive/2010/01/29/connecting-to-nav-web-services-from-vbscript.aspx

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Добавить комментарий