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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.04.2009, 16:45   #1  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Отчёт ProjectInvoice - добавление нового поля.
Всем здравствуйте.

у меня вопрос:

я хочу добавить поле LastName из DirPartyTable в Section Group: ProjInvoiceEmpl. Создаю display методу:
X++:
display Name emplLastName()
{
    DirPartyTable   dirPartyTable;
    EmplTable       emplTable;
    Name            _name;
    ;


    select lastName from dirPartyTable
        join PartyId from emplTable
            where dirPartyTable.PartyId == emplTable.PartyId
        join EmplId from projInvoiceEmpl
            where emplTable.EmplId      == projInvoiceEmpl.EmplId
        join ProjinvoiceID from projInvoiceJour
            where   projInvoiceJour.ProjInvoiceId == projInvoiceEmpl.ProjInvoiceId &&
                    projInvoiceJour.invoiceDate == projInvoiceEmpl.InvoiceDate;

     _name = dirPartyTable.LastName;
    return  _name;
    
}
добавляю ее в Body, но после этого выводиться только одна строчка. Если убираю её, выводятся все. Проверяю запрос c job, вижу все LastName.


Пробовал вызвать её с fetch() до этой строки: this.send(projInvoiceEmpl); в while projInvoiceEmpl, результат тот-же.

Что я делаю неправильно???

Заранее спасибо.

Последний раз редактировалось Dima_Dima; 09.04.2009 в 16:55.
Старый 09.04.2009, 17:00   #2  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Попробуйте в этом методе
X++:
display Name emplLastName()
{
    DirPartyTable   dirPartyTable;
    EmplTable       emplTable;
    Name            _name;
projInvoiceEmpl projInvoiceEmplloc;
projInvoiceJour projInvoiceJourloc;

    ;


    select lastName from dirPartyTable
        join PartyId from emplTable
            where dirPartyTable.PartyId == emplTable.PartyId
        join EmplId from projInvoiceEmplloc
            where emplTable.EmplId      == projInvoiceEmplloc.EmplId &&
projInvoiceEmplloc.transid ==projInvoiceEmpl.transid 
        join ProjinvoiceID from projInvoiceJourloc
            where   projInvoiceJourloc.ProjInvoiceId == projInvoiceEmplloc.ProjInvoiceId &&
                    projInvoiceJourloc.invoiceDate == projInvoiceEmplloc.InvoiceDate &&;

     _name = dirPartyTable.LastName;
    return  _name;
    
    
}
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 09.04.2009, 17:05   #3  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
всё заработало!!!

Спасибо!
Старый 09.04.2009, 18:28   #4  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Попробуйте в этом методе
X++:
display Name emplLastName()
{
    DirPartyTable   dirPartyTable;
    EmplTable       emplTable;
    Name            _name;
projInvoiceEmpl projInvoiceEmplloc;
projInvoiceJour projInvoiceJourloc;

    ;


    select lastName from dirPartyTable
        join PartyId from emplTable
            where dirPartyTable.PartyId == emplTable.PartyId
        join EmplId from projInvoiceEmplloc
            where emplTable.EmplId      == projInvoiceEmplloc.EmplId &&
projInvoiceEmplloc.transid ==projInvoiceEmpl.transid 
        join ProjinvoiceID from projInvoiceJourloc
            where   projInvoiceJourloc.ProjInvoiceId == projInvoiceEmplloc.ProjInvoiceId &&
                    projInvoiceJourloc.invoiceDate == projInvoiceEmplloc.InvoiceDate &&;

     _name = dirPartyTable.LastName;
    return  _name;
    
    
}
Если вам необходимо вернуть только фамилию, то в выборку не нужно включать PartyId, EmplId, ProjinvoiceID - только лишние данные выбираете

Кроме того, если учесть, что CacheLookup свойство таблиц EmplTable, DirPartyTable выставлено в found, можно так выбрать

X++:
return EmplTable::find(projInvoiceEmpl.EmplId).dirPartyTable().LastName;
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 09.04.2009, 18:39   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Если вам необходимо вернуть только фамилию, то в выборку не нужно включать PartyId, EmplId, ProjinvoiceID - только лишние данные выбираете
Угу, а если их опустить, то данных вернётся ещё больше...

Вообще, полезно пользоваться select firstonly + exist join
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 09.04.2009, 19:18   #6  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Угу, а если их опустить, то данных вернётся ещё больше...

Вообще, полезно пользоваться select firstonly + exist join
Согласен, но если их опустить - есть вероятность получение этих данных из кеша
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 23.04.2009, 18:33   #7  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
полдня битвы теперь с custAccount, вставляю в job все корректно, если в display, то во всех строках выдается первое значение. Делаю все вроде по лучшим рекомендациям. Такое ощущение, что значения достаются не с таблиц, а с кеша.
Где я косячу?

X++:
display AccountNum customerId()
{
    SMAserviceOrderTable        smaserviceordertableloc;
    SMAServiceOrderLine         smaserviceorderlineloc;
    Name                                _patID;
    ProjInvoiceEmpl                 projinvoiceemplloc;
    ;


    select CustAccount from smaserviceordertableloc
        exists join serviceOrderId from smaserviceorderlineloc
            where smaserviceordertableloc.serviceorderid        == smaserviceorderlineloc.ServiceOrderId &&
                     smaserviceordertableloc.AgreementId        == smaserviceorderlineloc.AgreementId
        exists join TransId    from projInvoiceEmplloc
            where projinvoiceemplloc.TransId                    == smaserviceorderlineloc.ProjTransId;

    _patID   = smaserviceordertableloc.CustAccount;

    return _patID;

}
Старый 23.04.2009, 18:44   #8  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
А метод где написан, на датасорсе?

Последний раз редактировалось DSPIC; 23.04.2009 в 18:50.
Старый 23.04.2009, 18:51   #9  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от DSPIC Посмотреть сообщение
А метод где написан, на датасорсе?
Section Group: ProjInvoiceEmpl --> Body:ProjectEmployeeInvoiceTrans --> Methods
Старый 23.04.2009, 19:04   #10  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Ок, посмотрим на этот код по другому. Ваш код возвращает какой CustAccount ? Т.е. если метод представить в виде функции, то должно быть что-то вроде:

CustAсcount = F(x,y,...), где х,у - входные параметры, в зависимости от которых вычисляется CustAсcount.
Глядя на этот код, можно сказать, что входные параметры отсутствуют, и естественно, результат выполнения метода будет статичен. И как результат - во всех строках одно и то же. Ну в зависимости от чего метод долженг выбрать нужный CustAсcount?

В дисплэй\эдит методах входным параметром является курсор, которые в сию секунду отрисовывается на форме. Если метод написан на датасорсе формы, то этот курсор приходит в метод параметром. Если на таблице, то этим курсором служит this. Если в отчете, то этим курсором служит имя датасорса квери.
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 23.04.2009, 19:39   #11  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Если в отчете, то этим курсором служит имя датасорса квери.
ProjInvoice --> DataSource --> Query --> DataSource --> ProjInvoiceJour

X++:
display AccountNum customerId()
{
    SMAserviceOrderTable        smaserviceordertableloc;
    SMAServiceOrderLine         smaserviceorderlineloc;
    Name                             _patID;
    ProjInvoiceEmpl             projinvoiceemplloc;
    ;


    select firstonly CustAccount, ServiceOrderId from smaserviceordertableloc
        exists join serviceOrderId from smaserviceorderlineloc
            where smaserviceordertableloc.serviceorderid        == smaserviceorderlineloc.ServiceOrderId &&
                     smaserviceordertableloc.AgreementId        == smaserviceorderlineloc.AgreementId
        exists join TransId    from projInvoiceEmplloc
            where projinvoiceemplloc.TransId                    == smaserviceorderlineloc.ProjTransId
        exists join ProjinvoiceID from projInvoiceJour
            where    projInvoiceEmplloc.ProjInvoiceId           == projInvoiceJour.ProjInvoiceId;
                     
             

    _patID   = smaserviceordertableloc.CustAccount;
    

    return _patID;
так тоже никакого эффекта...
Старый 23.04.2009, 21:10   #12  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Dima_Dima Посмотреть сообщение
ProjInvoice --> DataSource --> Query --> DataSource --> ProjInvoiceJour

X++:
display AccountNum customerId()
{
    SMAserviceOrderTable        smaserviceordertableloc;
    SMAServiceOrderLine         smaserviceorderlineloc;
    Name                             _patID;
    ProjInvoiceEmpl             projinvoiceemplloc;
    ;


    select firstonly CustAccount, ServiceOrderId from smaserviceordertableloc
        exists join serviceOrderId from smaserviceorderlineloc
            where smaserviceordertableloc.serviceorderid        == smaserviceorderlineloc.ServiceOrderId &&
                     smaserviceordertableloc.AgreementId        == smaserviceorderlineloc.AgreementId
        exists join TransId    from projInvoiceEmplloc
            where projinvoiceemplloc.TransId                    == smaserviceorderlineloc.ProjTransId
        exists join ProjinvoiceID from projInvoiceJour
            where    projInvoiceEmplloc.ProjInvoiceId           == projInvoiceJour.ProjInvoiceId;
                     
             

    _patID   = smaserviceordertableloc.CustAccount;
    

    return _patID;
так тоже никакого эффекта...
А не попробовать ли вам добавить параметр в ваш дисплей-метод?
X++:
display AccountNum customerId(ProjInvoiceJour _projInvoiceJour)
и использовать его...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 23.04.2009, 22:03   #13  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от ZVV Посмотреть сообщение
А не попробовать ли вам добавить параметр в ваш дисплей-метод?
X++:
display AccountNum customerId(ProjInvoiceJour _projInvoiceJour)
и использовать его...
Тут речь про отчет, а эта конструкция только[?] для датасорса формы применима.

2 Dima_Dima: У вас, как я понимаю, DAX2009? У меня, к сожалению, её нет под рукой. Но глядя на этот отчет в 4-ке, можно увидеть, что секция
\Reports\ProjInvoice\Designs\Standard\Generated Design\Section Group: ProjInvoiceJour\Body:ProjectInvoiceJour\Section Group: ProjInvoiceEmpl
может выполняться несколько раз для одного и того же projInvoiceJour, от которого зависит получаемый Вами _patID. Посмотрите строки отчета, где изменяется projInvoiceJour. Логичнее было бы разместить ваше поле на уровне секции
"\Reports\ProjInvoice\Designs\Standard\Generated Design\Section Group: ProjInvoiceJour\Body:ProjectInvoiceJour"
, но тут уже вопросы дизайна.

P.S. Могу ошибаться.

Последний раз редактировалось DSPIC; 23.04.2009 в 22:09.
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 27.04.2009, 12:44   #14  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от DSPIC Посмотреть сообщение
CustAсcount = F(x,y,...), где х,у - входные параметры, в зависимости от которых вычисляется CustAсcount.
Глядя на этот код, можно сказать, что входные параметры отсутствуют, и естественно, результат выполнения метода будет статичен. И как результат - во всех строках одно и то же. Ну в зависимости от чего метод долженг выбрать нужный CustAсcount?
Благодарю за ответ, если вы не AX-тренер, то советую им стать. Очень простое и доходчивое объяснение.

Всё заработало!

Последний раз редактировалось Dima_Dima; 27.04.2009 в 13:21.
Старый 27.04.2009, 13:57   #15  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Не вводите людей в заблуждение, AX-Тренер (http://axforum.info/forums/member.php?u=1524) довольно известная личность, в свое время. Когда еще занимался проектом http://ax-test.narod.ru

Правда, он довольно давно не публикуется на форуме.

С Уважением,
Георгий
Старый 27.04.2009, 14:15   #16  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от George Nordic Посмотреть сообщение
Не вводите людей в заблуждение,
????

AX-Trainer, так наверно лучше.

кого-либо вводить в заблуждение у меня и в мыслях небыло. К чему вы это запостили????
Старый 27.04.2009, 19:25   #17  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Каким образом можно управлять на какой странице печатаются суммы? Если позиций много, то суммы почему-то печатаются на первой странице...
когда нужно, чтобы печатались на последней.
Теги
отчет, axapta

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Значение по умолчанию при добавлении нового поля zYmosi3 DAX: Программирование 4 08.04.2008 12:03
Добавление нового поля в старую таблицу PavelSR DAX: Программирование 3 14.06.2006 08:22
Как заставить отчет группироваться по части поля ahtoh DAX: Функционал 1 12.01.2006 11:00
Добавление полей в стандартный отчет tolstjak DAX: Программирование 10 06.04.2004 17:50
Проблема при добавлении в таблицу нового поля Maxim Gorbunov DAX: База знаний и проекты 2 09.08.2002 15:30
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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