Foros del Web » Programando para Internet » ASP Clásico »

Proble con las fechas gestionando noticias

Estas en el tema de Proble con las fechas gestionando noticias en el foro de ASP Clásico en Foros del Web. Buenas tardes, Tengo un problema cuando subo una noticia a una base de datos el último día de cada mes. Para conectar con la base ...

  #1 (permalink)  
Antiguo 28/02/2006, 12:48
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Proble con las fechas gestionando noticias

Buenas tardes,

Tengo un problema cuando subo una noticia a una base de datos el último día de cada mes.

Para conectar con la base de datos y que muestre la conexión utilizo el siguiente código:
<%

'Definimos y abrimos la conexión
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open ("DRIVER={Microsoft Access Driver (*.mdb)};"&"DBQ="& server.mappath("../data/datos.mdb"))
'************* SELECCIONO TODOS LOS TIPOS DE NOTICIAS QUE HAY *******************************************
Set rsTipo = Server.CreateObject("ADODB.Recordset")
sqlTipo="SELECT Tipos.* FROM Tipos ORDER BY idTipo"
rsTipo.Open sqlTipo, conn, 2, 3

'****************** SACAMOS 6 NOTICIAS DE CADA TIPO ********************************
DO WHILE NOT rsTipo.EOF
contador=contador+1
If contador=6 Then
Exit Do
End If

'Saco numero de articulos Actuales
Set rs = Server.CreateObject("ADODB.Recordset")
'FechaC=day(date)&"/"&Month(Date)&"/"&Year(date)
'sql = "SELECT * FROM Noticias WHERE idTipo="&rsTipo("idTipo")&" AND (Fecha < #"&FechaC&"# OR (Fecha = #"&FechaC&"#)) ORDER BY Fecha DESC"
FechaC=Month(Date)&"/"&((day(date))+1)&"/"&Year(date)
sql = "SELECT * FROM Noticias WHERE idTipo="&rsTipo("idTipo")&" AND (Fecha < #"&FechaC&"#) ORDER BY Fecha DESC"
rs.Open sql, conn, 1, 2
If Not rs.EOF Then

%>

Funciona siempre bien menos el último dia de cada mes. Ese día me devuelve el error:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis en la fecha en la expresión de consulta 'idTipo=1 AND (Fecha < #2/29/2006#)'.

Podeis ayudarme?

Muchas gracias
  #2 (permalink)  
Antiguo 28/02/2006, 12:56
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 21 años, 4 meses
Puntos: 144
Cita:
Iniciado por jobarme
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis en la fecha en la expresión de consulta 'idTipo=1 AND (Fecha < #2/29/2006#)'.
El último día de febrero '06, es el 28, no el 29.
  #3 (permalink)  
Antiguo 28/02/2006, 13:11
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Lo se, lo se. El problema es que al fijar la fecha he tenido que poner:

FechaC=Month(Date)&"/"&((day(date))+1)&"/"&Year(date)

porque si no no me muestra la última noticia que he subido
  #4 (permalink)  
Antiguo 28/02/2006, 13:23
Avatar de HookerSP  
Fecha de Ingreso: diciembre-2004
Mensajes: 983
Antigüedad: 20 años, 4 meses
Puntos: 12
- Yo creo q si pones <= en vez de < te tiene q funcionar no?

- OJO. Aunqe tengas la configuracion regional a 'spanish' y formato de fecha 'normal' resulta q ACCESS internamente maneja las fechas en formafo mm/dd/aaaa.

yo hace un año pase las de Cain por esto. No creo q haya cambiado.

Espero q te valgq esto.
Hooker
  #5 (permalink)  
Antiguo 28/02/2006, 13:28
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
No me funciona, recibo el mismo error:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis en la fecha en la expresión de consulta 'idTipo=1 AND (Fecha <= #2/29/2006#)'.
  #6 (permalink)  
Antiguo 28/02/2006, 13:32
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
El problema, yo creo, está aquí:

FechaC=Month(Date)&"/"&((day(date))+1)&"/"&Year(date)

Utilizo el +1 porque sino no me muestra la úlmina noticia que he subido
  #7 (permalink)  
Antiguo 28/02/2006, 13:35
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Implementa esta función:

Cita:
<%' mostrar el ultimo dia de un mes
Function LastDayOfMonth(iMonth, iYear)
NextMonth = DateAdd("m", 1, DateSerial(iYear, iMonth, "01"))
LastDayOfMonth = Day(DateAdd("d", -1, NextMonth))
End Function
%>

Ultimo día del mes Febrero de 2006: <%=LastDayOfMonth(2,2006)%>
Saludos
  #8 (permalink)  
Antiguo 28/02/2006, 15:22
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Pero eso sería válido en el mes de febrero pero me ocurre lo mismo todos los últimos días de mes
  #9 (permalink)  
Antiguo 01/03/2006, 01:18
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Sigo sin solucionarlo, a alguien se le ocurre algo??
  #10 (permalink)  
Antiguo 01/03/2006, 04:21
Avatar de ElAprendiz  
Fecha de Ingreso: enero-2002
Ubicación: Maipu, Chile
Mensajes: 3.706
Antigüedad: 23 años, 2 meses
Puntos: 2
el codigo que te dio myakire es valido para cualquier mes. el ejemplo lo puso para febrero
  #11 (permalink)  
Antiguo 01/03/2006, 06:36
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Si, lo se, me di cuenta al volver a revisarlo, pero lo he implementado y me da error:

HTTP 500 - Error interno del servidor
Internet Explorer
  #12 (permalink)  
Antiguo 01/03/2006, 06:37
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
El error exactamente es este:

Error de compilación de Microsoft VBScript error '800a03ea'

Error de sintaxis

/index.asp, línea 33

Function LastDayOfMonth(iMonth, iYear)
  #13 (permalink)  
Antiguo 01/03/2006, 06:39
Avatar de ElAprendiz  
Fecha de Ingreso: enero-2002
Ubicación: Maipu, Chile
Mensajes: 3.706
Antigüedad: 23 años, 2 meses
Puntos: 2
tienes que llamarlo asi

LastDayOfMonth(2,2006)

sin la palabra function
  #14 (permalink)  
Antiguo 01/03/2006, 09:02
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Perdonar que insista pero de tanto darle vueltas ya no se ni lo que hago, o es probable que no me explique bien.

Actualmente lo tengo hecho de forma que me muestra el titular, la imagen y un encabezamiento, de la última noticia, de 250 palabras. También muestra los titulares de las 6 noticias anteriores
<%

'Definimos y abrimos la conexión
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open ("DRIVER={Microsoft Access Driver (*.mdb)};"&"DBQ="& server.mappath("../data/datos.mdb"))
'************* SELECCIONO TODOS LOS TIPOS DE NOTICIAS QUE HAY *******************************************
Set rsTipo = Server.CreateObject("ADODB.Recordset")
sqlTipo="SELECT Tipos.* FROM Tipos ORDER BY idTipo"
rsTipo.Open sqlTipo, conn, 2, 3

'****************** SACAMOS 6 NOTICIAS DE CADA TIPO ********************************
DO WHILE NOT rsTipo.EOF
contador=contador+1
If contador=6 Then
Exit Do
End If

'Saco numero de articulos Actuales
Set rs = Server.CreateObject("ADODB.Recordset")
'FechaC=day(date)&"/"&Month(Date)&"/"&Year(date)
'sql = "SELECT * FROM Noticias WHERE idTipo="&rsTipo("idTipo")&" AND (Fecha < #"&FechaC&"# OR (Fecha = #"&FechaC&"#)) ORDER BY Fecha DESC"
FechaC=Month(Date)&"/"&(day(date))&"/"&Year(date)
sql = "SELECT * FROM Noticias WHERE idTipo="&rsTipo("idTipo")&" AND (Fecha < #"&FechaC&"#) ORDER BY Fecha DESC"
rs.Open sql, conn, 1, 2
If Not rs.EOF Then

%>

Y la llamada la hago así:

Así obtengo última noticia

<% If rs("Imagen")<>"" Then %><img class="noticias" src="noticias/<%=rs("Imagen")%>" width="108" height="118" alt="" /><% End If %><strong><%=rs("Titulo")%></strong>
<br /><br /><%=FormatStr(Left(rs("Texto"),250))%>...&nbsp;&nb sp;<br /><a href="noticias_ver.asp?idNoticia=<%=rs("idNoticia" )%>">Ver Noticia Completa..</a></p>
<%

Así obtengo los 6 titulares anteriores

<%
rs.MoveNExt
noticia=1
do while not rs.EOF and noticia < 7
%>
<li><a href="noticias_ver.asp?idNoticia=<%=rs("idNoticia" )%>"><%=rs("Titulo")%></a></li>
<%
rs.MoveNext
noticia=noticia+1
loop
%>
</ul>
<%
End If

rsTipo.MoveNext
Loop
%>
<%
rs.Close
conn.Close
%>

Todo funciona bien menos cuando introduzco una noticia el último día del mes. ese día obtengo el error:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis en la fecha en la expresión de consulta 'idTipo=1 AND (Fecha < #2/29/2006#)'.

Exactamente donde tengo que implementar la función que muestra el último día??
  #15 (permalink)  
Antiguo 01/03/2006, 10:44
Avatar de ElAprendiz  
Fecha de Ingreso: enero-2002
Ubicación: Maipu, Chile
Mensajes: 3.706
Antigüedad: 23 años, 2 meses
Puntos: 2
por que no usas esto:
"select top 6 * from noticias where idTipo="&rsTipo("idTipo")&" order by fecha desc"
  #16 (permalink)  
Antiguo 01/03/2006, 11:44
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Funciona, pero sigue sin sacarme la última noticias. Me saca la noticia del 27/02/2006 pero no la del 28/02/2006

La noticia del 28/02/2006 existe pero no la muestra aquí que es lo que debería hacer. De hecho en esta misma página tengo el enlace:

<a href="noticias_titulares.asp?nt=<%=rsTipo("idTipo" )%>">Ver mas noticias..</a>

... y aquí si me muestra el titular y la noticia del 28/02/2006
  #17 (permalink)  
Antiguo 01/03/2006, 11:52
Avatar de ElAprendiz  
Fecha de Ingreso: enero-2002
Ubicación: Maipu, Chile
Mensajes: 3.706
Antigüedad: 23 años, 2 meses
Puntos: 2
deberia tomartela si no es asi, el error va por otro lado.

1- quita el "where idTipo="&rsTipo("idTipo")&" " de la sentencia, o sea sin filtro, para ver si te la toma.

2.- haz un "response.write rs.recordcount" para ver cuantos registros te devuelve

ah nos cuentas..
  #18 (permalink)  
Antiguo 01/03/2006, 12:19
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 24 años, 2 meses
Puntos: 535
Probá así:

...WHERE idTipo="&rsTipo("idTipo")&" AND (Fecha <= #"&FechaC&"#) ORDER...
__________________
...___...
  #19 (permalink)  
Antiguo 01/03/2006, 12:22
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Vamos avanzando, sin el filtro funciona, me saca la última noticia, pero el problema es que tengo 2 tipos de noticias: Tema 1 y Tema 2, de forma que, primero me muestra la última noticia y 6 titulares del Tema1 y despues la última noticia y 6 titulares del Tema2.
Quitando el filtro me repite el Tema 1 dos veces
  #20 (permalink)  
Antiguo 01/03/2006, 12:46
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Al Zuwaga he probado tu código y así no me saca la última noticia
  #21 (permalink)  
Antiguo 01/03/2006, 13:28
Avatar de ElAprendiz  
Fecha de Ingreso: enero-2002
Ubicación: Maipu, Chile
Mensajes: 3.706
Antigüedad: 23 años, 2 meses
Puntos: 2
quieres sacar las 6 ultimas noticias cuyo tema sea ="tema1" y las 6 ultimas noticias cuyo tema="tema2"?
  #22 (permalink)  
Antiguo 01/03/2006, 13:51
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Si las noticias están clasificadas en 2 temas (en el código Tipos): General y Medio Ambiente, y despliega la información así:

Noticias: General

Ultima noticia: titulo, imagen y 250 palabras del texto (encabezamiento)
Los 6 titulares anteriores a la última noticias

Noticias: Medio Ambiente

Ultima noticia: titulo, imagen y 250 palabras del texto (encabezamiento)
Los 6 titulares anteriores a la última noticias

Así que al quitar el idtipo de la sentencia pierdo la clasificación
  #23 (permalink)  
Antiguo 01/03/2006, 14:10
Avatar de ElAprendiz  
Fecha de Ingreso: enero-2002
Ubicación: Maipu, Chile
Mensajes: 3.706
Antigüedad: 23 años, 2 meses
Puntos: 2
y por que no haces 2 consultas? o mantienes el sql sin filtrar y filtras en el ciclo

ej

Código:
do while not rs.eof
    select case rs("idtipo")
    case 1
       'muestras la noticia tipo1
    case 2
       'muestras la noticia tipo2
    end select
    rs.movenext
loop

Última edición por ElAprendiz; 01/03/2006 a las 16:13
  #24 (permalink)  
Antiguo 01/03/2006, 14:36
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
No puedo dejarlo con 2 consultas porque desde el módulo de administración está abierta la posibilidad de generar nuevos temas (Tipos).

Lo que no acabo de entender es qué hago mal para que no me muestre la última noticia cuando hay filtro.
  #25 (permalink)  
Antiguo 01/03/2006, 18:51
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Dios ... hay que ser práctico, en caso de que el código de A_Z ( ... (Fecha <= #"&FechaC&"#) ... ) no saque el último día, pues lo que deberías hacer es un DateAdd de un día a FechaC y listo. ¿no crees?, prueba esa idea, por favor.
  #26 (permalink)  
Antiguo 02/03/2006, 01:29
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
Buenos días Myakire,
Con el DateAdd obtendría resultados en un intervalo de tiempo pero yo no conozco ese intervalo. Lo que necesito es que me muestre:

La última noticia (titular, imagen y encabezamiento) + los titulares de las 6 noticias anteriores a esta última.

Tanto la última noticias como las anteriores se han podido generar en la última semana o en el último mes. No conozco el intervalo de tiempo en el que se producen las noticias.
  #27 (permalink)  
Antiguo 02/03/2006, 10:16
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 24 años, 2 meses
Puntos: 535
Cita:
La última noticia (titular, imagen y encabezamiento) + los titulares de las 6 noticias anteriores a esta última.

select top 7 * from tabla_noticias order by campo_fecha desc
__________________
...___...
  #28 (permalink)  
Antiguo 02/03/2006, 17:48
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Cita:
Iniciado por jobarme
Buenos días Myakire,
Con el DateAdd obtendría resultados en un intervalo de tiempo pero yo no conozco ese intervalo. Lo que necesito es que me muestre:

La última noticia (titular, imagen y encabezamiento) + los titulares de las 6 noticias anteriores a esta última.

Tanto la última noticias como las anteriores se han podido generar en la última semana o en el último mes. No conozco el intervalo de tiempo en el que se producen las noticias.
DateAdd no trabaja con intervalos, sino con una fecha en particular, y puede sumar o restar días, meses, etc. Por lo que he leido, tu ya tienes resulto el hecho de presentar las noticias, pero te falla en el último día de cada mes por que le sumas 1 a la fecha.

Solución Uno ya dada:
Con la primer función que te pasé hubieras podido validar que no te encuentras en el último día del mes y entonces no sumar ese uno.

Solución Dos ya dada:
Con el DateAdd sumas 1, igual, pero no como lo hacías (day(date))+1), sino a la fecha, es decir que si estas en el último día del mes y sumas uno, entonces estaras en el primer día del mes siguiente, y no se tendrá el error de fecha.

Solución Tres ya dada:
Cualquiera de los otros post de los demás compañeros, supongo funcionan también, pero con lo que te sugerí en las dos primeras soluciones, no modificarías casí nada tu código.

Saludos
  #29 (permalink)  
Antiguo 03/03/2006, 05:04
 
Fecha de Ingreso: febrero-2006
Mensajes: 18
Antigüedad: 19 años, 1 mes
Puntos: 0
La verdad es que no se como hacerlo con DateAdd. Yo, como ya has visto, lo tengo así:

FechaC=Month(Date)&"/"&((day(date))+1)&"/"&Year(date)
sql = "SELECT * FROM Noticias WHERE idTipo="&rsTipo("idTipo")&" AND (Fecha < #"&FechaC&"#) ORDER BY Fecha DESC"

Si quiero evitar que añada un número a la fecha cuando el mes ha termidado tendre que quitar el +1

FechaC=Month(Date)&"/"&(day(date))&"/"&Year(date)

Pero como hago el DateAdd para que haga el salto al mes siguiente??
  #30 (permalink)  
Antiguo 03/03/2006, 05:27
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 21 años, 4 meses
Puntos: 144
Mira, es muy sencillo, por eso lo mejor es que la hagas tú, a través de una explicación de la función dateadd.

Cita:
Función DateAdd

Devuelve una fecha a la que se le ha agregado un intervalo de tiempo especificado.
DateAdd(intervalo, número, fecha)
Argumentos

intervalo
Necesario. Expresión de cadena que es el intervalo que desea agregar. Consulte la sección Valores para ver los valores.
número
Necesario. Expresión numérica que es el número de intervalo que desea agregar. La expresión numérica puede ser positiva, para fechas futuras, o negativa, para fechas pasadas.
fecha
Necesario. Tipo Variant o literal que representa la fecha a la que se agrega el intervalo.
Valores

El argumento intervalo puede tener los siguientes valores:
Valor - Descripción
yyyy - Año
q - Trimestre
m - Mes
y - Día del año
d - Día
w -Día de la semana
ww - Semana del año
h - Hora
n - Minuto
s - Segundo

Comentarios

Puede utilizar la función DateAdd para sumar un intervalo de tiempo especificado a una fecha o restárselo. Por ejemplo, puede utilizar DateAdd para calcular una fecha de 30 días a partir de hoy o una hora de 45 minutos desde ahora. Para agregar días a fecha, puede utilizar el Día del Año ("y"), Día ("d") o Día de la semana ("w").
La función DateAdd no devolverá una fecha que no sea válida. El siguiente ejemplo suma un mes al 31 de enero:
NewDate = DateAdd("m", 1, "31-ene-95")En este caso, DateAdd devuelve 28-feb-95, no 31-feb-95. Si fecha es 31-ene-96, devuelve 29-feb-96 porque 1996 es un año bisiesto.
Si la fecha calculada fuera anterior al año 100, se produciría un error.
Si el número no es un valor Long, se redondea al número entero más cercano antes de evaluarse.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:11.