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

Respuesta
1

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.

Si no te llega lo que acabo de enviarte dímelo y te lo mando de nuevo.

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.

Hola recibes mis mensajes?

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas