Du kannst dir ein Array mit dim(n) für die Felder mit varying definieren.

d Source 120 varying
d MyField 100 dim(20)
d AktPos 5I 0
d EndPos 5I 0
d FInd 5I 0

c/free
Source = %trimr(Quellfeld) + ";"; // Endekennzeichen setzen
FInd = 1;
for AktPos = 1 to %len(Source);

select
when substr(Source:AktPos:1) = """";

for EndPos = AktPos + 1 to %len(Source);

select;
when %subst(Source:EndPos:1) = """"""; // 2 Anführungszeichen
MyField(Find) += %subst(Source:EndPos:1);
EndPos += 1;

when %subst(Source:EndPos:2) = """;"; // Feldende
AktPos = EndPos + 2;
FInd += 1;
leave;

other;
MyField(Find) += %subst(Source:EndPos:1);

endsl;
next;

other;

EndPos = %scan(";":AktPos:Source);
if EndPos = *zero; // letztes Feld
EndPos = %len(Source) + 1;
endif;
if AktPos = EndPos; // Leerfeld
AktPos = EndPos + 1;
else;
MyField(Find) = %subst(Source:AktPos:EndPos-AktPos);
endif;
AktPos = EndPos + 1;
Find += 1;
endsl;

next;


Das Ganze erhebt keinen Anspruch auf Vollständigket.