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
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.