Edição de dados gerando duplicidade

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Piqueno
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 03 Out 2013 18:07
Localização: Monte Carmelo-MG

Edição de dados gerando duplicidade

Mensagem por Piqueno »

Bom dia,
Estou com uma aplicação dando erro na hora de editar o arquivo, esta gerando um novo arquivo,ficando em duplicidade,segue meu codigo;

Código: Selecionar todos

function edita_produto()
     local cOp:=space(1),cDescricao:=space(40),cValor:=space(6),cStatus:=space(20),cMarca:=space(20),cModelo:=space(10)
	 local sTela,sNovoCod:=0
	 stela:=savescreen(0,0,25,80)
	 
	 dbselectarea("produtos")
	 set wrap on
	 sNovoCod:=produtos->codprod
	 cDescricao:=produtos->descricao
	 cValor:=produtos->valor
	 cStatus:=produtos->status
	 cMarca:=produtos->marca
	 cModelo:=produtos->modelo
	 limpar(6,0,25,79)
	 @ 08,10 say    "Codigo: " +sNovoCod
	 @ 09,10 say    "Descricao: " get cDescricao picture "@!" valid !empty (cDescricao)
	 @ 10,10 say    "Valor: " get cValor picture "9999,99"
	 @ 11,10 say    "Status: " get cStatus
	 @ 12,10 say    "Marca: " get cMarca
	 @ 13,10 say    "Modelo: " get cModelo
	 	 @ 18,10 say "Deseja salvar Alteracao? (S/N)" get cOP
		 read
	    cOp:=inkey(0)
	    if upper(chr(cOP))="S"
		    dbsetorder(1)
			produtos->(dbgobottom())
			sNovoCod:=strzero(val(produtos->codprod)+1,4)
			append blank
			if rlock()
	         replace codprod with sNovoCod,;
			         descricao with cDescricao,;
                     valor with cValor,;
                     status with cStatus,;
                     marca with cMarca,;
                     modelo with cModelo
					 produtos->(dbcommit())
					 produtos->(dbrunlock())
			         alert("Produto Alterado")
			endif
		    else
			     alert("Nao Alterado")
        endif	 
return nil
Alguém pode me dar uma dica.
Editado pela última vez por Toledo em 23 Out 2013 20:10, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Edição de dados gerando duplicidade

Mensagem por jelias »

Amigo Piqueno.

Analisando o seu código posso observar que você executa o comando append blank, o que faz que o registro seja novamente inserido no banco de dados.
Por favor, veja se consegue entender as considerações que fiz no código abaixo.

Código: Selecionar todos

if upper(chr(cOP))="S"
    dbsetorder(1)
    produtos->(dbgobottom()) // Irá para o último registro, creio que não é isso que o amigo quer. 
                                           // Use o comando DBSEEK() para encontrar o produto que precisa.
                                           // Primeiro você precisa estar posicionado sobre o registro para depois salvar os dados. 
    sNovoCod:=strzero(val(produtos->codprod)+1,4)  // Pra mim este item também está errado, pois irá gerar um novo código. Talvez o amigo tenha aproveitado o código de outra rotina.

    append blank   // Aqui está o problema amigo. Irá inserir um novo registro.

    if rlock()
        replace codprod with sNovoCod,;  // Em caso e alteração, não é necessário gravar novamente o código. Penso que este procedimento evita erros. 
                   descricao with cDescricao,;
                   valor with cValor,;
                   status with cStatus,; 
                   marca with cMarca,;
                   modelo with cModelo
        produtos->(dbcommit())
        produtos->(dbrunlock())
        alert("Produto Alterado")
    endif
else
   a lert("Nao Alterado")
endif
return nil
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
Responder