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

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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

Mensagem por JoséQuintas »

Nota: no caso de string, ou troca pra hb_ASCan() indicando comparação exata, ou usa o SET EXACT ON.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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

Mensagem por JoséQuintas »

test.png
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder