AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.01.2003, 11:17   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Получить курс валют из интернета
Кто нибудь пробовал решить такую задачу ?

Вот накануне набросал на VC:

PHP код:
// 1 - Open
HINTERNET open InternetOpen("RSDN HTTP Reader"INTERNET_OPEN_TYPE_PRECONFIG,  NULLNULL0);

// 2 - Connect
HINTERNET connect InternetConnect(open"www.cbr.ru"INTERNET_DEFAULT_HTTP_PORTNULLNULL,  INTERNET_SERVICE_HTTP,0,1u);

// 3 - OpenRequest
LPCTSTR AcceptTypes[] = { TEXT("*/*"), NULL};
HINTERNET openRequest HttpOpenRequest(connect"GET"
   
"/currency_base/D_print.asp?date_req=05.01.2003"NULL""AcceptTypes,
   (
INTERNET_FLAG_SECURE|INTERNET_FLAG_IGNORE_CERT_CN_INVALID0
    | 
INTERNET_FLAG_KEEP_CONNECTION1);

// 4 - SendRequest
LPCTSTR headers TEXT("Content-Type: application/x-www-form-urlencoded\r\n"
    "Accept-Language:ru\r\n" "Accept-Encoding:gzip, deflate"
);
BOOL sendRequest HttpSendRequest(openRequestheaders, -1, (LPVOID""0);

// 5 - ReadFile
char     DataBuffer[7000];
DWORD    size 6500;
DWORD       bytesRead ;
BOOL readFile InternetReadFile(openRequestDataBuffersize, &bytesRead);
                    
cout << DataBuffer << endl;
cout << bytesRead << endl
Все работает.

Решил попробовать реализовать это дело в Аксапте:

Есть класс WinInet; в нем есть методы InternetOpen и InternetReadFileб но нет InternetConnect, HttpOpenRequest и многих других мне необходимых.
Ладно думаю, не беда - создам наследника и в нем все это реализую. Не тут то было. WinInet объявлен как final. А почему ? А зачем ? Не понимаю.
Ладно. Создаю свой класс:

PHP код:
void new()
{
    try
    {
        
_winInet = new DLL("WinInet");
    } catch(
Exception::Internal)
    {
        
infolog.clear();
        return;
    }

    
_internetConnect = new DLLFunction(_winInet,"InternetConnect");
    
_internetConnect.returns(ExtTypes::DWORD);
    
_internetConnect.arg(ExtTypes::DWORD);         // HINTERNET
    
_internetConnect.arg(ExtTypes::STRING);        // ServerName
    
_internetConnect.arg(ExtTypes::DWORD);         // ServerPort = 80
    
_internetConnect.arg(ExtTypes::STRING);        // UserName
    
_internetConnect.arg(ExtTypes::STRING);        // Password
    
_internetConnect.arg(ExtTypes::DWORD);         // Service
    
_internetConnect.arg(ExtTypes::DWORD);         // Flags
    
_internetConnect.arg(ExtTypes::DWORD);         // Context

При попытке создать этот класс Axapta ругается:

DLL function not found InternetConnect.

Как не найдена. MSDN говорит, что она в той же dll-ке, что и InternetOpen. Более того, мой эксперимент с VC подтверждает это.

Получается, что одни функции в dll Аксапта видит другие нет ? Почему ?

Или такие задачи в Аксапте решаются гораздо проще ? Может есть классы, которые на более высоком уровне позволяют работать с интернет ?

P.S.

Несмотря на то, что WinInet объявлен как final, я создал его наследника, добавил в него свой метод и переопределил один из его методов. Это что, глюк Аксапты ? (Axapta 2.5 SP2)
Старый 08.01.2003, 11:20   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Хм. Похоже и здесь глюки.

Фраза "ExtTypes::WORD" в коде интерпретировалась совсем уж по чудному
Старый 08.01.2003, 11:56   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Если внимательно помотреть в класс WinInet, то видно, что InternetOpen объявлялся как ф-ция InternetOpenA...
Попробуй InternetConnectA или InternetConnectW
Кстати, список ф-ций в dll можно увидеть обычным текстовым просмотровщиком
Старый 08.01.2003, 15:21   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Если внимательно помотреть в класс WinInet, то видно, что InternetOpen объявлялся как ф-ция InternetOpenA...
Попробуй InternetConnectA или InternetConnectW
Кстати, список ф-ций в dll можно увидеть обычным текстовым просмотровщиком
Спасибо. Да действительно, с InternectConnectA функция импортировалась. Интересно то, что MSDN молчит о таких функциях, как InternectConnectA и InternectConnectW, хотя знает о InternetOpenA....

Обнаружилась другая проблема. Функция InternetOpen возвращает HINTERNET по которому можно судить об успешности вызова функции. В частности, если вызов неверен функция должна возвращать NULL:

PHP код:
// 1 - Open
HINTERNET open InternetOpen("RSDN HTTP Reader"
    
INTERNET_OPEN_TYPE_PRECONFIGNULLNULL0);
if (
open
    
cout << "Open - OK" << endl;
else
    
cout << "Open - Failed" << endl
Такой же код в Аксапте:

PHP код:
 inet = new WinInet();
 
open inet.internetOpen("Axapta HTTP Reader"0""""0);
   if (
open)
     print 
"Internet Open OK - " int2str(open);
   else
   {
     print 
"Internet Open Failed";
     return;
   } 
Всегда радостно сообщает об успешном выполнении функции. Даже в том случае, если я передаю параметры далеко отличные от правильных.
В чем дело ? Как Аксапта интерпретирует NULL ?
Старый 13.01.2003, 11:57   #5  
Pavel is offline
Pavel
SAP
SAP
 
2,760 / 239 (13) ++++++
Регистрация: 14.12.2001
Адрес: Moscow
Re: Получить курс валют из интернета
Цитата:
Изначально опубликовано Андре
Кто нибудь пробовал решить такую задачу ?
Решил попробовать реализовать это дело в Аксапте:
Привет,

- данную задачу можно назвать "типичной"
- в Афише из интернета в XAL 3.1 (Конкорд) курсы автоматически с сайта ЦБ качаются
- технические варианты реализации интерфейса могут быть самые разнообразные
- про глюки чудо системы ничего полезного сообщить не могу

С уважением.
Старый 04.03.2003, 10:01   #6  
UnQuaiz is offline
UnQuaiz
Участник
 
5 / 14 (1) ++
Регистрация: 15.07.2002
Re: Получить курс валют из интернета
Цитата:
Изначально опубликовано Андре
Кто нибудь пробовал решить такую задачу ?
Я решил эту задачу по другому..
Использовал классы для работы с XML.
На www.cbr.ru есть скрипт возвращающий курсы валют в xml формате..
http://www.cbr.ru/scripts/sample_xml.htm
здесь есть примеры на VB и php..
у меня получилось так...

PHP код:

   
tempstr          CurID;
   
XMLDocument      xml;
   
XMLNamedNodeMap  attrs;
   
XMLNodeList      nodelist,nodelist1;
   
XMLNode          node,node1;
   
ExchRate         exrate;

;

    
xml = new XMLDocument();
    
xml.async(False);
    
xml.validateOnParse(False);
    
xml.load('http://www.cbr.ru/scripts/XML_daily.asp');
    
nodelist xml.getElementsByTagName('Valute');
    if(
nodelist) {node nodelist.nextNode();}
    while(
node)
    {
     
attrs node.attributes();
     
node1 attrs.getNamedItem('ID');
     
nodelist1 node.childNodes();
     
CurID node1.nodeValue();
     
node nodelist1.item(4);
     
ExRate =str2num(strReplace(node.text(),',',''))/100;
     
select Currency_CBR where Currency_CBR.CBRCode == CurID;
     
select Rates where Rates.FromDate==Today() &&       Rates.CurrencyCode == Currency_CBR.CurrencyCode;
      if(!
Rates)
      {
       
Rates.selectForUpdate();
       
Rates.FromDate Today();
       
Rates.CurrencyCode Currency_CBR.CurrencyCode;
       
Rates.ExchRate ExRate*Currency_CBR.Factor;
       
Rates.insert();
      }
      else
      {
       
error(strfmt("Обменный курс валюты %1 за %2 уже существует.",Currency_CBR.CurrencyCode,Today()));
      }
     }
     
node nodelist.nextNode();
    }

Currency_CBR - таблица в которой указано соответствие кодов валют с кодами на сайте центробанка...
За это сообщение автора поблагодарили: AlexeyS (2), alex55 (1), SIrina (1).
Старый 04.03.2003, 10:13   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Я решил эту задачу по другому..
Использовал классы для работы с XML.
На www.cbr.ru есть скрипт возвращающий курсы валют в xml формате..
http://www.cbr.ru/scripts/sample_xml.htm
Большое спасибо. Не знал.

Тогда, когда я решал эту задачу, Аксаптовский вариант у меня, честно говоря, так и не заработал. Плюнул я на это дело, написал dll-ку на VC, которую и использовал из Аксапты.

Твой вариант гораздо изящнее
Старый 04.03.2003, 10:35   #8  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
А Nominal как-то в расчетах участвует? Это ведь для доллларов он равен 1, а для каких-нибудь исландских крон или казахских тенге курс в том виде, как он в xml возвращается, использовать нельзя
Старый 04.03.2003, 10:40   #9  
UnQuaiz is offline
UnQuaiz
Участник
 
5 / 14 (1) ++
Регистрация: 15.07.2002
Цитата:
Изначально опубликовано Vadik
А Nominal как-то в расчетах участвует? Это ведь для доллларов он равен 1, а для каких-нибудь исландских крон или казахских тенге курс в том виде, как он в xml возвращается, использовать нельзя
Этим вопросом я не задавался..потому как у нас используется USD и EUR
Хотя какая проблема взять курс того же Бельгийского франка и поделить на номинал?? Получишь нужный курс...Или я ошибаюсь?
Старый 04.03.2003, 11:01   #10  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Хотя какая проблема взять курс того же Бельгийского франка и поделить на номинал?? Получишь нужный курс...Или я ошибаюсь?
Отчего же, получишь

Вот что-то подобное, умеет работать в пакетном режиме

Для компаний с основной валютой "не RUR" работать будет неправильно, но эта ситуация видится настолько маловероятной, что колбасить что-то, что скорее всего не потрребуется, как-то лениво. Еще - на машине с IE5 проект не работал, с чем связано - с IE, с версией XML Parser или еще с чем, да и некузяво это - работать не с последней версией бесплатного браузера
Вложения
Тип файла: xpo cbrrates.xpo (73.1 Кб, 365 просмотров)
Старый 12.03.2003, 08:16   #11  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
Как настроить? У меня не работает.
Если в "Иморте курсов ЦБ" нажать "Выбрать", то вылетает ошибка:
QueryRun object не инициализирован/
Старый 12.03.2003, 09:33   #12  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Я, по правде сказать, никогда "выбрать" не пользовался..
По "Ок" заимпортирует все, что в "Настройке импорта" прописано. Но "Выбрать" постараюсь в ближайшем времени полечить
Старый 12.03.2003, 14:10   #13  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
У меня и из файла не берет, ругается на XML node.

И еще не понятно - Инет должен быть у клиента или у сервера, а то я запускаю импорт, что то происходит, но нет ни каких результатов.
У себя не вижу попыток выхода в Инет.
Старый 12.03.2003, 14:23   #14  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
У тебя трехзвенка?
Скорее всего, да - проверил в трехуровневой конфигурации, не работает
Будем искать
Старый 12.03.2003, 16:12   #15  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
трехзвенка
Старый 12.03.2003, 16:19   #16  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Ага. А прокси какой?
Старый 12.03.2003, 16:41   #17  
edd is offline
edd
Участник
 
81 / 10 (1) +
Регистрация: 20.01.2003
Кто должен лезть в Инет? Сервер AOS или клиент?
А то клиент даже не пытается.

А прокси... winroute.
Старый 12.03.2003, 16:59   #18  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
У меня пока что устойчивый эффект - при запущенном под доменным пользователем AOS-е все работает, при запущенном из-под LocalSystem - RatesDoc.load(url) не отрабатывает

Пока что добавление client во все методы, работающие с этим RatesDoc, результата не дает, и это странно. Ведь код в этом случае запускается на клиентской машине и в контексте пользователя (других вариантов вроде нет)

Вот еще логи прокси посмотрю, может что и прояснится
Старый 13.03.2003, 16:06   #19  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Все оказалось просто

Класс был создан с RunOn=Server, вот и метод, дергающий прокси, запускался на сервере в контексте юзера, под которым запущен AOS

На batch сервере в случае трехзвенки или на толстом клиенте должен быть настроен на работу с прокси ( если таковой есть ) IE. Именно из него, как я понял, берутся настройки.

Во всяком случае, комбинация ISA Server + IE 6.0SP1 у меня в трехзвенке никаких дополнительных настроек не требует
Вложения
Тип файла: xpo cbrrates.xpo (73.0 Кб, 411 просмотров)
Старый 18.03.2003, 14:47   #20  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Решил причесать проектик. По ходу дела возник вопрос. Будет ли для случая, когда рубль - не основная валюта компании и не валюта триангуляции, правильным вычислять курс через соотношение курсов импортируемой и основной валют к рублю?
Теги
загрузка курсов валют, курс

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Фиксированный курс в журнале ГК. Вторичная валюта. concigliory DAX: Функционал 3 24.02.2014 15:15
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Кэширование курсов валют Tony Green DAX: Программирование 8 09.02.2007 10:02
Закачка курсов валют с Интернета. Hans DAX: Программирование 1 22.09.2006 12:08
Валюты и курсы валют Rafael DAX: Функционал 1 13.02.2002 19:19
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:26.