No permitir capturar un pago si tiene repetidos el "id_ de cliente" y la misma "fecha"

Tengo " id_cliente","nombre", "abono", "fechadepago", recibo etc.La captura es en un formulario hecho a partir de una consulta. Puede repetirse el id_cliente(porque son varios pagos). Pero no debe dejarse capturar dos veces el mismo pago. Es decir, debe detectarse cuando el "id_cliente" tenga la misma "Fechadepago" para no permitir capturarlo.

2 Respuestas

Respuesta
2

Si los datos los metes en un formulario, en el evento antes de actualizar del cuadro de texto Fechadepago puedes poner

If dcount("fechadepago","nombre de la tabla","[id_cliente]= " & me.[id_cliente] & " and fechadepago=#" & me.fechadepago & " then

Msgbox"Va a ser que no, estaría repetido", vbokonly,"La próxima vez fíjate más"

Docmd. Cancelevent

end if

ok Gracias!

En el renglón del if me presenta el mensaje "se esperaba separador de listas o )" supongo que es por el cierre de paréntesis de la función dcount, ¿donde lo cierro? lo coloque al final justo antes del then, pero me da el mismo mensaje.

Tienes toda la razón. Errores al escribir

...fechadepago=#" & me.fechadepago & "#) then

 If DCount("FECHA_PAGO", "PAGO", "[CUENTA]= " & Me.[CUENTA] & " and FECHA_PAGO=#" & Me.FECHA_PAGO#) Then

Me seguía dando el mismo error, no se... así no da el error de sintaxis, pero al "ejecutar", me manda el error de compilación "el carácter de declaración de tipo no coincide con el tipo de dato declarado" y me señala la parte de "Me.[CUENTA]" (cuenta viene siendo el id_cliente y es de tipo numérico el campo)

Ahora le agregue & Me.[CUENTA].value y no me da error aquí, pero ahora lo marca en Me.FECHA_PAGO#.(igual previamente marca "el carácter de declaración de tipo no coincide con el tipo de dato declarado")

Cuando se define una variable o se hace referencia a un control de un formulario, hay que tener en cuenta el valor que guarda(o va a guardar). Me explico, si un cuadro de texto Direccion guarda o va a guardar texto hay que referirse a el como

....= '" & me.direccion & "' o sea apostrofe comillas &... & comillas apostrofe

En caso de que el valor que guarda sea numérico o moneda, por ejemplo, Cantidad, sería

....=" & me.cantidad & "   o sea comillas &...& comillas

En caso de que el valor sea de fecha, por ejemplo FechaNac, sería

...#" & me.fechanac & "#

Cuando la variable cierra la instrucción hay que poner unas comillas más, por ejemplo

form.recordsource="select * from clientes where pais='" & me.pais "'"    o sea

Apostrofe comillas y para cerrar comillas apostrofe comillas.

¿Has comprobado si los cuadros de texto se llaman realmente como los has puesto?. Una cosa es el valor que aparece o guarda un cuadro de texto, que eso está en sus propiedades-datos-origen del control y otra es como hay que referirse a el, tanto en VB como en SQL que eso lo puedes ver en sus propiedades-otras-nombre.

Por cierto, antes de la almohadilla final te faltan unas comillas

Prueba a ponerlo como

If DCount("[FECHA_PAGO]", "PAGO", "CUENTA= forms!nombredelformulario!cuenta and [FECHA_PAGO]=forms!nombredelformulario![fecha_pago]") Then

Si me permites un consejo, nunca pongas los nombres de los campos, controles etc. con nombres como Nombre Cliente, Nombre_cliente. Ponlos todo junto. En el caso de que tengas un control llamado Nombre Cliente, en editor de VB, por defecto, te lo pone como Nombre_Cliente, y te puedes volver loco escribiéndolo y la instrucción no hace nada, porque el control realmente se llama Nombre Cliente. Ademas, con nombres separados tienes que estar encerrándolo entre corchetes.

Casi me queda, así me esta funcionando, solo que en lugar que diga 27/06/2017 necesito que tenga en cuenta la fecha que indica el usuario.(bueno en realidad la especificó el usuario en otra pantalla previa "de parámetros de captura"  y quedo dentro de una variable "global", posteriormente el campo de fecha recibe el valor de dicha variable global.)

If DCount("[FECHA_PAGO]", "Pago", "[CUENTA] =" & Me.[CUENTA] & "  And [FECHA_PAGO] = #27 / 6 / 2017#") Then

Vamos a suponer que tienes un formulario donde capturas los datos llamado así, CapturadeDatos y en el tienes un cuadro de texto FechaLoquesea. Vamos a suponer que el formulario Clientes lo abres desde el formulario Captura de datos, en el evento Antes de actualizar del cuadro de texto FechaPago puedes poner

IIf CurrentProject. AllForms("CapturadeDatos"). IsLoaded Then
If DCount("cliente", "Clientes", "fecha=forms!capturadedatos!fechaloquesea and idcliente=" & me.idcliente & "") >= 1 Then
MsgBox "No puede ser, ya hay otro", vbokonly,"Otra vez será"

docmd.cancelevent
End If
End If

Es decir, si el formulario de captura está cargado, entonces que cuente en la tabla Clientes cuantos clientes hay que tengan esa como fecha de pago la que hay en el formulario de captura de datos y el idcliente de el formulario en el que estás trabajando. En caso de que haya, al menos, 1 te aparece el mensaje y el cursor se vuelve al cuadro de texto FechaPago.

Respuesta
1

Omar: Una solución es que hagas la consulta de Datos Agrupados por Id_Cliente y Fecha, de modo tal que si tienes 5 Fechas iguales te aparecerá solo una. Lógicamenta el Campo abono, Tendrás que sumarlo. Un saludo >> Jacinto

Gracias

Si de hecho presenta saldo alterior y nuevo saldo,pero en el ultimo paso antes de la instrucción "DoCmd.GoToRecord , , acNewRec" (que agrega el nuevo registro) requiero la detección del "Id_Cliente" el la misma "fechadepago",para no permitir la captura,será necesaria una instrucción en Sql. Gracias otra vez

Omar: La verdad es que había malinterpetado tu pregunta, pero ahora al ir a darte una nueva respuesta, veo que Icue te ha contestado con una solución que es la adecuada en éste caso.

Nada puedo añadir a ella. Mis saludos a los dos Icue y Omar. Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas