Página 1 de 1

Ascan array multdimensional

Enviado: 16 Fev 2023 10:18
por Itamar M. Lins Jr.
Olá!
aProd := {{'001','MESA'},{'002','CADEIRA'}}
Como eu uso com eficiência o ascan() neste caso para achar o código '0001' ? Tem milhares de código, descrição neste array.
Tive olhando com "for next"
IF AScan(aProd,... ?

Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 16 Fev 2023 11:01
por Itamar M. Lins Jr.
Olá!
Eu respondo para mim mesmo!

Código: Selecionar todos

function main
local cProd:='001', aProd := {{'001','MESA'},{'002','CADEIRA'},{'003','MARTELO'}}
? len(aProd)

? aProd[1][1]
? aProd[2][1]
? aProd[3][1]

? ascan( aProd, {|e|e[1] == cProd} )

return .t.
Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 19 Fev 2023 17:18
por JoséQuintas
Tem certeza disso?
codeblock não seria outra posição?
Por coincidência acabei neste post justamente procurando sobre isso.

Ascan array multdimensional

Enviado: 19 Fev 2023 17:25
por JoséQuintas
Manual do Harbour está confuso.
ascan1.png
ascan2.png

Ascan array multdimensional

Enviado: 19 Fev 2023 17:30
por JoséQuintas
Manual do Clipper
ascan3.png
Mas não define se o retorno do codeblock é .T./.F. ou valor

Ascan array multdimensional

Enviado: 19 Fev 2023 17:35
por JoséQuintas
ascan4.png
Olhando o do Harbour de novo:
Na descrição diz ok sobre o uso de codeblock.
Mas o exemplo usa diferente.

Ascan array multdimensional

Enviado: 19 Fev 2023 17:36
por Itamar M. Lins Jr.
Olá!
Tem certeza disso?
O teste fala por si. Já fiz aqui no SPED e deu certo...Quer dizer aparentemente está ok.

Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 19 Fev 2023 17:43
por JoséQuintas
Pois é.... fazendo igual o exemplo não funciona.
ascan5.png
Mas assim funciona
ascan6.png
Lembro de existir essa diferença, mas não lembro exatamente porque.
Uma prova de que isso existiu é o próprio exemplo.

Ascan array multdimensional

Enviado: 19 Fev 2023 17:50
por JoséQuintas
ascan7.png
Talvez confusão com ASort().... mas coincidência confundirem no exemplo.

Nota: apesar de eu ter testado hb_AScan(), AScan() tem o mesmo resultado.

Ascan array multdimensional

Enviado: 19 Fev 2023 17:52
por Itamar M. Lins Jr.
Olá!

Código: Selecionar todos

C:\fontes\exemplos>hbrun ascan.prg
hbshell: Atenção: Não é possível encontrar o 3rd/expat/expat.hbc (referenciado
         por C:\HB32\contrib\hbexpat\hbexpat.hbc)

         3
001
002
003
         1
         0
C:\fontes\exemplos>
Aqui está ok

Código: Selecionar todos

function main
local cProd:='001', aProd := {{'001','MESA'},{'002','CADEIRA'},{'003','MARTELO'}}
? len(aProd)

? aProd[1][1]
? aProd[2][1]
? aProd[3][1]

? ascan( aProd, {|e|e[1] == cProd} )
? ascan( aProd, 'MARTELO' )

return .t.
Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 22 Fev 2023 14:32
por carlaoonline
https://doc.alaska-software.com/content ... ascan.html
Localiza-> Search in an array na pagina

Nada que os mestres não saibam (tem exemplo igual mais acima citado), mas só pra constar mais um site de help para as pessoas normais.

Ascan array multdimensional

Enviado: 22 Fev 2023 14:42
por Itamar M. Lins Jr.
Olá!
Pois é! Da forma que mostrei é MUITO mais simples de entender e está correto.
No exemplo, do xBase++ Já tem adirectory() ai a pessoa não sabe como é estrutura do array de retorno... Tem mais um arquivo .CH para entender... etc..
Muito bla, bla, bla... Para ensinar pesquisa com codeblock.

Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 22 Fev 2023 14:52
por Itamar M. Lins Jr.
Olá!
Este exemplo aqui está errado!

Código: Selecionar todos

// The example shows a simple routine that translates 
// strings to numeric IDs and vice versa using a 
// two-dimensional array. 

#define ID_APPLES     100 
#define ID_PEARS      200 
#define ID_ORANGES    300 

PROCEDURE Main 
   CLS 
   ? Translate( ID_APPLES )                 // result: Apples 
   ? Translate( "Oranges" )                 // result: 300 
RETURN 

FUNCTION Translate( xValue ) 
   STATIC saTable := { ; 
     { ID_APPLES , "Apples"  }, ; 
     { ID_PEARS  , "Pears"   }, ; 
     { ID_ORANGES, "Oranges" }  ; 
   } 

   LOCAL i := AScan( saTable, xValue ) 

   IF i == 0 
      RETURN NIL 
   ENDIF 
RETURN IIF( Valtype(xValue)=="C", saTable[i,1], saTable[i,2] ) 
Não funciona no Harbour. O retorno no Harbour é NIl, NIL (não acha)

Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 09 Mar 2023 15:50
por Itamar M. Lins Jr.
Olá!
Usando asort em um vetor !

Código: Selecionar todos

function main
local n, cProd:='001', aProd := {{'003','MESA'},{'001','CADEIRA'},{'002','MARTELO'}}
? len(aProd)

? aProd[1][1]
? aProd[2][1]
? aProd[3][1]

? ascan( aProd, {|e|e[1] = cProd} )
? asort(aProd,,,{|x,y|x[1]<y[1]})

for n := 1 to len(aProd)
  ? aProd[n][1]
next

return .t.
Saudações,
Itamar M. Lins Jr.

Ascan array multdimensional

Enviado: 09 Mar 2023 18:59
por JoséQuintas

Código: Selecionar todos

// The example shows a simple routine that translates 
// strings to numeric IDs and vice versa using a 
// two-dimensional array. 

#define ID_APPLES     100 
#define ID_PEARS      200 
#define ID_ORANGES    300 

PROCEDURE Main 
   CLS 
   ? Translate( ID_APPLES )                 // result: Apples 
   ? Translate( "Oranges" )                 // result: 300 
RETURN 

FUNCTION Translate( xValue ) 
   LOCAL aList := { ; 
     { ID_APPLES , "Apples"  }, ; 
     { ID_PEARS  , "Pears"   }, ; 
     { ID_ORANGES, "Oranges" }  ; 
   } 
   LOCAL nPos

   IF ValType( xValue ) == "N"
      nPos := AScan( aList, { | e | e[ 1 ] == xValue } )
   ELSE
     nPos := ASCan( aList, { | e | e[ 2 ] == xValue } )
   ENDIF

   IF nPos == 0 
      RETURN NIL 
   ENDIF 

RETURN aList[ nPos, iif( Valtype( xValue ) == "C",  1, 2 ) ]
Corrigido, com nomes de variável simples, e sei lá se precisa ficar gastando memória com STATIC só pra isso.