Интересный эффент, Harbour случайно не требует Forward определений функций?
Заработало но при 1 условии, дело в том, что моя функция
Код
Function uOutExcel()
была объявлена где-то в хвосте программы, у меня их около 2х десятков. Я перенес ее в начало сразу за основной функцией и все заработало как надо. Вот как это объяснить не знаю.
Сергей Иваницкий пишет:
у меня там два инитлиста, так вот затыкается на первом же
Код
oAS:Cells(R,C):Select()
и ещё забавный факт функция View() тоже не работает просто игнорируется.
может хитрость какая есть?
Надо с отладчиком идти и на логи смотреть.
Думаю что скорее связано с тем что каие-то переменные надо по-другому определять
Цитата
Сергей Иваницкий пишет:
была объявлена где-то в хвосте программы, у меня их около 2х десятков. Я перенес ее в начало сразу за основной функцией и все заработало как надо. Вот как это объяснить не знаю.
переношу любые функции в любые части prg, создаю библиотеки из prg - не испытваю проблем.
В Вашем конкретном случае нужна полная задача и полный листинг, тогда могу помочь поискать ответ на ...так трудно ответить.
Вы отладчиком пользуетесь ?
можете четко указать на строку где сваливается ?
Проморгал сообщение Константина, да отладчиком пользуюсь, а вот на счет логов не не очень понимаю на что смотреть. вылетало на функции
Код
oAS:Rows(N+":"+N):Select()
а вот функция View() просто игнорируется ничего не происходит. хотя переданный массив не пустой.
Программа достаточно длинная, прикреплю следующим постом, кстати сегодня специально поместил мою функцию вывода в Excel в середину программы. Ошибка с select() повторилась,прошёл отладчиком но на строке
Код
oAS:Rows(N+":"+N):Select()
программа задумалась секунд на 10 и выпала в ошибку смотри пост #4, лог которой можно прочитать если нажать на ссылку, поискал лог БЭСТа и не нашёл.
Работает моя функция только когда стоит второй или третьей, если ставлю дальше выпадает ошибка.
Алгоритм программы такой сначала отбираются нужные шифры партнеров в массив, потом на основании его проходит проверка на предмет КЗ и когда она возникла, далее все записывается в 2 БД собственно поставщики которым мы задолжали и предыстория. вот и все, по F5 можно вывести отчет об этом в Excel, куда просто переписываются строчки из БД + шапка с подвалом.
Function uExcel()
uOutExcel()
Return
...
// строка 330
Function uOutExcel()
Local oApp,oWorkBook,oRange,oAS
Local N, I, R:=1, C
AltD()
TRY
oApp := CreateObject( "Excel.Application" ) //попытка создать объект Excel
CATCH
Alert("Excel не доступен!")
Return
END
AltD()
oWorkBook:=oApp:WorkBooks:Add()
oAS:=oWorkBook:Worksheets():Add()
oAS:Name:=OemToAnsi("Кредиторы")
oApp:visible:=.T.
C:=1
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi("Всего")
C:=2
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi("<0")
oAS:Cells(R+1,C):value:=C*100
R:=R+1
For I=1 To 20
R := R+1
C:=1
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi('Привет'+ Str(R,5,2))
C:=2
oAS:Cells(R,C):value:=R
oAS:Cells(R,C):Select()
Next
N:='2'
oAS:Rows(N+":"+N):Select()
oApp:ActiveWindow:FreezePanes := .T.
Return 2
Там где стоят точки заполнил описанием разных функций которые и вызывать то не собирался, надергал из разных своих программ, так вот когда до описания Function uOutExcel()
оказалось примерно 330 строк кода ошибка начала проявляться на строке oAS:Cells(R,C):Select(), а когда было 310 строк работало все нормально. Это что-то встроенный компилято мутит. ИМХО
Сергей Иваницкий пишет:
Это что-то встроенный компилято мутит. ИМХО
Компилятор попрошу не обижать
Между прочим ошибки которые выдаются - это ошибки которые нам возвращает сам Excel.
Копилятор полученный текст ошибки выводит в своем окне, потому и наблюдается
в сообщении расхождении в кодовой странице.
Чтобы его прочитать я его с экрана копирую, вставлю в текст в FAR и переключаю кодовую
страницу в редаrторе FAR.
Т.е. эту ошибку на выполнение дает Excel и то, что Excel глючит и в разных версиях
работает позразному с VBA-кодом это надо принимать как данность и искать другие пути решения.
Пишу Вам еще раз
У Вас не будет работать rows("7:7") - ЭТО ОШИБКА.
Надо писать rows(7)
Числовой параметр !!! А у Вас там какие-то кавычки внутри - нет конечно !
Цитата
Сергей Иваницкий пишет:
Работает моя функция только когда стоит второй или третьей, если ставлю дальше выпадает ошибка.
ПРишлите мне весь prg на почту когда функцию ставите третьей - уверен на 100% ошибка в Вашем коде.
Цитата
Сергей Иваницкий пишет:
оказалось примерно 330 строк кода ошибка начала проявляться на строке oAS:Cells(R,C):Select(),
Есть основание полагать, что у вас расходится исходник с откомпилированной версией и курсор дает ошибку на нормальной строке.
КОгда происходит ошибка системная и слетает БЭСТ создается лог файл а также есть лог на экране во время сбоя, который можно снять копией экрана.
Если ошибка из Excel - ее надо прочитать и будет понятно.
Пишу Вам еще раз
У Вас не будет работать rows("7:7") - ЭТО ОШИБКА.
Надо писать rows(7)
Числовой параметр !!! А у Вас там какие-то кавычки внутри - нет конечно !
Номер строки не причём - вот откомпилируйте эту программку.
Код
Function uExcel()
uOutExcel()
Return
Function uLastRaz()
Local R, R1, M1:=.F.
If Select("Main01")=0
// Главная книга
Netuse("Main01",LoadPath() + "Main.dbf")
M1 := .T.
Else
DBPush()
Main01->(SetScope())
EndIf
Main01->(OrdSetFocus("KT_SCHET"))
Main01->(SetScope("UPPER(KT_SCHET+KT_CODE)",Upper('511')))
Main01->(DbGoBottom())
Iif( Empty(Main01->DataOper),R := Date()-1,R := Main01->DataOper)
Main01->(SetScope("UPPER(KT_SCHET+KT_CODE)",Upper('512')))
Main01->(DbGoBottom())
Iif( Empty(Main01->DataOper),R1 := Date()-1,R1 := Main01->DataOper)
Iif(DtoS(R)<=DtoS(R1),R := R1,)
Main01->(SetScope())
Iif(M1,Main01->(DbCloseArea()),DBPop())
Return R
Function uOutExcel()
Local oApp,oWorkBook,oRange,oAS
Local N, I, R:=1, C
AltD()
TRY
oApp := CreateObject( "Excel.Application" ) //попытка создать объект Excel
CATCH
Alert("Excel не доступен!")
Return
END
AltD()
oWorkBook:=oApp:WorkBooks:Add()
oAS:=oWorkBook:Worksheets():Add()
oAS:Name:=OemToAnsi("Кредиторы")
oApp:visible:=.T.
R:=5
For I=1 To 20
R := R+1
C:=1
oAS:Cells(R,C):NumberFormat := "@"
oAS:Cells(R,C):value:=OemToAnsi('Привет'+ Str(R,5,2))
C:=2
oAS:Cells(R,C):value:=R*10
oAS:Cells(R,C):Select()
Next
oAS:Rows("7:7"):Select()
oApp:ActiveWindow:FreezePanes := .T.
Return 2
Если поменять местами Function uOutExcel() и Function uLastRaz() то все заработает,
или можно закомменитровать оператор в
Код
If Select("Main01")=0
на
If .T. //Select("Main01")=0
Function uLastRaz()
хотя эта функция даже не используется.
Попробуйте или это у меня только такой глюк.
Константин мы с вами говорим на разных языках.
я пишу вовсе не о том, что у меня там числовой или текстовый параметр, а про то, что не работает функция Excel Select()
Я хотел зафиксировать часть верхних строк для этого пишу
Код
Rows(6).Select
ActiveWindow.FreezePanes = True
Ну исправил я на числовой параметр, а толку нет.
если вы читали пост #19 то там еще встречается такая конструкция
Код
oAS:Cells(R,C):Select()
R и C числовые параметры результат тотже на функции Select() вылетает.
Как я понял это как-то связано с функцией Select() самого Harbour. так как я её использовал несколькими сторками ранее и либо я её не правильно использую либо глюк.
Сергей Иваницкий пишет:
функцией Select() самого Harbour
Да нет в харборе таких функций
Есть скрипт VBS.
А функции это продукт особенностей скрипта. Функции на самом деле не харбора а Excel.
И ошибки дает не харбор а Excel. Просто мелкомягкие не поддерживают толком в VBS
даже две соседние версии. И если на Вашем компе все заработает, не факт что это
будет работать в другом Excel также на другом компьютере - к этому Вы должны быть
морально готовы. Я в свое время этого уже очень даже наелся...
Excel все свои команды на самом деле переводит в функции, только в каждой версии
этого Excel бывает по разному.
Посмотрел у себя, например.
У меня Сells(r,c):SELECT() работают.
Но самое лучшее в экселе, самое универсальное всегда было применение RANGE.
Сергей сейчас нагрузка большая, очень оперативно не могу посмотреть Ваш , но обязательно проверю.
ну может не харбор, может ещё клиппер...
открываем файл news\develop\ng\weg.exe
и там написано:
Цитата
Синтаксис
SELECT([<алиас>]) --> номер рабочей области
...
SELECT() является функцией работы с базами данных, которая определяет
номер рабочей области по заданному алиасу. Возвращаемое число может
быть в диапазоне от 0 до 250. Если аргумент <алиас> не задан,
возвращается номер текущей (активной) рабочей области. Если значение
аргумента <алиас> задано, но такого алиаса не существует, SELECT()
возвращает ноль.
Так вот если я использую её раньше(по тексту программы), чем функцию Excel с таким же именем, то Excel на соответствующей строке вылетает, а если не использую или использую после(по тексту), то все описанные мной конструкции у меня работают с теми версиями Excel которые у меня есть это XP(2002), и 2007.
Попробовал и
А вы пробовали запустить то что написано в посте #19 как есть, напомню БЭСТ4+ арм товары.
Тут либо я не правильно что-то использую, либо глюк(особенность), и это надо просто в будущем учитывать и всё. Ну хоть у кого-нибудь такой эффект проявился? Или я один такой?
В смысле некогда, понимаю, спасибо за , не тороплю. И вообще всех с наступающим НОВЫМ ГОДОМ!
Сергей Иваницкий пишет:
ну может не харбор, может ещё клиппер...
открываем файл news\develop\ng\weg.exe
и там написано:
Цитата
Синтаксис
SELECT([<алиас>]) --> номер рабочей области
...
SELECT() является функцией работы с базами данных, которая определяет
номер рабочей области по заданному алиасу. Возвращаемое число может
быть в диапазоне от 0 до 250. Если аргумент <алиас> не задан,
возвращается номер текущей (активной) рабочей области. Если значение
аргумента <алиас> задано, но такого алиаса не существует, SELECT()
возвращает ноль.
Повеселили
Данная функция имеет отношение к работе с алиасом и никакого отношения к скрипту VBS не имеет. Другими словами "Это нога - у кого надо нога !!!..."
Сергей примите как данность - то, над чем Вы сейчас трудитесь не в харборе искать надо.
Другое дело надо Вам помочь найти путь решения. Пока ну очень занят - простите пожалуйста, но Ваш держу на контроле для себя лично.
Цитата
Сергей Иваницкий пишет:
XP(2002),
Вот это самая страшная версия Офиса.
Мы заметили что в ней даже штатные в БЭСТе отчеты по шаблонам ни к каим другим версиям не подходят. Честно говоря офис 2002 я клиента прошу сразу сносить.
Цитата
Сергей Иваницкий пишет:
oRange:=oAS:Range("8:8")
oRange:Select()
oApp:ActiveWindow:FreezePanes := .T.
результат тот-же.
Вы не правильно написали RANGE
Попробуйте например
oAs:Range("A8"):Select()
Сергей я уже давно понял что мне надо самому посидеть повозиться чтобы Вам помочь, пока время не выбрал. Простите что вот такие советы "поробуй то, попробуй это выдаю..."
Это пока все, что могу
Константин пишет
Данная функция имеет отношение к работе с алиасом и никакого отношения к скрипту VBS не имеет. Другими словами "Это нога - у кого надо нога !!!..."
Я прекрасно понимаю, что это к VBS отношения иметь не должно, однако проявляется именно так как я пишу. Ппоробую скомпилировать на компе где 2007 Office установлен.
Цитата
oRange:=oAS:Range("8:8")
у меня вполне себе отработал, мне ведь надо целую стоку выделить.
Цитата
Сергей я уже давно понял что мне надо самому посидеть повозиться чтобы Вам помочь, пока время не выбрал. Простите что вот такие советы "поробуй то, попробуй это выдаю..."
Это пока все, что могу