DUPLICANDO NÊMEROS DE DOCUMENTOS
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,
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,
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.
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.
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,
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,
Não só pela lentidão da net, mas isso pode ocorrer até em sistemas off, por questão de milésimos de segundos.
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?
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