|
12.03.2009, 11:41 | #1 |
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); } |
|
12.03.2009, 11:46 | #2 |
Участник
|
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; } |
|
12.03.2009, 12:11 | #3 |
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 символов в одной ячейке). |
|
12.03.2009, 12:17 | #4 |
Участник
|
Цитата:
Сообщение от 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 символов в одной ячейке). |
|
12.03.2009, 12:25 | #5 |
Участник
|
Есть предположение попробовать Excel 2007. Буду копать.
|
|
12.03.2009, 13:26 | #6 |
Moderator
|
911 символов
Как выясняется, CopyFromRecordset загибается при длине строки более 911 символов (просто какой-то телефонный "привет" от службы спасения! )
О проблеме знают в мире: http://www.google.ru/search?hl=ru&q=...1&lr=&aq=f&oq= но пока ничего утешительного я не нашёл. |
|
12.03.2009, 13:33 | #7 |
Участник
|
Цитата:
Сообщение от Gustav
Как выясняется, CopyFromRecordset загибается при длине строки более 911 символов (просто какой-то телефонный "привет" от службы спасения! )
О проблеме знают в мире: http://www.google.ru/search?hl=ru&q=...1&lr=&aq=f&oq= но пока ничего утешительного я не нашёл. Using ADO (ActiveX 2.8 Object Lib) with Excel 2003, I extract data from a worksheet and copy it to another worksheet in the same workbook. In Office 2007 everything is fine, but in Office XP and Office 2003 the CopyFromRecordset fails if a field has more than 911 bytes. Т.е. в 2007 офисе эта проблема исправлена... |
|