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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2007, 13:26   #1  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Подскажите с Binary
Доброго понедельничка всем обитателям сия ресурса.

Уважаемы неожиданно возникла задача след. содержания:

Необходима из Аксапты формировать некий отчет в Excel по заданному шаблону.
Затем этот файлик юзер куда-то сохраняет, после чего он должен его импортировать в Аксапту (сам файл Excel'я), в которой этот самый файлик и должен храниться в каком то виде до определенного момента. Пока его не захотят снова открыть (экспорт). То есть необходимо потом обратная процедура: из этого некоего хранилища надо вывести "как есть" хранящийся файлик в Excel.

Как это красивше и правильнее реализовать средствами Аксапты (Ax 3.0)

Думается создать простенькую табличку вида:
- Код файла
- структура

, где "структура" - некое хранилище где и будет хранится в чистом виде Excel-файл. Предположительно это тип container (но если я не прав поправьте)


Так вот если следовать этому направлению. то необходимы какие то механизмы реализующие возможность импорта/экспорта файлов в аксаптовкий тип container.
Подскажите что можно попользовать, классец какой или еще что имеется ?

Слышал есть классы Binary и BinData

по названию вроде должны подходить, но хотелось бы увидеть наглядный примерчик как передать файл в Аксапту с их помощью, как вытянуть файл из аксаптовкой структуры(container) обратно в Excel.

Или же в моем случае лучше использовать какие то другие классы?

Вообщем направьте на путь истиный...

Заранее респект всем откликнувшимся и сочуствующим...
Старый 23.07.2007, 13:40   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Делайте шаблон exel. Файл xlt. В нем скрытый лист Data. Первая строчка русские имена. Под ними вторая строчка значения. Дальше строку для наглядности пропустили. Четвёртая имена строк. Пятая и далее таблица.Смысл: обычно нужна одна строчка из шапки и таблица приджойненая к ней (строки). А аналитики и юзары пусть уж как хотят возятся с этим шаблоном с помощью ссылок. Куда какие поля раставить, добавить формулы и т.д. Вам лишь прейдётся работать с жёстко структурированным листом Data. Для вас Data будет протокол общения.

Последний раз редактировалось miklenew; 23.07.2007 в 13:43.
За это сообщение автора поблагодарили: Ed1k (1).
Старый 23.07.2007, 13:45   #3  
online
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
посмотрите как работает документооборот.
Старый 23.07.2007, 13:46   #4  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
X++:
    // AOSRunMode::client - this method is always called on the client, which eliminates the need for a CAS assert.
public static client DocuValue writeDocuValue(DocuRef  docuRef, Filename filename = '', BinData binData = null)
{
    DocuValue   docuValue;
    DocuType    docuType;
;

    ttsbegin;

    docuType  = docuRef.docuType();
    docuValue = docuRef.docuValue(true);

    [docuValue.FileName, docuValue.FileType, docuValue.Path] = Docu::splitFilename(filename);
    if (docuType.FilePlace != DocuFilePlace::NoCopy)
        docuValue.Path = ''; //path is already stored in ArchivePath in docuType or docuParameters

    if (docuType.FilePlace == DocuFilePlace::Database)
    {
        // Insert to database
        if (WinAPI::fileLocked(filename))
        {
            info("@SYS72783",'',SysInfoAction_Formrun::newFormnameControlnameDesc(formstr(DocuOpenFile), identifierstr(Grid), "@SYS4167"));
        }
        else
        {
            if (! binData)
            {
                binData = new BinData();
                if (binData.loadFile(filename)) //only works if file not locked
                {
                    docuValue.File = binData.getData();
                }
                else
                    throw error(strfmt("@SYS54217",filename));
            }
            else
                docuValue.File = binData.getData();
        }
    }

    docuValue.update();

    ttscommit;
    return docuValue;
}
где docuValue.File имеет вид container.

Последний раз редактировалось petr; 23.07.2007 в 13:58. Причина: Более полный ответ
Старый 23.07.2007, 13:48   #5  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Это было сохранение в таблицу, теперь восстановление
X++:
static public Filename saveTempFile(DocuRef docuRef, boolean internetCache = true)
{
    BinData     binData;
    Filename    filename;
    FilePath    filePath;
    str endSlash(str _str)
    {
        return (strscan(_str, '\\',strlen(_str),-1)) ? _str : _str + '\\';
    }
;
    binData = new BinData();
    binData.setData(docuRef.docuValue().file);

    filePath = endSlash(internetCache ? WinAPI::getFolderPath(#CSIDL_INTERNET_CACHE) : xInfo::directory(DirectoryType::Temp));
    filename = docuRef.completeFilename(filePath);

    binData.saveFile(filename);

    return  filename;
}
За это сообщение автора поблагодарили: Player1 (2).
Старый 23.07.2007, 13:50   #6  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от miklenew Посмотреть сообщение
Делайте шаблон exel. Файл xlt. В нем скрытый лист Data. Первая строчка русские имена. Под ними вторая строчка значения. Дальше строку для наглядности пропустили. Четвёртая имена строк. Пятая и далее таблица.Смысл: обычно нужна одна строчка из шапки и таблица приджойненая к ней (строки). А аналитики и юзары пусть уж как хотят возятся с этим шаблоном с помощью ссылок. Куда какие поля раставить, добавить формулы и т.д. Вам лишь прейдётся работать с жёстко структурированным листом Data. Для вас Data будет протокол общения.
чего то я не понял о чем речь идет в данно сообщении. можно пояснить?

дело в том, что само формирование отчета мне не сильно важно... Как вывести отчет в Excel на основании шаблона - это не проблема реализовать...
Необходимо именно реализовать импорт/экспорт самого файла в каком-либо виде(бинарном) в/из Аксапты.

Просто нужно этот весь геморрой для того чтобы хранить разные версии этого самого отчета. Допустим сформировали 1ый раз отчет сохранили на диск, сделали импорт. А потом решили кое-чего подправить в нем(без изменения данных, на основании которых формируется отчет, в Аксапте) цифирки, делаем экспорт 1ой версии, подправили, сохранили, импорт (предыдущая версия не затирается, а создается новая запись в таблице - новая версия) и т.д.

вот для чего весь карнавал...
Старый 23.07.2007, 13:56   #7  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
2petr:
а вот это уже похоже на что-то интересное...
я так понимаю код откуда то из стандарта выдернут ? если так подскажите откуда...

в посте про импорт: filename - это полный путь к файлу на диске?
Старый 23.07.2007, 14:01   #8  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
filename - путь в файлу,
сохраниние в БД \Data Dictionary\Tables\DocuValue\Methods\writeDocuValue
извлечение из БД \Classes\DocuActionFile\saveTempFile
поле docuRef.docuValue().file тоже самое поле типа container в которое и сохраняли.
За это сообщение автора поблагодарили: sparur (1).
Старый 23.07.2007, 14:06   #9  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
А чё не понятно. Появился диалог с параметрами запроса. Выстовили что нужно ок. Хотите выводите это на экран (чтоб юзары сохранили куда-то или сами или в настройках путь экспорта вам виднее), хотите не выводите. Просто выдали экспорт окончен. Далее юзары поюзали. Только надо сделать чтоб эти данные обновлялись и на Date. Делаем импорт. С настройками или явно тоже ваше дело. В аксапте что-то меняем снова экспорт.
Цитата:
Сообщение от sparur Посмотреть сообщение
подправили, сохранили, импорт (предыдущая версия не затирается, а создается новая запись в таблице - новая версия) и т.д.
Можно обновление сделать, а можно добавление (хотя не уверен что это правильно). Надо версию сохранить сохраняйте в чём проблемы. Сделайте какие- нибудь утверждения при формирование имяни их и реализуйте. Цифирки, буковки. А лучше галочки на диалоге создать новый исходя из того который последний+сдвиг(исходя из утверждение) или затереть. Вам решать. Но подумать прийдётся до того как код писать.
Старый 23.07.2007, 14:07   #10  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от petr Посмотреть сообщение
filename - путь в файлу,
сохраниние в БД \Data Dictionary\Tables\DocuValue\Methods\writeDocuValue
извлечение из БД \Classes\DocuActionFile\saveTempFile
поле docuRef.docuValue().file тоже самое поле типа container в которое и сохраняли.
ок, буду пробовать. спасибо за наметку... надеюсь подможет решить задачу...
Кстати а как со скоростью исполнения данного метода? отчего будет зависить время импорта/экспорта файла?
Старый 23.07.2007, 14:13   #11  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от miklenew Посмотреть сообщение
А чё не понятно. Появился диалог с параметрами запроса. Выстовили что нужно ок. Хотите выводите это на экран (чтоб юзары сохранили куда-то или сами или в настройках путь экспорта вам виднее), хотите не выводите. Просто выдали экспорт окончен. Далее юзары поюзали. Только надо сделать чтоб эти данные обновлялись и на Date. Делаем импорт. С настройками или явно тоже ваше дело. В аксапте что-то меняем снова экспорт.

Можно обновление сделать, а можно добавление (хотя не уверен что это правильно). Надо версию сохранить сохраняйте в чём проблемы. Сделайте какие- нибудь утверждения при формирование имяни их и реализуйте. Цифирки, буковки. А лучше галочки на диалоге создать новый исходя из того который последний+сдвиг(исходя из утверждение) или затереть. Вам решать. Но подумать прийдётся до того как код писать.
нет, спасибо конечно, но что-то вариант, предложенный petr'ом мне как то ближе к пониманию...
То, что Вы предлагаете возможно тоже является решением задачи, однако не в моем представлении... возможно я просто смотрю слишком узко на поставленную задачу... но все равно спасибо за проявлнный интерес...
Старый 23.07.2007, 14:13   #12  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от miklenew Посмотреть сообщение
А чё не понятно. Появился диалог с параметрами запроса. Выстовили что нужно ок. Хотите выводите это на экран (чтоб юзары сохранили куда-то или сами или в настройках путь экспорта вам виднее), хотите не выводите. Просто выдали экспорт окончен. Далее юзары поюзали. Только надо сделать чтоб эти данные обновлялись и на Date. Делаем импорт. С настройками или явно тоже ваше дело. В аксапте что-то меняем снова экспорт.

Можно обновление сделать, а можно добавление (хотя не уверен что это правильно). Надо версию сохранить сохраняйте в чём проблемы. Сделайте какие- нибудь утверждения при формирование имяни их и реализуйте. Цифирки, буковки. А лучше галочки на диалоге создать новый исходя из того который последний+сдвиг(исходя из утверждение) или затереть. Вам решать. Но подумать прийдётся до того как код писать.
нет, спасибо конечно, но что-то вариант, предложенный petr'ом мне как то ближе к пониманию...
То, что Вы предлагаете возможно тоже является решением задачи, однако не в моем представлении... возможно я просто смотрю слишком узко на поставленную задачу... но все равно спасибо за проявлнный интерес...
Старый 23.07.2007, 15:07   #13  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Имейте в виду, что в BinaryData есть ограничение на размер сохраняемого файла. Что-то близкое в 64Мб. При попытке затягивания excel-документа в базу данных большего размера Аксапта просто висла. Похоже, что это ограничение нигде не описано.
Как выход, я использовал архивирование больших файлов, перед затягиванием их в БД. Но это пораждает две проблемы. Первое - дождаться окончания архивации, перед загрузкой файла в бд, вторая - деплоинг архиватора и получение прав на запуск архиватора (к сожалению, не у всех это есть).
Первая проблема решается путем импортирования api-функции createProcess. Вторая - групповыми политиками.
Старый 23.07.2007, 15:13   #14  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от Андре Посмотреть сообщение
Имейте в виду, что в BinaryData есть ограничение на размер сохраняемого файла. Что-то близкое в 64Мб. При попытке затягивания excel-документа в базу данных большего размера Аксапта просто висла. Похоже, что это ограничение нигде не описано.
Как выход, я использовал архивирование больших файлов, перед затягиванием их в БД. Но это пораждает две проблемы. Первое - дождаться окончания архивации, перед загрузкой файла в бд, вторая - деплоинг архиватора и получение прав на запуск архиватора (к сожалению, не у всех это есть).
Первая проблема решается путем импортирования api-функции createProcess. Вторая - групповыми политиками.

спасибо за предупреждение, но я думаю размер в 64 МБ в данном случае недостижим В предполагаемом отчете ограниченный набор строк(при чем его существенное изменение в сторону увеличения не предвидется) и он на сегодня никак не дотягивает до такого размера(слава богу ), соответственно вопрос можно снять с повестки обсуждения.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Binary -> Container Fedor DAX: Программирование 16 28.04.2014 10:59
gl00mie: View AOCP/RPC Interface Version used by an Arbitrary DAX Binary Blog bot DAX Blogs 0 30.09.2008 16:05
Ошибка времени выполнения: Binary (Объект), метод string вызван с недопустимыми параметрами. mmm DAX: Программирование 4 15.05.2007 16:00
String or binary data would not be truncated DreamCreator DAX: Программирование 4 22.02.2005 03:06
Binary in Axapta BorDark DAX: Программирование 6 01.09.2004 19:08

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

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

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