Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQL y RecordCount (https://www.clubdelphi.com/foros/showthread.php?t=47416)

UREÑA 27-08-2007 20:07:13

SQL y RecordCount
 
hola amigos lo que pasa es lo siguiente:

tengo una consulta y quiero que lo que trae esa consulta en recordcount
sea el tamaño de mi arreglo;

ya probe mi consulta en el ibexpert y si me arroja todos los registros en el codigo de delphi solo me manda uno
este es el codigo

Código SQL [-]
with  frm_DataModule.qry_Selec_Materia do begin
 if active then close;
 frm_DataModule.qry_Selec_Materia.SQL.Clear;
 frm_DataModule.qry_Selec_Materia.SQL.Add('SELECT ID_MATERIA, NOMBRE_MATERIA FROM MATERIA');
 frm_DataModule.qry_Selec_Materia.SQL.Add('WHERE (MATERIA.ID_AREA = '+QuotedStr(frm_CapAlum1.combo_Nucleo.KeyValue));
 frm_DataModule.qry_Selec_Materia.SQL.Add('OR MATERIA.NUCLEO_FORMACION ='+QuotedStr('TRONCO COMUN')+') ');
 frm_DataModule.qry_Selec_Materia.SQL.Text;
 frm_DataModule.qry_Selec_Materia.Open;
 frm_DataModule.qry_Selec_Materia.First;

 dimension := frm_DataModule.qry_Selec_Materia.RecordCount ;

 SetLength(listMat,dimension + 1 ) ;
 e := 0 ;
 while not (frm_DataModule.qry_Selec_Materia.Eof) do
   begin
     //listMat[e].materia := frm_DataModule.qry_Selec_Materia.fields[0].AsString ;
     frm_DataModule.qry_Selec_Materia.Next;
     inc(e) ;
   end;//end while
frm_DataModule.trans_Commit.StartTransaction;
   frm_DataModule.qry_Alum_Ins_Upd.Close;
   frm_DataModule.qry_Alum_Ins_Upd.SQL.Clear;
   frm_DataModule.qry_Alum_Ins_Upd.SQL.Add('INSERT INTO ALU_MAT(MATRICULA, CURSADAS)');
   frm_DataModule.qry_Alum_Ins_Upd.SQL.Add('VALUES('+QuotedStr(rest_Mat)+
   ','+QuotedStr(' ')+ ')');
   frm_DataModule.qry_Alum_Ins_Upd.SQL.Text;
   frm_DataModule.qry_Alum_Ins_Upd.ExecSQL;
   frm_DataModule.trans_Commit.Commit;

gracias a todos!!!:rolleyes:

BlueSteel 27-08-2007 22:43:04

Hola

no se si te sirva esto.. pero yo he tenido muchos problemas al utilizar el RecordCount en Interbase y desde Delphi... así que te sugiero que agregues una sentencia de Count y la asignes a una variable.. y con eso hagas tu proceso

tendrias que usar un
Código SQL [-]
Select Count(Campo1) As Num_Registro, Campo2, Campo3, Campo4
Where  Condicion
Order by Campo2

y despue tendrias que poner algo asi
Código Delphi [-]
dimension := frm_DataModule.query['Num_Registro'];

espero que te sirva

ContraVeneno 27-08-2007 23:13:46

Espero que comprendas a que me refiero:

http://www.clubdelphi.com/foros/show...24&postcount=3

con respecto al recordcount, muchas veces tienes que mandar traer todos los registros para que el recordcount tenga su valor real, es decir, necesitas utilizar el comando "last" para ir al último registro y luego "first" para regresar, de esta manera aseguras que el dataset haga un conteo de todos los registros, asígnando el valor real al recordcount.

egostar 27-08-2007 23:31:31

Cita:

Empezado por ContraVeneno (Mensaje 226404)
Espero que comprendas a que me refiero:

http://www.clubdelphi.com/foros/show...24&postcount=3

con respecto al recordcount, muchas veces tienes que mandar traer todos los registros para que el recordcount tenga su valor real, es decir, necesitas utilizar el comando "last" para ir al último registro y luego "first" para regresar, de esta manera aseguras que el dataset haga un conteo de todos los registros, asígnando el valor real al recordcount.

Amigo Contra, creeme que me cuesta trabajo entender lo que dices (eso sería un bug demasiado malo como para que sea verdad :eek::eek::eek:, tener que hacer last y first, vamos ni en paradox sucede), yo soy realmente nuevo con los componentes IBX, pero lo poco que lo he usado, nunca he tenido ese problema.

A mi me parece que las variables que está pasando no están siendo las adecuadas o la comparación está haciendo una de sus jugarretas.

Bueno, mi inexperiencia puede ser traicionera. No me hagan mucho caso.

Salud OS

ContraVeneno 28-08-2007 00:02:35

pues sí, pero hasta donde tengo entendido, el dataset no recorre todos los registros, es decir, va recorriendo, según va necesitando, por lo tanto, hay ocasiones en que el recordcount no da el dato exacto y por eso habría que ir al último registro para que los cuente todos... yo tampoco soy muy experto en eso, pero así es como me lo sabía :D

mamaro 28-08-2007 14:32:14

Hola
 
Efectivamente existen algunos problemas con el RecordCount en Interbase y en Firebird (no he probado con otros motores).
Al parecer una de las bondades de estos motores es realizar una especie de retorno de registros a petición, ésto nos permite ahorrarnos tiempo de procesador (de servidor), y reducimos el tráfico de red ... por supuesto casi todo lo bueno viene acompañado de algo malo :( .. y esto no es la excepción.

Al ejecutar Last estamos forzando al motor a que nos retorne todos los registros, razón por la cual la propiedad RecordCount toma su valor real.

Con algunos otros motores como Access o Paradox esto no pasa porque cuando se hace una consulta se obtiene de entrada la totalidad de los registros.


La franja horaria es GMT +2. Ahora son las 00:44:02.

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