Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5776
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.03.18 12:45. Заголовок: Экспорт через oBrw:ExcelOle() - куда копать ?
Делаю экспорт в своей проге на МиниГуи через 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
[только новые]
|
|
|
| Администратор
|
Пост N: 3702
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.03.18 17:49. Заголовок: У transform есть 2 п..
У transform есть 2 параметра: value и picture/ Ошибка 1122 генерируется, если не задан picture, или не задан value или value не является простым типом: NLCD. В коде метода ExcelOle перед вызовом tranform в строке 4922 надо проверить, выполняются ли эти условия.
|
|
|
|
| постоянный участник
|
Пост N: 5779
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.03.18 18:15. Заголовок: Поставил трассировку..
Поставил трассировку в этом куске 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 Валиться программа на первой же записи ! Вот результат трассировки: 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 Как сделать в исходнике, чтобы не "валился" этот экспорт ?
|
|
|
|
| Администратор
|
Пост N: 3704
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.03.18 18:24. Заголовок: Andrey пишет: Как с..
Andrey пишет: цитата: | Как сделать в исходнике, чтобы не "валился" этот экспорт ? |
| Очевидно, что надо проверять udata на nil. Заодно не помешает проверка на массив, объект и прочие сложные типы.
|
|
|
|
| постоянный участник
|
Пост N: 5780
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.03.18 23:06. Заголовок: Полдня убил на то ка..
Полдня убил на то как воссоздать ошибку у себя на компе, добился наконец то. Думал Эксель виноват, ан нет, ошибка чисто в коде. Вот табличка демонстрирующая ошибку: Pasha пишет: цитата: | Очевидно, что надо проверять udata на nil. Заодно не помешает проверка на массив, объект и прочие сложные типы. |
| Я не думаю, что нужно проверять на массив и другие сложные типы. Иначе Tsbrowse не покажется на экране, а свалиться раньше времени. Подойдёт ли такая проверка: 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 Поставил в тестовый пример, погонял на 4 типа L,D,N,C - работает вроде.
|
|
|
|
| Администратор
|
Пост N: 3705
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.03.18 09:05. Заголовок: Andrey пишет: Подой..
Andrey пишет: цитата: | Подойдёт ли такая проверка: |
| Да. Тем более в других местах tsbrowse такая проверка есть.
|
|
|
|
| постоянный участник
|
Пост N: 1777
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.03.18 10:54. Заголовок: Andrey пишет uData :..
Andrey пишет цитата: | uData := If( uData == NIL, "", Transform( uData, ::aColumns[ nCol ]:cPicture ) ) |
| Будут те же грабли, при :cPicture == NIL, напиши Default uData := "" вместо своей вставки
|
|
|
|
| moderator
|
Пост N: 1252
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.03.18 11:37. Заголовок: Pasha пишет: надо п..
Pasha пишет: цитата: | надо проверять udata на nil. |
| Благодарю за наводку Я уже добавил такую проверку в h_tbrowse.prg для следующей сборки.
|
|
|
|
| постоянный участник
|
Пост N: 5781
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.18 17:36. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Я уже добавил такую проверку в h_tbrowse.prg для следующей сборки. |
| Спасибо !
|
|
|
|