Я не совсем понимаю, что вы хотите сделать. Вы хотите найти строку и посмотреть, есть ли в ней "PP"? Тогда вам не нужно делать это в итерации. Просто
cData MATCHES "*PP*"
скажет вам это.
Если «PP» - это какой-то разделитель, и вы хотите что-то сделать с данными до и после того, как вы можете сделать:
DEFINE VARIABLE I AS INTEGER NO-UNDO.
DEFINE VARIABLE cData AS CHARACTER NO-UNDO .
DEFINE VARIABLE cParsData AS CHARACTER NO-UNDO.
ASSIGN
cData = 'PRRSCLPP0123456789'.
DO I = 1 TO LENGTH(cData):
cParsData = SUBSTRING(cData,I, 2).
IF cParsData = 'PP' THEN DO:
DISPLAY
SUBSTRING(cData, i + 2) FORMAT "x(20)" LABEL "After PP"
SUBSTRING(cData, 1, i - 1) FORMAT "x(20)" LABEL "Before PP".
END.
END.
Это работает только для одного вхождения «PP» в строке. Вы должны попытаться лучше объяснить, что именно вы ищете.
Вы оставили намного больше информации в комментарии к другому ответу:
![Comment](https://i.stack.imgur.com/YFyS2.png)
Если PP действительно всегда находится в позиции 10 (и 11) или 20 (и 21) и вам нужны только следующие 10 символов, тогда вы можете сделать:
DEFINE VARIABLE cData1 AS CHARACTER NO-UNDO.
DEFINE VARIABLE cData2 AS CHARACTER NO-UNDO.
/* Position 10 and 11 */
cData1 = 'PRRSCLAAAPP0123456789'.
/* Position 20 and 21 */
cData2 = 'PRRSCLAAAPRRSCLAAAPP9876543210AA'.
FUNCTION parse RETURNS CHARACTER
(INPUT cString AS CHARACTER ):
IF INDEX(cString, "PP") > 0 THEN
RETURN SUBSTRING(cString, INDEX(cString, "PP") + 2, 10 ).
ELSE
RETURN "".
END.
MESSAGE cData1 " ->" parse(cData1) SKIP
cData2 " ->" parse(cData2) VIEW-AS ALERT-BOX.