Clipper On Line • Ver Tópico - Pesquisar algo em algum lugar

Pesquisar algo em algum lugar

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

Moderador: Moderadores

 

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 12 Ago 2019 02:52

Parece piada... mas não é...
Estou tentando localizar aonde o aplicativo salva nota fiscal de remessa...
Acabei criando uma rotina interessante....
São duas pastas: atual e ./dbf_bhp

Pesquisar qualquer coisa em qualquer lugar.

/*
PPESQNUM - Pesquisar um numro
*/

#include "dbstruct.ch"
#include "directry.ch"
#include "inkey.ch"

PROCEDURE PPESQNUM

   LOCAL mNumero := 0, GetList := {}
   @ 1, 0 SAY "Numero:" GET mNumero PICTURE "999999"
   READ
   IF LastKey() == K_ESC
      RETURN
   ENDIF
   Pesquisa( ".\", mNumero )
   Pesquisa( ".\dbf_bhp\", mNumero )
   Mensagem( "Tecle ESC", " 27" )
   RETURN

STATIC FUNCTION Pesquisa( cPath, mNumero )

   LOCAL aFiles, nCont, cFile, nField, lEncontrou, xValue, aStru, nAtual, nTotal

   aFiles := Directory( cPath + "*.dbf" )
   FOR nCont = 1 TO Len( aFiles )
      cFile := cPath + aFiles[ nCont, F_NAME ]
      USE ( cFile )
      aStru := dbStruct()
      GOTO TOP
      nAtual := 0
      nTotal := LastRec()
      GrafTempo( Ltrim( Str( nCont ) ) + "/" + Ltrim( Str( Len( aFiles ) ) ) + " " + cFile )
      DO WHILE ! Eof()
         GrafTempo( nAtual++, nTotal )
         FOR nField = 1 TO Len( aStru )
            xValue     := FieldGet( nField )
            lEncontrou := .F.
            IF ValType( xValue ) == "N"
               IF xValue == mNumero
                  lEncontrou := .T.
               ENDIF
            ELSEIF ValType( xValue ) == "C"
               IF Ltrim( Str( mNumero ) ) $ xValue
                  lEncontrou := .T.
               ENDIF
            ENDIF
            IF lEncontrou
               SayScroll( "Encontrado em " + cFile + " " + FIeldName( nField ) + " " + Str( RecNo(), 6 ) )
               Errorsys_WriteErrorLog( "Encontrado em " + cFile + " " + FIeldName( nField ) + " " + ;
                  Str( RecNo(), 6 ) + " " + Transform( xValue, "" ) )
               Inkey(1)
            ENDIF
         NEXT
         SKIP
      ENDDO
      USE
   NEXT

   RETURN NIL


Agora ver se realmente está em algum lugar....

Encontrado em .\arqmv2.dbf ORDEM 3789 053629
Encontrado em .\artmov.dbf CODIGO 10858 53629
Encontrado em .\artmov.dbf CODIGO 10859 53629
Encontrado em .\b0100.dbf CGC 5984 01536291000108
Encontrado em .\b0100.dbf CGC 13044 09536294000145
Encontrado em .\b0100.dbf COD_CLI 62869 53629
Encontrado em .\b0800.dbf ORDEM 52995 053629
Encontrado em .\b0800.dbf DOC 107504 1536299
Encontrado em .\b0800.dbf DOC 107505 1536299
Encontrado em .\b1300.dbf ORDEM 67177 053629
Encontrado em .\b1300.dbf ORDEM 67178 053629
Encontrado em .\b1300.dbf ORDEM 67179 053629
Encontrado em .\b1300.dbf DOC 134469 1536299
Encontrado em .\b1300.dbf DOC 134470 1536299
Encontrado em .\b1600.dbf COD_CLI 116309 53629
Encontrado em .\b1700.dbf COD_CLI 289710 53629
Encontrado em .\b1700.dbf COD_CLI 289711 53629
Encontrado em .\b1700.dbf COD_CLI 289712 53629
Encontrado em .\b1700.dbf COD_CLI 289713 53629
Encontrado em .\b1700.dbf COD_CLI 289714 53629
Encontrado em .\b5800.dbf COD_FLG 120173 053629
Encontrado em .\b5800.dbf COD_FLG 120174 053629
Encontrado em .\b5800.dbf CODIGO 249395 53629
Encontrado em .\b5800.dbf CODIGO 249396 53629
Encontrado em .\b6400.dbf ORDEM 21030 053629
Encontrado em .\b6400.dbf COD_FLG 51094 053629
Encontrado em .\b6400.dbf CODIGO 99509 53629
Encontrado em .\client.dbf CGC 5986 01536291000108
Encontrado em .\cliente.dbf CGC 6033 01536291000108
Encontrado em .\clientes.dbf CGC 5983 01536291000108
Encontrado em .\cpcli.dbf COD_CLI 64847 53629
Encontrado em .\cpcli.dbf COD_CLI 64848 53629
Encontrado em .\kitmov.dbf CODIGO 2765 53629
Encontrado em .\mov03.dbf COD_FLG 95121 053629
Encontrado em .\mov03.dbf COD_FLG 95122 053629
Encontrado em .\mov03.dbf CODIGO 212638 53629
Encontrado em .\mov03.dbf CODIGO 212639 53629
Encontrado em .\dbf_bhp\b2500.dbf COD_PRO 8157 053629
Encontrado em .\dbf_bhp\b2600.dbf COD_PRO 15384 053629
Encontrado em .\dbf_bhp\b2600.dbf COD_PRO 15401 053629
Encontrado em .\dbf_bhp\b2900.dbf COD_PRO 25971 053629
Encontrado em .\dbf_bhp\b3000.dbf COD_PRO 24751 053629
Encontrado em .\dbf_bhp\b3200.dbf COD_PRO 15278 053629
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 12 Ago 2019 10:09

Ajustei depois a saída pra ordem de grandeza pra visualizar melhor:

arquivo, registro, campo, valor

arquivo.dbf 1022 COD_CLI 055732
arquivo.dbf 1035 CNPJ 11.111.111/1111-11

Nem assim achei aonde fica a nota fiscal kkkkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor gilbertosilverio » 13 Ago 2019 06:47

Ola Quintas,

Baseado em dois exemplos teu, montei esta rotina de pesquisa, só que infelizmente não consigo listar o conteúdo de uma pasta dentro de outra, no caso a pasta teste2, que esta dentro da pasta TEMP

Backup
___+ TESTE1
___+ TEMP
_______+ TESTE2

Uso a rotina SUBPASTAS() para copiar as NFes que estão em uma unica subpastas e hoje brincando com esta rotina que você postou, vi que não puxa o conteúdo quando ha outra pasta dentro da subpasta.

Onde errei no código SUBPASTAS_DBF().
FUNCTION PESQUISAR_ALGO()
   PRIVATE mNumero := 0, GetList := {}, cTXT:=SPAC(14)
   PRIVATE aFiles:={}, nCont, cFile, nField, lEncontrou, xValue, aStru, nAtual, nTotal

   PRIVATE cLocal_dos_arquivos := [C:\BACKUP]

   mNumero := VAL(MSGGETTEXTO( [Pesquisar EAN ], [entre o texto p/pesquisa], @cTXT, [9999999999999] ))

   SubPastas_DBF( cLocal_dos_arquivos, @aFILES, cLocal_dos_arquivos) // Pesquisa subpasta

//HWG_MSGINFO(STR(LEN(aFILES)))

   FOR nCont = 1 TO Len( aFiles )
      cFile := aFiles[ nCont, F_NAME ]

//hwg_msgstop( str(nCONT,3)+[ => ]+alltrim(cFILE) )

      USE ( cFile ) NEW ALIAS TESTE

      aStru := dbStruct()
      GOTO TOP
      nAtual := 0
      nTotal := LastRec()

      TAMANHO:=TESTE->(LASTREC()) ; nLIDAS:=1

      oBar:=HProgressBar():NewBox( alltrim(cFILE)+" "+lTrim(strZERO(nLIDAS,9))+" De "+ALLTRIM(strZERO(TAMANHO,9))+" Registro(s)",,,750,,TAMANHO)

      DO WHILE ! Eof()
         FOR nField = 1 TO Len( aStru )
            xValue     := FieldGet( nField )
            lEncontrou := .F.
            IF ValType( xValue ) == "N"
               IF xValue == mNumero
                  lEncontrou := .T.
               ENDIF
            ELSEIF ValType( xValue ) == "C"
               IF Ltrim( Str( mNumero ) ) $ xValue
                  lEncontrou := .T.
               ENDIF
            ENDIF
            IF lEncontrou
               HWG_MSGINFO("Encontrado em " + cFile +CRLF+CRLF+ FIeldName( nField ) + CRLF+CRLF + Str( RecNo(), 6 ))
            ENDIF
         NEXT
         TESTE->(DBSKIP())

         oBar:Step(alltrim(cFILE)+[ ]+lTrim(strzero(nLIDAS++,9))+" De "+ALLTRIM(Strzero(TAMANHO,9))+" Registro(s)")

      ENDDO
      USE
      oBAR:CLOSE()
   NEXT
RETURN NIL

FUNCTION SubPastas_DBF( cPath, gFILE, cPathFound )
   LOCAL xFiles, oELement, aARQUI:={}
   xFiles := Directory( cPath+[\]+ "*.*", "D" )
//HWG_MSGINFO(STR(LEN(xFILES)))
   FOR EACH oElement IN xFiles
      IF "D" $ oElement[ F_ATTR ] .AND. oELement[ F_NAME ] != "." .AND. oELement[ F_NAME ] != ".."
         cPath  := cPathFound+[\]+oELement[ F_NAME ]
         aARQUI := Directory( cPath+[\]+"*.dbf" )
         FOR EACH oELement in aARQUI
             AADD ( @gFILE, { cPath+"\"+oELement[1] })
         NEXT
         aARQUI:={}
         SubPastas_DBF( cPath+"\", @gFile, @cPathFound )
      ENDIF
   NEXT
RETURN NIL

gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 13 Ago 2019 08:55

Seu fonte tá confuso, tá misturando as coisas, duas funções Directory() aonde deveria ser uma só.
Sua rotina recursiva tem que tratar somente o diretório atual e nada mais.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 13 Ago 2019 09:17

Acabei precisando processar muitas outras pastas, então modifiquei o fonte.
Veja como a divisão "por assunto" fica interessante.

Assunto 1: o que pesquisar, por onde começar

#include "dbstruct.ch"
#include "directry.ch"
#include "inkey.ch"

PROCEDURE ppesqnum

   LOCAL mNumero := 0, GetList := {}

   @ 1, 0 SAY "Numero:" GET mNumero PICTURE "999999"
   READ
   IF LastKey() == K_ESC
      RETURN
   ENDIF
   Pesquisa( ".\", mNumero )
   Mensagem( "Tecle ESC", " 27" )

   RETURN


Assunto 2: Vasculhar pastas
Nota: vai ver aqui como seu fonte tinha fonte demais e misturava as coisas
STATIC FUNCTION Pesquisa( cPath, mNumero )

   LOCAL aFiles, nCont, cFile, nKey := 0

   aFiles := Directory( cPath + "*.*", "D" )
   FOR nCont = 1 TO Len( aFiles )
      cFile := cPath + aFiles[ nCont, F_NAME ]
      IF nKey == K_ESC
         EXIT
      ENDIF
      nKey := Inkey()
      IF "D" $ aFiles[ nCont, F_ATTR ]
         IF AScan( { ".", ".." }, aFiles[ nCont, F_NAME ] ) == 0
            Pesquisa( cPath + aFiles[ nCont, F_NAME ] + "\", mNumero )
         ENDIF
      ELSEIF ! ".dbf" $ Lower( cFile )
      ELSE
         PesquisaNoDbf( cFile, nCont, Len( aFiles ), @nKey, mNumero )
      ENDIF
   NEXT

   RETURN NIL

Assunto 3: Processar um único arquivo
STATIC FUNCTION PesquisaNoDbf( cFile, nDbfAtual, nDbfTotal, nKey, mNumero )

   LOCAL aStru, nField, cTxt, xValue, lEncontrou, nAtual, nTotal

   USE ( cFile )
   IF ! Used()
      RETURN NIL
   ENDIF
   aStru := dbStruct()
   GOTO TOP
   nAtual := 0
   nTotal := LastRec()
   GrafTempo( Ltrim( Str( nDbfAtual ) ) + "/" + Ltrim( Str( nDbfTotal ) ) + " " + cFile )
   DO WHILE ! Eof()
      IF nKey == K_ESC
         EXIT
      ENDIF
      nKey := Inkey()
      GrafTempo( nAtual++, nTotal )
      FOR nField = 1 TO Len( aStru )
         xValue     := FieldGet( nField )
         lEncontrou := .F.
         IF ValType( xValue ) == "N"
            IF xValue == mNumero
               lEncontrou := .T.
            ENDIF
         ELSEIF ValType( xValue ) == "C"
            IF Ltrim( Str( mNumero ) ) $ xValue
               lEncontrou := .T.
            ENDIF
         ENDIF
         IF lEncontrou
            cTxt := "Encontrado em " + ;
               cFile + " " + ;
               Str( RecNo(), 6 ) + " " + ;
               FieldName( nField ) + " " + ;
               Transform( xValue, "" )
            SayScroll( cTxt )
            ErrSys_WriteErrorLog( cTxt )
            Inkey(1)
         ENDIF
      NEXT
      SKIP
   ENDDO
   USE

   RETURN NIL


A propósito... não deu certo para o meu caso.
Tem nome inválido de DBF, tem DBF faltando DBT... e ao tentar abrir, dá erro.
O tratamento de erros do Flagship não foi suficiente pra impedir o erro, e acaba não indo até o final.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 13 Ago 2019 09:29

Voltando a sua rotina:
Pra que duas Directory(), se a rotina já é pra isso?

FUNCTION SubPastas_DBF( cPath, gFILE, cPathFound )
   LOCAL xFiles, oELement, aARQUI:={}
   xFiles := Directory( cPath+[\]+ "*.*", "D" )
//HWG_MSGINFO(STR(LEN(xFILES)))
   FOR EACH oElement IN xFiles
      IF "D" $ oElement[ F_ATTR ] .AND. oELement[ F_NAME ] != "." .AND. oELement[ F_NAME ] != ".."
         cPath  := cPathFound+[\]+oELement[ F_NAME ]
         aARQUI := Directory( cPath+[\]+"*.dbf" )
         FOR EACH oELement in aARQUI
             AADD ( @gFILE, { cPath+"\"+oELement[1] })
         NEXT
         aARQUI:={}
         SubPastas_DBF( cPath+"\", @gFile, @cPathFound )
      ENDIF
   NEXT
RETURN NIL


E aproveitando recursos do Harbour, o FOR/EACH

aFileList := {}
ProcuraDbf( "c:\", @aFileList )

FUNCTION ProcuraDbf( cPath, aFileList )

   LOCAL oFile

   FOR EACH oFile IN Directory( cPath + "*.*", "D" )
      IF "D" $ oFile[ F_ATTR ]
         IF oFile[ F_NAME ] != "." .AND. oFile[ F_NAME ] != ".."
            ProcuraDbf( cPath + oFile[ F_NAME ] + "\" , @aFileList )
         ENDIF
      ELSE
         AAdd( aFileList, cPath + oFile[ F_NAME ] )
      ENDIF
   NEXT
RETURN NIL


Nota: ok, array não precisa "@" pra passar por referência, mas prefiro passar a variável e não o array.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor gilbertosilverio » 13 Ago 2019 09:38

Quintas,

Seu fonte tá confuso, tá misturando as coisas, duas funções Directory() aonde deveria ser uma só.
Sua rotina recursiva tem que tratar somente o diretório atual e nada mais.


Confuso, nem me fale, fiz o que precisava pra hora, deu certo, fiquei de voltar e corrigir, e ficou como estava... kkkk

Sabe aquela hora que você esta na correria, que o contador te pede algo que o fisco precisa, pesquisa no fórum, acha uma rotina que você precisa pra aquela hora, deu certo, toca o barco e vai pra outra... kkkkk

Foi isso...

Como achei interessante esta tua rotina de pesquisar algo no DBF, quis ver como funcionava, pois já passei por isso também, tendo que saber onde esta certo informação...

Agora tenho dois problemas a resolver... E bom que o Alzheimer não me pega...

:-Y :-Y :-Y :-Y
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 13 Ago 2019 10:00

Errei numa coisa na hora de postar esse último fonte:
Faltou filtrar somente DBF.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 13 Ago 2019 10:02

Talvez aqui:

      ELSEIF ".dbf" $ Lower( oFile[ F_NAME ] )
         AAdd( aFileList, cPath + oFile[ F_NAME ] )
      ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Pesquisar algo em algum lugar

Mensagempor asimoes » 13 Ago 2019 10:28

Quintas,

Poderia usar thread pra ficar mais rápido ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Pesquisar algo em algum lugar

Mensagempor JoséQuintas » 13 Ago 2019 17:57

asimoes escreveu:Poderia usar thread pra ficar mais rápido ?


Acho que ficaria muuuuito pior.
Se a lentidão é por acesso a disco, de nada adianta acessar mais disco ao mesmo tempo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 22 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro