En un hilo de hace unos días, Ricardo Hernández me enviaba una MDB como
respuesta a una cuestión que plantee, acerca de si se podía representar
gráficamente la ocupación de una serie de personas sabiendo la hora de
entrada y salida de su tarea. En fin el caso es que adapté ese código a mi
proyecto de access (ADP) y como sabeis, el código DAO que el escribió tuve
que pasarlo a ADO. El caso es que no conseguí que funcionase y ayer plantee
la duda en el foro de VB y tampoco saco nada en limpio.
Os pego el código ADO para ver si me podeis decir donde está el fallo:
(Ahora mismo el error que da es: "Se requiere un objeto")
Gracias a todos por vuestra ayuda.
Public Function ActualizarTabla() As Boolean
Dim bResult As Boolean
Dim cnn As New ADODB.Connection
Dim rstareas As New ADODB.Recordset
Dim rscuadro As New ADODB.Recordset
Dim hRef As Date, hFinal As Date
Dim strNombreCampo As String
On Error GoTo HandleErr
bResult = False
Set cnn = CurrentProject.Connection
Set cmd.ActiveConnection = cnn
rstareas.Open "Tareas", cnn, adOpenKeyset, adLockOptimistic, adCmdTable
rscuadro.Open "Tareas_Cuadro", cnn, adOpenKeyset, adLockOptimistic,
adCmdTable
hFinal = CVDate("21:00")
cmd.Execute "Delete from Tareas_Cuadro"
Do Until rstareas.EOF
rscuadro.Find "Persona = '" & rstareas!Persona & "'"
If rscuadro.EOF Then
rscuadro.AddNew
rscuadro!Persona = rstareas!Persona
End If
hRef = CVDate("08:00")
Do While DateDiff("n", hRef, hFinal) > 0
strNombreCampo = Format(hRef, "hhnn")
If DateDiff("n", rstareas!HINICIO, hRef) >= 0 And DateDiff("n",
hRef, rstareas!hFin) > 0 Then
'If rscuadro.EditMode = dbEditNone Then
'rscuadro.Edit
'End If
rscuadro.Fields(strNombreCampo).Value = True
End If
hRef = DateAdd("n", 15, hRef)
Loop
If rscuadro.EditMode <> dbEditNone Then
rscuadro.Update
End If
rstareas.MoveNext
Loop
bResult = True
ExitHere:
On Error Resume Next
ActualizarTabla = bResult
Exit Function
HandleErr:
MsgBox Err.Description, vbExclamation
bResult = False
Resume ExitHere
Resume
End Function
Antes de mirarme el código, veo que tienes puesto un control de errores en
On Error GoTo HandleErr. Ponle una comilla simple a esa línea para
desactivarla. Cuando salte el error te saldrá el cuadro de diálogo de
errores. Pulsa el botón Depurar y verás que se posiciona en una línea de
código. Hazlo y dinos que línea es esa.
Igualmente, cuando salta ese error, suele ser que no reconoce algún objeto
que está expuesto en el código y que seguramente está utilizando un método o
una propiedad.
A ver...
Saludos,
Juan M Afan de Ribera
[MVP Access]
http://www.mvp-access.com/juanmafan
"Salsita" <pik...@terra.es> escribió en el mensaje
news:egDfq290...@TK2MSFTNGP10.phx.gbl...
Saludos desde Valladolid
Francisco Javier García Aguado
http://www.mvp-access.com/foro
---
Muchas pequeñas personas
en muchos pequeños lugares
haciendo muchas pequeñas cosas
...estan cambiando este mundo
---
Ahora que lo miro mejor, "cmd" no está definido. Mira que el error no venga
de esta línea:
Set cmd.ActiveConnection = cnn
y después, la línea
cmd.Execute "Delete from Tareas_Cuadro"
te volvería a dar error.
Yo creo que puedes ejecutar esa línea utilizado el objeto
connection,olvidándote del objeto cmd (supongo que debería ser un objeto
Command). Es decir
cnn.Execute "Delete from Tareas_Cuadro"
Saludos,
Juan M Afan de Ribera
[MVP Access]
http://www.mvp-access.com/juanmafan
"Salsita" <pik...@terra.es> escribió en el mensaje
news:egDfq290...@TK2MSFTNGP10.phx.gbl...
hRef = CVDate("08:00")
strNombreCampo = Format(hRef, "hhnn")
...
rscuadro.Fields(strNombreCampo).Value = True
Por otro lado, comenta el On Error GoTo..... y fíjate exactamente en donde
te dá el error y cuales son los valores de las variables en ese momento....
Sashka
MS MVP Access
MCP ASP.Net
"Salsita" <pik...@terra.es> escribió en el mensaje
news:egDfq290...@TK2MSFTNGP10.phx.gbl...
Para que no os sea tan dificil imaginaros el código, comentaros por si ayuda
que la bd consta de 2 tablas:
TAREAS
id
persona
hinicio
hfin
y la otra:
TAREAS_CUADRO
id
persona
0800
0815
0830
........
y así hasta [2045]
es decir, un campo por cada cuarto de horas desde las 8 hasta las 20:45
El código está así:
Public Function ActualizarTabla() As Boolean
Dim bResult As Integer
Dim cmd As New ADODB.Command
Dim rsTareas As New ADODB.Recordset
Dim rscuadro As New ADODB.Recordset
Dim hFinal, hRef As Date
Dim strNombreCampo As String
' On Error GoTo HandleErr
bResult = 0
Set cnn = CurrentProject.Connection
rsTareas.Open "select * from Tareas", cnn, adOpenKeyset,
adLockOptimistic
rscuadro.Open "select * from tareas_cuadro", cnn, adOpenKeyset,
adLockOptimistic
hFinal = CVDate("20:45")
cnn.Execute "Delete from Tareas_Cuadro"
rsTareas.MoveFirst
Do Until rsTareas.EOF
rscuadro.Find "[Persona] = " & rsTareas!Persona
If rscuadro.EOF Then
rscuadro.AddNew
rscuadro!Persona = rsTareas!Persona
End If
hRef = CVDate("08:00")
Do While DateDiff("n", hRef, hFinal) > 0
strNombreCampo = Format(hRef, "hhnn")
If DateDiff("n", rsTareas!HINICIO, hRef) >= 0 And DateDiff("n",
hRef, rsTareas!hFin) > 0 Then
'If rscuadro.EditMode = dbEditNone Then
' rscuadro.Edit
'End If
rscuadro.Fields(strNombreCampo).Value = True
End If
hRef = DateAdd("n", 15, hRef)
Loop
If rscuadro.EditMode <> dbEditNone Then
rscuadro.Update
End If
rsTareas.MoveNext
Loop
bResult = True
ExitHere:
On Error Resume Next
ActualizarTabla = bResult
Exit Function
HandleErr:
MsgBox Err.Description, vbExclamation
bResult = False
Resume ExitHere
Resume
End Function
"Sashka" <sasshk...@NOVAESTOhotmail.com> escribió en el mensaje
news:uMy%23Wg%230EH...@TK2MSFTNGP12.phx.gbl...
"Sashka" <sasshk...@NOVAESTOhotmail.com> escribió en el mensaje
news:OlV9Ooi1...@TK2MSFTNGP15.phx.gbl...
> --------------------------------------------------------------------------
> ¡Importante!: Colabora con el grupo. Contesta a este mensaje y dinos si te
> sirvió o no la respuesta dada. Muchas gracias
> --------------------------------------------------------------------------
> Ese error puede deberse a que está más escrito el nombre del campo (cosa
> que dudo) pero también suele ocurrir si en el valor que se pasa hay alguna
> comilla simple.... por ejemplo O'Connor... es tu caso???
Public Function ActualizarTabla() As Boolean
Dim bResult As Boolean
Dim cn As ADODB.Connection
Dim rsTareas As ADODB.Recordset
Dim rsCuadro As ADODB.Recordset
Dim fld As ADODB.Field
Dim hRef As Date, hFinal As Date
Dim strNombreCampo As String
Dim strSQL As String
On Error GoTo HandleErr
bResult = False
Set cn = CurrentProject.Connection
Set rsTareas = New ADODB.Recordset
rsTareas.Open "Tareas", cn, adOpenForwardOnly
hFinal = CVDate("21:00")
cn.Execute "Delete from Tareas_Cuadro", Options:=adExecuteNoRecords
Do Until rsTareas.EOF
Set rsCuadro = New ADODB.Recordset
rsCuadro.Open "Select * From Tareas_Cuadro Where Persona = '" &
rsTareas!Persona & "'", cn, adOpenKeyset, adLockOptimistic
If rsCuadro.RecordCount = 0 Then
rsCuadro.AddNew
rsCuadro!Persona = rsTareas!Persona
For Each fld In rsCuadro.Fields
If fld.Name = "Persona" Then
rsCuadro!Persona = rsTareas!Persona
ElseIf Not fld.Properties("IsAutoIncrement") Then
fld.Value = 0
End If
Next fld
rsCuadro.Update
End If
hRef = CVDate("08:00")
Do While DateDiff("n", hRef, hFinal) > 0
strNombreCampo = Format(hRef, "hhnn")
If DateDiff("n", rsTareas!HINICIO, hRef) >= 0 And DateDiff("n",
hRef, rsTareas!hFin) > 0 Then
strSQL = "Update Tareas_Cuadro" _
& " Set [" & strNombreCampo & "] = 1" _
& " Where Persona = '" & rsTareas!Persona & "'"
cn.Execute strSQL, Options:=adExecuteNoRecords
End If
hRef = DateAdd("n", 15, hRef)
Loop
rsTareas.MoveNext
Sashka
MS MVP Access
MCP ASP.Net
"Salsita" <pik...@terra.es> escribió en el mensaje
news:OPHHYOf1...@TK2MSFTNGP10.phx.gbl...
"Sashka" <sasshk...@NOVAESTOhotmail.com> escribió en el mensaje
news:OlV9Ooi1...@TK2MSFTNGP15.phx.gbl...
> --------------------------------------------------------------------------
> ¡Importante!: Colabora con el grupo. Contesta a este mensaje y dinos si te
> sirvió o no la respuesta dada. Muchas gracias
> --------------------------------------------------------------------------
> Ese error puede deberse a que está más escrito el nombre del campo (cosa
> que dudo) pero también suele ocurrir si en el valor que se pasa hay alguna
> comilla simple.... por ejemplo O'Connor... es tu caso???
>
Sashka
En la tabla Tareas existe la posibilidad de que una persona aparezca varias
veces. Se recorre dicha tabla y se va comprobando (Find) si ese nombre ya se
ha añadido ya a la tabla Tareas_Cuadro, si no es así se añade y se activan
tantos campos (verdadero) como corresponda en función de su hora de inicio y
de fin para luego representar gráficamente (en un formulario) los resultados
de su ocupación diaria.
Sigo probando.
1000000 de gracias por vuestra ayuda.
"Sashka" <sasshk...@NOVAESTOhotmail.com> escribió en el mensaje
news:O87GApi1...@tk2msftngp13.phx.gbl...
No se como voy a agradeceros todo el tiempo que perdeis conmigo.
Verás efectivamente tu código ya no da error. El que tenía yo, como le acabo
de comentar a Sashka tampoco lo daba ahora al final, pero ni el mio ni el
tuyo funcionan correctamente. Es decir, agrupan correctamente a las
personas, pero no cambian a "verdadero" los campos correspondientes y creo
saber porqué. A ver que os parece a vosotros.
Le pongo un punto de interrupción en el último loop y cuando situo el ratón
encima de rsTareas!HINICIO le valor que aparece es: "01/01/1900 15:30:00"
lo mismo ocurre con rsTareas!HFIN (con su hora correspondiente) ¿Será por
eso que no calcula correctamente la diferencia y nunca se cumple la
condición?
Un saludo.
"Ricardo Hernández Sáez" <ricardohz...@hotmail.com> escribió en el
mensaje news:%233QveLj...@TK2MSFTNGP15.phx.gbl...
Que por cierto, mucha gente debería tomar nota de esto porque, a veces me
sorprende ver preguntas en el foro que han sido respondidas unos cuantos
hilos más atrás o preguntas que buscas en google y te salen 50000
soluciones.
En fin, en mi caso particular, no tengo más que agradecimientos para
vosotros, que siempre estais ahí dispuestos a echar un cable a los que menos
sabemos.
Un abrazo a todos.
"Sashka" <sasshk...@NOVAESTOhotmail.com> escribió en el mensaje
news:Otc%238oj1E...@TK2MSFTNGP10.phx.gbl...
> --------------------------------------------------------------------------
> ¡Importante!: Colabora con el grupo. Contesta a este mensaje y dinos si te
> sirvió o no la respuesta dada. Muchas gracias
> --------------------------------------------------------------------------
> :)))) Y lo hiciste solo!!!!!! no sabes lo que me alegra eso :))))
>
> Sashka
> MS MVP Access
> MCP ASP.Net
>
> "Salsita" <pik...@terra.es> escribió en el mensaje
> news:Ow2mXej1...@tk2msftngp13.phx.gbl...
>> Ya está: Sustituimos rsTareas!HINICIO por
>> FormatDateTime(rsTareas!HINICIO, vbShortTime) y lissssto.
>> De verdad, no se que haría yo sin vosotros.
>> 1000000000000000 de miles de gracias!!!
>> Un saludo
>>
>>
>> "Salsita" <pik...@terra.es> escribió en el mensaje
>> news:OJ1bjVj1...@TK2MSFTNGP10.phx.gbl...
"Salsita" <pik...@terra.es> escribió en el mensaje
news:OJ1bjVj1...@TK2MSFTNGP10.phx.gbl...
Imagina que tienes almacenados los colores de fondo en algún sítio. En
cada ciclo del bucle Do until rsTareas.EOF puedes usar un valor distinto:
idxColor = 1
Do until rstareas.eof
...
Do until rsCuadro.EOF
strSQL = "Update Tareas_Cuadro" _
& " Set [" & strNombreCampo & "] = " & idxColor _
& " Where Persona = '" & rsTareas!Persona & "'"
cn.Execute strSQL, Options:=adExecuteNoRecords
rsCuadro.Movenext
loop
idxColor = idxColor + 1
rstareas.movenext
Loop
En el formato condicional podrías tener una expresión [0915]=1, [0915]=2,
...
La interfaz de access sólo te permite 3 formatos condicionales. No sé si
mediante programación te dejará meter más. Si te deja poner los suficientes,
puta madre. Si no, pues a partir de uno dado no cambias el color. Otra
alternativa es visitar la página de Stephen Lebans http://www.lebans.com/ y
pelearte con el ejemplo que pone distintos colores de fondo en formularios
continuos e intentar adaptarlo a lo que tu tienes.
"Salsita" <pik...@terra.es> escribió en el mensaje
news:O4boinj...@TK2MSFTNGP14.phx.gbl...
> Ahora que todo funciona, se me ocurre una maravillosa idea. Que no se si
> sería posible. Bueno supongo que posible sí será, otra cosa es que sea más
o
> menos fácil. Eso ya lo dirás tú que eres el gurú.
>
> Verás. Imaginate que la tabla Tareas tuviese:
> id
> Persona
> Hora inicio
> Hora fin
> Tarea
>
> De forma que cuando agrupamos a todas las personas los cuadraditos nos van
> mostrando de que hora a que hora están ocupados. Pero el problema está en
> que como todos los cuadraditos son iguales, no sabemos si esa ocupación
> pertenece a la misma tarea o a tareas distintas.
>
> Entonces...... Podríamos diferenciar con colores (con 2 colores bastaría,
pq
> no sabemos el número de tareas que podría llegar a haber) de forma que si
> tenemos ocupado de 10 a 11 con una tarea y de 11 a 12 con otra, el color
de
> 10 a 11 sea distinto que el de 11 a 12?
>
> No se si me he explicado correctamente.
>
>
> "Ricardo Hernández Sáez" <ricardohz...@hotmail.com> escribió en el
> mensaje news:%23aKyAfj...@TK2MSFTNGP11.phx.gbl...
> > Es que los campo hora son unos ioputas ...
> >
> > Haz esta prueba:
> > 1.- Añade una tarea 'Una Persona' desde las 8:30 hasta las 10
escribiendo
> > las horas en la tabla desde el ADP.
> > 2.- Ejecuta una sentencia "Insert into Tareas (Persona, HInicio, HFin)
> > Values (Otra persona', '08:30', '10:00')
> >
> > Observa que el primer caso el valor que almacena es '18991230 08:30', y
en
> > el segundo '1990101 08:30'. El segundo valor es que encontrarás en la
> > documentación de Sql Server en lo que a fechas se refiere. Pero , ...
¿el
> > primero?
> >
> > Me parece que esto es cosa del Visual Basic para Aplicaciones. Haz otra
> > prueba:
> > Debug.Print Format(CvDate("08:30"),"dd-mm-yyyy hh:nn")
> > 30-12-1899 08:30
> >
> > La conclusión que saco es que Access almacena las horas de esa forma
para
> > que los valores de la base de datos sean consistentes con los de VBA.
> >
> > La función que te he enviado funciona perfectamente. En mi caso puede
que
> > sea porque he metido los datos de la tabla "tareas" abriendo la tabla en
> > el
> > ADP y escribiendo valores sin más. De acuerdo a lo que te he comentado,
en
> > mi caso almacena las horas con la parte de fecha puesta al 30 de
Diciembre
> > del 1899.
> >
> > No sé si te he aclarado o confundido todavía más.
> >
> > Un saludo
> >
> >
>
>
Sashka
MS MVP Access
MCP ASP.Net
"Salsita" <pik...@terra.es> escribió en el mensaje
news:Ow2mXej1...@tk2msftngp13.phx.gbl...
Sashka
MS MVP Access
MCP ASP.Net
"Salsita" <pik...@terra.es> escribió en el mensaje
news:udsPPuj1...@TK2MSFTNGP15.phx.gbl...
Verás. Imaginate que la tabla Tareas tuviese:
id
Persona
Hora inicio
Hora fin
Tarea
De forma que cuando agrupamos a todas las personas los cuadraditos nos van
mostrando de que hora a que hora están ocupados. Pero el problema está en
que como todos los cuadraditos son iguales, no sabemos si esa ocupación
pertenece a la misma tarea o a tareas distintas.
Entonces...... Podríamos diferenciar con colores (con 2 colores bastaría, pq
no sabemos el número de tareas que podría llegar a haber) de forma que si
tenemos ocupado de 10 a 11 con una tarea y de 11 a 12 con otra, el color de
10 a 11 sea distinto que el de 11 a 12?
No se si me he explicado correctamente.
"Ricardo Hernández Sáez" <ricardohz...@hotmail.com> escribió en el
mensaje news:%23aKyAfj...@TK2MSFTNGP11.phx.gbl...