Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Problema con RecordCount

Hola gente!, hice un procedimiento que obtiene los campos que pertenecen a un determinado indice. Para esto, utilice las tablas del sistema sys.Columns, sys.Index_Columns y sys.Indexes. Antes que nada les menciono que la sentencia SQL Select que utiliza el TSQLQuery esta probada, funciona perfectamente.
El procedimiento crea un objeto SQLQuery, le asigno el SQLConnection y en su propiedad SQL agrego las sentencias. Esta pueden devolver uno o mas campos, por lo tanto, para saber esto aplico la propiedad RecordCount, que al ejecutarse produce el error: 'El nombre de objeto sys.columns no es valido'.
Recalco que es con esta propiedad que surge el inconveniente ya que si no la aplico, puedo obtener sus datos de manera habitual.
La solución seria utilizar algún otro tipo de propiedad o configurar algo que me este faltando. La prepare carece en este componente.
Bueno escucho sugerencias.

Slds.
Responder Con Cita
  #2  
Antiguo 15-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo no me he enterado de lo que estás haciendo, de lo que quieres conseguir, del problema que tienes ni de nada
Responder Con Cita
  #3  
Antiguo 15-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Código:

Código Delphi [-]
var
  oQTempCamposIndices : TSQLQuery;
  vCampos: string;
//....
begin
  oQTempCamposIndices := TSQLQuery.Create(nil);
  oQTempCamposIndices.SQLConnection:= SQLDataset.SQLConnection;
       with oQTempCamposIndices do
        begin
          SQL.Clear;
          SQL.Add('Select Columnas.name as Campo From sys.columns as Columnas ');
          SQL.Add('INNER JOIN sys.index_columns as ColIndices on ColIndices.object_id = Columnas.object_id ');
          SQL.Add('AND ColIndices.column_id = Columnas.column_id ');
          SQL.Add('INNER JOIN sys.indexes as Indices on Indices.object_id = ColIndices.object_id ');
          SQL.Add('AND Indices.index_id = ColIndices.index_id ');
          SQL.Add('Where Indices.name = ' + QuotedStr(Indice));
          oQTempCamposIndices.Open;
          //First;
          if oQTempCamposIndices.RecordCount > 1 then <------- ERROR: El nombre de objeto sys.columns no es valido.
          begin
            First;
            while not eof do
              vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString) + ';';
              next;
          end
          else
            vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString);
        end;

Última edición por Jere_84 fecha: 15-06-2012 a las 16:13:51. Razón: no toma el codigo fuente
Responder Con Cita
  #4  
Antiguo 15-06-2012
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
Prueba asi

Código Delphi [-]
with oQTempCamposIndices do
        begin
          SQL.Clear;
          SQL.Add('Select Columnas.name as Campo From sys.columns as Columnas ');
          SQL.Add('INNER JOIN sys.index_columns as ColIndices on ColIndices.object_id = Columnas.object_id ');
          SQL.Add('AND ColIndices.column_id = Columnas.column_id ');
          SQL.Add('INNER JOIN sys.indexes as Indices on Indices.object_id = ColIndices.object_id ');
          SQL.Add('AND Indices.index_id = ColIndices.index_id ');
          SQL.Add('Where Indices.name = ' + QuotedStr(Indice));
          oQTempCamposIndices.Open;
          //First;
          if (not  eof) then
           begin
            //while not eof do
              vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString) + ';';
              next;     
           end
         else
          begin
            vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString);     
           end;   
        end;

mas o menos
Responder Con Cita
  #5  
Antiguo 15-06-2012
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
bueno y te sirvio?
Responder Con Cita
  #6  
Antiguo 15-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por microbiano Ver Mensaje
bueno y te sirvio?
No recorre el while solo pasa una vez y a la siguiente se va a finally no se porque, siendo que hay otros campos mas. Ademas desmarque el First para que se posiciones sobre el primer lugar, pero nada..
Responder Con Cita
  #7  
Antiguo 15-06-2012
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
haber asi

Código Delphi [-]
      
if (not Eof)  then
 begin
  while not Eof do
   begin
     vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString) + ';';
      next;   
   end; 
 end
else
 Begin
  vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString);  
end;
Responder Con Cita
  #8  
Antiguo 15-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por microbiano Ver Mensaje
Código Delphi [-]
      
if (not Eof)  then
 begin
  while not Eof do
   begin
     vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString) + ';';
      next;   
   end; 
 end
else
 Begin
  vCampos := vCampos + sc.Trim(oQTempCamposIndices.Fieldbyname('Campo').AsString);  
end;
Funciona pero pasa siempre por el lugar que concatena la coma a pesar de que halla uno o varios campos. La unica forma de diferenciarlo me parece a mi, seria con el RecordCount pero no se porque me tira error con esa tabla sys.columns no es un objeto valido..
Responder Con Cita
  #9  
Antiguo 15-06-2012
Avatar de microbiano
microbiano microbiano is offline
Miembro
 
Registrado: sep 2008
Ubicación: Mexico D.F
Posts: 349
Poder: 16
microbiano Va por buen camino
ummm recordcount o lo que tienes en recordcount>0de ciertta forma es lo mismo que eof ya que validan si el query esta vacio, ahora el error que te marca es que no existe ese campo en la consulta que estas haciendo, es decir sys.columns no es valido. no forma parte de tu consulta.
Responder Con Cita
  #10  
Antiguo 15-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por microbiano Ver Mensaje
ummm recordcount o lo que tienes en recordcount>0de ciertta forma es lo mismo que eof ya que validan si el query esta vacio, ahora el error que te marca es que no existe ese campo en la consulta que estas haciendo, es decir sys.columns no es valido. no forma parte de tu consulta.
La diferenica es que con el recordcount puedo hacer algo asi ya que devuelve un integer, en cambio eof es boolean..

Código Delphi [-]
If recordcount > 1 then
begin 
  //...
end
else
  //...
Responder Con Cita
  #11  
Antiguo 15-06-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Hola Jere_84

Has repasado bien la SQL, la he realizado en mi ordenador y funciona correctamente, porque utilizas alias tan largos.

En vez de sys.columns AS Columnas, utiliza AS C, o algo parecido.

Código SQL [-]
SELECT
    C.name AS CAMPO
  FROM sys.columns AS C
    INNER JOIN sys.index_columns AS IC
      ON IC.object_id = c.object_id AND IC.column_id = C.column_id
    INNER JOIN sys.indexes AS I
      ON I.object_id = IC.object_id AND I.index_id = IC.index_id
  WHERE I.name = 'PKUC_IDEMPLEADO'

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #12  
Antiguo 15-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por olbeup Ver Mensaje
Hola Jere_84

Has repasado bien la SQL, la he realizado en mi ordenador y funciona correctamente, porque utilizas alias tan largos.

En vez de sys.columns AS Columnas, utiliza AS C, o algo parecido.

Código SQL [-]
SELECT
    C.name AS CAMPO
  FROM sys.columns AS C
    INNER JOIN sys.index_columns AS IC
      ON IC.object_id = c.object_id AND IC.column_id = C.column_id
    INNER JOIN sys.indexes AS I
      ON I.object_id = IC.object_id AND I.index_id = IC.index_id
  WHERE I.name = 'PKUC_IDEMPLEADO'

Un saludo.
Hola olbeup, si la sentencia anda lo que si da un error en el RecordCount y no se porque. Voy a comprobar el tema de los alias pero no debería influir.
Responder Con Cita
  #13  
Antiguo 15-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No sé exactamente de qué va el hilo este, pero hay que tener en cuenta un 'pequeño' detalle:
recordcount no devuelve el número de registros involucrados en un query.
Habría que ir al último registro (hacer un fetch) para, ahora sí, usar el valor de recordcount.
Resumiendo:
Código Delphi [-]
qry.close;
qry.sql.text:='select nombre from tbclientes where provincia=28';
qry.execquery;
showmessage(inttostr(qry.recordcount));  //  <<---  Esto normalmente devolverá: 1
Responder Con Cita
  #14  
Antiguo 16-06-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No sé exactamente de qué va el hilo este, pero hay que tener en cuenta un 'pequeño' detalle:
recordcount no devuelve el número de registros involucrados en un query.
Habría que ir al último registro (hacer un fetch) para, ahora sí, usar el valor de recordcount.
Resumiendo:
Código Delphi [-]
qry.close;
qry.sql.text:='select nombre from tbclientes where provincia=28';
qry.execquery;
showmessage(inttostr(qry.recordcount));  //  <<---  Esto normalmente devolverá: 1
Hola Casimiro,

Efectivamente te devuelve 1 registro
Código Delphi [-]
qry.close;
qry.sql.text:='select nombre from tbclientes where provincia=28';
qry.execsql;
showmessage(inttostr(qry.recordcount));  //  <<---  Esto normalmente devolverá: 1

Pero esto te devuelve cuantos registros hay
Código Delphi [-]
qry.close;
qry.sql.text:='select nombre from tbclientes where provincia=28';
qry.open;
showmessage(inttostr(qry.recordcount));  //  <<---  Esto devolverá: x registros
qry.close;

Un saludo
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 16-06-2012 a las 01:38:49.
Responder Con Cita
  #15  
Antiguo 16-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por olbeup Ver Mensaje
Pero esto te devuelve cuantos registros hay
Código Delphi [-]
qry.close; 
qry.sql.text:='select nombre from tbclientes where provincia=28'; 
qry.open; 
showmessage(inttostr(qry.recordcount));  //  <<---  Esto devolverá: x registros 
qry.close;

Un saludo
No, pruébalo y verás que no
Responder Con Cita
  #16  
Antiguo 16-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No, pruébalo y verás que no
Entonces andará mal tu Delphi, porque RecordCount devuelve la cantidad de registros. El nombre de la propiedad lo dice.

Slds.
Responder Con Cita
  #17  
Antiguo 16-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Lo has probado?
Responder Con Cita
  #18  
Antiguo 16-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Cita:
Habría que ir al último registro (hacer un fetch) para, ahora sí, usar el valor de recordcount.
Casimiro tiene razón. Por otro lado la propiedad RecordCount no funciona bién en todas las bd.

Si tu intención es saber la cantidad de resultados que arrojó tu consulta:
Código Delphi [-]
  qry.SQL.Clear;
  qry.SQL.Text:= 'SELECT COUNT(*) AS CANTIDAD FROM TBCLIENTES WHERE PROVINCIA = 28';
  qry.Open;
  ShowMessage(qry.FieldByName('CANTIDAD').AsString);
  qry.Close;
O, si no te importa, podrías obtenerlo en una misma consulta GROUP BY mediante, pero te devolverá NOMBRE y CANTIDAD.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-06-2012 a las 21:42:32.
Responder Con Cita
  #19  
Antiguo 17-06-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No, pruébalo y verás que no
Tengo muchas aplicaciones así y ninguna me ha fallado, trabajo con SQL SERVER 2005 y hasta ahora RecordCount se ha portado, sólo trabajo con ADOQuery, nunca he trabajado con ADOTABLE que también está el RecordCount, lo he probado muchas veces ADOQuery.RecordCount y devuelve los registros que contiene el ADOQuery, ni más ni menos.

Código SQL [-]
SELECT 
    COUNT(*) AS CANTIDAD 
  FROM TBCLIENTES 
  WHERE PROVINCIA = 28

Esta consulta es más rápida porque sólo devuelve un registro, pero tan válida cómo ADOQuery.RecordCount

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #20  
Antiguo 17-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si el componente que estás usando tiene alguna propiedad del tipo "FetchAllRecords" y está a True, entonces es el motivo por el que te funciona el recordcount.
Pero ten en cuenta que eso es sólo por lo que he comentado, por el valor de una propiedad, ya que un select a una base de datos no puede saber cuántos registros involucra, salvo que vaya hasta el último, es algo elemental que verás en cualquier tutorial sql de cualquier base de datos.
Tenlo presente, y no te encabezones , RecordCount NO devuelve el número de registros. Salvo que sea una tabla plana, que no es el caso.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
RecordCount -1 bjaeger Conexión con bases de datos 2 27-01-2010 03:14:53
Problema con la funcion recordcount de los TIBQuery capo979 Conexión con bases de datos 14 26-03-2008 16:02:02
SQL y RecordCount UREÑA SQL 5 28-08-2007 14:32:14
Problema con TQuery.RecordCount kuan-yiu Varios 4 26-10-2006 18:54:31
Problema con un RecordCount Lucciano Conexión con bases de datos 4 07-04-2006 15:40:54


La franja horaria es GMT +2. Ahora son las 15:58:25.


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
Copyright 1996-2007 Club Delphi