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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.10.2003, 09:34   #1  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
? Как достать Common из FormDataSource?
Прошу прощения за дублирование этого сообщения (первоначально оно было в теме "Программирование в среде MorphX..."), но из-за особенностей навигации на сайте этот форум - "Программирование в Аксапта (дороботка)" - посещается гораздо чаще.

Вопрос такой: есть класс, в который при создании передается параметром ДатаСорс формы. А в этом классе необходимо получить доступ к таблице этого ДатаСорса. Именно к таблице, то есть к объекту типа Common.
Нужно это для того, чтобы потом можно было выполнять такие запросы к этой таблице:
PHP код:
common SourceTable;
....
// здесь надо получить SourceTable из DataSource
...
while 
select from SourceTable where SourceTable.(ParentIDField) == ParentValue
{
 ... 

Старый 23.10.2003, 10:24   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
можно попробовать так
PHP код:


static void test(common _Source)
{
    
SalesTable              SalesTable;
    
SalesLine               SalesLine;
    
PurchTable              PurchTable;
    
PurchLine               PurchLine;
    ;
        switch (
_Source.TableId)
        {
            case 
tablename2id("SalesTable") :
                 
select SalesTable where SalesTable.RecId == _Source.RecId;
.... 
Старый 23.10.2003, 10:28   #3  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
можно так
PHP код:
server static CustAccount createOneTimeAccount(Common _common)
{
    
NumberSeq           numberSeq;
    
CustInvoiceTable    custInvoiceTable;
    
SalesTable          salesTable;
    
CustTable           custTable;
    ;

    if (!
CustTable::createOneTimeAccountValidate())
        return 
'';

    
ttsbegin;

    
numberSeq NumberSeq::newGetNum(CustParameters::numRefOneTimeCustomerAccount());

    
custTable CustTable::find(CustParameters::find().defaultCust);

    
custTable.accountNum numberSeq.num();

    switch (
_common.tableId)
    {
        case  
custInvoiceTable.tableId  :
            
custTable.initFromCustInvoiceTable(_common);
            break;

        case  
salesTable.tableId  :
            
custTable.initFromSalesTable(_common);
            break;
..... 
Старый 23.10.2003, 10:31   #4  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
поищи в AOT такой текст
switch (_common.tableId)
и надешь кучу примеров
Старый 23.10.2003, 10:46   #5  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Так мне-то наоборот нужно
В указанных примерах тип таблицы указан ЯВНО:

SalesTable salesTable;

так то оно без проблем работает. А нужно, чтобы тип таблицы заранее не был известен, а передавалась она как-то через FormDataSource...
Идентификатор ее я могу вытащить через DataSource.table(), но вопрос в том, как из него получить объект Common, а не заранее известный тип таблицы...
Старый 23.10.2003, 10:58   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
RTFM - System Documentation\ Classes\ FormDataSource
FormDataSource.cursor()

а можно еще воспользоваться Query & QueryRun для получения данных по известному TableId
Старый 23.10.2003, 11:34   #7  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Спасибо!
cursor() действительно работает!
Старый 23.10.2003, 12:32   #8  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано Ruff
cursor() действительно работает!
Будьте внимательны, cursor() вернет вам буфер таблицы, который используется для вывода данных в форму. То есть, если вы начнете делать select'ы, указывая в качестве таблицы именно этот cursor(), будет происходить фильтрация данных, выводимых в форму. Лучше создать еще один объект, и делать select'ы по нему.

Для более подробного ответа, необходимо знать подробности вашей задачи.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 23.10.2003, 12:49   #9  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Изначально опубликовано Maxim Gorbunov


Лучше создать еще один объект, и делать select'ы по нему.

Для более подробного ответа, необходимо знать подробности вашей задачи.
Задача такая: требуется сгенерить дерево из таблицы (аналог класса formTreeDataSource). Но хотел реализовать это не через Query и QueryRun, как в оригинале, а обычными select-ами. Интересно сравнить скорость выполнения разных методов.

А вот насчет "создать еще один объект" хотелось бы поподробнее, если можно...
Старый 23.10.2003, 14:22   #10  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
А вот насчет "создать еще один объект" хотелось бы поподробнее, если можно...
см. DictTable.makeRecord()
Старый 23.10.2003, 14:24   #11  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Цитата:
Изначально опубликовано Ruff

А вот насчет "создать еще один объект" хотелось бы поподробнее, если можно...
PHP код:
void method(FormDataSource _formDS)
{
      
Common   common _formDS.cursor().data();

__________________
С уважением, Игорь Ласийчук.
Старый 23.10.2003, 14:31   #12  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Чтобы понять, что я имел в виду, под фильтрацией буфера, проведите маленький эксперимент:
  1. Создайте форму и добавьте к ней DataSource. Например, InventTable.
  2. На форме разместите Grid, в котором выведите какие-нибудь данные DataSource.
  3. Также на форме поставьте кнопку. В методе clicked() у нее напишите что-нибудь вроде:
    PHP код:
    Common  common;
    ;
    common InventTable_ds.cursor();
    select common where common.(fieldnum(InventTableItemId)) like "С*"
  4. Нажмите на кнопку и наблюдайте за содержимым Grid'а.

А теперь представьте, что вы генерируете более сложные запросы. Представьте, что будет видеть пользователь!

Вместо этого, предлагаю вам создать новый буфер и читать данные из него. Если вы хотите добиться полной универсальности, воспользоваться можно следующим способом (вставьте в тот же самый метод clicked()):
PHP код:
Common          common;
SysDictTable    dictTable;
;
dictTable = new SysDictTable(InventTable_ds.table()); // Получаем ссылку на таблицу в AOT
common dictTable.makeRecord(); // Создаем новый буфер для этой таблицы

select firstonly common// Делаем с буфером что захотим

info(common.(fieldNum(InventTableItemId))); 
Удачи.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 23.10.2003, 15:16   #13  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Не понимаю механизма...
2 Garic:
Цитата:
Common common = _formDS.cursor().data();
Спасибо! Это помогло.
Хотя так и не понял смысла метода data(). Он дублирует всю таблицу? То есть, это как бы новый экземпляр?

2 Maxim Gorbunov:

А чем отличается common = dictTable.makeRecord(); от, скажем, common = InventTable_ds.cursor().data() ?
Старый 23.10.2003, 18:30   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Из Online Help про метод data():
Цитата:
Returns only the data part of the record. Is used to copy data from one record buffer to another rather than making the new buffer into a pointer to the buffer copied from. The buffer copied to has no database position or locks.
От makeRecord внешне отличается тем, что копирует данные из курсора. makeRecord же просто создает "ссылку на таблицу".
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как достать выбранные значения после lookup ledenezz DAX: Программирование 6 25.03.2009 05:11
Inside Dynamics AX 4.0: Common Search Blog bot DAX Blogs 0 29.10.2007 10:50
Различные типы связей (LinkType) для FormDataSource Maxim Gorbunov DAX: База знаний и проекты 1 16.05.2004 13:20
Гибрид FormTableControl и FormDataSource Андре DAX: Программирование 27 01.10.2003 09:58
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35

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

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

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