У меня проблема с созданием VBA для динамического добавления данных в мою таблицу в ms-access - PullRequest
1 голос
/ 03 февраля 2020

Я создал форму в MS Access и создал кнопку (cmdAdd) для динамического добавления заполненных полей в таблицу (tbCadastro).

См. SQL инструкции ниже:

Private Sub cmdAdd_Click()
    'Add data
    CurrentDb.Execute "INSERT INTO tbCadastro(Requisição, Cliente, CPF_CNPJ, ID_Cartao, ValorDisponivelCartao, Tarifa, ValorBrutoDevolucao, ValorLiquido, Motivo, Observacoes, DataPagamento, FormaPagamento, BancoCredito, AgenciaCredito, ContaCredito, BancoDebito, AgenciaDebito, ContaDebito)" & _
            " VALUES (" & Me.txtCliente & ",'" & Me.txtID_Cartao & "','" & Me.txtCPF_CNPJ & "','" & Me.txtValorDisponivelCartao & "','" & _
            Me.txtTarifa & "','" & Me.txtValorBrutoDevolucao & "','" & Me.txtValorLiquido & "','" & Me.txtMotivo & "','" & Me.txtObservacoes & "','" & _
            Me.txtDataPagamento & "','" & Me.txtAgenciaCredito & "','" & Me.txtContaCredito & "','" & Me.cboBancoCredito & "','" & Me.BancoDebito & "','" & _
            Me.AgenciaDebito & "','" & Me.ContaDebito & "','" & Me.cboFormaPagamento & "','" & Me.cboRequisicao & "')"

    'Refresh form
    FrmCadastro.Form.Requery
End Sub

Моя проблема заключается в следующем:

Когда я нажимаю кнопку Добавить (после заполнения полей), она генерирует ошибка:

Ошибка в ходе выполнения 438: объект не принимает это свойство или метод.

Мы уже рассмотрели все поля в режиме разработки формы, переименовав и дифференцировать поля от меток.

Я не знаю, где я иду не так.

Спасибо всем.

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020

Причина вашей ошибки, вероятно, заключается в следующей строке:

FrmCadastro.Form.Requery

Здесь вы получаете доступ к объекту, возвращенному свойством Форма вашего Форма Объект . Это свойство обычно используется для доступа к элементу формы подчиненной формы, чтобы получить доступ к полям в подчиненной форме.

В то время как метод Requery применим к основному объекту формы , это не метод объекта, возвращаемый свойством Form объекта Form , что приводит к появившейся ошибке:

Ошибка в ходе выполнения 438: объект не принимает это свойство или метод.

То есть объект Form, полученный с помощью свойства Form, не принимает метод Requery .


Если предположить, что FrmCadastro является формой, в которой находится кнопка cmdAdd, то для запроса источника записи формы вы можете использовать:

Me.Requery

Я бы также предложил использовать параметры вместо объединения значений в вашем операторе SQL, так как это избавляет от необходимости обрабатывать переменные типы данных и также предотвращает внедрение SQL.

Например :

Private Sub cmdAdd_Click()

    Dim strSQL As String
    strSQL = strSQL & "INSERT INTO tbCadastro "
    strSQL = strSQL & "( "
    strSQL = strSQL & "    Requisição, "
    strSQL = strSQL & "    Cliente,  "
    strSQL = strSQL & "    CPF_CNPJ, "
    strSQL = strSQL & "    ID_Cartao, "
    strSQL = strSQL & "    ValorDisponivelCartao,  "
    strSQL = strSQL & "    Tarifa,  "
    strSQL = strSQL & "    ValorBrutoDevolucao,  "
    strSQL = strSQL & "    ValorLiquido,  "
    strSQL = strSQL & "    Motivo,  "
    strSQL = strSQL & "    Observacoes,  "
    strSQL = strSQL & "    DataPagamento,  "
    strSQL = strSQL & "    FormaPagamento,  "
    strSQL = strSQL & "    BancoCredito,  "
    strSQL = strSQL & "    AgenciaCredito, "
    strSQL = strSQL & "    ContaCredito, "
    strSQL = strSQL & "    BancoDebito,  "
    strSQL = strSQL & "    AgenciaDebito, "
    strSQL = strSQL & "    ContaDebito "
    strSQL = strSQL & ") "
    strSQL = strSQL & "VALUES  "
    strSQL = strSQL & "( "
    strSQL = strSQL & "    @txtcliente, "
    strSQL = strSQL & "    @txtID_Cartao, "
    strSQL = strSQL & "    @txtCPF_CNPJ, "
    strSQL = strSQL & "    @txtValorDisponivelCartao, "
    strSQL = strSQL & "    @txtTarifa, "
    strSQL = strSQL & "    @txtValorBrutoDevolucao, "
    strSQL = strSQL & "    @txtValorLiquido, "
    strSQL = strSQL & "    @txtMotivo, "
    strSQL = strSQL & "    @txtObservacoes, "
    strSQL = strSQL & "    @txtDataPagamento, "
    strSQL = strSQL & "    @txtAgenciaCredito, "
    strSQL = strSQL & "    @txtContaCredito, "
    strSQL = strSQL & "    @cboBancoCredito, "
    strSQL = strSQL & "    @BancoDebito, "
    strSQL = strSQL & "    @AgenciaDebito, "
    strSQL = strSQL & "    @ContaDebito, "
    strSQL = strSQL & "    @cboFormaPagamento, "
    strSQL = strSQL & "    @cboRequisicao "
    strSQL = strSQL & ") "

    With CurrentDb.CreateQueryDef("", strSQL)
        .Parameters("@txtcliente") = Me.txtCliente
        .Parameters("@txtID_Cartao") = Me.txtID_Cartao
        .Parameters("@txtCPF_CNPJ") = Me.txtCPF_CNPJ
        .Parameters("@txtValorDisponivelCartao") = Me.txtValorDisponivelCartao
        .Parameters("@txtTarifa") = Me.txtTarifa
        .Parameters("@txtValorBrutoDevolucao") = Me.txtValorBrutoDevolucao
        .Parameters("@txtValorLiquido") = Me.txtValorLiquido
        .Parameters("@txtMotivo") = Me.txtMotivo
        .Parameters("@txtObservacoes") = Me.txtObservacoes
        .Parameters("@txtDataPagamento") = Me.txtDataPagamento
        .Parameters("@txtAgenciaCredito") = Me.txtAgenciaCredito
        .Parameters("@txtContaCredito") = Me.txtContaCredito
        .Parameters("@cboBancoCredito") = Me.cboBancoCredito
        .Parameters("@BancoDebito") = Me.BancoDebito
        .Parameters("@AgenciaDebito") = Me.AgenciaDebito
        .Parameters("@ContaDebito") = Me.ContaDebito
        .Parameters("@cboFormaPagamento") = Me.cboFormaPagamento
        .Parameters("@cboRequisicao") = Me.cboRequisicao
        .Execute dbFailOnError
    End With

    Me.Requery
End Sub
0 голосов
/ 03 февраля 2020

Чтобы повторить ответ @ LeeMa c, просто укажите свой объект Form в .Requery call

Forms!FrmCadastro.Form.Requery

И используйте сохраненный запрос, указывающий на точные элементы управления формы, чтобы избежать конкатенации или пунктуации :

SQL (проверьте отображение значений и столбцов, поскольку имена отображаются не по порядку)

INSERT INTO tbCadastro(Requisição, Cliente, CPF_CNPJ, ID_Cartao, ValorDisponivelCartao, 
                       Tarifa, ValorBrutoDevolucao, ValorLiquido, Motivo, Observacoes, 
                       DataPagamento, FormaPagamento, BancoCredito, AgenciaCredito, 
                       ContaCredito, BancoDebito, AgenciaDebito, ContaDebito)
VALUES (Forms!FrmCadastro!txtCliente, Forms!FrmCadastro!txtID_Cartao, 
        Forms!FrmCadastro!txtCPF_CNPJ, Forms!FrmCadastro!txtValorDisponivelCartao, 
        Forms!FrmCadastro!txtTarifa, Forms!FrmCadastro!txtValorBrutoDevolucao, 
        Forms!FrmCadastro!txtValorLiquido, Forms!FrmCadastro!txtMotivo, 
        Forms!FrmCadastro!txtObservacoes, Forms!FrmCadastro!txtDataPagamento, 
        Forms!FrmCadastro!txtAgenciaCredito, Forms!FrmCadastro!txtContaCredito, 
        Forms!FrmCadastro!cboBancoCredito, Forms!FrmCadastro!BancoDebito, 
        Forms!FrmCadastro!AgenciaDebito, Forms!FrmCadastro!ContaDebito, 
        Forms!FrmCadastro!cboFormaPagamento, Forms!FrmCadastro!cboRequisicao)

VBA

Private Sub cmdAdd_Click()
    'Add data
    DoCmd.OpenQuery "mySavedQuery"

    'Refresh form
    Forms!FrmCadastro.Form.Requery        ' ABSOLUTE REFERENCE
    Me.FrmCadastro.Form.Requery           ' RELATIVE REFERENCE
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...