Подключение к веб-сервисам 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
![](http://1.gravatar.com/avatar/7e296bc11c5b3783f842bdd31c05f031?s=55&d=http%3A%2F%2Fnaviart.ru%2Fwp-content%2Fthemes%2Farticle-directory%2Fi%2Fanonymous.png&r=g)
Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.