Observemos as 2 linhas abaixo:
3O|1|00509236||^^^HDL|||||||||||Serum||||||||||QC94R|1|^^^HDL|37.7|mg/dl||N||F||||2013050610234
3O|1|509236||^^^Trig|||||||||||Serum||||||||||QC94R|1|^^^Trig|139.0|mg/dl||N||F||||2013050610234
-O comprimento das linhas é variável, como observamos acima;
-São 2 exames do mesmo paciente, nº 509236.
-Vamos nos ater ao conteúdo da 2ª linha.
-No xHarbour para buscar o ID do paciente eu uso as funções AT() e RAT(), como abaixo
n_Pos2 := AT( "||^^^", c_Linha ) - 01 && n_Pos2 = 11 da posição do "6".
n_Pos1 := RAT( "|", c_Linha, n_Pos2 ) + 01 && n_Pos1 = 6 da posição do "5".
c_Id := SUBS( c_Linha, n_pos1, n_Pos2-n_Pos1 ) && resulta "509236".
-No xHarbour a função AT() pesquisa da esquerda para a direita, e a função RAT() pesquisa da direita para a esquerda.
-No Harbour MiniGui:
n_Pos2 := AT( "||^^^", c_Linha ) - 01 && n_Pos2 = 11 da posição do "6".
n_Pos1 := RAT( "|", c_Linha, n_Pos2 ) + 01 && n_Pos1 = 83 sempre, mesmo usando outros valores para o 3º parâmetro.
Eu consegui buscar o valor dsejado usando sub-string, como abaixo:
n_Pos4 := HB_AT( "||^^^", c_Linha ) - 02 && Posição 11.
c_L1 := LEFT( c_Linha, n_Pos4 ) && Sub-string, "3O|1|509236".
n_Pos3 := HB_RAT( "|", c_L1 ) + 01 && Posição 6.
c_CodPac := SUBS( c_L1, n_Pos3 ) && ID "509236"
Conclusão: Ou eu ainda não entendi como funciona esta função HB_RAT, ou então temos um BUG.
Alguém tem alguma informação ou instrução de como se usa ?
Ou então uma outra função que faça o desejado ?
Estou usando a versão 3.1.1 do Harbour.