Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   problema con first en zeoslib 7 y delphi 2010 (https://www.clubdelphi.com/foros/showthread.php?t=81645)

ritamarkarla 03-12-2012 15:59:22

problema con first en zeoslib 7 y delphi 2010
 
hola: mi problema es el siguiente, estoy usando componentes zeoslib7 y delphi 2010, tengo una consulta, un zquery, pero al decir
zquery.first me posiciona en vez de en el primer registro en el ultimo, alguien a tenido este problema? hay alguna otra forma de posicionarme en el primer registro de la consulta sin usar first?

saludos

ecfisa 03-12-2012 16:10:40

Hola ritamarkarla.

¿ Podrías poner el código donde realizas la consulta ? , sería interesante ver la cadena SQL que le estas enviando.

Saludos.

ritamarkarla 03-12-2012 16:42:05

codigo
 
aqui esta el codigo

Código Delphi [-]
      ZQueryEmpresas.Close;
      ZQueryEmpresas.SQL.Clear;
      filtro := 'WHERE ';
      {filtrar por palabras claves}
      if palabras_claves.Text <> EmptyStr
        then
          filtro := filtro + '(palabras_claves like ' + QuotedStr('%' + palabras_claves.Text + '%') + ') and ';
      {comunidad}
      if comunidad.KeyValue <> -1
        then
          if not ZTableComunidad.IsEmpty then
          filtro := filtro + '(empresas.id_comunidad = ' + IntToStr(comunidad.KeyValue) + ') and ';
      {provincia}
      if provincia.KeyValue <> -1
        then
          if not ZTableProvincia.IsEmpty then
          filtro := filtro + '(empresas.id_provincia = ' + IntToStr(provincia.KeyValue) + ') and ';
      {comarca}
      if comarca.KeyValue <> -1
        then
          if not ZTableComarca.IsEmpty then
          filtro := filtro + '(empresas.id_comarca = ' + IntToStr(comarca.KeyValue) + ') and ';
      {ayuntamiento}
      if ayuntamiento.KeyValue <> -1
        then
          if not ZTableAyuntamiento.IsEmpty then
          filtro := filtro + '(empresas.id_ayuntamiento = ' + IntToStr(ayuntamiento.KeyValue) + ') and ';
      {Nombre}
      filtro := filtro + '(nombre LIKE ' + QuotedStr('%' + nombre.Text + '%') + ') or (nombre IS NULL)';
      consulta := 'SELECT empresas.nombre, empresas.forma_juridica, empresas.palabras_claves, empresas.direccion, empresas.codigo_postal, ' + 
'empresas.telefono_1, empresas.telefono_2, empresas.web, empresas.email_1, empresas.email_2, empresas.comentarios, empresas.id, 
comunidad.comunidad, provincia.provincia, comarca.comarca, ayuntamiento.ayuntamiento ' +
                  'FROM (((empresas LEFT JOIN comunidad ON empresas.id_comunidad = comunidad.id) LEFT JOIN provincia ON 
empresas.id_provincia = provincia.id) ' + 'LEFT JOIN comarca ON empresas.id_comarca = comarca.id) LEFT JOIN ayuntamiento ON empresas.id_ayuntamiento = ayuntamiento.id ' +
                  filtro +
                  ' ORDER BY empresas.nombre, comunidad.comunidad, provincia.provincia, comarca.comarca, ayuntamiento.ayuntamiento';
      ZQueryEmpresas.SQL.Add(consulta);
      ZQueryEmpresas.Open;
ZQueryEmpresas.First;

Al González 03-12-2012 17:20:43

Una pregunta, ¿cuántos registros te arroja esa consulta? Si pones un DBGrid, viéndose más de un registro en la lista, y haces el First, ¿se va realmente al último?

Por cierto, y como sugerencia aparte, puedes ahorrar algo de código (la llamada a Clear y la variable Consulta) asignando la sentencia Select directamente:
Código Delphi [-]
ZQueryEmpresas.SQL.Text := 'Select...';

Saludos cordiales. :)

ritamarkarla 03-12-2012 17:41:30

codigo
 
hola, estoy utilizando el componente cxgrid de el paquete de devexpress, y si cuando doy zqueryempresas.first se me va al ultimo, el prior me funciona perfecto, el last tambien, el next, el unico que no me funciona es el first, y lo que tengo son tres record, no se que pasa, he estado buscando otra opcion para posicionarme en el primer record pero nada, y gracias por la sugerencia

Al González 03-12-2012 17:47:51

Y si, para descartar, usas un TDBGrid normal en lugar del cxGrid, ¿pasa lo mismo?

ritamarkarla 03-12-2012 18:06:45

codigo
 
hola, hice lo que me dijistes, y el problema si es con el cxgrid, cuando lo desvinculo del cxgrid, si se me mueve hacia el primer record, y entonces porque el componente me hara eso?

Al González 03-12-2012 18:17:27

Si no tienes código en algún evento del cxGrid que pudiera ser el causante de esto, lo más probable es que alguna propiedad del cxGrid está determinando cuál debe ser el orden de visualización de los registros.

Lo curioso es que, si así fuera, los métodos Prior, Next y Last debieran también hacer posicionamientos extraños. Pero según comentaste antes, éstos funcionan bien.

En el conjunto de datos (ZQueryEmpresas), los registros vienen según se trajeron de la base de datos, y cuando llamas a First, lo más seguro es que ZQueryEmpresas sí se posicione en el primero.

Lo que ves en el cxGrid es una representación particular de esa información, en un orden de visualización que no necesariamente corresponde a como están dentro de ZQueryEmpresas.

¿Qué pasa si agregas de nuevo un cxGrid limpio, desde cero, y lo asocias a la consulta?

ritamarkarla 03-12-2012 18:27:02

codigo
 
hola, no tengo ningun codigo en el cxgrid, incluso lo borre, puse uno nuevo y nada, nada mas hago vincularlo con el datasource del query y ya no me hace el first, y no es que no lo visualice bien, es que no lo hace ni el zquery, verás este es el codigo que uso, en el que veo que no me funciona el zquery.first,
Código Delphi [-]
  with form1 do
    begin
   //   cxGrid1DBTableView1.ViewData.Records[0].Selected := true;
      {Abriendo el Modelo de reporte}
      AppPath := TApplication(Application).ExeName;
      DeleteName(AppPath);
      AppPath := AppPath + 'Empresas.xls';
      Lcid := LOCALE_USER_DEFAULT;
      ExcelModelo := TExcelApplication.Create(Application);
      ExcelModelo.ConnectKind := ckNewInstance;
      ExcelWorkbook1 := TExcelWorkbook.Create(Application);
      ExcelWorkbook1.ConnectTo(ExcelModelo.Workbooks.Add(AppPath, Lcid));
      {llenando el modelo}
      ZQueryEmpresas.First;
      i := 6;
      while not ZQueryEmpresas.Eof do
        begin
          ExcelModelo.Cells.Item[i,1] := ZQueryEmpresas.FieldByName('nombre').AsString;
          ZQueryEmpresas.Next;
          inc(i);
        end;
      {visualixando el modelo}
      ExcelModelo.Visible[Lcid] := true;
      ExcelModelo.Disconnect;
    end;

cuando vinculo el datasource al cxgrid pues me sale en blanco el excel, desvinculo el datasource y me llena el excel con los datos.
???

Al González 03-12-2012 22:19:24

Esto me suena a un problema de ZeosLib con las marcas de registro (bookmarks). Cuando llamas a First, el cxGrid responde rellenándose con todos los registros del conjunto de datos asociado. Para esto lo recorre desde el primero hasta el último, y al finalizar regresa el conjunto de datos al registro donde se encontraba posicionado. Esto último lo hace mediante bookmarks, pero si el conjunto de datos (en este caso un ZQuery) presenta algún problema con la propiedad Bookmark o el método GoToBookmark, ese "regreso" no se realizará y quedará posicionado en el último registro que leyó el cxGrid.

Alguien más ya pasó por esa situación: http://www.devexpress.com/Support/Center/p/Q242456.aspx

No tengo Delphi 2010, pero si alguien pudiera confirmar si lo mismo ocurre en XE2, con gusto puedo echar una mirada.

Saludos.

Al González.

Agrego: Para salir del paso por el momento, puedes intentar llamando a los métodos DisableControls y EnableControls del ZQuery, antes de llamar a First y después de la exportación a Excel, respectivamente.

ritamarkarla 04-12-2012 14:02:32

codigo
 
hola:
muchas gracias por la ayuda, por el momento lo que hecho es utilizar esta propiedad del cxgrid cxGrid1DBTableView1.DataController.GotoFirst para que aunque sea el cxgrid vaya al primer registro, y se pueda llenar el doc en excel, pero la verdad es que si alguien encuentra otra solución no estaría de más, lo más molesto es que el problema es solo con el first, no asi con next, prior.
saludos


La franja horaria es GMT +2. Ahora son las 00:51:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi