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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.12.2004, 09:59   #1  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
NumberSeq_Fast
Доброе утро!
[Более точно проблема изложена во втором посте]
[В итоге я разобрался!]

Заливаю InventDim:

PHP код:
             inventDim.initValue();
            
inventDim.inventDimId InventDim::newDimId();
            
inventDim.InventLocationId resultSet.getString(1);
            
inventDim.InventColorId dictEnum.index2Name(Colors::Unknown); 
Ошибка возникает в строке

PHP код:
inventDim.inventDimId InventDim::newDimId(); 
И если покопаться в недрах, то при создании объекта NumberSeq_Fast

PHP код:
 if (numberSequenceTableNum.continuous)
        
numberSeq = new NumberSeq();
    else
        
numberSeq = new NumberSeq_Fast(); 
Log: Ошибка времени выполнения : NumberSeq (Объект), не найден исполнимый код метода 'new'.

В чем может быть дело? (На другой апликухе все работало)
Старый 09.12.2004, 10:11   #2  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Компилирую NumberSeq -- в методе new синтаксическая ошибка на первой строке:

PHP код:
public void new()
{
    
active              FALSE;
    
classEnd            FALSE;
    
tTSCreateRetryOk    FALSE;
    
globalTransId       0;
    
num                 '';
    
voucher             '';

В ClassDecaration:
PHP код:
   boolean                 active
Ничего не понимаю -- о какой ошибке речь!! Опять глюки?!
Старый 09.12.2004, 10:15   #3  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Однако не хватало ;
но раньше все работало без нее!

PHP код:
public void new()
{;
    
active              FALSE;
    
classEnd            FALSE;
    
tTSCreateRetryOk    FALSE;
    
globalTransId       0;
    
num                 '';
    
voucher             '';

Старый 09.12.2004, 10:24   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Тоже часто встречается такая проблема, что во многих методах классов нужно ставить точку с запятой. Причем эти классы как правило лежат в слое sys.
Старый 09.12.2004, 12:10   #5  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
....
inventDim.inventDimId = InventDim::newDimId();
....
НЕПРАВИЛЬНО!

Правильно вот так:

Цитата:
InventDim.clear();
// заполнение аналитик
...
InventDim = InventDim::FindOrCreate( InventDim );
Аксапта сама подберет нужный InventDimId.
Подробнее можно посмотреть на http://axapta.mazzy.ru/hints/inventdim/
Старый 09.12.2004, 12:24   #6  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Ace of Database
Тоже часто встречается такая проблема, что во многих методах классов нужно ставить точку с запятой. Причем эти классы как правило лежат в слое sys.
Это не проблема, это особенность синтаксиса языка X++.
Дело в том что в X++, в отличие от других клонов языка C++ разрешено создавать экземляры переменных с именами, совпадающими с именами типов данных! Это довольно интересный ход, т.к. теперь если в начале ф-ии встретит такой например код:

PHP код:
void funcInventTable InventTable )
{
     
InventTable........
.....

То компилятор не в силах определить самостоятельно что такое InventTable - начало декларации переменной типа InventTable или использование переменной InventTable из параметра, по умолчанию всегда предполагает первое!
Для устранения недоразумений в синтаксис языка была ввдена точка с запятой, отделяющая блок деклараций переменных (возможно пустой) от собственно тела ф-ии (и в отличие от многих других клонов C++ в X++ определять переменные можно только в начале ф-ии). Так что

PHP код:
void funcInventTable InventTable )
{
     
InventTable........
.....

компилятором всегда предполагается как начало объявления переменной типа InventTable, а вот

PHP код:
void funcInventTable InventTable )
{
     ;
     
InventTable........
.....

уже будет воспринято как обращение к параметру InventTable.

Интересно так же что в нигде других местах языка не разрешаются "лишние" точки с запятой, опять же в отличие от других клонов C++ в которых такие вещи гордо наз-ся "пустыми операторами".
Старый 09.12.2004, 13:46   #7  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Цитата:
Правильно вот так:
Благодарю! Исправил!
Старый 09.12.2004, 14:31   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Это не проблема, это особенность синтаксиса языка X++.
2 Alks
А почему тогда точка с запятой отсутствует во многих методах во многих классах на sys-слое? И почему вдруг эти классы в один прекрасный момент времени перестают компилироваться до тех пор, пока там не поставишь точку с запятой?
Старый 09.12.2004, 14:47   #9  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Ace of Database


2 Alks
А почему тогда точка с запятой отсутствует во многих методах во многих классах на sys-слое?
Потому что она необязательна, если предположение компилятора относительно того что вы хотите написать непосредственно после блока деклараций переменный совпадает с вашим намерением.

Цитата:
И почему вдруг эти классы в один прекрасный момент времени перестают компилироваться до тех пор, пока там не поставишь точку с запятой?
Глядя на ваш код я думаю потому что вы завели новый тип данных с названием Active. Посмотрите внимательно на код который вы запостили:
PHP код:
public void new()
{
    
active              FALSE;
    
classEnd            FALSE;
    
tTSCreateRetryOk    FALSE;
    
globalTransId       0;
    
num                 '';
    
voucher             '';

После того как вы ввели EDT или Base Enum с названием Active компилятор аксапты перестал понимать чем является первая строчка метода - то ли некорректным объявлением переменной типа Active, то ли присваиванием члену класса. Как я уже говорил по умолчанию компилятор предполагает первое.
Старый 09.12.2004, 16:17   #10  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Спасибо, Alks. Ваша теория вполне имеет место быть. Вопрос к DreamCreatoru, действительно ли у него в приложении есть EDT или ещ что-нибудь с именем Active?

Я, например всегда стараюсь давать создаваемым мною объектам префикс, чтобы они никогда не пересекались с чем-ибо еще. Но и уменя иногда возникает проблема с точкой с запятой. Может, потому что я в AOT'E не один.
Старый 09.12.2004, 17:07   #11  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
> Но и уменя иногда возникает проблема с точкой с запятой.
> Может, потому что я в AOT'E не один.

"Проблема с запятой" будет очень часто у вас появлятся, если вы.... программируете в X++.
Еще раз повторяю - это НЕ проблема. Это особенность синтаксиса языка.
Попробуйте создать Job, который выводит в инфолог строчку "Hello, world!" и в 9 случаях из 10 столкнётесь с этой особенностью.
Потому что глобальная ф-я Global::info называется так же как класс Info... и т.п. и т.д.
В следующий раз когда у вас снова возникнет подобная проблема - постите сюда, разберемся.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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