Consultar motivo de eliminación de registro en formulario y guardar respuesta en una tabla

06:02pm para mí)

Quisiera lograr el siguiente resultado, tengo un formulario F-RegistroVentas, al eliminar las ventas estas se guardan en una tabla T-VentasAnuladas, pero además de eso lo que yo quisiera es "preguntar" al usuario cuál es el motivo de la eliminación de la venta, (como sea posible, es decir, ellos escribiendo en motivo o pudiendo seleccionar dentro de una cantidad de opciones por qué se elimina y entre estas la opción otro por si no calza en ninguna e igual poder escribir la razón) y esta respuesta incluirla en el registro que se crea al eliminar la venta, por lo que en otro campo (Motivo) diga que la venta 0001 se anuló por "devolución de producto" por ejemplo.

¿Puede hacerse algo así?

¿O es mucho?

Gracias a todos los que me lean y se den el tiempo de poder ayudarme.

2 Respuestas

Respuesta
1

Yudith, lo puedes hacer de 3.000 formas por lo menos, por lo que voy a suponer. Supongamos que tengo una tabla Motivos

Y tengo un formulario de ventas, en que dices que tienes resuelto lo de guardar registros eliminados por lo que lo obvio.

Si pulso el botón Eliminar, me muestra un mensaje

Es mentira, a su sugerencia no le haremos caso, pero así es feliz. Si dice sí, se muestra el combinado Elegir con los motivos

Como ninguno se ajusta a lo que quiero escribo mi circunstancia

Al pulsar Enter, en la tabla Motivos

Ya me lo ha guardado.

El código del botón es

Private Sub Comando25_Click()
Dim respuesta As Byte
respuesta = MsgBox("¿Quiere anotar el motivo de anulación?", vbYesNo + vbQuestion, "Su sugerencia será tenida en cuenta")
If respuesta = vbYes Then
Elegir.Visible = True
Else
DoCmd.RunCommand acCmdDeleteRecord
End If
End Sub

Y el del evento Después de actualizar del combinado Elegir

Private Sub Elegir_AfterUpdate()
DoCmd.SetWarnings False
If Nz(DCount("*", "motivos", "motivo like '" & Me.Elegir & "'")) = 0 Then
DoCmd.RunSQL "insert into motivos(motivo)values(elegir)"
End If
End Sub

Es decir, que si en la tabla Motivos no hay ninguno como el que he escrito, lo guarde

Jajajaa genial, yo había intentado lo siguiente: 

Hice un formulario modal en el que tenía las opciones para que pueda presionar alguna y entre ellas saliera otra, y si presiona otra, ahí le salga un cuadro de texto para que ingrese algo distinto.

Lo que no sé es cómo hacer es que al presionar eliminar aparezca ese formulario modal, es decir sí sé, pero cómo le hago paga que la opción que presioné se guarde en una tabla y que esté obviamente relacionada a la venta eliminada.

Podría hacer lo mismo (lo del cuadro combinado) pero en un formulario modal emergente? Para que no esté todo en el formulario de ventas.

Otra cosa, al eliminar tengo ya unos Mensajes primero para confirmar que se desea eliminar y ya al dar eliminado me dice que la venta fue anulada correctamente, esto supongo que debería ir luego de preguntar por qué desea eliminar, la cosa es que si le pongo el motivo, y luego digo que mejor no, igual me gustaría el motivo o no? 

🤯

Da igual el formulario que sea, la instrucción es independiente de como se muestre el formulario, como si lo abres en vista diálogo. Con respecto a lo segundo, ya te dije que lo puedes hacer, ahora sólo de 2999 formas. Por ejemplo

Si escribo un motivo que no está en la tabla Motivos

Tu le puedes preguntar ¿Y cómo piensas pagar?

Al pulsar Enter (aunque podría ser en otro evento)

Si le dices Si, se guarda en la tabla

Vamos a suponer que le dices No. Primero se borra del formulario

Y además no se guarda

El código del evento Después de actualizar del combinado Motivo es

Private Sub Motivo_AfterUpdate()
DoCmd.SetWarnings False
If Nz(DCount("*", "motivos", "motivo='" & Me.Motivo & "'")) = 0 Then
Dim respuesta As Byte
respuesta = MsgBox("¿ Está seguro de querer guardarlo en la tabla Motivos?", vbYesNo + vbQuestion, "Le agradecemos su opinión")
If respuesta = vbYes Then
DoCmd.RunSQL "insert into motivos(motivo)values(motivo)"
ElseIf respuesta = vbNo Then
FechaVenta.SetFocus
Motivo.Value = ""
End If
End If
End Sub

Es un ejemplo de las 2999 formas de hacerlo.

Si pero no queda relacionado a la venta anulada, el fin de conocer el motivo es que si luego preguntan, por qué se anuló la venta 100001, buscas y ahhhh se anuló porque el cliente devolvió el producto, o porque había un error en los datos, qué sé yo.

Por ahora hice la tabla motivos, y su formulario, y relacione el motivo a la tabla ventasanuladas, la cosa es que al anular de guarde ese motivo junto con la venta anulada.

Yo tengo por ahora esto qué es en relación a la confirmación del antes y después

Private sub Form_BeforeDelConfirm(Cancel as Integer, Response as Integer)
Response = acDataErrContinue
If MsgBox ("Está seguro de anular la venta?", VbOKCancel) vbCancel then 
Cancel = true 
End if 
End sub 
Private sub Form_AfterDelConfirm(Status As Integer)
Select Case Status 
Case acDeleteOK
MsgBox "Venta anulada" 
Case acDeleteCancel 
MsgBox "se ha cancelado la anulación" 
Case acDeleteUserCancel 
Msg "Usted ha cancelado la anulación" 
End Select 
End Sub

Y por ahí entremedio o no sé dónde quería preguntar lo del motivo 

Pero Yudith, tu decías (sic) "al eliminar las ventas estas se guardan en una tabla T-VentasAnuladas," por tanto supuse que eso ya lo tenías resuelto, por eso te decía que obviaba ese apartado. Pero sería igual. Bastaría con añadirle entre los dos End If

Docmd. Runsql"insert into VentasAnuladas(NumFactura, FechaVenta, Cliente, motivo)values(numfactura, fechaventa, cliente, motivo)"

Si ha dado un motivo, te lo guardará en la tabla VentasAnuladas con los demás datos y si no ha querido dar motivo, en ese registro de la tabla, el campo Motivo aparecerá en blanco.

¡Gracias! Jajaja sí ya lo guardaba, todos los datos, solo faltaba el motivo, pero como digo el motivo no lo quería dentro del mismo formulario de ventas.

Respuesta
1

Aquí tienes la forma 3001 que responde a todo lo que preguntas, a partir de lo que dices que tienes: http://www.filebig.net/files/6U9ZK9dqTT

Tengo un formulario de Pedidos (con un subform de detalles, para "complicarlo más):

Voy a anular el pedido 10251, para lo que pulso el botón del encabezado. Me pide confirmar la eliminación:

Si le digo que no, pues no hace nada. Si le digo que sí, me abre un formulario emergente con motivos de eliminación (lo hice con un marco, por hacerlo bonito, pero puedes usar un combinado como te indican en la otra respuesta):

Hay una opción "Otros", que al pulsarla, hace que aparezca un cuadro de texto para escribir cualquier otro motivo de los no previstos:

Tecleo algo, pulso Aceptar y...

Me borra el pedido de la tabla Pedidos (y el detalle de la tabla detalles), confirma la eliminación, y me copió los datos del pedido eliminado, más el motivo de eliminación, en la tabla PedidosAnulados (y los registros del detalle en DetallesPedidosAnulados):

Los códigos usados son:

En el botón "anular" del formulario Pedidos:

    If MsgBox("¿Confirmas que quieres eliminar el pedido actual?", vbInformation + vbYesNo, "CONFRMACIÓN") = vbYes Then
        DoCmd.OpenForm "FMotivos", , , , , acDialog
        CurrentDb.Execute "INSERT INTO PedidosAnulados SELECT * FROM Pedidos WHERE IdPedido=" & Me.IdPedido
        CurrentDb.Execute "INSERT INTO DetallesdepedidosAnulados SELECT * FROM [Detalles de Pedidos] WHERE IdPedido=" & Me.IdPedido
        CurrentDb.Execute "UPDATE PedidosAnulados SET Motivo='" & elMotivo & "' WHERE IdPedido=" & Me.IdPedido
        DoCmd.RunCommand acCmdDeleteRecord
        MsgBox "Pedido eliminado correctamente", vbInformation + vbOKOnly, "EXITO"
    End If

En el formulario FMotivos, en los eventos "después de actualizar" del marco de opciones (para mostrar/ocultar el cuadro de texto) y en el botón:

Private Sub Comando11_Click()
    Select Case Marco0
        Case 1
            elMotivo = "Solicitud del cliente"
        Case 2
            elMotivo = "Error en el pedido"
        Case 3
            If Nz(Me.txtOtro, "") = "" Then
                MsgBox "Tienes que indicar un motivo", vbInformation + vbOKOnly, "ERROR"
                Me.txtOtro.SetFocus
                Exit Sub
            Else
                elMotivo = Me.txtOtro
            End If
        Case Else
    End Select
    DoCmd.Close acForm, Me.Name
End Sub
Private Sub Marco0_AfterUpdate()
    Me.txtOtro.Visible = IIf(Me.Marco0 = 3, True, False)
End Sub

Y en un módulo independiente la declaración de una variable pública para recoger el motivo y pasarlo a la tabla:

Public elMotivo As String

Muchas gracias estuve por la mañana en esto, lo que pasa es que ya me gustaba los demás datos, por medio de las macros después de eliminar de la tabla T-Ventas 

Solo me faltaba el motivo e intenté dejar solo eso, pero me da error de sintaxis en Update.

¿Y qué has puesto? Porque si no lo sé, poco te puedo ayudar...

También es importante saber dónde lo has puesto

Si te fijas en mi ejemplo, el Update solo actualiza el campo "motivo" del registro creado en la tabla de anulados.

También es importanta señalar que primero copia los datos del pedido, luego actualiza el motivo y por último borra el pedido. De esta forma puedo trabajar todo el rato con el identificador del pedido que está en pantalla en las SQLs

Primero eliminé todo el código que tenía ese de confirmar y luego dar el mensaje, y nada, luego me di cuenta que quizás no funcionaba porque obvio ya se estaban guardando al dar eliminar, así que dejé solo el motivo y nada, y luego noté que quizás es porque como lo tengo con la macro se va de inmediato entonces el valor no está por donde para comparar, ahora último había intentado colocarlo entre el código antes de confirmar, para ver si ahí sí, pero tampoco, ahí ya no hace nada, solo elimina.

😣

Otra cosa yo tenía el botón con la macro incrustada para Eliminar, no hay manera de hacerlo por ahí ? Como para no descuadrar lo que tenía ?

En el fondo volviendo al principio : 

Tengo esto para el antes y después 

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
Response = acDataErrContinue
If MsgBox("¿Está seguro de anular la venta?", vbOKCancel) = vbCancel Then
Cancel = True
End If
End Sub
Private Sub Form_AfterDelConfirm(Status As Integer)
Select Case Status
Case acDeleteOK
MsgBox "Venta anulada"
Case acDeleteCancel
MsgBox "Se ha cancelado la anulación"
Case acDeleteUserCancel
MsgBox "Usted ha cancelado la anulación"
End Select
End Sub

Esto al hacer click en el botón 

Y esto para que los registros se vayan a la tabla T-VentasAnuladas 

A tu sistema, aunque tal como lo tienes, le veo dos inconvenientes:

1/ tienes que programar muchos eventos

2/ las macros, si bien facilitan algunas acciones, son bastantes rígidas, y hay muchas cosas que no puedes hacer con ellas.

En mi opinión, es mucho más sencillo hacerlo como hice yo, pues en el mismo evento del botón controlas prácticamente todo el proceso ( solo falta pasar el motivo a la variable, que tienes que hacer obligatoriamente en el formulario emergente)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas