Fallo al cargar un datarecor... AYuda!

Hola al ejecutar esta parte del código
Me sale el error '91' en tiempo de ejecución Variable de tipo objeto o l variable de tipo with no está establecida y se sitúa en la línea
  If .EOF And .BOF Then   del  DataAux del recordset
¿Qué demonios pasa?.. No veo dónde estoy metiendo la pata.
Private Sub DBComboProveedor_Click(Area As Integer)
MSFlexGrid1.Visible = False
MSFlexGrid1.AllowUserResizing = flexResizeBoth
If DataProveedor.Recordset.BOF And DataProveedor.Recordset.EOF Then
FormErrorProveedor.Visible = True
Else
' Cargo el dbGrid
If Area = dbcAreaList Then
DataProveedor.Recordset.Bookmark = DBComboProveedor.SelectedItem
DataAlbaranes.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'"
DataAlbaranes.Refresh
DataAux.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'" & "AND [Cobrada]='NO'"
DataAux.Refresh
End If
With DataAux.Recordset
If .EOF And .BOF Then
FormErrorAlbaranes.Visible = True
Else
'Calculo filas y columnas
.MoveLast
MSFlexGrid1.Rows = .RecordCount + 1
MSFlexGrid1.Cols = .Fields.Count
.MoveFirst
MSFlexGrid1.TextMatrix(0, 0) = "Pagar"
'Recorro fila 0 del MSFlexgrid y pongo los Títulos
For Colu = 1 To .Fields.Count - 1
MSFlexGrid1.TextMatrix(0, Colu) = .Fields(Colu).Name
Next
'Inserto los checkbox
For fila = 1 To MSFlexGrid1.Rows - 1
MSFlexGrid1.Row = fila
MSFlexGrid1.Col = 0
MSFlexGrid1.CellFontName = "Wingdings"
MSFlexGrid1.CellFontSize = 14
MSFlexGrid1.CellAlignment = flexAlignCenterCenter
MSFlexGrid1.Text = strUnChecked
Next fila
'Recorro los campos de una calumna metiéndolos en el MSFlexgid
fila = 1
Do While Not .EOF
For Colu = 1 To .Fields.Count - 1
MSFlexGrid1.ColAlignment(Colu) = vbCenter
MSFlexGrid1.TextMatrix(fila, Colu) = .Fields(Colu).Value
Next
fila = fila + 1
.MoveNext
Loop
.MoveFirst
End If
End With
End If
MSFlexGrid1.Visible = True
End Sub

1 Respuesta

Respuesta
1
Date cuenta que no puedes estar a la vez al principio del recordset (BOF) y al final del mismo (EOF) o estas al principio o estas al final.
Pero la línea
If .EOF And .BOF Then
Sole está para el caso de que el recorset esté vacío, con lo cual saco un mensaje de error y le doy opción el el form cargado que puede meter datos.
Si no se cumple esta línea salta al Else y cominezo a cargar los daos en el MSFlexGrid.
Vamos !, que lo que quiero testear es que DataAux.Recordset no esté vacío. ¿Crees que es mejor la opción .RecorCount = 0?
Claro tu quieres comprobar que está vacío, pero esa linea no es correcta
Yo efectivamente usaría el recordcount
Pues acabo de probar con .RecordCount=0 y me sigue el mismo fallo.
¿Hay alguna forma de que te haga llegar el proyecto entero por correo?
Gracias
Ahora que lo veo...
¿Tendrás declarado el DataAux e inicializado al igual que el dataAlbaranes no?
Otra opción es que en el código no pase por dentro de If Área = dbcAreaList Then
Al no pasar por ahí no establece el recodsource del dataaux y al hacer después el bof-eof no esta inicializado
A ver yo en una copia de seguridad del anterior a los arreglos que estoy haciendo ahora y que me iba más oa menso bien, era:
Private Sub DBComboProveedor_Click(Area As Integer)
MSFlexGrid1.AllowUserResizing = flexResizeBoth
' Cargo el dbGrid
If Area = dbcAreaList Then
DataProveedor.Recordset.Bookmark = DBComboProveedor.SelectedItem
DataAlbaranes.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'"
DataAlbaranes.Refresh
DataAux.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'" & "AND [Cobrada]='NO'"
DataAux.Refresh
End If
With DataAux.Recordset
If .RecordCount <> 0 Then
'Calculo filas y columnas     ...............
¿Tanta es la diferencia con cambiar el orden del If?
Al menos no me da error en el .RecordCount del DataAux. Recordset
Ya no lo se
Lo que esta claro es que el error
"error '91' en tiempo de ejecución Variable de tipo objeto o l variable de tipo with no está establecida"
Significa que dataaux no existe por eso da error en lo que hagas con el.
Otra cosa no le veo ...
Creo que ya se donde está el fallo.
A ver yo había dejado en blanco la opción DataSource tanto del DataAlbaranes como del DataAux ya que los caro por código en:
DataProveedor.Recordset.Bookmark = DBComboProveedor.SelectedItem
DataAlbaranes.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'"
DataAlbaranes.Refresh
DataAux.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'" & "AND [Cobrada]='NO'"
DataAux.Refresh
Pero al desativarlo me da error en la línea
If .RecordCount <> 0 Then      (Del DataAux)
Parece como si no se enterara del Area=dbcAreaList y no cargas los datos en el datagrid, con lo cual el segundo filtro de NO pagadas ´no carga
Vamos yo lo que pretendo es que al desplegar el cobobox y seleccione un proveedor se cargue en el datagris todos los albaranes de ese proveedor y en el msflexgris solo aquellas que NO están pagadas.
Teniendo cuidado por el camino de que no estén vacías de un principio.
¿Cómo lo ves ahora bajo esta perspectiva?
Soy novatillo en este de programar... pero le echo entusiasmo.
Acabo de hacer un paso a paso
Al hacer "click" enel Combo llamo a la subrutina en cuestión y Área toma valor 0 y el dbcAreList toma el 4, con lo cual al ser distintos no carga los DBGrid y ya canta que el dataAux no está creado.. lógico!.
Ahora la cuestión es.. ¿No hay algún evento que sea realmente el seleccionar un elemento de la lista del combo y no el "clik" de abrirlo?, para acceder a la subrutina con el dato de proveedor ya tomado
Si ya decía yo...
Bueno vamos acercándonos. Utiliza el método change del combo en lugar del click, creo que te ira mejor.
Prueba y ya me dirás
Bueno, por lo menos me deja desplegar el combox y hacer la selección, lo que sigue fallando es Area=Vacío y el dbcAreaList = 2, con los cual no entra. ¿Qué narices falla?
Vamos a ver
Private Sub DBComboProveedor_Click(Area As Integer)
Área lo estas pasando en el encabezado del procedimiento con lo que al llamar al mismo le tienes que pasar tu el valor. Como el procedimiento se ejecuta al seleccionar en el combo el valor de Área siempre es 0. No se lo estas asignando en ningún sitio.
OK !... ¡POR FIN!...
A ver, ¡Cierto!. Área determina un área cliqueada del combo, tal como indagué son: 0-dbcAreaButton, 1-dbcAreaEdit, and 2-dbcAreaList.
Con lo cual defino Area=2 en el cuerpo de la subrutina de DBComboProveedor_Change()
y al llegar al
If Area = dbcAreaList Then
DataProveedor.Recordset.Bookmark = DBComboProveedor.SelectedItem
DataAlbaranes.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'"
DataAlbaranes.Refresh
DataAux.RecordSource = "SELECT * FROM [Albaranes] WHERE [Proveedor] = '" & DataProveedor.Recordset("Proveedor") & "'" & "AND [Cobrada]='NO'"
DataAux.Refresh
End If
Ya me carga todos los datos.
Muchísimas gracias por toda la orientación, ¡claveria ya funciona. Ahora tengo que ponerlo a prueba poniendo tablas vacías, vaciándole registros, etc etc con todo tipo pruebas a ver si no falla. Ya te contaré

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas