:: Visual Foxpro, Foxpro for DOS
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В FPD26 отладчика пошагового чтоли нет? если нет, то ставить можно ставить WAIT-ики, но я тоже не верю, что после APPEND BLANK укатель на запись "сам уходит". Надо найти причину. То что "отчет точно показывает, что уходит" - недостаточен. Надо добиться правильной работы без GO BOTTOM, или указать на неправильность фокса в этом деле. Глюк криминальный, убивающий весь фокс.
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Дак не воспроизводится глюк. \m/
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Почему же не воспроизводится... Вот "отчет" прозвучал, REPORT FORM - это аналог SCAN (после завершения он встает на "EOF")... хз, что может быть в коде, казалось бы безобидное... Давай минимальный код, че. Воспроизведи )
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Божья_коровка

Сообщений: 25731
Дата регистрации: 23.08.2001
of63
Почему же не воспроизводится... Вот "отчет" прозвучал, REPORT FORM - это аналог SCAN (после завершения он встает на "EOF")... хз, что может быть в коде, казалось бы безобидное... Давай минимальный код, че. Воспроизведи )
Не приставай к царю, у него уже всё в порядке


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Хозяйка Медной Горы? )
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Там неслабая прога ваащета по размеру. Но глюк возникал в одном месте - в небольшом фрагменте. Вероятно, такой глюк был следствием предыдущих операций, напрямую не связанных с этим куском.
Ну вот примерно так было:

Select mytable1
Append blank
Replace myfield1 with mytable2.Mayfield1, myfield2 with mytable2.myfield2
If myrable2.myfield3=spac(20)
select mytable2
tekz=recn()
Do while myfield3=spac(20).and.!bof()
skip -1
Enddo
m.myfield3=myfield3
go tekz
select mytable1
replace myfield3 with m.myfield3
* здесь этот replace не работал, поскольку был EOF()
Else
replace myfield3 with mytable2.myfield3
Endi
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Полноценный репо код с данными ошибкой отказался делать... ) Завтра попробую, если никто не сделает заместо ТС )
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Ошибка была в этом фрагменте. Ошибка не воспроизводится. Се ля ви.
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() в каком? строку то хоть назови... или отладчика нет в ФПД?...
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Я же написал в комментарии - смотри зеленым цветом написано. REPLACE не отрабатывал.
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Simple777
Там неслабая прога ваащета по размеру. Но глюк возникал в одном месте - в небольшом фрагменте. Вероятно, такой глюк был следствием предыдущих операций, напрямую не связанных с этим куском.
Ну вот примерно так было:

Select mytable1
Append blank
Replace myfield1 with mytable2.Mayfield1, myfield2 with mytable2.myfield2
If myrable2.myfield3=spac(20)
select mytable2
tekz=recn()
Do while myfield3=spac(20).and.!bof()
skip -1
Enddo
m.myfield3=myfield3
go tekz
select mytable1
replace myfield3 with m.myfield3 && это правильная и тонкая игра на m. ))) не все понимают, Симпле понимает
* здесь этот replace не работал, поскольку был EOF() Причина пока не ясна
Else
replace myfield3 with mytable2.myfield3
Endi

вроде хороший код... Но... я хз
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
replace myfield3 with m.myfield3
* здесь этот replace не работал, поскольку был EOF()

В процессе отладки программы случается всякое, но это всякое - "глюки программиста", которые происходят со всеми без исключения.

Отладил прогу, убрав свои глюки (иногда неосознанно), которые ты посчитал за глюки Фокса, и все работает, не существовавший глюк Фокса перестал воспроизводиться.

Поэтому, если у тебя сейчас есть реальный код, который приводит к EOF() без причины, то покажи его.
А если сейчас такого кода нет, то ты просто исправил все свои глюки (ошибки в логике).
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Еще раз проверил работу уже в "оригинальной" папке. Везде убрал (в 3 местах) команду GO BOTT. Всё работает без глюков. Однако я при всем желании не могу воспроизвести имевшую быть ситуацию. Во-первых, в исходном файле я экранировал "двойные кавычки" (смотрите в соседнем топике). Во-вторых, вносил изменения в этот программный модуль, хотя и не в этих фрагментах. Возможно, еще что-то менял.

Команду GO BOTT на всякий случай оставил в работе - ничего не портит ведь.



Исправлено 1 раз(а). Последнее : Simple777, 24.05.18 07:08
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
Команду GO BOTT на всякий случай оставил в работе - ничего не портит ведь.

Если ошибка в программе осталась, но она проявляет себя лишь при определенных (редких) условиях, то я бы, не убирая GO BOTTOM, добавил бы проверку на EOF() с выводом диагностики на экран и/или в файл - интересно же понять причину "глюка"! (во всяком случае это интереснее, чем при любых непонятках мастерить костыли)
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Разумно, конечно. Но это была разовая обработка текстового файла. Теоретически в будущем может появиться необходимость обработать такой файл еще для кого-нибудь. Пожалуй, добавлю SUSPENDED по EOF() [sm128]
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Igor Korolyov
Когда ты используешь VAL то из разбираемой строки никаких форматов не берётся - берётся, видимо, из SET DECIMAL.
В связи с этим же имеет смысл такая запись: select 000.0000+val(something) as nn from ...

Simple777
Иногда, кстати, бывает необходимо выполнить команду go recno()
Да, когда таблица открыта в нескольких областях, где-то идёт запись (действие), в результате которой могут поменяться данные этой записи, тем более если есть relation, то по возврату в эту область go recno() или skip 0 не просто не помешает, но может спасти от непонятных результатов)) Тем более, что выполняются эти команды мгновенно.

of63
Когда нарываюсь на глюк/фичу/нюанс (нужное подчеркнуть), то провожу эксперименты, и делаю костыль согласно их результатам.
Буквально позавчера наткнулся на свой комментарий в своей же древней функции:
* str(),roun(),tran() косячат при большом кол-ве знаков после запятой с увеличением целой части, поэтому делаем 2
и подобным записям склонен доверять не вдаваясь в подробности))

Simple777
И вааще это была разовая конвертация данных. Так что было и прошло...
Да не, просто это конкретно ужасная ситуация, крах данных и прочее, причём, в совершенно обычном месте кода, потому все и возбудились. Что-то здесь не то, какое-то стечение обстоятельств.
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
andrewk
В связи с этим же имеет смысл такая запись: select 000.0000+val(something) as nn from ...
Не только с конкретно этим - при запросах с функциями ещё более изощрённая логика определения типа (и размерности) поля результата применяется.
В 9-ке более красиво будет CAST использовать. По крайней мере не выглядит таким уж явным костылём
andrewk
Буквально позавчера наткнулся на свой комментарий в своей же древней функции:
* str(),roun(),tran() косячат при большом кол-ве знаков после запятой с увеличением целой части, поэтому делаем 2
Некоторые функции от set decimal зависят. Плюс та же самая "проблема" отображения результата - т.е. если всегда держать в уме что помимо явных ROUND фокс ещё и пытается "покрасивее" показать результат, основываясь на практически неуправляемых "ширине и точности вещественного числа хранящегося в переменной"... Ну тогда и не будет возникать "глюков" на пустом месте.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: глюк с Value%1=0 (Double)
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Igor Korolyov
of63
Она не обьясняет КАК ФОКС превращает строку в Double в операторе X=VAL("1.001"), и как в операторе X=1.001, и в чем разница. И как TRANSFORM интерпретирует эти два разных X

В double то они одинаково "превращаются" (хотя первое во время исполнения - из "строки" прошитой как в исходном, так и в исполняемом/объектном/откомпилированном коде, а второе - на этапе компиляции, из строки aka литерала имеющегося только в исходнике - в объектном коде уже будет НЕ 1.001 а то самое double, ПЛЮС "формат отображения").

Структура Value. Для числовых значений помимо самого "значения" в ev_real хранятся "ширина" и "число десятичных знаков" в полях ev_width и ev_length соответственно.
В фоксе не бывает вещественных числовых значений без этих самых двух "дополнений". Даже для Integer (целочисленных) значений и то фокс хранит "ширину". Так что VAL записывает и "ширину" и "точность" - но не из обработанных парсером данных, а из настроек среды. Хотя парсер - тот кто преобразуем "символы циферок" в одно общее значение - всё же влияет на этот процесс. Т.к.
? VAL("1e20")
? VAL("100000000000000000000")
Выглядят таки по разному, при том что "внутри" числа хранятся одинаковые.

Вобщем, когда Нагибулина докапывается до копейки (миллиярды ее меньше беспокоят), то нельзя пользоваться нативным оператором 123.45%1 чтобы получить копейки!
? STR(100*ROUND(12300.65%1, 12), 20, 12) && 65.000000000000
? STR(100*ROUND(123000.65%1, 12), 20, 12) && 64.999999999400
т.е. вроде бы округлил (сумма%1) до 12 разрядов (а "точных" значащих разрядов вроде бы 14 у фокса, в Double этом), ну умножил получившееся на 100 (чтобы получить число копеек)... и опять выползли шумы в младших разрядах! Получается, что нельзя заставить фокс (его ИИ по округлению) использовать для расчетов "до копейки но не точнее", надо делать ROUND(2), если есть информация, что сумма должна быть в рублях и копейках. Думал, что получится какой-то универсальный способ счета, без указания магического числа 2 (и без 12, подобранного в частном примере)... А жаль, идея хорошая была у фокса... Не зря разрабы SET DECIMAL TO 2 приделали по умолчанию, чтобы "скрыть" эти шумы при изображении. Может автоокругление до 2 при изображении и есть их "ИИ"... Если бы они хранили дробное число в "человеческом" виде (непосредственно 10-ное изображение, т.е. с сохранением разрядности человеческого представления) было бы лучше... хз.
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Назачем для вычисления КОПЕЕК применять ROUND(,12)? Ты б ещё через десятичный логарифм посчитал
Применять оператор %1 для получения дробной части числа тоже, мягко говоря, "не очень". Лучше оставить его для ЦЕЛЫХ чисел, и даже желательно только натуральных, т.к. есть интересные особенности при работе с отрицательными числами. А то очередной шок будет после вычленения "копеек" из -12300.65

Не вижу решительно никакой проблемы или ошибки в приведенном примере. 64.9999999994 копеек это и есть 65 копеек (по бизнес-логике современных российских денежных знаков, где копейка всегда целое и "минимальное" выражение физической денежной суммы). То что кто-то решил отбросить часть знаков числа а не округлить - исключительно проблемы этого кого-то

Для работы конкретно с денежными величинами существует (в фоксе) специальный тип currency - который по сути является целочисленным - что вполне логично для денежных сумм. Хотя и не всегда удобно с ним работать, особенно учитывая что он таки 4 знака после запятой отводит под "копейки" (валюты разные есть, где-то и не на 100 частей делят основную единицу). Ну и то что всякие там тарифы/расценки/прОценты и иже с ними всё же не совсем "денежными" единицами являются, а переход от "просто числа" к "денежному числу" тоже отдельная операция со своими правилами...


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 29.05.18 18:30
Ratings: 0 negative/0 positive
Re: ADIR, глюк с маской "?"
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Не вижу решительно никакой проблемы или ошибки в приведенном примере
> Для работы конкретно с денежными величинами существует (в фоксе) специальный тип currency - который по сути является целочисленным - что вполне логично для денежных сумм

Да, знаю, но в "БД" лежат числа именно в формате N(14,2), и их преобразования NTOM не нужны, и способ хранения менять не нужно. Вызывают проблемы фоксовые "операции" (типа % или *, или вообще все) с числами, связаны с представлением числа в фоксе, понимаю это... Думаю уже, типа, сделать оператор (подпрограмму) "денежное суммирование", или "денежное умножение", но смешно же... хочется пользоваться нативными операторами фокса...
Ratings: 0 negative/0 positive


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

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

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