** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Actualizar stock con compuestos
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Actualizar stock con compuestos

 Responder Responder
Autor
Mensaje
IvoneR2017 Ver desplegable
Habitual
Habitual
Avatar

Unido: 02/Marzo/2018
Localización: Costa Rica
Estado: Sin conexión
Puntos: 81
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita IvoneR2017 Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Actualizar stock con compuestos
    Enviado: 26/Noviembre/2018 a las 15:39
Hola a todos. Estoy liada con un tema ya hace algún tiempo. Agradezco su ayuda.

Debo entonces descontar de la tabla F_STO 
a. Tanto los artículos principales como
b. Su materia prima

Es decir: 
1. Recorrer la tabla de detalle de facturas (F_LFA), cotejarla contra los artículos principales en la tabla de STOCK (F_STO), descontar del stock (Campo: ACTSTO) la cantidad facturada 
2. Recorrer la tabla de compuestos (F_COM) verificando si los que se encuentran en el detalle de la factura (campo: CODCOM) tienen compuestos (Campo: ARTCOM)  e ir descontando las unidades (Campo UNICOM) que componen dichos artículos (materia prima) también de la tabla F_STO

Tabla donde tengo Los compuestos (F_COM)
Tabla donde esta el stock (F_STO)
Detalle de la Factura (F_LFA)

------------------------
EJEMPLO:
------------------------
TABLA F_LFA (detalle facturado)
------------------------
ARTLFA CANLFA
------------------------
1 (COMBO 1) 1
5 (COMBO 5) 1
----------------------------------------------
TABLA F_COM (compuestos)
----------------------------------------------
CODCOM ARTCOM UNICOM (unidades que componen al principal)
1 9901 (p.e salchichas) 1
1 9902 (p.e Panes) 2
5 9903 (p.e Limones) 4
----------------------------------------------
TABLA F_STO (Inventario)
----------------------------------------------
ARTSTO ACTSTO
1 100
2 80
...
5 101
9901 250
9902 200
9903 150
...
----------------------
El código...
-----------------------------
Private Sub actualizastock2()
Dim DB As DAO.Database
Dim SqlLFA, SqlSTO, SqlSTOC, SqlCOM As String
Dim RsSTO, RsCOM, RsLFA, RsStoC As DAO.Recordset

Set DB = CurrentDb()
MsgBox "Tipo : " & Me.TxtTipo & " - Codigo : " & Me.TxtNumero

SqlLFA = "SELECT * FROM F_LFA_R WHERE TIPLFA= '" & Me.TxtTipo.Value & "' AND " & _
    "CODLFA= " & Me.TxtNumero.Value
Set RsLFA = DB.OpenRecordset(SqlLFA, dbOpenDynaset)

SqlCOM = "SELECT F_COM.*, * " & vbCrLf & _
"FROM F_COM " & vbCrLf & _
"WHERE (((F_COM.CODCOM)= '" & RsLFA!ARTLFA & "'));"
Set RsCOM = DB.OpenRecordset(SqlCOM, dbOpenDynaset)

SqlSTO = "SELECT f_sto.*, * " & vbCrLf & _
"FROM f_sto " & vbCrLf & _
"WHERE (((f_sto.ARTSTO)= '" & RsLFA!ARTLFA & "') AND ((f_sto.ALMSTO)=""GEN""));"
Set RsSTO = DB.OpenRecordset(SqlSTO, dbOpenDynaset)

SqlStoC = "SELECT F_STO.*, * " & vbCrLf & _
"FROM F_STO " & vbCrLf & _
"WHERE (((F_STO.ARTSTO)= '" & RsCOM!ARTCOM & "'));"
Set RsSTOC = DB.OpenRecordset(SqlStoC, dbOpenDynaset)

' Los articulos "Principales"
RsLFA.MoveFirst
Do Until RsLFA.EOF
     RsSTO.MoveFirst
     ' Los principales
     Do Until RsSTO.EOF
        If Not RsSTO.EOF And Not RsSTO.BOF Then
            MsgBox "Articulos a cambiar : " & RsLFA!DESLFA
            MsgBox "Compuestos : " & RsCOM!ARTCOM
            RsSTO.Edit
                    RsSTO!ACTSTO = RsSTO!ACTSTO - RsLFA!CANLFA
                    RsSTO!DISSTO = RsSTO!DISSTO - RsLFA!CANLFA
            RsSTO.Update
        End If
        RsSTO.MoveNext
    Loop
    RsLFA.MoveNext

Loop
' Los compuestos de los "Principales"
RsLFA.MoveFirst
Do Until RsLFA.EOF
    RsCOM.MoveFirst
    Do Until RsCOM.EOF
                  MsgBox "Artículos compuestos a cambiar : " & RsCOM!ARTCOM  
' Edit
' RsSTO!ACTSTO = RsSTO!ACTSTO - (RsLFA!CANLFA * RsCOM!UNICOM)
          '      RsSTO!DISSTO = RsSTO!DISSTO - (RsLFA!CANLFA * RsCOM!UNICOM)
' Update
    RsCOM.MoveNext
    Loop
    RsLFA.MoveNext
Loop

SalgoSub:
RsLFA.Close
RsSTO.Close
RsStoC.Close
RsCOM.Close
Set RsLFA = Nothing
Set RsSTO = Nothing
Set RsStoC = Nothing
Set RsCOM = Nothing
Set DB = Nothing
Exit Sub

End Sub



Editado por IvoneR2017 - 26/Noviembre/2018 a las 20:43
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 737
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Noviembre/2018 a las 19:44
Y crear consultas que relacionen las distintas tablas, y convertirlas luego en consultas de actualización?
Arriba
IvoneR2017 Ver desplegable
Habitual
Habitual
Avatar

Unido: 02/Marzo/2018
Localización: Costa Rica
Estado: Sin conexión
Puntos: 81
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita IvoneR2017 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 27/Noviembre/2018 a las 22:09
Gracias Pitxicu. No lo había considerado, pero voy a intentarlo.
Arriba
IvoneR2017 Ver desplegable
Habitual
Habitual
Avatar

Unido: 02/Marzo/2018
Localización: Costa Rica
Estado: Sin conexión
Puntos: 81
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita IvoneR2017 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 18:40
Hola pitxiku y foreros, andaba ocupada tratando de darme respuesta y os comento que he avanzado así:
Ya logré descontar del stock  (Tabla: F_STO) los artículos compuestos (F_COM) cada vez que ingreso un artículo en el detalle de la factura (F_LFA).
El Lio es cuando tengo que anular la factura COMPLETA (p.e en el caso de que el cliente cancelar la compra). En dicho caso tendría que "reversar" todo el procedimiento, es decir: recorrer el detalle de la factura (F_LFA), ir eliminando cada uno de sus registros y regresar el stock a donde estaba antes. Lo estoy haciendo así, pero no lo hace correctamente y me arroja el error '3021' NO hay registro activo.

Agradezco mucho su ayuda!

' El código, Llamo el procedimiento en el click del Botón <Anular> factura
'---------------------------------------------------------------------------------
Private Sub ActualizaStoc13()
Dim DB As DAO.Database
Dim RsL As DAO.Recordset
Dim SqlL As String
    ' Compuestos
    Dim FactID As Integer
    Dim codArt As String
    Dim a As String
    Dim Cant As Integer
    
    On Error GoTo ErrorHandler
    
Set DB = CurrentDb
SqlL = "select * from f_lfa_c where TIPLFA= '" & Me.TxtTipo.Value & "' AND codlfa= " & Me.TxtNumero.Value
Set RsL = DB.OpenRecordset(SqlL, dbOpenDynaset)

    codArt = RsL!ARTLFA
    FactID = Me.TxtNumero.Value 
    Cant = RsL!CANLFA               'Cantidad de Producto
    a = DLookup("ARTLFA", "[F_LFA_c]", "ARTLFA='" & codArt & "' AND CODLFA=" & FactID)
    
If RsL.EOF Then Exit Sub
RsL.MoveFirst
Do Until RsL.EOF
    codArt = RsL!ARTLFA
' simple aviso provisional para ir viendo el procedimiento
    MsgBox "Articulos en Factura : " & RsL!ARTLFA & " - " & RsL!DESLFA
    ' Descontamos cada compuesto del artículo seleccionado mediante la funcion: < updateSto >
    updateSto codArt, Cant
    '-----------
    RsL.Delete
    RsL.MoveNext
' simple aviso provisional para ir viendo el procedimiento
    MsgBox "Articulos en Factura (**siguiente) : " & RsL!ARTLFA & " - " & RsL!DESLFA ' Aquí muestra el error '3021'
Loop

RsL.Close
Set RsL = Nothing
Set DB = Nothing

Exit Sub
 
ErrorHandler:
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description

End Sub

'------------------------
' La función <updateSto>
'------------------------
Public Sub updateSto(cod As String, cantF As Integer)
On Error GoTo errHand
    Dim DB As DAO.Database
    Dim rsCom As Recordset
    Dim StrSQL_COM As String
    
    Dim rsSto As Recordset
    Dim StrSQL_Sto As String
    Dim RsF As DAO.Recordset
    
    Set DB = CurrentDb()
    'Query para el STO
    StrSQL_Sto = "SELECT F_STO.ARTSTO, F_STO.ACTSTO, F_STO.DISSTO FROM F_STO;"
    Set rsSto = DB.OpenRecordset(StrSQL_Sto)
     
   'Query para cargar base de datos articulos compuestos
    StrSQL_COM = "SELECT F_COM.CODCOM, F_COM.ARTCOM, F_COM.UNICOM" _
    & " FROM F_COM WHERE (((F_COM.CODCOM)= '" & cod & "'));"
    Set rsCom = DB.OpenRecordset(StrSQL_COM)
    
    'Contar cuantos compuestos tiene la materia prima (Siempre deberia ser mayor a 1)
    If (rsCom.RecordCount > 0) Then
        rsCom.MoveLast
        rsCom.MoveFirst
        Debug.Print rsCom.RecordCount
    Else
        End         'Si no existe compuesto terminar búsqueda
    End If
    
    'Reviso disponibilidad en el F_STO de cada compuesto para la materia prima
    activerecords = rsCom.RecordCount
    
    For i = 1 To activerecords
        a = rsCom.Fields("ARTCOM")
        rsSto.Filter = "(ARTSTO)= '" & a & "'"      'Filtro para solo obtener el compuesto en el sto
        Set RsF = rsSto.OpenRecordset
        RsF.Edit
            ' Agregamos (reversamos) la cantidad facturada en F_LFA
            CantDisponible = RsF.Fields("ACTSTO") + (cantF * rsCom.Fields("UNICOM"))
            RsF.Fields("ACTSTO") = CantDisponible
            RsF.Fields("DISSTO") = CantDisponible
        RsF.Update                  'Guardar los cambios realizados a el STO
        rsCom.MoveNext              'Mover a siguiente record de compuesto
    Next i
    
    rsCom.Close
    rsSto.Close
    RsF.Close
    Set rsCom = Nothing
    Set rsSto = Nothing
    Set DB = Nothing
errHand:
End Sub



Editado por IvoneR2017 - 04/Diciembre/2018 a las 18:44
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 737
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 19:14
¿Y si no eliminas la factura cancelada? Así tendrás en el historial todas las facturas. Y si le agregas un par de campos como cancelada sí/no, fecha de cancelación y motivo, sabrás el por qué.

En cuanto a las líneas, puedes duplicar los registros del detalle, pero en vez de tener una cantidad positiva, tener una negativa (multiplicar por -1). Luego puedes comprobar si con el método que tienes ahora para una factura normal te sirve para estos registros negativos.
Arriba
IvoneR2017 Ver desplegable
Habitual
Habitual
Avatar

Unido: 02/Marzo/2018
Localización: Costa Rica
Estado: Sin conexión
Puntos: 81
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita IvoneR2017 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 19:33
Como siempre Gracias Pitxiku por tus respuestas. te comento, ya había considerado esa opción y comenté la línea de RsL.Delete es decir no ir eliminando registro a registro del detalle sino realizar la actualización de los compuestos en el stock para al final realizar la eliminación, pero... Aun no funciona!
Además aún si no eliminara la factura (y su detalle) de todas maneras tendría que ir regresando el stock de los artículos afectados al agregarlos a dicha factura!!! ;)

¿ Podría ser de ayuda si te pongo la interfase?... Gracias

' simple aviso provisional para ir viendo el procedimiento
    MsgBox "Articulos en Factura : " & RsL!ARTLFA & " - " & RsL!DESLFA
    ' Descontamos cada compuesto del artículo seleccionado mediante la funcion: < updateSto >
    updateSto codArt, Cant
    '-----------
    ' RsL.Delete


Editado por IvoneR2017 - 04/Diciembre/2018 a las 19:35
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 737
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 19:38
Como quieras. Pero recuerda, si hay datos sensibles, crea una copia con datos imaginarios.
Arriba
IvoneR2017 Ver desplegable
Habitual
Habitual
Avatar

Unido: 02/Marzo/2018
Localización: Costa Rica
Estado: Sin conexión
Puntos: 81
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita IvoneR2017 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 19:53
Gracias! Pitxicu por la recomendacion. De todas maneras debo prever la "anulación" de una factura y el retorno de los artículos al stock Tanto los principales como sus composiciones (en el caso que los hubiese) Sigo intentandolo (me siento liada con este tema) pero debo solucionarlo! Gracias por sus aportes a este hilo forero... Continúo recibiendo ideas!
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 737
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 06/Diciembre/2018 a las 18:15
Un pequeño ejemplo que usa consultas para actualizar el stock:

- https://1drv.ms/u/s!AsYMk9OS3HACh0vnx9mn5dJ25in6

Cada producto (tblProductos) está compuesto por una o más materias primas (tblMatPrimas). Y cuáles y en qué cantidad se indican en tblRecetas.

En el formulario frmFacturas se crean las facturas y se indican los productos vendidos. Este formulario tiene 2 botones. El botón Cerrar sirve para "cerrar" la factura y actualizar el stock de las materias primas. Así evitamos que el usuario cambie cantidades o productos después de actualizar el stock. Si es necesario, siempre se puede crear otro botón que permita hacer esto, controlándolo. El segundo botón, Cancelar, cancela la factura y "devuelve" las cantidades de las materias primas usadas a su stock, siempre y cuando la factura estuviese cerrada.

En cuanto a las consultas que se usan, hay 3:

- qryFactCantTotal: Calcula la cantidad que usamos de cada materia prima para cada producto (cantidad en receta * número de productos en factura), filtrada por el número de factura.

- qupdCerrarFactura: Al cerrar la factura toma el stock de cada producto, y le resta el total calculado por la consulta anterior, qryFactCantTotal.

- qupdCancelarFactura: Igual que la anterior, la usamos cuando cancelamos; solo que en vez de restar el total calculado, lo sumamos.
Arriba
IvoneR2017 Ver desplegable
Habitual
Habitual
Avatar

Unido: 02/Marzo/2018
Localización: Costa Rica
Estado: Sin conexión
Puntos: 81
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita IvoneR2017 Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Diciembre/2018 a las 01:03
Gracias PitxiKu por todo tu tiempo, acabo de ver el mensaje. Voy a verlo!!!
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable