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