|
|
|
|
#1 |
|
Участник
|
Баг при удалении листа Excel
AX 4.0 SP2, класс comExcelDocument_ru, метод deleteSheet() - должен удалять лист Excel по его целочисленному номеру. Обнаружен баг: если лист был переименован (а при этом его номер сохраняется!), то удаление не работает (сообщений никаких не выдается, просто не удаляется).
|
|
|
|
|
#2 |
|
Moderator
|
Любопытно. А приведите, пожалуйста, код метода? А то у меня "трёшка", SP4 и такого метода в классе нет.
Вообще, что-то такое попадалось, что по возможности не рекомендуется работать с числовым индексом коллекции Worksheets из-за его нестабильности. Т.е. перебирать коллекцию в цикле по целочисленному индексу можно и гарантируется обход всех листов (в негарантируемом порядке!). А вот насчет прямых обращений - лучше использовать строковый индекc, т.е. имя листа на корешке. А где это видно? В редакторе Visual Basic в дереве листов? Так там отображается значение свойства CodeName, которое рождается вместе с листом и более не меняется - ни при переименовании листа на корешке, ни при перемещении корешка среди других корешков ( его можно поменять только вручную в окне свойств листа в строке "(Name)"). Кстати, как раз индекс в коллекции - это порядковый "номер" корешка, считая слева. И в конструкцию вида Sheets(2).Delete подставляется именно он. |
|
|
|
|
#3 |
|
Участник
|
Цитата:
X++: void deleteSheet(int _workSheet) { COM comWorkSheet; ; if (! m_comDocument) throw error(strFmt("@DIS6401", this.getApplicationName())); comWorkSheet = this.getWorkSheet(_workSheet); comWorkSheet.select(); comWorkSheet.delete(); } |
|
|
|
|
#4 |
|
Moderator
|
А запустите у себя следующий джоб. Как он отработает? Останется ли лист между листами SheetBeforeDeleted и SheetAfterDeleted?
X++: {
ComExcelDocument_RU doc = new ComExcelDocument_RU();
COM sheet;
;
doc.newFile();
doc.visible(true);
doc.insertSheet();
doc.insertSheet();
doc.insertSheet();
doc.insertSheet();
sheet = doc.getWorkSheet(4);
sheet.Select();
sheet.Name('SheetToDelete');
sheet = doc.getWorkSheet(3);
sheet.Select();
sheet.Name('SheetBeforeDeleted');
sheet = doc.getWorkSheet(5);
sheet.Select();
sheet.Name('SheetAfterDeleted');
sheet = doc.getWorkSheet(4);
sheet.Select();
sheet.delete();
} |
|
|
|
| За это сообщение автора поблагодарили: Zabr (1), lev (2). | |
|
|
#5 |
|
Участник
|
Цитата:
Лист1 - Лист5 - SheetBeforeDeleted - SheetAfterDeleted. То есть, 4-й лист удалился. Но непонятно, почему вместо 2-го остался 5-й: ведь мы его переименовали. |
|
|
|
|
#6 |
|
Axapta Retail User
|
Цитата:
Т.е. переименовывали лист с номером 5 с названием Лист2 Если метод переписать таким образом: X++: {
ComExcelDocument_RU doc = new ComExcelDocument_RU();
COM sheet;
;
doc.newFile();
doc.visible(true);
doc.insertSheet(0,1);
doc.insertSheet(0,2);
doc.insertSheet(0,3);
doc.insertSheet(0,4);
sheet = doc.getWorkSheet(4);
sheet.Select();
sheet.Name('SheetToDelete');
sheet = doc.getWorkSheet(3);
sheet.Select();
sheet.Name('SheetBeforeDeleted');
sheet = doc.getWorkSheet(5);
sheet.Select();
sheet.Name('SheetAfterDeleted');
sheet = doc.getWorkSheet(4);
sheet.Select();
sheet.delete();
}Лист1-Лист2-SheetBeforeDeleted-SheetAfterDeleted |
|
|