Tem como fazer com string sim:
Partindo do suposto que sua string sempre terá a mesma estrutura: 4x o "|" , sendo a posição 3 e 4 com as informações que vc precisa.
Essa é uma função de teste, se tiver que mostrar a posição 3 e 4 na mesma coluna, vc vai precisar concatenar as informações.
Existem outras formas de resolver o problema, por exemplo, rodando um AT e buscando todas as posições do "|" e depois retornando com SUBSTR, mas dessa forma também funciona:
*******************
Function teste()
*******************
cString2 := "05|D|117,00|MARIA DE TESTE|"
nConta := 1
cTexto3 := ""
cTexto4 := ""
DO WHILE !EMPTY( cString2 )
nPos := AtSkipSTrings( "|", cString2 )
nConta++
IF nPos > 0
cString2 := SubStr( cString2, nPos+1 )
IF nConta = 3
cTexto3 := LEFT(cString2,AT("|",cString2)-1)
ELSEIF nConta = 4
cTexto4 := LEFT(cString2,AT("|",cString2)-1)
ENDIF
ELSE
cString2 := ""
ENDIF
ENDDO
MSGINFO(cTexto3)
MSGINFO(cTexto4)
RETURN(.T.)
Com o HB_ATokens também funciona:
*******************
Function teste()
*******************
cTexto3 := ""
cTexto4 := ""
cString2 := "05|D|117,00|MARIA DE TESTE|"
aTeste := Hb_ATokens(cString2,"|")
IF LEN(aTeste) > 3
cTexto3 := aTeste[3]
cTexto4 := aTeste[4]
ENDIF
MSGINFO(cTexto3)
MSGINFO(cTexto4)
RETURN(.T.)
Tudo vai depender da forma que esses dados são inseridos no browse. Se for um browse do tipo DBF vai ser um pouco mais complexo de encaixar do que o browse do tipo Array, mas também deve funcionar.