Copy to na Memoria, é possível?
Moderador: Moderadores
-
Adalberto
- 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?
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
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
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Copy to na Memoria, é possível?
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.
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.
Itamar M. Lins Jr.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Copy to na Memoria, é possível?
Olá!
Criando um DBF na memoria.
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.
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 */
RETURNSaudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Copy to na Memoria, é possível?
Olá!
É 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
Usando apenas recursos do Harbour, não é possível fazer isto com COPY TO.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?
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 10COPY 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.
É 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)
Alexandre Santos (AlxSts)
-
Adalberto
- 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?
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
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
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Copy to na Memoria, é possível?
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.
Saudações,
Itamar M. Lins Jr.
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.
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
-
Adalberto
- 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?
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.
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Copy to na Memoria, é possível?
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.
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.
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)
Alexandre Santos (AlxSts)