PDA

Ver la Versión Completa : Se borra mi sentencia select


jzginez
22-07-2005, 19:45:13
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:

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:

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:


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:

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:

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

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

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 :(.


memo1.Lines:= CodigoSQL;


1º- CodigoSQL se ha creado???, lo correcto sería crearlo antes de hacer una asignación:

CodigoSQL := TStringList.Create;


2º- Para las asignaciones no te acostumbres a usar Lines directamente, el mejor método es uno de estos:

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.


var CodigoSQL :String
OrderBy:String; // aqui guardarmos el campo por el que se va a ordenar



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:

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