17.04.2008, 12:04 | #1 |
Участник
|
Ошибка COM-объекта
Добрый день,
У меня при формировании отчетов - выгрузке на excel через стандартный класс работы с excel в системе выдается ошибка. Можете предсказать в чем может быть ошибка ? Странно, что у нас работал этот отчет, а перестал работать без никаких модификаций. |
|
17.04.2008, 12:08 | #2 |
Участник
|
не помешал бы скриншот ошибки
|
|
17.04.2008, 12:20 | #3 |
MCTS
|
Excel 2007 поставили? )
|
|
17.04.2008, 12:34 | #4 |
Участник
|
Может быть просто стало больше данных, которые выводятся в отчет?
Не забывайте об ограничении в Excel-е (до версии 2007) 65535 строк. Или может быть в отчете используется формула типа "=A1+B1+C1+...+n1" - тут тоже может вылезти ошибка, если количество слагаемых достигло большой величины (точно не вспомню какой именно, кажется в районе 1024 символов). Такую ошибку я встречал - на малых объемах работает нормально, а потом начинает "валиться". |
|
17.04.2008, 13:20 | #5 |
Участник
|
Извините, закреплю сейчас.
|
|
17.04.2008, 13:20 | #6 |
Участник
|
У нас ошибка выдается и в Excel 2007, и в Excel 2003...
|
|
17.04.2008, 13:23 | #7 |
MCTS
|
В range в 2007 добавили параметров в функцию. Я так понимаю, у Вас два выхода:
1) удалить 2007; 2) дописать обертку Аксапты. Мы выбрали 1). Правда, у нас и вызов не из Аксапты был, но это дела не меняет. Последний раз редактировалось Eldar9x; 17.04.2008 в 13:26. |
|
17.04.2008, 13:25 | #8 |
MCTS
|
Если оба екселя стоят на компе то по-любому вызывается 2007, это вот тоже не смогли побороть, поэтому, сомневаюсь, что отчет выводится в 2003. Попробуйте удалить 2007 офис, и распечатайте заново, скорее всего все пройдет без проблем.
|
|
17.04.2008, 19:54 | #9 |
Участник
|
Нет, мы пробовали на другом компьютере на разных версиях Excel, так что проблема точно не в версии, тем более, у нас раньше и работал.
Самое интересно, я проставил точки остановки в коде для отслеживания, проставил в самом конце процедуры работы с Excel, на самой последней строке, все идет нормально, как только идет последняя строка, (это excel.invisible(false)), ошибка выдается. Пробовал вообще удалить эту строку, опять же такая ситуация, т.е все нормально идет до конца, потом выдается ошибка... |
|
18.04.2008, 10:31 | #10 |
Участник
|
Судя по всему, не удается найти нужный диапазон в Excel-e. Но эта ошибка должна вываливаться сразу при вставке значения в этот диапазон.
Надо пройти код по шагам и посмотреть в какие ячейки идет вставка. Наверняка что-то обнаружится. PS: а почему у вас написан метод invisible()? Обычно используется метод visible() |
|
18.04.2008, 11:47 | #11 |
Участник
|
Ну да, visible() - я ошибся.
А то что пройти код по шагам, я и сделал, результат описал выше. Код всегда нормально идет до конца, только после последнего шага ничего не происходит, кроме выдачи ошибки. |
|
18.04.2008, 11:57 | #12 |
Участник
|
Кстати странно что excel.visible(false) у вас в конце обработки стоит, по идее скрывают excel сразу после создания док-та (файла), а в конце обработки или делают видимым или просто сэйвят
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
18.04.2008, 12:22 | #13 |
Участник
|
Какое значение BookMark передается в Range? Этот диапазон физически существует в файле Excel?
Кстати, это случайно не терминальный режим? |
|
18.04.2008, 12:52 | #14 |
Участник
|
Вот код этой выгрузки
X++: static void CustCMRForm_ES(CustInvoiceJour CIJ, CurrencyCode _nCCode='EUR'){ str s; QueryRun queryRun; Query query; QueryBuildDataSource qbdsITrans; QueryBuildDataSource qbdsInventDim; QueryBuildRange qbr; CustInvoiceJour IJour; SalesTable SalesTable; CustTable Vendor,Customer; InventSerial ISerial; CustInvoiceTrans ITrans,ITrans1; InventTrans InventTrans; InventDim InventDim,InventDim1; RContractTable RCT; InventTable ITable; CurrencyCode CCode,nCCode=_nCCode; Address ADR; Amount sSum=0, sVAT=0,wN=0,wB=0,wNl=0,wBl=0; Qty sQty=0; counter i,p,start; counter RollCount=0,PalletCount=0, lRollCount=0,lPalletCount=0; RNumDateInWordConverter converter = RNumDateInWordConverter::construct('en-us'); boolean ExOut=false; #ExcelExport ComExcelDocument_RU excl=new ComExcelDocument_RU(); Str Amount2Text(real Amount, CurrencyCode Curr){ return converter.numeralsToCurrency(Amount,Curr); } Str Qty2Text(real Amount){ return strfmt('%1 kg %2 g',converter.numeralsToTxt( abs(Amount) - frac(abs(Amount))),int2str(decround(frac(abs(Amount)) * 100, 2))); } Str RC(int r,int c){ return ComExcelDocument_RU::numtonamecell(c,r);//strfmt('R%1C%1',r,c); } Str RC_(int r,int c){ return strfmt('R[%1]C[%1]',r,c); } ; converter.initCurrencyAndConnection(); excl.newFile(#ExcelTemplateDir+#ExCMR_ES); // -= ????????? ?????? =- excl.visible(false); IJour=CustInvoiceJour::findFromCustInvoiceTrans(CIJ.SalesId,CIJ.InvoiceId,CIJ.InvoiceDate,CIJ.numberSequenceGroup);// ???? CCode=IJour.CurrencyCode?IJour.CurrencyCode:CompanyInfo::find().CurrencyCode; SalesTable=SalesTable::find(CIJ.SalesId); // ????? Vendor=CustTable::find(SalesTable.JuridicalPerson_NV); // ????????? - ???? ??????????? ???? Customer=CustTable::find(SalesTable.CustAccount); // ?????? p=1; RCT=RContractTable::find(RContractPartnerType::Cust,IJour.RContractCode,IJour.RContractAccount); excl.insertValue('Contract',RCT.RContractNumber,p); // ??????? excl.insertValue('ContractDate',date2StrUsr(RCT.ContractDate),p); // ???? ???????? excl.insertValue('ContractValidityDate',date2StrUsr(RCT.ContractEndDate),p); // ???? ????????? ???????? excl.insertValue('NumberSpecification',SalesTable.ExtNo_Spec_REP,p); // ???????????? excl.insertValue('DateSpecification',date2StrUsr(SalesTable.createdDate),p); // ???? ?????????? excl.insertValue('CustomerAdressIndex',Customer.invoiceAddress().ZipCode,p); // ?????? ?????????? excl.insertValue('CustomerCountryAdress',Customer.invoiceAddress().Country,p); // ?????? ?????????? excl.insertValue('CustomerCityAdress',Customer.invoiceAddress().City,p); // ????? ?????????? excl.insertValue('CustomerStreetAdress',Customer.invoiceAddress().Street,p); // ????? ?????????? excl.insertValue('CustomerHouseAdress',strfmt('%1 %2 %3',Customer.invoiceAddress().Estate_RU, Customer.invoiceAddress().Building_RU, Customer.invoiceAddress().Flat_RU),p); // ??? ?????????? excl.insertValue('Customer',Customer.Name); // ?????????? excl.insertValue('DeliveryPlace',Global_REP::CustExtAdr(Customer,Customer.invoiceAddress()),p); // ????? ?????????? excl.insertValue('DateShipping',date2strusr(IJour.InvoiceDate)/*systemdateget()*/,p); // ???? ???????? excl.insertValue('NumberShipping',IJour.InvoiceId,p); // ????? ???????? excl.insertValue('Amount',Currency::curAmount2CurAmount(IJour.InvoiceAmount,CCode,nCCode),p); // ????? excl.insertValue('AmountStr',Amount2Text(Currency::curAmount2CurAmount(IJour.InvoiceAmount,CCode,nCCode),nCCode),p); // ????? ???????? excl.insertValue('NumberAutomobile',gReport_REP::VehicleNo(IJour));// ? ?????????? i=0; query = new Query(); qbdsiTrans = query.addDataSource(tableNum(CustInvoiceTrans)); qbdsInventDim = qbdsiTrans.addDataSource(tableNum(InventDim)); qbdsInventDim.relations(true); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,SalesId)); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,InvoiceId)); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,InvoiceDate)); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,numberSequenceGroup)); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,ItemId)); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,SalesUnit)); qbdsITrans.addSortField(fieldNum(CustInvoiceTrans,SalesPrice)); qbdsInventDim.addSortField(fieldnum(InventDim,InventSizeId)); qbdsITrans.orderMode(ordermode::GroupBy); qbdsInventDim.orderMode(ordermode::GroupBy); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,SalesId)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,InvoiceId)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,InvoiceDate)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,numberSequenceGroup)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,ItemId)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,SalesUnit)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,SalesPrice)); qbdsInventDim.addSelectionField(fieldnum(InventDim,InventSizeId)); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,Qty),SelectionField::Sum); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,lineAmount),SelectionField::Sum); qbdsITrans.addSelectionField(fieldNum(CustInvoiceTrans,lineAmountTax),SelectionField::Sum); qbdsITrans.addRange(fieldNum(CustInvoiceTrans,SalesId)).value(CIJ.SalesId); qbdsITrans.addRange(fieldNum(CustInvoiceTrans,InvoiceId)).value(CIJ.InvoiceId); qbdsITrans.addRange(fieldNum(CustInvoiceTrans,InvoiceDate)).value(queryvalue(CIJ.InvoiceDate)); qbdsITrans.addRange(fieldNum(CustInvoiceTrans,numberSequenceGroup)).value(CIJ.numberSequenceGroup); queryRun = new QueryRun(query); while (queryrun.next()) { ITrans=queryrun.get(tablenum(CustInvoiceTrans)); InventDim=queryrun.get(tablenum(inventdim)); // select * from ITrans where ITrans.SalesId==CIJ.SalesId && // ITrans.InvoiceId==CIJ.InvoiceId && // ITrans.InvoiceDate==CIJ.InvoiceDate && // ITrans.numberSequenceGroup==CIJ.numberSequenceGroup { wNl=0;wBl=0;lRollCount=0;lPalletCount=0;ITable=InventTable::find(ITrans.ItemId); while select * from ITrans1 where ITrans1.SalesId==ITrans.SalesId && ITrans1.InvoiceId==ITrans.InvoiceId && ITrans1.InvoiceDate==ITrans.InvoiceDate && ITrans1.numberSequenceGroup==ITrans.numberSequenceGroup && ITrans1.ItemId==ITrans.ItemId && ITrans1.SalesUnit==ITrans.SalesUnit && ITrans1.SalesPrice==ITrans.SalesPrice { while select sum(Qty) from inventTrans join inventdim1 group by inventserialid where inventtrans.inventDimId==inventdim1.inventDimId && inventtrans.StatusIssue==StatusIssue::Sold && inventtrans.InventTransId==iTrans1.InventTransId && inventtrans.ItemId==iTrans.ItemId && inventdim1.InventSizeId==inventdim.InventSizeId { RollCount++; lRollCount++; } while select sum(Qty) from inventTrans join inventdim1 group by wmspalletid where inventtrans.inventDimId==inventdim1.inventDimId && inventtrans.StatusIssue==StatusIssue::Sold && inventtrans.InventTransId==iTrans1.InventTransId && inventtrans.ItemId==iTrans.ItemId && inventdim1.InventSizeId==inventdim.InventSizeId { // wB=wB+WMSPallet::find(InventDim.wMSPalletId).GrossWeight_NV; // wBl=wBl+WMSPallet::find(InventDim.wMSPalletId).GrossWeight_NV; PalletCount++; lPalletCount++; } // while sum(qty) } // while ITrans1 wN=wN+ITrans.Qty; wNl=wNl+ITrans.Qty; wB=wB+ITrans.Qty*1.04;//WMSPallet::find(InventDim1.wMSPalletId).GrossWeight_NV; wBl=wBl+ITrans.Qty*1.04;//WMSPallet::find(InventDim1.wMSPalletId).GrossWeight_NV; //invoice start=32;p=2; excl.insertRow(start+i,p); excl.insertValue(RC(start+i,1),int2str(i+1),p); excl.insertValue(RC(start+i,3),strfmt('%1 ? %2 (BOPP coex)',ITable.ItemName,inventDim.InventSizeId),p); excl.insertValue(RC(start+i,17),ITrans.SalesUnit,p); excl.insertValue(RC(start+i,22),ITrans.Qty,p); excl.insertValue(RC(start+i,28),Currency::curAmount2CurAmount(ITrans.SalesPrice,CCode,nCCode),p); excl.insertValue(RC(start+i,33),Currency::curAmount2CurAmount(ITrans.LineAmount+ITrans.LineAmountTax,CCode,nCCode),p); //detail packing start=24;p=3; excl.insertRow(start+i,p); excl.insertValue(RC(start+i,1),int2str(i+1),p); excl.insertValue(RC(start+i,3),ITable.ItemGroupId,p); excl.insertValue(RC(start+i,7),'',p); // ???? ? ?. ?. - ?????? ????? ???????? - ?? ???????????? ??????? (??????? ??????) ?? ????????? excl.insertValue(RC(start+i,13),ITable.ThicknessId_NV,p); excl.insertValue(RC(start+i,17),inventDim.InventSizeId,p); excl.insertValue(RC(start+i,21),lRollCount,p); excl.insertValue(RC(start+i,25),lPalletCount,p); excl.insertValue(RC(start+i,29),ITrans.Qty,p); excl.insertValue(RC(start+i,34),wBl,p); //Form A // start=32;p=4; // excl.insertValue(RC(start+i,9),strfmt('%1 ? %2 (BOPP coex) - %3 %4',ITable.itemName,inventDim.InventSizeId,iTrans.Qty,iTrans.SalesUnit),p); // excl.insertValue(RC(start+i,24),'\"W3920\"',p); //Attent start=19;p=6; excl.insertRow(start+i,p); excl.insertValue(RC(start+i,1),int2str(i+1),p); excl.insertValue(RC(start+i,3),strfmt('%1 ? %2 (BOPP coex)',ITable.itemName,inventDim.InventSizeId),p); excl.insertValue(RC(start+i,19),ITrans.SalesUnit,p); excl.insertValue(RC(start+i,21),ITrans.Qty,p); i++; } excl.insertValue('Currency',nCCode,p); excl.insertValue('RollCount',RollCount,p); excl.insertValue('TotalPallet',PalletCount,p); excl.insertValue('WeightNetto',wN,p); excl.insertValue('WeightNettoStr',Qty2Text(wN),p); excl.insertValue('WeightBrutto',wB,p); excl.insertValue('TotalPackages','???? ??????!!!',1); // excl.insertValue('sQty',sQty); // excl.insertValue('sVAT_',sVAT); // excl.insertValue('sSum_',sSum); // excl.insertValue('sSum',Amount2Text(sSum,IJour.CurrencyCode)); // ????? ???????? // excl.insertValue('sVAT',Amount2Text(sVAT,IJour.CurrencyCode)); // ??? ???????? excl.visible(true); } |
|
21.04.2008, 11:46 | #15 |
Участник
|
А шаблон случайно не менялся?
Попробуйте в начале (после создания файла) временно поставить excel.visible(true), и посмотрите как идет вставка данных в ячейки (в те ли ячейки, что нужно, они попадают). |
|
21.04.2008, 13:03 | #16 |
Участник
|
Вот этот вариант может быть, правда я и начинаю поискать таким образом, спасибо за подсказку, результат сообщу
|
|