01.06.2011, 12:46 | #1 |
Axapta
|
DDE в Ax2009
Когда-то очень давно я уже поднимал вопрос о работе с DDE в Аксапте. Если в 3.0 все работало на ура, то в 4.0 заставить нормально работать так и не получилось (подробностей за давностью лет уже не помню). Настала пора версии 2009.
Вроде в данной версии все должно работать. Однако цветочек каменный что-то пока не выходит, да и слово "счастье" из известных четырех букв тоже не складывается. 1. Имеется следующий простой джоб: X++: static void DDETest1(Args _args) { DDEClient DDEClient; ; dDEClient = new DDEClient( 'excel', 'system' ); info(DDEClient.request('SysItems')); } 2. В случае, если первый тест пройден успешно, создайте в С:\Temp шаблон DDETest.xlt и запустите следующий вырванный из контекста джоб (в 3.0 работает без проблем): X++: static void DDETest2(Args _args) { ComExcelDocument_RU excellDocument = new ComExcelDocument_RU(); DDEClient dDEClientPar; str sDocName; Array arDDEClient; COM comDoc; void addDDEClient( str _chanelName ) { DDEClient dDEClient; str sWorkSheetName; int sheetIdx; COM workSheets; if( StrScan( _chanelName, sDocName, 1, strlen( _chanelName ) ) ) { dDEClient = new DDEClient('excel', _chanelName ); if ( !dDEClient.isValid()) { return; } workSheets = comDoc.worksheets(); for( sheetIdx = 1; sheetIdx <= workSheets.count(); sheetIdx++ ) { sWorkSheetName = excellDocument.getWorkSheetName( sheetIdx ); sWorkSheetName = substr( sWorkSheetName, 2, strlen( sWorkSheetName ) - 2 ); if( StrScan( _chanelName, sWorkSheetName, 1, strlen( _chanelName ) ) ) { arDDEClient.value( sheetIdx, dDEClient ); break; } } } } DDEClient getDDEClient( int _workSheet = 1 ) { DDEClient dDEClientExcelSystem; str channelList; str channelName; str 1 tab = num2char(9); int foundTab; int sheetIdx; int resStrScan; int resStrLen; ; if( arDDEClient.lastIndex() == 0 ) { dDEClientExcelSystem = new DDEClient( 'excel', 'system' ); if ( !dDEClientExcelSystem.isValid() ) { throw error( "Excel не запущен!" ); } comDoc = excellDocument.getComDocument(); sDocName = comDoc.name(); channelList = dDEClientExcelSystem.request('Topics'); foundTab = strScan(channelList, tab, 1, strLen(channelList)); while (foundTab) { addDDEClient( subStr(channelList, 1, foundTab - 1) ); channelList = strDel(channelList, 1, foundTab); foundTab = strScan(channelList, tab, 1, strLen(channelList)); } if (strLen(channelList) > 0) { addDDEClient( channelList ); } } return arDDEClient.value( _workSheet ); } ; arDDEClient = new Array( Types::Class ); excellDocument.newFile('C:\\Temp\\'+ 'DDETest.xlt', false); dDEClientPar = getDDEClient(1); dDEClientPar.poke('R1C1', 'Тест' ); dDEClientPar.poke('R2C1', 'Test'); excellDocument.visible(true); } |
|