Jump to content
Fivewin Brasil

PEGAR PARTE DE UMA COLUNA DO ARRAY SEPARADO POR | pipe (Resolvido)


marcioe

Recommended Posts

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

 

 

111111111111111111.jpg?1551214226

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
 

Link to comment
Share on other sites

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.


 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...