powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странный глюк фокса:(
12 сообщений из 12, страница 1 из 1
Странный глюк фокса:(
    #33045907
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть такой код:
SELECT M_GR, ALLTRIM(removenull(M_ADR)) as m_adr, DATE1, TIME1, M_VAL FROM MPRIMARY INTO CURSOR cNotDouble ;
GROUP BY M_GR, M_ADR, DATE1, TIME1 NOFILTER

функция:
**********************************
PROCEDURE removenull(stroka)
**********************************
*stroka - символьная строка формата 0000...хххх нужно убрать лишние нули
*возвращает или ххх...х или 0х
LOCAL str_len, i
stroka=ALLTRIM(stroka)
str_len = LEN(stroka)
FOR i=1 TO str_len
IF SUBSTR(stroka, i, 1) != '0' .and. SUBSTR(stroka, i, 1) != ' '
stroka = ALLTRIM(SUBSTR(stroka, i))
EXIT
ENDIF
ENDFOR
IF len(stroka)<=1
stroka = '0'+stroka
ENDIF

RETURN stroka

Так вот в таком виде это работало и все ок. пока однажды не натолкнулся на след. случай: m_adr для некоторых записей был равен '00000031', потом где то столько же записей был равен '00000100', потом '00000017'. всего записей около 16000

и после селекта(см. выше) m_adr где должен был быть равен '100' оказался равен '10'
вот такой вот фокус. причем это поведение очень не стабильно. оставил в mprimary только записи где m_adr='00000100' и все отработало как надо.

пришлось переделать select в след. конструкцию:

SELECT M_GR, M_ADR, DATE1, TIME1, M_VAL FROM MPRIMARY INTO CURSOR cNotDouble1 ;
GROUP BY M_GR, M_ADR, DATE1, TIME1 NOFILTER

GO TOP IN cnotdouble1
CREATE CURSOR cNotDouble(M_GR N(3), M_ADR C(15), DATE1 C(10), TIME1 C(5), M_VAL N(12,2))
DO WHILE !EOF("cNotDouble1")
APPEND BLANK IN cNotDouble
replace m_gr WITH cNotDouble1.m_gr, ;
m_adr WITH removenull(cNotDouble1.M_ADR), ;
date1 WITH cNotDouble1.date1, ;
time1 WITH cNotDouble1.time1, ;
m_val WITH cNotDouble1.m_val IN cNotDouble
SKIP IN cNotDouble1
ENDDO

в таком виде вроде работает, но такое поведение фокса мне не понятно.
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33045947
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
strtran(ltrim(strtran(mystr,'0',' ')),' ','0')
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33045977
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mystr=iif(at('.',mystr)=2,'0','')+strtran(ltrim(strtran(mystr,'0',' ')),' ','0')
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33045984
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если в запросе вычисляемое поле вроде
ALLTRIM(removenull(M_ADR)) as m_adr
то размерность поля в результате вычисляется по первым строчкам (вроде бы, или как-то ещё)

т.е.
alltrim(sname) из

иванов
петров
сидоров

может вернуть

иванов
петров
сидоро

надо стразу размерность задавать вроде
padr(alltrim(sname)," ",20)

- не помню синтаксис
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33045994
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильно сказал
тогда
mystr=padr(iif(at('.',mystr)=2,'0','')+strtran(ltrim(strtran(mystr,'0',' ')),' ','0'),nn)
где nn нужный размер поля
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33046196
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
понятно. спасибо. впервые узнал что селект так делает.
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33046308
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно за что так народ любит функцию STRTRAN() ? И лепит с ней огромные и трудночитаемые конструкции типа strtran(ltrim(strtran(mystr,'0',' ')),' ','0') когда можно легко убрать любое количество любых символов вот так:

chrtran(mystr,' 0','')

В данном случае уберуться все пробелы и нули. И эта функция значительно быстрее strtran()
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33046329
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Sergey Sizov.
Вы наверное разобрали весь код по косточкам
почитайте вопрос и подумайте а стоит ли убирать все нули?
или может нужно оставить те нули которые справа а ? Как Вы считаете?
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33046651
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это называется слишком сильно разогнался и не успел затормозить :)

Непосредственно перед этим наткнулся на такой шедевр:

func IsNeCifra
param InString
* проверка наличия нецифровых знаков
if Empty(allt(strt(strt(strt(strt(strt(strt(strt(strt(strt(strt(strt(InString),'9',''),'8',''),'7',''),'6',''),'5',''),'4',''),'3',''),'2',''),'1',''),'0',''),'-','')))
Return .f.
else
return .t.
endif

хотя тот же результат получается так:

func IsNeCifra
param InString
return Len(allt(chrt(InString,'0123456789-','')))=0
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33046727
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это по-разному бывает :). Вот в вашем случае например.

Код: plaintext
1.
2.
func IsNeCifra
param InString
return empty(chrt(InString,'0123456789-',''))
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33047004
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Способ проверки пустоты полученой строки - это уже вопрос вкуса. Не так ли?
...
Рейтинг: 0 / 0
Странный глюк фокса:(
    #33047142
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Sergey!

Вообще-то LEN(ALLTRIM())=0 и EMPTY() не эквивалентны :) Лишь при целой куче умолчаний они дадут одинаковый результат.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странный глюк фокса:(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]