:: Не фоксом единым
Проблема с макросом Excel
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Есть некий многостраничный шаблон ексел, с которым мы работаем несколько лет
, выгребая данные из Оракл в Фокс, а оттуда в указанный шаблон ексел
С этим не было и нет проблем
Сторонняя фирма в своем продукте, который мы у них берем,
среди прочего заполняет и такой же шаблон тоже
Макрос ексела обращается напрямую к Оракл и все сам заполняет
Проблема с колонками типа суммы
Формат у них и в чистом шаблоне и в заполненном макросом стоит числовой,
выравнивание по значению
Тем не менее, после срабатывания макроса числовые колонки выглядят,
выравненными слева, как чар поля, а не числовые, авто сумма на них не работает, дает ошибку,
как если бы там было действительно чар поле
Разделитель разрядов запятая в формате. Пробовали разные настройки на этот разделитель, результат одинаково неверный
Если в Оракл Девелопер результат запроса из макрос положить в ексел, то там с колонками типа число все верно, те врет именно макрос

Вот этот макрос
Числовое поле , например, DMBTR
Прикрепил экстракт из большого файла только на колонку сумма
Автосумма дает 0
Sub ListMOVE()


'Onoaiiaea nayce n aacie
If ConnectTure = 0 Then
Call ConnectOracle
End If
'Eeno aey auaiaa aaiiuo
sListExcel = "Iinooieaiey"


'Ia?aaaaei Ia?aiao? Aaoa a aeiaaeuio? ia?aiaiio?
dDateBeg = Workbooks(sWorkBookRun).Worksheets("Aeaaiay").Range("C4")
dDateEnd = Workbooks(sWorkBookRun).Worksheets("Aeaaiay").Range("D4")

Workbooks(sWorkBook).Activate

StrSQL1 = "begin AST_REPORTFORGRINAT70.dDateRepE:=To_Date(" & ChrW(39) & dDateEnd & ChrW(39) & ",'dd.mm.yyyy'); end;"
objDatabase.ExecuteSQL (StrSQL1)

'Auai? cai?ina ia iieo?aiea aaiiuo. Oaaeeoa Oaaeeoa ast_reportsql70
StrSQL1 = "select * from ast_reportsql70 where id=8001"
Set OraDynaSet1 = objDatabase.DBCreateDynaset(StrSQL1, 0&)

'StrSQL = OraDynaSet1!sSql
StrSQL = "select BUKRS, SCAPTION, SERNR, TXT100, SACC, SRBP, STYPELIZ, BUDAT, BWASL, VBUND, DMBTR, SDEBET, SCREDIT, SGTXT, BLDAT, XBLNR, SGROS, SERNUN, SACCOB " & _
"from Table(AST_ReportExpat30Afi.GetAst_TransferOrder30(To_Date(" & ChrW(39) & dDateBeg & ChrW(39) & ",'dd.mm.yyyy'), To_Date(" & ChrW(39) & dDateEnd & ChrW(39) & ",'dd.mm.yyyy" & ChrW(39) & ")))"
Workbooks(sWorkBook).Worksheets(sListExcel).Activate

StrBeg01 = 5
'I?enoea y?aae
i = 0
sStrSheetBeg0 = "A" & Val(Str(StrBeg01 + i))
sStrSheetBeg4 = "B" & Val(Str(StrBeg01 + i))
sStrSheetBeg5 = "C" & Val(Str(StrBeg01 + i))
sStrSheetBeg1 = "E" & Val(Str(StrBeg01 + i))
sStrSheetBeg2 = "F" & Val(Str(StrBeg01 + i))
sStrSheetBeg3 = "D" & Val(Str(StrBeg01 + i))
sStrSheetBeg6 = "G" & Val(Str(StrBeg01 + i))

sStrSheetBeg7 = "J" & Val(Str(StrBeg01 + i))

sStrSheetBeg8 = "K" & Val(Str(StrBeg01 + i))
sStrSheetBeg9 = "L" & Val(Str(StrBeg01 + i))
sStrSheetBeg10 = "M" & Val(Str(StrBeg01 + i))

sStrSheetBeg11 = "N" & Val(Str(StrBeg01 + i))
sStrSheetBeg12 = "O" & Val(Str(StrBeg01 + i))
sStrSheetBeg13 = "P" & Val(Str(StrBeg01 + i))
sStrSheetBeg14 = "Q" & Val(Str(StrBeg01 + i))
sStrSheetBeg15 = "R" & Val(Str(StrBeg01 + i))
sStrSheetBeg16 = "S" & Val(Str(StrBeg01 + i))

sStrSheetBeg28 = "H" & Val(Str(StrBeg01 + i))
sStrSheetBeg29 = "I" & Val(Str(StrBeg01 + i))

While Not IsEmpty(Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg3).Value)

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg0).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg1).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg2).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg3).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg4).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg5).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg6).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg7).Value = ""

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg8).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg9).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg10).Value = ""

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg11).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg12).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg13).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg14).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg15).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg16).Value = ""

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg28).Value = ""
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg29).Value = ""

sStrSheetBeg0 = "A" & Val(Str(StrBeg01 + i))
sStrSheetBeg4 = "B" & Val(Str(StrBeg01 + i))
sStrSheetBeg5 = "C" & Val(Str(StrBeg01 + i))
sStrSheetBeg1 = "E" & Val(Str(StrBeg01 + i))
sStrSheetBeg2 = "F" & Val(Str(StrBeg01 + i))
sStrSheetBeg3 = "D" & Val(Str(StrBeg01 + i))
sStrSheetBeg6 = "G" & Val(Str(StrBeg01 + i))
sStrSheetBeg7 = "J" & Val(Str(StrBeg01 + i))

sStrSheetBeg8 = "K" & Val(Str(StrBeg01 + i))
sStrSheetBeg9 = "L" & Val(Str(StrBeg01 + i))
sStrSheetBeg10 = "M" & Val(Str(StrBeg01 + i))
sStrSheetBeg11 = "N" & Val(Str(StrBeg01 + i))
sStrSheetBeg12 = "O" & Val(Str(StrBeg01 + i))
sStrSheetBeg13 = "P" & Val(Str(StrBeg01 + i))
sStrSheetBeg14 = "Q" & Val(Str(StrBeg01 + i))
sStrSheetBeg15 = "R" & Val(Str(StrBeg01 + i))
sStrSheetBeg16 = "S" & Val(Str(StrBeg01 + i))

sStrSheetBeg28 = "H" & Val(Str(StrBeg01 + i))
sStrSheetBeg29 = "I" & Val(Str(StrBeg01 + i))

i = i + 1
Wend

i = 0
sStrSheetBegA = "A" & Val(Str(StrBeg01 + i))
sStrSheetBegB = "B" & Val(Str(StrBeg01 + i))
sStrSheetBegC = "C" & Val(Str(StrBeg01 + i))
sStrSheetBegD = "D" & Val(Str(StrBeg01 + i))
sStrSheetBegE = "E" & Val(Str(StrBeg01 + i))
sStrSheetBegF = "F" & Val(Str(StrBeg01 + i))
sStrSheetBegG = "G" & Val(Str(StrBeg01 + i))
sStrSheetBegH = "H" & Val(Str(StrBeg01 + i))
sStrSheetBegI = "I" & Val(Str(StrBeg01 + i))
sStrSheetBegJ = "J" & Val(Str(StrBeg01 + i))
sStrSheetBegK = "K" & Val(Str(StrBeg01 + i))
sStrSheetBegL = "L" & Val(Str(StrBeg01 + i))
sStrSheetBegM = "M" & Val(Str(StrBeg01 + i))
sStrSheetBegN = "N" & Val(Str(StrBeg01 + i))
sStrSheetBegO = "O" & Val(Str(StrBeg01 + i))
sStrSheetBegP = "P" & Val(Str(StrBeg01 + i))
sStrSheetBegQ = "Q" & Val(Str(StrBeg01 + i))
sStrSheetBegR = "R" & Val(Str(StrBeg01 + i))
sStrSheetBegS = "S" & Val(Str(StrBeg01 + i))

'Auiieiaiea Cai?in ia iieo?aiea aaiiuo
'Workbooks(sWorkBook).Worksheets(sListExcel).Range("C" & Val(Str(StrBeg01 + i))).Value = StrSQL
Set OraDynaSet = objDatabase.DBCreateDynaset(StrSQL, 0&)
If OraDynaSet.RecordCount > 0 Then

OraDynaSet.MoveFirst
While OraDynaSet.EOF = 0
'Eoaa e ?oi auae?aai ec cai?ina

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegA).Value = OraDynaSet!BUKRS
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegB).Value = OraDynaSet!SCAPTION
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegC).Value = OraDynaSet!SERNR
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegD).Value = OraDynaSet!TXT100
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegE).Value = OraDynaSet!SACC
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegF).Value = OraDynaSet!SRBP
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegG).Value = OraDynaSet!STYPELIZ
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegH).Value = OraDynaSet!BUDAT
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegI).Value = OraDynaSet!BWASL

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegJ).Value = OraDynaSet!VBUND

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegK).Value = OraDynaSet!DMBTR
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegL).Value = OraDynaSet!SDEBET
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegM).Value = OraDynaSet!SCREDIT

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegN).Value = OraDynaSet!SGTXT
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegO).Value = OraDynaSet!BLDAT
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegP).Value = OraDynaSet!XBLNR

Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegQ).Value = OraDynaSet!SGROS
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegR).Value = OraDynaSet!SERNUN
Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegS).Value = OraDynaSet!SACCOB

i = i + 1
sStrSheetBegA = "A" & Val(Str(StrBeg01 + i))
sStrSheetBegB = "B" & Val(Str(StrBeg01 + i))
sStrSheetBegC = "C" & Val(Str(StrBeg01 + i))
sStrSheetBegD = "D" & Val(Str(StrBeg01 + i))
sStrSheetBegE = "E" & Val(Str(StrBeg01 + i))
sStrSheetBegF = "F" & Val(Str(StrBeg01 + i))
sStrSheetBegG = "G" & Val(Str(StrBeg01 + i))

sStrSheetBegH = "H" & Val(Str(StrBeg01 + i))
sStrSheetBegI = "I" & Val(Str(StrBeg01 + i))

sStrSheetBegJ = "J" & Val(Str(StrBeg01 + i))
sStrSheetBegK = "K" & Val(Str(StrBeg01 + i))
sStrSheetBegL = "L" & Val(Str(StrBeg01 + i))
sStrSheetBegM = "M" & Val(Str(StrBeg01 + i))
sStrSheetBegN = "N" & Val(Str(StrBeg01 + i))
sStrSheetBegO = "O" & Val(Str(StrBeg01 + i))
sStrSheetBegP = "P" & Val(Str(StrBeg01 + i))
sStrSheetBegQ = "Q" & Val(Str(StrBeg01 + i))
sStrSheetBegR = "R" & Val(Str(StrBeg01 + i))
sStrSheetBegS = "S" & Val(Str(StrBeg01 + i))
OraDynaSet.dbmovenext
Wend
End If

End Sub



Исправлено 2 раз(а). Последнее : boba, 12.09.17 16:20
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
boba
Формат у них и в чистом шаблоне и в заполненном макросом стоит числовой,
выравнивание по значению
Тем не менее, после срабатывания макроса числовые колонки выглядят,
выравненными слева, как чар поля, а не числовые, авто сумма на них не работает, дает ошибку,
как если бы там было действительно чар поле

Мне помогало выставлять формат в коде (макросе), типа

.Range('A1:A10').NumberFormat = "0.00"


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Колонки точно числовые? Какой тип поля/свойства DMBTR в объекте, table которых возвращает функция AST_ReportExpat30Afi.GetAst_TransferOrder30?
Не работал с OO4O, но начал бы отладку с того, что посмотрел все свойства соответствующего объекта OraField.

Т.е. Под отладчиком, или просто в какую свободную область листа кодом сбросил то что даёт

OraDynaSet.Fields("DMBTR").OraIDataType
OraDynaSet.Fields("DMBTR").Type
Ну и собственно OraDynaSet.Fields("DMBTR").Value - это полный вариант вместо "сокращения" OraDynaSet!DMBTR

Если константы подтвердят что в возвращаемом поле таки число а не строка (свойство Value это Variant - т.е. "значение любого типа", напрямую, как я понимаю, его тип не определить), ну тогда уж думать про обходные пути для запихивания таки "числового значения"...

P.S. мануал тут - расшифровку констант там можно смотреть - проще чем в файлах установки oo4o...

P.P.S. Все эти sStrSheetBegA = "A" & Val(Str(StrBeg01 + i)) наводят на очень грустные мысли по поводу компетентности авторов кода...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Паша. Формат и так есть, вы ексел выбран тип -числа и именно такой формат.
Меняли еще раз и руками и кодом, дохлый номер.
И выравнивание стоит по значению, если бы был тип число,
выравнивание будет справа, а не слева.
В прикрепленном ексел все это видно.
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Игорь, спасибо, я завтра попробую,
хотя у меня и нет файла с указанным
макросом.
Где-то в 98 -99 ом я таскал в фокс
примерно таким кодом ( Оракл обжект фор оле)
запросы , все было хорошо.
Никаких замен типов не было.
В самом Оракл тип поля точно numeric
Это проверил в Oracle deleloper и в таблице,
и в запросе.
Но чем черт не шутит, может что-то "улучшили"
Самое загадочное , вот что.
Автор кода, ( он из той конторы уволился) использовал
аналогичный подход для других видов шаблонов, в разы более сложных,
и там все работает на ура.
Занимаются сейчас этим девочки, преемники автора,
они только на голове не стояли с бубном чтобы все заработало.
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Игорь, спасибо
Вариант через .fileds('fieldname').value
в случае указания имени поля для суммы лег верно в
Excel
Type, datatype оба дали ньюмерический тип для этого имени поля,
так что не совсем понятно, как присвоение без value
ухитрилось дать в ексел чар тип.
Ну и черт с ним, работает и все.
Посмотрел свои древние примеры на
Oracle objects for ole
Везде писал value, а не как в примере в головной теме
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В фоксе, насколько я помню, не работает синтаксис с "дефолтными свойствами" - там только явно ручками и можно писать было. А почему VBA чудить стал для этого самого синтаксиса с ! - понятия не имею. Ещё по идее есть вариант с полу-дефолтным обращением OraDynaSet!DMBTR.value - может и он бы решил проблему...

P.S. Вообще-то в OraDynaSet-е есть метод GetRows, который сразу массив вернёт с данными - и если аккуратно всё закодить (и оно не станет с типами чудить), то вместо этих ужасных километровых циклов с перечислением полей, и абсолютно безумным обращением по "именам ячеек" будет аккуратное присвоение этого массива нужному Range на листе. При том как раз в фоксе с этим явно будет больше проблем чем в VBA - т.к. там параметр-массив фигурирует
При работе через OLEDB или ODBC тоже не потребуется "поячеечно и позаписно" распихивать результат на страницу.
Впрочем, может им как раз за количество строк кода платят, потому даже тривиальное "обнуление" диапазона настолько через ж*пу сделано, что у меня аж кровавые слёзы текут


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Игорь,
я с этим копаться особо не собираюсь.
Есть внешняя команда этого проекта.
Помогли им , и уже хорошо.
Мне вряд ли это потребуется,
пишем через обычный одбс из фокса.
Если что нужно в ексел, кидаем массивы.
Давно на это классы написаны,
через Oracle objects for ole
ничего не пишем. Не за чем.
Сейчас таки воспроизвел тест кода на фоксе.
Так и там чар поле суммы вернулось.
У меня, конечно, склероз,
но не до такой степени.
Посмотрел свои коды 98-99 года,
нигде не делал никакой такой конвертации типов.
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
boba
Автор

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Все таки покопался.
Маразм какой-то
Сплошь и рядом при выгребке поля типа число из Оракл
свойства dynaset
Type=10-это чар OralDataType=2 это число
В доке написана туманная фраза ,
про внутреннюю конвертацию типов в целях
соответствия данных на Оракл и VisualBasic
Бесит, что это сплошь и рядом не в 100% случаев.
Для кондовенькой таблицы смог получить верное соответствие.
Получается, нужно учитывать на стороне клиента
эти свойства и перегонять из типа в тип, если они не сошлись по смыслу.
Слава богу самому ничего таким кодом писать не нужно.
Ratings: 0 negative/0 positive
Re: Проблема с макросом Excel
прошелмимо

Сообщений: 784
Дата регистрации: 21.02.2012
select BUKRS, SCAPTION

Вы фоксом в таблицы сапа лазаете?

Жесть какая.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 10 (Гостей: 10)

© 2000-2024 Fox Club 
Яндекс.Метрика