• Domingo 22 de Diciembre de 2024, 13:36

Autor Tema:  Error De Tipos  (Leído 4043 veces)

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Error De Tipos
« en: Miércoles 8 de Septiembre de 2004, 18:07 »
0
Qué tal amigos del foro?
Soy novatillo en la programación de bases de datos y ADO así que para practicar un poco decidí crearme, en access, una base de datos super simple de una sola tabla. Dicha tabla contiene 3 campos: cedula,nombre y fechanac cuyos tipos son texto, texto y fecha/hora respectivamente. El campo fechanac tiene un formato fecha corta del tipo 19/06/1994.
Para trabajar sobre la base de datos uso una referencia a ADO 2.0 y utilizo los tres objetos disponibles, es decir, un objeto conexion, un objeto command y un objeto recorset.
Ahora bien lo que deseo hacer es que el usuario pueda colocar dos fechas y que se devuelva en el recorset todas las fechas que estén dentro de dicho intervalo. Uso un código similar a este:

Código: Text
  1.  
  2. 'En la parte de declaracione generales
  3. Dim cnnMiCon As ADODB.Connection
  4. Dim cmdCriterio As ADODB.Command
  5. Dim rstTabla As ADODB.Recordset
  6. '
  7. '
  8. '
  9. 'En el botón de búsqueda
  10. Private Sub Buscar()
  11.    Dim inicial As Date
  12.    Dim final As Date
  13.    '
  14.    If txtFechaInicial.Text <> "" And txtFechaFinal.Text <> "" Then
  15.       '
  16.       Set rstTabla = Nothing
  17.       Set cmdCriterio = Nothing
  18.       Set cnnMiCon = Nothing
  19.       '
  20.       inicial = txtFechaInicial.Text
  21.       final = txtFechaFinal.Text
  22.       '
  23.       Set cnnMiCon = New ADODB.Connection
  24.       Set cmdCriterio = New ADODB.Command
  25.       Set rstTabla = New ADODB.Recordset  
  26.       '
  27.       cnnMiCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security                  Info=False;Data Source=C:\WINDOWS\Escritorio\ProyectoFechas\fechas97_1.mdb"
  28.       cnnMiCon.Open
  29.       '
  30.       cmdCriterio.CommandText = "SELECT cedula,nombre,fechaNac FROM tabla1 WHERE fechaNac>'" &         inicial & "'" And fechaNac < "'" & final & "'"
  31.       '  
  32.       rstTabla.Open cmdCriterio.CommandText, cnnMiCon, adOpenDynamic
  33.       '
  34.       rstTabla.MoveFirst
  35.       txtCedula = rstTabla.Fields("cedula").Value
  36.       txtNombre = rstTabla.Fields("nombre").Value
  37.       txtFecha = rstTabla.Fields("fechaNac").Value
  38.    End If
  39. End Sub
  40.  
  41.  

Ahora bien, cuando corro el programa introduzco las fechas y pulso el botón buscar obtengo el error 13 "No coinciden los tipos" en la línea:

Código: Text
  1.  
  2.    cmdCriterio.CommandText = "SELECT cedula,nombre,fechaNac FROM tabla1 WHERE fechaNac>'" &       inicial & "'" And fechaNac < "'" & final & "'"
  3.  
  4.  

Si coloco directamente en el código por ejemplo:

Código: Text
  1.  
  2.    cmdCriterio.CommandText = "SELECT cedula,nombre,fechaNac FROM tabla1 WHERE fechaNac >            #1/1/1960# AND fechaNac < #1/1/1991#"
  3.  
  4.  
   
No obtengo ningún error.

Necesito dos cosas:
 1.- Estoy implementando bien el código para trabajar con ADO?
 2.- Cómo corrijo el error de tipos?

De antemano muchas gracias por la ayuda.

DiabloRojo

Kev

  • Miembro HIPER activo
  • ****
  • Mensajes: 654
    • Ver Perfil
Re: Error De Tipos
« Respuesta #1 en: Miércoles 8 de Septiembre de 2004, 23:28 »
0
Para corregir este error deberas validar el ingreso de datos, para esto puedes usar la funcion IsDate()

Código: Text
  1.  
  2. If IsDate(Text1.Text) Then
  3.    'Aca colocas tus instrucciones o la consulta SQL
  4. End If
  5.  
  6.  

IsDate te devuelve un valor Booleano, true o false

Salu2
La teoria es asesinada tarde o temprano por la experiencia
Albert Einstein
Kev - 3 DCE
-----------------------------------------------------
Articulos:
Convertir texto a imagen en ASP.NET
Trabajando con el Global.asax

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Re: Error De Tipos
« Respuesta #2 en: Jueves 9 de Septiembre de 2004, 02:15 »
0
Qué tal Kev?
Gracias por responder. Hago lo que me dices y me sigue mostrando el mismo error. Incluso he añadido la función CDate() a las líneas:

Código: Text
  1.  
  2.    inicial=CDate(txtFechaInicial.text)
  3.    final=CDate(txtFechaFinal.text)
  4.  
  5.  

Y me muestra el mismo error.

Añadí un control ADODC y un MSHFlexGrid para ver todos los registros y me doy cuenta que a pesar de haber colocado el campo fechanac de tipo fecha/hora en formato dd/mm/yyyy (fecha corta) los registros aparecen con el formato mm/dd/yyyy ¿tendrá esto que ver con la aparición del error?.

Agradezco toda ayuda.

DiabloRojo

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Error De Tipos
« Respuesta #3 en: Jueves 9 de Septiembre de 2004, 05:40 »
0
El error 13 se debe a que estás intentando hacer una búsqueda de fecha como String, con comillas simples, sustituye las comillas simples por el signo de número como sigue:

Código: Text
  1. cmdCriterio.CommandText = "SELECT cedula,nombre,fechaNac FROM tabla1 WHERE fechaNac>#" & inicial & "#" And fechaNac < "#" & final & "#"
  2.  
  3.  
  4.  
El formato de fecha para hacer la búsqueda debe ser mm/dd/yyyy o no funcionará.

 :)


---------------------
"Corrector Ortográfico de Notas", freeware, utilidad para programadores.
Programado en VB6, con diccionario propio.

http://consultapractica.aztecaonline.net/index2.html

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Re: Error De Tipos
« Respuesta #4 en: Jueves 9 de Septiembre de 2004, 21:02 »
0
Qué tal cpmario?
Gracias por contestar. Ya resolví el problema y venía a contestar cuando ví tu respuesta. La solución es la siguiente:

Código: Text
  1.  
  2.    Dim inicial As String
  3.    Dim final As String
  4.  
  5.    inicial= "#" & txtFechaInicial.Text & "#"
  6.    final= "#" & txtFechafinal & "#"
  7.  
  8.    cmdCriterio.CommandText="SELECT cedula,nombre,fechaNac FROM tabla1    WHERE fechaNac> " & inicial & " And fechaNac < " & final
  9.  
  10.  

Según entiendo, las variables "inicial" y "final" NO tienen que ser de tipo Date ya que la propiedad CommandText es precisamente una cadena de caracteres (esto explica el error de tipos). Luego cuando se abre el recorset (con Open) ADO se encarga de convertir lo que contenga esta cadena -si es el caso- en una instruccuón SQL.

Bueno, eso era todo. Gracias a todos los que respondieron y a los que se tomaron el tiempo de leer mi duda.

Suerte.


DiabloRojo

Kev

  • Miembro HIPER activo
  • ****
  • Mensajes: 654
    • Ver Perfil
Re: Error De Tipos
« Respuesta #5 en: Jueves 9 de Septiembre de 2004, 21:57 »
0
Tienes razon, pero yo te aconsejaba el uso de IsDate solo para validar no para convertir a formato fecha, como ya te indique IsDate te devuelve true o false

Ej:

Código: Text
  1.  
  2. Dim Fecha1 As String
  3. Dim Fecha2 As String
  4. Dim Fecha3 As String
  5. Dim Resultado As Boolean
  6.  
  7. Fecha1="November 26, 1981"
  8. Fecha2=#11/26/81#
  9. Fecha3="Cualquier cosa"
  10.  
  11. Resultado = IsDate(Fecha1)   'Devuelve True
  12.  
  13. If Resultado Then
  14.    'Aca colocas tus instrucciones a realizar si la fecha introducida seria valida
  15. End If
  16. Resultado = IsDate(Fecha2)   'Devuelve True
  17. Resultado = IsDate(Fecha3)   'Devuelve False
  18.  
  19.  

Nota.- El formato de la fecha depende de la configuracion regional, en este ejemplo el idioma es Ingles, y en este formato se coloca primero el mes.

Salu2
 :comp:
La teoria es asesinada tarde o temprano por la experiencia
Albert Einstein
Kev - 3 DCE
-----------------------------------------------------
Articulos:
Convertir texto a imagen en ASP.NET
Trabajando con el Global.asax

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Re: Error De Tipos
« Respuesta #6 en: Viernes 10 de Septiembre de 2004, 02:20 »
0
Hola Kev.
Te agradezco la recomendación de validar las entradas. Como solo estoy practicando y soy el único que utilizará la aplicación no consideré necesario incluir validaciones. Lo que sí me extraña es que me esté me guardando con el formato mm/dd/yyyy siendo que mi computador está configurado al español. Por cierto, hay alguna forma de que aparezca en mi MSHFlexGrid el campo con el formato dd/mm/yyyy aunque en la tabla esté almacenado como mm/dd/yyyy?.

Bueno, muchas gracias por los comentarios y consejos.


DiabloRojo

Kev

  • Miembro HIPER activo
  • ****
  • Mensajes: 654
    • Ver Perfil
Re: Error De Tipos
« Respuesta #7 en: Viernes 10 de Septiembre de 2004, 16:00 »
0
Intenta con esto:
Código: Text
  1.  
  2. FlexGrid.TextMatrix(i,j) = format (Tufecha,"dd/mm/yyyy")
  3.  
  4.  

Nota.- TuFecha es la variable donde almacenas tu fecha (creo que es logico pero no esta por demas aclarar), aparte i, j, con variables que almacenan la posicion en la que te encuentras(fila y columna)

Salu2
 :comp:
La teoria es asesinada tarde o temprano por la experiencia
Albert Einstein
Kev - 3 DCE
-----------------------------------------------------
Articulos:
Convertir texto a imagen en ASP.NET
Trabajando con el Global.asax

Juanolo

  • Miembro MUY activo
  • ***
  • Mensajes: 202
    • Ver Perfil
Re: Error De Tipos
« Respuesta #8 en: Viernes 10 de Septiembre de 2004, 16:18 »
0
Un pequeño aporte:
Me parece que se está pasando por alto un punto muy relevante, y que en su momento me tuvo de cabeza.:brickwall:
El asunto es que en una instrucción SQL el formato de fecha, además de ir entre alfombrillas (#), DEBE se el formato gringo; es decir "mm/dd/yy" (mes/día/año). Si utilizas otro no dará los resultados que esperas.

Luego, una forma de asegurarnos que todo esté correcto es:


Código: Text
  1.   inicial= "#" & format(txtFechaInicial.Text, "mm/dd/yy") & "#"
  2.   final= "#" & format(txtFechafinal.text, "mm/dd/yy") & "#"
  3.  

Espero ser de ayuda.

Salu2. :hola:
La luz que sólo se ilumina a sí misma, es oscuridad.

DiabloRojo

  • Miembro MUY activo
  • ***
  • Mensajes: 220
    • Ver Perfil
Re: Error De Tipos
« Respuesta #9 en: Viernes 10 de Septiembre de 2004, 21:03 »
0
Tienes toda la razón Juanolo. Todo comentario y sugerencia es bien recibido.
Gracias por tomarte el tiempo.

DiabloRojo