Error en Modulo de un Cuadro de Dialogo

Tengo un formulario que permite escoger el reporte por (Usuario, Local, Status), también por periodo (anual, mensual o trimestral), y escoger el filtro por (nombre del usuario, nombre del local o por el status) además muestra una ves seleccionado el periodo color car el mes, el ano o el trimestre. Me da error de User-defined type not defined. Anteriormente me daba error en la ultima sentencia de nombre ambiguo. Este es el procedimiento:

Option Compare Database
Option Explicit

Enum PropuestasPeriodEnum
ByMonth = 1
ByQuarter = 2
ByYear = 3
End Enum

Sub PrintReports(ReportView As AcView)
' This procedure used in Preview_Click and Print_Click Sub procedures.
' Preview or print report selected in the ReportToPrint option group.
' Then close the Print Sales Reports Dialog form.
Dim strReportName As String
Dim strReportFilter As String
Dim lGastosCount As Long

' Determine report filtering
If Nz(Me.lstReportFilter) <> "" Then
strReportFilter = "([GastossGroupingField] = """ & Me.lstReportFilter & """)"
End If
' Determine reporting time frame
Select Case Me.lstGastosPeriod
Case ByYear
strReportName = "Informe de Gastos anuales"
lGastosCount = DCountWrapper("*", "Análisis de Gastos", "[Año]=" & Me.cbYear)
Case ByQuarter
strReportName = "Informe de Gastos trimestrales"
lGastosCount = DCountWrapper("*", "Análisis de Gastos", "[Año]=" & Me.cbYear & " AND [Trimestre]=" & Me.cbQuarter)
Case ByMonth
strReportName = "Informe de Gastos mensuales"
lGastosCount = DCountWrapper("*", "Análisis de Gastos", "[Año]=" & Me.cbYear & " AND [Mes]=" & Me.cbMonth)
End Select
If lGastosCount > 0 Then
TempVars.Add "Agrupar por", Me.lstGastosReports.Value
TempVars.Add "Mostrar", DLookupStringWrapper("[Mostrar]", "Informes de Gastos", "[Agrupar por]='" & Nz(Me.lstGastosReports) & "'")
TempVars.Add "Año", Me.cbYear.Value
TempVars.Add "Trimestre", Me.cbQuarter.Value
TempVars.Add "Mes", Me.cbMonth.Value
DoCmd.OpenReport strReportName, ReportView, , strReportFilter, acWindowNormal
Else
MsgBoxOKOnly NoGastosInPeriod
End If
End Sub
Private Sub Form_Load()
SetGastosPeriod ByYear
InitFilterItems
End Sub

Sub SetGastosPeriod(GastosPeriod As GastosPeriodEnum)  - Aqui es que me da el error mencionado
Me.lstGastosPeriod = GastosPeriod
Me.cbQuarter.Enabled = (GastosPeriod = ByQuarter)
Me.cbMonth.Enabled = (GastosPeriod = ByMonth)
End Sub

Private Sub lstGastosPeriod_AfterUpdate()
SetGastosPeriod Me.lstGastosPeriod
End Sub

Private Sub lstGastosReports_AfterUpdate()
InitFilterItems
End Sub

Private Sub InitFilterItems()
Me.lstReportFilter.RowSource = DLookupStringWrapper("[Origen de fila de filtro]", "Informes de Gastos", "[Agrupar por]='" & Nz(Me.lstGastosReports) & "'")
Me.lstReportFilter = Null
End Sub

Private Sub cmdPreview_Click()
PrintReports acViewReport
End Sub

Private Sub cmdPrint_Click()
PrintReports acViewNormal
End Sub

Private Function GetLastGastosDate() As Date
GetLastGastosDate = Nz(DMaxWrapper("[Fecha]", "Gastos"), Date)
End Function

2 Respuestas

Respuesta
2

El error mencionado se produce en la línea donde se declara la subrutina "SetGastosPeriod". El problema radica en el uso incorrecto del tipo de datos en el parámetro de entrada de la subrutina.

En la declaración de la subrutina, se utiliza "GastosPeriodEnum" como el tipo de datos del parámetro, pero en la llamada a la subrutina en la subrutina "Form_Load", se utiliza "ByYear" en lugar de "GastosPeriodEnum.ByYear". Esto genera un error porque "ByYear" no se reconoce como un tipo o valor válido.

Para corregir el error, debe modificar la línea en la subrutina "Form_Load" de la siguiente manera:

SetGastosPeriod PropuestasPeriodEnum. ByYear

Al hacer este cambio, estará utilizando el valor correcto del enumerador "PropuestasPeriodEnum" para establecer el período de gastos. Debe hacer el cambio correspondiente en otras partes del código donde se llama a la subrutina "SetGastosPeriod" con diferentes períodos.

¡Gracias! Por tu colaboración, haré la corre4cion y espero me funcione. Saludos

Hola Eduardo.

Corregí el procedimiento según tus indicaciones y funciono, pero ahora me da un error de "Ambiguous name detected: DLookupStringWrapper" en la subrutina Private Sub InitFilterItems(), línea que te menciono a continuación:

Option Compare Database
Option Explicit

Enum GastosPeriodEnum
ByMonth = 1
ByQuarter = 2
ByYear = 3
End Enum

Sub PrintReports(ReportView As AcView)
' This procedure used in Preview_Click and Print_Click Sub procedures.
' Preview or print report selected in the ReportToPrint option group.
' Then close the Print Sales Reports Dialog form.
Dim strReportName As String
Dim strReportFilter As String
Dim lGastosCount As Long

' Determine report filtering
If Nz(Me.lstReportFilter) <> "" Then
strReportFilter = "([GastossGroupingField] = """ & Me.lstReportFilter & """)"
End If
' Determine reporting time frame
Select Case Me.lstGastosPeriod
Case ByYear
strReportName = "Informe de Gastos anuales"
lGastosCount = DCountWrapper("*", "Análisis de Gastos", "[Año]=" & Me.cbYear)
Case ByQuarter
strReportName = "Informe de Gastos trimestrales"
lGastosCount = DCountWrapper("*", "Análisis de Gastos", "[Año]=" & Me.cbYear & " AND [Trimestre]=" & Me.cbQuarter)
Case ByMonth
strReportName = "Informe de Gastos mensuales"
lGastosCount = DCountWrapper("*", "Análisis de Gastos", "[Año]=" & Me.cbYear & " AND [Mes]=" & Me.cbMonth)
End Select
If lGastosCount > 0 Then
TempVars.Add "Agrupar por", Me.lstGastosReports.Value
TempVars.Add "Mostrar", DLookupStringWrapper("[Mostrar]", "Informes de Gastos", "[Agrupar por]='" & Nz(Me.lstGastosReports) & "'")
TempVars.Add "Año", Me.cbYear.Value
TempVars.Add "Trimestre", Me.cbQuarter.Value
TempVars.Add "Mes", Me.cbMonth.Value
DoCmd.OpenReport strReportName, ReportView, , strReportFilter, acWindowNormal
Else
MsgBoxOKOnly NoGastosInPeriod
End If
End Sub
Private Sub Form_Load()
SetGastosPeriod GastosPeriodEnum.ByYear
InitFilterItems
End Sub

Sub SetGastosPeriod(GastosPeriod As GastosPeriodEnum)
Me.lstGastosPeriod = GastosPeriod
Me.cbQuarter.Enabled = (GastosPeriod = ByQuarter)
Me.cbMonth.Enabled = (GastosPeriod = ByMonth)
End Sub

Private Sub lstGastosPeriod_AfterUpdate()
SetGastosPeriod Me.lstGastosPeriod
End Sub

Private Sub lstGastosReports_AfterUpdate()
InitFilterItems
End Sub

Private Sub InitFilterItems()
Me.lstReportFilter.RowSource = DLookupStringWrapper("[Origen de fila de filtro]", "Informes de Gastos", "[Agrupar por]='" & Nz(Me.lstGastosReports) & "'")
Me.lstReportFilter = Null
End Sub

Private Sub cmdPreview_Click()
PrintReports acViewReport
End Sub

Private Sub cmdPrint_Click()
PrintReports acViewNormal
End Sub

Private Function GetLastGastosDate() As Date
GetLastGastosDate = Nz(DMaxWrapper("[Fecha]", "Gastos"), Date)
End Function

También me da el mismo error por 3 veces en la siguiente sub rutina:

Private Function GetLastGastosDate() As Date
GetLastGastosDate = Nz(DMaxWrapper("[Fecha]", "Gastos"), Date)
End Function

No mensiona los tipos o mensajes de los errores, así no se puede revisar el código no obstante, como estoy un poco ocupado, el responde ChatGTP.

Entiendo, es posible que el código esté arrojando errores debido a algunos problemas. Veamos si puedo ayudarte a identificar y corregirlos.

1. Enum GastosPeriodEnum: Esta parte del código parece estar bien definida y no debería generar errores.

2. Sub PrintReports(ReportView As AcView): Revisemos las líneas de código dentro de esta subrutina y busquemos posibles problemas:

- Verifica si los nombres de los informes especificados ("Informe de Gastos anuales", "Informe de Gastos trimestrales", "Informe de Gastos mensuales") corresponden a los nombres correctos de los informes en tu base de datos de Access. Asegúrate de que los informes existan y estén correctamente nombrados.
- Revisa si los nombres de las tablas ("Análisis de Gastos") y los campos ("[Año]", "[Trimestre]", "[Mes]") también son correctos en tu base de datos. Asegúrate de que los nombres de tabla y campo sean los adecuados.

- Verifica que la función "DCountWrapper" y "DLookupStringWrapper" estén definidas correctamente y sean accesibles desde el módulo donde se encuentra este código. Estas funciones podrían ser definidas en otro lugar del proyecto o en un módulo separado. Asegúrate de que las funciones estén disponibles y no contengan errores.

- Comprueba si la variable "NoGastosInPeriod" está definida y tiene un valor asignado en algún lugar del código. Esta variable parece ser utilizada en la línea "MsgBoxOKOnly NoGastosInPeriod". Asegúrate de que la variable esté definida y tenga un valor adecuado.

3. Private Sub Form_Load(): Esta subrutina no parece tener problemas evidentes. Asegúrate de que las funciones "SetGastosPeriod" y "InitFilterItems" estén definidas correctamente y no contengan errores.

4. Sub SetGastosPeriod(GastosPeriod As GastosPeriodEnum): Esta subrutina no parece tener problemas evidentes. Sin embargo, verifica que los controles "lstGastosPeriod", "cbQuarter" y "cbMonth" estén presentes en el formulario y tengan los nombres correctos.

5. Private Sub lstGastosPeriod_AfterUpdate(): Esta subrutina no parece tener problemas evidentes. Verifica que la subrutina "SetGastosPeriod" esté definida correctamente y no contenga errores.

6. Private Sub lstGastosReports_AfterUpdate(): Esta subrutina no parece tener problemas evidentes. Verifica que la subrutina "InitFilterItems" esté definida correctamente y no contenga errores.

7. Private Sub InitFilterItems(): Esta subrutina no parece tener problemas evidentes. Sin embargo, verifica que el control "lstReportFilter" esté presente en el formulario y tenga el nombre correcto.

Espero que estos consejos te ayuden a identificar y corregir los errores en el código. Si sigues teniendo problemas, por favor proporciona más información sobre los errores específicos que estás enfrentando y cualquier otro detalle relevante.

Respuesta
1

La línea da error porque se esta utilizando en la definición de la función a la propia función

Private Sub SetGastosPeriod(GastosPeriod As GastosPeriodEnum) 

Modifica el nombre del parámetro (añádele una X o cualquier otro carácter que defina como única esa variable en ese entorno).

Private Sub SetGastosPeriod(GastosPeriod As GastosPeriodEnum
El error esta en la definición del tipo de dato (aun no esta declarado)

(El mensaje anterior esta equivocado y se publico por error al intentar corregirlo)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas