Try this, instead of using an array as I did, you could use a comma delimite string (or whatever) to store the positions. If you use an array, make sure to set the extent high enough to handle the maximum possible entries found.
DEF VAR V-FOUND-AT-POSITIONS AS INT EXTENT 50 NO-UNDO.
DEF VAR V-CURRENT-POSITION AS INT NO-UNDO.
DEF VAR V-STARTING-POSITION AS INT NO-UNDO INIT 1. /*MUST SET THIS!*/
DEF VAR V-STRING-TO-SEARCH AS CHAR INIT "ABCDEFABCDEFABCDEFABCDEFABCDEFABCDEFABCDEF" NO-UNDO.
DEF VAR V-COUNTER AS INT NO-UNDO.
DEF VAR V-STRING-TO-FIND AS CHAR NO-UNDO.
ASSIGN V-STRING-TO-FIND = "CD".
DO V-COUNTER = 1 TO NUM-ENTRIES(V-STRING-TO-SEARCH, V-STRING-TO-FIND) - 1:
ASSIGN V-CURRENT-POSITION = INDEX(V-STRING-TO-SEARCH, V-STRING-TO-FIND, V-STARTING-POSITION).
ASSIGN V-STARTING-POSITION = V-CURRENT-POSITION + 1.
ASSIGN V-FOUND-AT-POSITIONS[V-COUNTER] = V-CURRENT-POSITION.
END.
After running, my array held (3, 9, 15, 21, 27, 33, 39) which is what I believe you want, correct?