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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.08.2004, 10:50   #21  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Это все замечательно, но как вытащить из AXAPTA реальные, физические имена полей таблицы?

Т.е. поле типа Dimension - это поле типа массив. Хорошо, по DictField я определяю, что это массив из 4 элементов. Но ведь я получу имена вроде:

Dimension[1]
Dimension[2]
Dimension[3]
Dimension[4]

Но физически, на MS SQL им соответсвуют поля
Dimension
Dimension2_
Dimension3_
Dimension4_

Еще одна неприятность заключается в том, что количество символов в именах таблиц на MS SQL сервере ограничено 30 символами. В AXAPTA - несколько больше. В этом случае в MS SQL имя таких таблиц искусственно обрезается до 26 символов+4 цифры.

Короче, я просто не представляю как решить в общем случае задачу однозначной идентификации имен полей и таблиц AXAPTA и физических имен на MS SQL.

Поэтому, лучше не мудрить и писать скрипты напрямую в MS SQL (хранимые процедуры) и вызывать их из Crystal Reportе (если это возможно).

Правда, не совсем понятно, почему нельзя то же самое сделать через Connection напрямую из AXAPTA. И не нужно "лишний" продукт покупать.
Старый 12.08.2004, 10:59   #22  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
PHP код:
SysDictField sysDictField 
                    new 
SysDictField(tableNum(SalesLine), fieldNum(SalesLineDimension));
int          i;
;
for (
1<= sysDictField.arraySize(); i++) {
    
info(sysDictField.name(DbBackend::Sqli));

Также можно поступить и с названиями таблиц.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 12.08.2004, 11:29   #23  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Это какая версия AXAPTA? У меня 2.5 и функция sysDictField.name() вообще не имеет параметров.

А явное задание

PHP код:
SysDictField sysDictField 
                    new 
SysDictField(tableNum(SalesLine), fieldid2ext(fieldNum(SalesLineDimension),2));
;

    
info(sysDictField.name()); 
Отображает не ожидаемое "Dimension2_", а все то же "Dimension"
Старый 12.08.2004, 12:08   #24  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
на текущий момент у меня стоит цикл по полям запроса, создается строка " Create ...", с помощью connection создается таблица на сервере с теми же полями, что и в запросе. Отчет строится на основе этой единственной таблицы и мне не важны реальные имена полей, при конструировании отчета и так понятно, что какое поле значит. Добавить запись в эту новую таблицу тоже не составляет труда. Единственная проблема - как вытащить запись из Query или QueryRun. Даже не всю запись, а просто значения полей.
Старый 12.08.2004, 12:15   #25  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Это в 3.0.

В 2.5 можно, например, так:
PHP код:
SysDictField    sysDictField 
                    
= new SysDictField(tableNum(SalesLine), fieldNum(SalesLineDimension));
SqlDictionary   SqlDictionary;
int             i;
;
for (
1<= sysDictField.arraySize(); i++) {
    
select firstonly sqlName from SqlDictionary
        where SqlDictionary
.tabId   == sysDictField.tableid() &&
              
SqlDictionary.fieldId == sysDictField.id()      &&
              
SqlDictionary.array   == i;
    
info(SqlDictionary.sqlName);

Кстати, в 3.0 такой вариант тоже будет работать.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 12.08.2004, 12:17   #26  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
2mne2001
Вам же уже несколько раз ответили.

Исходные данные: tableId, fieldId.

Common common;
...
common = queryRun.get(tableId);
value = common.(fieldId);

Результат: value.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 12.08.2004, 12:26   #27  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
Ну не работает так! Возникает ошибка при выполнении: 'поле с идентификатором 1 в таблице common не обнаружено'
Старый 12.08.2004, 12:42   #28  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Все работает!

PHP код:
    ProdTable   prodTable;
    
Common      common;
    
fieldId     fieldId;
    
str         value;
    ;
    
    
select firstonly prodTable
        where prodTable
.ItemId like "??*"
        
&& prodTable.ProdStatus == ProdStatus::StartedUp;
    
    
common prodTable;
    
    
fieldId fieldnum(ProdTableItemId);
    
value common.(fieldId);
    
info(value);

    
fieldId fieldnum(ProdTableStUpDate);
    
value common.(fieldId);
    
info(value);

    
fieldId fieldnum(ProdTableQtyStUp);
    
value common.(fieldId);
    
info(value); 
Старый 12.08.2004, 12:55   #29  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
работает, когда прямое присвоение
common = prodTable

а так? common = queryRun.get(tableId); мне то дан объект queryRun и ничего больше!
Старый 12.08.2004, 12:56   #30  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
попробуйте:
getNo(1);
Старый 12.08.2004, 13:05   #31  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
Та же ошибка, common просто не получает никаких полей, как будто не было никакого присвоения
Старый 12.08.2004, 15:08   #32  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Интересно...

А так:
Common common;
;
common = new DictTable(tableId).makeRecord();
common = queryRun.get(tableId);
value = common.(fieldId);

?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 13.08.2004, 05:09   #33  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
то же самое пишет
Старый 13.08.2004, 07:20   #34  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
Все заработало! Глюк видно был какой-то... Правда вылезла новая проблема с полем dimension, непонятно как обратится к массиву через синтаксис common.(_fieldID)
Старый 13.08.2004, 09:42   #35  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
непонятно как обратится к массиву через синтаксис common.(_fieldID)
/*
Returns an extended FieldId, based on the fieldId and the Array index
(an extended FieldId is a fieldId including the array index)
*/
static fieldId fieldId2Ext( fieldId fieldId, ArrayIdx arrayIndex )


Метод класса Global. Руководство по языку внимательнее читать не забываем.
Старый 13.08.2004, 10:06   #36  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Это известная проблема c Map'ами (а Common тоже можно рассматривать как Map). Нельзя передать в Map значение типа Common и ожидать, что он сам разберется, какой Mapping использовать. Надо сначала явно указать тип либо значения, либо Mapping'а. В данном случае сначала явно указывается, что будет использоватся Mapping "Таблица(tableId) --> Common".
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 13.08.2004, 10:44   #37  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
наконец-то заработало!
оказывается надо так, и в запросе должны быть записи обязательно, иначе common не присваиваеся
for (i=1; i <= _query.DatasourceCount(); i++)
{
queryBuildDataSource = query.dataSourceNo(i);
tableId =queryBuildDataSource.table();
queryBuildFieldList = queryBuildDataSource.fields();
common = queryRun.get(_tableId);

for(j=1; j <= queryBuildFieldList.fieldCount(); j++)
{
fieldId = _queryBuildFieldList.field(j);
dictField = new DictField(_tableId, _fieldId);
if (dictField.arraySize()==1)
{
value=common.(fieldID)
...
}
else
{
for(k=1;k<=_dictField.arraySize();k++)
{
value=common.(fieldID)[k];
...
}
}
}
}
Старый 13.08.2004, 12:54   #38  
ALES is offline
ALES
Участник
Злыдни
 
220 / 45 (2) +++
Регистрация: 11.08.2004
mne2001 Интересно, как исходная задача формулировалась? Любой "стандартный" отчет Вы так не перехватите, перекрытый fetch - обычная практика. Для "внешнего" автоотчета свой SysReportWizard и SysQueryForm под Crystal реализовать быстрее и надежней. Про производительность совсем забыли -ВСЕ даные запроса в Аксапту, из нее на SQL и собственно отчет..

Зачем такие сложности???
Старый 13.08.2004, 13:22   #39  
mne2001 is offline
mne2001
Участник
 
29 / 10 (1) +
Регистрация: 10.08.2004
задача - делать отчеты в Crystal reports. А так как я с axaptой неделю работаю, то ее возможностей практически не знаю, а делать надо, причем срочно...
наверное есть путь проще, но я его не знаю.
Старый 13.08.2004, 13:34   #40  
ALES is offline
ALES
Участник
Злыдни
 
220 / 45 (2) +++
Регистрация: 11.08.2004
Цитата:
Изначально опубликовано mne2001
задача - делать отчеты в Crystal reports. ...
Тогда зачем Вам query ? Как Вы его получаете?
Теги
crystal reports, ax2.5, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
как программно создать документ в DocuView алька DAX: Программирование 5 03.04.2007 18:44
Как программно создать платежное поручение? AK9 DAX: Программирование 3 13.09.2006 09:37
создать и передать временную таблицу kitty DAX: Программирование 11 13.07.2006 14:40
Создать программно складскую проводку с количеством = 0. vasiliy DAX: Программирование 5 26.12.2005 16:46
Невозможно создать таблицу chel DAX: Программирование 0 21.04.2004 21:02
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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