Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Porque me marca error en mis querys si utilizo el mismo para diferentes consultas (https://www.clubdelphi.com/foros/showthread.php?t=39516)

zcatzz 23-01-2007 00:01:52

Porque me marca error en mis querys si utilizo el mismo para diferentes consultas
 
Hola como estan todos.. Una pregunta estoy utilizando Delphi 5, informix y adoconexion, y adoqurerys y todo lo ado jeje.. en este foro queiro hacer 2 preguntas

1.- Por que si utlizo por ejemplo:
Código Delphi [-]
            DataModulo.QBuscar.Active:=false;
             DataModulo.QBuscar.SQL.Clear;
             DataModulo.QBuscar.SQL.Text:='select * from ciclo    
             where   ciclo=:cic';
                        DataModulo.QBuscar.Parameters.ParamByName('cic').Value:=ciclob;
            DataModulo.QBuscar.Active:=true;
            DataModulo.QBuscar.ExecSQL;

y despues quiero usar el mismo query en otra busqueda:

            DataModulo.QBuscar.Active:=false;
             DataModulo.QBuscar.SQL.Clear;
             DataModulo.QBuscar.SQL.Text:='select * from periodo    
             where   periodo=:per';
                DataModulo.QBuscar.Parameters.ParamByName('per').Value:=perio.text;
            DataModulo.QBuscar.Active:=true;
            DataModulo.QBuscar.ExecSQL;

Y si tengo varios querys en el programa haciendo diferentes instrucciones de sql en algun momento del programa cuando estoy ejecutandolo y ulizando las difentes formas me marca un error en el query diceindome que no encontro un parametro o una instruccion que anteriormente se utlio en otra busqueda...

porque me sucede esto si incializo,si desactivo el query lo limpio antes cada vez de usarlo.

2.-
por esta situacion que si por favor me pueden ayudar a liberar .. para hacer el programa estuve haciendo muchos querys con difernetes nombres,, ya saben qbuscar,qbuscar2.....qbuscar55..
he hecho un monto de querys y ahora el problema es que ahorita que ya lo estan trabajando en tiempo real con conexiones en una parte donde su velocidad de ancho de banda no es muy libre.. el programa es lentisimo

para abrir cada forma tardan como un minuto.. la verdad no se si es por lo que les digo.. o si se los ocurre alguna otra cosa por lo que el programa es lento ahii.. ya que si lo corren po ejemplo en un edificio donde esta el duenio el programa esta bien pero si nada mas se van a los edificios donde van a estar haciendo uso del prpgrama se alenta..

que se les ocurre?

Bicho 23-01-2007 00:22:01

Hola,

Código Delphi [-]
DataModulo.QBuscar.Active:=false;
DataModulo.QBuscar.SQL.Clear;
DataModulo.QBuscar.SQL.Text:='select * from periodo 
where periodo=er';
DataModulo.QBuscar.Parameters.ParamByName('per').Value:=perio.text;
DataModulo.QBuscar.Active:=true;
DataModulo.QBuscar.ExecSQL;

Aquí hay un problema, y es que usas el Active := True y luego el ExecSQL. Eso se ha tratado muchas veces en este foro y es un error muy común. Usar la propiedad Active o llamar al método Open, sólo debe usarse (como en este caso) en las SELECT; para todo lo demás (INSERT, UPDATE, DELETE, CREATE, .etc) debes usar el ExecSQL, pero nunca los dos juntos, de lo contrario siempre te dará problemas.
El otro punto que veo, que puede dar problemas es que no limpias los parámetros entre una consulta y otra.

Código Delphi [-]
DataModulo.QBuscar.Active:=false;
DataModulo.QBuscar.SQL.Clear;
DataModulo.QBuscar.SQL.Text:='select * from ciclo 
where ciclo=:cic';
DataModulo.QBuscar.Parameters.Clear;
DataModulo.QBuscar.Parameters.ParamByName('cic').Value:=ciclob;
DataModulo.QBuscar.Active:=true;
//DataModulo.QBuscar.ExecSQL;
DataModulo.QBuscar.Active:=false;
DataModulo.QBuscar.SQL.Clear;
DataModulo.QBuscar.SQL.Text:='select * from periodo 
where periodo=er';
DataModulo.QBuscar.Parameters.Clear;
DataModulo.QBuscar.Parameters.ParamByName('per').Value:=perio.text;
DataModulo.QBuscar.Active:=true;
//DataModulo.QBuscar.ExecSQL;

Respecto a tú segundo problema, el de la lentitud, comentas que los forms tardan un minuto en arrancar, sería bueno que pusieras el código de los eventos de llamada a esos forms, así como los eventos Create, Activate y/o show para ver porque tarda.

Saludos

zcatzz 23-01-2007 01:21:49

Revisando... Sigue lento
 
Muchas Gracias Bicho voy a revisar como me dijiste para borrar todos los querys que tengo y hacer pruebas con esos 2 cambios que me dijste y al rato te dij si ya con eso me funciono..

Con respecto a la forma como tengo organizado el programa..
Tengo la forma de validacion de usuario de contrasena, la forma principal, el datamodulo y las demas formas... la forma que ahortia tiene que usar y que te digo que cuando ya quieren trabajar con el programa estan utilizando mas es esta:

este es su evento formactivate
Código Delphi [-]
procedure TFidio121.FormActivate(Sender: TObject);
var ciclob,tam:string;
begin
 DModulo.TAlumnos.Active:=true;
DModulo.TAlumnosCurso.Active:=true;
DModulo.TMaterias.Active:=true;
DModulo.THorario.Active:=true;
DBMatricula.Text:='';
 DBAPaterno.Text:='';
 DBAMaterno.Text:='';
 DBNombre.Text:='';
 DBFechaNac.Text:='';
 DBSexo.Text:='';
 DBEstadoCivil.Text:='';
 DBCategoria.Text:='';
 DBEmail.Text:='';
 DBTelefono.Text:='';
 DBEstudios.Text:='';
 //DBFicha.Text:='';
 //DBCurso.Text:='';
// DBHorario.Text:='';
 //DBPeriodo.Text:='';

    DModulo.QBuscar40.Active:=false;
     DModulo.QBuscar40.SQL.Clear;
    DModulo.QBuscar40.SQL.Text:='SELECT * from periodos where vigencia=:vig';
     DModulo.QBuscar40.Parameters.ParamByName('vig').Value:=1;

    DModulo.QBuscar40.Active:=true;
    DModulo.QBuscar40.ExecSQL;
    DBPeriodo.DataSource:=DModulo.DSBuscar40;
    DBIdperiodo.DataSource:=DModulo.DSBuscar40;

     ciclob:=separaciclo(DBPeriodo.text);

             //busca descripcion
             DModulo.QBuscar41.Active:=false;
             DModulo.QBuscar41.SQL.Clear;
             DModulo.QBuscar41.SQL.Text:='select * from ciclo where ciclo=:cic';
             DModulo.QBuscar41.Parameters.ParamByName('cic').Value:=ciclob;
            DModulo.QBuscar41.Active:=true;
            DModulo.QBuscar41.ExecSQL;
            DBDEs.DataSource:=DModulo.dsbuscar41;

            tam:= separaperiodo(DBPeriodo.text);
            DES_Periodo.text:=DBDES.text + ' ' + tam;



end;

y este el evento close

procedure TFidio121.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DModulo.TAlumnos.Active:=false;
DModulo.TAlumnosCurso.Active:=false;
DModulo.TMaterias.Active:=false;
DModulo.THorario.Active:=false;
end;
como les comente arriba trabaja muy lento en el lugar donde lo van a utilizar pero en el lugar donde se hace pruebas esta mas agil.

zcatzz 23-01-2007 04:19:16

no se pudo
 
bicho hice lo que me dijiste lo puse asi:
Código Delphi [-]
DataModulo.QBuscar.Active:=false;
DataModulo.QBuscar.SQL.Clear;
DataModulo.QBuscar.SQL.Text:='select * from ciclo 
where ciclo=:cic';
DataModulo.QBuscar.Parameters.Clear;
DataModulo.QBuscar.Parameters.ParamByName('cic').Value:=ciclob;
DataModulo.QBuscar.Active:=true;
//DataModulo.QBuscar.ExecSQL;


pero al momento de correrlo me marca un error de que el paramerto cic no existe
entonces lo cambie de lugar lo pase arriba de qbuscar.sql.text:='...';
y me vuelve a decir el error de que no encuentra un parametro de otro qbuscar que use anteriormente.. que estoy haciendo mal..
necesito usar menos querys para que mi programa no se cargue tanto.. o que otra cosa puede afectar diganme please

aledieb 23-01-2007 13:52:11

Hola, proba así:

Código Delphi [-]
DataModulo.QBuscar.Active:=false;
DataModulo.QBuscar.SQL.Clear;
DataModulo.QBuscar.Parameters.Clear;
DataModulo.QBuscar.SQL.Text:='select * from ciclo where ciclo=:cic';
DataModulo.QBuscar.Parameters.ParamByName('cic').Value:=ciclob;
DataModulo.QBuscar.Active:=true;
//DataModulo.QBuscar.ExecSQL;

zcatzz 23-01-2007 22:44:39

tambien me marca error
 
Hola Alejandro , mira tambien ya le hice asi como me dices y es cuando me marca error sobre unos parametros de otros querys .

Es decir estoy vuelta loca ya que si lo pongo arriba de
Código SQL [-]
DataModulo.QBuscar.SQL.Text:='select * from ciclo where ciclo=:cic';

no me lo limpia por que me dice errores de otros parametros que estuve usando en otras sentencias y si lo pongo inmediatamente abajo de la linea me dice que no encuentra el parametro por ejemplo en este caso: el paramtro cic.. osea que onda?
quiere decir que si lo limpio se borra y ahora tengo que crear el parametro.. pero que no precisamente lo estoy creando?

aledieb 24-01-2007 16:17:01

Es raro, yo utilizo el mismo sistema en algunos procedimientos con la diferencia que utilizo close y open

Código Delphi [-]
DataModulo.QBuscar.close;
DataModulo.QBuscar.SQL.Clear;
DataModulo.QBuscar.SQL.Add('select * from ciclo where ciclo=:cic');
DataModulo.QBuscar.Parameters.ParamByName('cic').asinteger:=ciclob;
DataModulo.QBuscar.open;

Fijate con esta forma tal ves el problema sea en el sql.text, yo lo utilizo de esta manera.
A y le digo que tipo de parametro le paso con asTIPODATO

Espero que te sirva

FOURIER 27-01-2007 13:10:37

Yo te recomiendo que Uses Open para Select y ExecSQL para Delete,insert y update en el caso de que ocupes ADO sería algo más o menos así

Código SQL [-]
 
DataModulo.QBuscar.SQL.Text:='select * from ciclo where ciclo=:cic';
DataModulo.QBuscar.Parameters.ParamValues['cic'].Value:=ciclob;
DataModulo.QBuscar.Open;

En caso de BDE
Código SQL [-]
DataModulo.QBuscar.SQL.Text:='select * from ciclo where ciclo=:cic';
DataModulo.QBuscar.Params.ParamValues['cic'].Value:=ciclob;
DataModulo.QBuscar.Open;

Espero que te sirva


La franja horaria es GMT +2. Ahora son las 20:37:49.

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