Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con la utilización de parametros en el clienDataset!! (https://www.clubdelphi.com/foros/showthread.php?t=27883)

Velia 02-12-2005 14:29:19

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 >= :parametro1) AND (ordenanzas.fecha_sancion<= :parametro2)) ';


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

Thales 02-12-2005 16:57:44

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

Velia 02-12-2005 23:53:23

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.:rolleyes::rolleyes:

Saludos

Thales 03-12-2005 00:12:02

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

jachguate 03-12-2005 00:14:31

¿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.

;)

jachguate 03-12-2005 00:16:04

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.. :D

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

Hasta luego.

;)

Velia 03-12-2005 00:30:50

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.:D

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:p
SALUDOS

jachguate 03-12-2005 00:52:52

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:p
SALUDOS

Pues no soy de argentina... pero si pagas los boletos, prometo asistir :D

Saludos.

;)

Velia 03-12-2005 01:13:24

sigos con problema. Porque es tan delicado tratar con parametros?
 
Aqui sigo no entiendo porque me sigue saliendo errores.:mad:
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 :D
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:p Aqui en Argentina tenemos buen vino y hacemos buenas fiestas:D

Thales 03-12-2005 10:20:01

Cita:

Empezado por jachguate
Veo que te has adelantado por unos segundos.. :D

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

Thales 03-12-2005 10:49:10

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


La franja horaria es GMT +2. Ahora son las 13:05:13.

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