NUMERACAO DE NFE
Eu tambem faço assim.
Todos os dados da nota(exceto a numeração), entao na mesma procedure de gerar o xml, obviamente antes eu faço assim
1 numero = select ultimonumero +1
2 con.execute [Ô]update notafiscal set numeronf=numero where id=minhaid
[ô]gera chave de acesso
.
.
.
[ô] gera xml
.
.
Agora acho que ficou claro. Se na mesma hora aciona a linha 1 as duas notas terão o mesmo número.
Todos os dados da nota(exceto a numeração), entao na mesma procedure de gerar o xml, obviamente antes eu faço assim
1 numero = select ultimonumero +1
2 con.execute [Ô]update notafiscal set numeronf=numero where id=minhaid
[ô]gera chave de acesso
.
.
.
[ô] gera xml
.
.
Agora acho que ficou claro. Se na mesma hora aciona a linha 1 as duas notas terão o mesmo número.
Você realmente precisa [Ô]OCUPAR[Ô] o numero de NF de forma que outro usuário não utilize o mesmo número.
Eu gero o numero da NF somente na finalização do pedido, ou seja, o usuario vai digitando o pedido.Preenche como todos os dados da NFe, e somente gero o numero da nfe no momento de gerar o XML.
Neste momento eu vou ao banco e em uma tabela que gerencia sequencias eu gravo o numero atual + 1.
Eu gero o numero da NF somente na finalização do pedido, ou seja, o usuario vai digitando o pedido.Preenche como todos os dados da NFe, e somente gero o numero da nfe no momento de gerar o XML.
Neste momento eu vou ao banco e em uma tabela que gerencia sequencias eu gravo o numero atual + 1.
Bom dia galera.
FOXMAN, eu faço exatamente o mesmo que você.
Para tentar deixar mais claro, olha o inicio do meu botão que gera o xml.
Após este trecho eu gero o xml normalmente.
E mesmo fazendo isso eventualmente tenho problema de duas notas com o mesmo número. Acontece sempre ? Obviamente não. Mas quando acontece me da um trabalho do caramba arrumar manualmente isto.
FOXMAN, eu faço exatamente o mesmo que você.
Para tentar deixar mais claro, olha o inicio do meu botão que gera o xml.
Após este trecho eu gero o xml normalmente.
If frmNFe.cmbNumeroNota <> [Ô][Ô] Then
Sleep (1500)
Set dsverificasejatem = New ADODB.Recordset
dsverificasejatem.open [Ô]SELECT NUMERO FROM NOTAFISCAL WHERE NUMERO=[Ô] & Right(frmNFe.cmbNumeroNota, Len(frmNFe.cmbNumeroNota) - 9) & [Ô] and codigo<>[Ô] & varCodNotaFiscal, IIf(varBdExterno <> [Ô][Ô], con2, con), adOpenKeyset, adLockOptimistic
If Not dsverificasejatem.EOF Then
Set dsverificaultimonumero = New ADODB.Recordset
dsverificaultimonumero.open [Ô]select * from notafiscal where not isnull(numero) and numero <>0 order by numero[Ô], IIf(varBdExterno <> [Ô][Ô], con2, con), adOpenKeyset, adLockOptimistic
If Not dsverificaultimonumero.EOF Then
varanterior = 0
Sleep (1500)
[ô]con.execute [Ô]update notafiscal set numero=[ô][Ô] & Format(300, [Ô]000000000[Ô]) & [Ô][ô] where codigo=[Ô] & varCodNotaFiscal
Do While Not dsverificaultimonumero.EOF
DoEvents
VARULTIMANOTA = dsverificaultimonumero!numero
dsverificaultimonumero.MoveNext
Loop
IIf(varBdExterno <> [Ô][Ô], con2, con).Execute [Ô]update notafiscal set numero=[Ô] & Format(VARULTIMANOTA + 1, [Ô]000000000[Ô]) & [Ô] where codigo=[Ô] & varCodNotaFiscal
varNumeroNotaGerou = VARULTIMANOTA + 1
[ô]varNumeroNotaGerou = 300
End If
Else
varNumeroNotaGerou = Right(frmNFe.cmbNumeroNota, Len(frmNFe.cmbNumeroNota) - 9)
End If
Else
Set dsverificaultimonumero = New ADODB.Recordset
dsverificaultimonumero.open [Ô]select * from notafiscal where not isnull(numero) and numero <>0 order by numero desc[Ô], IIf(varBdExterno <> [Ô][Ô], con2, con), adOpenKeyset, adLockOptimistic
If Not dsverificaultimonumero.EOF Then
varanterior = 0
Sleep (1545)
[ô]con.execute [Ô]update notafiscal set numero=[ô][Ô] & Format(300, [Ô]000000000[Ô]) & [Ô][ô] where codigo=[Ô] & varCodNotaFiscal
DoEvents
VARULTIMANOTA = dsverificaultimonumero!numero
IIf(varBdExterno <> [Ô][Ô], con2, con).Execute [Ô]update notafiscal set numero=[Ô] & Format(VARULTIMANOTA + 1, [Ô]000000000[Ô]) & [Ô] where codigo=[Ô] & varCodNotaFiscal
varNumeroNotaGerou = VARULTIMANOTA + 1
[ô]varNumeroNotaGerou = 300
End If
End If
E mesmo fazendo isso eventualmente tenho problema de duas notas com o mesmo número. Acontece sempre ? Obviamente não. Mas quando acontece me da um trabalho do caramba arrumar manualmente isto.
Uso essa função que fiz a muito tempo e não tem erro...
Coloque ela em um modulo, crie uma tabela com a sequencia das notas por exemplo tabela --> S_NRO_NF
crie um campo chamado NEXTVAL do tipo int (uso int no caso do sql server)
coloque o valor 0 nele.
para usar a função crie uma variavel que ira pegar o nro da nota e use da seguinte maneira
vlNroNf = NroSequence(suaconexao,[Ô]S_NRO_NF[Ô])
e grave o nro da nota que estiver na variavel VlNroNf
Abs.
============================================================================================
Public Function NroSequenceSQL(ByRef aoConexao As ADODB.Connection, ByVal asNomeTabelaSequence As String) As Long
[ô]ONDE asNomeTabelaSequence E O NOME DE UMA TABELA QUE:
[ô] - CONTENHA UM REGISTRO (NEM MAIS NEM MENOS)
[ô] - TENHA UMA A COLUNA DE SEQUENCE SE CHAME [Ô]NEXTVAL[Ô]
Dim voRs As ADODB.Recordset, sSeq As String
Set voRs = New ADODB.Recordset
voRs.CursorLocation = adUseServer
voRs.Open [Ô]SELECT NEXTVAL FROM [Ô] & asNomeTabelaSequence, aoConexao, adOpenDynamic, adLockPessimistic, adCmdText
voRs!NEXTVAL.Value = voRs!NEXTVAL.Value + 1
voRs.Update
NroSequenceSQL = voRs!NEXTVAL
voRs.Close
Set voRs = Nothing
End Function
============================================================================================
Coloque ela em um modulo, crie uma tabela com a sequencia das notas por exemplo tabela --> S_NRO_NF
crie um campo chamado NEXTVAL do tipo int (uso int no caso do sql server)
coloque o valor 0 nele.
para usar a função crie uma variavel que ira pegar o nro da nota e use da seguinte maneira
vlNroNf = NroSequence(suaconexao,[Ô]S_NRO_NF[Ô])
e grave o nro da nota que estiver na variavel VlNroNf
Abs.
============================================================================================
Public Function NroSequenceSQL(ByRef aoConexao As ADODB.Connection, ByVal asNomeTabelaSequence As String) As Long
[ô]ONDE asNomeTabelaSequence E O NOME DE UMA TABELA QUE:
[ô] - CONTENHA UM REGISTRO (NEM MAIS NEM MENOS)
[ô] - TENHA UMA A COLUNA DE SEQUENCE SE CHAME [Ô]NEXTVAL[Ô]
Dim voRs As ADODB.Recordset, sSeq As String
Set voRs = New ADODB.Recordset
voRs.CursorLocation = adUseServer
voRs.Open [Ô]SELECT NEXTVAL FROM [Ô] & asNomeTabelaSequence, aoConexao, adOpenDynamic, adLockPessimistic, adCmdText
voRs!NEXTVAL.Value = voRs!NEXTVAL.Value + 1
voRs.Update
NroSequenceSQL = voRs!NEXTVAL
voRs.Close
Set voRs = Nothing
End Function
============================================================================================
Tópico encerrado , respostas não são mais permitidas