Página 1 de 1

Função para duplicar registro

Enviado: 19 Mar 2021 14:57
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.

Função para duplicar registro

Enviado: 19 Mar 2021 15:34
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

   

Função para duplicar registro

Enviado: 19 Mar 2021 15:49
por Softwhouse
Olá Rosalvo,

Obrigado, mas preciso duplicar no mesmo DBF.

Função para duplicar registro

Enviado: 19 Mar 2021 17:28
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()

Função para duplicar registro

Enviado: 22 Mar 2021 09:51
por Softwhouse
Obrigado pessoal, vou testar e posto o resultado.

Função para duplicar registro

Enviado: 22 Mar 2021 09:59
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?

Função para duplicar registro

Enviado: 22 Mar 2021 14:23
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.

Função para duplicar registro

Enviado: 22 Mar 2021 15:19
por JoséQuintas
test.png
Aqui normal.

Função para duplicar registro

Enviado: 22 Mar 2021 15:24
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.

Função para duplicar registro

Enviado: 22 Mar 2021 16:40
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

Função para duplicar registro

Enviado: 22 Mar 2021 18:08
por Softwhouse
Valeu Quintas eram as chaves mesmo o problema.

Alexandre, vou verificar essa possibilidade.

Obrigado a todos.

Função para duplicar registro

Enviado: 23 Mar 2021 10:37
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().

Função para duplicar registro

Enviado: 23 Mar 2021 17:54
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.