DUPLICANDO NÊMEROS DE DOCUMENTOS

ERLANMG 25/04/2014 11:42:33
#437612
Caros colegas, bom dia!

Tenho um sistema de emissão de CT-e desenvolvido em Vbnet com bd em MySql hospedado na Uolhost, pois vários pontos de apoio da empresa emitem o CT-e.

Mas ás vezes acontece de duplicar o número do documento, ou melhor nem duplicar o número, o número aparece uma única vez mais a receita rejeita o Ct-e pois diz que já existe um ct-e com o mesmo número, com isso pego a chave de acesso da mensagem da receita e consulto no portal do Ct-e e verifico que um outro ponto de apoio havia emitido um cte também naquele momento. Detalhe os dados que aparece no sistema é do segundo ct-e o rejeitado.

Segue abaixo algumas rotinas do sistema:

1 - Após clicar no botão enviar o sistema já gravar os dados no bd e faz todo o procedimento de envio, busca e geração da DACTE.

[txt-color=#e80000]Rotina para gerar número[/txt-color]
Try
Dim maior As Long
conn = New MySqlConnection
conn.ConnectionString = Con_S
SQL = [Ô]select max(numero) from cte where cnpj_emitente like [ô][Ô] & cnpj_emitente & [Ô][ô]and serie like [ô][Ô] & SerieCTe & [Ô][ô][Ô]
conn.Open()
cmd = New MySqlCommand(SQL, conn)
If IsDBNull(cmd.ExecuteScalar) Then
maior = 1
Else
maior = cmd.ExecuteScalar + 1
End If
cmd.ExecuteNonQuery()
txtNumCTe.Text = maior
txtNumCTe.Text = txtNumCTe.Text.PadLeft(9, [Ô]0[Ô])
conn.Close()
Catch
Me.Cursor = Cursors.Default
MessageBox.Show([Ô]Erro: Não foi possível conectar ao banco de dados.[Ô], [Ô]Sem conexão[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try

[txt-color=#e80000]rotina para gravar no bd de o Ct-e foi enviado[/txt-color]
If retorno = 103 Then
conn = New MySqlConnection()
conn.ConnectionString = Con_S
SQL = [Ô] update cte set [Ô]
SQL = SQL + [Ô]recibo = [ô][Ô] + nroRecibo + [Ô][ô],[Ô]
SQL = SQL + [Ô]status = [ô][Ô] + [Ô]ENVIADO[Ô] + [Ô][ô][Ô]
SQL = SQL + [Ô]where controle = [Ô] + xID
conn.Open()
cmd = New MySqlCommand(SQL, conn)
retorno = Nothing
retorno = cmd.ExecuteNonQuery()

[txt-color=#e80000]rotina para buscar resultado e gravar no bd[/txt-color]

[ô]===================BUSCA RESULTADO CT-E=======================
j = 0
Do While j = 50
j = j + 1
Loop
[ô]

Resultado = 105 [ô] inicializa resultado com 105, lote em processamento, a aplicação deve persistir na busca enquanto resultado = 105

Do While Resultado = 105
Enquanto o lote está em processamento aqui tem uma rotina de busca resultado
If Resultado = 105 Then
x = 0
Do While x = 50
x = x + 1
Loop
[ô] aguardar ALGUNS segundos para não ocorrer 656 - Rejeição: Consumo Indevido do WS
End If




Loop

[txt-color=#e80000]rotina para gravar no bd que o ct-e foi autorizado[/txt-color]
If Resultado = 100 Then
[ô] grava procCTe

[ô]
[ô]grava log do protocolo
[ô]

[ô] grava CT-e autorizado
[ô]
conn = New MySqlConnection()
conn.ConnectionString = Con_S
SQL = [Ô] update cte set [Ô]
SQL = SQL + [Ô]protocolo = [ô][Ô] + nProtocolo + [Ô][ô],[Ô]
SQL = SQL + [Ô]dt_autorizacao = [ô][Ô] + dAutorizacao + [Ô][ô],[Ô]
SQL = SQL + [Ô]status = [ô][Ô] + [Ô]AUTORIZADO[Ô] + [Ô][ô][Ô]
SQL = SQL + [Ô]where controle = [Ô] + xID
conn.Open()
cmd = New MySqlCommand(SQL, conn)
retorno = Nothing
retorno = cmd.ExecuteNonQuery()
If (retorno > 0) Then
[ô] [ô] MessageBox.Show([Ô]Dados alterados com sucesso![Ô], [Ô]Mensagem do Sistema[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
Me.Cursor = Cursors.Default
MessageBox.Show([Ô]Erro ao alterar dados. Favor verificar.[Ô], [Ô]Mensagem do Sistema[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

Não entrei em detalhes sobre as rotinas de envio, busca e geração de dacte pois acho que o problema é nesta atualizações que faço no bd.

Caso não entendem minha dúvida favor pergutarem que tento esclarecer melhor.

Desde já agradeço pela ajuda de todos.

Abraços,

NILSONTRES 25/04/2014 12:11:05
#437615
Resposta escolhida
Seria preciso ter um conhecimento maior do funcionamento, mas a principio, vc tem um grave erro ai, erro esse cometido por muitos.
Se um usuário acessar a base e selecionar o numero maior (select max(numero) from cte), ele já gravou na variavel esse numero, vamos supor que outro usuario
em seguida entra e consegue esse mesmo numero, visto que o processo do usuario anterior ainda não foi completado, entendeu ?
Ficam dois usuarios com o mesmo numero.
O correto é vc criar uma tabela onde vc vai acrescendo o numero e na tabela dos ctes deixar o campo numero como
chave primaria, nesse caso ele geraria u erro de duplicidade, vc identifica esse erro e acresce +1 ao numero, até que o erro pare.
ERLANMG 25/04/2014 14:30:32
#437618
Nilsontres,

Entendi o que você quiz dizer, ou seja, sempre está envolvido um ponto de apoio que fica na zona rural com isso internet via rádio e não muito rápida, por este motivo ele sempre está envolvido, por que ele pega numero maior (select max(numero) from cte) mas até concluir a instrução (insert) de gravar no bd outros pontos de apoio que usam internet velox, 3g, 4g conseguem pegar o mesmo número que este ponto de apoio da zona rural havia pego, gravam no bd na frente dele, e depois este ponto de apoio da zona rural grava os dados dele com o mesmo número e ao tentar enviar o ct-e para a receita a mesma retorna a mensagem de cte já autorizado com mesmo numero e série.

Acho que já vai amenizar os erros criando a chave primaria com o cnpj_emitente, numero e serie, pois havia criado uma chave primaria para o campo id.

Vou tentar corrigir os erros baseado no que vc falou.

Muito obrigado,.

Abraços,


NILSONTRES 25/04/2014 15:58:47
#437627
Não só pela lentidão da net, mas isso pode ocorrer até em sistemas off, por questão de milésimos de segundos.
NICKOSOFT 06/05/2014 06:51:05
#437883
uma pergunta idiota, não conheço o sistema, mas não seria mais vantagem usar um campo automático ai?
e por mais q esse campo não seja o chave ao envio, usa-lo como base ou parte do numero na hora do envio?
Tópico encerrado , respostas não são mais permitidas