Função para duplicar registro

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

Moderador: Moderadores

Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Função para duplicar registro

Mensagem por Softwhouse »

Alguém teria uma função para duplicar o registro no mesmo DBF ?

Tipo:

Código: Selecionar todos


For i = 1 To Arquivo->(Fcount())		    
	  AADD(aRows,{Arquivo->(FieldGet(i))})		       
Next

DbAppend()

For i = 1 To Arquivo->(Fcount())
      Arquivo->(FieldPut(i,aRows[i]))	 
Next

Não estou conseguindo transformar o tipo do campo para gravar no DBF.
Fernando
Avatar do usuário
rosalvo rosa
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 10 Jan 2006 19:21
Localização: Curitiba - PR

Função para duplicar registro

Mensagem por rosalvo rosa »

Olá

Você pode tentar assim:

Código: Selecionar todos

   Select(cArqDoador)
   Go nRecNoDoador
   If !Eof()
      Select(cArqRecebedor)
      APPEND BLANK
      Rlock()
      For zd:= 1 To (cArqDoador)->(FCount())
         For zr:= 1 To (cArqRecebedor)->(FCount())
            If (cArqRecebedor)->(FieldName(zr) == (cArqDoador)->(FieldName(zd)))
               (cArqRecebedor)->(FieldPut(zr,(cArqDoador)->(FieldGet(zd))))
               Exit
            EndIf
         Next
      Next
    
      Unlock
   EndIf

   
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Função para duplicar registro

Mensagem por Softwhouse »

Olá Rosalvo,

Obrigado, mas preciso duplicar no mesmo DBF.
Fernando
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Função para duplicar registro

Mensagem por ANDRIL »

Veja se serve.

Código: Selecionar todos

FUNCTION DuplicaReg()
// NSI - SOFWARES E SITES
// 27-05-2018 ANDRIL
LOCAL i, maxcmpArea2, arCmpRequisitados:={}

maxcmpArea2=fcount()
for i = 1 to maxcmpArea2
	aadd(arCmpRequisitados,fieldGet(i))
next

APPEND BLANK
for i = 1 to maxcmpArea2
	fieldPut(i,arCmpRequisitados[i])
next
return

DuplicaReg()
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Função para duplicar registro

Mensagem por Softwhouse »

Obrigado pessoal, vou testar e posto o resultado.
Fernando
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função para duplicar registro

Mensagem por JoséQuintas »

À primeira vista, a sua rotina está correta.
E o dbAppend() ? fez na área correta?
Talvez tenha faltado o lock() e unlock()

Ou por garantia, tente isto:

Código: Selecionar todos

Arquivo->( DuplicaRegistro() )


FUNCTION DuplicaRegistro()

   LOCAL aList := {}
   
   FOR nCont = 1 TO FCount()
      AAdd( aList, FieldGet( nCont ) )
   NEXT
   IF dbAppend() // seria melhor rotina com tratamento de erro
      FOR nCont = 1 TO FCount()
         FieldPut( nCont, aList[ nCont ] )
      NEXT
     SKIP 0
      UNLOCK
   ENDIF
   RETURN Nil
Mas espere um pouco:
"não estou conseguindo transformar o tipo de campo"
O que significa isso? se está gravando a mesma coisa, porque conversão?
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/
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Função para duplicar registro

Mensagem por Softwhouse »

Ollá Quintas,

Aí é que está o problema. Depois de carregar o Array, faça um For Netx e coloque ValType(Array). Retornará A. os campos são caractér, numéricos data, lógico, e todos são reconhecidos como A, não dá certo.
Fernando
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função para duplicar registro

Mensagem por JoséQuintas »

test.png
Aqui normal.
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

Função para duplicar registro

Mensagem por JoséQuintas »

Agora que percebi.....
No seu fonte colocou Add( ..., { valor } ) com chaves, ao invés de adicionar o campo, adicionou um array com o campo.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Função para duplicar registro

Mensagem por alxsts »

Olá!

Se você sabe exatamente qual registro (Recno()) quer duplicar, a maneira mais fácil seria:

Código: Selecionar todos

LOCAL nRecno

USE Teste SHARED NEW

nRecno := 11

APPEND FROM TESTE RECORD nRecno
[]´s
Alexandre Santos (AlxSts)
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Função para duplicar registro

Mensagem por Softwhouse »

Valeu Quintas eram as chaves mesmo o problema.

Alexandre, vou verificar essa possibilidade.

Obrigado a todos.
Fernando
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Função para duplicar registro

Mensagem por Jairo Maia »

E o dbAppend() ? fez na área correta?
Talvez tenha faltado o lock() e unlock()
José, ao usar DbAppend() ou APPEND BLANK, o novo registro criado já estará bloqueado e só se torna visível na rede após salvar os registros pendentes com DbCommit() ou COMMIT.

Se não passar o parâmetro DbAppend( .F. ), todos os registros bloqueados anteriormente serão desbloqueados se o arquivo foi aberto no modo SHARED. DbAppend() sem parâmetro assume .T. como parâmetro.
If DbAppend() has successfully locked the new record, all other records locks set in the database are released by default. To keep pending record locks in place, the value .F. (false) must be passed to DbAppend().
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função para duplicar registro

Mensagem por JoséQuintas »

Jairo Maia escreveu:José, ao usar DbAppend() ou APPEND BLANK, o novo registro criado já estará bloqueado e só se torna visível na rede após salvar os registros pendentes com DbCommit() ou COMMIT.
E porque precisaria de outros registros bloqueados, se está incluindo um novo?
Como sempre digo por aqui, NUNCA usei COMMIT, e NUNCA foi problema.
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