MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


3 participantes

    [Resolvido]Impedir alteração.

    wsenna
    wsenna
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 491
    Registrado : 22/12/2009

    [Resolvido]Impedir alteração. Empty [Resolvido]Impedir alteração.

    Mensagem  wsenna 11/10/2014, 02:24

    Olá Feras de plantão, boa noite.

    Situação:
    Num subformulário "DetalhesDoPedido" seleciono o produto numa combox e depois lanço a quantidade a ser retirada do estoque. Tudo perfeito.
    O problema:
    Derrepente o usuário resolve mudar o produto e aí? O produto anteriormente selecionado teve sua quantidade abolida do estoque mas com a alteração como refazer o estoque do produto anteriormente selecionado?
    No caso de alteração da quantidade eu já resolvi, o registro é excluído e a quantidade é devovida ao estoque. Para isso inserí o seguinte código no evento ao receber foco do campo Quant:

    Private Sub Quant_GotFocus()
    If Me.Quant >= 1 Then
    If MsgBox("Você pretende alterar a quantidade de " & Me.Quant & " " & Me.Apresentação & "s deste  produto?    " & Chr(13) & "Então, primeiro vamos devolver esta quantidade ao estoque.    ", vbYesNo, "   InfoBasic Smart System") = 6 Then
    DoCmd.SetWarnings False ' Desabilita avisos.
       
       Dim stDocName As String

       stDocName = "qryRetornaEstoque2"
       DoCmd.OpenQuery stDocName, acNormal, acEdit
     
       DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
       DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
     
       MsgBox "Pronto, o produto foi devolvido ao estoque com sucesso.  " & Chr(13) & "Agora refaça a operação com a nova quantidade.    ", vbInformation, "  InfoBasic System"
       
       Else
       DoCmd.GoToRecord , , acNewRec
       Me.Produto.SetFocus
       
       End If
       End If
       
    End Sub



    Funciona de forma perfeita, mas quando se trata do campo produto a coisa ega.

    Abraços, WSenna


    Última edição por wsenna em 11/10/2014, 15:11, editado 1 vez(es)
    Marcelo David
    Marcelo David
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3873
    Registrado : 21/04/2011

    [Resolvido]Impedir alteração. Empty Re: [Resolvido]Impedir alteração.

    Mensagem  Marcelo David 11/10/2014, 02:56

    Olá!
    Pode verificar se o produto foi alterado, e caso afirmativo, basta devolver o a quantidade ao estoque
    e diminuir a a quantidade do outro produto.

    Outra alternativa é somente alterar o estoque no eventos "Após atualizar" do subform...

    No entanto, eu prefiro, nesses casos, trabalhar desacoplado e usar transações para impedir
    registros órfãos.


    .................................................................................
    Aprenda como criar formulário desacoplado.
    Conheça meu canal no Youtube e se inscreva.
    [Resolvido]Impedir alteração. Marcel11
    wsenna
    wsenna
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 491
    Registrado : 22/12/2009

    [Resolvido]Impedir alteração. Empty Re: [Resolvido]Impedir alteração.

    Mensagem  wsenna 11/10/2014, 08:11

    Olá Marcelo, bom dia.

    No evento após atualizar do formulário, como poderia devolver ao estoque já que o produto já teria sido modificado?
    O que faço é no evento Antes de aualizar com o código abaixo:

    Private Sub Quant_BeforeUpdate(Cancel As Integer)
    If IsNull(Produto) Then
    MsgBox "Você não informou o Produto, essa ação não pode ser concretizada.   ", vbCritical, "  InfoBasic Smart System"
    Me.Undo
    Exit Sub
    End If

    Dim QtdEst As Integer ' Variável para armazenar a quantidade em estoque da mercadoria
    Dim MinEst As Integer ' Variável para armazenar a quantidade mínima estipulada para a mescadoria

       ' Aqui carrego a variável com a quantidade no estoque, veja que filtro utilizando o codigo do peoduto
       QtdEst = DLookup("Quantidade", "tblEstoque", "Produto =" & Me.Produto & "")
       MinEst = DLookup("Mínimo", "tblEstoque", "Produto =" & Me.Produto & "")

       ' Aqui verifico se o estoque está zerado para o produto
       If QtdEst = 0 Then
       MsgBox "Produto.... zerado no estoque !!!"
       Me.Undo
       Exit Sub
       End If

       ' Aqui verifico se a quantidade que vai ser baixada existe no estoque, se for maior emite mensagem
       If QtdEst < str(Me.Quant) Then
       MsgBox "Estoque atual menor que a quantidade solicitada !!!   " & Chr(10) & Chr(10) & "Estoque atual para " & Me.Produto.Column(1) & " é igual a " & QtdEst, vbInformation, "  Atenção"
       Me.Undo
       Cancel = True
       
       ' Aqui verifico se a quantidade que vai ser baixada é menor que o estoque mínimo, se for maior emite mensagem
       'ElseIf QtdEst > MinEst Then
       ElseIf MinEst < str(Me.Quant) Then
       MsgBox "A quantidade informada para " & Me.Produto.Column(1) & " ultrapassa o estoque mínimo.    " & Chr(10) & "Assim sendo, convém solicitar reposição deste produto.    ", vbInformation, "  Atenção"
       
       Else

       'Caso a quantidade do produto exista no estoque faz a atualização do campo na tabela estoque
       DoCmd.SetWarnings False
       DoCmd.RunSQL "update tblestoque set Quantidade=Quantidade-Forms![frmPedidos]![frmDetalhesPedido].Form![Quant]" _
       & " where tblestoque.Produto=Forms![frmPedidos]![frmDetalhesPedido].form![Produto]"
       DoCmd.SetWarnings True
       
       End If
       
    End Sub


    Como você pode observar, funciona em todas as situações, se a quantidade informada é comportada pelo estoque, se deixará o estoque abaixo do mínimo, se o estoque está zerado, etc.
    O problema está apenas no fato do usuário resolver alterar o produto pois ele pode até diminuir o estoque do novo produto mas não repões o anterior.

    Abraços, WSenna
    Silvio
    Silvio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 5077
    Registrado : 20/04/2011

    [Resolvido]Impedir alteração. Empty Re: [Resolvido]Impedir alteração.

    Mensagem  Silvio 11/10/2014, 13:37

    Grande Wsenna, bom dia....

    Bom, vou falar da minha experiência ( pouca em Access, diga-se de passagem )..eu realizo isso dessa forma. dividindo a rotina em duas formas:

    1- no meu Subformulário de saída de peças, tenho um botão que exclui o item, caso o usuário tenha errado o item escolhido, usando essa função abaixo:
    Código:
    Private Sub bt_excluir_Click()
    On Error GoTo TrataErro

    Dim apaga As Integer
    Dim MsgErro
    apaga = MsgBox("Deseja excluir" & vbCrLf & _
                  "o item:  " & Me.CodigoPeca & vbCrLf & _
                  Me.Descricao & vbCrLf & _
                  "no Pedido  " & Forms!frmpedido!idpedido & " ?", vbYesNo + vbQuestion, "ATENÇÃO")
        Select Case apaga
            Case vbYes
                DoCmd.SetWarnings False
                DoCmd.RunCommand acCmdDeleteRecord
                DoCmd.SetWarnings True
                DoCmd.SetWarnings False
               
            Case vbNo
        End Select

    Exit_TrataErro:
        DoCmd.Hourglass False
        DoCmd.Echo True
     Exit Sub
       
    TrataErro:
    If Err.Number = 0 Then
        'Não é um erro
    Else
     DoCmd.Hourglass False
     DoCmd.Echo True
     MsgErro = "Erro # " & Str(Err.Number) & " gerado no " & Err.Source _
     & vbNewLine & vbNewLine & "Descrição: " & Err.Description _
     & vbNewLine & vbNewLine & "Por favor contate o Administrador de Sistema."
     MsgBox MsgErro, vbMsgBoxHelpButton + vbCritical, "Erro", Err.Helpfile, Err.HelpContext
     Resume Exit_TrataErro
    End If
    End Sub

    2- somente vai ser dado baixa no estoque...... após salvar o pedido do cliente, usando essa função:

    Código:
    Private Sub bt_salvar_Click()

    If IsNull(Me.DataOs) Or Empty Then
        MsgBox "A Data do Pedido é obrigatória", vbCritical, Me.Caption
                Me.DataOs.SetFocus
               

     Else
     If MsgBox("O Pedido" & " de Nº " & Me.idpedido & vbCrLf & "Foi incluído ou alterado. Deseja salvar?", vbQuestion + vbYesNo, Me.Caption) = vbYes Then
          DoCmd.RunCommand acCmdSaveRecord
            DoCmd.RunCommand acCmdRefresh
           
           
            'Caso a quantidade do produto exista no estoque faz a atualização do campo na tabela estoque
              DoCmd.SetWarnings False
              DoCmd.RunSQL "update tblestoque set saldo = saldo - Forms![Frmpedido]![sfsaidapeca].Form![qtd]" _
              & " where tblestoque.CodigoPeca=Forms![frmPedido]![sfsaidapeca].form![codigoPeca]"

              MsgBox "O Pedido: " & Me.idpedido & vbCrLf & "Do cliente  " & Me.Cliente & vbCrLf & "Salvo com sucesso", vbOKOnly, Me.Caption
                 
        Else
            Me.Undo
              DoCmd.CancelEvent
        End If
        End If
        end sub


    3- porém caso tenha saído e não tenha feito um pedido via sistema por qualquer motivo, tenho um formulário onde se entra e acerta a quantidade do estoque dessa forma:

    Código:
    Private Sub bt_ok_Click()
    Dim strSenhaUser As String, strSenhaAtual
    Dim strUsuario As Integer
    strSenhaAtual = InputBoxDK("Digite a senha para o acerto de estoque", "Senha", "******")
    strSenhaUser = DLookup("[SENHA]", "USUARIOS", "[USER] = '" & Forms!login!USER & "'")

    If strSenhaAtual <> strSenhaUser Then
        MsgBox "Senha incorreta, tente novamente", vbInformation, Me.Caption
        Exit Sub
    End If

    If MsgBox("Deseja atualizar o saldo dessa peça:" & vbCrLf & _
              "Código Peça:  " & Me.CodigoPeca & vbCrLf & _
              "Descrição:  " & Me.Descricao & vbCrLf & _
              "de:  " & Me.Saldo & "  para:  " & Me.Acerto & " ?", vbQuestion + vbYesNo, Me.Caption) = vbNo Then
    DoCmd.CancelEvent
        Me.Undo
            Me.Acerto = "" ' caixa de texto desaclopada * * me.saldo, campo da tabela
            Else
                Me.Saldo = Me.Acerto
                    Me.Acerto = ""
                        End If
    End Sub

    Bom espero ter contribuído para lhe dar uma pequena luz !

    Abraços


    .................................................................................
    Caso tenha resolvido a tua duvida, coloque o tópico como resolvido.
    www.maximoaccess.com/t860-resolucao-de-topicos

    "Quase tudo é possível quando se tem determinação e força de vontade. Não desista tão rápido."
    wsenna
    wsenna
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 491
    Registrado : 22/12/2009

    [Resolvido]Impedir alteração. Empty Re: [Resolvido]Impedir alteração.

    Mensagem  wsenna 11/10/2014, 15:10

    Olá Silvio, bom dia.

    Amigão, acabei resolvendo de uma forma mais simples.
    No evento "Ao receber foco" coloquei o código abaixo:

    Private Sub Produto_GotFocus()
    If Not IsNull(Produto) Then
    If MsgBox("Você pretende alterar ou substituir este Produto por algum outro?    " & Chr(13) & "Primeiro exclua-o para devolver esta quantidade ao estoque.    ", vbYesNo, "   InfoBasic Smart System") = 6 Then
    Me.Comando21.SetFocus
    Else
    DoCmd.GoToRecord , , acNewRec
    Me.Produto.SetFocus
    Exit Sub
    End If
    End If
    End Sub


    Veja a imagem abaixo.

    Dessa forma ou o usuário é obrigado a clicar no comando Excluir ou o cursor é remeido para um novo registro.
    De qualquer forma estudarei sua sugestão pois sempre é muito bom aprender novas técnicas e não se deve jogar fora as pérolas que nos são ofertadas.
    Tenha um ótimo final de semana.

    Abraços, WSenna

    Conteúdo patrocinado


    [Resolvido]Impedir alteração. Empty Re: [Resolvido]Impedir alteração.

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 8/5/2024, 02:42