[OFF] ONDE ESTA O ERRO NA ROTINA DE EXCLUSAO

USUARIO.EXCLUIDOS 20/08/2007 00:18:45
#231604
Prezados,

Abaixo código da rotina de exclusao de um form para registro de Pagamentos Cheques.
Não existe erro de sintaxe.
O BD é Access o projeto é em VB6 SP6 usando ADO e SQL para transações no BD.
Quando a rotina é executada, todos os comandos SQL são executados sem erro, entretanto ao finalizar o projeto nenhuma alteração é EFETIVADA no BD.
Trata-se de um erro de lógica simples.
Quem acertar primeiro leva a pontuação, se ninguém acertar eu posto a correção em 48 horas.
Não vale pedir mais informações. Todo o código necessário para resolver a questão está abaixo.
BOA SORTE A TODOS!

Private Sub ApagaPagamentosCheques()

' Confirmada a Exclusao
' Elimina Frete da Tabela PagamentosFretes se for o caso
If txtValorPgtoFrete.Text <> "" Then
' Elimina Frete
strSQL = ""
strSQL = "DELETE * FROM PagamentosFretes WHERE Vale = " & CLng(Format(txtVale.Text, "#####0"))
' Inicio da Transacao SQL
cnCeramica.BeginTrans
' Nomeia Label para Tratamento de Erro
On Error GoTo ErrPgtoChequeEXC
' Limpa Tabela de Errors
cnCeramica.Errors.Clear
' Executa Comando SQL
cnCeramica.Execute (strSQL)
End If

' Elimina Cheque da Tabela PagamentosCheques
strSQL = ""
strSQL = "DELETE * FROM PagamentosCheques WHERE NumeroPagamento = " & txtNumeroPagamento.Text

' Inicio da Transacao SQL
cnCeramica.BeginTrans
' Nomeia Label para Tratamento de Erro
On Error GoTo ErrPgtoChequeEXC
' Limpa Tabela de Errors
cnCeramica.Errors.Clear
' Executa Comando SQL
cnCeramica.Execute (strSQL)

' GRAVA CC de Clientes - EXCLUSAO de Pagamentos CHEQUES
Dim StrErr As Boolean
GravaCC txtCodigoCliente.Text, txtCodigoVendedor.Text, dteDataEmissao.Text, _
"EXCLUSAO Pagamento CHEQUE Numero: " & txtNumeroPagamento.Text, _
txtValorDoc, "0", "X", txtNumeroPagamento.Text, StrErr
If StrErr Then
' Erro Na Gravacao do CC do Cliente
MsgBox "EXCLUSAO - Erro na Gravacao do CC do Cliente."
Exit Sub
End If

' Efetiva a Transacao SQL nas Tabelas
cnCeramica.CommitTrans

Exit Sub

ErrPgtoChequeEXC:
' No caso de Erro Desfazer alteracoes nas Tabelas
cnCeramica.RollbackTrans
funGravaErro Err.Number, Err.Description, Err.Source
End Sub


------------------------------------------------------------------------------------------------

Public Function GravaCC(ByVal strCodigoCliente As String, ByVal strCodigoVendedor As String, _
ByVal strDataLancamento As String, ByVal strDesc As String, _
ByVal strValor As String, ByVal strValorComissao As String, _
ByVal strTipo As String, ByVal strNumero As String, _
ByVal bolErro As Boolean)
' Grava Dados na Tabela de Conta Corrente dos Clientes e Vendedores

' Ativa Tratamento de Erros
On Error GoTo ErrGravaCC

' Inicializa Variavel para Controle das transacoes SQL
bolSQLBeginTrans = False
' Definicao de Variveis Locais

....... (Diversos Comandos)


' Inicia Transacao SQL
cnCeramica.BeginTrans
bolSQLBeginTrans = True


........ (Diversos Comandos)


' Executa os Comandos SQL nas Tabelas do BD
cnCeramica.CommitTrans
bolSQLBeginTrans = False

Exit Function

ErrGravaCC:
' Se deu Erro DESFAZ alteracoes no BD
If bolSQLBeginTrans Then
cnCeramica.RollbackTrans
End If
funGravaErro Err.Number, Err.Description, Err.Source
End Function

USUARIO.EXCLUIDOS 20/08/2007 00:53:44
#231605
kra posso tah enganado mais no mysql num se usa * no delete

foi a unica coisa q eu axei de estranho

ahuahuuhah to cum sono

mais a tarde se tive sem resposta ainda eu vejo de novo

falo
ESLEYSANCHES 20/08/2007 02:18:49
#231606
Bom, isso é verdade e na minha opinião o tópico já está errado ... o nosso amigo ROBERTO disse que o erro iria ser apenas na lógica e como podemos ver já teve um erro na sintaxe.

Nenhum na instrução DELETE usa o * ... motivo ? Simples na lógica a instrução "SELECT *" indica para o gerenciador selecionar todos os campos, até ai tudo bem, mais oque tem o SELECT haver com o DELETE ? Simples se colocarmos DELETE * basicamente estamos querendo que ele exclua todos os campos da tabela <tal> cujo a ID seja igual a 1 ... hora isso é meio sem lógica, como vamos pedir para excluir todos os campos cujo a ID seja 1 ? Seria meio impossivel, por isso não existe o * na instrução DELETE.

Abraços, tbm estou com sono rsrsrs amanhã ... ou melhor hoje tenho que acordar às 06:45 !!
USUARIO.EXCLUIDOS 20/08/2007 02:39:33
#231607
Volto a dizer que não tem erro de sintaxe. o "*" funciona perfeitamente no Access.
Não tem erro no comando SQL.
:-)

USUARIO.EXCLUIDOS 20/08/2007 07:45:40
#231609
roberto nao achei nada de errado a nao ser nessa linha

cnCeramica.Execute (strSQL)

eu uso sem os parenteses so isso, mas pode ser que funciona com eles tambem,

cnCeramica.Execute strSQL

CRIS 20/08/2007 09:17:52
#231615
Citação:

strSQL = "DELETE * FROM PagamentosFretes WHERE Vale = " & CLng(Format(txtVale.Text, "#####0"))



Acredito que seja o tipo de dados passados.. ex.:
se o campo Vale for do tipo TEXTO, o parâmetro passado deve ter um "'" entr ele, caso Numerio ae fica sem o sinal.
Se não retorna nenhum erro, então a sua SQL não encontra o registro para ser excluído, logo o erro é sim na SQL. verifique o tipo d campo e como você passa o parâmetro.

Boa Sorte,

Cris
ALMARTI 20/08/2007 09:42:51
#231618
Também acho que deveria retirar o asterisco (*).

Outra coisa, é mesmo necessário ecluir fisicamente esta linha? Não prefere um update alterando um campo booleano por exemplo Excluido = True?
USUARIO.EXCLUIDOS 20/08/2007 09:54:11
#231621
Não existe problemas com o "*".
Volto a dizer o problema não é de sintaxe.
Todos os comandos SQL são executados corretamente.
O erro de lógica/estrutura já foi descoberto.
O objetivo aqui é repassar "conhecimento", ou seja, quando existe um erro simples que não se consegue explicar.
RESUMINDO O ERRO:
Após executar a procedure, todos os comandos SQL são executados corretamente. Entretanto ao dar LOGOUT no Sistema o BD dá um "rollback" e desfaz as alterações.
Esse "rollback" se dá por um erro no código acima.
A questão é ONDE ESTÁ O ERRO?
CRIS 20/08/2007 10:38:25
#231626
eu não disse que tem erro com o *, pois as vezes eu uso também, eu me refiro ao fato de encontrar ou não o Registro a ser excluído, se o campo for texto é possível que o registro não seja encontrado para ser excluído, poi isso o "'" (Apóstrofo).

Tive casos onde usei como parâmetros um TEXTO, e me esqueci de colocá-lo entre os Apóstrofos, ficando "'TEXTO'" isso não gerava nenhum erro, mas também o registro continuava no DB.

Ou.. no seu caso.. se você passa 000001 na SQL acredito que seja Diferente de 1 no SQL.

Você usa transações, logo teria um "Commit Transaction" no final o que impede o Rollback.

Opnião não é crítica! mas vale apena testar!

Boa Sorte
USUARIO.EXCLUIDOS 20/08/2007 10:43:30
#231629
Roberto,

Talvez o erro esteja justamente porque a transação é iniciada e logo após há uma nova inicialização da transação. O certo não seria um begintrans e um commitrans com rollback no caso de alterações ?
USUARIO.EXCLUIDOS 20/08/2007 11:09:45
#231633
CRIS,
O campo vale é numérico na Tabela (Clng...).
Volto a dizer que não existe erro de sintaxe.
O problema já foi resolvido, existe um erro de lógica/estrutura que não "efetiva" as alterações no BD.
Minha idéia é disseminar "conhecimento" e ao mesmo tempo colocar um problema "real" para ser analisado. Volto a dizer a solução é "simples".

Airton Ferreira,
Se vc tem uma sugestão no BginTans/CmmitTrans/RollBack favor postar.
At,
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas