Когда-то очень давно я уже
поднимал вопрос о работе с DDE в Аксапте. Если в 3.0 все работало на ура, то в 4.0 заставить нормально работать так и не получилось (подробностей за давностью лет уже не помню). Настала пора версии 2009.
Вроде в данной версии все должно работать. Однако цветочек каменный что-то пока не выходит, да и слово "счастье" из известных четырех букв тоже не складывается.
1. Имеется следующий простой джоб:
X++:
static void DDETest1(Args _args)
{
DDEClient DDEClient;
;
dDEClient = new DDEClient( 'excel', 'system' );
info(DDEClient.request('SysItems'));
}
В случае 2003 офиса в инфолог выводится нечто в непонятной кодировке. В 2007 и 2010 - все ок. В чем причина? Что надо подправить, чтобы и в 2003 все было нормально?
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);
}
Проверьте, пожалуйста, что у вас в Эксель выведется? Какая версия Аксапты/ОС/Эксель? Русский текст у меня попадает в непонятной кодировке, а английский обрезается до первого символа. От версий девятки вроде не зависит, проверял на разных. Версии ОС тоже разные. Excel 2007 и 2010. Что я делаю не так? Где и что надо подправить?