Не работает LEFT(<Поле>,AT(".",<Поле>))

SAS_Z
Дата: 29.08.2012 13:53:22
Необходимо в запросе из данных, типа 123.456.7 выбрать только то, что находится до первой точки. Конструкции могут быть очень разного типа и без точек и с одной точкой
Конструкция типа
Left(alltrim(docs_1.doc_num),(AT('.',alltrim(docs_1.doc_num))-1)) ;
не работает, выдает только первый символ.
Хотя AT('.',alltrim(docs_1.doc_num)) выдает правильное значение и Left(alltrim(docs_1.doc_num),3) тоже выдает правильно.
В чем проблема или как решить по другому может быть
Dima T
Дата: 29.08.2012 14:00:31
У меня все работает
docs_1_doc_num = '123.456.7'
? Left(alltrim(docs_1_doc_num),(AT('.',alltrim(docs_1_doc_num))-1))

ищи в окружающем коде ошибку.

Cкобок зачем столько? Так читабельнее
? alltrim(Left(docs_1_doc_num, AT('.', docs_1_doc_num) - 1))
Jonny540
Дата: 29.08.2012 14:19:23
SAS_Z
(AT('.',alltrim(docs_1.doc_num))
Fox лишние скобки воспринимает как макроподстановку. И что там он себе навоспринимал - фиг его знает :)
Dima T
Дата: 29.08.2012 14:21:56
Jonny540
Fox лишние скобки воспринимает как макроподстановку. И что там он себе навоспринимал - фиг его знает :)

С чего это вдруг скобки макроподстановкой стали?

В примере ТС все работает с лишними скобками, читать только такой код тяжело.
ВладимирМ
Дата: 29.08.2012 14:45:19
Начиная с VFP7 введена функция GetWordNum(), которая ищет "слова" по указанным "разделителям". По умолчанию, разделителем "слов" считается пробел. Но вполне можно указать в качестве разделителя и точку

?GetWordNum("123.456.7", 1, ".")
Jonny540
Дата: 29.08.2012 15:24:53
ВладимирМ,
Dima T
С чего это вдруг скобки макроподстановкой стали?
Если можно, проясните ситуацию. У меня работают как &, так и скобки.
Dima T
Дата: 29.08.2012 15:52:24
ВладимирМ
?GetWordNum("123.456.7", 1, ".")

GetWordNum() нездоровая функция для разбора строки с разделителями. Несколько разделителей подряд она считает одним, разделитель на первом месте игнорирует:
docs_1_doc_num = '.123.45.67'
? Left(alltrim(docs_1_doc_num),(AT('.',alltrim(docs_1_doc_num))-1))
? GetWordNum(docs_1_doc_num, 1, '.')

Jonny540
Dima T
С чего это вдруг скобки макроподстановкой стали?
Если можно, проясните ситуацию. У меня работают как &, так и скобки.

Я так подозреваю что замена в коде макроподстановки на переменную в скобках в некоторых случаях у тебя отложилось как "скобки это макроподстановка". Это не так.
Наиболее частое использование это в командах с файлами. Там изначально синтаксис нездоровый. Например
lcFile = 'c:\text.txt'
delete file lcFile && 1. Удаление файла с именем lcfile
delete file &lcFile && 2. будет выполнено delete file c:\text.txt т.е. сначала подставится значение переменной в текст команды
delete file (lcFile) && 3. Имя файла будет взято из содержимого переменной lcFile

т.е. в третьем варианте скобки указывают фоксу взять содержимое переменной, но это не макроподстановка. Там где изначально предусмотрено брать содержимое переменной без разницы возьмешь ты ее в скобки или нет.
Макроподстановка - это когда сначала в текст команды вставляется содержимое переменной а потом то что получилось выполняется.
Скобки во всех выражениях выполняют такую же роль как и в других языках - определение порядка выполнения команд. И лишние скобки никак не влияют на результат.
ВладимирМ
Дата: 29.08.2012 18:18:23
Ну, выкрутиться всегда можно. Например, добавив ведущий пробел перед выделением "слова".

?GetWordNum(".123.456.7", 1, ".")
?GetWordNum(" " + ".123.456.7", 1, ".")

А в данном случае я подозреваю проблема в том, что конструкция с AT() была использована в Select-SQL. А для Select-SQL размерность полей будущей выборки определяется по первой попавшейся записи. Вот видимо в первой записи либо вообще не оказалось значения, либо оказалось значение из одного символа. Для исправления проблемы надо явным образом указать итоговую размерность либо через CAST(), либо через PADR()

select PADR(Left(alltrim(docs_1.doc_num), AT('.',alltrim(docs_1.doc_num))-1), 10) ;
from docs_1

Разумеется, здесь 10 - это условная величина. Вместо нее надо поставить максимально возможную размерность для определяемого значения. Вероятно, это будет размерность самого поля docs_1.doc_num
SAS_Z
Дата: 30.08.2012 16:27:37
Спасибо всем.
У меня достаточно жесткий формат строк, поэтому и GetWordNum также решает задачу.
И проблема действительно было в этом
select PADR(Left(alltrim(docs_1.doc_num), AT('.',alltrim(docs_1.doc_num))-1), 10) ;
выбирает правильно поля.
Еще раз всем спасибо, особенно Владимиру.