Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Se borra mi sentencia select (https://www.clubdelphi.com/foros/showthread.php?t=23618)

jzginez 22-07-2005 19:45:13

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

Lepe 23-07-2005 12:10:21

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

jzginez 23-07-2005 15:22:13

Gracias por tu ayuda Lepe, seguire tu consejo y cambiare mi código


La franja horaria es GMT +2. Ahora son las 09:54:44.

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