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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.09.2014, 11:01   #1  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
! WinApi::fileExists2 и RunBaseBatch Help!!!
Dynamics AX 3.0, Build #1951.7609/514-193 SP3/OP023-71, СУБД Oracle 9

Доброго времени, помогите пожалуйста разобраться новичку . Суть проблемы: есть класс

X++:
class ExBase extends RunBaseBatch

FilePath                        filePathDBF;

 #define.CurrentVersion(1)
 #define.Version1(1)
 #localmacro.CurrentList
        filePathDBF
 #endmacro
filePathDBF - содержит путь к папке с файлами формата "\\server\folder\" выбирается на диалоге.

далее на run класса ExBase передается filePathDBF параметром в другой класс

X++:
public void run()
{
    DocExport         docExp;
    ;
    docExp = new DocExport(this.getParam())
    docExp.run();

// this.getParam() формирует Struct  parmObj = new Struct(Types::String, "FilePath")
}
далее принимающий класс:

X++:
final class DocExport
{
    FilePath    folderPath;

    #define.DBFName("1.txt")
}
new класса DocExport:
X++:
void new(Struct _parmObj)
{
    folderPath              = _parmObj.value("FilePath");
    if ( substr(folderPath,strlen(folderPath),strlen(folderPath)) != '\\' )
        folderPath = folderPath + '\\';
}
и собственно проблема: validate метод класса DocExport при запуске с клиента все ОК, как только пытаюсь запустить в пакете WinApi::fileExists2 не видит файлов. Все права на папку и файлы есть. SysTreeNode::duplicatePathDelimiters не помогает Помогите разобраться с путями. Заранее спасибо.
X++:
public boolean validate()
{
   boolean ret = true;
    ;
     if ( !folderPath || !WinApi::fileExists2(folderPath + #DBFName))
        ret = checkFailed(strFmt("Файл не найден по пути: %1",folderPath));

    return ret;
}
Старый 10.09.2014, 11:14   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от CheshireCatЭ Посмотреть сообщение
Все права на папку и файлы есть.
Права есть у какого пользователя? Должны быть у того, под которым работает служба AOS, на котором выполняется пакет
Старый 10.09.2014, 11:23   #3  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
Доступ с сервера где работает пакет обеспечен, все файлы доступны для редактирования.
Старый 10.09.2014, 12:08   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от CheshireCatЭ Посмотреть сообщение
Dynamics AX 3.0, Build #1951.7609/514-193 SP3/OP023-71, СУБД Oracle 9
при запуске с клиента все ОК, как только пытаюсь запустить в пакете WinApi::fileExists2 не видит файлов. Все права на папку и файлы есть.
Цитата:
Сообщение от CheshireCatЭ Посмотреть сообщение
Доступ с сервера где работает пакет обеспечен, все файлы доступны для редактирования.
Вам нужно уточнить три вещи:
  1. где именно (на клиенте или на сервере) в пакете выполняется код WinApi::fileExists2()
  2. виден ли с хоста, где выполняется код проверки, путь к файлам (может, путь через подмапленный сетевой диск задается, или указывается на сервере в другом домене, или на хосте, где выполняется проверка, не настроен роутинг в подсеть, где находится сервер с файлами, etc)
  3. есть ли права доступа к файлам у того пользователя, под которым выполняется код. Это нужно проверять с учетом п.1, поскольку пакетный сервер и AOS могут работать под разными пользователями
Проще всего добавить в соотв. код дополнительную диагностику, а именно вывод имени текущего хоста и текущего пользователя, см. xGlobal::computerName() и WinAPI::getUserName().
Старый 10.09.2014, 17:08   #5  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Вам нужно уточнить три вещи:
  1. где именно (на клиенте или на сервере) в пакете выполняется код WinApi::fileExists2()
  2. виден ли с хоста, где выполняется код проверки, путь к файлам (может, путь через подмапленный сетевой диск задается, или указывается на сервере в другом домене, или на хосте, где выполняется проверка, не настроен роутинг в подсеть, где находится сервер с файлами, etc)
  3. есть ли права доступа к файлам у того пользователя, под которым выполняется код. Это нужно проверять с учетом п.1, поскольку пакетный сервер и AOS могут работать под разными пользователями
Проще всего добавить в соотв. код дополнительную диагностику, а именно вывод имени текущего хоста и текущего пользователя, см. xGlobal::computerName() и WinAPI::getUserName().
Свойства RunOn установлены в Called from.
Сетевой диск к серверу никак не подмаплен.
На сервере один пользователь под которым запускается пакет и права на папку есть.
Старый 10.09.2014, 17:31   #6  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
если запустить класс на сервере, то все отрабатывает без проблем, как только в пакете fileExisxt возвращает false.
Старый 11.09.2014, 13:22   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от CheshireCatЭ Посмотреть сообщение
X++:
public boolean validate()
{
   boolean ret = true;
    ;
     if ( !folderPath || !WinApi::fileExists2(folderPath + #DBFName))
        ret = checkFailed(strFmt("Файл не найден по пути: %1",folderPath));

    return ret;
}
У Вас не очевидное сообщение об ошибке. В данном случае не понятно, файл не найден или не указан путь доступа. Разделите проверку на две части

Кроме того, не корректно проверять одно, а сообщать о другом. Имею в виду, что ищете-то Вы файл, а сообщаете о пути доступа. Может, проблема именно в "склеивании"?

X++:
public boolean validate()
{
   boolean ret = true;
    ;
     if ( ret && !folderPath)
        ret = checkFailed('Не указан путь доступа!');

     if ( ret && !WinApi::fileExists2(folderPath + #DBFName))
        ret = checkFailed(strFmt('Не найден файл \"%1\"', folderPath + #DBFName));

    return ret;
}
Далее немного "теории". Возможно, Вы все это знаете, но, мало ли...

Судя по постановке вопроса Вы работаете в 3-х уровневой конфигурации: База данных - AOS - клиент

AOS, как и клиент - это приложение. Физически, они могут запускаться как на одном компьютере, так и на разных. Именно AOS подразумевается под термином "сервер", когда Вас спрашивают где именно запускается тот или иной класс. Это НЕ база данных. Это отдельное приложение, работающее как сервис Windows.

Так вот, как правило, запуск в пакетном режиме - это всегда запуск "на сервере". В данном случае, во-первых, на том компьютере, где у Вас установлен AOS, а, во-вторых, под учетной записью того пользователя, от имени которого запущен сервис AOS.

Это значит, что, во-первых, Вам надо проверить "видимость" нужной Вам папки со стороны того компьютера, на котором установлен AOS. Например, если Вы указали путь "C:\MyFolder", то на компьютере, где установлен AOS такой папки может просто не быть! Ведь клиентский компьютер при запуске со стороны сервера оказывается физически другим компьютером и путь надо указывать как к сетевому ресурсу.

А, во-вторых, имеет ли права доступа к нужной папке и файлу тот пользователь, от имени которого запущен сервис AOS? Речь идет именно о пользователе Windows, а не о пользователе Axapta. Вы же ищете ресурс вне среды Axapta, соответственно и идентификация "внешняя" (по отношению к Axapta)

Свойство RunOn = "Called from" означает, что данный класс будет запущен там же, где был запущен тот класс из которого его вызвали. Если вызвавший класс запущен на клиенте, то и данный класс будет запущен на клиенте. Если вызвавший класс запущен на сервер, то и данный класс будет запущен на сервере.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Player1 (1).
Старый 12.09.2014, 13:14   #8  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
на сервере (назовем его test) установлен и клиент и AOS, запускаются под одним пользователем, необходимые файлы лежат на другом сервере (назовем его work), у пользователя под которым стартует и клиент и AOS на сервере test полные права на доступ к нужной папке на сервере work. Так же при запуске класса на клиенте, который установлен на сервере test все работает, пакет же не хочет видеть необходимы файлы. Повторюсь путь задается так на диалоге: \\server\folder - затем пакуется. Полный путь к файлу формируется так \\server\folder + '\\' + '1.txt'. Пакет не видит ни путь к папке, ни путь к файлу.

Владимир Максимов, Спасибо за теорию.
Может еще какие варианты будут?
Старый 12.09.2014, 15:39   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Проблемы доступа к файлам легко и просто диагностируются с помощью Process Monitor.
Старый 12.09.2014, 17:06   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Поясните свою фразу, пожалуйста
Цитата:
Пакет не видит ни путь к папке, ни путь к файлу
в инфолог, что в результате выводится?

У Вас AX3, то есть пакетник - это обычный клиент с запущенной пакетной обработкой?
Старый 15.09.2014, 10:56   #11  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
Цитата:
Сообщение от Wamr Посмотреть сообщение
Поясните свою фразу, пожалуйста

в инфолог, что в результате выводится?

У Вас AX3, то есть пакетник - это обычный клиент с запущенной пакетной обработкой?
WINAPI::fileExists2( передается путь к файлу: "\\server\folder\1.txt" ) - возвращает false, в инфолог сообщение о том, что файл не найден.

Да именно обычный клиент с запущенной пакетной обработкой.
Старый 15.09.2014, 11:14   #12  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
В тексте сообщения путь выводится верно?
А не пробовали вместо перменной в данном коде константой прописать путь к файлу? (исключительно в целях тестирования)
Старый 29.09.2014, 17:48   #13  
CheshireCatЭ is offline
CheshireCatЭ
Участник
Аватар для CheshireCatЭ
 
8 / 10 (1) +
Регистрация: 10.09.2014
Всем спасибо за помощь. Вопрос решен. Проблема была в доступности файлов, хотя админы клятвенно заверяли, что все, что требовалось настроено .
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: WinAPI Blog bot DAX Blogs 0 04.07.2011 12:11
Dynamics AX Geek: Finding files with WinAPI Blog bot DAX Blogs 1 08.10.2009 17:36
PatrickChua: Change the combobox options in RunbaseBatch class Blog bot DAX Blogs 0 04.05.2009 14:05
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 04.04.2009 22:05
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 31.03.2009 06:06

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:15.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.