Jump to content


Photo

sintaxis incorrecta cerca de 'Y'


  • Please log in to reply
14 replies to this topic

#1 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 posts

Posted 01 May 2010 - 04:10 PM

hola gente como stan? bueno tengo un problema con ste codigo sql
lo he probado en mi gestor de base sql server y anda perfecto
pero cuando lo acomodo en mi query delphi....me sale el error del titulo que le puse al post
asi q le saque la linea :

delphi
  1. ' and division.descripcion='+division+'  ';


y ahora anda  :cry: 
asi q lo unico que me da pensar es que en tiempo de ejecucion no me toma el text del combobox en q stoy parado o algo asi  :undecided:  no tengo idea  :undecided: 
le puse el showmessage para ver que me guardaba ...pero es correcto
tambien cambie esta parte

delphi
  1.   ' and division.descripcion='+division+'  ';


por

delphi
  1.   ' and division.descripcion='+division ;


pero me tira el mismo error  :sad:



delphi
  1. procedure TFCarga.ComboBox4Change(Sender: TObject);
  2. begin
  3.     negocio:= DBLookupComboBox1.KeyValue;
  4.     division:=combobox4.text;
  5.       showmessage(division);
  6.       aqtemp.Active:=false;
  7.     AQTemp.SQL.Text := 'select distinct subclase.descripcion  '+
  8.                       'from division  inner join grupo inner join clase inner join subclase ' +
  9.                       'inner join articulo inner join variedad inner join marca inner join negmar ' +
  10.                       'on negmar.idmar=marca.idmarca on marca.variedad=variedad.idvariedad  ' +
  11.                       'on variedad.articulo=articulo.idarticulo on articulo.subclase=subclase.idsubclase  ' +
  12.                       'on subclase.clase=clase.idclase on clase.grupo=grupo.idgrupo    ' +
  13.                       'on grupo.division=division.iddivision where negmar.idneg='+IntToStr(negocio)+'  '+
  14.                       ' and division.descripcion='+division+'  ';
  15.  
  16.     AQTemp.Active := True;
  17.     While not AQTemp.Eof do
  18.     begin
  19.       combobox1.Items.Add(AQTemp.Fields[0].Text);
  20.       AQTemp.Next;
  21.     end;
  22.     AQTemp.Active := False;
  23.  
  24. end;



alguna idea? muchas gracias amigos
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 01 May 2010 - 05:27 PM

Hola

Tuve que hacer unos arreglos porque  no entendia tu query  :embarrassed:, lo siento.

Intenta de esta forma.



delphi
  1. procedure TFCarga.ComboBox4Change(Sender: TObject);
  2. begin
  3.   negocio:= DBLookupComboBox1.KeyValue;
  4.   division:=combobox4.text;
  5.   showmessage(division);
  6.   aqtemp.Active:=false;
  7.  
  8.   AQTemp.SQL.Text := ' select distinct subclase.descripcion from division ' +
  9.                     ' inner join grupo on grupo.division = division.iddivision ' +
  10.                     ' inner join clase on clase.grupo = grupo.idgrupo' +
  11.                     ' inner join subclase on subclase.clase = clase.idclase ' +
  12.                     ' inner join articulo on articulo.subclase = subclase.idsubclase ' +
  13.                     ' inner join variedad on variedad.articulo = articulo.idarticulo ' +
  14.                     ' inner join marca on marca.variedad = variedad.idvariedad ' +
  15.                     ' inner join negmar on negmar.idmar = marca.idmarca ' +
  16.                     ' where negmar.idneg = :ID_NEG and division.descripcion = :DESCRIP';
  17.  
  18.   AQTemp.ParamByName('ID_NEG').AsInteger := IntToStr(negocio);
  19.   AQTemp.ParamByName('DESCRIP').AsString := division;
  20.  
  21.   AQTemp.Active := True;
  22.   while not AQTemp.Eof do
  23.   begin
  24.     combobox1.Items.Add(AQTemp.Fields[0].Text);
  25.     AQTemp.Next;
  26.   end;
  27.   AQTemp.Active := false;
  28. end;



Salud OS
  • 0

#3 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 posts

Posted 01 May 2010 - 09:07 PM

hola ego amigo  :cool:

bueno estaba probando tu codigo y me sale el error:
"undeclarer identifier:ParambyName"  :cry:

al query AQtemp en la opcion Parameters le puse los parametros ID_NEG (integer) y DESCRIP(string)

me stoy olvidando de algo??  :embarrassed:
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 01 May 2010 - 09:15 PM

hola ego amigo  :cool:

bueno estaba probando tu codigo y me sale el error:
"undeclarer identifier:ParambyName"  :cry:

al query AQtemp en la opcion Parameters le puse los parametros ID_NEG (integer) y DESCRIP(string)

me stoy olvidando de algo??  :embarrassed:


Que componente estas usando, ADOQuery, TQuery, IBQuery, ZQuery......

Salud OS
  • 0

#5 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 posts

Posted 01 May 2010 - 09:19 PM

bueno ego..bucando un poco por ahi encontre que como stoy usando
ADOquery tengo q ponerlo asi :

AQTemp.Parameters.ParamByName('ID_NEG').value := IntToStr(negocio);
AQTemp.Parameters.ParamByName('DESCRIP').value := division;

asi que lo prove y anda che  :cool:

Gracias amigo ego..quedo el problema resulto  :cheesy:

che cual es mas eficente usar??  concatenando o con parametros... :embarrassed:

  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 01 May 2010 - 09:26 PM

bueno ego..bucando un poco por ahi encontre que como stoy usando
ADOquery tengo q ponerlo asi :

AQTemp.Parameters.ParamByName('ID_NEG').value := IntToStr(negocio);
AQTemp.Parameters.ParamByName('DESCRIP').value := division;

asi que lo prove y anda che  :cool:

Gracias amigo ego..quedo el problema resulto  :cheesy:

che cual es mas eficente usar??  concatenando o con parametros... :embarrassed:


Personalmente me gusta mas con parámetros ya que estos te permiten pasar el valor de un campo de forma directa, concatenando a veces te encuentras errores de tipo de datos y es una lata.

Solo te recomiendo que los parámetros los pases con su tipo de dato y no con value. ;)



delphi
  1. AQTemp.Parameters.ParamByName('ID_NEG').AsInteger := negocio;
  2. AQTemp.Parameters.ParamByName('DESCRIP').AsString := division;



Salud OS
  • 0

#7 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 posts

Posted 01 May 2010 - 10:01 PM

asi tambien lo prove pero me sale el mismo error que antes  :cry:

"undeclarer identifier:AsInteger"

no entiendo  :embarrassed:
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 01 May 2010 - 10:07 PM

asi tambien lo prove pero me sale el mismo error que antes  :cry:

"undeclarer identifier:AsInteger"

no entiendo  :embarrassed:


Pues entonces ese campo es un string, así que quedaría de esta forma



delphi
  1. AQTemp.Parameters.ParamByName('ID_NEG').AsString := IntToStr(negocio);
  2. AQTemp.Parameters.ParamByName('DESCRIP').AsString := division;



Salud OS
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 01 May 2010 - 10:16 PM

Hola

¿Un ID como string? :undecided:

Creo que debería revisarse eso. No es una buena práctica, al menos en principio...

Por otro lado, cuando se está empleando ADO es muy recomendable además de pasar el valor, que se defina adecuadamente el tipo mediante DataType, para garantizar de que se asuma el tipo de forma adecuada:



delphi
  1. adoquery1.Parameters.ParamByName('Nombre').DataType := ftXxxx;



Saludos,
  • 0

#10 abraham85

abraham85

    Advanced Member

  • Miembros
  • PipPipPip
  • 128 posts

Posted 01 May 2010 - 10:24 PM

nono...el campo no es un string... (y)

pero de todas maneras si le pongo



delphi
  1. adoquery1.Parameters.ParamByName('Nombre').asstring:= negocio;


o con el .asinteger....me sale mismo error  :shocked:

solo tengo la opcion value..... tendra q ver algo con q yo le defici en PARAMETERS el tipo??
ftinteger y ftstring....q se yo  :embarrassed:

  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 02 May 2010 - 01:57 PM

En ADO no existen las propiedades AsXXX. ADO emplea las clases TPamaters y Paramater para manejarse con parámetros y éstas tienen un manejo distinto al resto de los componentes de acceso a datos, que emplean el tipo TParams y TParam respectivamente.

¿Porqué?, por que ADO es de Microsoft, y bueno.... Microsoft es Micro$ofraude y define su propia estructura.

Creía que quedaba en claro cuando dije:

cuando se está empleando ADO es muy recomendable además de pasar el valor,

Al referirme a la propiedad Value. En resumen el procedimiento es:



delphi
  1. adoquery1.Parameters.ParamByName('Nombre').Value := ....
  2. adoquery1.Parameters.ParamByName('Nombre').DataType := ftXXX;



Con eso debería bastar y solucionar el problema.

Saludos,
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 02 May 2010 - 08:14 PM

Ah vaya, pensé que ADO era un estandar, pero veo que no.  ^o|

Ya veo porque no me gusta usarlo  :D :D :D

Salud OS
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 03 May 2010 - 09:29 AM

Ah vaya, pensé que ADO era un estandar, pero veo que no.  ^o|

Ya veo porque no me gusta usarlo  :D :D :D

Salud OS

Pues si, es un estándar amigo. El asunto es que es un estándar que Microsoft ha diseñado y quienes deseen emplearlo deben seguirle la corriente.
El problema es que este estándar ya cuenta con una estructura y tiene su propio manejo de parámetros, su command, su manejo de acceso a fuente de datos, etc.

Por ello cuando se definió en la VCL las clases, se tuvo que recurrir a dos clases paralelas: TParameter y TParam. La primera para tener compatibilidad con ADO, y la segunda la "universal", propuesta por Borland y es la que emplean el resto de los componentes para abstraerse y transparentar el acceso a datos mediante parámetros.
TParameter no cuenta con las propiedades AsXXX, sino que tiene a Value y como éste es de tipo Variant debe indicarte el tipo en DataType.

TParam, por su parte cuenta con estas propiedades AsXXX y hacen la conversión y asignación del tipo (DataType) de forma transparente y automática (cuando hacemos una escritura... o settler; aunque hay que aclarar que en realidad el dato "físicamente" sigue siendo un variant).

En donde se unifica ambas ramas es el manejo de campos: TField. Y este, como bien sabemos, cuenta con sus respectivos AsXXX. Además, naturalmente, en la manera de comunicarse y enlazarse a las fuentes de datos (DataSet/DataSource).
Internamente, los componentes ADO hacen uso de este estándar y su estructura.

Es la gran maravilla que tiene la VCL, los ingenieros a cargo de su diseño se han esmerado muchísimo en diseñar un framework realmente poderoso que nos permite abstraernos y manejar los componentes con cierta uniformidad. Han sabido unir las cosas de un modo que les facilite las cosas.

Se que no me he explicado del todo bien, pero al menos espero que se entienda mejorcito.

Saludos,
  • 0

#14 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 03 May 2010 - 10:55 AM

En ADO no existen las propiedades AsXXX. ADO emplea las clases TPamaters y Paramater para manejarse con parámetros y éstas tienen un manejo distinto al resto de los componentes de acceso a datos, que emplean el tipo TParams y TParam respectivamente.

¿Porqué?, por que ADO es de Microsoft, y bueno.... Microsoft es Micro$ofraude y define su propia estructura.

Creía que quedaba en claro cuando dije:

cuando se está empleando ADO es muy recomendable además de pasar el valor,

Al referirme a la propiedad Value. En resumen el procedimiento es:



delphi
  1. adoquery1.Parameters.ParamByName('Nombre').Value := ....
  2. adoquery1.Parameters.ParamByName('Nombre').DataType := ftXXX;



Con eso debería bastar y solucionar el problema.

Saludos,


Siendo puntuales. Con Ado La clase TField soporta el As(Datatype). La clase TParameter no soporta el As(datatype) Pero ofrece el Value como propiedad de tipo variant para asignar valores o tomar los valores en los parámetros.
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 03 May 2010 - 04:50 PM

Pues si, es un estándar amigo. El asunto es que es un estándar que Microsoft ha diseñado y quienes deseen emplearlo deben seguirle la corriente.

El problema es que este estándar ya cuenta con una estructura y tiene su propio manejo de parámetros, su command, su manejo de acceso a fuente de datos, etc.

Por ello cuando se definió en la VCL las clases, se tuvo que recurrir a dos clases paralelas: TParameter y TParam. La primera para tener compatibilidad con ADO, y la segunda la "universal", propuesta por Borland y es la que emplean el resto de los componentes para abstraerse y transparentar el acceso a datos mediante parámetros.

TParameter no cuenta con las propiedades AsXXX, sino que tiene a Value y como éste es de tipo Variant debe indicarte el tipo en DataType.

TParam, por su parte cuenta con estas propiedades AsXXX y hacen la conversión y asignación del tipo (DataType) de forma transparente y automática (cuando hacemos una escritura... o settler; aunque hay que aclarar que en realidad el dato "físicamente" sigue siendo un variant).

En donde se unifica ambas ramas es el manejo de campos: TField. Y este, como bien sabemos, cuenta con sus respectivos AsXXX. Además, naturalmente, en la manera de comunicarse y enlazarse a las fuentes de datos (DataSet/DataSource).
Internamente, los componentes ADO hacen uso de este estándar y su estructura.

Es la gran maravilla que tiene la VCL, los ingenieros a cargo de su diseño se han esmerado muchísimo en diseñar un framework realmente poderoso que nos permite abstraernos y manejar los componentes con cierta uniformidad. Han sabido unir las cosas de un modo que les facilite las cosas.

Se que no me he explicado del todo bien, pero al menos espero que se entienda mejorcito.

Saludos,


Entiendo perfectamente, pero sigo pensando que deberían tener el AsXXXXX, digo, que les costaba, nos hacen escribir más código :D :D :D

Por lo pronto no soy afecto a ADO :p

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.