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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.08.2012, 15:41   #1  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Запись в бинарный файл
Столкнулся с такой задачей: нужно в файл базы данных DBF записать 1 байт с 28 позиции - чтобы игнорировать индексы. На визуал бейсике это сделать легко:

Open FilePath For Binary As #1

Put #1, 29 , CByte(0) 'Байт со смещением 28 (по счету - 29-й)
Close #1

А вот как на аксапте? BinaryIO не подходит, BinData может быть? Если можно кусок кода. Спасибо за внимание.

PS. Может кто знает как через ConnectionString или еще как нибудь можно удалить либо игнорить индекс для базы данных MDX

Последний раз редактировалось CHESER85; 08.08.2012 в 15:56. Причина: поскриптум
Старый 08.08.2012, 17:03   #2  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
программеры где вы! ау.
Старый 08.08.2012, 20:06   #3  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
методом активного интернет-поиска нашел решение:

X++:
static void Jobik(Args _args)
{

  BinData B = new BinData();
  array a = new array(types::Enum);
  comvariant var1;
  ;
  B.loadFile("c:\\temp\\old_file.dbf");
  var1 = b.getVariant();
  a=var1.safeArray();

  a.value(29,0);
  var1.safeArray(a);
  b.setVariant(var1);
  B.SaveFile("c:\\temp\\new_file.dbf");
}
я считаю что оно не оптимально, т.к. для замены одного байта приходится делать слишком много ненужных операций: загрузка всего файла, копирование его в массив, потом обратно в файл. хотелось бы делать операции как в макросе: прочитал 29й байт, обнулил его и закрыл файл.
Старый 08.08.2012, 22:10   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
System.IO.FileStream.WriteByte Method, если у вас 4.0 и выше.
Старый 09.08.2012, 06:26   #5  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
на ax 4.0 нет такого класса и using не является зарезервированным словом
Старый 09.08.2012, 07:37   #6  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
А воспользоваться winapi не хотите?
http://develab.narod.ru/api/01.htm#2

C уважением, Дмитрий.
Старый 09.08.2012, 07:58   #7  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Цитата:
Сообщение от DmitryK Посмотреть сообщение
А воспользоваться winapi не хотите?
http://develab.narod.ru/api/01.htm#2

C уважением, Дмитрий.
Идея отличная. Помогите сделать обертку для OpenFile и WriteFile WinApi
Старый 09.08.2012, 08:15   #8  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
X++:
client static int _lOpen(str fileName, int readWrite)
{
 DLL _dll                       = new DLL("Kernel32.dll");
 DLLFunction  _iOpen    = new DLLFunction(_dll, "_lOpen");
;

 _lOpen.arg(ExtTypes::WString, ExtTypes:: DWORD);

 _lOpen.returns(ExtTypes:: DWORD);
 return _lOpen.call(fileName, readWrite);
}

client static int _lRead(int fHandle, Binary buff, int bytes)
{
 DLL _dll            = new DLL("Kernel32.dll");
 DLLFunction  _lRead = new DLLFunction(_dll, "_lRead");
 ;


 _lRead.arg(ExtTypes:: DWORD, ExtTypes::Pointer, ExtTypes:: DWORD);
 _lRead.returns(ExtTypes::Word);

 return _lRead.call(fHandle, buff, bytes);
}
Как то так. К сожалению, проверить сейчас не могу.

С уважением, Дмитрий.

Последний раз редактировалось DmitryK; 09.08.2012 в 08:26.
Старый 09.08.2012, 08:25   #9  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Цитата:
Сообщение от DmitryK Посмотреть сообщение
client static int _iOpen(str fileName, int readWrite)
{
DLL _dll = new DLL("Kernel32.dll");
DLLFunction _iOpen = new DLLFunction(_dll, "_iOpen");
;

_iOpen.arg(ExtTypes::WString, ExtTypes:WORD);

_iOpen.returns(ExtTypes:: DWORD);
return _iOpen.call(fileName, readWrite);
}

client static int _lRead(int fHandle, Binary buff, int bytes)
{
DLL _dll = new DLL("Kernel32.dll");
DLLFunction _lRead = new DLLFunction(_dll, "_lRead");
;


_lRead.arg(ExtTypes:WORD, ExtTypes::Pointer, ExtTypes:WORD);
_lRead.returns(ExtTypes::Word);

return _lRead.call(fHandle, buff, bytes);
}

Как то так. К сожалению, проверить сейчас не могу.

С уважением, Дмитрий.
не помогает
Старый 09.08.2012, 08:27   #10  
DmitryK is offline
DmitryK
Участник
 
179 / 76 (3) ++++
Регистрация: 22.12.2011
Что именно не помогает?

C уважением, Дмитрий
.
Старый 09.08.2012, 08:30   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
"Axapta не работает" (с) пользователи

Цитата:
Сообщение от CHESER85 Посмотреть сообщение
и using не является зарезервированным словом
А еще пространства имен не поддерживаются, и что?..
За это сообщение автора поблагодарили: SRF (1).
Старый 09.08.2012, 09:14   #12  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Короче добился я своей цели, правда огромными усилиями. Использовал функции, написанные в проектах Andy_D и Yegor (DBF без ODBC).
И самое главное - это работает! и работает быстро.


#winapi
#DEFINE.FILE_SHARE_READ(0x00000001)
#DEFINE.FILE_SHARE_WRITE(0x00000002)
#DEFINE.FILE_SHARE(#FILE_SHARE_READ | #FILE_SHARE_WRITE)
#define.FILE_FLAG_RANDOM_ACCESS(0x10000000)
#define.FILE_BEGIN (0)



protected void DisableIndex(FileName fileName)
{

int hFile;
binary Value = new Binary(1);

int createFile()
{
DLL _winApiDLL = new DLL('KERNEL32');
DLLFunction _createFile = new DLLFunction(_winApiDLL, 'CreateFileA');
;
_createFile.returns(ExtTypes:Word);
_createFile.arg(ExtTypes::String); // lpFileName
_createFile.arg(ExtTypes:Word); // dwDesiredAccess
_createFile.arg(ExtTypes:Word); // dwShareMode
_createFile.arg(ExtTypes:Word); // lpSecurityAttributes = null
_createFile.arg(ExtTypes:Word); // dwCreationDisposition
_createFile.arg(ExtTypes:Word); // dwFlagsAndAttributes
_createFile.arg(ExtTypes:Word); // hTemplateFile = null

return _createFile.call(fileName, #GENERIC_WRITE, #FILE_SHARE, 0, #OPEN_EXISTING, #FILE_FLAG_RANDOM_ACCESS, 0);
}

void writeFile(int hWnd, Binary Buffer, int size)
{
DLL _winApiDLL = new DLL('KERNEL32');
DLLFunction _writeFile = new DLLFunction(_winApiDLL, 'WriteFile');
int Result;
Binary RetValue = new Binary(4);
int Temp;

_writeFile.returns(ExtTypes:Word);
_writeFile.arg(ExtTypes:Word);
_writeFile.arg(ExtTypes::Pointer);
_writeFile.arg(ExtTypes:Word);
_writeFile.arg(ExtTypes::Pointer);
_writeFile.arg(ExtTypes:Word);


Temp = _writeFile.call(hWnd,Buffer,size,RetValue,0);
info(int2str(RetValue.dWord(0)));
if (Temp == 0)
{
throw error("Функция WriteFile вернула ошибку " + int2str(WinApi::getLastError()));
}

Result = RetValue.byte(0) + RetValue.byte(1)*256 + RetValue.byte(2)*256*256 + RetValue.byte(3)*256*256*256;
if (Result != size)
{
throw error("Функция WriteFile вызвала ошибку записи в файл");
}
}

int setFilePointer(int handle, int distancel, int moveMethod)
{
DLL _winApiDLL = new DLL('KERNEL32');
DLLFunction _setFilePointer = new DLLFunction(_winApiDLL, 'SetFilePointer');

_setFilePointer.returns(ExtTypes:WORD);
_setFilePointer.arg(ExtTypes:WORD, ExtTypes:WORD, ExtTypes:WORD, ExtTypes:WORD);

if (_setFilePointer.call(handle, distancel, 0 , moveMethod) == 0)
return WinApi::getLastError();
else
return 0;
}
;


hFile = createFile();
if (hFile != #INVALID_HANDLE_VALUE)
{
setFilePointer(hfile, 28, #FILE_BEGIN);
value.byte(0,0);
writeFile(hfile, value, 1);
Winapi::closeHandle(hFile);
}
}

Последний раз редактировалось CHESER85; 09.08.2012 в 09:28.
Старый 09.08.2012, 13:53   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Многобукаф
X++:
System.IO.FileStream    fileStream;
;
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
    fileStream = new System.IO.FileStream(@"C:\temp\test.bin", System.IO.FileMode::Open, System.IO.FileAccess::Write, System.IO.FileShare::Read);
    fileStream.Seek(28, System.IO.SeekOrigin::Begin);
    fileStream.WriteByte(System.Convert::ToByte(0xff));
    fileStream.Close();
    fileStream.Dispose();
}
catch (Exception::CLRError)
{
    throw error(AifUtil::getClrErrorMessage());
}
За это сообщение автора поблагодарили: GBH (1), someOne (3).
Старый 09.08.2012, 16:51   #14  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Многобукаф
X++:
System.IO.FileStream    fileStream;
;
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
    fileStream = new System.IO.FileStream(@"C:\temp\test.bin", System.IO.FileMode::Open, System.IO.FileAccess::Write, System.IO.FileShare::Read);
    fileStream.Seek(28, System.IO.SeekOrigin::Begin);
    fileStream.WriteByte(System.Convert::ToByte(0xff));
    fileStream.Close();
    fileStream.Dispose();
}
catch (Exception::CLRError)
{
    throw error(AifUtil::getClrErrorMessage());
}

к сожалению не работает в 4.0
Старый 09.08.2012, 17:07   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Уровень детализации, с которым вы описываете (не)работу того или иного примера кода, просто поражает
Старый 09.08.2012, 21:11   #16  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
ну не компилится код. аксапта говорит что не знает этих классов и енумов.
Старый 10.08.2012, 08:15   #17  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Ах, да, 4-ка не умеет работать напрямую с CLR-енумами, их нужно заменить в коде X++ на такие вот конструкции:
X++:
CLRInterop::parseClrEnum('System.IO.FileMode', 'Open')
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axforum blogs: Экспорт лицензии AX 4.0 и AX 2009 в файл Blog bot DAX Blogs 0 28.05.2012 16:11
SysMailer, отправка PDF, приходит пустой файл ena_ax DAX: Программирование 12 19.11.2010 10:56
Не корректно сохраняет запись в inventTable Starling DAX: Программирование 8 31.03.2008 15:30
Очень просто: создать новую запись в таблице Hobo DAX: Программирование 20 11.07.2006 13:02
Ошибка при импорте демоданных (Axapta 3.0 CIS SP1) KocDm DAX: Администрирование 2 11.08.2005 12:04

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:12.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.