Eu tenho uma função aqui, um pouco diferente.
O único detalhe é que não tenho certeza se todos os caracteres
acentuados estão considerados nos códigos ascii (variável c-asc). Caso
faltou algum, basta incluir o código ascii na variável (c-asc) e o
caracter a substituir na variável c-subst.
FUNCTION limpa-texto RETURNS CHAR (INPUT c-texto AS CHAR).
DEFINE VARIABLE i-aux AS INTEGER NO-UNDO.
DEFINE VARIABLE c-retorno AS CHARACTER INIT "" NO-UNDO.
DEFINE VARIABLE c-asc AS CHARACTER NO-UNDO.
DEFINE VARIABLE c-subst AS CHARACTER NO-UNDO.
DEFINE VARIABLE c-codasc AS INTEGER NO-UNDO.
DEFINE VARIABLE c-caracter AS CHARACTER NO-UNDO.
ASSIGN c-asc =
"225,233,237,243,250,193,201,205,211,218,224,232,236,242,249,192,200,204,210,217,226,234,238,244,251,194,202,206,212,219,228,235,239,246,252,196,203,207,214,220,227,245,195,213,231,199,186,170,254,167,183"
c-subst =
"a,e,i,o,u,A,E,I,O,U,a,e,i,o,u,A,E,I,O,U,a,e,i,o,u,A,E,I,O,U,a,e,i,o,u,A,E,I,O,U,a,o,A,O,c,C,o,a,c,o,u".
DO i-aux = 1 TO LENGTH(c-texto):
ASSIGN c-codasc = asc(SUBSTRING(c-texto,i-aux,1))
c-caracter = SUBSTRING(c-texto,i-aux,1).
IF c-codasc > 126 THEN DO:
ASSIGN c-retorno = c-retorno + IF LOOKUP(STRING(c-
codasc),c-asc) > 0 THEN ENTRY(LOOKUP(STRING(c-codasc),c-asc),c-subst)
ELSE string(c-codasc).
END.
ELSE
ASSIGN c-retorno = c-retorno + c-caracter.
END.
RETURN c-retorno.
END FUNCTION.