Форум » Для флейма » Экспорт через oBrw:ExcelOle() - куда копать ? » Ответить

Экспорт через oBrw:ExcelOle() - куда копать ?

Andrey: Делаю экспорт в своей проге на МиниГуи через oBrw:ExcelOle() Экспорт по принципу как в примере, проект вот тут - https://cloud.mail.ru/public/JNeH/xGmMBvmVD Вырезал из большого проекта, в отдельную программу кусок где идёт экспорт через ОЛЮ. У меня Excel2003, ОЛЯ работает нормально. У заказчика Excel2007, валиться выгрузка через ОЛЮ. Вот такая ошибка: Error BASE/1122 Неверный аргумент: TRANSFORM Called from TRANSFORM(0) Called from TSBROWSE:EXCELOLE(4922) in module: h_tbrowse.prg Called from EXCELXLS_A14(605) in module: Source\tsb_prnA14.prg Called from (b)FORM_TSB_A14(140) in module: Source\tsb_prnA14.prg Called from _DOCONTROLEVENTPROCEDURE(1806) in module: h_windows.prg Called from EVENTS(1733) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1460) in module: h_windows.prg Called from FORM_TSB_A14(158) in module: Source\tsb_prnA14.prg Поставил в виртуалке как у заказчика WinXP и Офис2007. В виртуалке ОЛЯ работает на таком же примере нормально. Ну и куда копать дальше ?

Ответов - 8

Pasha: У transform есть 2 параметра: value и picture/ Ошибка 1122 генерируется, если не задан picture, или не задан value или value не является простым типом: NLCD. В коде метода ExcelOle перед вызовом tranform в строке 4922 надо проверить, выполняются ли эти условия.

Andrey: Поставил трассировку в этом куске [pre2] uData := Eval( ::aColumns[ nCol ]:bData ) // строка 4911 ? "uData := ", uData, " nCol=", nCol If ValType( uData ) == "C" .and. At( CRLF, uData ) > 0 uData := StrTran( uData, CRLF, "&&" ) If AScan( aRepl, nCol ) == 0 AAdd( aRepl, nCol ) EndIf EndIf ? ValType( uData ), uData, ::aColumns[ nCol ]:cPicture If ::aColumns[ nCol ]:cPicture != Nil uData := Transform( uData, ::aColumns[ nCol ]:cPicture ) EndIf[/pre2] Валиться программа на первой же записи ! Вот результат трассировки: [pre2]uData := 1 nCol= 1 N 1 999 999 uData := Бакинский Пер. (ул.) nCol= 2 C Бакинский Пер. (ул.) xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx uData := 20 nCol= 3 C 20 xxxxxxx uData := 0 nCol= 4 N 0 99999999 uData := 3 nCol= 5 N 3 99999999 uData := 32 nCol= 6 C 32 xxxxxxxxx uData := 9617311164 nCol= 7 C 9617311164 999999999999 uData := 1 nCol= 8 N 1 999999 uData := -1320.00 nCol= 9 N -1320.00 9999999.99 uData := . . nCol= 10 D . . xxxxxxxxxxx uData := NIL nCol= 11 U NIL 9999999.99 [/pre2] Как сделать в исходнике, чтобы не "валился" этот экспорт ?

Pasha: Andrey пишет: Как сделать в исходнике, чтобы не "валился" этот экспорт ? Очевидно, что надо проверять udata на nil. Заодно не помешает проверка на массив, объект и прочие сложные типы.


Andrey: Полдня убил на то как воссоздать ошибку у себя на компе, добился наконец то. Думал Эксель виноват, ан нет, ошибка чисто в коде. Вот табличка демонстрирующая ошибку: Pasha пишет: Очевидно, что надо проверять udata на nil. Заодно не помешает проверка на массив, объект и прочие сложные типы. Я не думаю, что нужно проверять на массив и другие сложные типы. Иначе Tsbrowse не покажется на экране, а свалиться раньше времени. Подойдёт ли такая проверка: [pre2] For nCol := 1 To Len( ::aColumns ) If aColSel != Nil .and. AScan( aColSel, nCol ) == 0 Loop EndIf uData := Eval( ::aColumns[ nCol ]:bData ) If ValType( uData ) == "C" .and. At( CRLF, uData ) > 0 uData := StrTran( uData, CRLF, "&&" ) If AScan( aRepl, nCol ) == 0 AAdd( aRepl, nCol ) EndIf EndIf uData := If( uData == NIL, "", Transform( uData, ::aColumns[ nCol ]:cPicture ) ) If ::aColumns[ nCol ]:cPicture != Nil // TSBROWSE:EXCELOLE(4922) in module: h_tbrowse.prg uData := Transform( uData, ::aColumns[ nCol ]:cPicture ) EndIf[/pre2] Поставил в тестовый пример, погонял на 4 типа L,D,N,C - работает вроде.

Pasha: Andrey пишет: Подойдёт ли такая проверка: Да. Тем более в других местах tsbrowse такая проверка есть.

SergKis: Andrey пишет uData := If( uData == NIL, "", Transform( uData, ::aColumns[ nCol ]:cPicture ) ) Будут те же грабли, при :cPicture == NIL, напиши Default uData := "" вместо своей вставки

gfilatov2002: Pasha пишет: надо проверять udata на nil. Благодарю за наводку Я уже добавил такую проверку в h_tbrowse.prg для следующей сборки.

Andrey: gfilatov2002 пишет: Я уже добавил такую проверку в h_tbrowse.prg для следующей сборки. Спасибо !



полная версия страницы