Ir para conteúdo
Fórum Script Brasil
  • 0

Transações


Luiz Humberto

Pergunta

Estou desenvolvendo um sitema que vai ser usando em rede, estou com uma dúvida no seguinte:

Tenho um form chamado compras e nele contem os itens da compras, sendo que no Banco de dados(estou usando SqlServer2000) possui uma tabela compra e outra item_compra.

Sendo que quando o usuário clica no botão cadastrar primeiro faço a inserção nos dados da tabela compra e depois faço uma função para retornar o ultimo codidgo para inserir então na tabela item_compra, fiz isto quando o sistema estava sendo construido agora que ele vai ser usado por vários usuarios isto geraria inconsistencia nos meus dados.

   Dim ConnADO As ADODB.Connection
   Set ConnADO = New ADODB.Connection
   ConnADO.Open StrConn 'String de conexão com o banco

   ConnADO.BeginTrans
       
       SQL_Query = " Insert Into Compra(Cod_Fornecedor,Cod_Usuario,Valor_Nota_Fiscal," _
                     & " Serie_Nota_Fiscal,Numero_Nota_Fiscal,Data_Entrega)" _
                     & " Values(" & ComboFornecedor.ItemData(ComboFornecedor.ListIndex) & "," _
                     & " " & CodigoUsuario & ",'" & MaskVlrNota.Text & "'," _
                     & " '" & TxtSNotaFiscal & "','" & TxtNNotaFiscal.Text & "'," _
                     & " '" & Fix(CDbl(CDate(MaskDataEntrega))) & "')"
                     
   ConnADO.Execute SQL_Query

Não estou sabendo como pegar o codigo desta transção(Codigo da Compra)

Alguém pode sugirir como devo proceder.

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Nestas situações costumo pegar o número de outro lugar (outra tabela feita só para isso, um recordset em um arquivo XML ou mesmo um arquivo texto). Ao fazer isso, já atualizo o número incrementando +1. Como a atualização nesse caso é super rápida e é extremamente difícil que dois usuários consigam tentar obter o número ao mesmo tempo (exatamente no mesmo tempo), nunca tive problemas com essa idéia.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Por exemplo, com um arquivo texto a idéia seria a seguinte:

Public Function GetNewCode() As Long
  arquivo = "arquivo.txt"
  If Dir(arquivo) <> "" Then
    n = FreeFile()
    Open arquivo For Input As #n
    Input #n, unk
    Close #n
    retorno = Val(unk) + 1
  Else
    retorno = 1
  End If
  n = FreeFile()
  Open arquivo For Output As #n
  Print #n, retorno
  Close #n
  GetNewCode = retorno
End Function
Daí, sempre que for necessário pegar um novo código, basta chamar a função GetNewCode(). Exemplo:
msgbox GetNewCode()

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Vou aproveitando o tópico do nosso amigo......

eu sempre penso nessa possibilidade de dois usuarios pegarem as ids juntos...

em ASP existe alguma coisa do tipo lock.application ou application.lock (não lembro agora)...

mas a função desse comando é fazer uma fila de espera no código, enquanto um tiver executando determinada parte do código, os outros usuários ficaram esperando.... isso é feito pelo global.asa, teria alguma coisa similar em vb???

pois isso evita o risco de um usuario pegar a id de outro....

até mais

Link para o comentário
Compartilhar em outros sites

  • 0
Graymalkin,

Obrigado pela ajuda, só mais uma pergunta como seria com esta opção

"outra tabela feita só para isso"

valeu

Eu por exemplo, tenho uma tabela no banco de dados chamada "Numera". Nela existe um campo para guardar o número atual. Crio então uma função bem similar ao exemplo anterior no qual pega-se o valor do campo, soma-se +1 e atualiza-se a tabela. Algo tipo:

public function GetNewCode()
  codigo = cn.Execute("SELECT campo AS ncodigo FROM tabela").Fields("ncodigo").Value
  novocodigo = codigo+1
  cn.Execute "UPDATE tabela SET campo=" & novocodigo & " WHERE campo=" & codigo
  GetNewCode = novocodigo
end function

Onde "cn" é um ADODB.Connection e, nesse exemplo, estou assumindo que a tabela não estava vazia e que só o primeiro registro é utilizado.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Vou aproveitando o tópico do nosso amigo......

eu sempre penso nessa possibilidade de dois usuarios pegarem as ids juntos...

em ASP existe alguma coisa do tipo lock.application ou application.lock (não lembro agora)...

mas a função desse comando é fazer uma fila de espera no código, enquanto um tiver executando determinada parte do código, os outros usuários ficaram esperando.... isso é feito pelo global.asa, teria alguma coisa similar em vb???

pois isso evita o risco de um usuario pegar a id de outro....

até mais

Não sei se o SQL Server tem algo do tipo para bloquear o acesso a tabela enquanto outro usuário a está utilizando. Com Access e ADO não consegui fazer isso, no entanto, pelo menos aos meus propósitos, a técnica acima funciona perfeitamente.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

esse comando que eu falei não seria no banco, mas em um aquivo que todos os aplicativos em redes usam, como em ASP o global.asa é usado para todos os browsers, as alterações são feitas no mesmo arquivo para todos os usuarios.... seria um objeto do VB e não do banco.....

mas tudo bem, não deve ter, se o Graymalkin não sabe, não deve ter heheheh

até mais

Link para o comentário
Compartilhar em outros sites

  • 0
esse comando que eu falei não seria no banco, mas em um aquivo que todos os aplicativos em redes usam, como em ASP o global.asa é usado para todos os browsers, as alterações são feitas no mesmo arquivo para todos os usuarios.... seria um objeto do VB e não do banco.....

mas tudo bem, não deve ter, se o Graymalkin não sabe, não deve ter heheheh

até mais

Sim, eu entendi. Apenas falei sobre o banco porque seria a única coisa que estaria, de certa forma, "ligando" os programas que o utilizam. Mas, é claro, existe uma maneira "manual" de se fazer isso.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...