Página 1 de 1

sub-array ao invés de array linguição

Enviado: 05 Fev 2023 20:52
por JoséQuintas
Teste básico com 3 níveis (ou seriam 4)

Código: Selecionar todos

PROCEDURE Main

   LOCAL aList := {}, aUF, aCidade, aBairro, aInfo

   SetMode(30,100)
   CLS
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )

   FOR EACH aUF IN aList
      FOR EACH aCidade IN aUF[ 2 ]
         FOR EACH aBairro IN aCidade[ 2 ]
            FOR EACH aInfo IN aBairro[ 2 ]
               ? "UF:" + aUF[ 1 ] + ;
                 ", Cidade:" + aCidade[ 1 ] + ;
                 ", Bairro:" + aBairro[ 1 ] + ;
                 ", Nome:" + aInfo[ 1 ] + ", End:" + aInfo[ 2 ] + ", DOC:" + aInfo[ 3 ]
            NEXT
         NEXT
      NEXT
   NEXT
   Inkey(0)

   RETURN

FUNCTION AddArray( aList, cUF, cCidade, cBairro, cNome, cEndereco, cCnpj )

   LOCAL nPosUf, aListCidade, nPosCidade, aListBairro, nPosBairro, aListNomes

   nPosUF := AScan( aList, cUF )
   IF nPosUF == 0
      AAdd( aList, { cUF, {} } )
      nPosUF := Len( aList )
   ENDIF
   aListCidade := aList[ nPosUF, 2 ]
   nPosCidade := ASCan( aListCidade, cCidade )
   IF nPosCidade == 0
      AAdd( aListCidade, { cCidade, {} } )
      nPosCidade := Len( aListCidade )
   ENDIF
   aListBairro := aListCidade[ nPosCidade, 2 ]
   nPosBairro := ASCan( aListBairro, cBairro )
   IF nPosBairro == 0
      AAdd( aListBairro, { cBairro, {} } )
      nPosBairro := Len( aListBairro )
   ENDIF
   aListNomes := aListBairro[ nPosBairro, 2 ]
   AAdd( aListNomes, { cNome, cEndereco, cCnpj } )

   RETURN Nil
Num array gigantesco, AScan() pode se tornar lento.
Então, criando em níveis, fica menos coisas pro Ascan() testar.

Nota: meu menu principal do aplicativo é assim

sub-array ao invés de array linguição

Enviado: 05 Fev 2023 20:58
por JoséQuintas
Nota: no caso de string, ou troca pra hb_ASCan() indicando comparação exata, ou usa o SET EXACT ON.

sub-array ao invés de array linguição

Enviado: 05 Fev 2023 21:01
por JoséQuintas
test.png

sub-array ao invés de array linguição

Enviado: 05 Fev 2023 21:07
por JoséQuintas
Anterior parecia certo, mas estava errado, falhou ASCan()

Código: Selecionar todos

PROCEDURE Main

   LOCAL aList := {}, aUF, aCidade, aBairro, aInfo

   SetMode(30,100)
   CLS
   Inkey(0)
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )
   AddArray( aList, "SP", "SAO PAULO", "CENTRO", "JOSE", "RUA 1", "123" )

   FOR EACH aUF IN aList
      FOR EACH aCidade IN aUF[ 2 ]
         FOR EACH aBairro IN aCidade[ 2 ]
            FOR EACH aInfo IN aBairro[ 2 ]
               ? "UF:" + aUF[ 1 ] + ;
                 ", Cidade:" + aCidade[ 1 ] + ;
                 ", Bairro:" + aBairro[ 1 ] + ;
                 ", Nome:" + aInfo[ 1 ] + ", End:" + aInfo[ 2 ] + ", DOC:" + aInfo[ 3 ]
            NEXT
         NEXT
      NEXT
   NEXT
   Inkey(0)

   RETURN

FUNCTION AddArray( aList, cUF, cCidade, cBairro, cNome, cEndereco, cCnpj )

   LOCAL nPosUf, aListCidade, nPosCidade, aListBairro, nPosBairro, aListNomes

   nPosUF := AScan( aList, { | e | e[ 1 ] == cUF } )
   IF nPosUF == 0
      AAdd( aList, { cUF, {} } )
      nPosUF := Len( aList )
   ENDIF
   aListCidade := aList[ nPosUF, 2 ]
   nPosCidade := ASCan( aListCidade, { | e | e[ 1 ] == cCidade } )
   IF nPosCidade == 0
      AAdd( aListCidade, { cCidade, {} } )
      nPosCidade := Len( aListCidade )
   ENDIF
   aListBairro := aListCidade[ nPosCidade, 2 ]
   nPosBairro := ASCan( aListBairro, { | e | e[ 1 ] == cBairro } )
   IF nPosBairro == 0
      AAdd( aListBairro, { cBairro, {} } )
      nPosBairro := Len( aListBairro )
   ENDIF
   aListNomes := aListBairro[ nPosBairro, 2 ]
   AAdd( aListNomes, { cNome, cEndereco, cCnpj } )

   RETURN Nil
test.png
No primeiro, mostra aList[1..5], mas não são 5 UFs.
No segundo fez corretamente.