This repository has been archived on 2024-12-02. You can view files and clone it, but cannot push or open issues or pull requests.
FactuGES/BaseDatos/BaseDatos.pas
2007-06-26 08:08:27 +00:00

786 lines
21 KiB
ObjectPascal

{
===============================================================================
Copyright (©) 2002. 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: 03-11-2002
Versión actual: 1.0.1
Fecha versión actual: 14-02-2003
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
14-02-2003 Se ha añadido la propiedad 'RutaBD'.
===============================================================================
}
unit BaseDatos;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB, IBDatabase, IBCustomDataSet, IBTable, IBSQLMonitor,
IBSQL, IB, IBServices, cxGridDBCardView, cxGrid, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, Variants, RdxEmpresaActiva,
Entidades, Contadores, RdxGestorContadores;
Const
////////////////////////////////////////////////////////////////////////////////
// COMUNES
////////////////////////////////////////////////////////////////////////////////
CBD_CODIGO = 'CODIGO';
tamColCodigo = 78;
CBD_FECHAALTA = 'FECHAALTA';
tamColFecha = 65;
CBD_USUARIO = 'USUARIO';
tamColUsuario = 200;
CBD_NIFCIF = 'NIFCIF';
tamColNIFCIF = 65;
CBD_NOMBRE ='NOMBRE';
tamColNombre = 200;
tamColNombreCorto = 140;
CBD_CALLE = 'CALLE';
tamColCalle = 200;
CBD_NUMERO = 'NUMERO';
tamColNumero = 35;
CBD_PISO = 'PISO';
tamColPiso = 35;
CBD_PROVINCIA = 'PROVINCIA';
tamColProvincia = 85;
CBD_POBLACION = 'POBLACION';
tamColPoblacion = 95;
CBD_CODIGOPOSTAL = 'CODIGOPOSTAL';
tamColCodigoPostal = 45;
CBD_TELEFONO1 = 'TELEFONO1';
CBD_TELEFONO2 = 'TELEFONO2';
CBD_MOVIL1 = 'MOVIL1';
CBD_MOVIL2 = 'MOVIL2';
CBD_FAX = 'FAX';
tamColTelefono = 60;
CBD_CORREO = 'CORREO';
tamColCorreo = 100;
CBD_WEB = 'WEB';
tamColWeb = 100;
CBD_PERSONACONTACTO = 'PERSONACONTACTO';
tamColPersonaContacto = 200;
CBD_OBSERVACIONES = 'OBSERVACIONES';
tamColObservaciones = 200;
CBD_SERIE = 'SERIE';
tamColSerie = 25;
CBD_FORMAPAGO = 'FORMAPAGO';
tamColFormaPago = 70;
////////////////////////////////////////////////////////////////////////////////
// ARTICULOS
////////////////////////////////////////////////////////////////////////////////
CBD_FAMILIA = 'FAMILIA';
tamColFamilia = 65;
tamColReferencia = 65;
////////////////////////////////////////////////////////////////////////////////
// PRESUPUESTOS
////////////////////////////////////////////////////////////////////////////////
tamColDocumentos = 85;
////////////////////////////////////////////////////////////////////////////////
// FACTURAS
////////////////////////////////////////////////////////////////////////////////
CBD_CANTIDAD = 'CANTIDAD';
tamColCantidad = 35;
CBD_DESCRIPCION = 'DESCRIPCION';
tamColDescripcion = 350;
CBD_IMPORTEUNIDAD = 'IMPORTEUNIDAD';
CBD_IMPORTETOTAL = 'IMPORTETOTAL';
tamColImporte = 65;
tamColImporteLargo = 80;
CBD_DESCUENTO = 'DESCUENTO';
tamColDescuento = 35;
tamColPorcentaje = 35;
CBD_SITUACION = 'SITUACION';
tamColSituacion = 65;
////////////////////////////////////////////////////////////////////////////////
// LIBROS
////////////////////////////////////////////////////////////////////////////////
tamColFechaEntrada = 60;
tamColTipoEntrada = 50;
tamColNumEntrada = 60;
type
TPTabla = ^TIBDataSet;
TdmBaseDatos = class(TDataModule)
private
FBD : TIBDatabase;
FTransaccionBD : TIBTransaction;
FNombreBD : string;
procedure IniciarTablasBackOffice;
procedure IniciarTablas;
function DarTransaccion: TIBTransaction;
function DarUsuario : string;
function GetRutaBD: String;
function GetNombreServidor: String;
function validarPrivilegios: Boolean;
public
procedure Commit;
procedure Rollback;
procedure Desconectar;
procedure Conectar (RutaBD : String; Usuario : String; Clave : String); overload;
procedure Conectar (RutaBD : String); overload;
procedure Conectar; overload;
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
function DarFecha : TDateTime;
function DarHora : TTime;
function DarAno : string;
function DarMes : string;
function DarSeriesFacturas : TStrings;
function DarValorConfiguracion (Codigo : String):String;
function DarSerieConfiguracion (VAR_CONFIG : String):String;
published
property BD : TIBDatabase read FBD;
property Transaccion : TIBTransaction read FTransaccionBD;
property Usuario : String read DarUsuario;
property NombreBD : String read FNombreBD write FNombreBD;
property RutaBD : String read GetRutaBD;
property NombreServidor : String read GetNombreServidor;
end;
procedure ActivarEdicionGridDetalles(var vGrid: TcxGrid); overload;
procedure ActivarEdicionGridDetalles(var vGrid: TcxGridDBTableView); overload;
procedure DesactivarEdicionGridDetalles(var vGrid: TcxGrid); overload;
procedure DesactivarEdicionGridDetalles(var Grid: TcxGridDBTableView); overload;
procedure IntercambiarPropiedades(Tabla: TPTabla; NumIni, NumFin : Integer);
procedure BorrarTabla(DataSet : TDataSet);
procedure FiltrarGrid(var vGrid: TcxGrid; TextoFiltro : String);
var
dmBaseDatos: TdmBaseDatos;
implementation
{$R *.DFM}
uses
RxMemDS, Mensajes, Literales, Excepciones, IBQuery, IBBlob, StrUtils, StrFunc,
cxFilter,
//Empresas
TablaEmpresas,
//Datos
TablaArticulos, TablaVendedores, TablaInstaladores, TablaFamilias, TablaPropiedades,
TablaFormasPago, TablaProvincias, TablaPoblaciones, TablaPropiedadesArticulo, TablaValores,
//Proveedores
TablaProveedores, TablaRepresentantesProveedor, TablaFacturasProveedor,
TablaPagosProveedor,
//Clientes
TablaClientes, TablaSucursalesCliente, TablaPresupuestos, TablaContratos,
TablaFacturasCliente, TablaPagosCliente, TablaFacturasProforma,
TablaObras, TablaObrasPedidos, TablaObrasInstaladores, TablaObrasGastos, TablaTareas,
TablaAlbaranesCliente,
//Libros
TablaLibros,
// Trimestres
TablaTrimestres,
// Configuracion
TablaDocumentos,
Configuracion, TablaAgenda, TablaCitas;
constructor TdmBaseDatos.Create(AOwner: TComponent);
begin
inherited;
FBD := TIBDatabase.Create(Self);
with FBD do
begin
SQLDialect := 3;
LoginPrompt := False;
TraceFlags := [tfQExecute, tfQFetch, tfStmt];
Params.Add('lc_ctype=ISO8859_1');
end;
FTransaccionBD := TIBTransaction.Create(Self);
with FTransaccionBD do
begin
DefaultAction := TARollbackRetaining;
DefaultDatabase := FBD;
Params.Add('read_committed');
Params.Add('rec_version');
Params.Add('nowait');
end;
FBD.DefaultTransaction := FTransaccionBD;
end;
destructor TdmBaseDatos.Destroy;
begin
FBD.Close;
FBD.DefaultTransaction := NIL;
FBD.Free;
FBD := NIL;
FTransaccionBD.Free;
FTransaccionBD := NIL;
inherited;
end;
procedure TdmBaseDatos.IniciarTablas;
begin
// Configuracion
Application.CreateForm(TdmTablaDocumentos, dmTablaDocumentos);
// Datos
Application.CreateForm(TdmTablaFamilias, dmTablaFamilias);
Application.CreateForm(TdmTablaPropiedades, dmTablaPropiedades);
Application.CreateForm(TdmTablaValores, dmTablaValores);
Application.CreateForm(TdmTablaPropiedadesArticulo, dmTablaPropiedadesArticulo);
Application.CreateForm(TdmTablaArticulos, dmTablaArticulos);
Application.CreateForm(TdmTablaFormasPago, dmTablaFormasPago);
Application.CreateForm(TdmTablaVendedores, dmTablaVendedores);
Application.CreateForm(TdmTablaInstaladores, dmTablaInstaladores);
// Proveedores
Application.CreateForm(TdmTablaProveedores, dmTablaProveedores);
Application.CreateForm(TdmTablaRepresentantesProveedor, dmTablaRepresentantesProveedor);
Application.CreateForm(TdmTablaFacturasProveedor, dmTablaFacturasProveedor);
Application.CreateForm(TdmTablaPagosProveedor, dmTablaPagosProveedor);
// Clientes
Application.CreateForm(TdmTablaClientes, dmTablaClientes);
Application.CreateForm(TdmTablaSucursalesCliente, dmTablaSucursalesCliente);
Application.CreateForm(TdmTablaPresupuestos, dmTablaPresupuestos);
Application.CreateForm(TdmTablaContratos, dmTablaContratos);
Application.CreateForm(TdmTablaFacturasCliente, dmTablaFacturasCliente);
Application.CreateForm(TdmTablaPagosCliente, dmTablaPagosCliente);
Application.CreateForm(TdmTablaFacturasProforma, dmTablaFacturasProforma);
Application.CreateForm(TdmTablaObras, dmTablaObras);
Application.CreateForm(TdmTablaObrasPedidos, dmTablaObrasPedidos);
Application.CreateForm(TdmTablaObrasInstaladores, dmTablaObrasInstaladores);
Application.CreateForm(TdmTablaObrasGastos, dmTablaObrasGastos);
Application.CreateForm(TdmTablaTareas, dmTablaTareas);
Application.CreateForm(TdmTablaAlbaranesCliente, dmTablaAlbaranesCliente);
// Agenda
Application.CreateForm(TdmTablaAgenda, dmTablaAgenda);
Application.CreateForm(TdmTablaCitas, dmTablaCitas);
end;
function TdmBaseDatos.DarTransaccion: TIBTransaction;
begin
Result := FTransaccionBD;
end;
function TdmBaseDatos.DarAno : string;
var
Ano, Mes, Dia : Word;
begin
DecodeDate(darFecha, ano, mes, dia);
Result := IntToStr(ano);
end;
function TdmBaseDatos.DarMes : string;
var
Ano, Mes, Dia : Word;
begin
DecodeDate(darFecha, ano, mes, dia);
Result := IntToStr(mes);
end;
function TdmBaseDatos.DarUsuario: string;
begin
Result := BD.Params.Values['user_name'];
end;
procedure ActivarEdicionGridDetalles(var vGrid: TcxGridDBTableView);
begin
if vGrid = NIL then
Exit;
with (vGrid as TcxCustomGridTableView) do
begin
OptionsBehavior.FocusCellOnTab := True;
OptionsBehavior.GoToNextCellOnEnter := True;
OptionsBehavior.ImmediateEditor := True;
OptionsBehavior.AlwaysShowEditor := False;
OptionsSelection.CellSelect := True;
OptionsSelection.InvertSelect := False;
OptionsSelection.HideFocusRect := False;
OptionsData.Appending := True;
OptionsData.Inserting := True;
OptionsData.Editing := True;
{ El borrado se debe controlar en cada pantalla para
que no salga el mensaje en inglés. }
OptionsData.Deleting := False;
OptionsData.DeletingConfirmation := False;
end
end;
procedure ActivarEdicionGridDetalles(var vGrid: TcxGrid);
begin
if vGrid = NIL then
Exit;
with (vGrid.ActiveView as TcxCustomGridTableView) do
begin
OptionsBehavior.FocusCellOnTab := True;
OptionsBehavior.GoToNextCellOnEnter := True;
OptionsBehavior.ImmediateEditor := True;
OptionsBehavior.AlwaysShowEditor := False;
OptionsSelection.CellSelect := True;
OptionsSelection.InvertSelect := False;
OptionsSelection.HideFocusRect := False;
OptionsData.Appending := True;
OptionsData.Inserting := True;
OptionsData.Editing := True;
{ El borrado se debe controlar en cada pantalla para
que no salga el mensaje en inglés. }
OptionsData.Deleting := False;
OptionsData.DeletingConfirmation := False;
end
end;
procedure DesactivarEdicionGridDetalles(var Grid: TcxGridDBTableView);
begin
if Grid = NIL then
Exit;
with (Grid as TcxCustomGridTableView) do
begin
OptionsBehavior.FocusCellOnTab := True;
OptionsBehavior.GoToNextCellOnEnter := True;
OptionsBehavior.ImmediateEditor := False;
OptionsBehavior.AlwaysShowEditor := False;
OptionsSelection.CellSelect := False;
OptionsSelection.InvertSelect := False;
OptionsSelection.HideFocusRect := True;
OptionsData.Appending := False;
OptionsData.Deleting := False;
OptionsData.DeletingConfirmation := False;
OptionsData.Editing := False;
OptionsData.Inserting := False;
end
end;
procedure DesactivarEdicionGridDetalles(var vGrid: TcxGrid); overload;
begin
if vGrid = NIL then
Exit;
with (vGrid.ActiveView as TcxCustomGridTableView) do
begin
OptionsBehavior.FocusCellOnTab := True;
OptionsBehavior.GoToNextCellOnEnter := True;
OptionsBehavior.ImmediateEditor := False;
OptionsBehavior.AlwaysShowEditor := False;
OptionsSelection.CellSelect := False;
OptionsSelection.InvertSelect := False;
OptionsSelection.HideFocusRect := True;
OptionsData.Appending := False;
OptionsData.Deleting := False;
OptionsData.DeletingConfirmation := False;
OptionsData.Editing := False;
OptionsData.Inserting := False;
end
end;
procedure TdmBaseDatos.Commit;
begin
if FTransaccionBD = NIL then
Exit;
if FTransaccionBD.InTransaction then
FTransaccionBD.CommitRetaining;
end;
procedure TdmBaseDatos.Rollback;
begin
if FTransaccionBD = NIL then
exit;
if FTransaccionBD.InTransaction then
FTransaccionBD.RollbackRetaining;
end;
function TdmBaseDatos.DarSeriesFacturas: TStrings;
var
oSQL : TIBSQL;
Lista : TStringList;
begin
Result := NIL;
oSQL := TIBSQL.Create(Self);
Lista := TStringList.Create;
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('select DESCRIPCION from SERIES');
try
Prepare;
ExecQuery;
while not EOF do begin
Lista.Append(Fields[0].AsString);
Next;
end;
Result := Lista;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
function TdmBaseDatos.DarFecha: TDateTime;
var
oSQL : TIBSQL;
Fecha : TDateTime;
begin
Result := Date;
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := BD;
Transaction := DarTransaccion;
SQL.Add('select CURRENT_DATE from RDB$DATABASE');
try
Prepare;
ExecQuery;
Fecha := Fields[0].AsDateTime;
Result := Fecha;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
procedure TdmBaseDatos.Conectar(RutaBD, Usuario, Clave: String);
begin
with BD do
begin
DatabaseName := RutaBD;
Params.Clear;
Params.Add('user_name=' + LowerCase(Usuario));
Params.Add('password=' + LowerCase(Clave));
Params.Add('lc_ctype=ISO8859_1');
Params.Add('sql_role_name=usuarios');
try
Screen.Cursor := crHourGlass;
Connected := True;
FTransaccionBD.StartTransaction;
if (ValidarPrivilegios) then
begin
GestorContadores.BD := FBD;
GestorContadores.Transaccion := FTransaccionBD;
//Asignamos empresa como variable de entorno
IniciarTablasBackOffice;
IniciarTablas;
end
else
begin
Rollback;
Connected := False;
raise EIBError.Create(msgUsuarioInc);
end;
finally
Screen.Cursor := crDefault;
end;
end;
end;
function TdmBaseDatos.GetRutaBD: String;
begin
Result := Copy(BD.DatabaseName, Pos(':', BD.DatabaseName) + 1, MaxInt);
end;
function TdmBaseDatos.GetNombreServidor: String;
begin
Result := LeftStr(BD.DatabaseName, Pos(':', BD.DatabaseName) - 1);
end;
procedure TdmBaseDatos.Desconectar;
begin
with BD do
begin
try
Screen.Cursor := crHourGlass;
Connected := False;
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TdmBaseDatos.Conectar;
begin
with BD do
begin
try
Screen.Cursor := crHourGlass;
Connected := True;
FTransaccionBD.StartTransaction;
finally
Screen.Cursor := crDefault;
end;
end;
end;
procedure TdmBaseDatos.Conectar(RutaBD: String);
begin
with BD do
begin
DatabaseName := RutaBD;
Params.Clear;
Params.Add('user_name=' + LowerCase('FACTUGES'));
Params.Add('password=' + LowerCase('FACTUGES'));
Params.Add('lc_ctype=ISO8859_1');
Params.Add('sql_role_name=usuarios');
try
Screen.Cursor := crHourGlass;
Connected := True;
FTransaccionBD.StartTransaction;
IniciarTablasBackOffice;
IniciarTablas;
finally
Screen.Cursor := crDefault;
end;
end;
end;
function TdmBaseDatos.validarPrivilegios: Boolean;
begin
//Por si en un futuro se desea establecer una politica de privilegios de usuario
//para cada EmpresaActiva.
Result := True;
end;
procedure TdmBaseDatos.IniciarTablasBackOffice;
begin
Application.CreateForm(TdmTablaProvincias, dmTablaProvincias);
Application.CreateForm(TdmTablaPoblaciones, dmTablaPoblaciones);
// Empresas
Application.CreateForm(TdmTablaEmpresas, dmTablaEmpresas);
// Trimestres
Application.CreateForm(TdmTablaTrimestres, dmTablaTrimestres);
// Libros
Application.CreateForm(TdmTablaLibros, dmTablaLibros);
end;
procedure IntercambiarPropiedades(Tabla: TPTabla; NumIni, NumFin : Integer);
begin
with Tabla^ do
begin
try
DisableControls;
First;
if Locate('NUMPROPIEDAD', NumIni, []) then
begin
Edit;
FieldByName('NUMPROPIEDAD').AsInteger := -1;
Post;
First;
Locate('NUMPROPIEDAD', NumFin, []);
Edit;
FieldByName('NUMPROPIEDAD').AsInteger := NumIni;
Post;
First;
Locate('NUMPROPIEDAD', -1, []);
Edit;
FieldByName('NUMPROPIEDAD').AsInteger := NumFin;
Post;
end;
finally
Locate('NUMPROPIEDAD', NumFin, []);
EnableControls;
end;
end;
end;
procedure BorrarTabla(DataSet : TDataSet);
begin
with DataSet do
begin
if not Active then
raise EDatabaseError.Create('La tabla está cerrada.');
if IsEmpty then
Exit;
DisableControls;
try
if DataSet is TRxMemoryData then
(DataSet as TRxMemoryData).EmptyTable
else begin
Last;
while not BOF do
begin
Delete;
Prior;
end;
if not IsEmpty then
Delete;
end;
finally
EnableControls;
end;
end;
end;
function TdmBaseDatos.DarHora: TTime;
var
oSQL : TIBSQL;
begin
Result := Time;
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := BD;
Transaction := DarTransaccion;
SQL.Add('select CURRENT_TIME from RDB$DATABASE');
try
Prepare;
ExecQuery;
Result := Fields[0].AsTime;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
procedure FiltrarGrid(var vGrid: TcxGrid; TextoFiltro : String);
var
Columna : TcxGridDBColumn;
Texto : String;
i : Integer;
AItemList: TcxFilterCriteriaItemList;
AItemList2 : TcxFilterCriteriaItemList;
begin
with vGrid.ActiveView.DataController.Filter do
begin
BeginUpdate;
try
Options := [fcoCaseInsensitive, fcoSoftCompare];
Root.Clear;
if Length(TextoFiltro) > 0 then
begin
for i:=0 to (vGrid.ActiveView as TcxGridDBTableView).ColumnCount - 1 do
begin
Columna := (vGrid.ActiveView as TcxGridDBTableView).Columns[i];
if i = 0 then
begin
Root.BoolOperatorKind := fboOr;
Root.AddItem(Columna, foLike, '%'+TextoFiltro+'%', IntToStr(i));
AItemList := Root;
end
else begin
AItemList2 := AItemList.AddItemList(fboOr);
AItemList2.AddItem(Columna, foLike, '%'+TextoFiltro+'%', IntToStr(i));
AItemList := AItemList2;
end;
end;
Active := True;
end
else
Active := False;
finally
EndUpdate;
end;
end;
end;
function TdmBaseDatos.DarValorConfiguracion(Codigo: String): String;
var
oSQL : TIBSQL;
begin
Result := '';
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('select VALOR from CONFIGURACION ');
SQL.Add('where upper(CODIGO) = upper(:CODIGO) ');
ParamByName('CODIGO').AsString := Codigo;
try
Prepare;
ExecQuery;
if not EOF then
Result := Fields[0].AsString;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
function TdmBaseDatos.DarSerieConfiguracion(VAR_CONFIG: String): String;
var
oSQL : TIBSQL;
begin
Result := '';
oSQL := TIBSQL.Create(Self);
with oSQL do
begin
Database := dmBaseDatos.BD;
Transaction := dmBaseDatos.Transaccion;
SQL.Add('SELECT ' + VAR_CONFIG);
SQL.Add('FROM EMPRESAS ');
SQL.Add('WHERE CODIGO = :CODIGOEMPRESA');
ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
try
Prepare;
ExecQuery;
if not EOF then
Result := Fields[0].AsString;
finally
Close;
Transaction := NIL;
Free;
end;
end;
end;
end.