PDA

Ver la Versión Completa : Error en Consulta - solo salen datos la primera vez


javicho_villa
23-01-2006, 21:12:57
Hola

Tengo un problema con una consulta que hago, trabajo con Delphi 6 con Paradox y QuickReport, la consulta sale bien la primera vez pero cuando le doy el preview pero cuando regreso al formulario para cambiar opciones de la consulta me sale el reporte vacio y se q existe información por visualizar.

Lo que he podido determinar es que se trata de las tablas temporales que creo dinamicamente para poder generar el reporte, una de las tres tablas que genero aparece como si no tuviera registros.

Necesito una luz, para poder solucionar el problema, por que ya intente con refresh de las tablas o cerrar y volverarlas abrir y no se soluciona o a lo mejor no es eso.

Gracias de antemano por la atención.

Javier Villa

marcoszorrilla
23-01-2006, 22:41:31
Sino pones algo del código que supuestamente te da el error, dificilmente se te va a poder ayudar.

Un Saludo.

javicho_villa
23-01-2006, 22:48:35
Gracias nuevamente por la ayuda este es el codigo principal:

Bueno Trabajo con DataMulo que seria Dm y 3 tablas temporales que creo dinamicamente, luego la relaciono

----------------------
var Orden,Filtro,Sentencia:String;
MiRepo:TKardexClasicoReport;
MiRepoSaldo:TKardexSaldosReport;
Id:integer;
begin
Orden := ' order by Id_Cliente,Id_Producto,Lote,fecha ';
Filtro := '';
Sentencia := 'select * from Kardex ';
//-- Cliente ---//
if self.ClienteComboBox.ItemIndex>0 then
Filtro:=' where id_cliente='+intToStr(Dm.GetId_Cliente(self.ClienteComboBox.Text));
//-- Producto ---//
if self.ProductoComboBox.ItemIndex>0 then
if length(Filtro)=0 then Filtro:=' where id_producto='+IntToStr(Dm.GetId_Producto(self.ProductoComboBox.Text))
else Filtro:=Filtro+' and id_producto='+IntToStr(Dm.GetId_Producto(self.ProductoComboBox.Text));
//--- Por Lotes ---//
if length(self.LoteEdit.Text)>0 then
if length(Filtro)=0 then Filtro:=' where Lote='+QuotedStr(self.LoteEdit.Text)
else Filtro:=Filtro+' and Lote='+QuotedStr(self.LoteEdit.Text);
///--- Movimientos ----//
if self.Ingresos.Checked then
if length(Filtro)=0 then Filtro:=' where TipoMovimiento=true'
else Filtro:=Filtro+' and TipoMovimiento=true';
if self.salidas.Checked then
if length(Filtro)=0 then Filtro:=' where TipoMovimiento=false'
else Filtro:=Filtro+' and TipoMovimiento=false';
///-- Control de Tiempos ---//
if self.APartir.Checked then
if length(filtro)=0 then Filtro := ' where fecha>='+QuotedStr(FormatDateTime('mm/dd/yyyy',self.FechaAPartirDateTime.Date))
else Filtro := Filtro+' and fecha>='+QuotedStr(FormatDateTime('mm/dd/yyyy',self.FechaAPartirDateTime.Date));
if self.Desde.Checked then
if length(Filtro)=0 then Filtro := ' where fecha>='+QuotedStr(FormatDateTime('mm/dd/yyyy',self.FechaDesdeDateTime.Date))+' and fecha<='+QuotedStr(FormatDateTime('mm/dd/yyyy',self.FechaHastaDateTime.Date))
else Filtro := Filtro+' and fecha>='+QuotedStr(FormatDateTime('mm/dd/yyyy',self.FechaDesdeDateTime.Date))+' and fecha<='+QuotedStr(FormatDateTime('mm/dd/yyyy',self.FechaHastaDateTime.Date));
//--- Detalle de los Movimientos ---//
// ShowMessage(Sentencia+Filtro+Orden);
Dm.TrabajoQuery.Close;
Dm.TrabajoQuery.SQL.Clear;
Dm.TrabajoQuery.SQL.Add(Sentencia+Filtro+Orden);
Dm.TrabajoQuery.Active := true;
if Dm.TrabajoQuery.RecordCount > 0 then begin
self.CreandoTemporal;
Dm.TrabajoQuery.First;
id := 1;
while not Dm.TrabajoQuery.Eof do begin
Dm.TempDetTable.Append;
Dm.TempDetTable.FieldValues['Id_Temp'] := Id;
Dm.TempDetTable.FieldValues['Id_Kardex'] := Dm.TrabajoQuery.FieldByName('Id_Kardex').AsInteger;
Dm.TempDetTable.FieldValues['Id_Producto'] := Dm.TrabajoQuery.FieldByName('Id_Producto').AsInteger;
Dm.TempDetTable.FieldValues['Id_Cliente'] := Dm.TrabajoQuery.FieldByName('Id_Cliente').AsInteger;
Dm.TempDetTable.FieldValues['Fecha'] := Dm.TrabajoQuery.FieldByName('Fecha').AsDateTime;
Dm.TempDetTable.FieldValues['TipoMovimiento'] := Dm.TrabajoQuery.FieldByName('TipoMovimiento').AsBoolean;
Dm.TempDetTable.FieldValues['Lote'] := Dm.TrabajoQuery.FieldByName('Lote').AsString;
Dm.TempDetTable.FieldValues['Observaciones'] := Dm.TrabajoQuery.FieldByName('Observaciones').AsString;
Dm.TempDetTable.FieldValues['OrdenCompra'] := Dm.TrabajoQuery.FieldByName('OrdenCompra').AsString;
Dm.TempDetTable.FieldValues['ProductoLote'] := Dm.TrabajoQuery.FieldByName('Id_Producto').AsString+Dm.TrabajoQuery.FieldByName('Lote').AsString;
Dm.TempDetTable.FieldValues['PesoNeto'] := Dm.TrabajoQuery.FieldByName('PesoNeto').AsFloat;
Dm.TempDetTable.FieldValues['Id_Proveedor'] := Dm.TrabajoQuery.FieldByName('Id_Proveedor').AsInteger;
Dm.TempDetTable.FieldValues['Serie'] := Dm.TrabajoQuery.FieldByName('Serie').AsString;
Dm.TempDetTable.FieldValues['Numero'] := Dm.TrabajoQuery.FieldByName('Numero').AsString;
Dm.TempDetTable.FieldValues['Id_Parametro_tc'] := Dm.TrabajoQuery.FieldByName('Id_Parametro_tc').AsInteger;
Dm.TempDetTable.Post;
id := id + 1;
Dm.TrabajoQuery.Next;
end;
//--- Cabecera por Producto y Lote ---//
Sentencia := 'select Distinct id_Cliente,id_Producto,Lote from Kardex ';
Dm.Trabajo2Query.Close;
Dm.Trabajo2Query.SQL.Clear;
Dm.Trabajo2Query.SQL.Add(Sentencia+Filtro);
Dm.Trabajo2Query.Active := true;
if Dm.Trabajo2Query.RecordCount > 0 then begin
Dm.Trabajo2Query.First;
id := 1;
while not Dm.Trabajo2Query.Eof do begin
Dm.TempCabTable.Append;
Dm.TempCabTable.FieldValues['Id_Temp'] := Id;
Dm.TempCabTable.FieldValues['Id_Producto'] := Dm.Trabajo2Query.FieldByName('Id_Producto').AsInteger;
Dm.TempCabTable.FieldValues['Lote'] := Dm.Trabajo2Query.FieldByName('Lote').AsString;
Dm.TempCabTable.FieldValues['ProductoLote'] := Dm.Trabajo2Query.FieldByName('Id_Producto').AsString+Dm.Trabajo2Query.FieldByName('Lote').AsString;
Dm.TempCabTable.FieldValues['Id_Cliente'] := Dm.Trabajo2Query.FieldByName('Id_Cliente').AsInteger;
Dm.TempCabTable.Post;
id := id + 1;
Dm.Trabajo2Query.Next;
end;
end;
//--- Cabecera por Producto ---//
Sentencia := 'select Distinct id_Cliente,id_Producto from Kardex ';
Dm.Trabajo2Query.Close;
Dm.Trabajo2Query.SQL.Clear;
Dm.Trabajo2Query.SQL.Add(Sentencia+Filtro);
Dm.Trabajo2Query.Active := true;
if Dm.Trabajo2Query.RecordCount > 0 then begin
Dm.Trabajo2Query.First;
id := 1;
while not Dm.Trabajo2Query.Eof do begin
Dm.TemporalTable.Append;
Dm.TemporalTable.FieldValues['Id_Temp'] := Id;
Dm.TemporalTable.FieldValues['Id_Producto'] := Dm.Trabajo2Query.FieldByName('Id_Producto').AsInteger;
Dm.TemporalTable.FieldValues['Id_Cliente'] := Dm.Trabajo2Query.FieldByName('Id_Cliente').AsInteger;
Dm.TemporalTable.Post;
id := id + 1;
Dm.Trabajo2Query.Next;
end;
end;
Sentencia := 'select Distinct id_Cliente from Kardex ';
Dm.Trabajo2Query.Close;
Dm.Trabajo2Query.SQL.Clear;
Dm.Trabajo2Query.SQL.Add(Sentencia+Filtro);
Dm.Trabajo2Query.Active := true;
self.LlenarSaldoTemporal;
//--- Estableciendo Relacion Maestro Detalle de con Productos y Lotes y Movimiento --///
Dm.TempDetTable.Active := false;
DM.TempDetTable.IndexName := 'ProductoLote';
Dm.TempDetTable.MasterSource := Dm.CabeceraDataSource;
Dm.TempDetTable.MasterFields := 'ProductoLote';
Dm.CabeceraDataSource.DataSet := Dm.TempCabTable;
Dm.TempDetTable.Active := true;
//--- Estableciendo Relacion Maestro Detalle con las Productos y lotes --///
Dm.TempCabTable.Active := false;
DM.TempCabTable.IndexName := 'Id_Producto';
Dm.TempCabTable.MasterSource := Dm.TemporalDataSource;
Dm.TempCabTable.MasterFields := 'Id_Producto';
Dm.TemporalDataSource.DataSet := Dm.TemporalTable;
Dm.TempCabTable.Active := true;
//--- Estableciendo Relacion Maestro Detalle con las Productos y lotes --///
Dm.TemporalTable.Active := false;
Dm.TemporalTable.IndexName := 'Id_Cliente';
Dm.TemporalTable.MasterSource := Dm.TrabajoDataSource;
Dm.TemporalTable.MasterFields := 'Id_Cliente';
Dm.TrabajoDataSource.DataSet := Dm.Trabajo2Query;
Dm.TemporalTable.Active := true;
//--- Creando y presentando el Reporte ---//
if self.Excel.Checked then
begin
self.GenerarExcelClasico;
end
else begin
if self.Clasico.Checked then begin
MiRepo := TKardexClasicoReport.Create(self);
MiRepo.PreviewModal;
MiRepo.Free;
end;
if self.Saldos.Checked then begin
MiRepoSaldo := TKardexSaldosReport.Create(self);
MiRepoSaldo.PreviewModal;
MiRepoSaldo.Free;
end;
end;
Dm.TempDetTable.Close;
Dm.TempDetTable.DeleteTable;
Dm.TempCabTable.Close;
Dm.TempCabTable.DeleteTable;
Dm.TemporalTable.Close;
Dm.TemporalTable.DeleteTable;
Dm.TrabajoQuery.Close;
Dm.TrabajoQuery.SQL.Clear;
Dm.Trabajo2Query.Close;
Dm.Trabajo2Query.SQL.Clear;

---- Procedimiento de creacion de Temporales ---
procedure TKardexHiloConsultaForm.CreandoTemporal;
var lencontro:boolean;
MiTabla:String;
Numero:integer;
begin
//---- Creando una tabla temporal para el detalle de LOS ROLLOS ----///
Dm.TempDetTable.Close;
Dm.TempDetTable.TableType := ttParadox;
Numero := 1;
MiTabla := '_TEMP_';
lencontro := false;
while lencontro=false do begin
Dm.TempDetTable.TableName := MiTabla+Trim(IntToStr(Numero));
if Dm.TempDetTable.Exists then Numero := Numero + 1
else lencontro := true;
end;
with Dm.TempDetTable.FieldDefs do
begin
Clear;
Add('Id_Temp', ftInteger, 0, True);
Add('Id_Kardex', ftInteger, 0, True);
Add('ProductoLote', ftString, 30, True);
Add('Id_Producto', ftInteger, 0, FALSE);
Add('Id_Cliente', ftInteger, 0, FALSE);
Add('Fecha', ftDate, 0, FALSE);
Add('TipoMovimiento', ftBoolean, 0, FALSE);
Add('Lote', ftString, 80, FALSE);
Add('Observaciones', ftString, 150, FALSE);
Add('OrdenCompra', ftString, 30, FALSE);
Add('PesoNeto', ftFloat, 0, FALSE);
Add('Saldo', ftFloat, 0, FALSE);
Add('Id_Proveedor', ftInteger, 0, FALSE);
Add('Id_Parametro_tc', ftInteger, 0, FALSE);
Add('Serie', ftString, 5, FALSE);
Add('Numero', ftString, 10, FALSE);
end;
Dm.TempDetTable.Exclusive := true;
Dm.TempDetTable.IndexDefs.Clear;
with Dm.TempDetTable.IndexDefs.AddIndexDef do begin
Name := '';
Fields := 'Id_Temp';
Options := [ixPrimary];
end;
with Dm.TempDetTable.IndexDefs.AddIndexDef do begin
Name := 'ProductoLote';
Fields := 'ProductoLote';
end;
Dm.TempDetTable.CreateTable;
Dm.TempDetTable.Active := true;
Dm.TempDetTable.FieldDefs.Update;
//---- Creando una tabla temporal para LAS ORDENES DE PRODUCCION ----///
Dm.TempCabTable.Close;
Dm.TempCabTable.TableType := ttParadox;
Numero := 1;
MiTabla := '_TEMP_';
lencontro := false;
while lencontro=false do begin
Dm.TempCabTable.TableName := MiTabla+Trim(IntToStr(Numero));
if Dm.TempCabTable.Exists then Numero := Numero + 1
else lencontro := true;
end;
with Dm.TempCabTable.FieldDefs do
begin
Clear;
Add('Id_Temp', ftInteger, 0, True);
Add('ProductoLote', ftString, 30, true);
Add('Id_Cliente', ftInteger, 0, FALSE);
Add('Id_Producto', ftInteger, 0, FALSE);
Add('Lote', ftString, 80, FALSE);
Add('Saldo', ftFloat, 0, FALSE);
end;
Dm.TempCabTable.Exclusive := true;
Dm.TempCabTable.IndexDefs.Clear;
with Dm.TempCabTable.IndexDefs.AddIndexDef do begin
Name := '';
Fields := 'Id_Temp';
Options := [ixPrimary];
end;
with Dm.TempCabTable.IndexDefs.AddIndexDef do begin
Name := 'Id_Producto';
Fields := 'Id_Producto';
end;
Dm.TempCabTable.CreateTable;
Dm.TempCabTable.Active := true;
Dm.TempCabTable.FieldDefs.Update;
Dm.TempCabTable.IndexDefs.Update;
//---- Creando una tabla temporal para la CABECERA ----///
Dm.TemporalTable.Close;
Dm.TemporalTable.TableType := ttParadox;
Numero := 1;
MiTabla := '_TEMP_';
lencontro := false;
while lencontro=false do begin
Dm.TemporalTable.TableName := MiTabla+Trim(IntToStr(Numero));
if Dm.TemporalTable.Exists then Numero := Numero + 1
else lencontro := true;
end;
with Dm.TemporalTable.FieldDefs do
begin
Clear;
Add('Id_Temp', ftInteger, 0, True);
Add('Id_Cliente', ftInteger, 0, True);
Add('Id_Producto', ftInteger, 0, FALSE);
end;
Dm.TemporalTable.Exclusive := true;
Dm.TemporalTable.IndexDefs.Clear;
with Dm.TemporalTable.IndexDefs.AddIndexDef do begin
Name := '';
Fields := 'Id_Temp';
Options := [ixPrimary];
end;
with Dm.TemporalTable.IndexDefs.AddIndexDef do begin
Name := 'Id_Cliente';
Fields := 'Id_Cliente';
end;
Dm.TemporalTable.CreateTable;
Dm.TemporalTable.Active := true;
Dm.TemporalTable.FieldDefs.Update;
Dm.TemporalTable.IndexDefs.Update;
end;

ContraVeneno
23-01-2006, 23:39:48
¿Un poco?:mad:
Si pones así tu código, dudo que alguien te ayude...

Sería mejor que pusieras solo la parte donde haces la consulta. Es decir, la sentencia SQL que utilizas y como la utilizas, creo que con eso sería suficiente.

Sin ofender, pero yo nisiquiera me moleste en leerlo.

vtdeleon
24-01-2006, 00:29:40
Saludos
Si pones así tu código, dudo que alguien te ayude...
Dificilmente. No me atrevo a leerlo, no

javicho_villa
24-01-2006, 02:09:21
Basicamente asi lleno una tabla
-------------------------------------------------------
Dm.TrabajoQuery.Close;
Dm.TrabajoQuery.SQL.Clear;
Dm.TrabajoQuery.SQL.Add(Sentencia+Filtro+Orden);
Dm.TrabajoQuery.Active := true;
if Dm.TrabajoQuery.RecordCount > 0 then begin
self.CreandoTemporal;
Dm.TrabajoQuery.First;
id := 1;
while not Dm.TrabajoQuery.Eof do begin
Dm.TempDetTable.Append;
Dm.TempDetTable.FieldValues['Id_Temp'] := Id;
Dm.TempDetTable.FieldValues['Id_Kardex'] := Dm.TrabajoQuery.FieldByName('Id_Kardex').AsInteger;
Dm.TempDetTable.FieldValues['Id_Producto'] := Dm.TrabajoQuery.FieldByName('Id_Producto').AsInteger;
Dm.TempDetTable.FieldValues['Id_Cliente'] := Dm.TrabajoQuery.FieldByName('Id_Cliente').AsInteger;
Dm.TempDetTable.FieldValues['Fecha'] := Dm.TrabajoQuery.FieldByName('Fecha').AsDateTime;
Dm.TempDetTable.FieldValues['TipoMovimiento'] := Dm.TrabajoQuery.FieldByName('TipoMovimiento').AsBoolean;
Dm.TempDetTable.FieldValues['Lote'] := Dm.TrabajoQuery.FieldByName('Lote').AsString;
Dm.TempDetTable.FieldValues['Observaciones'] := Dm.TrabajoQuery.FieldByName('Observaciones').AsString;
Dm.TempDetTable.FieldValues['OrdenCompra'] := Dm.TrabajoQuery.FieldByName('OrdenCompra').AsString;
Dm.TempDetTable.FieldValues['ProductoLote'] := Dm.TrabajoQuery.FieldByName('Id_Producto').AsString+Dm.TrabajoQuery.FieldByName('Lote').AsString;
Dm.TempDetTable.FieldValues['PesoNeto'] := Dm.TrabajoQuery.FieldByName('PesoNeto').AsFloat;
Dm.TempDetTable.FieldValues['Id_Proveedor'] := Dm.TrabajoQuery.FieldByName('Id_Proveedor').AsInteger;
Dm.TempDetTable.FieldValues['Serie'] := Dm.TrabajoQuery.FieldByName('Serie').AsString;
Dm.TempDetTable.FieldValues['Numero'] := Dm.TrabajoQuery.FieldByName('Numero').AsString;
Dm.TempDetTable.FieldValues['Id_Parametro_tc'] := Dm.TrabajoQuery.FieldByName('Id_Parametro_tc').AsInteger;
Dm.TempDetTable.Post;
id := id + 1;
Dm.TrabajoQuery.Next;
end;
---- Y Asi la creo --------------
Dm.TempCabTable.Close;
Dm.TempCabTable.TableType := ttParadox;
Numero := 1;
MiTabla := '_TEMP_';
lencontro := false;
while lencontro=false do begin
Dm.TempCabTable.TableName := MiTabla+Trim(IntToStr(Numero));
if Dm.TempCabTable.Exists then Numero := Numero + 1
else lencontro := true;
end;
with Dm.TempCabTable.FieldDefs do
begin
Clear;
Add('Id_Temp', ftInteger, 0, True);
Add('ProductoLote', ftString, 30, true);
Add('Id_Cliente', ftInteger, 0, FALSE);
Add('Id_Producto', ftInteger, 0, FALSE);
Add('Lote', ftString, 80, FALSE);
Add('Saldo', ftFloat, 0, FALSE);
end;
Dm.TempCabTable.Exclusive := true;
Dm.TempCabTable.IndexDefs.Clear;
with Dm.TempCabTable.IndexDefs.AddIndexDef do begin
Name := '';
Fields := 'Id_Temp';
Options := [ixPrimary];
end;
with Dm.TempCabTable.IndexDefs.AddIndexDef do begin
Name := 'Id_Producto';
Fields := 'Id_Producto';
end;
----------------------------------------
El problema es cuando quiero consultarlo por segunda vez, no me sale nada y tengo que salir del sistema para poder visualizarlo

Gracias y mil disculpas por el monton de codigo, estoy tan sumergido en el programa que se me paso.

Javier Villa