{ =============================================================================== Copyright (©) 2001. Rodax Software. =============================================================================== Los contenidos de este fichero son propiedad de Rodax Software titular del copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado, en su totalidad o en parte, con el permiso escrito de Rodax Software, o de acuerdo con los términos y condiciones establecidas en el acuerdo/contrato bajo el que se suministra. ----------------------------------------------------------------------------- Web: www.rodax-software.com =============================================================================== Fecha primera versión: 11-08-2002 Versión actual: 1.0.3 Fecha versión actual: 12-10-2004 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- 16-11-2002 p250. Poner el número total de artículos dados de alta en la inicialización del grid. 14-04-2004 p272. Adaptación a multiempresa. 12-10-2004 p290. Precio de coste de obra =============================================================================== } unit TablaArticulosObraHistorica; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, DBTables, DB, IBCustomDataSet, IBSQL, BaseDatos, IBDatabase, IBStoredProc, Mensajes, IB, dxDBGrid, dxDBCtrl, dbgrids, Tipos, //TablaArticulos es usada por el Tipo TDatosArticulo, TDatosAlmacen, TDatosMovimiento TablaArticulos, TablaAlmacenes, TablaMovimientos; type TDatosObraCerrada = class(TPersistent) public CodigoEmpresa : Integer; Codigo : Integer; FechaCierre : String; Nombre : String; Calle : String; Numero : String; Piso : String; CodigoPostal : String; Poblacion : String; Provincia : String; Telefono : String; PersonaContacto : String; end; TDatosMaterial = class(TPersistent) public CodigoObra : Integer; FechaCierre : String; CodigoArticulo : String; Familia : String; Descripcion : String; Unidadesmedida : String; Existencias : String; Observaciones : String; end; TdmTablaArticulosObraHistorica = class(TDataModule) private procedure IniciarSQL; function existeArticuloEnAlmacen(CodigoEmpresa: Integer; CodigoArticulo: String): Boolean; public sqlConsultar : TStrings; sqlEliminar : TStrings; sqlGrid : TStrings; sqlGridObrasCerradas : TStrings; constructor Create (AOwner : TComponent); override; destructor Destroy; override; function ValidarCodigo(Codigo : String) : Boolean; function FormatearCodigo(var Codigo : String) : String; function ExisteArticulo(CodigoEmpresa: Integer; Material : TDatosMaterial) : Boolean; function DarDatosObraCerrada(CodigoEmpresa: Integer; Codigo: Variant) : TDatosObraCerrada; overload; function DarDatosMaterial(CodigoEmpresa: Integer; var Datos: TDatosMaterial): Boolean; function ArticuloAlmacenTieneExistencias(CodigoEmpresa, CodigoAlmacen: Integer; CodigoArticulo: String): Boolean; function ExisteArticuloAlmacen(CodigoEmpresa, CodigoAlmacen: Integer; CodigoArticulo: String): Boolean; function DarDatosArticuloAlmacen(CodigoEmpresa: Integer; var Datos: TDatosArticulo): Boolean; function DarListaArticulos(Grid : TdxDBGrid; Tabla: TPTabla) : TStringList; function InsertarObraHistorica(CodigoEmpresa, CodigoAlmacen:Integer; Fecha: String): Boolean; function InsertarPresupuestosObraHistorica(CodigoEmpresa, CodigoAlmacen: Integer; Fecha: String): Boolean; function EliminarPresupuestosObra(CodigoEmpresa, CodigoAlmacen: Integer): Boolean; function InsertarArticulosObraHistorica(CodigoEmpresa, CodigoAlmacen: Integer; Fecha: String): Boolean; procedure InicializarTablaArticulosObraHistorica(Tabla : TPTabla); procedure InicializarGridArticulosObraHistorica(var Grid: TdxDBGrid); procedure InicializarGridObrasCerradas(var Grid: TdxDBGrid); function DarObras(CodigoEmpresa: Integer): TStringList; function DarArticuloMin(CodigoEmpresa: Integer; CodigoObra: Integer; FechaCierre: String): String; function DarArticuloMax(CodigoEmpresa: Integer; CodigoObra: Integer; FechaCierre: String): String; end; var dmTablaArticulosObraHistorica: TdmTablaArticulosObraHistorica; implementation {$R *.DFM} uses Excepciones, IBErrorCodes, RdxEmpresaActiva, Literales, DateFunc, StrFunc, Constantes; { TdmTablaArticulosObraHistorica } constructor TdmTablaArticulosObraHistorica.Create (AOwner : TComponent); begin inherited; sqlConsultar := TStringList.Create; sqlEliminar := TStringList.Create; sqlGrid := TStringList.Create; sqlGridObrasCerradas := TStringList.Create; IniciarSQL; end; destructor TdmTablaArticulosObraHistorica.Destroy; begin sqlConsultar.Free; sqlEliminar.Free; sqlGrid.Free; sqlGridObrasCerradas.Free; inherited; end; procedure TdmTablaArticulosObraHistorica.IniciarSQL; begin with sqlConsultar do begin Add('select CODIGO, NOMBRE, OBRASHISTORICAS.FECHACIERRE, CODIGOARTICULO, '); Add('FAMILIA, DESCRIPCION, UNIDADESMEDIDA, OBSERVACIONES, EXISTENCIAS '); Add('from OBRASHISTORICAS, ESTADOOBRASHISTORICAS '); Add('where (OBRASHISTORICAS.CODIGO = :CODIGOOBRA) and '); Add('(OBRASHISTORICAS.FECHACIERRE = :FECHACIERRE) and '); Add('(OBRASHISTORICAS.CODIGOEMPRESA = :CODIGOEMPRESA) and '); Add('(ESTADOOBRASHISTORICAS.CODIGOOBRA = OBRASHISTORICAS.CODIGO) and '); Add('(ESTADOOBRASHISTORICAS.CODIGOEMPRESA = OBRASHISTORICAS.CODIGOEMPRESA) and '); Add('(ESTADOOBRASHISTORICAS.FECHACIERRE = OBRASHISTORICAS.FECHACIERRE) and '); Add('(ESTADOOBRASHISTORICAS.CODIGOARTICULO = :CODIGOARTICULO) '); end; with sqlEliminar do begin Add('delete from ESTADOOBRASHISTORICAS '); Add('where (CODIGOOBRA = :CODIGOOBRA) '); Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); Add('and (FECHACIERRE = :FECHACIERRE) '); Add('and (CODIGOARTICULO = :CODIGOARTICULO) '); end; with sqlGrid do begin Add('select CODIGOOBRA, FECHACIERRE, CODIGOARTICULO, FAMILIA, DESCRIPCION, '); Add('UNIDADESMEDIDA, EXISTENCIAS, (PRECIORECEPCION * EXISTENCIAS) as TOTAL '); Add('from ESTADOOBRASHISTORICAS '); Add('where (CODIGOOBRA = :CODIGOOBRA) '); Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); Add('and (FECHACIERRE = :FECHACIERRE) '); Add('order by DESCRIPCION'); end; with sqlGridObrasCerradas do begin Add('select CODIGOEMPRESA, CODIGO as "ALMACENES.CODIGO", FECHACIERRE, NOMBRE as "ALMACENES.NOMBRE",'); Add('TELEFONO, PERSONACONTACTO '); Add('from OBRASHISTORICAS '); Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) '); Add('order by NOMBRE'); end; end; { Tanto ExisteArticulosAlmacen como DarDatosArticuloAlmacen esta bien que tengan su propia transaccion ya que se hace una consulta en un momento determinado, sin dependencia de otras operaciones} function TdmTablaArticulosObraHistorica.existeArticuloAlmacen(CodigoEmpresa, CodigoAlmacen: Integer; CodigoArticulo: String): Boolean; {Comprueba si existe un articulo en un determinado almacen, pasandole por parametro el codigo de articulo y el del almacen, devuelve true o false dependiendo si existe o no} var oSQL : TIBSQL; Codigo : String; begin Result := False; if (Length(Trim(CodigoArticulo)) = 0) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select CODIGOARTICULO '); SQL.Add('from ESTADOALMACEN '); SQL.Add('where (CODIGOALMACEN = :CODIGOALMACEN) '); SQL.Add('and (CODIGOARTICULO = :CODIGOARTICULO) '); SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGOALMACEN').AsInteger := CodigoAlmacen; ParamByName('CODIGOARTICULO').AsString := CodigoArticulo; try Prepare; ExecQuery; Codigo := FieldByName('CODIGOARTICULO').AsString; Result := (CodigoArticulo = Codigo); finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaArticulosObraHistorica.existeArticuloEnAlmacen(CodigoEmpresa: Integer; CodigoArticulo: String): Boolean; {Comprueba si existe un articulo en un determinado almacen, pasandole por parametro el codigo de articulo y el del almacen, devuelve true o false dependiendo si existe o no} var oSQL : TIBSQL; Codigo : String; begin Result := True; if (Length(Trim(CodigoArticulo)) = 0) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select CODIGOARTICULO '); SQL.Add('from ESTADOALMACEN '); SQL.Add('where (CODIGOARTICULO = :CODIGOARTICULO) '); SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGOARTICULO').AsString := CodigoArticulo; try Prepare; ExecQuery; if (RecordCount = 0) then Result := False; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaArticulosObraHistorica.DarDatosArticuloAlmacen(CodigoEmpresa: Integer; var Datos: TDatosArticulo): Boolean; {Devuelve los datos del articulo pasado por parametro si este existe en el almacen correspondiente, en caso de no existir devuelve false y rellena dichos datos con 0,0 y 1000 respectibamente} var oSQL : TIBSQL; begin Result := False; if (length(Datos.CodigoAlmacen)= 0) then begin //Para que cuando un articulo libre que no encuentra las existencias en //el almacen esten a cero Datos.Existencias := '0'; Exit; end; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select * '); SQL.Add('from ESTADOALMACEN '); SQL.Add('where (CODIGOALMACEN = :CODIGOALMACEN) '); SQL.Add('and (CODIGOARTICULO = :CODIGOARTICULO) '); SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGOALMACEN').AsString := Datos.CodigoAlmacen; ParamByName('CODIGOARTICULO').AsString := Datos.Codigo; try Prepare; ExecQuery; if (RecordCount > 0) then begin Datos.Existencias := FieldByName('EXISTENCIAS').AsString; Datos.StockMin := FieldByName('STOCKMIN').AsString; Datos.StockMax := FieldByName('STOCKMAX').AsString; Result := True; end else begin Datos.Existencias := '0'; Datos.StockMin := '0'; Datos.StockMax := '1000'; end; finally Close; Transaction := NIL; Free; end; end; end; procedure TdmTablaArticulosObraHistorica.InicializarGridArticulosObraHistorica(var Grid: TdxDBGrid); var Columna : TdxDBTreeListColumn; begin with Grid do begin DestroyColumns; ShowSummaryFooter := True; {Columna CODIGOOBRA} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'CODIGOOBRA'; Columna.Visible := false; {Columna CODIGOFECHACIERRE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'FECHACIERRE'; Columna.Visible := false; {Columna CODIGOARTICULO} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'CODIGOARTICULO'; Columna.Caption := 'Código'; Columna.Width := tamColCodigo2; Columna.SummaryFooterType := cstCount; Columna.SummaryFooterFormat := 'Total: 0 artículos'; {Columna FAMILIA} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'FAMILIA'; Columna.Caption := 'Familia'; Columna.Width := tamColFamilias2; Columna.Visible := False; {Columna DESCRIPCION} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'DESCRIPCION'; Columna.Caption := 'Descripción'; Columna.Width := tamColDescripcion4; {Columna UNIDADESMEDIDA} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'UNIDADESMEDIDA'; Columna.Caption := 'Unidades de medida'; Columna.Width := tamColUnidadesMedida2; {Columna EXISTENCIAS} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'EXISTENCIAS'; Columna.Caption := 'Existencias'; Columna.Width := tamColExistencias2; {Columna TOTAL} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'TOTAL'; Columna.Caption := 'Coste total'; Columna.Width := tamColPrecio3; Columna.SummaryFooterType := cstSum; Columna.SummaryFooterFormat := 'Total: 0.00 €'; {Columna PENDIENTESRECIBIR} { Columna := Add; Columna.Visible := True; Columna.FieldName := ''; Columna.Title.Caption := 'U. pendientes recibir';} end; end; function TdmTablaArticulosObraHistorica.ArticuloAlmacenTieneExistencias(CodigoEmpresa, CodigoAlmacen: Integer; CodigoArticulo: String): Boolean; var oSQL : TIBSQL; begin Result := True; if (length(CodigoArticulo)= 0) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select EXISTENCIAS '); SQL.Add('from ESTADOALMACEN '); SQL.Add('where (CODIGOALMACEN = :CODIGOALMACEN) '); SQL.Add('and (CODIGOARTICULO = :CODIGOARTICULO) '); SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGOALMACEN').AsInteger := CodigoAlmacen; ParamByName('CODIGOARTICULO').AsString := CodigoArticulo; try Prepare; ExecQuery; if (RecordCount > 0) and (FieldByName('EXISTENCIAS').AsString = '0') then Result := False; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaArticulosObraHistorica.DarListaArticulos(Grid : TdxDBGrid; Tabla: TPTabla): TStringList; var i: integer; ListaArticulos : TStringList; begin ListaArticulos := Nil; if Grid.SelectedCount = 0 then begin Result := ListaArticulos; exit end; ListaArticulos := TStringList.Create; Tabla^.DisableControls; for i:=0 to Grid.SelectedCount-1 do begin Tabla^.GotoBookmark(Pointer(Grid.SelectedRows[i])); ListaArticulos.Add(Tabla^.FieldByName('CODIGOARTICULO').AsString); end; Tabla^.EnableControls; Result := ListaArticulos; end; function TdmTablaArticulosObraHistorica.DarObras(CodigoEmpresa: Integer) : TStringList; var oSQL : TIBSQL; lcfCodigo : TTipoCodigoFecha; lsCadena : String; ListaAlmacenesCodigo : TStringList; begin ListaAlmacenesCodigo := TStringList.Create; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select CODIGO, FECHACIERRE, NOMBRE from OBRASHISTORICAS'); SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) '); SQL.Add('order by NOMBRE'); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; try Prepare; ExecQuery; while not EOF do begin lcfCodigo := TTipoCodigoFecha.Create; lcfCodigo.Codigo := FieldByName('CODIGO').AsInteger; lcfCodigo.Fecha := FieldByName('FECHACIERRE').AsString; lcfCodigo.Nombre := FieldByName('NOMBRE').AsString; lsCadena := lcfCodigo.Nombre + ' ' + lcfCodigo.Fecha; ListaAlmacenesCodigo.AddObject(lsCadena, lcfCodigo); Next; end; finally Close; Transaction := NIL; Free; Result := ListaAlmacenesCodigo; end; end; end; function TdmTablaArticulosObraHistorica.InsertarObraHistorica(CodigoEmpresa, CodigoAlmacen: Integer; Fecha: String): Boolean; var oSQL : TIBSQL; DatosAlmacen : TDatosAlmacen; begin Result := False; DatosAlmacen := TDatosAlmacen.Create; DatosAlmacen.CodigoEmpresa := EmpresaActiva.Codigo; DatosAlmacen.Codigo := CodigoAlmacen; if (dmTablaAlmacenes.DarDatosAlmacen(DatosAlmacen)) then begin oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('insert into OBRASHISTORICAS (CODIGOEMPRESA, CODIGO, FECHACIERRE, NOMBRE, CALLE, '); SQL.Add('NUMERO, PISO, CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO, PERSONACONTACTO) '); SQL.Add('values '); SQL.Add('(:CODIGOEMPRESA, :CODIGO, '); SQL.Add(':FECHACIERRE, '); SQL.Add(':NOMBRE, '); SQL.Add(':CALLE, '); SQL.Add(':NUMERO, '); SQL.Add(':PISO, '); SQL.Add(':CODIGOPOSTAL, '); SQL.Add(':POBLACION, '); SQL.Add(':PROVINCIA, '); SQL.Add(':TELEFONO, '); SQL.Add(':PERSONACONTACTO)'); try ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGO').AsInteger := DatosAlmacen.Codigo; ParamByName('FECHACIERRE').AsString := Fecha; ParamByName('NOMBRE').AsString := DatosAlmacen.Nombre; ParamByName('CALLE').AsString := DatosAlmacen.Calle; ParamByName('NUMERO').AsString := DatosAlmacen.Numero; ParamByName('PISO').AsString := DatosAlmacen.Piso; ParamByName('CODIGOPOSTAL').AsString := DatosAlmacen.CodigoPostal; ParamByName('POBLACION').AsString := DatosAlmacen.Poblacion; ParamByName('PROVINCIA').AsString := DatosAlmacen.Provincia; ParamByName('TELEFONO').AsString := DatosAlmacen.Telefono; ParamByName('PERSONACONTACTO').AsString := DatosAlmacen.PersonaContacto; Prepare; ExecQuery; Close; Transaction := NIL; Free; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_foreign_key : begin VerMensaje(msgHisYaExisteObraHistorica); end; else begin TratarExcepcion(E); end; end; end; on E : Exception do begin TratarExcepcion(E); end; end; end; end; end; function TdmTablaArticulosObraHistorica.InsertarArticulosObraHistorica(CodigoEmpresa, CodigoAlmacen: Integer; Fecha: String): Boolean; var oSQL : TIBSQL; begin Result := False; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('insert into ESTADOOBRASHISTORICAS (CODIGOEMPRESA, CODIGOOBRA, FECHACIERRE, CODIGOARTICULO, '); SQL.Add('FAMILIA, DESCRIPCION, UNIDADESMEDIDA, EXISTENCIAS, OBSERVACIONES, FECHARECEPCION, PRECIORECEPCION) '); SQL.Add('select CODIGOEMPRESA, CODIGOALMACEN, '); // No se permite parametrizar antes del where SQL.Add('''' + DarFormatoInterbaseFecha(Fecha) + ''''); SQL.Add(', CODIGOARTICULO, FAMILIA, DESCRIPCION, UNIDADESMEDIDA, EXISTENCIAS, OBSERVACIONES, FECHARECEPCION, PRECIORECEPCION '); SQL.Add('from ESTADOALMACEN, ARTICULOS '); SQL.Add('where (CODIGOALMACEN = :CODIGOALMACEN) '); SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); SQL.Add('and (CODIGO = CODIGOARTICULO)'); ParamByName('CODIGOALMACEN').AsInteger := CodigoAlmacen; ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; try Prepare; ExecQuery; Close; Transaction := NIL; Free; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_foreign_key : begin VerMensaje(msgHisYaExisteObraHistorica); end; else begin TratarExcepcion(E); end; end; end; on E : Exception do begin TratarExcepcion(E); end; end; end; end; function TdmTablaArticulosObraHistorica.DarDatosMaterial(CodigoEmpresa: Integer; var Datos: TDatosMaterial): Boolean; var oSQL : TIBSQL; begin Result := False; if EsCadenaVacia(Datos.FechaCierre) and EsCadenaVacia(Datos.CodigoArticulo) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select * from ESTADOOBRASHISTORICAS '); SQL.Add('where (CODIGOOBRA = :CODIGOOBRA) '); SQL.Add('and (CODIGOEMPRESA = :CODIGOEMPRESA) '); SQL.Add('and (FECHACIERRE = :FECHACIERRE) '); SQL.Add('and (CODIGOARTICULO = :CODIGOARTICULO)'); ParamByName('CODIGOOBRA').AsInteger := Datos.CodigoObra; ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('FECHACIERRE').AsString := Datos.FechaCierre; ParamByName('CODIGOARTICULO').AsString := Datos.CodigoArticulo; try Prepare; ExecQuery; if (RecordCount > 0) then begin with Datos do begin Familia := FieldByName('FAMILIA').AsString; Descripcion := FieldByName('DESCRIPCION').AsString; Unidadesmedida := FieldByName('UNIDADESMEDIDA').AsString; Unidadesmedida := FieldByName('EXISTENCIAS').AsString; Observaciones := FieldByName('OBSERVACIONES').AsString; Result := True; end; end; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaArticulosObraHistorica.ValidarCodigo(Codigo: String): Boolean; begin Result := EsNumerico(Codigo); end; function TdmTablaArticulosObraHistorica.FormatearCodigo(var Codigo: String): String; begin Codigo := StrPadLeft(Codigo, 10, '0'); Result := Codigo; end; function TdmTablaArticulosObraHistorica.ExisteArticulo(CodigoEmpresa: Integer; Material: TDatosMaterial): Boolean; var oSQL : TIBSQL; Codigo : String; begin Result := False; if EsCadenaVacia(Material.CodigoObra) and EsCadenaVacia(Material.FechaCierre) and EsCadenaVacia(Material.CodigoArticulo) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select CODIGOARTICULO '); SQL.Add('from ESTADOOBRASHISTORICAS '); SQL.Add('where CODIGOOBRA = :CODIGOOBRA '); SQL.Add('and FECHACIERRE = :FECHACIERRE '); SQL.Add('and CODIGOARTICULO = :CODIGOARTICULO '); SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA '); try ParamByName('CODIGOOBRA').AsInteger := Material.CodigoObra; ParamByName('FECHACIERRE').AsString := Material.FechaCierre; ParamByName('CODIGOARTICULO').AsString := Material.CodigoArticulo; ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; Prepare; ExecQuery; Codigo := FieldByName('CODIGOARTICULO').AsString; Result := (Material.CodigoArticulo = Codigo); finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaArticulosObraHistorica.DarArticuloMax(CodigoEmpresa: Integer; CodigoObra: Integer; FechaCierre: String): String; var oSQL : TIBSQL; begin Result := ''; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select max(DESCRIPCION) from ESTADOOBRASHISTORICAS '); SQL.Add('where CODIGOOBRA = :CODIGOOBRA '); SQL.Add('and FECHACIERRE = :FECHACIERRE '); SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA '); try ParamByName('CODIGOOBRA').AsInteger := CodigoObra; ParamByName('FECHACIERRE').AsString := FechaCierre; ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; Prepare; ExecQuery; Result := Fields[0].AsString; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaArticulosObraHistorica.DarArticuloMin(CodigoEmpresa: Integer; CodigoObra: Integer; FechaCierre: String): String; var oSQL : TIBSQL; begin Result := ''; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select min(DESCRIPCION) from ESTADOOBRASHISTORICAS '); SQL.Add('where CODIGOOBRA = :CODIGOOBRA '); SQL.Add('and FECHACIERRE = :FECHACIERRE '); SQL.Add('and CODIGOEMPRESA = :CODIGOEMPRESA '); try ParamByName('CODIGOOBRA').AsInteger := CodigoObra; ParamByName('FECHACIERRE').AsString := FechaCierre; ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; Prepare; ExecQuery; Result := Fields[0].AsString; finally Close; Transaction := NIL; Free; end; end; end; procedure TdmTablaArticulosObraHistorica.InicializarTablaArticulosObraHistorica( Tabla: TPTabla); begin with Tabla^.Fields do begin with (FieldByName('TOTAL') as TFloatField) do begin DisplayFormat := DISPLAY_EUROS2; EditFormat := EDIT_EUROS2; end; end; end; function TdmTablaArticulosObraHistorica.InsertarPresupuestosObraHistorica( CodigoEmpresa, CodigoAlmacen: Integer; Fecha: String): Boolean; var oSQL : TIBSQL; begin Result := False; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('insert into OBRASHISTORICASPRESUPUESTOS (CODIGOEMPRESA, CODIGOALMACEN, FECHACIERRE, CODIGOPRESUPUESTO) '); SQL.Add('select CODIGOEMPRESA, CODIGOALMACEN, '); // No se permite parametrizar antes del where SQL.Add('''' + DarFormatoInterbaseFecha(Fecha) + ''''); SQL.Add(', CODIGOPRESUPUESTO '); SQL.Add('from OBRASPRESUPUESTOS '); SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA) '); SQL.Add('and (CODIGOALMACEN = :CODIGOALMACEN) '); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGOALMACEN').AsInteger := CodigoAlmacen; try Prepare; ExecQuery; Close; Transaction := NIL; Free; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_foreign_key : begin VerMensaje(msgHisYaExisteObraHistorica); end; else begin TratarExcepcion(E); end; end; end; on E : Exception do begin TratarExcepcion(E); end; end; end; end; function TdmTablaArticulosObraHistorica.EliminarPresupuestosObra( CodigoEmpresa, CodigoAlmacen: Integer): Boolean; var oSQL : TIBSQL; begin Result := False; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('delete from OBRASPRESUPUESTOS '); SQL.Add('where (CODIGOEMPRESA = :CODIGOEMPRESA)'); SQL.Add('and (CODIGOALMACEN = :CODIGOALMACEN) '); ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; ParamByName('CODIGOALMACEN').AsInteger := CodigoAlmacen; try Prepare; ExecQuery; Close; Transaction := NIL; Free; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_foreign_key : begin VerMensaje(msgHisYaExisteObraHistorica); end; else begin TratarExcepcion(E); end; end; end; on E : Exception do begin TratarExcepcion(E); end; end; end; end; function TdmTablaArticulosObraHistorica.DarDatosObraCerrada( CodigoEmpresa: Integer; Codigo: Variant): TDatosObraCerrada; var oSQL : TIBSQL; lDatos : TDatosObraCerrada; begin Result := Nil; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select * '); SQL.Add('from OBRASHISTORICAS '); SQL.Add('where (CODIGO = :CODIGO) and (CODIGOEMPRESA = :CODIGOEMPRESA) '); ParamByName('CODIGO').AsInteger := Codigo; ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa; try Prepare; ExecQuery; if (RecordCount > 0) then begin lDatos := TDatosObraCerrada.Create; lDatos.CodigoEmpresa := FieldByName('CODIGOEMPRESA').AsInteger; lDatos.Codigo := FieldByName('CODIGO').AsInteger; lDatos.FechaCierre := FieldByName('FECHACIERRE').AsString; lDatos.Nombre := FieldByName('NOMBRE').AsString; lDatos.Calle := FieldByName('CALLE').AsString; lDatos.Numero := FieldByName('NUMERO').AsString; lDatos.Piso := FieldByName('PISO').AsString; lDatos.CodigoPostal := FieldByName('CODIGOPOSTAL').AsString; lDatos.Poblacion := FieldByName('POBLACION').AsString; lDatos.Provincia := FieldByName('PROVINCIA').AsString; lDatos.Telefono := FieldByName('TELEFONO').AsString; lDatos.PersonaContacto := FieldByName('PERSONACONTACTO').AsString; Result := lDatos; end; finally Close; Transaction := NIL; Free; end; end; end; procedure TdmTablaArticulosObraHistorica.InicializarGridObrasCerradas( var Grid: TdxDBGrid); var Columna : TdxDBTreeListColumn; begin with Grid do begin DestroyColumns; ShowSummaryFooter := False; Grid.ColumnByFieldName('ALMACENES.PERSONACONTACTO').Visible := False; Grid.ColumnByFieldName('CLIENTES.NOMBRE').Visible := False; {Columna CODIGOEMPRESA} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'CODIGOEMPRESA'; Columna.Visible := False; {Columna CODIGOFECHACIERRE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'FECHACIERRE'; Columna.Visible := True; end; end; end.