Copy to na Memoria, é possível?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Copy to na Memoria, é possível?

Mensagem por Adalberto »

Amigos e professores, boa tarde.

Mais uma vez venho pedir ajuda.

É possível fazer com que o comando COPY TO copie o conteúdo, ou parte do conteúdo, de um .DBF para um arquivo na memória?

se possível ... por favor me diga qual o comando apropriado ou as cláusulas necessárias.

Muito grato a cada um de vocês, desejo-lhes muita prosperidade.

Adalberto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Copy to na Memoria, é possível?

Mensagem por Itamar M. Lins Jr. »

Olá!
Onde o arquivo está não importa.
Se na memória ou HD/SSD/TCP/FTP...
Como vc acessa o arquivo na memória ?
Qual programa foi que jogou/criou esse arquivo na memória ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Copy to na Memoria, é possível?

Mensagem por Itamar M. Lins Jr. »

Olá!
Criando um DBF na memoria.

Código: Selecionar todos

REQUEST HB_MEMIO

PROCEDURE Main()

   LOCAL tmp

   dbCreate( "mem:test", { { "F1", "N", 9, 0 } }, , .T., "memarea" )
   FOR tmp := 1 TO 1000
      dbAppend()
      FIELD->F1 := hb_Random() * 1000000
   NEXT
   INDEX ON FIELD->F1 TAG f1
   dbEval( {|| QOut( FIELD->F1 ) } )
   dbCloseArea()
   dbDrop( "mem:test" )  /* Free memory resource */

   RETURN
Agora, se o arquivo já está lá na memória e não foi a sua aplicação que criou(XLS/MDB...), vai precisar conversar com ele via ADO por exemplo.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Copy to na Memoria, é possível?

Mensagem por alxsts »

Olá!
Adalberto escreveu:É possível fazer com que o comando COPY TO copie o conteúdo, ou parte do conteúdo, de um .DBF para um arquivo na memória?
Usando apenas recursos do Harbour, não é possível fazer isto com COPY TO.
COPY TO <targetFile> ;
[FIELDS <fieldNames,...> ;]
[<Scope> ; ]
[WHILE <lWhileCondition> ;]
[FOR <lForCondition> ;]
[VIA <rddName>]
[SDF | DELIMITED [WITH BLANK | TAB | PIPE | <xDelimiter> ]

TO <targetFile>
This is the name of the target file as a literal character string or a character expression enclosed in parentheses. When the file name is specified without a file extension, .dbf is assumed as default extension, unless the SDF or DELIMITED option is specified. In this case, the default file extension is .txt.

The file in the current work area can be opened in SHARED mode. COPY TO creates the target file and opens it in EXCLUSIVE mode while data is being exported.
COPY TO cria o arquivo destino no sistema de arquivos. Não cria em memória. A única forma de fazer COPY TO copiar para a memória, seria criar um drive em memória. Veja How to Set up and Use a Ram Drive in Windows 10

É possível fazer a cópia criando uma rotina escrita em Harbour, sem utilizar COPY TO.
Basta:
1 - criar a tabela em memória, com o layout desejado, conforme o exemplo acima, do Itamar
2 - abrir a tua tabela destino (em memória)
3 - abrir a tua tabela origem (em disco)
4 - ler a tabela origem, selecionando os registros e colunas desejados
5 - fazer append na tabela destino, gravando os registros e colunas desejados
[]´s
Alexandre Santos (AlxSts)
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Copy to na Memoria, é possível?

Mensagem por Adalberto »

Bom dia a todos, amigos e professores.

Meu agradecimento especial a Itamar e alxsts pela ajuda.

Alxsts, como você me disse, así é que estou trabalhando, mas pensei em acelerar um pouco com o comando COPY TO.

Eu continuo a agradecer sua ajuda.

Deus os abençoe e dê prosperidade.

Abraços Adalberto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Copy to na Memoria, é possível?

Mensagem por Itamar M. Lins Jr. »

Olá!
Quando eu migro uma estrutura de DBF para outra, por exemplo quando eu crio mais um campo na estrutura do DBF, eu uso esse recurso para PUXAR os dados.

Código: Selecionar todos

   MyAppendFrom("old","new",cTempDBF) 

***************************************
FUNCTION MyAppendFrom(cAO,cAD,cTempDBF) //cAO = Alias Origem, cAD Alias Destino
***************************************
*
*
LOCAL nCount, nCampos := (cAD)->(FCount()), x:=1, nRec:=1, nTotRec := (cAO)->(LastRec())

oBar := HProgressBar():NewBox("Importando " + cTempDBF + ", " + (cAO)->(Dbf()) + ": "+lTrim(str(1,9))+" De "+lTrim(Str(nTotRec,9))+" Registro(s)" ,,0,400,, nTotRec, nTotRec,,.f. )

DO WHILE (cAO)->(!Eof())
   (cAD)->(dbAppend())

   FOR nCount := 1 TO nCampos
      cField := (cAD)->(Field(nCount))      
      IF ( (cAO)->(fieldpos( cField )) != 0 )
         (cAD)->&cField := (cAO)->&cField
      ENDIF
   NEXT
   (cAO)->(dbSkip())
   iif(x++==100,(nRec+=x,x:=1,ShowGrafico(oBar,nRec,nTotRec)),.t.)
EndDO

oBar : Close()   
FechaDb(cAD)
FechaDb(cAO)

RETURN .T.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Copy to na Memoria, é possível?

Mensagem por Adalberto »

Itamar, bom dia, Deus te abençoe muito.

Agradeço a função MyAppendFrom que você compartilhou.

Tenho uma função que faz esse trabalho, mas a sua função é mais prática.
Vou ver a melhor maneira de fazer as mudanças que preciso.

Mais uma vez agradeço sua boa vontade.

Um grande abraço, Adalberto.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Copy to na Memoria, é possível?

Mensagem por alxsts »

Olá!

Revisitando este tópico:

Testei o comando COPY TO copiando para um DBF em memória. Ele até cria o arquivo destino mas não copia os registros.

Criei um exemplo usando as funções hb_vf*, sugeridas no tópico mapeamento, e verifiquei que estas funções tem suporte para DBF em memória. Funciona perfeitamente no Harbour que usei (Harbour 3.2.0dev (r1612161005) ) Nightly.
Capturar.JPG
Capturar.JPG (18.85 KiB) Exibido 1636 vezes

Código: Selecionar todos

/*
   Compilação: hbmk2 teste hbmemio.hbc -w3 -es2
   Alexandre Santos - Fórum Clipper On Line
*/
REQUEST HB_MEMIO
REQUEST DBFCDX

#define   lNewArea   .T.
#define   lShared    .T.

PROCEDURE Main()
  
   LOCAL tmp, oErr, cColor
 
   cls

   BEGIN SEQUENCE

      // seleciona o RDD "DBFCDX"
      RddSetDefault( "DBFCDX" )
      // abertura automática do índice CDX
      SET AUTOPEN ON
      // abertura automática da tag 1
      SET AUTORDER TO 1

      cColor := Setcolor( "B/W/W+/B" )

      // Cria um DBF no disco e o deixa aberto...
      dbCreate( "test", { { "F1", "N", 9, 0 } }, , .T., "test" )

      // popula com 1000 registros...
      FOR tmp := 1 TO 1000
         dbAppend()
         FIELD->F1 := hb_Random() * 1000000
      NEXT

      // cria um índice...
      OrdCreate( "Test", "F1", "F1"  )
   
      // fecha o arquivo do disco...
      dbCloseArea()
   
      // copia o DBF e o CDX para a memória...
      hb_vfCopyFile( "test.dbf", "mem:test.dbf" )
      hb_vfCopyFile( "test.cdx", "mem:test.cdx" )

      // deleta o DBF e o CDX do disco...
      hb_vfErase( "test.dbf" )
      hb_vfErase( "test.cdx" )

      // abre o DBF e o CDX na memória...
      DbUseArea( lNewArea, "DBFCDX" , "mem:test", "Test", lShared )

      DbGoTop()

      // exibe os registros...
      Browse( 05, 25, 20, 55 )

      // fecha  os arquivos da memória
      dbCloseArea()
      
      // deleta os arquivos da memória - Free memory resource
      dbDrop( "mem:test.dbf" )
      dbDrop( "mem:test.cdx" )

      Setcolor( cColor ) ; SetPos( 0, 0 ) ; Scroll( 0, 0, MaxRow(), MaxCol() )
   RECOVER USING oErr 
      hb_Alert(  { PadC( "*** Uma exceção não tratada foi encontrada ***", 50 ), ;
      Replicate( "_", 50 ), "", ;
      PadR( " Erro       : " + oErr:description, 50 ), ;
      PadR( " Operação   : " + oErr:operation, 50 ), ;
      PadR( " Subsistema : " + oErr:subsystem, 50 ), ;
      PadR( " Subcódigo  : " + LTrim( Str( oErr:subcode ) ), 50 ), ;
      PadR( " Programa   : " + procfile(), 50 ), ;
      PadR( " Procedure  : " + procName(), 50 ), ;
      PadR( " Linha      : " + LTrim( Str( ProcLine() ) ), 50 ), "", "", ;
      Replicate( "_", 50 ), "" },, "W+/N" )
   END SEQUENCE
RETURN
[]´s
Alexandre Santos (AlxSts)
Responder