Jump to content
Sign in to follow this  
Guest miguelfreitas

[RESOLVIDO] Cancelar se o resultado da subtração for menor que 0

Recommended Posts

Guest miguelfreitas

Boas-tardes,

Private Sub Comando3_Click()
    Dim xREF
    Dim xQT
   
    xREF = Me.ref
    xQT = Me.qt
    

        If xQT <= 0 Then
          MsgBox "Não pode inserir o número 0 ou números negativos.", vbInformation
          Else
    
              If MsgBox("Pretende confirmar a venda ?", vbYesNo) = vbYes Then
                 DoCmd.RunSQL ("Insert into vendas (ref,qt) values ('" & xREF & "'," & xQT & ")")
                 DoCmd.RunSQL ("Update produtos set stock = stock - " & xQT & " where ref='" & xREF & "'")
              End If

          DoCmd.Close
        End If

End Sub

Pronto, como vocês podem ver, ai está o código do botão dum formulário de venda, o código não permite ao utilizador inserir o número 0 ou negativo, e depois dele inserir a quantidade de stock vendido, há uma declaração SQL que subtrai o valor vendido pelo valor existente na BD.

Pronto, agora o que me falta é o seguinte, vamos supor que havia 10 produtos XPTO, e o utilizador ia ai ao formulário e metia (por engano) que vendeu 11, ou seja ia dar -1.  Só que na regra de validação do campo stock eu meti ">=0" ou seja, o stock só pode ser maior ou igual a 0, nunca pode ser menos. Logo, por ter esta validação o utilizador ao inserir 11 produtos vai dar um erro de infracção de regra de validação.

Agora, preciso do código que diga ao utilizador,se o resultado da subtracção der um stock negativo que ele não pode vender 11, mas apenas 10 no máximo, ou então uma coisa mais simples dizendo, "a venda não pode ser efectuada pois não existe stock suficiente para produto." algo do género, que deve ser tipo isto:

Depois da declaração SQL para a subtracção:

If stock < 0 Then
MsgBox ""a venda não pode ser efectuada pois não existe stock suficiente para a venda desde produto.", vbInformation
End If

Desde já agradeço,

Miguel Freitas  :P

Share this post


Link to post
Share on other sites
FreiNando

Antes de fazeres a subtração coloca o valor do stock actual numa variavel e compara-a com xQt, se for inferior mostras a mensagem de aviso, caso contrario executas a operação de subtração e claro a criação do registo de venda.

Para obteres o valor de stock de determinado produto podes usar o DLookup:

stock=DLookup("stock","produtos","ref="& xREF ' se xREF é numero

stock=DLookup("stock","produtos","ref LIKE'"& xREF &"'" ' se xREF é texto

Outra forma é no no campo qt do formulário de venda usares o evento BeforeUpdate para verificar se o valor introduzido é maior que o stock do produto escolhido (por exemplo, usando o DLookup), e caso o seja cancelar.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
Guest miguelfreitas

Boas FreiNando, antes de mais obrigado pela resposta.

Desculpa a minha ignorância  :dontgetit:

Tenho de inserir o DLookup no evento BeforeUpdate do campo qt ?!

Eu nunca tinha visto este código, não sei mesmo o que fazer com ele  :P

Share this post


Link to post
Share on other sites
FreiNando

Vejamos como posso explicar.

O DLookup é uma função do Access que busca o valor de um determinado campo de uma tabela ou consulta.

O primeiro parametro é a nome do campo, o segundo é o nome da tabela ou consulta, e o terceiro é a condição correspondendo ao WHERE do SQL.

A vantagem do DLookup é a simplicidade do código, a desvantagem é que ele devolve o primeiro valor que encontrar mesmo que existam mais valores que respeitem a condição.

por isso o teu código podia ficar assim:

Private Sub Comando3_Click()
    Dim xREF
    Dim xQT
   
    xREF = Me.ref
    xQT = Me.qt
    

        If xQT <= 0 Then
            MsgBox "Não pode inserir o número 0 ou números negativos.", vbInformation
        ElseIf xQT > DLookup("stock", "produtos", "ref ='" & xREF & "'") Then
            MsgBox "Quantidade introduzida maior que o stock.", vbInformation
        Else
    
              If MsgBox("Pretende confirmar a venda ?", vbYesNo) = vbYes Then
                 DoCmd.RunSQL ("Insert into vendas (ref,qt) values ('" & xREF & "'," & xQT & ")")
                 DoCmd.RunSQL ("Update produtos set stock = stock - " & xQT & " where ref='" & xREF & "'")
              End If

          DoCmd.Close
        End If

End Sub

No entanto,

Ao utilizares o evento BeforeUpdate do campo qt no formulário, se já tiveres escolhido um produto, podes verificar qual o stock existente desse produto e assim evitar que a quantidade introduzida seja maior.

Private Sub qt_BeforeUpdate(Cancel As Integer)
    If Nz(qt, 0) <= 0 Then
        MsgBox "Não pode inserir o número 0 ou números negativos.", vbInformation
        Cancel = True
    ElseIf qt > DLookup("stock", "produtos", "ref ='" & Nz(ref, "") & "'") Then
        MsgBox "Quantidade introduzida maior que o stock.", vbInformation
        Cancel = True
    End If
End Sub

Este código será usado em conjunto com o anterior.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
Guest miguelfreitas

FreiNando, muito obrigado pela a ajuda.

Dim xREF As String
Dim xQT, xStock As Integer

xREF = Me.ref.Value
xQT = Me.qt.Value

'confirma se introduziu zero ou numeros negativos
If xQT <= 0 Then
MsgBox "Não pode inserir o número 0 ou números negativos.", vbCritical
DoCmd.CancelEvent
Else
'se introduziu numeros positivos, avança com a mensagem de confirmação
If MsgBox("Pretende confirmar a venda ?", vbYesNo) = vbYes Then
'se respondeu SIM, faz o insert na tabela vendas
DoCmd.SetWarnings False
CurrentDb.Execute "INSERT INTO [vendas] (ref,qt) VALUES ('" & xREF & "'," & xQT & ")"
DoCmd.SetWarnings True
'salva o registo inserido
DoCmd.RunCommand acCmdSaveRecord
'faz um DLookup na tabela produtos para saber o Stock atual
xStock = DLookup("[stock]", "produtos", "[ref]='" & xREF & "'")
'se o Stock atual menos a quantidade digitada, tiver o resultado de zero ou negativo, dá a mensagem e aborta
If xStock - xQT < 0 Then
MsgBox "Stock Insuficiente...", vbCritical
Exit Sub
Else
'se existir Stock suficiente, faz o Update
DoCmd.SetWarnings False
DoCmd.RunSQL "Update produtos set [produtos].[stock] = [produtos].[stock] - " & xQT & " where [produtos].[ref]='" & xREF & "'"
DoCmd.SetWarnings True
End If
'DoCmd.Close
End If
End If

Share this post


Link to post
Share on other sites
FreiNando

CUIDADO!

Você está criando um registo de venda sem saber se existe stock desse produto, e pior ainda, só desconta do stock se a quantidade vendida existir em stock. Imagina que tem 2 unidades de um produto e vende 3, no procedimento que fez, é criado um registo de venda de 3 unidades e como o stock existente é inferior nem desconta as 2 existentes.

Daí eu ter indicado para verificar o stock no momento de indicar a quantidade de items do produto, ecriar o registo de venda depois de verificar o stock existente.

Tens duas opções:

- ou deixas o stock ficar negativo (à espera de entrada do produto)

- ou limitas a venda ao stock do produto.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
Guest miguelfreitas

É verdade ! :o

se existir 4 produtos XPTO, e eu meter que vendi 5, ele dá o erro de stock insuficiente, mas vou ver na tabela Vendas e aceitou a venda.

Era melhor criar um limite, ou seja, nunca, mas nunca podia passar abaixo de 0, se eu tivesse 5 produtos XV, e vende-se 6 XV, dava erro de stock, mas também não inseria na tabela...

Será que  achas que me podes ajudar ?

Share this post


Link to post
Share on other sites
Guest miguelfreitas

Resolução, o formulário de venda não pode estar vinculado a nenhuma tabela.

Private Sub Comando3_Click()
           
  '  Me.xREF = Me.ref
  '  Me.xQT = Me.qt
    Dim y As Integer
    
    If Me.xQT <= 0 Then 'confirma se introduziu zero ou numeros negativos
      MsgBox "Não pode inserir o número 0 ou números negativos.", vbCritical
      DoCmd.CancelEvent
      
      Else 'se introduziu numeros positivos, avança com a mensagem de confirmação
        
        If MsgBox("Pretende confirmar a venda ?", vbYesNo) = vbYes Then
          y = DLookup("[stock_lourosa]", "add_produtos", "[ref]='" & Me.xREF & "'") 'faz um DLookup na tabela produtos para saber o Stock atual
            
            If y - Me.xQT < 0 Then 'se o Stock atual menos a quantidade digitada, tiver o resultado de zero ou negativo, dá a mensagem e aborta
              MsgBox "Stock Insuficiente...", vbCritical
             Exit Sub
            Else
              DoCmd.SetWarnings False
              CurrentDb.Execute "INSERT INTO [vendas] (ref,qt,datahora) VALUES ('" & Me.xREF & "'," & Me.xQT & ", Now())"
              DoCmd.RunCommand acCmdSaveRecord 'salva o registo inserido
              DoCmd.RunSQL "Update add_produtos set [add_produtos].[stock_lourosa] = [add_produtos].[stock_lourosa] - " & Me.xQT & " where [add_produtos].[ref]='" & Me.xREF & "'" 'se existir Stock suficiente, faz o Update
              DoCmd.SetWarnings True
            End If
            
         DoCmd.Close
Forms!venda!lstSearchResults.Requery
        End If
        
    End If

End Sub

Private Sub Form_Close()
Me.Filter = ""
Me.FilterOn = False
End Sub

Private Sub Form_Load()
'Me.Filter = "ref =" & "'" & Forms!venda!lstSearchResults.Column(0) & "'"
'Me.FilterOn = True
Me.xREF.Value = Forms!venda!lstSearchResults.Column(0)

End Sub

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.