marcioe Posted February 26, 2019 Report Share Posted February 26, 2019 Olá amigos Tudo bem Preciso pagar apenas determinada posição dentro de uma "string" Eu monto um Array de 08 Colunas assim DO WHILE painel_mesas->( !EOF()) T_LINHA1 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA2 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA3 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA4 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA5 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA6 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA7 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' painel_mesas->(dbSkip()) T_LINHA8 := STRZERO(painel_mesas->ID,02,0) +'|'+ IF(painel_mesas->TOTAL_MESA+painel_mesas->QTD_ITENS=0,'L',IF(painel_mesas->TEMPO_CORRIDO >= T_TEMPO_OCIOSO_MESAS,'D','O')) +'|'+ alltrim(TRANSFORM(painel_mesas->TOTAL_MESA,"@ZE 999,999.99")) +'|' + ALLTRIM(painel_mesas->IDENTIFICACAO_CLIENTE)+'|' aAdd( A_Array_Meas,{ IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA1),'') ,; &&& 1 MESA VERMELHA VERDE IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA2),''),; &&& 2 Numero da Mesa IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA3),''),; &&& 3 Numero da Mesa IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA4),''),; &&& 4 Numero da Mesa IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA5),''),; &&& 5 Numero da Mesa IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA6),''),; &&& 6 Tempo gasto IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA7),''),; &&& 6 Tempo gasto IF(!EMPTY(ALLTRIM(T_LINHA2)),ALLTRIM(T_LINHA8),'') } ) &&& 6 Tempo gasto DbSelectArea('painel_mesas') painel_mesas->(dbSkip()) ENDDO A_Array_Meas, que na sua primera Linha e coluna tem a segunte Informação 05|D|117,00|MARIA DE TESTE| ou seja 05| Pimera informação D| Segunda Informação 117,00| Terceira Informaçao MARIA DE TESTE| Quarta Informação Imagina que eu queira Exibir apenas as terceira e quarta Informação exemplo 117,00 e MARIA DE TESTE, Pensei em Usar hb_atokens(A_Array_Meas,"|) Mas não dá certo Teria uma outra forma de Fazer, ou seja eu pegar dentro a String Quote Link to comment Share on other sites More sharing options...
miragerr Posted February 26, 2019 Report Share Posted February 26, 2019 Ola, Boa noite Se você esta lendo a partir de um arquivo TXT, você pode fazer o seguinte. oFile := TTxtFile():New( "nome do arquivo" ) IF !oFile:Open() MsgStop("Impossivel Abrir arquivo "+CRLF+"<< "+NOME DO ARQUIVO+" >>","Atenção") LOOP EndIf aLinhas := {} DO While !oFile:Eof() aLines := HB_aTokens( oFile:ReadLine(), "|" ) AADD( aLinhas, aLines ) oFile:Skip() EndDo xBrowse( aLinhas, "e só escolher" ) Espero ter ajudado. Quote Link to comment Share on other sites More sharing options...
marcioe Posted February 27, 2019 Author Report Share Posted February 27, 2019 Olá, obrigado pela resposta. Mas imagina que já está no arquivo, e que já está fazendo forma que está no browser. Imagina que eu queira exibir apenas as posições 03, e 04 de cada linha e colunas, em um browse. Quote Link to comment Share on other sites More sharing options...
marcioe Posted February 27, 2019 Author Report Share Posted February 27, 2019 O gilmer me passou a seguinte ideia, e deu certo oDB_MESAS_ATENDIDAS:aCols[05]:bStrData := { || Mostra_Dados_Mesa((A_Array_Meas[oDB_MESAS_ATENDIDAS:nArrayAt][5])) } Function Mostra_Dados_Mesa(v_String_Analizar) Local v_Numero_Mesa := '', v_Status_mesa := '', v_Valor_Mesa:= '', v_Cliente_mesa := '', v_Texto_Pipe :='' v_Texto_Pipe := hb_atokens(v_String_Analizar,"|") FOR I := 1 TO LEN(v_String_Analizar) v_Numero_Mesa := alltrim(v_Texto_Pipe[1]) v_Status_mesa := alltrim(v_Texto_Pipe[2]) v_Valor_Mesa := alltrim(v_Texto_Pipe[3]) v_Cliente_mesa := alltrim(v_Texto_Pipe[4]) NEXT Return (v_Numero_Mesa +CRTLF+v_Valor_Mesa + CRTLF+ v_Cliente_mesa) Resolvido Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted February 27, 2019 Report Share Posted February 27, 2019 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. Quote Link to comment Share on other sites More sharing options...
marcioe Posted February 27, 2019 Author Report Share Posted February 27, 2019 Obrigado a Todos Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.