Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-12-2005
Velia Velia is offline
Miembro
 
Registrado: oct 2005
Posts: 71
Poder: 19
Velia Va por buen camino
Problemas con la utilización de parametros en el clienDataset!!

Hoola a todos
Estoy trabajando con la tecnología DataSnap y Access como BD. Estoy utilizando ADODataSets en la capa de abajo y clientDataSets en la capa de arriba para visualizar los datos.
Mi problema es el siguiente:

Yo genero en tiempo de ejecución la consulta SQL que se irá formando a partir del tipo de búsqueda elejida por el usuario. Es decir formo una cadena con la sentencia SQL, la cual la asigno al ClientDataSet:

ClientDataSet.CommandText:= strCadenaSQL;

Y esta a su vez pasa a la capa de abajo la cuál la ejecuta.

previamente utilizo parametros para tomar los datos ingresados por los usuarios de esta forma:

clientdataset.Params[1].AsDate:=strtoDate(edit1_Fecha_desde.Text);
clientdataset.Params[2].AsDate:=strtoDate(edit2_Fecha_hasta.Text);

strCadenaSQL:=strCadenaSQL+ '(( WHERE ordenanzas.fecha_sancion >= arametro1) AND (ordenanzas.fecha_sancion<= arametro2)) ';


Pero cuando voy a ejecutar la consulta con los parametros anteriores. La primera vez ésta se ejecuta bien. Pero la segunda vez me sale un error como el siguiente, referido a los parametros del clientDataSet:

error ' List index out of bounds(2)'

No sé que puede ser ya que el clientDataSet lo cierro y abro cada vez que hago una consulta nueva.

Les agredezco la ayuda. Saludos
Velia
Responder Con Cita
  #2  
Antiguo 02-12-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
Te falta usar el método FetchParams del ClientDataSet para que el componente genere la lista de parámetros. Sería algo así;

Código Delphi [-]
with ClientDataSet do
begin
  CommandText:= strCadenaSQL;
  FetchParams;
  // A partir de aquí ya están disponibles los parámetros en el ClientDataSet
  Params.ParamByName('Parametro1').Text := edit1_Fecha_desde.Text;
  Params.ParamByName('Parametro2').Text := edit2_Fecha_hasta.Text;
end;

Un saludo
Responder Con Cita
  #3  
Antiguo 02-12-2005
Velia Velia is offline
Miembro
 
Registrado: oct 2005
Posts: 71
Poder: 19
Velia Va por buen camino
Thumbs up Muchas Gracias por la ayuda pero PORQUE????

Gracias por tu ayuda Thales hice como me dijiste y salio. En realidad ya habia ejecutado el FetchParams.
Pero estaba referenciando los parametros de la siguiente manera y eso me causaba error:

ClientDataSet.params[1].asString:= edit1.text;

Lo que no entiendo porque me puede salir un desbordamiento de límites de un parametro por referenciarlo de esta manera.

Saludos
Responder Con Cita
  #4  
Antiguo 03-12-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
Seguramente el motivo será que te referías a los parámetros como params[1] y params[2], cuando lo correcto hubiera sido más bien hacerlo como params[0] y params[1].

De todas maneras siempre es preferible acceder a ellos con el método ParamByName.

Un saludo
Responder Con Cita
  #5  
Antiguo 03-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
¿cuantos parámetros tiene tu consulta?

Tenes que estar consciente que al acceder a Params[1] en realidad estas tratando de ir al segundo parámetro del ClientDataSet, pues el arreglo de parámetros está basado en 0.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 03-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Thales
De todas maneras siempre es preferible acceder a ellos con el método ParamByName.
Veo que te has adelantado por unos segundos..

podrias explicarnos por que te parece preferible acceder a los parámetros por nombre y no por su índice.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 03-12-2005
Velia Velia is offline
Miembro
 
Registrado: oct 2005
Posts: 71
Poder: 19
Velia Va por buen camino
Abusándome de tu buena voluntad te pregunto alguito mas

Si los referenciaba bien desde 0 hasta 8 porque tengo varios parametros, pero justo me causaban error cuando trabajaba con fechas. Pensé que ese era el problema.

Ahora me surgio otro problemita.

Cuando ejecuto la consulta todo me sale bien. inclusive cambiando los valores que contienen los parametros y ejecutando de vuelta.
O cuando cambio la consulta SQL , y formo otra cadena SQL utilizando diferentes parametros: por ejemplo utilizando el prametro5.
Pero el problema me surge cuando vuelvo a utilizar la consulta anterior es decir la cadena SQL que me contenía el parametro0 (por ejemplo).

Entonces me surge otro error que dice ClientDataSet 'parametro0' not found

Te agradecería que me ayudes.
Si eres de Argentina te prometo que te invito a mi colación que es este 16 de Dic. y justamente este programa tengo que presentar
SALUDOS
Responder Con Cita
  #8  
Antiguo 03-12-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Velia
Entonces me surge otro error que dice ClientDataSet 'parametro0' not found
Si cambias la cadena SQL, lo que procede es llamar nuevamente al método fetchparams.
Cita:
Empezado por Velia
Si eres de Argentina te prometo que te invito a mi colación que es este 16 de Dic. y justamente este programa tengo que presentar
SALUDOS
Pues no soy de argentina... pero si pagas los boletos, prometo asistir

Saludos.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 03-12-2005
Velia Velia is offline
Miembro
 
Registrado: oct 2005
Posts: 71
Poder: 19
Velia Va por buen camino
sigos con problema. Porque es tan delicado tratar con parametros?

Aqui sigo no entiendo porque me sigue saliendo errores.
SI. hice como dijiste, es mas lo tenía así. cada vez que ejecuto la cadena me hace un fetchparams.

Mirá así es como lo tengo

ClientDataSet.FetchParams; lo puse de vuelta para insistir
ClientDataSet.Close;
Determinar_Tipo_de_CombinacionSQL;// aqui formo la cadena SQL segun la elección del usuario para eltipo de búsqueda
ClientDataSet.CommandText:= strCadena;
ClientDataSet.Execute;
ClientDataSet.FetchParams;
ClientDataSet.Open;


for i:=0 to ClientDataSet.FieldCount-1 do
begin
dbgrid1.Columns.Add.FieldName:= ClientDataSet.FieldDefList.FieldDefs[i].Name;
end;


Bueno ya no se que pasa. Si me puedes seguir ayudando creo que voy a terminar pagandote el boleto Aqui en Argentina tenemos buen vino y hacemos buenas fiestas
Responder Con Cita
  #10  
Antiguo 03-12-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
Cita:
Empezado por jachguate
Veo que te has adelantado por unos segundos..

podrias explicarnos por que te parece preferible acceder a los parámetros por nombre y no por su índice.

Hasta luego.

Pues a bote pronto se me ocurren dos motivos:
El primero es que hace más legible el código pues se entiende mejor una asignación del tipo
Código Delphi [-]
Params.ParamByName('Nombre').Text := ENombre.Text;
que otra del tipo
Código Delphi [-]
Params[1].Text := ENombre.Text;
y segundo que es mucho más fácil cometer errores con esta segunda manera de hacer las cosas pues la ley de murphy dirá en este caso que siempre cogeremos el índice equivocado.
A pesar de que la asignación se haga al parámetro correcto, posteriormente podemos cambiar la definición de la consulta y puede que la ordenación de los parámetros cambie, en cuyo caso la asignación anterior será incorrecta.

Un saludo
Responder Con Cita
  #11  
Antiguo 03-12-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
Prueba así a ver

Código Delphi [-]
with ClientDataSet do
begin
  Close;
  // Formamos la cadena SQL según la elección del usuario
  Determinar_Tipo_de_CombinacionSQL;
  CommandText := strCadenaSQL;
  { lo que sigue no es necesario, pues si no se asignan las columnas
    el dbgrid las toma automáticamente }
  dbgrid1.Columns.Clear; // Para borrar las asignaciones anteriores de columnas
  for i := 0 to FieldCount-1 do
    dbgrid1.Columns.Add.FieldName := Fields[i].FieldName;
  { llamamos a FetchParams después de asignar la consulta y antes de
    asignar los valores de los parámetros }
  FetchParams;
  // Aquí es donde tienes que asignar los valores de los parámetros
  Params.ParamByName('NombreParámetro').Text := ElEditAsociado.Text;
  // Si se trata de un select usas open y en otro caso usas Execute
  Open;
end;

Un saludo

Última edición por Thales fecha: 03-12-2005 a las 11:03:42.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:22:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi