Posibilidad de realizar dos tipos de operación en función del valor en un campo dentro de una consulta de anexión
Tengo una consulta de Anexión y necesito que en función del valor de un Campo de la consulta realice en la anexión el Calculo (A->)(SUMA o Calculo(B)->(RESTA)
¿Es posible realizarlo o tengo que hacerlo de otra forma?
1 Respuesta
Sí que se puede hacer. Una manera es con la función "siinm" que funciona de forma parecida al "si" de excel. Por ejemplo:
En este caso voy a anexar de la Tabla1 al campo "estado" de la Tabla2. Para aquellos registros de Tabla1 en los que el valor del campo "Id" sea mayor que 5, anexaré el valor del resultado de sumar los valores de los campos "estado" y "campo1", cuando no se cumpla la condición anexaré el valor resultado de restar los valores de esos campos.
Ojo con los nulos si quieres operar entre campos como he hecho en el ejemplo; en ese caso si el valor de uno de los dos campos es nulo el resultado será nulo; deberás utilizar la función nz también para evitarlo.
Muchas gracias por contestar.
Te explico un poco como es el proceso por ver si me sirve lo que me has mandado
Tengo una tabla que recoge lo apuntes de la Gestión y están agrupados que todos los apuntes con el mismo concepto están sumados por cada día y estos han de ir al campo: TotalEntradas hay otros apuntes que también están sumados y que han de colocarse en el campo: TotalSalidas.
En un mismo día hay apuntes de Entradas y de Salidas que pueden ser desde 2 hasta un montón de ellos en función de los Conceptos.
Cuando son colocados en los asientos resúmenes estos van numerados y por cada día crea un asiento que a su vez cada asiento esta formado con un numero ideterminado de apuntes y todos ellos han de llevar el mismo numero de asiento.
En el momento que se detecta un nuevo día a través de DMAX... incremento en +1 el contador de asientos para los nuevos apuntes del día nuevo a insertar.
Ejemplo Asiento Concepto Entrada Salida
15/07/2016 1256 caja 256
15/07/2016 1256 gastos 18
15/07/2016 1256 varios 114
20/07/201 1257 salida 25
20/07/2016 1257 pagos 30
25/07/2016 1258 varios 75
.................. ....... ........ ...
Este es el proceso de traspaso que para lo que me hace falta controlar el numero de asiento sea el mismo o diferente al variar la fecha.
Si necesitas más detalle dímelo y trato de explicártelo
Un saludo
No termino de entender del todo el proceso.
¿El ejemplo que me pones es el resultado que buscas?
En ese caso, ¿cómo son tus datos de origen? Si me pones un ejemplo de los datos de origen y ejemplo del resultado que buscas será más fácil.
Te adjunto las tabla de trabajo:
Tabla Origen ha de ser traspasada: APUNTESTRASPASO
Tabla Receptora: MOVIMIENTOSRESUMEN
Como ves la tabla de origen tiene unos apuntes que previamente a través de una Consulta están acumuludos los totales en función del Día y Concepto y han de pasar a la tabla de Destino .
Los asientos recogen el mismo Nº de asiento si la fecha es igual, pero al cambiar de fecha suma uno al nº de Asiento para llevar un orden.
Entonces el resultado que buscas con el ejemplo anterior es anexar dos registros a la tabla "MOVIMIENTOSRESUMEN", dos registros con estos datos:
... Y posteriormente actualizar el dato del campo numeroasiento. ¿Correcto?
Si es el caso, entonces lo puedes hacer con algo así:
... Aquí estás anexando los nuevos por fecha con el cálculo indicado.
Hola de nuevo.
Pueden haber de dos a varios asientos en el traspaso.
Pero el numero de asiento cuando y como se actualiza?
No se si has recibido lo anterior, es que no me sale cuando le doy a enviar.
Es correcto todo aunque pueden haber desde dos a varios asientos en conceptos diferentes para un mismo día.
Los números de asientos cuando son actualizados y recogen las numeraciones los apuntes insertados a la tabla MOVIMIENTOS RESUMEN.?
No veo la operatoria de la renumeración de asientos.
La consulta que he puesto insertará tantos asientos como combinaciones CUENTA/CONCEPTO nuevas tengas en la tabla de origen.
Había entendido que actualizar el campo numeroasiento ya lo tenías hecho. Si tiras la consulta anterior a diario, solamente generarás registros nuevos con la misma fecha, que deben tener todos ellos el mismo numeroasiento (misma fecha, ¿verdad?), entonces lo puedes hacer así, por ejemplo:
Primero una consulta de creación de tabla:
Luego una de actualización:
Si el procedimiento puede ser que inserte varios días de golpe esto no te servirá porque pondrá a todos ellos el mismo numeroasiento, entonces creo que lo tendrías que hacer por código. Si es el caso y no lo sabes hacer, por favor, mándame la BBDD por correo y te lo hago. ([email protected])
La rutina la tengo hecha pero lo que no se es donde meterla para que después de la consulta de anexión se ejecute en todos aquellos nuevos asientos que están en blanco y han de numerarse
Rutina:
If Me.FECHA <> Me.FechaUltima Then
' ** Apunte Diferente Fecha (Crea un Nuevo Asiento)
Numero = 1 + DMax("[NUMEASIENTO]", "MOVIMIENTOS")
FechaUltima = Me.FECHA
Else
' ** Apunte Misma Fecha (Recoge Nº Asiento Anterior)
Numero = DMax("[NUMEASIENTO]", "MOVIMIENTOS")
End If
Me.FechaUltima = Me.FECHA
Me.NUMEASIENTO = Numero
Después de la consulta no se exactamente donde he de colocar estas instrucciones para que se ejecuten. Lo he probado en un Form pero si no toco el campo con el ratón no se me ejecuta y esto no me sirve ya que ha de ejecutarse de forma automática.
Resuelto este tema, comparto con la comunidad por si puede interesar a alguien, finalmente la consulta queda como en el ejemplo de arriba y el código que utilizamos es este:
Private Sub Comando27_Click() 'desactivamos alertaas DoCmd.SetWarnings False 'ejecutamos consulta de anexión DoCmd.OpenQuery "TRASPASOSASIENTOSAPUNTESGESTION" 'procedimiento para rellenar los numeroasiento 'Creamos recordset sobre la tabla movimientos Dim rst As DAO.Recordset 'seleccionamos todos los registros ordenados por fecha y numasiento Set rst = CurrentDb.OpenRecordset("SELECT * FROM [MOVIMIENTOS] order by FECHA desc,NUMEASIENTO DESC") vs = rst.RecordCount 'si el rst está vacío salimos If rst.RecordCount = 0 Then GoTo ENDD 'vamos a rellenar 'cuento cuantos registros tiene el rst rst.MoveLast vcua = rst.RecordCount 'nos desplazamos al primer registro rst.MoveFirst 'bucle que pase por todos los registros For b = 1 To vcua 'tomamos la fecha del primero vfec = rst("[FECHA]") If Day(vfec) < 13 Then vfec = Format(vfec, "mm/dd/yyyy") 'tomamos el valor del asiento vasi = rst("[NUMEASIENTO]") If vasi = 0 Then 'si el numasiento es = 0 entonces hay que actualizar 'contamos si ya había algún registro con la misma fecha, en cuyo caso hay que recoger el valos del numasiento y actualizar vr2 = DCount("*", "[MOVIMIENTOS]", "[FECHA]= # " & vfec & " # and [NUMEASIENTO]<>0") If vr2 > 0 Then 'si sí que había alguno, tomamos el valor del asiento vasiante = DLookup("[NUMEASIENTO]", "[MOVIMIENTOS]", "[FECHA]= # " & vfec & " # and NUMEASIENTO<>0") 'actualizamos todos los registros de esta fecha SSQL = "Update [MOVIMIENTOS] Set [NUMEASIENTO] = " & vasiante & " where [FECHA]= # " & vfec & " # and NUMEASIENTO=0" DoCmd.RunSQL SSQL Else 'si no hay otro registro en la tabla con la misma fecha y ya valor de numasiente asignado, tomamos el máximo y le sumamos 1 y actualizamos vdmax = DMax("[NUMEASIENTO]", "[MOVIMIENTOS]") vdmax = vdmax + 1 'actualizamos todos los registros de esta fecha SSQL = "Update [MOVIMIENTOS] Set [NUMEASIENTO] = " & vdmax & " where [FECHA]= # " & vfec & " # and NUMEASIENTO=0" DoCmd.RunSQL SSQL End If Else 'si ya tiene número asignado, no hacemos nada claro End If 'pasamos al siguiente registro rst.MoveNext Next MsgBox "Actualizaciones realizadas con éxito." ENDD: 'activamos de nuevo las alertas DoCmd.SetWarnings True End Sub
- Compartir respuesta