Ir al contenido



Foto

Mensaje Conflicto entre tablas, Migración Query a ADOQuery

adoquery mysql delphi

  • Por favor identifícate para responder
47 respuestas en este tema

#21 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 803 mensajes
  • LocationArgentina

Escrito 31 enero 2017 - 02:54

Otra cosa

 

Pareciera que el problema son los parámetros, porque no colocas esa consulta en el componente, es decir, en tiempo de diseño, configuras las propiedades (DataType y Direction) en los parámetros del componente y ya no deberías tener problema.

 

Saludos

 

El problema son los parametros pero por ambiguedad; internamente la coleccion TParameters del TADOQuery va a tener dos parametros llamados igual y uno va a quedar sin un valor definido y por eso tiene conflicto de datos

 

Prueba de concepto (necesario que el ADOQuery tenga su propiedad Connection seteada a una conexion "valida")


delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3. Param: TParameter;
  4. begin
  5. ADOQuery1.SQL.Text := ' SELECT * FROM Clientes WHERE Nombre = :Nombre ';
  6. Param := ADOQuery1.Parameters.AddParameter;
  7. Param.Name := 'Nombre';
  8. Param.DataType := TFieldType.ftInteger;
  9. ShowMessage(ADOQuery1.Parameters.Count.ToString); // imprime 2
  10. if ADOQuery1.Parameters.ParamByName('Nombre') <> Param then // evalua true
  11. ShowMessage('son distintos objetos');
  12. end;


  • 0

#22 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.009 mensajes
  • LocationArgentina

Escrito 31 enero 2017 - 04:24

Es lo que dice Agustín, ADO trabaja de forma diferente al resto de las suites. Son cosas de Moco$oft, sepan disculpar.

 

Los problemas son una conjunción de cosas:

1. No hace falta crear los parámetros. De eso se encarga el componente al parsear el estring cuando se le asigna la instrucción SQL a la propiedad SQL. El propio componente cuando detecta los : (dos puntos) crea el parámetro en cuestión.

 

2. Cuando se trabaja con parámetros es costumbres nombrarlos diferentes al campo para evitar conflictos. Es muy habitual usar una P como prefijo, por ejemplo un parámetro para el campo ID sería PID y para el campo Nombre le corresponde un parámatro llamado PNombre.

 

3. ADO requiere que a los parámetros se le defina el tipo de dato en cuestión y luego el valor aplicando la conversión/cast que sea necesaria. Por ejemplo:


delphi
  1. MiADOQuery1.Parameters.ParamByName('PID').DataType := ftInteger;
  2. MiADOQuery1.Parameters.ParamByName('PID').Value := IntToStr(Edit1.Text);

Expuse el código de memoria, ya que no tengo ADO en Starter. Pero que yo recuerde la propiedad se llamaba DataType y la sigla de los enumerativos era con "ft". Por las dudas, revisen.

 

Puede verse del código que se indica que el parámetro espera un entero, y por consiguiente se hace el paso de string a integer al momento de asignar el valor mediante la propiedad Value.

 

ADO carece de los métodos "As". Una alternativa es definir un Helper como el que sugiere Agustín. Claro, eso funciona para los nuevos Delphi. Si está usando D7 por ejemplo, no es posible.

 

4. Cuando uno arma una instrucción SQL, si bien no es obligatorio respetar los espacios, es mejor tenerlos en cuenta ya que es posible que el analizador de problemas.

No es lo mismo un:


sql
  1. WHERE Campo=:PCampo

Que un:


sql
  1. WHERE Campo = :PCampo

Por ahora veo esos problemas.

 

Saludos,


  • 1

#23 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.690 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 04:29

Hola.

 

Tienen razón, pero no veo parámetros iguales, en todo caso lo que veo es que no asigna los campos con su correspondiente ALIAS....
 
 


delphi
  1.    SQL.Add('SELECT * FROM CTRLONT CTRL ');
  2.    SQL.Add('join CLIENTES CL on CTRL.FOLIO = CL.FOLIO ');
  3.    SQL.Add('join ONTs ONT on CTRL.FOLIO = ONT.Folio ');
  4.    SQL.Add('WHERE BOARD_ONT= :BOARD_ONT');
  5.    SQL.Add(' AND FRAME_ID= :FRAME_ID');
  6.    SQL.Add(' AND SLOT_ID= :SLOT_ID');
  7.    SQL.Add(' AND PORT_ID= :PORT_ID');
  8.    SQL.Add(' AND ONT_ID= :ONT_ID');

 
Debería ser algo así. (incluyo cambio de nombre en parámetros, por si acaso)
   
 


delphi
  1.    SQL.Add('SELECT * FROM CTRLONT CTRL ');
  2.    SQL.Add('join CLIENTES CL on CTRL.FOLIO = CL.FOLIO ');
  3.    SQL.Add('join ONTs ONT on CTRL.FOLIO = ONT.Folio ');
  4.    SQL.Add('WHERE alias.BOARD_ONT= :BOARDONT');
  5.    SQL.Add(' AND alias.FRAME_ID= :FRAMEID');
  6.    SQL.Add(' AND alias.SLOT_ID= :SLOTID');
  7.    SQL.Add(' AND alias.PORT_ID= :PORTID');
  8.    SQL.Add(' AND alias.ONT_ID= :ONTID');   

 

Saludos


  • 0

#24 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.009 mensajes
  • LocationArgentina

Escrito 31 enero 2017 - 05:06

Cierto. Otro problema adicional es que no referencia a que alias o tabla se refiere los campos que intervienen en el where.

 

Saludos,


  • 0

#25 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 130 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 05:37

Siguiendo sus comentarios lo deje de esta forma:


delphi
  1. with ADOQueryCtrlONT do
  2. begin
  3. Close;
  4. SQL.Clear;
  5. SQL.Add('SELECT * FROM CTRLONT CTRL ');
  6. SQL.Add('join CLIENTES CL on CTRL.FOLIO = CL.FOLIO ');
  7. SQL.Add('join ONTs ONT on CTRL.FOLIO = ONT.Folio ');
  8. SQL.Add('WHERE CTRL.BOARD_ONT = :PBOARDONT');
  9. SQL.Add(' AND CTRL.FRAME_ID = :PFRAMEID');
  10. SQL.Add(' AND CTRL.SLOT_ID = :PSLOTID');
  11. SQL.Add(' AND CTRL.PORT_ID = :PORTID');
  12. SQL.Add(' AND CTRL.ONT_ID = :PONTID');
  13. // PArametros
  14. Parameters.ParamByName('PBOARDONT').DataType := ftInteger;
  15. Parameters.ParamByName('PBOARDONT').Value := StrToInt(Edit1.Text);
  16. Parameters.ParamByName('PFRAMEID').DataType := ftInteger;
  17. Parameters.ParamByName('PFRAMEID').Value := StrToInt(Edit2.Text);
  18. Parameters.ParamByName('PSLOTID').DataType := ftInteger;
  19. Parameters.ParamByName('PSLOTID').Value := StrToInt(Edit3.Text);
  20. Parameters.ParamByName('PORTID').DataType := ftInteger;
  21. Parameters.ParamByName('PORTID').Value := StrToInt(Edit4.Text);
  22. Parameters.ParamByName('PONTID').DataType := ftInteger;
  23. Parameters.ParamByName('PONTID').Value := StrToInt(Edit5.Text);
  24.  
  25. Open;

Pero ... sigo con el mensaje de error todavia.

 

en el ADOQuery tengo en True el parámetro ParamCheck.

 

No entiendo donde pueda estar el detalle, ya que tengo otros módulos de consulta usando ADOQuery y no he tenido problema.


  • 0

#26 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.690 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 05:43

Siguiendo sus comentarios lo deje de esta forma:


delphi
  1. with ADOQueryCtrlONT do
  2. begin
  3. Close;
  4. SQL.Clear;
  5. SQL.Add('SELECT * FROM CTRLONT CTRL ');
  6. SQL.Add('join CLIENTES CL on CTRL.FOLIO = CL.FOLIO ');
  7. SQL.Add('join ONTs ONT on CTRL.FOLIO = ONT.Folio ');
  8. SQL.Add('WHERE CTRL.BOARD_ONT = :PBOARDONT');
  9. SQL.Add(' AND CTRL.FRAME_ID = :PFRAMEID');
  10. SQL.Add(' AND CTRL.SLOT_ID = :PSLOTID');
  11. SQL.Add(' AND CTRL.PORT_ID = :PORTID');
  12. SQL.Add(' AND CTRL.ONT_ID = :PONTID');
  13. // PArametros
  14. Parameters.ParamByName('PBOARDONT').DataType := ftInteger;
  15. Parameters.ParamByName('PBOARDONT').Value := StrToInt(Edit1.Text);
  16. Parameters.ParamByName('PFRAMEID').DataType := ftInteger;
  17. Parameters.ParamByName('PFRAMEID').Value := StrToInt(Edit2.Text);
  18. Parameters.ParamByName('PSLOTID').DataType := ftInteger;
  19. Parameters.ParamByName('PSLOTID').Value := StrToInt(Edit3.Text);
  20. Parameters.ParamByName('PORTID').DataType := ftInteger;
  21. Parameters.ParamByName('PORTID').Value := StrToInt(Edit4.Text);
  22. Parameters.ParamByName('PONTID').DataType := ftInteger;
  23. Parameters.ParamByName('PONTID').Value := StrToInt(Edit5.Text);
  24.  
  25. Open;

Pero ... sigo con el mensaje de error todavia.

 

en el ADOQuery tengo en True el parámetro ParamCheck.

 

No entiendo donde pueda estar el detalle, ya que tengo otros módulos de consulta usando ADOQuery y no he tenido problema.

 

Sigo pensando que lo hagas en tiempo de diseño, asignando las propiedades de los parametros apropiadamente.

 

Saludos


  • 0

#27 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 130 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 05:58

Sigo pensando que lo hagas en tiempo de diseño, asignando las propiedades de los parametros apropiadamente.

 

Saludos

 

Hice esta consulta en la Base de Datos con phpMyAdmin:


sql
  1. SELECT * FROM CTRLONT
  2. WHERE `BOARD_ONT`= 3
  3. AND `FRAME_ID`= 0
  4. AND `SLOT_ID`= 3
  5. AND `PORT_ID`= 1
  6. AND `ONT_ID`= 3

y me muestra los datos correctamente...


  • 0

#28 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.690 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 06:05

Hice esta consulta en la Base de Datos con phpMyAdmin:


sql
  1. SELECT * FROM CTRLONT
  2. WHERE `BOARD_ONT`= 3
  3. AND `FRAME_ID`= 0
  4. AND `SLOT_ID`= 3
  5. AND `PORT_ID`= 1
  6. AND `ONT_ID`= 3

y me muestra los datos correctamente...

 


Pero ahi no estas ligando (JOIN) las demás tablas, genera la consulta identica para ver si por ahí hay algo en la consulta, de otra forma ya tenemos bases para pensar que es un asunto del componente utilizado.

saludos


  • 0

#29 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 130 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 06:20

Pero ahi no estas ligando (JOIN) las demás tablas, genera la consulta identica para ver si por ahí hay algo en la consulta, de otra forma ya tenemos bases para pensar que es un asunto del componente utilizado.

saludos

 

igualmente funciona muy bien usando JOIN


sql
  1. SELECT * FROM CTRLONT CTRL
  2. JOIN CLIENTES CL ON CTRL.FOLIO = CL.FOLIO
  3. JOIN ONTs ONT ON CTRL.FOLIO = ONT.Folio
  4. WHERE CTRL.BOARD_ONT = 3
  5. AND CTRL.FRAME_ID = 0
  6. AND CTRL.SLOT_ID = 3
  7. AND CTRL.PORT_ID = 1
  8. AND CTRL.ONT_ID = 3

Al parecer como comentas se trata del componente y el parámetro...


  • 0

#30 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 130 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 06:25

Bueno no se si sea la forma mas elegante o teng consecuencia a futuro .. pero al menos de esta forma me funcionó..

 

Puse los valores en una variable ..


delphi
  1. Var B,F,S,P,O : integer;
  2. ..
  3. .
  4. .
  5. // Variables
  6. B:= StrToInt(Edit1.Text);
  7. F:= StrToInt(Edit2.Text);
  8. S:= StrToInt(Edit3.Text);
  9. P:= StrToInt(Edit4.Text);
  10. O:= StrToInt(Edit5.Text);

De alli aplique la consulta siguiente ...


delphi
  1. Close;
  2. SQL.Clear;
  3. SQL.Add('SELECT * FROM CTRLONT CTRL ');
  4. SQL.Add('join CLIENTES CL on CTRL.FOLIO = CL.FOLIO ');
  5. SQL.Add('join ONTs ONT on CTRL.FOLIO = ONT.Folio ');
  6. SQL.Add('WHERE CTRL.BOARD_ONT = '+ IntToStr(B));
  7. SQL.Add(' AND CTRL.FRAME_ID = '+ IntToStr(F));
  8. SQL.Add(' AND CTRL.SLOT_ID = '+ IntToStr(S));
  9. SQL.Add(' AND CTRL.PORT_ID = '+ IntToStr(P));
  10. SQL.Add(' AND CTRL.ONT_ID = '+ IntToStr(O));
  11. Open;

Y ahora si no me envió NINGUN mensaje de error y me ejecuto la búsqueda al menos como lo hacía antes.

 


  • 0

#31 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 803 mensajes
  • LocationArgentina

Escrito 31 enero 2017 - 06:49

Exporta la definicion de la tabla de la BD (es decir, el CREATE TABLE) y pegala aca en el foro y la probamos

 

Tambien estaria bien que pongas la cadena de conexion que usas para conectarte


  • 0

#32 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.009 mensajes
  • LocationArgentina

Escrito 31 enero 2017 - 06:52

Si vas a pasar los datos a variables integer y volver a convertir a cadenas estas haciendo un paso intermedio al vicio.
Para el caso concatena el contenido de los edits tal como lo haces pero sin estar haciendo esas conversiones.

Saludos,
  • 0

#33 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 803 mensajes
  • LocationArgentina

Escrito 31 enero 2017 - 10:25

Yo no me quiero dar por vencido
 
El query lo creas dinamicamente, en tiempo de ejecucion? Cual es el codigo? o en tiempo de diseño: que propiedades cambiaste? No te habra quedado alguna sentencia SQL o parametro por alli? 
 
Usas el mismo componente query para otras consultas? 
 
Que pasa si en lugar de asignar a los parametros el valor de los edit le asignas numeros literales, por ejemplo estos
 


sql
  1. SELECT * FROM CTRLONT
  2. WHERE `BOARD_ONT`= 3
  3. AND `FRAME_ID`= 0
  4. AND `SLOT_ID`= 3
  5. AND `PORT_ID`= 1
  6. AND `ONT_ID`= 3

Por que usas "join" a secas? No deberias usar "inner join"?

 

Que valores tienen los edit?

 

Que valor tiene esta variable:


delphi
  1. qry.Parameters.Count 

Si la cantidad de parametros es distinta a la que esperas podes imprimirlos para ver cual te creo:


delphi
  1. uses
  2. SysUtils, ADODB, StdCtrls, TypInfo, DB;
  3.  
  4. var
  5. Memo1: TMemo;
  6. qry: TADOQuery;
  7. P: TParameter;
  8. I: Integer;
  9. begin
  10. Memo1.Clear;
  11. Memo1.Lines.Add('Hay ' + IntToStr(qry.Parameters.Count) + ' parametros');
  12. for I := 0 to qry.Parameters.Count - 1 do
  13. begin
  14. p := qry.Parameters[I];
  15. Memo1.Lines.Add('Parametro nro ' + IntToStr(I + 1));
  16. Memo1.Lines.Add('Nombre: ' + P.Name);
  17. Memo1.Lines.Add('Tipo ' + GetEnumName(TypeInfo(TFieldType), Ord(P.DataType)));
  18. Memo1.Lines.Add('Valor ' + P.Value);
  19. end; 

Estas dos tambien pueden incidir, pero son las menos que menos..

 

Exporta la definicion de la tabla de la BD (es decir, el CREATE TABLE) y pegala aca en el foro y la probamos
 
Tambien estaria bien que pongas la cadena de conexion que usas para conectarte


 
Estoy seguro que los componentes trabajan bien...el codigo ya no le veo nada raro, pero seguro que la falla esta de nuestro lado


Editado por Agustin Ortu, 31 enero 2017 - 10:37 .

  • 0

#34 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.690 mensajes
  • LocationMéxico

Escrito 31 enero 2017 - 11:17

Yo no me quiero dar por vencido


Y yo insisto en que se haga todo en tiempo de diseño, el problema de los parámetros suele ser porque no se crean correctamente en "runtime"

 

:)

 

Saludos


  • 0

#35 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.009 mensajes
  • LocationArgentina

Escrito 01 febrero 2017 - 06:30

Los componentes funcionan bien. Yo mucho de ADO no solía usar, pero las veces que lo hice no he tenido problemas.

Tanto en tiempo de diseño como en ejecución va a ser el mismo resultado.

 

Se justifica el definir las SQL en tiempo de ejecución, como se suele hacer en código de este hilo, cuando al componente o bien lo creamos runtime y/o lo vamos a reutilizar para otras instrucciones SQL.

Se justifica hacerlo en tiempo de diseño cuando pretendemos darle un uso específico y puntual... y preferiblemente nunca más cambiarle alguna propiedad... sobre todo la SQL.

 

Opino igual que Agustín, en algún lado está el problemita... y hay que encontrarlo. Capaz que se ha quedado colado algún parámetro sucio de alguna operación anterior, esto suele suceder cuando se define en tiempo de diseño una SQL y en tiempo de ejecución luego se cambia algo. Es que no necesariamente un Close puede hacer que los parámetros se "limpien". Sobre todo si por ejemplo, definimos las cosas de forma persistente. La mezcla designtime y runtime junto con campos/parametros persistentes no es sana.

 

Lo que me está llamando la atención es que en algunas muestras de la SQL veo que pone comillas simples a los campos y en otras no. ¿Porque?

 

Saludos,


  • 0

#36 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.254 mensajes
  • LocationRepública Dominicana

Escrito 01 febrero 2017 - 07:15

Delphius, Porque así se trabaja en phpmyadmin para diferenciar una tabla de un string. pues ¿qué si limpiamos los parámetros en tiempo de ejecución antes de asignar nuevos?, así definimos si los parámetros están sucios.

delphi
  1.   ADoQuery1.Parameters.Clear;


  • 0

#37 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 130 mensajes
  • LocationMéxico

Escrito 01 febrero 2017 - 09:34

Si vas a pasar los datos a variables integer y volver a convertir a cadenas estas haciendo un paso intermedio al vicio.
Para el caso concatena el contenido de los edits tal como lo haces pero sin estar haciendo esas conversiones.

Saludos,

 

Cómo concatenar todo los contenidos del los edit? alli si me hice bolas y no entendi !! 


  • 0

#38 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.690 mensajes
  • LocationMéxico

Escrito 01 febrero 2017 - 09:48

Cómo concatenar todo los contenidos del los edit? alli si me hice bolas y no entendi !!

 
Pues así de fácil amigo
 

 

delphi
  1.    Close;
  2.    SQL.Clear;
  3.    SQL.Add('SELECT * FROM CTRLONT CTRL ');
  4.    SQL.Add('join CLIENTES CL on CTRL.FOLIO = CL.FOLIO ');
  5.    SQL.Add('join ONTs ONT on CTRL.FOLIO = ONT.Folio ');
  6.    SQL.Add('WHERE CTRL.BOARD_ONT = ' + Edit1.Text);
  7.    SQL.Add(' AND CTRL.FRAME_ID = ' + Edit2.Text);
  8.    SQL.Add(' AND CTRL.SLOT_ID = ' + Edit3.Text);
  9.    SQL.Add(' AND CTRL.PORT_ID = ' + Edit4.Text);
  10.    SQL.Add(' AND CTRL.ONT_ID = ' + Edit1.Text);
  11.    Open;

 
Saludos
  • 0

#39 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 130 mensajes
  • LocationMéxico

Escrito 01 febrero 2017 - 10:09

Yo no me quiero dar por vencido
 
El query lo creas dinamicamente, en tiempo de ejecucion? Cual es el codigo? o en tiempo de diseño: que propiedades cambiaste? No te habra quedado alguna sentencia SQL o parametro por alli? 
 
Usas el mismo componente query para otras consultas? 
 
Que pasa si en lugar de asignar a los parametros el valor de los edit le asignas numeros literales, por ejemplo estos
 


sql
  1. SELECT * FROM CTRLONT
  2. WHERE `BOARD_ONT`= 3
  3. AND `FRAME_ID`= 0
  4. AND `SLOT_ID`= 3
  5. AND `PORT_ID`= 1
  6. AND `ONT_ID`= 3

Por que usas "join" a secas? No deberias usar "inner join"?

 

Que valores tienen los edit?

 

Que valor tiene esta variable:


delphi
  1. qry.Parameters.Count 

Si la cantidad de parametros es distinta a la que esperas podes imprimirlos para ver cual te creo:


delphi
  1. uses
  2. SysUtils, ADODB, StdCtrls, TypInfo, DB;
  3.  
  4. var
  5. Memo1: TMemo;
  6. qry: TADOQuery;
  7. P: TParameter;
  8. I: Integer;
  9. begin
  10. Memo1.Clear;
  11. Memo1.Lines.Add('Hay ' + IntToStr(qry.Parameters.Count) + ' parametros');
  12. for I := 0 to qry.Parameters.Count - 1 do
  13. begin
  14. p := qry.Parameters[I];
  15. Memo1.Lines.Add('Parametro nro ' + IntToStr(I + 1));
  16. Memo1.Lines.Add('Nombre: ' + P.Name);
  17. Memo1.Lines.Add('Tipo ' + GetEnumName(TypeInfo(TFieldType), Ord(P.DataType)));
  18. Memo1.Lines.Add('Valor ' + P.Value);
  19. end; 

Estas dos tambien pueden incidir, pero son las menos que menos..

 


 
Estoy seguro que los componentes trabajan bien...el codigo ya no le veo nada raro, pero seguro que la falla esta de nuestro lado

 

huffff !! a ver son varias preguntas ... a ver si un moderador no te llama la atención  (y)

 

 

 

El query lo creas dinamicamente, en tiempo de ejecucion? Cual es el codigo?

 

EL Query lo creo en tiempo de ejecución, rn tiempo de diseño dentro del prametro SQL del Componente ADOQuery solo tengo la busqueda básica "select * from CTRLONT" en mi caso, esto necesario para que el Componente se pueda activar en runtime.

 

 

 

que propiedades cambiaste? No te habra quedado alguna sentencia SQL o parametro por alli? 
 
Usas el mismo componente query para otras consultas? 

 

Hasta ahora no he cambiado ninguna propiedad, la sentencia es la que mencione la basica que la hago en tiempo de diseño, esto necesario par que el Componente ADOQuery se pueda activar. Estoy usando un DataModule, alli tengo un ADOquery similar para la misma tabla, pero no lo trabaje desde alli ya que primero quise trabajarlo desde el formulario, quel igual tiene en tiempo de diseño la misma sentecia SQL que ya mencioné.

 

 

Que pasa si en lugar de asignar a los parametros el valor de los edit le asignas numeros literales, por ejemplo estos

 

SELECT * FROM CTRLONT
WHERE `BOARD_ONT`= 3
AND `FRAME_ID`= 0
AND `SLOT_ID`= 3
AND `PORT_ID`= 1
AND `ONT_ID`= 3
 

 

Me da el mismo resultado a como lo tengo ahora con el ejemplo ya mencionado, por ahora me esta funcionando bien asignando los valores a variables y despues estas variables usarlos en los Query.

 

 

Por que usas "join" a secas? No deberias usar "inner join"?

 

Que valores tienen los edit?

 

No lo había notado o quizá se me paso , pero haré la prueba a ver que resultado me da, aunque sospecho que será lo mismo.

Los valores de los Edit son los mismo que puse en el ejemplo que etsas mencionando, todos numericos enteros.

 

 

Que valor tiene esta variable:

qry.Parameters.Count 

 

El parámetro COUNT no aparece antes del "Parameters". osea Que valor tiene esta variable:

ADOQueryCtrlONT.Parameters.Count no lo acepta el (Count)

 

 

Si la cantidad de parametros es distinta a la que esperas podes imprimirlos para ver cual te creo:

uses
SysUtils, ADODB, StdCtrls, TypInfo, DB;

var
Memo1: TMemo;
qry: TADOQuery;
P: TParameter;
I: Integer;
begin
Memo1.Clear;
Memo1.Lines.Add('Hay ' + IntToStr(qry.Parameters.Count) + ' parametros');
for I := 0 to qry.Parameters.Count - 1 do
begin
p := qry.Parameters[I];
Memo1.Lines.Add('Parametro nro ' + IntToStr(I + 1));
Memo1.Lines.Add('Nombre: ' + P.Name);
Memo1.Lines.Add('Tipo ' + GetEnumName(TypeInfo(TFieldType), Ord(P.DataType)));
Memo1.Lines.Add('Valor ' + P.Value);
end; 
 

 

Me marca ACCESS VIOLATION..

 

Saludos !! 


  • 0

#40 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.690 mensajes
  • LocationMéxico

Escrito 01 febrero 2017 - 10:16

EL Query lo creo en tiempo de ejecución, rn tiempo de diseño dentro del prametro SQL del Componente ADOQuery solo tengo la busqueda básica "select * from CTRLONT" en mi caso, esto necesario para que el Componente se pueda activar en runtime.

 

 

Pregunta: ¿Agregaste campos persistentes en el componente?

 

 

Duda: Si ya tienes en el componente la consulta, porque no la usas completa con los parámetros que requiere y en "runtime" solo asignas los parámetros. (Sigo insistiendo)

 

 

Reto: Como dice nuestro buen amigo Agustín, ya me dió curiosidad porque no funciona, pero para ello necesitamos contar con tu ambiente de trabajo, de otra forma todo queda en especulaciones. :(

 

 

Saludos


  • 0





Etiquetado también con una o más de estas palabras: adoquery, mysql, delphi