AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 10.09.2014, 11:01   #1  
CheshireCatЭ is offline
CheshireCatЭ
Участник
CheshireCatЭ's Avatar
 
8 / 10 (1) +
Join Date: 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;
}
Old 10.09.2014, 11:14   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,450 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Quote:
Originally Posted by CheshireCatЭ View Post
Все права на папку и файлы есть.
Права есть у какого пользователя? Должны быть у того, под которым работает служба AOS, на котором выполняется пакет
Old 10.09.2014, 11:23   #3  
CheshireCatЭ is offline
CheshireCatЭ
Участник
CheshireCatЭ's Avatar
 
8 / 10 (1) +
Join Date: 10.09.2014
Доступ с сервера где работает пакет обеспечен, все файлы доступны для редактирования.
Old 10.09.2014, 12:08   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Join Date: 28.11.2005
Location: Москва
Blog Entries: 3
Quote:
Originally Posted by CheshireCatЭ View Post
Dynamics AX 3.0, Build #1951.7609/514-193 SP3/OP023-71, СУБД Oracle 9
при запуске с клиента все ОК, как только пытаюсь запустить в пакете WinApi::fileExists2 не видит файлов. Все права на папку и файлы есть.
Quote:
Originally Posted by CheshireCatЭ View Post
Доступ с сервера где работает пакет обеспечен, все файлы доступны для редактирования.
Вам нужно уточнить три вещи:
  1. где именно (на клиенте или на сервере) в пакете выполняется код WinApi::fileExists2()
  2. виден ли с хоста, где выполняется код проверки, путь к файлам (может, путь через подмапленный сетевой диск задается, или указывается на сервере в другом домене, или на хосте, где выполняется проверка, не настроен роутинг в подсеть, где находится сервер с файлами, etc)
  3. есть ли права доступа к файлам у того пользователя, под которым выполняется код. Это нужно проверять с учетом п.1, поскольку пакетный сервер и AOS могут работать под разными пользователями
Проще всего добавить в соотв. код дополнительную диагностику, а именно вывод имени текущего хоста и текущего пользователя, см. xGlobal::computerName() и WinAPI::getUserName().
Old 10.09.2014, 17:08   #5  
CheshireCatЭ is offline
CheshireCatЭ
Участник
CheshireCatЭ's Avatar
 
8 / 10 (1) +
Join Date: 10.09.2014
Quote:
Originally Posted by gl00mie View Post
Вам нужно уточнить три вещи:
  1. где именно (на клиенте или на сервере) в пакете выполняется код WinApi::fileExists2()
  2. виден ли с хоста, где выполняется код проверки, путь к файлам (может, путь через подмапленный сетевой диск задается, или указывается на сервере в другом домене, или на хосте, где выполняется проверка, не настроен роутинг в подсеть, где находится сервер с файлами, etc)
  3. есть ли права доступа к файлам у того пользователя, под которым выполняется код. Это нужно проверять с учетом п.1, поскольку пакетный сервер и AOS могут работать под разными пользователями
Проще всего добавить в соотв. код дополнительную диагностику, а именно вывод имени текущего хоста и текущего пользователя, см. xGlobal::computerName() и WinAPI::getUserName().
Свойства RunOn установлены в Called from.
Сетевой диск к серверу никак не подмаплен.
На сервере один пользователь под которым запускается пакет и права на папку есть.
Old 10.09.2014, 17:31   #6  
CheshireCatЭ is offline
CheshireCatЭ
Участник
CheshireCatЭ's Avatar
 
8 / 10 (1) +
Join Date: 10.09.2014
если запустить класс на сервере, то все отрабатывает без проблем, как только в пакете fileExisxt возвращает false.
Old 11.09.2014, 13:22   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,726 / 1208 (44) ++++++++
Join Date: 13.01.2004
Blog Entries: 3
Quote:
Originally Posted by CheshireCatЭ View Post
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" означает, что данный класс будет запущен там же, где был запущен тот класс из которого его вызвали. Если вызвавший класс запущен на клиенте, то и данный класс будет запущен на клиенте. Если вызвавший класс запущен на сервер, то и данный класс будет запущен на сервере.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
This post has been rated by: Player1 (1).
Old 12.09.2014, 13:14   #8  
CheshireCatЭ is offline
CheshireCatЭ
Участник
CheshireCatЭ's Avatar
 
8 / 10 (1) +
Join Date: 10.09.2014
на сервере (назовем его test) установлен и клиент и AOS, запускаются под одним пользователем, необходимые файлы лежат на другом сервере (назовем его work), у пользователя под которым стартует и клиент и AOS на сервере test полные права на доступ к нужной папке на сервере work. Так же при запуске класса на клиенте, который установлен на сервере test все работает, пакет же не хочет видеть необходимы файлы. Повторюсь путь задается так на диалоге: \\server\folder - затем пакуется. Полный путь к файлу формируется так \\server\folder + '\\' + '1.txt'. Пакет не видит ни путь к папке, ни путь к файлу.

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

У Вас AX3, то есть пакетник - это обычный клиент с запущенной пакетной обработкой?
Old 15.09.2014, 10:56   #11  
CheshireCatЭ is offline
CheshireCatЭ
Участник
CheshireCatЭ's Avatar
 
8 / 10 (1) +
Join Date: 10.09.2014
Quote:
Originally Posted by Wamr View Post
Поясните свою фразу, пожалуйста

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

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

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

Similar Threads
Thread Thread Starter Forum Replies Last Post
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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:49.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.