Процедура разбивки на подстроки



Posted by Васеленко Сергей, Фирма КАРДИНАЛ on August 28, 1999 at 04:35:36:

In Reply to: Проблемы с платежкой в локальной версии posted by Рустем Мухаметшин on August 27, 1999 at 23:38:39:

Кроме различного поведения у растекателей есть еще два ньюанса:
1. Растекатель длинных строк может быть только один на строке.
2. Растекатель должен быть первым слева в отчете. Т.е. поведение для локальной версии является более стандартным при написании форм.

Для устранения данных проблем предлагаю использовать процедуру SEXPAND.
Она приведена вместе с примерами по разбивке на подстроки.

Насчет платежки. У нас запрашиваются строки фиксированной длины, помещающиеся в одну строку в платежном поручении. Т.е. сам пользователь решает, что должно быть на первой строке, что на второй и т.д.


* Пример разбивки на подстроки
*****************************************************************************
ZX=1; S =' 1 12 123 1234 1234567890 12345678901234567890'
call SEXPAND; call SOUT
*
ZX=2; S =' 1 12 123 1234 1234567890 12345678901234567890'
call SEXPAND; call SOUT
*
ZX=5; S =' 1 12 123 1234 1234567890 12345678901234567890'
call SEXPAND; call SOUT
*
ZX=10; S =' 1 12 123 1234 1234567890 12345678901234567890'
call SEXPAND; call SOUT
*
ZX=20; S =' 1 12 123 1234 1234567890 12345678901234567890'
call SEXPAND; call SOUT
*
stop
*****************************************************************************
:SOUT Вывод строк для теста
*****************************************************************************

ZX: ^ZX
for I=1 to [s 0]
S =[s I]
^I: ^S^^^^^^^^^^^^^^^^^^^^^^ ^S^^^^^^^^^^^^^^^^^^^^^^ ^S^^^^^^^^^^^^^^^^^^^^^^
endfor
return
*****************************************************************************
:SEXPAND Разбивка строки на подстроки
*****************************************************************************
* Входные параметры : S - Cтрока, ZX - Длина подстроки
* Выходные параметры: [s] - Массив подстрок, [s 0] - кол-во подстрок
* Пример вызова:
* ZX=20 Длина подстроки
* S ='ABC ... XYZ' Строка для разбивки
* call SEXPAND Вызов процедуры разбивки
* S2=[s 2] Чтение подстроки 2
*****************************
array s
while [length S]>ZX
for NO=ZX+1 downto 2
if '!'+[cp S,NO,1]='! '
[s [s 0]+1,[cp S,1,NO-1]]
S =[strip [cp S,NO+1,255]]
goto SEXPAND1
endif
endfor
[s [s 0]+1,[cp S,1,ZX]]
S =[strip [cp S,ZX+1,255]]
:SEXPAND1
endwhile
[s [s 0]+1,S]
return
*****************************************************************************





Пpишедшие ответы: