none
AutoNumeração RRS feed

  • Pergunta

  •  

    Boas,

     

     Estou com seguinte problema : Em VB2008 tenho uma bd sql e cada vez que é inserido um novo registo ( update ), é imprimido um relatório com os produtos inseridos que capturo no form, só que não sei como capturar para impressão o número atribuido pela autonumeração.

     

     No BindingBavigator dá a informação da posição do item na bd que não é o mesmo da base de dados.

     

     Como posso capturar, o último número atribuido pela autonumeração ?

     

     Obrigado pela ajuda

     

      Jorge Costa

     

     

    quarta-feira, 12 de março de 2008 04:09

Respostas

  • Boa tarde!!!!

     

    Faça uma função para retornar a ultima posição:

     

    Retorna último registro DataRow, DataSet, DataTable ( Copie esse codigo para modulo )

    Public Function Posicao(ByVal Conexao As System.String, _

    ByVal ComandoSQL As System.String, _

    ByVal Tabela As System.String, _

    Optional ByVal Mensagem As System.String = "", _

    Optional ByVal SobrePorMsg As System.Boolean = True _

    ) As DataRow

    Dim DF_cnSQL As System.Data.SqlClient.SqlConnection = _

    New System.Data.SqlClient.SqlConnection(Conexao)

    DF_cnSQL.Open()

    Dim DaControle As System.Data.SqlClient.SqlDataAdapter

    Dim DsControle As System.Data.DataSet

    Dim DtControle As System.Data.DataTable

    Try

     

    DaControle = New System.Data.SqlClient.SqlDataAdapter(ComandoSQL, DF_cnSQL)

    DsControle = New System.Data.DataSet

    DtControle = New System.Data.DataTable

    DaControle.Fill(DsControle, Tabela)

    DtControle = DsControle.Tables(Tabela)

     

    If Mensagem = "" Then

    Mensagem = "Erro ao Encher o DataRow!"

    End If

    Return DtControle.Rows(0)

    DF_cnSQL.Close()

    DF_cnSQL.Dispose()

    Catch exSql As System.Data.SqlClient.SqlException

    MsgBox("Erro apartir do Banco de Dados -> " & exSql.Message & " " & exSql.StackTrace, MsgBoxStyle.Critical, SobrePorMsg)

    Catch ex As System.Exception

    MsgBox("Erro apartir dos Controles -> " & ex.Message & " " & ex.StackTrace, MsgBoxStyle.Critical, SobrePorMsg)

    End Try

    Return Posicao(Conexao, ComandoSQL, Tabela)

    End Function

     

    Dim Posic As Integer

    Posic = Posicao("SuaCoenxao", "Select TOP 1 ID_campo From MyTabela Order By ID_Campos DESC;", "Posicao")("ID_Posicao")

    quarta-feira, 12 de março de 2008 20:57
  • pode tambem capturar via stored procedure caso esteja utilizando o SQLSERVER2005 veja o link abaixo.

    http://www.macoratti.net/07/06/vbn5_vci.htm

     

    blz.. Ou você pode criar uma instrução SQL que pegue o ultimo valor

     

    dim strSQL as string = ''SELECT MAX(ID) FROM NOME_DA_TABLE;"

    dim cmd as new sqlcommand(strsql, conexao)

    ...

    certo

     

    quarta-feira, 12 de março de 2008 21:13
  • Você pode criar uma procedure com uma variável de retorno, onde esta procedure recebe o código que foi feito o insert ou update e na aplicação você recebe este código:

     

    -- Criando a Tabela

    CREATE TABLE tb_teste(

    id int IDENTITY(1,1) NOT NULL,

    nome varchar(50) NULL,

    )

     

    --Criando a procedure

    Create procedure Cadastrar

    @id as int = null ,

    @nome as varchar(200) = null,

    @codigo as int output

    as

    if not exists (select tb_teste.id from tb_teste where id =@id)

    begin

       insert into tb_teste values(@nome)

       set @codigo = scope_identity() --Aqui está sendo passado para variável de retorno

    end

    else

    begin

            update tb_teste  

            set nome = Isnull(@nome, nome)

            where id = @id

            set @codigo = @id --recebe o id que foi realizado o update

    end

     

     

     

    Na aplicação onde você for executar e passar os parametros para a procedure, você cria um parametro para receber esta variavel de retorno. 

     

    'Parâmetro de retorno do 'id' gerado no banco de dados

    SQL_Command.Parameters.Add(New SqlParameter("@codigo", SqlDbType.Int)).Direction = ParameterDirection.Output

    var_recebecodigo = SQL_Command.Parameters("@codigo").Value

     

     

     

    Espero ter ajudado!!!!

     

     

    Robinson Cruz

     

     

     

     

     

     

     

     

     

     

    quinta-feira, 13 de março de 2008 13:32
  • CARA EU USO ASSIM E FUNCIONA.........

    SE VC ESTICER USANDO DAO. VC USA ANTES DO UPDATE SE FOR ADO APOS.

     

    LABAL1 OU TEXT1 VC QUEM DECIDE....

     

    LABEL1 = TB1!CODIGO

     

    NO BOTÃO GRAVAR

    SO ISSO SRRSRSRSRSRS

     

     

    quinta-feira, 13 de março de 2008 17:04
  • Boas,

     

     Relembro que queria capturar o número do último lançamento para impressão. Resolvi a situação de maneira, bem simples :

     

     Na propriedade DataBindings – Text, de um label atribuí a coluna da autonumeração como DataSource.

     

     Como após fazer o update, a última linha continua selecionada até a execução do AddNew(), capturo este número através do label, exemplo :

     

       e.Graphics.DrawString(Me.Label1.Text, Fonte9, Brushes.Black, MargemDireita - 65, MargemSuperior - 68, New StringFormat())

     

    Obrigado a todos pelas vossas dicas e sugestões, pois apesar de não ter resolvido o meu problema com nenhuma delas, ajudaram-me a encontrar a melhor solução.

     

     

     Até à próxima

     

     Jorge Costa

     

    quinta-feira, 13 de março de 2008 20:29

Todas as Respostas

  • Boa tarde!!!!

     

    Faça uma função para retornar a ultima posição:

     

    Retorna último registro DataRow, DataSet, DataTable ( Copie esse codigo para modulo )

    Public Function Posicao(ByVal Conexao As System.String, _

    ByVal ComandoSQL As System.String, _

    ByVal Tabela As System.String, _

    Optional ByVal Mensagem As System.String = "", _

    Optional ByVal SobrePorMsg As System.Boolean = True _

    ) As DataRow

    Dim DF_cnSQL As System.Data.SqlClient.SqlConnection = _

    New System.Data.SqlClient.SqlConnection(Conexao)

    DF_cnSQL.Open()

    Dim DaControle As System.Data.SqlClient.SqlDataAdapter

    Dim DsControle As System.Data.DataSet

    Dim DtControle As System.Data.DataTable

    Try

     

    DaControle = New System.Data.SqlClient.SqlDataAdapter(ComandoSQL, DF_cnSQL)

    DsControle = New System.Data.DataSet

    DtControle = New System.Data.DataTable

    DaControle.Fill(DsControle, Tabela)

    DtControle = DsControle.Tables(Tabela)

     

    If Mensagem = "" Then

    Mensagem = "Erro ao Encher o DataRow!"

    End If

    Return DtControle.Rows(0)

    DF_cnSQL.Close()

    DF_cnSQL.Dispose()

    Catch exSql As System.Data.SqlClient.SqlException

    MsgBox("Erro apartir do Banco de Dados -> " & exSql.Message & " " & exSql.StackTrace, MsgBoxStyle.Critical, SobrePorMsg)

    Catch ex As System.Exception

    MsgBox("Erro apartir dos Controles -> " & ex.Message & " " & ex.StackTrace, MsgBoxStyle.Critical, SobrePorMsg)

    End Try

    Return Posicao(Conexao, ComandoSQL, Tabela)

    End Function

     

    Dim Posic As Integer

    Posic = Posicao("SuaCoenxao", "Select TOP 1 ID_campo From MyTabela Order By ID_Campos DESC;", "Posicao")("ID_Posicao")

    quarta-feira, 12 de março de 2008 20:57
  • pode tambem capturar via stored procedure caso esteja utilizando o SQLSERVER2005 veja o link abaixo.

    http://www.macoratti.net/07/06/vbn5_vci.htm

     

    blz.. Ou você pode criar uma instrução SQL que pegue o ultimo valor

     

    dim strSQL as string = ''SELECT MAX(ID) FROM NOME_DA_TABLE;"

    dim cmd as new sqlcommand(strsql, conexao)

    ...

    certo

     

    quarta-feira, 12 de março de 2008 21:13
  • Você pode criar uma procedure com uma variável de retorno, onde esta procedure recebe o código que foi feito o insert ou update e na aplicação você recebe este código:

     

    -- Criando a Tabela

    CREATE TABLE tb_teste(

    id int IDENTITY(1,1) NOT NULL,

    nome varchar(50) NULL,

    )

     

    --Criando a procedure

    Create procedure Cadastrar

    @id as int = null ,

    @nome as varchar(200) = null,

    @codigo as int output

    as

    if not exists (select tb_teste.id from tb_teste where id =@id)

    begin

       insert into tb_teste values(@nome)

       set @codigo = scope_identity() --Aqui está sendo passado para variável de retorno

    end

    else

    begin

            update tb_teste  

            set nome = Isnull(@nome, nome)

            where id = @id

            set @codigo = @id --recebe o id que foi realizado o update

    end

     

     

     

    Na aplicação onde você for executar e passar os parametros para a procedure, você cria um parametro para receber esta variavel de retorno. 

     

    'Parâmetro de retorno do 'id' gerado no banco de dados

    SQL_Command.Parameters.Add(New SqlParameter("@codigo", SqlDbType.Int)).Direction = ParameterDirection.Output

    var_recebecodigo = SQL_Command.Parameters("@codigo").Value

     

     

     

    Espero ter ajudado!!!!

     

     

    Robinson Cruz

     

     

     

     

     

     

     

     

     

     

    quinta-feira, 13 de março de 2008 13:32
  • Continuando,

     

    Fiz um teste na aplicação e deu certo, o exemplo abaixo mostra uma msgbox com o id de retorno. Caso o exemplo seja útil para você, basta você adaptar na sua aplicação.

     

    Exemplo:

     

     

     

    Private Sub Savar()

    Dim con As New SqlConnection

    Dim cmd As New SqlCommand

    Dim codigoretorno As Integer

     

    con.ConnectionString = "suastringdeconexão"

    cmd.Connection = con

     

    'Armazena a variável de retorno

    cmd.Parameters.Add(New SqlParameter("@codigo", SqlDbType.Int)).Direction = ParameterDirection.Output

     

    cmd.Parameters.Add("@nome", SqlDbType.VarChar).Value = "PessoaTeste"

    cmd.CommandText = "Cadastrar" ' Nome da procedure

    cmd.CommandType = CommandType.StoredProcedure

    con.Open()

    cmd.ExecuteNonQuery()

    con.Close()

    codigoretorno = cmd.Parameters("@codigo").Value 'passa para a variavel o id de retorno

    MsgBox(codigoretorno.ToString)

    End Sub

     

     

    Abraços.

     

    Robinson Cruz

     

     

     

    quinta-feira, 13 de março de 2008 13:59
  • CARA EU USO ASSIM E FUNCIONA.........

    SE VC ESTICER USANDO DAO. VC USA ANTES DO UPDATE SE FOR ADO APOS.

     

    LABAL1 OU TEXT1 VC QUEM DECIDE....

     

    LABEL1 = TB1!CODIGO

     

    NO BOTÃO GRAVAR

    SO ISSO SRRSRSRSRSRS

     

     

    quinta-feira, 13 de março de 2008 17:04
  • Boas,

     

     Relembro que queria capturar o número do último lançamento para impressão. Resolvi a situação de maneira, bem simples :

     

     Na propriedade DataBindings – Text, de um label atribuí a coluna da autonumeração como DataSource.

     

     Como após fazer o update, a última linha continua selecionada até a execução do AddNew(), capturo este número através do label, exemplo :

     

       e.Graphics.DrawString(Me.Label1.Text, Fonte9, Brushes.Black, MargemDireita - 65, MargemSuperior - 68, New StringFormat())

     

    Obrigado a todos pelas vossas dicas e sugestões, pois apesar de não ter resolvido o meu problema com nenhuma delas, ajudaram-me a encontrar a melhor solução.

     

     

     Até à próxima

     

     Jorge Costa

     

    quinta-feira, 13 de março de 2008 20:29