powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сокращение поля
21 сообщений из 21, страница 1 из 1
Сокращение поля
    #38091891
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица табл. в ней поле pol1 значения поля pol1 длинные. Как сделать так чтобы выводились только 40 символов из этого поля, а остальное откидывалось
...
Рейтинг: 0 / 0
Сокращение поля
    #38091892
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вернее сделать так, если значение поля больше чем 45 то выводить 45 символов, а остальное откидывать
...
Рейтинг: 0 / 0
Сокращение поля
    #38091921
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989,

LEFT(pol1, 45)
...
Рейтинг: 0 / 0
Сокращение поля
    #38091929
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, задача немного поменялась. печать из этой dbf идет на матричном принтере. максимальная длина значения 40 символов, как можно сделать следующее. надо на самой ближней к максимальной длине согласной букве урезать.
...
Рейтинг: 0 / 0
Сокращение поля
    #38091934
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или же так надо на самом ближнем к максимальной длине пробеле её урезать
...
Рейтинг: 0 / 0
Сокращение поля
    #38091961
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
никто не знает?
...
Рейтинг: 0 / 0
Сокращение поля
    #38091964
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989,

wordnum в цикле. Наращиваешь строку, пока длина(строка+следующее слово) не выйдет за пределы
...
Рейтинг: 0 / 0
Сокращение поля
    #38091996
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alextashk, не могли бы вы пример показать? Вот есть строка длиною 60 символов, допустимое 40. Надо найти ближайший к длине 40 пробел и урезать строку до этого символа. Я не пойм как через wordnum его делать тоже.
...
Рейтинг: 0 / 0
Сокращение поля
    #38092121
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
написал так: allt(substr(tab.pol1,1,atc('',tab.pol1,2))) но иногда не выводит ничего вообще.. почему так?
...
Рейтинг: 0 / 0
Сокращение поля
    #38092123
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей8989,

Есть функция mline() для Вашей задачи
...
Рейтинг: 0 / 0
Сокращение поля
    #38092203
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989написал так: allt(substr(tab.pol1,1,atc('',tab.pol1,2))) но иногда не выводит ничего вообще.. почему так?
Потому, что в поле может не быть вторго пробела. Тогда atc() вернет 0

Вам надо искать не слева-направа, а наоборот, справа-налево. Т.е. отрезать 41 символ и искать первый пробел справа. Нужно отрезать именно 41, чтобы учесть возможный пробел именно в 41 символе

В одну строчку это получится примерно так

Код: sql
1.
left(tab.pol1, EVL(RAT(space(1), left(tab.pol1,41)),40))



Поскольку пробелов может вообще не быть, то в этом случае следует просто "тупо" взять первых 40 символов. Для этого и используется функция EVL()

Если поле pol1 имеет тип VarChar, то вместо left() надо использовать padr()
...
Рейтинг: 0 / 0
Сокращение поля
    #38092223
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, попробовал так и с left вообще ничего не выводит

Код: sql
1.
padr(PAKET.NAMM, EVL(RAT(space(1), padr(PAKET.NAMM,41)),40))
...
Рейтинг: 0 / 0
Сокращение поля
    #38092228
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вместо tab и pol1 написал paket и namm
...
Рейтинг: 0 / 0
Сокращение поля
    #38092248
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если вместо EVL написать EVALUATE пишет типа много аргументов
...
Рейтинг: 0 / 0
Сокращение поля
    #38092261
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "не выходит"?

Код: sql
1.
2.
lcString = replicate('1234 ',9)
?left(m.lcString, EVL(RAT(space(1), left(m.lcString ,41)),40))



PS: Функция EVL() была введена в VFP8. Она не имеет никакого отношения к функции evaluate(). Если у Вас версия младше VFP9, то об этом надо сообщать сразу, а не ждать, пока подут ошибки из-за не известных функций.
...
Рейтинг: 0 / 0
Сокращение поля
    #38092267
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у Вас версия младше VFP8, то функцию EVL() можно заменить такой конструкцией

Код: sql
1.
2.
lcString = replicate('1234 ',9)
?left(m.lcString, IIF(RAT(space(1), left(m.lcString ,41)) = 0, 40, RAT(space(1), left(m.lcString ,41))))
...
Рейтинг: 0 / 0
Сокращение поля
    #38092276
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, я в 6-ом фокспро работаю.
...
Рейтинг: 0 / 0
Сокращение поля
    #38092280
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. заработало. Сейчас буду разбирать, чтобы в дальнейшем сам уже мог.
...
Рейтинг: 0 / 0
Сокращение поля
    #38092510
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, Правильно ли я понял этот код?

Код: sql
1.
left(m.lcString, IIF(RAT(space(1), left(m.lcString ,41)) = 0, 40, RAT(space(1), left(m.lcString ,41))))



1. Берем 41 символ из строки и ищем в нем последнюю позицию пробела:
Код: sql
1.
RAT(space(1), left(m.lcString ,41))



2. Берем 41 символов из строки, и проверяем если 41-й символ не пробел:
Код: sql
1.
RAT(space(1), left(m.lcString ,41)) = 0



3. Условие если 41-й символ не пробел то берем 40 символов, а если пробел то 41 символов так? Если не так то исправьте пожалуйста.
...
Рейтинг: 0 / 0
Сокращение поля
    #38092524
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей89891. Берем 41 символ из строки и ищем в нем последнюю позицию пробела:
Код: sql
1.
RAT(space(1), left(m.lcString ,41))


Да. Правильно

Андрей89892. Берем 41 символов из строки, и проверяем если 41-й символ не пробел:
Код: sql
1.
RAT(space(1), left(m.lcString ,41)) = 0


Нет. Не правильно.

В п.1 Вы правильно написали, что делает функция RAT(). Она возвращает номер позиции с которой начинается искомая подстрока. В данном случае пробел. Поиск выполняется справ-налево, но номер позиции отсчитывается с левого края.

Но если функция RAT() не найдет указаный символ, то она вернет значение 0, как признак того, что ничего не нашли. Другими словами, данный фрагмент означает, что в первых 41 символах пробела нет. Идут подряд 41 символ вообще без пробелов.

Соответственно, если 41 символ идет без пробелов, то просто формально отрезаем первые 40 символов, какие попадуться. Без анализа

Наверное, будет проще, если написать преобразование не в одну строку, а последовательно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
* Исходная строка символов
lcString = replicate('1234 ',9)

* Выделяем первые 41 символ слева
lcString41 = left(m.lcString, 41)

* Ищем первый пробел справа среди первых 41 символов
lnPosSpace = RAT(space(1), m.lcString41)

* Если пробела так и не нашли, то в качестве позиции ставим число 40
IF lnPosSpace = 0
    lnPosSpace = 40
ENDIF

* В сокращенном варианте то же самое
* lnPosSpace = IIF(m.lnPosSpace = 0, 40, m.lnPosSpace)


* Теперь окончательный результат
* Выделяем в исходной строке слева символы до найденной позиции пробела
?left(m.lcString, m.lnPosSpace)
...
Рейтинг: 0 / 0
Сокращение поля
    #38092874
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989,

Если уж быть совсем точным, то
ВладимирМ
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
* Исходная строка символов
lcString = replicate('1234 ',9)

* Выделяем первые 41 символ слева
lcString41 = left(m.lcString, 41)

* Ищем первый пробел справа среди первых 41 символов
lnPosSpace = RAT(space(1), m.lcString41)

* Если пробела так и не нашли, то в качестве позиции ставим число 40
IF lnPosSpace = 0
    lnPosSpace = 40
ENDIF

* В сокращенном варианте то же самое
* lnPosSpace = IIF(m.lnPosSpace = 0, 40, m.lnPosSpace)

* Теперь окончательный результат
* Выделяем в исходной строке слева символы до найденной позиции пробела
?left(m.lcString, m.lnPosSpace -1 )

хотя в данном конкретном случае это не важно, т.к. последний будет пробел.

Если вам нужно для вывода на печать, то почему бы этот текст не оформить в виде функции?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сокращение поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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