Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-07-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Question Se borra mi sentencia select

Hola amigos, buenas tardes desde la lluviosa ciudad de Puebla, México

No se si este hilo este bien puesto en este foro o vaya en otro pero como estoy usando firebird 1.5 y lo que pierdo son sentencias de sql lo pongo aqui.

ademas de firebird uso las fibplus y delphi 7

el problema que tengo es el siguiente:

uso un TpFIBDataSet con la siguente sentencia:
Código SQL [-]
SELECT
    proveedores.ID,
    SIGLAS,
    NOMBRE,
    RFC,
    CURP,
    NACIONAL,
    DIRECCION,
    COLONIA,
    Proveedores.ID_MUNICIPIO,
    MUNICIPIOS.MUNICIPIO,
    ESTADOS.ID,
    ESTADOS.ESTADO,
    estados.Abreviatura,
    OTRA,
    CP,
    REPRESENTANTE,
    Proveedores.LADA,
    TELEFONO_1,
    TELEFONO_2,
    TELEFONO_3,
    FAX,
    EXTENSION,
    EMAIL,
    HTTP,
    COMENTARIOS,
    COI
FROM
    PROVEEDORES 
inner join municipios on (municipios.id = Proveedores.id_municipio)
inner join estados on (municipios.id_estado = estados.id)

Esta no contiene la sentencia orde by, y como este tengo varios TpFIBDataSet para otras tablas, para mostrar los datos uso un dbgrid, botones y menus (nada del otro mundo first, prior, next, last), como son varias tablas y muchas funciones similares cree un formato base (FrmBaseGrid) y estoy crendo formatos herredados (FrmProveedores).

En el formato base tengo un procedimiento que cuando haces click en el titulo del campo del dbgrid este se pone en negritas y ordena la tabla en base a este campo:
Código Delphi [-]
procedure TFrmBaseGrid.DBGrid1TitleClick(Column: TColumn);
{$J+}
const
  PreviousColumnIndex : integer = -1;
{$J-}
Var
  Campo: String;
  I: Integer;
begin
 try
  DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
  DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
 except
 end;
 Column.Title.Font.Style:= Column.Title.Font.Style + [fsBold];
 PreviousColumnIndex := Column.Index;
 {la parte anterior la consegui gracias a una liga del club
  la siguiente parte es la que ordena}
  for I := 0 to CodigoSQL.Count - 1 do
  begin
    Campo:= CodigoSQL.Strings[i];
    if Pos ('Order', Campo) > 0
     then break;
  end;
  Campo:= CodigoSQL.Strings[Column.Field.Index+1];
  Delete(Campo,Pos(',',Campo),1);
  if I < CodigoSQL.Count
   Then CodigoSQL.Delete(I);
  If Orden
   Then Begin
    CodigoSQL.Add('Order by '+Campo);
    Orden:= False;
   End
   Else Begin
    CodigoSQL.Add('Order by '+Campo +' desc');
    Orden:= True;
   End;
end;
*nota las variables faltantes estan declaradas como publicas, codigoSQL es TStrings.

para ordenar la tabla en el formato herredado (Frmproveedores) hago lo siguiente:

Código Delphi [-]
procedure TFrmProveedores.DBGrid1TitleClick(Column: TColumn);
Begin
  CodigoSQL:= DtmDatos.pFIBproveedores.SelectSQL;
  DtmDatos.pFIBproveedores.Active:= False;
  inherited; //llama procedimiento heredado
  DtmDatos.pFIBproveedores.SelectSQL:= CodigoSQL;
end;

al ejecutar la aplicación e intentar ordenar la tabla me da error de que la propiedad SelectSQL esta bacia, para comprovar que estaba pasando con el contenido de "CogigoSQL" inserte un componente memo y el codigo siguiente:
Código Delphi [-]
procedure TFrmProveedores.DBGrid1TitleClick(Column: TColumn);
Begin
  CodigoSQL:= DtmDatos.pFIBproveedores.SelectSQL;
  DtmDatos.pFIBproveedores.Active:= False;
  inherited;
  memo1.Lines:= CodigoSQL;
  DtmDatos.pFIBproveedores.SelectSQL:= CodigoSQL;
  DtmDatos.pFIBproveedores.Active:= True;
end;

y en el memo si me mostro bien la sentecia sql (select .....) y sigue el mismo error, probe con:
Código Delphi [-]
procedure TFrmProveedores.DBGrid1TitleClick(Column: TColumn);
Begin
  CodigoSQL:= DtmDatos.pFIBproveedores.SelectSQL;
  DtmDatos.pFIBproveedores.Active:= False;
  inherited;
  DtmDatos.pFIBproveedores.SelectSQL:= CodigoSQL;
  memo1.Lines:= CodigoSQL;
  DtmDatos.pFIBproveedores.Active:= True;
end;

y en este caso tambien el memo esta en blaco, termine ocultando el memo y con el siguente codigo
Código Delphi [-]
procedure TFrmProveedores.DBGrid1TitleClick(Column: TColumn);
Begin
  CodigoSQL:= DtmDatos.pFIBproveedores.SelectSQL;
  DtmDatos.pFIBproveedores.Active:= False;
  inherited;
  memo1.Lines:= CodigoSQL;
  DtmDatos.pFIBproveedores.SelectSQL:= memo1.lines;
  DtmDatos.pFIBproveedores.Active:= True;
end;
y el procedimiento funciona bien al parecer la linea
Código Delphi [-]
  DtmDatos.pFIBproveedores.SelectSQL:= CodigoSQL;
en lugar de asignar a selectsql el contenido de CodigoSQL esta borrando el valor de CodigoSQL alguien sabe por que y que puedop hacer para no tener un componente memo oculto que solo sirve de enlace.

gracias
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #2  
Antiguo 23-07-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
He intentado contestar 2 veces a este post, y la verdad, no sé como empezar .

Código Delphi [-]
memo1.Lines:= CodigoSQL;

1º- CodigoSQL se ha creado???, lo correcto sería crearlo antes de hacer una asignación:
Código Delphi [-]
  CodigoSQL := TStringList.Create;

2º- Para las asignaciones no te acostumbres a usar Lines directamente, el mejor método es uno de estos:
Código Delphi [-]
  Memo1.Lines.Assign(codigoSQL); // o bien:
  Memo1.Lines.Add(CodigoSQL.TEXT); // o bien
  Memo1.Lines.Add(CodigoSQL);

Este error lo tienes cada vez que trabajas con todos los TStrings. Cuando metes el memo funciona, porque el TMemo implementa la asignación de Lines llamando al método Assign, pero el TStrings no lo tiene. Estudia la ayuda sobre estos métodos.

Lo más simple, es que pongas a String el CodigoSQL.

Código Delphi [-]
  var CodigoSQL :String
       OrderBy:String; // aqui guardarmos el campo por el que se va a ordenar

Código Delphi [-]
procedure TFrmBaseGrid.DBGrid1TitleClick(Column: TColumn);
{$J+}
const
  PreviousColumnIndex : integer = -1;
{$J-}
Var
  Campo: String;
  I,OrderByPos: Integer;
begin
 try
  DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
  DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
 except
 end;
 Column.Title.Font.Style:= Column.Title.Font.Style + [fsBold];
 PreviousColumnIndex := Column.Index;
 {la parte anterior la consegui gracias a una liga del club
  la siguiente parte es la que ordena}

  OrderByPos := pos (' Order by ', codigoSQL);
  if OrderByPos > 0 then // ya estaba ordenado
    delete(codigoSQL, OrderByPos, 255);
    // sabemos que la clausula order by es lo ultimo del sql,
    // Delete intenta borrar 255 letras desde la posición OrderByPos, 
    // Si no hay 255 letras, borrará hasta el final del SQL.


  if Orden then 
    codigoSQL := CodigoSQL + ' Order by ' + OrderBy
    // OrderBy se asigna cuando hacemos clic en Proveedores Tile Click
  else
  begin
    codigoSQL := CodigoSQL + ' Order by ' + OrderBy + ' desc';
    Orden:= True;
  end;
   End;
end;

Para llamar:
Código Delphi [-]
procedure TFrmProveedores.DBGrid1TitleClick(Column: TColumn);
Begin
  CodigoSQL:= DtmDatos.pFIBproveedores.SelectSQL.TEXT;
  OrderBy  := column.Field.FieldName; // guardamos el campo por el 
  // que queremos ordenar

  inherited; // ya hemos asignado las 2 propiedades codigoSQL y OrderBy
  // llamamos a inherited
 

  DtmDatos.pFIBproveedores.Active:= False;
  DtmDatos.pFIBproveedores.SelectSQL.TEXT := codigoSql;
 DtmDatos.pFIBproveedores.Active:= True;
end;

En lugar de variables, yo hubiese usado propiedades, pero creo que así es más claro.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 23-07-2005 a las 12:26:30.
Responder Con Cita
  #3  
Antiguo 23-07-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Gracias por tu ayuda Lepe, seguire tu consejo y cambiare mi código
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
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


La franja horaria es GMT +2. Ahora son las 07:29:30.


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