Непонятная ошибка при выполнении макроса "Недопустимо...

Автор ForumOOo (бот), 27 марта 2013, 08:33

0 Пользователи и 1 гость просматривают эту тему.

ForumOOo (бот)

Компонент: Base
Версия продукта: 3.4.x
Сборка: Версия 4.0.1.2 (ID сборки: 84102822e3d61eb989ddd325abf1ac077904985)
ОС: Windows XP Prof версия 2002 SP 3

Непонятная ошибка при выполнении макроса "Недопустимое значение или тип данных. Переполнение". Помогите пожалуйста
разобраться в чем причина и как ее исправить.

--
Подпись: andreya81
Эл. почта: privolandreya81@mail.ru

JohnSUN

Добро пожаловать на форум!
Скорее всего какая-то из функций возвращает "длинное целое" (Long) значение, а оно присваивается в переменную, которая описана как Integer.
Бывают и другие причины, но эта - самая частая...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

andreya81

Цитата: JohnSUN от 27 марта 2013, 12:00
Добро пожаловать на форум!
Скорее всего какая-то из функций возвращает "длинное целое" (Long) значение, а оно присваивается в переменную, которая описана как Integer.
Бывают и другие причины, но эта - самая частая...
Спасибо за ответ. Подскажите пожалуйста, а как исправить эту ошибку

JohnSUN

#3
Ну, поставить в редакторе точку останова на первой строке процедуры, которая выдает ошибку (F9 или кликнуть мышкой на поле слева от строки - появится красная точка). Начать выполнение макроса. Переключиться в редактор кода и нажимая F8 двигаться от строки к строке пока не выскочит ошибка. Посмотреть строку, на которой это случилось и две-три строки перед этим... Найти несоответствие в описаниях типов, в нужной строке Dim указать правильное значение. Запустить макрос еще раз... и еще раз... Обычная отладка, в общем.
Подробнее именно про эту ошибку не видя кода что-нибудь рассказать трудно

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

andreya81

Цитата: JohnSUN от 27 марта 2013, 12:57
Ну, поставить в редакторе точку останова на первой строке процедуры, которая выдает ошибку (F9 или кликнуть мышкой на поле слева от строки - появится красная точка). Начать выполнение макроса. Переключиться в редактор кода и нажимая F8 двигаться от строки к строке пока не выскочит ошибка. Посмотреть строку, на которой это случилось и две-три строки перед этим... Найти несоответствие в описаниях типов, в нужной строке Dim указать правильное значение. Запустить макрос еще раз... и еще раз... Обычная отладка, в общем.
Подробнее именно про эту ошибку не видя кода что-нибудь рассказать трудно
Я к сожалению в этом полный профан. Попытаюсь обрисовать суть ошибки в моем понимании. Существует база данных производственной организации. В базу данных вносятся работы которые выполнил человек их объем расценка, формируется таблица с разделением по людям, автоматический расчет зарплаты в разрезе партий товара. Так вот существует одна партия где очень много данных и именно при формировании отчета по этой партии выскакивает вышеуказанная ошибка. По моему мнению это похоже на переполнение стека. У меня вопрос существует ли возможность увеличение стека. Если да то как это сделать. Заранее благодарен.

bormant

Цитата: andreya81 от 28 марта 2013, 08:09это похоже
Чем решать надуманные проблемы, надёжнее сначала поискать причины или хотя бы место возникновения реальных. Где? В коде. Как? См.выше. Почему? Потому что
ЦитироватьПодробнее именно про эту ошибку не видя кода что-нибудь рассказать трудно

ps.
Ночь, улица, фонарь. Вокруг фонаря на четвереньках ползает слегка трезвый человек. К нему подходит другой:
--- Что делаешь?
--- Ключи ищу.
--- Давай помогу...
Через полчаса безуспешных поисков второй спрашивает:
--- Всё уже осмотрели, нет твоих ключей, ты точно их тут обронил?
На что получает в ответ:
--- Не, вон там, за углом, подле забора.
--- Так за чем же тут тогда ползаешь?
--- Так там не видать же ничего, а тут фонарь, светло!!!
Автору на яд. Поддержать форум.

JohnSUN

Цитата: andreya81 от 28 марта 2013, 09:09
...существует одна партия где очень много данных и именно при формировании отчета по этой партии выскакивает вышеуказанная ошибка
Вот-вот, об этом я и говорил. Если "очень много" больше 2^15-1=32767, а где-то в коде вычисляется количество полученных записей и присваивается в переменную, которая обозначена как Integer, а не как Long, то и возникает переполнение... И стек здесь ни при чем
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Тут что, конкурс экстрасенсов и телепатов?

Или передача "Угадай мелодию без единой ноты"

JohnSUN

Можем перенести тему в Клуб телепатов... Кто угадает точнее и при этом сохранит спокойствие - тот и победил.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

andreya81

Цитата: JohnSUN от 28 марта 2013, 11:18
Цитата: andreya81 от 28 марта 2013, 09:09
...существует одна партия где очень много данных и именно при формировании отчета по этой партии выскакивает вышеуказанная ошибка
Вот-вот, об этом я и говорил. Если "очень много" больше 2^15-1=32767, а где-то в коде вычисляется количество полученных записей и присваивается в переменную, которая обозначена как Integer, а не как Long, то и возникает переполнение... И стек здесь ни при чем
Sheet=Doc.Sheets.getByName ("Шапка")

if get41.text<>"" then
dim svod(0)
select case get2.text
case "Швейный"
redim svod(1 to 20,0 to 3)
svod(1,0)="Упаковка МКР" : svod(2,0)="Завоз логотипов"
svod(3,0)="Завоз кроя" : svod(4,0)="Заготовка оболочки"
svod(5,0)="Сборка корпуса" : svod(6,0)="Заготовка крышки"
svod(7,0)="Заготовка крышки - стачать два шва ЗК" : svod(8,0)="Втачивание РК"
svod(9,0)="Притачивание крышки" : svod(10,0)="Притачивание фартука"
svod(11,0)="Обработка верха" : svod(12,0)="Пошив упаковочного контейнера"
svod(13,0)="Притачивание завязок" : svod(14,0)="Покраска логотипов"
svod(15,0)="Покраска логотипов ТПК" : svod(16,0)="Заготовка РК из полотна"
svod(17,0)="Заготовка РК - стачать два шва РК" : svod(18,0)="Пошив стропного кольца для спаривания строп"
svod(19,0)="Пошив стропного кольца для спаривания строп 0,90" : svod(20,0)="Сборка корпуса МКР со спариванием строп для всех типов МКР"
dim aJobs(0,1)
aJobs(0,0)=aRes(2,1) : aJobs(0,1)=aRes(3,1)
if intRow>1 then
for i=2 to intRow
tmp=true
for j=0 to ubound(aJobs,1)
if aJobs(j,0)=aRes(2,i) then
aJobs(j,1)=cint(aJobs(j,1))+cint(aRes(3,i))
tmp=false
end if
next j
if tmp then
j=ubound(aJobs,1)+1
redim preserve aJobs(j,1)
aJobs(j,0)=aRes(2,i) : aJobs(j,1)=aRes(3,i)
end if
next i
end if
for i=0 to ubound(aJobs,1)
dbRead("JobNumber", "Jobs", "JobName LIKE '" & aJobs(i,0) & "%'")
tmp=aTmp(0,0)
if instr(tmp,"(1,") then
j=cint(mid(tmp,instr(tmp,"(1,")+3,len(tmp)-instr(tmp,"(1,")-3))
if instr(svod(j,2), tmp) then
j=j
else
svod(j,2)=svod(j,2) & tmp
svod(j,3)=cint(svod(j,3))+1
end if
svod(j,1)=cint(svod(j,1))+cint(aJobs(i,1)) вот здесь ошибка
end if
next i
for i=1 to 20
Sheet.getCellByPosition(4,15+i).String=cstr(svod(i,0))
if cint(svod(i,3))>0 then

JohnSUN

Yes!
Смотри, что получается: из aJobs выдергиваются значения в текстовом виде и преобразуются в целые числа, чтобы просуммироваться со значением svod  и записаться обратно.
Читаем справку:
Функция CInt [время выполнения]
Преобразует строковое или числовое выражение к типу Integer.
...
Параметры:
Выражение. Число, подлежащее преобразованию. Если Выражение выходит за пределы диапазона значений от -32768 до 32767, LibreOffice Basic сообщает об ошибке переполнения...
Как раз те грабли, на  которые ты и наступил.
Что делать?
Замени в этой строке (а лучше - во всей процедуре) cInt на cLng
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

andreya81

#11
Цитата: JohnSUN от 28 марта 2013, 17:06
Yes!
Смотри, что получается: из aJobs выдергиваются значения в текстовом виде и преобразуются в целые числа, чтобы просуммироваться со значением svod  и записаться обратно.
Читаем справку:
Функция CInt [время выполнения]
Преобразует строковое или числовое выражение к типу Integer.
...
Параметры:
Выражение. Число, подлежащее преобразованию. Если Выражение выходит за пределы диапазона значений от -32768 до 32767, LibreOffice Basic сообщает об ошибке переполнения...
Как раз те грабли, на  которые ты и наступил.
Что делать?
Замени в этой строке (а лучше - во всей процедуре) cInt на cLng

Огромное спасибо. Проблема действительно решилась. Я понимаю, что я наверное надоел всем с глупыми вопросами. Но так получилось,что я новичок в этой области. Помогите еще раз пожалуйста. Что нужно изменить в коде, чтобы исправить ошибку в вычислениях, а именно в результате вычислений выходят цифры с увеличенной разрядностью после запятой. Выглядит это вот так '9679,16666666667