|
![]() |
#1 |
Moderator
|
а 8 пробовали?
|
|
![]() |
#2 |
Участник
|
Вот полностью код, думаю, что Class Declaration не интересует. Строка под названием "Серийные номера". Если описать ее как str - некоторые строки остаются пустыми, если как мемо, вылетает ошибка, указанная выше (Кстати AX 3.0, SP3, SQL 2005).
X++: void Exec(str Path,SnQueryTableTmp SnQ) { ; xlApp = new COM('Excel.Application'); xlApp.Visible(true); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); wks = wkss.Add(); wks = wkss.Item(1); //wks2 = wkss.Item(2); //wks3 = wkss.Item(3); wks.Name('Итог'); //wks2.Name('Суммы по дилерам'); //wks3.Name('Склад'); rng = wks.Range('A1'); //rng2= wks2.Range('A1'); //rng3= wks3.Range('A1'); //==================================Первая вкладка======================= rstAxa = new COM('ADODB.Recordset'); flds = rstAxa.Fields(); flds.Append('Дата закрытия' ,this.adoTypeToExcel('date')); flds.Append('Отгрузочная накладная' ,this.adoTypeToExcel('str')); flds.Append('Заказ' ,this.adoTypeToExcel('str')); flds.Append('Безналичная накладная' ,this.adoTypeToExcel('str')); flds.Append('Менеджер' ,this.adoTypeToExcel('str')); flds.Append('Код клиента' ,this.adoTypeToExcel('str')); flds.Append('Дата отгрузочной накладной' ,this.adoTypeToExcel('date')); flds.Append('Город' ,this.adoTypeToExcel('str')); flds.Append('Краткое наименование' ,this.adoTypeToExcel('str')); flds.Append('Номенклатура' ,this.adoTypeToExcel('str')); flds.Append('Код дет. в спецификации' ,this.adoTypeToExcel('str')); flds.Append('Название' ,this.adoTypeToExcel('str')); flds.Append('Склад' ,this.adoTypeToExcel('str')); flds.Append('Цена ед.' ,this.adoTypeToExcel('num')); flds.Append('Себестоимость' ,this.adoTypeToExcel('num')); flds.Append('Количество' ,this.adoTypeToExcel('num')); flds.Append('Сумма по позиции' ,this.adoTypeToExcel('num')); flds.Append('Прибыль' ,this.adoTypeToExcel('num')); flds.Append('Каталожный номер' ,this.adoTypeToExcel('str')); flds.Append('Серийные номера' ,this.adoTypeToExcel('memo')); flds.Append('REF' ,this.adoTypeToExcel('str')); flds.Append('Квота' ,this.adoTypeToExcel('str')); flds.Append('Конечный клиент' ,this.adoTypeToExcel('str')); flds.Append('Номер партии' ,this.adoTypeToExcel('str')); rstAxa.Open(); // SnQ.setTmpData(SnQ); while select SnQ { rstAxa.AddNew(); // fld = flds.Item('Каталожный номер'); fld.Value(SelloutMsTable.A_PartNumber); fld = flds.Item('Дата закрытия'); fld.Value(SnQ.DeliveryDate); fld = flds.Item('Отгрузочная накладная'); fld.Value(SnQ.PickingListId); fld = flds.Item('Заказ'); fld.Value(SnQ.SalesId); fld = flds.Item('Безналичная накладная'); fld.Value(SnQ.InvoiceIdElect); fld = flds.Item('Менеджер'); fld.Value(SnQ.SalesResponsible); fld = flds.Item('Код клиента'); fld.Value(SnQ.CustAccount); fld = flds.Item('Дата отгрузочной накладной'); fld.Value(SnQ.PickingListDate); fld = flds.Item('Город'); fld.Value(SnQ.City); fld = flds.Item('Краткое наименование'); fld.Value(SnQ.NameAlial); fld = flds.Item('Номенклатура'); fld.value(SnQ.ItemId); fld = flds.Item('Код дет. в спецификации'); fld.Value(SnQ.ChosenPartNumber); fld = flds.Item('Название'); fld.Value(SnQ.ItemName); fld = flds.Item('Склад'); fld.Value(SnQ.InventLocationId); fld = flds.Item('Цена ед.'); fld.Value(SnQ.A_SalesPrice); fld = flds.Item('Себестоимость'); fld.Value(SnQ.SalesCostPrice); fld = flds.Item('Количество'); fld.Value(SnQ.Qty); fld = flds.Item('Сумма по позиции'); fld.Value(SnQ.Amount); fld = flds.Item('Прибыль'); fld.Value(SnQ.SalesProfit); fld = flds.Item('Каталожный номер'); fld.Value(SnQ.A_PartNumber); fld = flds.Item('Серийные номера'); fld.Value(SnQ.findSerialNumbersFromWMS(SnQ)); fld = flds.Item('REF'); fld.Value(SnQ.REF); fld = flds.Item('Квота'); fld.value(SnQ.InventQuotationId); fld = flds.Item('Конечный клиент'); fld.Value(SnQ.EndPartnerCode); fld = flds.Item('Номер партии'); fld.Value(SnQ.InventBatchId); rstAxa.Update(); } iMax = flds.Count() - 1; for (i = 0; i <= iMax; i++) { fld = flds.Item(i); cell = rng.Offset(0,i); cell.Value2(fld.Name()); } cell = rng.Offset(1,0); cell.CopyFromRecordset(rstAxa); rstAxa.close(); actWin = xlApp.ActiveWindow(); // actWin.FreezePanes(true); } |
|
![]() |
#3 |
Moderator
|
Следующий код у меня нормально выводит 2400 символов в ячейку:
X++: static void Job148(Args _args) { COM rstAxa; COM flds, fld; COM xlApp; COM wbks, wbk; COM wkss, wks; COM rng; str strValue; int adoTypeToExcel(str _type) { switch (_type) { // используются значения констант перечисления DateTypeEnum из топика TypeProperty (ADO) // (см. справку по ADO в файле ADO210.CHM - можно поискать на своем компе) case 'num' : return 5; // adDouble case 'str' : return 8; // adBSTR case 'date': return 133; // adDBDate } return 8; } ; strValue = '1234567890123, 1234567890123, 1234567890123, 1234567890123, 1234567890123, 1234567890123, 1234567890123, 1234567890123, 1234567890123, 1234567890123, '; strValue += strValue; // 20 значений strValue += strValue; // 40 значений strValue += strValue; // 80 значений strValue += strValue; // 160 значений (2400 символов) rstAxa = new COM('ADODB.Recordset'); flds = rstAxa.Fields(); flds.Append('strValue', adoTypeToExcel('str' )); rstAxa.Open(); rstAxa.AddNew(); fld = flds.Item('strValue'); fld.Value(strValue); rstAxa.Update(); xlApp = new COM('Excel.Application'); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); wks = wkss.Item(1); rng = wks.Range('A1'); rng.CopyFromRecordset(rstAxa); rstAxa.Close(); xlApp.Visible(true); } |
|
![]() |
#4 |
Участник
|
X++: str findSerialNumbersFromWMS(SnQueryTableTmp _SnQ) { WMSRoute WMSRoute; SalesLine SalesLine; InventSerialNumbers InventSerialNumbers; ItemFreeTxt txt = ""; ; while select InventSerialNumbers exists join WMSRoute where (WMSRoute.WMSShippingId like InventSerialNumbers.DocId) && (WMSRoute.LineNum == InventSerialNumbers.DocLineNum) && (WMSRoute.ItemId == InventSerialNumbers.ItemId) exists join SalesLine where (SalesLine.RecId == WMSRoute.SalesLineRecId) && (SalesLine.ItemId == _SnQ.Itemid) && (SalesLine.SalesId == _SnQ.SalesId) { txt += ","+InventSerialNumbers.SerialId ;//+ " -> " + num2str(InventSerialNumbers.Qty,1,0,1,0) + "шт. "; } return txt; } |
|
![]() |
#5 |
Moderator
|
Хм... интересный какой эффект: если добавить еще пару полей (в моем джобе):
X++: flds.Append('strValue2', adoTypeToExcel('str' )); flds.Append('strValue3', adoTypeToExcel('str' )); ......... fld = flds.Item('strValue2'); fld.Value(strValue); fld = flds.Item('strValue3'); fld.Value(strValue); Дальше - больше: если оставить одно поле, но добавить пару записей, то тоже вылетает с ошибкой (пока не закомментируем строки, где 80 и 160 серийников). Получается, что чувствительно и к "горизонтальным" и к "вертикальным" добавлениям. НО в тоже время позволяется вывести в одно поле одной записи очень много символов (до ограничения Excel в 32 767 символов в одной ячейке). |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от Gustav
![]() Хм... интересный какой эффект: если добавить еще пару полей (в моем джобе):
X++: flds.Append('strValue2', adoTypeToExcel('str' )); flds.Append('strValue3', adoTypeToExcel('str' )); ......... fld = flds.Item('strValue2'); fld.Value(strValue); fld = flds.Item('strValue3'); fld.Value(strValue); Дальше - больше: если оставить одно поле, но добавить пару записей, то тоже вылетает с ошибкой (пока не закомментируем строки, где 80 и 160 серийников). Получается, что чувствительно и к "горизонтальным" и к "вертикальным" добавлениям. НО в тоже время позволяется вывести в одно поле одной записи очень много символов (до ограничения Excel в 32 767 символов в одной ячейке). ![]() |
|
![]() |
#7 |
Участник
|
Есть предположение попробовать Excel 2007. Буду копать.
|
|
Теги |
ado, excel, экспорт |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|