none
Evento "Se não estiver na lista" RRS feed

  • Pergunta

  • Bom dia.
    Tenho um banco de dados com um formulário com diversos Combo que abrem cada um itens de tabelas específicas (cbo01Modelo da tblModelo, etc...). Tenho um código no evento "se não estiver na lista" em apenas um deles que serve para poder adicionar um novo item caso este não esteja na respectiva tabela (código no final).
    O que eu queria era uma maneira de colocar este código em todos os combos, mas sem ter de escrever em cada um o código todo. Como meu conhecimento é básico, imaginei um módulo, uma classe ou o que seja correto aqui, que eu pudesse chamar como se fosse uma função e ele me retornasse a execução, a partir de cada combo.
    No código ele usa o nome do objeto (cboLISTAPRODUTO_01_NotInList), da tabela e do campo. Precisaria levar esse valor para a função e fazê-la executar especificamente para este combo. Não sei se é possível nem como, se for.
    Se algupém tiver idéias e puder da uma ajuda agradeço

    Dim Db As DAO.Database
    Dim rs As DAO.Recordset
    Dim Msg As String
    
    On Error GoTo Err_cboLISTAPRODUTO_01_NotInList
        If NewData = "" Then Exit Sub
        Msg = "'" & NewData & "' não faz parte desta lista." & vbCr & vbCr
        Msg = Msg & "Gostaria de adicioná-lo?"
        If MsgBox(Msg, vbQuestion + vbYesNo) = vbNo Then
            Response = acDataErrContinue
        MsgBox "Não adicionado. Tente novamente ou escolha um item da lista"
        Else
            Set Db = CurrentDb
            Set rs = Db.OpenRecordset("TABELA_LISTAPRODUTO", dbOpenDynaset)
            rs.AddNew
            rs![CAMPO_DA_TABELA_NOME] = NewData
            rs.Update
            Response = acDataErrAdded
        End If
    Exit_cboLISTAPRODUTO_01_NotInList:
           Exit Sub
    Err_cboLISTAPRODUTO_01_NotInList:
           MsgBox Err.Description
           Response = acDataErrContinue

    Muito Obrigado.
    Ivan.

    terça-feira, 22 de maio de 2012 14:50

Respostas

  • O evento NotInList é utilizado para podermos inserir registos novos respeitando alguns critérios da tabela. Por exemplo, o campo que a combo mostra pode não ser aquele que está ligado ou a tabela de origem da combo possui mais campos de preenchimento obrigatório ou que obrigue a determinadas regras, etc.

    Mas se no seu caso a origem de dados das combos é numa tabela com um campo ou com o campo de ligação autonumber, pode usar a seguinte função, e chamá-la em todos os combos no evento NotInList:

    Public Function InsertItemCombo(Combo As ComboBox, NovoValor) As Boolean
        'criar um novo item na lista do combo
        InsertItemCombo = False
        If Nz(NovoValor, "") = "" Then Exit Function
        
        If MsgBox("Inserir Item: " & NovoValor, vbYesNo) <> vbYes Then Exit Function
        
        On Error GoTo Erro
        Dim rst As DAO.Recordset
        Set rst = CurrentDb.OpenRecordset(Combo.RowSource)
        rst.AddNew
        rst(Combo.BoundColumn - 1).Value = NovoValor
        rst.Update
        On Error GoTo 0
        
        InsertItemCombo = True
        Exit Function
        
    Erro:
        MsgBox "Não foi possivel Inserir Valor" & vbCrLf & Err.Description
    End Function

    e nas combos, tipo:

    Private Sub cboLISTAPRODUTO_01_NotInList(NewData As String, Response As Integer)
        If InsertItemCombo(cboLISTAPRODUTO_01, NewData) Then Response = 2
    End Sub
    O revés de usar assim é que torna-se complicado impedir a duplicação de valores, quando as combos possuem filtragem. O novo elemento pode não constar da lista. Ou então basta digitar um espaço no final, para haver repetição. Deve por isso criar um indice unico na tabela de origem afim de evitar estas situações.

    
    terça-feira, 22 de maio de 2012 21:10