Ver Mensaje Individual
  #3  
Antiguo 23-01-2006
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 105
Reputación: 20
javicho_villa Va por buen camino
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;
Responder Con Cita