Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en Consulta - solo salen datos la primera vez (https://www.clubdelphi.com/foros/showthread.php?t=29489)

javicho_villa 23-01-2006 21:12:57

Error en Consulta - solo salen datos la primera vez
 
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

Un Poco de codigo - Gracias por la atención
 
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
Código Delphi [-]
 
----------------------
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
Cita:

Empezado por ContraVeneno
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

Sorry por la cantidad
 
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


La franja horaria es GMT +2. Ahora son las 02:24:38.

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