Asignar valor a variable cuando no hay registro

Tengo una consulta sql donde asigno un valor a una variable con este código

Dim rst As Recordset
Dim miSQLG1 As String

miSQLG1 = "SELECT tbl_gastos.AÑO, TBL_GASTOS.MES, Sum(tbl_gastos.IMPORTE) AS SumaDeIMPORTE " _
& "FROM tbl_gastos" _
& "GROUP BY tbl_gastos.AÑO, tbl_gastos.MES " _
& "HAVING (((tbl_gastos.AÑO)='2022') AND ((tbl_gastos.MES)='ENERO'));"

Set rst = CurrentDb.OpenRecordset(miSQLG1, dbOpenDynaset)

Me.GASTOS_ENERO = rst("SumaDeIMPORTE").Value

Pero cuando no hay registro con los criterior de la consulta me dice "No hay registro activo"

Pruebo modificando un registro cualquiera y poniéndole los requisitos y si me funciona. Probé con NZ() también pero no pude.

Como puedo decir en la consulta que al no encontrar registro activo (o sea con los criterior buscados en la consulta), el valor sea 0, porque aclaro tengo también una suma de variables y al dar una error provoca el mensaje de error...

Me ayudan

2 Respuestas

Respuesta
2

Pruebe con esto:

Dim rst As Recordset
Dim miSQLG1 As String
miSQLG1 = "SELECT tbl_gastos.AÑO, TBL_GASTOS.MES, Sum(tbl_gastos.IMPORTE) AS SumaDeIMPORTE " _
& "FROM tbl_gastos" _
& "GROUP BY tbl_gastos.AÑO, tbl_gastos.MES " _
& "HAVING (((tbl_gastos.AÑO)='2022') AND ((tbl_gastos.MES)='ENERO'));"
Set rst = CurrentDb.OpenRecordset(miSQLG1, dbOpenDynaset)
If rst.RecordCount = 0 Then
  Me.GASTOS_ENERO = 0
Else
  Me.GASTOS_ENERO = rst("SumaDeIMPORTE").Value
End If

Si no le sirve pruebe cambiando

Rst. Recordcount

Por

If rst.BOF() And rst.EOF Then

Corrijo

If rst.BOF() And rst.EOF() Then

Estoy de acuerdo con Enrique si no va a migrar sus datos, por ejemplo, PostgreSQL, es suficiente la función de domimio Dsum(), pero no requiere la función NZ() porque Dsum() retorna 0 si no se cumple el criterio.

¡Gracias! Funciona muy bien, y voy a aplicar esos consejos

Tiene razón Enrique la función Dsum() debe anteponérsele la función Nz()

Solo obliga NZ() cuando la función Dsum() contiene el tercer parámetro, es decir, el equivalente a un WHERE. Ejemplos:

DSum("Valor", "gastos"") No requiere NZ()

DSum("Valor", "gastos", "Mes = 1") Si requiere NZ()

Respuesta
1

La consulta puede ser mas sencilla si no se agrupan los datos.
Agruparlos (sin condiciones) devolverá las suma de cada mes + año y tantos registros como años y meses existan en la tabla.
Como se desea obtener un mes y año concreto, al aplicar las condiciones se obtiene el mismo resultado sin necesidad de agrupar.
Hay una alternativa que lo simplifica: DSum("IMPORTE", "tbl_gastos", "AÑO='2022' AND Mes = 'Enero''")

Si no encuentra datos devolverá un Null, con la funcion Nz se puede tratar y quedara así:

Me.GASTOS_ENERO = Nz(DSum("IMPORTE", "tbl_gastos", "AÑO='2022' AND Mes = 'Enero''"),0)

Me llama la atención que el año y mes se traten como texto, pero si funciona y devuelve un valor correcto nada se puede objetar.

¡Gracias! Son texto porque derivan de la fecha misma para diferentes acciones que se hacen como informes, formularios, etc. Ya se que hay formas mejores para conseguir el año y el mes directamente de la fecha para esos casos, pero como es un dato que ya esta, la agrupación fácil, y ya venia esa codificación de antes, se la dejo así por las dudas... Pero voy a poner en practica sus consejos...muchísimas Gracias

Una tabla cualquiera, los mismos datos y en la ventana de inmediato:

?DSum("Valor", "gastos", "Mes = 1")
1590,0975

?DSum("Valor", "gastos", "Mes = 111")
Nulo

El mes 111 no existe ni en la tabla ni en los calendarios.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas