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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

test.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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