{ =============================================================================== Copyright (©) 2003. 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: 19-01-2003 Versión actual: 1.0.6 Fecha versión actual: 17-11-2004 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- 25-08-2003 Al dar de alta una factura, el cliente debe estar también dado de alta. 31-01-2004 La vigencia del presupuesto es por defecto de 6 meses. 06-02-2004 Se ha ocultado el campo de IVA. 17-05-2004 Codigo de presupuesto no se puede modificar porque hay dos tablas que dependen de él y seria muy costoso mantener la politica de codigos de la aplicacion en este apartado. 11-11-2004 p34. Las observaciones en contratos de armarios no funcionaban correctamente. 15-11-2004 Error en SalvarDetalles y SalvarPropiedades para armarios. 17-11-2004 Cuando ha mejorado la inserción de un presupuesto cuando el código ya ha sido utilizado por otro usuario. =============================================================================== } unit PresupuestoCliente; interface uses Windows, messages, RdxBarras, RdxBotones, StdCtrls, RdxComboBox, RdxCampos, RdxMemo, RdxTitulos, Controls, ExtCtrls, RdxPaneles, Forms, Classes, RdxFramePresupuestos, ComCtrls, RdxPageControl, Grids, DBGrids, RXDBCtrl, Db, RdxRichEdit, Graphics, RxMemDS,IBCustomDataSet, Configuracion, Colores, cxDBEdit, cxDropDownEdit, cxCalendar, cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxButtonEdit, AdvPanel, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDBData, cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, cxSpinEdit, ActnList, RdxFrame, RdxFrameVendedores, cxMemo, cxGridCardView, cxGridDBCardView, TablaArticulos, DBCtrls, ArticuloModelo, Menus, am2000menuitem, am2000popupmenu, am2000, IBQuery, cxLookupEdit, cxDBLookupEdit, cxDBLookupComboBox, TablaDocumentos, TablaPropiedades, RdxEmpresaActiva, am2000utils, cxCurrencyEdit, RXCtrls, Mask, dbcgrids, cxImage, cxDBExtLookupComboBox, cxDataStorage, ShellCtrls, Dialogs, Entidades, SysUtils, JvExMask, JvToolEdit, ShlObj, cxShellCommon, cxShellListView, JvComponent, JvChangeNotify, JvExForms, JvBaseThumbnail, JvThumbViews, JvExComCtrls, JvComCtrls, JvComponentBase; type TfrPresupuestoCliente = class(TRdxFramePresupuestos) brSalir: TRdxBarraInferior; bSalir: TRdxBoton; brGuardar: TRdxBarraInferior; bGuardar: TRdxBoton; bCancelar: TRdxBoton; pnlPaginas: TRdxPanel; Paginas: TRdxPagesControl; pagContenido: TTabSheet; pnlGridArticulos: TPanel; pnlBarraContenido: TRdxPanel; bAnadirCon: TRdxBoton; bEliminar: TRdxBoton; bEliminarTodo: TRdxBoton; dsPresupuesto: TDataSource; dsDetallesPresupuesto: TDataSource; pnlTitulo: TRdxPanelTituloOperacion; pnlCuerpo: TPanel; pnlFactura: TAdvPanel; eCodigo: TLabel; eFechaEmision: TLabel; eFechaAlta: TLabel; eEstadoPresupuesto: TLabel; eVendedor: TLabel; Codigo: TcxDBButtonEdit; FechaPresupuesto: TcxDBDateEdit; cbxSituacion: TcxDBComboBox; FechaDecision: TcxDBDateEdit; Vendedor: TcxDBButtonEdit; gridDetalles: TcxGrid; VistaDetalles: TcxGridDBTableView; gridDetallesLevel1: TcxGridLevel; ActionList1: TActionList; actAnadirDetalle: TAction; actEliminarDetalle: TAction; actEliminarTodoDetalle: TAction; pagNotasVarias: TTabSheet; pnlFormasPago: TPanel; RdxPanel4: TPanel; eFormasPago: TLabel; RdxPanel5: TPanel; FormasPago: TcxDBMemo; dsPropiedadesPresupuesto: TDataSource; eDocumento: TLabel; pnlImportes: TAdvPanel; pagDesgloses: TTabSheet; pagDocumentos: TTabSheet; eVigencia: TLabel; Vigencia: TcxDBDateEdit; cbxDocumento: TcxDBLookupComboBox; dsDocumentos: TDataSource; TablaDocumentos: TIBQuery; VistaPropiedades: TcxGridDBCardView; VistaPropiedadesDBCardViewRow2: TcxGridDBCardViewRow; VistaPropiedadesDBCardViewRow3: TcxGridDBCardViewRow; TablaPropiedades: TIBQuery; TablaValores: TIBQuery; dsValores: TDataSource; dsPropiedades: TDataSource; Label7: TLabel; Descuento: TcxDBTextEdit; Label8: TLabel; IVA: TcxDBTextEdit; actAnadirPropiedad: TAction; actEliminarPropiedad: TAction; pnlBarraPropiedades: TRdxPanel; bAnadirProp: TRdxBoton; bEliminarProp: TRdxBoton; bSubir: TRdxBoton; bBajar: TRdxBoton; pagPrecios: TTabSheet; pnlPrecios: TPanel; pnlBarraPrecio: TRdxPanel; RdxBoton1: TRdxBoton; RdxBoton2: TRdxBoton; gridPrecios: TDBCtrlGrid; DBEdit1: TDBEdit; DBEdit2: TDBEdit; pnlGrid: TRdxPanel; Label5: TLabel; Label10: TLabel; Label11: TLabel; Label9: TLabel; BaseImponible: TcxDBTextEdit; ImporteDescuento: TcxDBTextEdit; ImporteIVA: TcxDBTextEdit; ImporteTotal: TcxDBTextEdit; eSeccion: TLabel; Seccion: TcxComboBox; pnlObservaciones: TRdxPanel; Observaciones: TcxMemo; Label1: TLabel; pagCliente: TTabSheet; Label2: TLabel; eNIFCIF: TLabel; eNumero: TLabel; ePiso: TLabel; eCodigoPostal: TLabel; eNombre: TLabel; eDireccion: TLabel; eProvincia: TLabel; ePoblacion: TLabel; CodCliente: TcxDBButtonEdit; NIFCIF: TcxDBTextEdit; Numero: TcxDBTextEdit; Piso: TcxDBTextEdit; CodigoPostal: TcxDBTextEdit; Nombre: TcxDBTextEdit; Calle: TcxDBTextEdit; Provincia: TcxDBButtonEdit; Poblacion: TcxDBButtonEdit; eTelefono1: TLabel; Telefono1: TcxDBTextEdit; eTelefono2: TLabel; Telefono2: TcxDBTextEdit; eMovil1: TLabel; Movil1: TcxDBTextEdit; eMovil2: TLabel; Movil2: TcxDBTextEdit; eFax: TLabel; Fax: TcxDBTextEdit; ePersona: TLabel; PersonaContacto: TcxDBTextEdit; VistaCombo: TcxGridDBTableView; VistaComboDBDescripcion: TcxGridDBColumn; VistaComboDBImagen: TcxGridDBColumn; pnlPlazosEntrega: TPanel; Panel2: TPanel; ePlazosEntrega: TLabel; Panel3: TPanel; PlazosEntrega: TcxDBMemo; pnlNota: TPanel; Panel4: TPanel; eNota: TLabel; Panel5: TPanel; Nota: TcxDBMemo; Panel1: TPanel; Panel6: TPanel; Label3: TLabel; Panel7: TPanel; Desgloses: TcxDBMemo; Panel8: TPanel; Panel9: TPanel; Panel10: TPanel; Panel11: TPanel; pnlBarraDocumentos: TPanel; bAnadirDoc: TRdxBoton; bEliminarDoc: TRdxBoton; actAnadirDocumento: TAction; actElliminarDocumento: TAction; OpenDialog1: TOpenDialog; MenuOpciones: TPopupMenu2000; Empresa: TMenuItem2000; Contadores: TMenuItem2000; actAbrirDocumento: TAction; explo: TcxShellListView; JvChangeNotify1: TJvChangeNotify; pagAumento: TTabSheet; Panel12: TPanel; Label4: TLabel; Panel13: TPanel; Aumento: TcxDBMemo; pagPlanos: TTabSheet; tvPlanos: TJvThumbView; Panel14: TPanel; RdxBoton3: TRdxBoton; RdxBoton4: TRdxBoton; JvTrackBar1: TJvTrackBar; Label6: TLabel; actAnadirPlano: TAction; actEliminarPlano: TAction; actRefrescarPlano: TAction; RdxBoton6: TRdxBoton; actEliminarTodoPropiedad: TAction; RdxBoton5: TRdxBoton; procedure bSalirClick(Sender: TObject); procedure bGuardarClick(Sender: TObject); procedure bCancelarClick(Sender: TObject); procedure CodClienteButtonClick(Sender: TObject); procedure ProvinciaButtonClick(Sender: TObject); procedure PoblacionButtonClick(Sender: TObject); procedure actAnadirDetalleExecute(Sender: TObject); procedure actEliminarDetalleExecute(Sender: TObject); procedure actEliminarTodoDetalleExecute(Sender: TObject); procedure VendedorPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure CodClientePropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure actEliminarDetalleUpdate(Sender: TObject); procedure actEliminarTodoDetalleUpdate(Sender: TObject); procedure cbXDocumentoPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure actEditarPropiedadesUpdate(Sender: TObject); procedure actAnadirDetalleUpdate(Sender: TObject); procedure TablaDetallesNewRecord(DataSet: TDataSet); procedure FechaPresupuestoPropertiesEditValueChanged(Sender: TObject); procedure actAnadirPropiedadExecute(Sender: TObject); procedure actAnadirPropiedadUpdate(Sender: TObject); procedure actEliminarPropiedadExecute(Sender: TObject); procedure actEliminarPropiedadUpdate(Sender: TObject); procedure actSubirExecute(Sender: TObject); procedure actSubirUpdate(Sender: TObject); procedure actBajarExecute(Sender: TObject); procedure actBajarUpdate(Sender: TObject); procedure gridDetallesResize(Sender: TObject); procedure pnlPreciosResize(Sender: TObject); procedure SeccionPropertiesChange(Sender: TObject); procedure ObservacionesExit(Sender: TObject); procedure VistaPropiedadesDBCardViewRow3CustomDrawCell( Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); procedure actAnadirDocumentoExecute(Sender: TObject); procedure actElliminarDocumentoExecute(Sender: TObject); procedure actAnadirDocumentoUpdate(Sender: TObject); procedure actElliminarDocumentoUpdate(Sender: TObject); procedure pagNotasVariasResize(Sender: TObject); procedure actAbrirDocumentoExecute(Sender: TObject); procedure actAbrirDocumentoUpdate(Sender: TObject); procedure JvChangeNotify1ChangeNotify(Sender: TObject; Dir: String; Actions: TJvChangeActions); procedure tvPlanosStartScanning(Sender: TObject; Max: Integer); procedure tvPlanosStopScanning(Sender: TObject); procedure tvPlanosDblClick(Sender: TObject); procedure JvTrackBar1Change(Sender: TObject); procedure actAnadirPlanoExecute(Sender: TObject); procedure actEliminarPlanoExecute(Sender: TObject); procedure actEliminarPlanoUpdate(Sender: TObject); procedure actRefrescarPlanoExecute(Sender: TObject); procedure actAnadirPlanoUpdate(Sender: TObject); procedure actEliminarTodoPropiedadExecute(Sender: TObject); procedure actEliminarTodoPropiedadUpdate(Sender: TObject); private FRootDocumentos: Variant; FRootPlanos: Variant; FDirectorio: Variant; FDirectorioPlanos : Variant; FCodigoProvincia : Variant; FCodigoPoblacion : Variant; FCodigoCliente : Variant; FCodigoArticulo : Variant; FCodigoVendedor : Variant; FTablaDetallesMem : TRxMemoryData; FTablaPropiedadesMem : TRxMemoryData; FObservaciones1 : String; FObservaciones2 : String; procedure HabilitarDocumentos; procedure DeshabilitarDocumentos; procedure HabilitarPlanos; procedure DeshabilitarPlanos; function CrearDirPlanos: Boolean; procedure ComprobarEstadoDirPlanos; function EliminarDirPlanos : Boolean; function darRutaDocumentosPresupuesto: Variant; function darRutaPlanosPresupuesto: Variant; function AnadirDocumento(RutaDocumento: String): Boolean; function AnadirPlano(RutaPlano: String): Boolean; function CrearDirDocumentos: Boolean; procedure ComprobarEstadoDirDocumentos; function EliminarDirDocumentos : Boolean; procedure CalcularTotalDetalle; procedure CalcularTotalPresupuesto; procedure ActivarEventosCampos; procedure DesactivarEventosCampos; procedure SalvarDetalles; procedure SalvarPropiedades; procedure CargarDetalles; procedure CargarPropiedades; procedure DetalleAfterDelete (DataSet: TDataSet); procedure DetallesAfterInsert(DataSet: TDataSet); procedure PropiedadesAfterDelete (DataSet: TDataSet); procedure PropiedadesAfterInsert(DataSet: TDataSet); procedure CodCliSetText(Sender: TField; const Text: String); procedure ProvinciaSetText(Sender: TField; const Text: String); procedure IVASetText(Sender: TField; const Text: String); procedure DtoSetText(Sender: TField; const Text: String); procedure CodigoArticuloDetalleSetText(Sender: TField; const Text: String); procedure CantidadDetalleSetText(Sender: TField; const Text: String); procedure PrecioDetalleSetText(Sender: TField; const Text: String); procedure GridBotonCodigoArticuloClick(Sender: TObject; AButtonIndex: Integer); procedure InsertarPropiedades(NumConcepto : Integer; Seccion : String = ''); procedure CargarPropiedadesArticulo(NumConcepto : Integer; DatosArticulo : TDatosArticulo); procedure BorrarPropiedadesConcepto(NumConcepto : Integer); procedure AsignarNumConceptoDetalles; procedure AsignarNumPropiedad; procedure ReasignarNumConceptoPropiedades(NumConAnt, NumConNue : Integer); procedure cbxSituacionPropertiesChange(Sender: TObject); procedure SetCodigoProvincia (Value : Variant); virtual; procedure SetCodigoPoblacion (Value : Variant); virtual; procedure SetCodigoCliente (Value : Variant); procedure SetCodigoVendedor (Value : Variant); virtual; procedure SetCodigoArticulo (Value : Variant); function ArticuloConPropiedades(NumConcepto : Integer) : Boolean; procedure CargarDatosDocumento(CodigoDocumento : String); procedure CargarPreciosDocumento (CodigoDocumento : String; NumConcepto : Integer); procedure VALORGetProperties( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties); procedure ConfigurarPantallaDocumento; procedure InsertarDetallesDefecto; procedure TablaMemDetallesFilterRecord(DataSet: TDataSet; var Accept: Boolean); procedure TablaMemPropiedadesFilterRecord(DataSet: TDataSet; var Accept: Boolean); protected procedure ActivarModoAnadir; override; procedure ActivarModoModificar; override; procedure ActivarModoConsultar; override; procedure ActivarModoEliminar; override; function AnadirDatos : Boolean; override; function ModificarDatos : Boolean; override; function EliminarDatos : Boolean; override; function CancelarAnadir : Boolean; override; function CancelarModificar : Boolean; override; function CancelarEliminar : Boolean; override; function ComprobarDatos : Boolean; override; procedure VerModal; override; procedure FreeContenido; override; procedure BuscarPresupuesto; override; property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia; property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion; property CodigoCliente : Variant read FCodigoCliente write SetCodigoCliente; property CodigoArticulo : Variant read FCodigoArticulo write SetCodigoArticulo; property CodigoVendedor : Variant read FCodigoVendedor write SetCodigoVendedor; property TablaDetallesMem : TRxMemoryData read FTablaDetallesMem write FTablaDetallesMem; property TablaPropiedadesMem : TRxMemoryData read FTablaPropiedadesMem write FTablaPropiedadesMem; public constructor Create (AOwner : TComponent); override; destructor Destroy; override; published property TablaPresupuestos; property TablaDetallesPresupuestos; property CodigoPresupuesto; end; var frPresupuestoCliente: TfrPresupuestoCliente; implementation {$R *.DFM} uses cxGridDBDataDefinitions, PresupuestosClientes, BaseDatos, TablaPresupuestos, IBDatabase, Literales, Mensajes, Clientes, RdxFrameProvincias, RdxFramePoblaciones, TablaProvincias, Provincias, Poblaciones, TablaClientes, RdxFrameClientes, IB, Articulos, RdxFrameArticulos, Variants, TablaPropiedadesArticulo, StrFunc, TablaPoblaciones, Excepciones, IBErrorCodes, IBSQL, NumFunc, Vendedores, TablaVendedores, PropiedadesArticulo, RdxDBFrame, TablaFamilias, ElegirDireccionCliente, TablaEmpresas, Constantes, SysFunc, JclFileUtils, ShellApi, WinProcs; { TfrPresupuestoCliente } procedure TfrPresupuestoCliente.ActivarModoAnadir; var CodNuevo : Variant; begin dsPresupuesto.AutoEdit := True; dsDetallesPresupuesto.AutoEdit := True; dsPropiedadesPresupuesto.AutoEdit := True; Codigo.Properties.Buttons[0].Visible := False; Codigo.Properties.ReadOnly := False; CodCliente.Properties.Buttons[0].Visible := True; Poblacion.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := True; DesactivarEventosCampos; try CodNuevo := dmTablaPresupuestos.DarNuevoCodigo; with TablaPresupuestos do begin Close; Prepare; Open; FieldByName('PROVINCIA').OnSetText := ProvinciaSetText; Insert; FCodigoPresupuesto := CodNuevo; Codigo.DataBinding.Field.AsString := FCodigoPresupuesto; Codigo.Properties.ReadOnly := True; FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha; FieldByName('USUARIO').AsString := dmBaseDatos.Usuario; if Entidad <> entPresupuestoCocina then FieldByName('IVA').AsString := EmpresaActiva.IvaDefecto; FechaPresupuesto.DataBinding.Field.AsDateTime := dmBaseDatos.DarFecha; if Entidad <> entPresupuestoReforma then Vigencia.DataBinding.Field.AsDateTime := IncMonth(dmBaseDatos.DarFecha, EmpresaActiva.ValidezDefecto); cbxSituacion.DataBinding.Field.AsString := cbxSituacion.Properties.Items[0]; end; with TablaDetallesPresupuestos do begin Close; Params.ByName('CODIGOPRESUPUESTO').AsString := CodNuevo; Prepare; Open; end; with TablaPropiedadesPresupuestos do begin Close; Params.ByName('CODIGOPRESUPUESTO').AsString := CodNuevo; Prepare; Open; end; with TablaDetallesMem do begin Close; Filtered := False; OnFilterRecord := NIL; Open; end; with TablaPropiedadesMem do begin Close; Filtered := False; onFilterRecord := NIL; Open; end; dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos); dmTablaPresupuestos.InicializarTablaDetalles(@TablaDetallesMem); ActivarEdicionGridDetalles(VistaDetalles); cbxDocumento.DataBinding.Field.AsString := dmTablaDocumentos.DarCodigoDocumento(Entidad); CargarDatosDocumento(cbxDocumento.DataBinding.Field.AsString); ConfigurarPantallaDocumento; InsertarDetallesDefecto; with TablaDetallesMem do begin if not (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma]) then begin OnFilterRecord := TablaMemDetallesFilterRecord; Filtered := True; end; end; with TablaPropiedadesMem do begin if (Entidad = entPresupuestoArmarios) then begin OnFilterRecord := TablaMemPropiedadesFilterRecord; Filtered := True; end; end; FObservaciones1 := ''; FObservaciones2 := ''; Observaciones.Lines.Text := ''; ActivarEventosCampos; Visible := True; //Documentos asociados al presupuesto if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin pnlBarraDocumentos.Visible := True; FDirectorio := '\' + ExtractFileName(darFicheroTemporal); FDirectorioPlanos := FDirectorio; CrearDirDocumentos; CrearDirPlanos; end; FechaPresupuesto.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.ActivarModoConsultar; begin dsPresupuesto.AutoEdit := False; dsDetallesPresupuesto.AutoEdit := False; dsPropiedadesPresupuesto.AutoEdit := False; Codigo.Properties.Buttons[0].Visible := True; CodCliente.Properties.Buttons[0].Visible := False; Poblacion.Properties.Buttons[0].Visible := False; Provincia.Properties.Buttons[0].Visible := False; try with TablaPresupuestos do begin if RecordCount = 0 then begin VerMensajeFmt(msgCliNoExistePre, [CodigoPresupuesto]); CloseFrame; Exit; end; Cancel; end; dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos); dmTablaPresupuestos.InicializarTablaDetalles(@TablaDetallesMem); DesactivarEdicionGridDetalles(gridDetalles); Entidad := dmTablaDocumentos.DarEntidadDocumento(entPresupuestoCliente,cbxDocumento.DataBinding.Field.AsString); with TablaDetallesMem do begin if not (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma]) then begin OnFilterRecord := TablaMemDetallesFilterRecord; Filtered := True; end; end; with TablaPropiedadesMem do begin if (Entidad = entPresupuestoArmarios) then begin OnFilterRecord := TablaMemPropiedadesFilterRecord; Filtered := True; end; end; ConfigurarPantallaDocumento; Visible := True; //Documentos asociados al presupuesto if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin pnlBarraDocumentos.Visible := False; FDirectorio := PathDelim + StringReplace(CodigoPresupuesto,'/','',[rfReplaceAll]); FDirectorioPlanos := FDirectorio; if DirectoryExists(darRutaDocumentosPresupuesto) then HabilitarDocumentos else DeshabilitarDocumentos; if DirectoryExists(darRutaPlanosPresupuesto) then HabilitarPlanos else DeshabilitarPlanos; end; FechaPresupuesto.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.ActivarModoEliminar; begin dsPresupuesto.AutoEdit := False; dsDetallesPresupuesto.AutoEdit := False; dsPropiedadesPresupuesto.AutoEdit := False; Codigo.Properties.Buttons[0].Visible := True; CodCliente.Properties.Buttons[0].Visible := False; Poblacion.Properties.Buttons[0].Visible := False; Provincia.Properties.Buttons[0].Visible := False; try with TablaPresupuestos do begin if RecordCount = 0 then begin VerMensajeFmt(msgCliNoExistePre, [CodigoPresupuesto]); CancelarEliminar; CloseFrame; Exit; end; Cancel; end; dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos); dmTablaPresupuestos.InicializarTablaDetalles(@TablaDetallesMem); Entidad := dmTablaDocumentos.darEntidadDocumento(entPresupuestoCliente, cbxDocumento.DataBinding.Field.AsString); with TablaDetallesMem do begin if not (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma]) then begin OnFilterRecord := TablaMemDetallesFilterRecord; Filtered := True; end; end; with TablaPropiedadesMem do begin if (Entidad = entPresupuestoArmarios) then begin OnFilterRecord := TablaMemPropiedadesFilterRecord; Filtered := True; end; end; ConfigurarPantallaDocumento; DesactivarEdicionGridDetalles(gridDetalles); Visible := True; //Documentos asociados al presupuesto if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin pnlBarraDocumentos.Visible := False; FDirectorio := PathDelim + StringReplace(CodigoPresupuesto,'/','',[rfReplaceAll]); FDirectorioPlanos := FDirectorio; if DirectoryExists(darRutaDocumentosPresupuesto) then HabilitarDocumentos else DeshabilitarDocumentos; if DirectoryExists(darRutaPlanosPresupuesto) then HabilitarPlanos else DeshabilitarPlanos; end; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.ActivarModoModificar; var s: String; begin dsPresupuesto.AutoEdit := True; dsDetallesPresupuesto.AutoEdit := True; dsPropiedadesPresupuesto.AutoEdit := True; Codigo.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := True; CodCliente.Properties.Buttons[0].Visible := True; Poblacion.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := True; try with TablaPresupuestos do begin if RecordCount = 0 then begin VerMensajeFmt(msgCliNoExistePre, [CodigoPresupuesto]); CancelarModificar; CloseFrame; Exit; end; Edit; Post; Edit; end; dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos); dmTablaPresupuestos.InicializarTablaDetalles(@TablaDetallesMem); ActivarEdicionGridDetalles(gridDetalles); FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Provincia.Text); Entidad := dmTablaDocumentos.darEntidadDocumento(entPresupuestoCliente, cbxDocumento.DataBinding.Field.AsString); with TablaDetallesMem do begin if not (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma]) then begin OnFilterRecord := TablaMemDetallesFilterRecord; Filtered := True; end; end; with TablaPropiedadesMem do begin if (Entidad = entPresupuestoArmarios) then begin OnFilterRecord := TablaMemPropiedadesFilterRecord; Filtered := True; end; end; ActivarEventosCampos; ConfigurarPantallaDocumento; Visible := True; //Documentos asociados al presupuesto if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin pnlBarraDocumentos.Visible := True; FDirectorio := '\' + StringReplace(CodigoPresupuesto,'/','',[rfReplaceAll]); FDirectorioPlanos := FDirectorio; CrearDirDocumentos; CrearDirPlanos; end; FechaPresupuesto.SetFocus; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : begin VerMensajeFmt(msgCliPreBloqueado, [CodigoPresupuesto]); CancelarModificar; CloseFrame; Exit; end else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; function TfrPresupuestoCliente.AnadirDatos: Boolean; var CodAux : String; begin try CalcularTotalPresupuesto; TablaPresupuestos.Post; BorrarTabla(TablaDetallesPresupuestos); SalvarDetalles; BorrarTabla(TablaPropiedadesPresupuestos); SalvarPropiedades; dmTablaPresupuestos.IncrementarCodigo; Commit; FCodigoPresupuesto := TablaPresupuestos.FieldByName('CODIGO').AsString; ComprobarEstadoDirDocumentos; ComprobarEstadoDirPlanos; Result := True; except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin // El código ya se ha utilizado TablaPresupuestos.Edit; CodAux := dmTablaPresupuestos.DarNuevoCodigo; VerMensajeFmt(msgCliCodPreRepetido, [Codigo.DataBinding.Field.AsString, CodAux]); Codigo.DataBinding.Field.AsString := CodAux; end else TratarExcepcion(E); end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.BuscarPresupuesto; begin if Transaccion = NIL then Exit; try TablaPresupuestos.DisableControls; TablaDetallesPresupuestos.DisableControls; TablaDetallesMem.DisableControls; TablaPropiedadesPresupuestos.DisableControls; TablaPropiedadesMem.DisableControls; DesactivarEventosCampos; TablaPresupuestos.Close; TablaDetallesPresupuestos.Close; with TablaDetallesMem do begin Close; Filtered := False; OnFilterRecord := NIL; end; with TablaPropiedadesPresupuestos do begin Close; Filtered := False; OnFilterRecord := NIL; end; // Buscar la fila a tratar si es necesario if not EsCadenaVacia(FCodigoPresupuesto) then begin TablaPresupuestos.Params.ByName('CODIGO').AsString := FCodigoPresupuesto; TablaDetallesPresupuestos.Params.ByName('CODIGOPRESUPUESTO').AsString := FCodigoPresupuesto; TablaPropiedadesPresupuestos.Params.ByName('CODIGOPRESUPUESTO').AsString := FCodigoPresupuesto; end; TablaPresupuestos.Prepare; TablaPresupuestos.Open; Entidad := dmTablaDocumentos.DarEntidadDocumento(entPresupuestoCliente,TablaPresupuestos.FieldByName('CODIGODOCUMENTO').AsString); TablaDetallesPresupuestos.Prepare; TablaDetallesPresupuestos.Open; TablaPropiedadesPresupuestos.Prepare; TablaPropiedadesPresupuestos.Open; TablaDetallesMem.Open; CargarDetalles; if not (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma]) then begin with TablaDetallesMem do begin First; FObservaciones1 := FieldByName('OBSERVACIONES').AsString; Observaciones.Lines.Clear; Observaciones.Lines.Text := FObservaciones1; if Entidad = entPresupuestoArmarios then begin Next; FObservaciones2 := FieldByName('OBSERVACIONES').AsString; end; end; TablaDetallesMem.OnFilterRecord := TablaMemDetallesFilterRecord; TablaDetallesMem.Filtered := True; end; TablaPropiedadesMem.Open; CargarPropiedades; if Entidad = entPresupuestoArmarios then begin TablaDetallesMem.OnFilterRecord := TablaMemPropiedadesFilterRecord; TablaDetallesMem.Filtered := True; end; if not TablaDocumentos.Active then TablaDocumentos.Open; dmTablaPresupuestos.InicializarTablaPresupuestos(@TablaPresupuestos); dmTablaPresupuestos.InicializarTablaDetalles(@TablaDetallesMem); ActivarEventosCampos; TablaPresupuestos.EnableControls; TablaDetallesPresupuestos.EnableControls; TablaDetallesMem.EnableControls; TablaPropiedadesPresupuestos.EnableControls; TablaPropiedadesMem.EnableControls; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.CalcularTotalDetalle; var auxCantidad, auxPrecio, auxTotal : double; begin with TablaDetallesMem do begin auxCantidad := FieldByName('CANTIDAD').AsFloat; auxPrecio := FieldByName('IMPORTEUNIDAD').AsFloat; auxTotal := (auxCantidad * auxPrecio); FieldByName('IMPORTETOTAL').AsFloat := auxTotal; end; CalcularTotalPresupuesto; end; procedure TfrPresupuestoCliente.CalcularTotalPresupuesto; var BaseImponible, ImporteIVA, ImporteDto, ImporteTotal : Double; FDetallesBookmark : string; begin BaseImponible := 0; ImporteTotal := 0; with TablaDetallesMem do begin DisableControls; FDetallesBookmark := Bookmark; try First; while not EOF do begin BaseImponible := BaseImponible + FieldByName('IMPORTETOTAL').AsFloat; Next; end; ImporteDto := BaseImponible * (TablaPresupuestos.FieldByName('DESCUENTO').AsFloat/100); ImporteTotal := BaseImponible - ImporteDto; ImporteIVA := ImporteTotal * (TablaPresupuestos.FieldByName('IVA').AsFloat/100); ImporteTotal := ImporteTotal + ImporteIVA; TablaPresupuestos.Edit; TablaPresupuestos.FieldByName('BASEIMPONIBLE').AsFloat := BaseImponible; TablaPresupuestos.FieldByName('IMPORTEDESCUENTO').AsFloat := ImporteDto; TablaPresupuestos.FieldByName('IMPORTEIVA').AsFloat := ImporteIVA; TablaPresupuestos.FieldByName('IMPORTETOTAL').AsFloat := ImporteTotal; finally Bookmark := FDetallesBookmark; EnableControls; end; end; end; function TfrPresupuestoCliente.CancelarAnadir: Boolean; begin Result := False; try TablaPresupuestos.Cancel; TablaDetallesMem.Cancel; TablaPropiedadesMem.Cancel; RollBack; if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin EliminarDirDocumentos; EliminarDirPlanos; end; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrPresupuestoCliente.CancelarEliminar: Boolean; begin Result := False; try RollBack; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrPresupuestoCliente.CancelarModificar: Boolean; begin Result := False; try TablaPresupuestos.Cancel; TablaDetallesMem.Cancel; TablaPropiedadesMem.Cancel; RollBack; ComprobarEstadoDirDocumentos; ComprobarEstadoDirPlanos; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrPresupuestoCliente.ComprobarDatos: Boolean; var AuxNumDetalles : integer; begin Result := False; if not (Modo in [Anadir, Modificar]) then begin Result := True; exit; end; if EsCadenaVacia(FechaPresupuesto.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaFechaAltaPre); FechaPresupuesto.SetFocus; Exit; end; if ((UpperCase(cbxSituacion.DataBinding.Field.AsString) = 'ACEPTADO') or (UpperCase(cbxSituacion.DataBinding.Field.AsString) = 'ANULADO')) and EsCadenaVacia(FechaDecision.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaFechaDecisionPre); FechaDecision.SetFocus; Exit; end; if (UpperCase(cbxSituacion.DataBinding.Field.AsString) = 'PENDIENTE') and not EsCadenaVacia(FechaDecision.DataBinding.Field.AsString) then begin VerMensaje(msgCliSobraFechaDecisionPre); FechaDecision.SetFocus; Exit; end; if Modo = Anadir then begin if EsCadenaVacia(CodCliente.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaCodCli); Paginas.ActivePageIndex := 0; CodCliente.SetFocus; Exit; end end else begin if EsCadenaVacia(Nombre.DataBinding.Field.AsString) then begin VerMensaje(msgCliFaltaNombreCli); Paginas.ActivePageIndex := 0; Nombre.SetFocus; Exit; end end; if TablaDetallesMem.IsEmpty then begin VerMensaje(msgCliFaltaArticulosPre); Paginas.ActivePage := pagContenido; gridDetalles.SetFocus; Exit end; Result := True; end; constructor TfrPresupuestoCliente.Create(AOwner: TComponent); begin inherited Create(AOwner); Entidad := entPresupuestoCliente; FObservaciones1 := ''; FObservaciones2 := ''; FCodigoProvincia := NULL; FCodigoPoblacion := NULL; FCodigoCliente := NULL; FCodigoArticulo := NULL; FCodigoVendedor := NULL; FRootDocumentos := dmBaseDatos.DarValorConfiguracion(CTE_DOCUMENTOS); FRootPlanos := dmBaseDatos.DarValorConfiguracion(CTE_PLANOS); FDirectorio := NULL; FDirectorioPlanos := NULL; BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; TablaPresupuestos := TIBDataSet.Create(Self); TablaDetallesPresupuestos := TIBDataSet.Create(Self); TablaPropiedadesPresupuestos := TIBDataSet.Create(Self); TablaDetallesMem := TRxMemoryData.Create(Self); TablaPropiedadesMem := TRxMemoryData.Create(Self); dsPresupuesto.DataSet := TablaPresupuestos; dsDetallesPresupuesto.DataSet := TablaDetallesMem; dsPropiedadesPresupuesto.DataSet := TablaPropiedadesMem; with TablaDocumentos do begin Database := BaseDatos; Transaction := Transaccion; end; with TablaPresupuestos do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarPresupuesto); InsertSQL.Assign(dmTablaPresupuestos.sqlInsertarPresupuesto); ModifySQL.Assign(dmTablaPresupuestos.sqlModificarPresupuesto); DeleteSQL.Assign(dmTablaPresupuestos.sqlEliminarPresupuesto); RefreshSQL.Assign(dmTablaPresupuestos.sqlConsultarPresupuesto); end; with TablaDetallesPresupuestos do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridDetalles); InsertSQL.Assign(dmTablaPresupuestos.sqlInsertarDetalles); ModifySQL.Assign(dmTablaPresupuestos.sqlModificarDetalles); DeleteSQL.Assign(dmTablaPresupuestos.sqlEliminarDetalles); RefreshSQL.Assign(dmTablaPresupuestos.sqlConsultarDetalles); end; with TablaPropiedadesPresupuestos do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaPresupuestos.sqlConsultarGridPropiedades); InsertSQL.Assign(dmTablaPresupuestos.sqlInsertarPropiedades); ModifySQL.Assign(dmTablaPresupuestos.sqlModificarPropiedades); DeleteSQL.Assign(dmTablaPresupuestos.sqlEliminarPropiedades); RefreshSQL.Assign(dmTablaPresupuestos.sqlConsultarPropiedades); end; with TablaPropiedades do begin Database := BaseDatos; Transaction := Transaccion; Open; end; with TablaValores do begin Database := BaseDatos; Transaction := Transaccion; end; with TablaDetallesMem do begin CopyStructure(TablaDetallesPresupuestos); end; with TablaPropiedadesMem do begin CopyStructure(TablaPropiedadesPresupuestos); end; dmTablaPresupuestos.InicializarGridPropiedades(VistaPropiedades); with TcxLookupComboBoxProperties(VistaPropiedades.GetRowByFieldName('CODIGOPROPIEDAD').Properties) do begin ListSource := dsPropiedades; end; VistaPropiedades.GetRowByFieldName('VALOR').OnGetProperties := VALORGetProperties; dmTablaPresupuestos.InicializarGridDetalles(VistaDetalles); //dmTablaPresupuestos.InicializarGridPrecios(VistaPrecios); cbxSituacion.Properties.Items := dmTablaPresupuestos.DarSituaciones; dmTablaArticulos.ArtModelo := entArticulo; Paginas.ActivePage := pagCliente; end; destructor TfrPresupuestoCliente.Destroy; begin TablaDocumentos.Close; TablaPropiedades.Close; TablaValores.Close; TablaDetallesMem.Close; TablaDetallesMem.Free; TablaPropiedadesMem.Close; TablaPropiedadesMem.Free; TablaPresupuestos.Close; TablaPresupuestos.UnPrepare; TablaPresupuestos.Free; TablaDetallesPresupuestos.Close; TablaDetallesPresupuestos.Unprepare; TablaDetallesPresupuestos.Free; TablaPropiedadesPresupuestos.Close; TablaPropiedadesPresupuestos.UnPrepare; TablaPropiedadesPresupuestos.Free; inherited; end; function TfrPresupuestoCliente.EliminarDatos: Boolean; begin Result := False; try TablaPresupuestos.Delete; BorrarTabla(TablaDetallesMem); BorrarTabla(TablaPropiedadesMem); Commit; if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin EliminarDirDocumentos; EliminarDirPlanos; end; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : VerMensajeFmt(msgCliPreBloqueado, [Codigo.DataBinding.Field.AsString]); else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.FreeContenido; begin if (ContenidoModal is TRdxFramePresupuestos) then begin CodigoPresupuesto := (ContenidoModal as TRdxFramePresupuestos).CodigoPresupuesto; ActivarModo; end; if (ContenidoModal is TRdxFrameClientes) then CodigoCliente := (ContenidoModal as TRdxFrameClientes).CodigoCliente; if (ContenidoModal is TRdxFrameVendedores) then CodigoVendedor := (ContenidoModal as TRdxFrameVendedores).CodigoVendedor; if (ContenidoModal is TRdxFrameProvincias) then CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia; if (ContenidoModal is TfrArticulos) then CodigoArticulo := (ContenidoModal as TRdxFrameArticulos).CodigoArticulo; if (ContenidoModal is TRdxFramePoblaciones) then begin CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia; CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion; end; inherited FreeContenido; end; function TfrPresupuestoCliente.ModificarDatos: Boolean; var cadena :String; attrs : Integer; begin Result := False; try CalcularTotalPresupuesto; TablaPresupuestos.Post; BorrarTabla(TablaDetallesPresupuestos); SalvarDetalles; BorrarTabla(TablaPropiedadesPresupuestos); SalvarPropiedades; Commit; ComprobarEstadoDirDocumentos; ComprobarEstadoDirPlanos; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.SetCodigoArticulo(Value: Variant); var CodigoAux : String; DatosArticulo : TDatosArticulo; begin if (EsCadenaVacia(Value)) then begin FCodigoArticulo := CodigoAux; Exit; end; CodigoAux := Trim(Value); if (dmTablaArticulos.ValidarCodigo(CodigoAux)) then begin CodigoAux := dmTablaArticulos.FormatearCodigo(CodigoAux); if (dmTablaArticulos.ExisteCodigo(CodigoAux)) then FCodigoArticulo := CodigoAux else begin raise Exception.CreateFmt(msgDatosCodArtNoExiste, [CodigoAux]); end; end else begin raise Exception.CreateFmt(msgDatosCodArtIncorrecto, [CodigoAux]); Exit; end; DatosArticulo := TDatosArticulo.Create(CodigoAux); try with TablaDetallesMem do begin Edit; FieldByName('CODIGOPRESUPUESTO').AsString := Codigo.DataBinding.Field.AsString; FieldByName('NUMCONCEPTO').AsInteger := RecNo; FieldByName('CODIGOARTICULO').AsString := DatosArticulo.Codigo; FieldByName('DESCRIPCION').AsString := DatosArticulo.Descripcion; FieldByName('TIPOCONCEPTO').AsVariant := ''; if EsCadenaVacia(FieldByName('CANTIDAD').AsString) then FieldByName('CANTIDAD').AsString := '1'; Post; InsertarPropiedades(FieldByName('NUMCONCEPTO').AsInteger); gridDetalles.Refresh; // Como no coge el importe lo comentamos // CalcularTotalDetalle; end; FCodigoArticulo := Value; finally DatosArticulo.Free; end; end; procedure TfrPresupuestoCliente.SetCodigoCliente(Value: Variant); var DatosCliente : TDatosCliente; CodAux : Variant; DireccionElegida : TDireccionElegida; NumSucursal : Integer; begin if EsCadenaVacia(Value) then exit; CodAux := Trim(Value); if (dmTablaClientes.ValidarCodigo(CodAux)) then begin CodAux := dmTablaClientes.FormatearCodigo(CodAux); if (dmTablaClientes.ExisteCodigo(CodAux)) then FCodigoCliente := CodAux else begin raise Exception.CreateFmt(msgCliCodCliNoExiste, [CodAux]); end; end else begin raise Exception.CreateFmt(msgCliCodCliIncorrecto, [CodAux]); end; DatosCliente := TDatosCliente.Create(FCodigoCliente); try CodCliente.DataBinding.Field.AsString := DatosCliente.Codigo; if DatosCliente.Sucursales.Count > 0 then begin frElegirDireccionCliente := TfrElegirDireccionCliente.Create(Self); try frElegirDireccionCliente.Cliente := DatosCliente; frElegirDireccionCliente.ShowModal; DireccionElegida := frElegirDireccionCliente.DireccionSeleccionada; NumSucursal := frElegirDireccionCliente.NumSucursal; finally frElegirDireccionCliente.Free; end; end else DireccionElegida := dePrincipal; if DireccionElegida = dePrincipal then begin NIFCIF.DataBinding.Field.AsString := DatosCliente.Nifcif; Nombre.DataBinding.Field.AsString := DatosCliente.Nombre; Calle.DataBinding.Field.AsString := DatosCliente.Calle; Numero.DataBinding.Field.AsString := DatosCliente.Numero; Piso.DataBinding.Field.AsString := DatosCliente.Piso; Provincia.DataBinding.Field.AsString := DatosCliente.Provincia; FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(DatosCliente.Provincia); Poblacion.DataBinding.Field.AsString := DatosCliente.Poblacion; CodigoPostal.DataBinding.Field.AsString := DatosCliente.CodigoPostal; Telefono1.DataBinding.Field.AsString := DatosCliente.Telefono1; Telefono2.DataBinding.Field.AsString := DatosCliente.Telefono2; Movil1.DataBinding.Field.AsString := DatosCliente.Movil1; Movil2.DataBinding.Field.AsString := DatosCliente.Movil2; Fax.DataBinding.Field.AsString := DatosCliente.Fax; PersonaContacto.DataBinding.Field.AsString := DatosCliente.PersonaContacto; end else begin with DatosCliente.Sucursales do begin NIFCIF.DataBinding.Field.AsString := Sucursal[NumSucursal].Nifcif; Nombre.DataBinding.Field.AsString := Sucursal[NumSucursal].Nombre; Calle.DataBinding.Field.AsString := Sucursal[NumSucursal].Calle; Numero.DataBinding.Field.AsString := Sucursal[NumSucursal].Numero; Piso.DataBinding.Field.AsString := Sucursal[NumSucursal].Piso; Provincia.DataBinding.Field.AsString := Sucursal[NumSucursal].Provincia; FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Sucursal[NumSucursal].Provincia); Poblacion.DataBinding.Field.AsString := Sucursal[NumSucursal].Poblacion; CodigoPostal.DataBinding.Field.AsString := Sucursal[NumSucursal].CodigoPostal; Telefono1.DataBinding.Field.AsString := Sucursal[NumSucursal].Telefono1; Telefono2.DataBinding.Field.AsString := Sucursal[NumSucursal].Telefono2; Movil1.DataBinding.Field.AsString := Sucursal[NumSucursal].Movil1; Movil2.DataBinding.Field.AsString := Sucursal[NumSucursal].Movil2; Fax.DataBinding.Field.AsString := Sucursal[NumSucursal].Fax; PersonaContacto.DataBinding.Field.AsString := Sucursal[NumSucursal].PersonaContacto; end; end; finally DatosCliente.Free; end; end; procedure TfrPresupuestoCliente.SetCodigoPoblacion(Value: Variant); begin if (not EsCadenaVacia(Value)) then begin FCodigoPoblacion := Value; Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion); end; end; procedure TfrPresupuestoCliente.SetCodigoProvincia(Value: Variant); begin if (not EsCadenaVacia(Value)) then begin FCodigoProvincia := Value; Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia); end; end; procedure TfrPresupuestoCliente.VerModal; var DatosFamilia : TDatosFamilia; begin if (ContenidoModal is TRdxFramePoblaciones) then (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia; if (ContenidoModal is TRdxFrameClientes) then (ContenidoModal as TRdxFrameClientes).CodigoCliente := CodigoCliente; if (ContenidoModal is TfrArticulos) then begin FCodigoArticulo := TablaDetallesMem.FieldByName('CODIGOARTICULO').AsString; if EsCadenaVacia(FCodigoArticulo) then begin if (not EsCadenaVacia(TablaDocumentos.FieldByName('DESCFAMILIA').AsString)) then (ContenidoModal as TfrArticulos).Familia := TablaDocumentos.FieldByName('DESCFAMILIA').AsString; end else begin DatosFamilia := TDatosFamilia.Create(TablaDetallesMem.FieldByName('FAMILIA').AsInteger); try (ContenidoModal as TfrArticulos).Familia := DatosFamilia.Descripcion; (ContenidoModal as TfrArticulos).CodigoArticulo := FCodigoArticulo; finally DatosFamilia.Free; end; end; end; inherited; end; procedure TfrPresupuestoCliente.bSalirClick(Sender: TObject); begin try Rollback; CloseFrame; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.bGuardarClick(Sender: TObject); begin if (RealizarOperacion) then CloseFrame; end; procedure TfrPresupuestoCliente.bCancelarClick(Sender: TObject); begin if (TratarCambios = IDOK) then CloseFrame; end; procedure TfrPresupuestoCliente.CodClienteButtonClick(Sender: TObject); begin ContenidoModal := TfrClientes.Create(Self); end; procedure TfrPresupuestoCliente.CodigoArticuloDetalleSetText( Sender: TField; const Text: String); begin Sender.AsString := Text; CodigoArticulo := Text; end; procedure TfrPresupuestoCliente.CantidadDetalleSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '1' else Sender.AsString := Text; CalcularTotalDetalle; end; procedure TfrPresupuestoCliente.PrecioDetalleSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '0' else Sender.AsString := Text; CalcularTotalDetalle; end; procedure TfrPresupuestoCliente.ProvinciaButtonClick(Sender: TObject); begin CaptionModal := msgListaProvincias; WidthModal := 280; HeightModal := 460; ContenidoModal := TfrProvincias.Create(Self); end; procedure TfrPresupuestoCliente.PoblacionButtonClick(Sender: TObject); begin if (EsCadenaVacia(CodigoProvincia)) then begin VerMensaje(msgSinProvincia); Paginas.ActivePageIndex := 0; Provincia.SetFocus; Exit; end; CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]); WidthModal := 280; HeightModal := 460; ContenidoModal := TfrPoblaciones.Create(Self); end; procedure TfrPresupuestoCliente.ActivarEventosCampos; begin with TablaPresupuestos do begin FieldByName('CODIGOCLIENTE').OnSetText := CodCliSetText; FieldByName('IVA').OnSetText := IVASetText; FieldByName('DESCUENTO').OnSetText := DtoSetText; end; with TablaDetallesMem do begin FieldByName('CODIGOARTICULO').OnSetText := CodigoArticuloDetalleSetText; FieldByName('CANTIDAD').OnSetText := CantidadDetalleSetText; FieldByName('IMPORTEUNIDAD').OnSetText := PrecioDetalleSetText; AfterDelete := DetalleAfterDelete; AfterInsert := DetallesAfterInsert; end; with TablaPropiedadesMem do begin AfterInsert := PropiedadesAfterInsert; AfterDelete := PropiedadesAfterDelete; end; with VistaDetalles do begin TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := GridBotonCodigoArticuloClick; end; cbxSituacion.Properties.OnChange := cbxSituacionPropertiesChange; end; procedure TfrPresupuestoCliente.SalvarDetalles; var NumeroCampo : Integer; begin try with TablaDetallesMem do begin DisableControls; Filtered := False; First; while not EOF do begin TablaDetallesPresupuestos.Append; for NumeroCampo := 0 to FieldCount-1 do begin if Fields[NumeroCampo].FieldName = 'CODIGOPRESUPUESTO' then TablaDetallesPresupuestos.Fields[NumeroCampo].AsString := Codigo.DataBinding.Field.AsString else if Fields[NumeroCampo].FieldName = 'NUMCONCEPTO' then TablaDetallesPresupuestos.Fields[NumeroCampo].AsInteger := RecNo - 1 else TablaDetallesPresupuestos.Fields[NumeroCampo].AsVariant := Fields[NumeroCampo].AsVariant; end; if (RecNo-1 = 0) and (not (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma])) then TablaDetallesPresupuestos.FieldByName('OBSERVACIONES').AsString := FObservaciones1; if (RecNo-1 = 1) and (Entidad = entPresupuestoArmarios) then TablaDetallesPresupuestos.FieldByName('OBSERVACIONES').AsString := FObservaciones2; TablaDetallesPresupuestos.Post; Next; end; EnableControls; end except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin TablaDetallesPresupuestos.Delete; TablaDetallesMem.EnableControls; end; raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message); end; end; end; procedure TfrPresupuestoCliente.CargarDetalles; var NumeroCampo : Integer; begin with TablaDetallesMem do begin if TablaDetallesPresupuestos.IsEmpty then Exit; DisableControls; TablaDetallesPresupuestos.First; while not TablaDetallesPresupuestos.EOF do begin Append; for NumeroCampo := 0 to TablaDetallesPresupuestos.FieldCount-1 do Fields[NumeroCampo].AsString := TablaDetallesPresupuestos.Fields[NumeroCampo].AsString; Post; TablaDetallesPresupuestos.Next; end; First; EnableControls; end; end; procedure TfrPresupuestoCliente.CargarPropiedades; var NumeroCampo : Integer; begin with TablaPropiedadesMem do begin if TablaPropiedadesPresupuestos.IsEmpty then Exit; DisableControls; TablaPropiedadesPresupuestos.First; while not TablaPropiedadesPresupuestos.EOF do begin Append; for NumeroCampo := 0 to TablaPropiedadesPresupuestos.FieldCount-1 do Fields[NumeroCampo].AsString := TablaPropiedadesPresupuestos.Fields[NumeroCampo].AsString; Post; TablaPropiedadesPresupuestos.Next; end; First; EnableControls; end; end; procedure TfrPresupuestoCliente.DetalleAfterDelete(DataSet: TDataSet); begin AsignarNumConceptoDetalles; CalcularTotalPresupuesto; end; procedure TfrPresupuestoCliente.actAnadirDetalleExecute(Sender: TObject); begin try with TablaDetallesMem do begin Next; if EOF then Append else begin Prior; Insert; end; //Por defecto a toda linea de detalles le asignamos 0 y si no le asignamos aqui //un 1 las lineas de precio no se verían el informe if pagPrecios.Showing then begin TablaDetallesMem.Edit; TablaDetallesMem.FieldByName('CANTIDAD').AsString := '1'; end; end; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrPresupuestoCliente.actEliminarDetalleExecute(Sender: TObject); begin if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then Exit; if TablaDetallesMem.RecordCount = 0 then begin { Hacemos un cancel de la tabla por si el registro actual estuviera recien creado } TablaDetallesMem.Cancel; Exit end; try BorrarPropiedadesConcepto(TablaDetallesMem.FieldByName('NUMCONCEPTO').AsVariant); TablaDetallesMem.Delete; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; CalcularTotalPresupuesto; end; procedure TfrPresupuestoCliente.ProvinciaSetText(Sender: TField; const Text: String); begin FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Text); Sender.AsString := Text; end; procedure TfrPresupuestoCliente.actEliminarTodoDetalleExecute(Sender: TObject); begin if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then Exit; BorrarTabla(TablaDetallesMem); BorrarTabla(TablaPropiedadesMem); CalcularTotalPresupuesto; end; procedure TfrPresupuestoCliente.DtoSetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '0' else begin ValidarDto(Text); Sender.AsString := Text; end; CalcularTotalPresupuesto; end; procedure TfrPresupuestoCliente.IVASetText(Sender: TField; const Text: String); begin if EsCadenaVacia(Text) then Sender.AsString := '0' else begin ValidarIVA(Text); Sender.AsString := Text; end; CalcularTotalPresupuesto; end; procedure TfrPresupuestoCliente.DetallesAfterInsert(DataSet: TDataSet); begin with DataSet do begin Edit; FieldByName('CODIGOPRESUPUESTO').AsString := Codigo.DataBinding.Field.AsString; FieldByName('NUMCONCEPTO').AsInteger := RecNo; FieldByName('DESCRIPCION').AsString := ''; if EsCadenaVacia(FieldByName('CANTIDAD').AsString) then FieldByName('CANTIDAD').AsString := '0'; if (Entidad in [entPresupuestoCliente, entPresupuestoVarios, entPresupuestoElectro, entPresupuestoReforma]) then FieldByName('TIPOCONCEPTO').AsVariant := '' else FieldByName('TIPOCONCEPTO').AsVariant := 'PRECIO'; Post; AsignarNumConceptoDetalles; Edit; end; end; procedure TfrPresupuestoCliente.VendedorPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin CaptionModal := 'Lista de vendedores'; ContenidoModal := TfrVendedores.Create(Self); end; procedure TfrPresupuestoCliente.SetCodigoVendedor(Value: Variant); var DatosVendedor : TDatosVendedor; begin if EsCadenaVacia(Value) then exit; DatosVendedor := TDatosVendedor.Create; DatosVendedor.Codigo := Value; try if dmTablaVendedores.DarDatosVendedor(DatosVendedor) then begin with TablaPresupuestos do begin Edit; FieldByName('VENDEDOR').AsString := DatosVendedor.Nombre; end; FCodigoVendedor := Value; end else raise Exception.CreateFmt(msgDatosCodVendNoExiste, [Value]); finally DatosVendedor.Free; end; end; procedure TfrPresupuestoCliente.CodClientePropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin ContenidoModal := TfrClientes.Create(Self); end; procedure TfrPresupuestoCliente.ProvinciaPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin CaptionModal := msgListaProvincias; WidthModal := 280; HeightModal := 460; ContenidoModal := TfrProvincias.Create(Self); end; procedure TfrPresupuestoCliente.PoblacionPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin if EsCadenaVacia(CodigoProvincia) then begin VerMensaje(msgSinProvincia); Paginas.ActivePageIndex := 0; Provincia.SetFocus; Exit; end; CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]); WidthModal := 280; HeightModal := 460; ContenidoModal := TfrPoblaciones.Create(Self); end; procedure TfrPresupuestoCliente.GridBotonCodigoArticuloClick( Sender: TObject; AButtonIndex: Integer); begin TablaDetallesMem.Edit; ContenidoModal := TfrArticulos.Create(Self); gridDetalles.SetFocus; end; procedure TfrPresupuestoCliente.InsertarPropiedades(NumConcepto : Integer; Seccion : String); var DatosDocumento : TDocumento; Contador : Integer; FPropiedad : TDatosPropiedad; FNumPropiedad : Integer; begin with TablaPropiedadesMem do begin DisableControls; DatosDocumento := TDocumento.Create(TablaPresupuestos.FieldByName('CODIGODOCUMENTO').AsString); try BorrarPropiedadesConcepto(NumConcepto); FNumPropiedad := 0; First; for Contador := 0 to (DatosDocumento.ListaPropiedades.Count - 1) do begin FPropiedad := DatosDocumento.ListaPropiedades.Items[Contador]; if (not EsCadenaVacia(Seccion)) and (FPropiedad.Seccion <> Seccion) then Continue else begin Append; FieldByName('CODIGOPRESUPUESTO').AsString := CodigoPresupuesto; FieldByName('NUMCONCEPTO').AsInteger := NumConcepto; FieldByName('NUMPROPIEDAD').AsInteger := FNumPropiedad; FieldByName('CODIGOPROPIEDAD').AsInteger := FPropiedad.CodigoPropiedad; FieldByName('VALOR').AsString := FPropiedad.Valor; Post; FNumPropiedad := FNumPropiedad + 1; end; end; First; finally DatosDocumento.Free; EnableControls; end; end; end; procedure TfrPresupuestoCliente.SalvarPropiedades; var NumeroCampo : Integer; begin try with TablaPropiedadesMem do begin DisableControls; Filtered := False; First; while not EOF do begin if not EsCadenaVacia(FieldByName('CODIGOPROPIEDAD').AsVariant) then begin TablaPropiedadesPresupuestos.Append; for NumeroCampo := 0 to FieldCount-1 do begin if Fields[NumeroCampo].FieldName = 'CODIGOPRESUPUESTO' then TablaPropiedadesPresupuestos.Fields[NumeroCampo].AsString := Codigo.DataBinding.Field.AsString else TablaPropiedadesPresupuestos.Fields[NumeroCampo].AsVariant := Fields[NumeroCampo].AsVariant; end; TablaPropiedadesPresupuestos.Post; end; Next; end; EnableControls; end except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin TablaPropiedadesPresupuestos.Delete; TablaPropiedadesMem.EnableControls; end; raise EIBError.Create(E.SQLCode, E.IBErrorCode, E.Message); end; end; end; procedure TfrPresupuestoCliente.BorrarPropiedadesConcepto( NumConcepto: Integer); begin with TablaPropiedadesMem do begin if IsEmpty then Exit; DisableControls; try Last; while not BOF do begin if FieldByName('NUMCONCEPTO').AsInteger = NumConcepto then Delete; Prior; end; if FieldByName('NUMCONCEPTO').AsInteger = NumConcepto then Delete; finally EnableControls; end; end; end; procedure TfrPresupuestoCliente.AsignarNumConceptoDetalles; var FDetallesBookmark : string; NumConAnt, NumConNue : Integer; begin with TablaDetallesMem do begin DisableControls; FDetallesBookmark := Bookmark; try Last; while not BOF do begin Edit; NumConAnt := FieldByName('NUMCONCEPTO').AsInteger; NumConNue := RecNo; FieldByName('NUMCONCEPTO').AsInteger := NumConNue; Post; ReasignarNumConceptoPropiedades(NumConAnt, NumConNue); Prior; end; finally EnableControls; Bookmark := FDetallesBookmark; end; end; end; procedure TfrPresupuestoCliente.ReasignarNumConceptoPropiedades(NumConAnt, NumConNue: Integer); begin if NumConAnt = NumConNue then exit; with TablaPropiedadesMem do begin DisableControls; try First; while not EOF do begin if FieldByName('NUMCONCEPTO').AsInteger = NumConAnt then begin Edit; FieldByName('NUMCONCEPTO').AsInteger := NumConNue; Post; end; Next; end; finally EnableControls; end; end; end; procedure TfrPresupuestoCliente.PropiedadesAfterInsert(DataSet: TDataSet); begin with DataSet do begin FieldByName('CODIGOPRESUPUESTO').AsString := TablaDetallesMem.FieldByName('CODIGOPRESUPUESTO').AsString; if Entidad in [entPresupuestoCocina, entPresupuestoBano] then FieldByName('NUMCONCEPTO').AsInteger := 0 else begin if Entidad = entPresupuestoArmarios then FieldByName('NUMCONCEPTO').AsInteger := Seccion.ItemIndex else FieldByName('NUMCONCEPTO').AsInteger := TablaDetallesMem.FieldByName('NUMCONCEPTO').AsInteger; end; Post; AsignarNumPropiedad; Edit; end; end; procedure TfrPresupuestoCliente.CodigoPropertiesButtonClick( Sender: TObject; AButtonIndex: Integer); begin if (TratarCambios = IDCANCEL) then exit; { Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos este botón se cierra la tabla y si en el frame hijo (el del grid) damos a cancelar, FCodigoCliente es NULL y da error al activar modo porque no se inicializa los parámetros de la sql. Lo hace BuscarCliente. } { if not TablaPresupuestos.Active then BuscarPresupuesto;} ContenidoModal := TfrPresupuestosClientes.Create(Self); end; procedure TfrPresupuestoCliente.DesactivarEventosCampos; begin with TablaPresupuestos do begin if FindField('CODIGOCLIENTE') <> NIL then FieldByName('CODIGOCLIENTE').OnSetText := NIL; if FindField('IVA') <> NIL then FieldByName('IVA').OnSetText := NIL; if FindField('DESCUENTO') <> NIL then FieldByName('DESCUENTO').OnSetText := NIL; end; with TablaDetallesMem do begin if FindField('CODIGOARTICULO') <> NIL then FieldByName('CODIGOARTICULO').OnSetText := NIL; if FindField('CANTIDAD') <> NIL then FieldByName('CANTIDAD').OnSetText := NIL; if FindField('IMPORTEUNIDAD') <> NIL then FieldByName('IMPORTEUNIDAD').OnSetText := NIL; AfterDelete := NIL; AfterInsert := NIL; end; with TablaPropiedadesMem do begin AfterInsert := NIL; end; with VistaDetalles do begin if GetColumnByFieldName('CODIGOARTICULO') <> NIL then TcxButtonEditProperties(GetColumnByFieldName('CODIGOARTICULO').Properties).OnButtonClick := NIL; end; cbxSituacion.Properties.OnChange := NIL; end; procedure TfrPresupuestoCliente.cbxSituacionPropertiesChange( Sender: TObject); begin { if (cbxSituacion.EditValue = 'PENDIENTE') then begin FechaDecision.Enabled := False; FechaDecision.DataBinding.Field.Value := NULL; end else FechaDecision.Enabled := True;} end; procedure TfrPresupuestoCliente.CodCliSetText(Sender: TField; const Text: String); begin Sender.AsString := Text; CodigoCliente := Text; end; procedure TfrPresupuestoCliente.actEliminarDetalleUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaDetallesMem.RecordCount = 0); end; procedure TfrPresupuestoCliente.actEliminarTodoDetalleUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaDetallesMem.RecordCount = 0); end; procedure TfrPresupuestoCliente.CargarPropiedadesArticulo( NumConcepto: Integer; DatosArticulo: TDatosArticulo); var FPropiedad : TDatosPropiedad; FBookmark : string; begin with TablaPropiedadesMem do begin FBookmark := Bookmark; DisableControls; try First; while not EOF do begin if FieldByName('NUMCONCEPTO').AsInteger = NumConcepto then begin FPropiedad := TDatosPropiedad.Create; FPropiedad.CodigoPropiedad := FieldByName('CODIGOPROPIEDAD').AsInteger; FPropiedad.Valor := FieldByName('VALOR').AsString; DatosArticulo.ListaPropiedades.Add(FPropiedad); end; Next; end; finally Bookmark := FBookmark; EnableControls; end; end; end; procedure TfrPresupuestoCliente.cbXDocumentoPropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin if VerMensajePreguntaFmt(msgCliCambiarTipoPre, [cbxDocumento.Text]) = mrYES then CargarDatosDocumento(TablaDocumentos.FieldByName('CODIGO').AsString) else begin ErrorText := ''; Error := True; cbxDocumento.Undo; // Restaurar el valor anterior end; end; procedure TfrPresupuestoCliente.actEditarPropiedadesUpdate( Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaDetallesMem.RecordCount = 0); end; procedure TfrPresupuestoCliente.actAnadirDetalleUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := True; end; function TfrPresupuestoCliente.ArticuloConPropiedades( NumConcepto: Integer): Boolean; begin Result := False; with TablaPropiedadesMem do begin DisableControls; try First; while not EOF do begin if FieldByName('NUMCONCEPTO').AsInteger = NumConcepto then begin Result := True; Break; end; Next; end; finally EnableControls; end; end; end; procedure TfrPresupuestoCliente.TablaDetallesNewRecord(DataSet: TDataSet); begin // end; procedure TfrPresupuestoCliente.CargarDatosDocumento(CodigoDocumento : String); var DocAux : TDocumento; begin DocAux := TDocumento.Create(CodigoDocumento); Entidad := dmTablaDocumentos.DarEntidadDocumento(entPresupuestoCliente, DocAux.Codigo); try Nota.EditingText := DocAux.Notas; TablaPresupuestos.FieldByName('OBSERVACIONES').AsString := DocAux.Notas; FormasPago.EditingText := DocAux.FormaPago; TablaPresupuestos.FieldByName('FORMAPAGO').AsString := DocAux.FormaPago; PlazosEntrega.EditingText := DocAux.PlazoEntrega; TablaPresupuestos.FieldByName('PLAZOENTREGA').AsString := DocAux.PlazoEntrega; finally DocAux.Free; DocAux := NIL; end; end; procedure TfrPresupuestoCliente.FechaPresupuestoPropertiesEditValueChanged( Sender: TObject); begin if Entidad <> entPresupuestoReforma then if TablaPresupuestos.State in dsEditModes then Vigencia.DataBinding.Field.AsDateTime := IncMonth(FechaPresupuesto.DataBinding.Field.AsDateTime, EmpresaActiva.ValidezDefecto) end; procedure TfrPresupuestoCliente.VALORGetProperties( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties); begin if not ARecord.Focused then Exit else begin with TablaValores do begin try DisableControls; Close; // ¿Tiene 'copia'? if TablaPropiedades.FieldByName('COPIA').AsVariant <> NULL then ParamByName('CODIGOPROPIEDAD').AsInteger := TablaPropiedades.FieldByName('COPIA').AsInteger else // No tiene 'copia' ParamByName('CODIGOPROPIEDAD').AsInteger := TablaPropiedadesMem.FieldByName('CODIGOPROPIEDAD').AsInteger; Prepare; Open; if RecordCount = 0 then AProperties := dmConfiguracion.cxEditRepository1TextItem1.Properties else begin AProperties := dmConfiguracion.cxEditRepository1ExtLookupComboBoxItem1.Properties; with TcxExtLookupComboBoxProperties(AProperties) do begin DropDownListStyle := lsEditList; ImmediatePost := True; KeyFieldNames := 'DESCRIPCION'; ListFieldItem := VistaComboDBDescripcion; VistaComboDBImagen.Width := CTE_ALT_IMG; VistaCombo.OptionsView.DataRowHeight := CTE_ALT_IMG; View := VistaCombo; end; end; finally EnableControls; end; end; end; end; procedure TfrPresupuestoCliente.ConfigurarPantallaDocumento; begin if (Entidad = entPresupuestoReforma) then eVigencia.Caption := 'Comienzo:' else eVigencia.Caption := 'Vigencia:'; if (Entidad = entPresupuestoCocina) then begin pagContenido.TabVisible := False; pagDesgloses.TabVisible := True; pagAumento.TabVisible := True; pagDocumentos.TabVisible := True; pagPlanos.TabVisible := True; end else begin pagContenido.TabVisible := True; pagDesgloses.TabVisible := False; pagAumento.TabVisible := False; pagDocumentos.TabVisible := False; pagPlanos.TabVisible := False; end; case Entidad of entPresupuestoCocina, entPresupuestoBano, entPresupuestoArmarios : begin pagPrecios.TabVisible := True; gridDetallesLevel1.GridView := VistaPropiedades; pnlObservaciones.Visible := True; if Modo in [Anadir, Modificar] then begin pnlBarraContenido.Visible := False; pnlBarraPropiedades.Visible := True; pnlBarraPrecio.Visible := True; Observaciones.Properties.ReadOnly := False; end else begin pnlBarraContenido.Visible := False; pnlBarraPropiedades.Visible := True; pnlBarraPrecio.Visible := False; Observaciones.Properties.ReadOnly := True; end; if Entidad = entPresupuestoArmarios then begin eSeccion.Visible := True; Seccion.Visible := True; Seccion.ItemIndex := 0; pagPlanos.TabVisible := True; end else begin eSeccion.Visible := False; Seccion.Visible := False; end end else begin pagPrecios.TabVisible := False; gridDetallesLevel1.GridView := VistaDetalles; pnlObservaciones.Visible := False; if Modo in [Anadir, Modificar] then begin pnlBarraContenido.Visible := True; pnlBarraPropiedades.Visible := False; pnlBarraPrecio.Visible := False; end else begin pnlBarraContenido.Visible := False; pnlBarraPropiedades.Visible := False; pnlBarraPrecio.Visible := False; end end end; end; procedure TfrPresupuestoCliente.InsertarDetallesDefecto; begin Observaciones.Lines.Clear; case Entidad of entPresupuestoCocina, entPresupuestoBano : begin with TablaDetallesMem do begin Append; FieldByName('NUMCONCEPTO').AsInteger := 0; FieldByName('TIPOCONCEPTO').AsString := dmTablaDocumentos.DarCodigoDocumento(Entidad); FieldByName('CANTIDAD').AsInteger := 1; Post; InsertarPropiedades(FieldByName('NUMCONCEPTO').AsInteger); CargarPreciosDocumento(cbxDocumento.DataBinding.Field.AsString, 1); First; end; end; entPresupuestoArmarios: begin with TablaDetallesMem do begin Append; FieldByName('NUMCONCEPTO').AsInteger := 0; FieldByName('TIPOCONCEPTO').AsString := 'FRENTE'; FieldByName('CANTIDAD').AsInteger := 1; Post; InsertarPropiedades(FieldByName('NUMCONCEPTO').AsInteger, FieldByName('TIPOCONCEPTO').AsString); Append; FieldByName('NUMCONCEPTO').AsInteger := 1; FieldByName('TIPOCONCEPTO').AsString := 'INTERIOR'; FieldByName('CANTIDAD').AsInteger := 1; Post; InsertarPropiedades(FieldByName('NUMCONCEPTO').AsInteger, FieldByName('TIPOCONCEPTO').AsString); CargarPreciosDocumento(cbxDocumento.DataBinding.Field.AsString, 2); First; end; end; end; end; procedure TfrPresupuestoCliente.CargarPreciosDocumento( CodigoDocumento: String; NumConcepto: Integer); var DocAux : TDocumento; Contador : Integer; begin DocAux := TDocumento.Create(CodigoDocumento); try with TablaDetallesMem do begin if State in dsEditModes then Cancel; for Contador := 0 to DocAux.ListaPrecios.Count-1 do begin Append; FieldByName('NUMCONCEPTO').AsInteger := NumConcepto + Contador; FieldByName('TIPOCONCEPTO').AsString := 'PRECIO'; FieldByName('DESCRIPCION').AsString := DocAux.ListaPrecios.Strings[Contador]; FieldByName('CANTIDAD').AsInteger := 1; Post; end; end; finally DocAux.Free; DocAux := NIL; end; end; procedure TfrPresupuestoCliente.TablaMemDetallesFilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept := (DataSet.FieldByName('TIPOCONCEPTO').AsString = 'PRECIO'); end; procedure TfrPresupuestoCliente.actAnadirPropiedadExecute(Sender: TObject); begin with TablaPropiedadesMem do begin Next; if EOF then Append else begin Prior; Insert; end; gridDetalles.SetFocus; end; end; procedure TfrPresupuestoCliente.actAnadirPropiedadUpdate(Sender: TObject); begin (Sender as TAction).Enabled := (Modo in [Anadir, Modificar]); end; procedure TfrPresupuestoCliente.actEliminarPropiedadExecute( Sender: TObject); begin if TablaPropiedadesMem.RecordCount = 0 then begin { Hacemos un cancel de la tabla por si el registro actual estuviera recien creado } TablaPropiedadesMem.Cancel; Exit; end; if (VerMensajePregunta(msgDatosBorrarPropiedad) <> IDYES) then Exit; TablaPropiedadesMem.Delete; end; procedure TfrPresupuestoCliente.actEliminarPropiedadUpdate( Sender: TObject); begin (Sender as TAction).Enabled := (Modo in [Anadir, Modificar]); end; procedure TfrPresupuestoCliente.AsignarNumPropiedad; var FDetallesBookmark : string; Contador : Integer; begin with TablaPropiedadesMem do begin DisableControls; FDetallesBookmark := Bookmark; try Contador := 0; First; while not EOF do begin Edit; FieldByName('NUMPROPIEDAD').AsInteger := Contador; Post; Contador := Contador + 1; Next; end; finally //FUltimaPropiedad := Contador - 1; EnableControls; Bookmark := FDetallesBookmark; end; end; end; procedure TfrPresupuestoCliente.PropiedadesAfterDelete(DataSet: TDataSet); begin AsignarNumPropiedad; end; procedure TfrPresupuestoCliente.actSubirExecute(Sender: TObject); var NumPropiedad : Integer; begin NumPropiedad := TablaPropiedadesMem.FieldByName('NUMPROPIEDAD').AsInteger; IntercambiarPropiedades(@TablaPropiedadesMem, NumPropiedad, NumPropiedad - 1); VistaPropiedades.DataController.RefreshExternalData; end; procedure TfrPresupuestoCliente.actSubirUpdate(Sender: TObject); begin with TablaPropiedadesMem do (Sender as TAction).Enabled := (Modo in [Anadir, Modificar]) and (FieldByName('NUMPROPIEDAD').AsInteger > 0); end; procedure TfrPresupuestoCliente.actBajarExecute(Sender: TObject); var NumPropiedad : Integer; begin NumPropiedad := TablaPropiedadesMem.FieldByName('NUMPROPIEDAD').AsInteger; IntercambiarPropiedades(@TablaPropiedadesMem, NumPropiedad, NumPropiedad + 1); VistaPropiedades.DataController.RefreshExternalData; end; procedure TfrPresupuestoCliente.actBajarUpdate(Sender: TObject); begin with TablaPropiedadesMem do (Sender as TAction).Enabled := (Modo in [Anadir, Modificar]) and (FieldByName('NUMPROPIEDAD').AsInteger < (VistaPropiedades.ViewData.CardCount - 1)); end; procedure TfrPresupuestoCliente.gridDetallesResize(Sender: TObject); begin if gridDetalles.ActiveView = VistaPropiedades then VistaPropiedades.OptionsView.CardWidth := (gridDetalles.Width - 40) div 2; end; procedure TfrPresupuestoCliente.pnlPreciosResize(Sender: TObject); begin with gridPrecios do begin RowCount := pnlGrid.Height div 18; end; end; procedure TfrPresupuestoCliente.TablaMemPropiedadesFilterRecord( DataSet: TDataSet; var Accept: Boolean); begin Accept := (DataSet.FieldByName('NUMCONCEPTO').AsInteger = Seccion.ItemIndex); end; procedure TfrPresupuestoCliente.SeccionPropertiesChange(Sender: TObject); begin if TablaPropiedadesMem.Active then TablaPropiedadesMem.First; Observaciones.Lines.Clear; case Seccion.ItemIndex of 0 : Observaciones.Lines.Text := FObservaciones1; 1 : Observaciones.Lines.Text := FObservaciones2; end; end; procedure TfrPresupuestoCliente.ObservacionesExit(Sender: TObject); begin case Seccion.ItemIndex of 0 : FObservaciones1 := Observaciones.Lines.Text; 1 : FObservaciones2 := Observaciones.Lines.Text; else FObservaciones1 := Observaciones.Lines.Text; end; end; procedure TfrPresupuestoCliente.VistaPropiedadesDBCardViewRow3CustomDrawCell( Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); begin if Length(AViewInfo.DisplayValue) > 32 then ACanvas.Font.Color := clRed; end; procedure TfrPresupuestoCliente.actAnadirDocumentoExecute(Sender: TObject); var FicheroOrigen : String; i : Integer; begin if OpenDialog1.Execute then begin for i:=0 to OpenDialog1.Files.Count - 1 do begin FicheroOrigen := OpenDialog1.Files.Strings[i]; if not esCadenaVacia(FicheroOrigen) then if not AnadirDocumento(FicheroOrigen) then VerMensaje(msgCliPreErrAnadirDoc); end; end; end; procedure TfrPresupuestoCliente.actElliminarDocumentoExecute(Sender: TObject); var cadena : String; i : Integer; begin if explo.InnerListView.SelCount > 1 then cadena := '¿Desea borrar estos documentos del presupuesto?' else cadena := '¿Desea borrar este documento del presupuesto?'; if (VerMensajePregunta(cadena) <> IDYES) then Exit; for i:=0 to explo.InnerListView.Items.Count - 1 do begin if explo.InnerListView.Items[i].Selected then begin cadena := GetPidlName(explo.GetItemAbsolutePIDL(i)); if not SysUtils.DeleteFile(cadena) then VerMensaje(msgCliPreErrEliminarDoc); end; end; end; function TfrPresupuestoCliente.AnadirDocumento(RutaDocumento: String): Boolean; var DireccionDestino: String; begin try Result := False; DireccionDestino := darRutaDocumentosPresupuesto + PathDelim + ExtractFileName(RutaDocumento); CopiarFichero(RutaDocumento, DireccionDestino); Result := True; finally end; end; procedure TfrPresupuestoCliente.HabilitarDocumentos; begin explo.Options.ShowNonFolders := True; explo.Root.CustomPath := darRutaDocumentosPresupuesto; JvChangeNotify1.Notifications.Clear; with JvChangeNotify1.Notifications.Add do begin Actions := [caChangeFileName, caChangeDirName]; Directory := explo.Root.CustomPath; end; JvChangeNotify1.Active := True; explo.Enabled := True; end; procedure TfrPresupuestoCliente.DeshabilitarDocumentos; begin JvChangeNotify1.Active := False; JvChangeNotify1.Notifications.Clear; explo.Enabled := False; explo.Options.ShowNonFolders := False; explo.Root.CustomPath := FRootDocumentos; end; function TfrPresupuestoCliente.darRutaDocumentosPresupuesto: Variant; begin Result := FRootDocumentos + FDirectorio; end; procedure TfrPresupuestoCliente.actAnadirDocumentoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := True; end; procedure TfrPresupuestoCliente.actElliminarDocumentoUpdate( Sender: TObject); begin (Sender as TAction).Enabled := explo.InnerListView.SelCount <> 0; end; procedure TfrPresupuestoCliente.pagNotasVariasResize(Sender: TObject); var Aux : Integer; begin Aux := pagNotasVarias.Height div 3; pnlFormasPago.Height := Aux; pnlPlazosEntrega.Height := Aux; pnlNota.Height := Aux; end; procedure TfrPresupuestoCliente.actAbrirDocumentoExecute(Sender: TObject); var FileHandle : Integer; cadena : String; begin if explo.InnerListView.SelCount <> 0 then begin cadena := GetPidlName(explo.GetItemAbsolutePIDL(explo.InnerListView.ItemFocused.Index)); ShellExecute(Handle, 'open', PAnsiChar(cadena), nil, nil, SW_SHOWNORMAL); end; end; procedure TfrPresupuestoCliente.actAbrirDocumentoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := explo.InnerListView.SelCount <> 0; end; procedure TfrPresupuestoCliente.JvChangeNotify1ChangeNotify( Sender: TObject; Dir: String; Actions: TJvChangeActions); begin Explo.Root.CustomPath := Explo.Root.CustomPath; end; function TfrPresupuestoCliente.CrearDirDocumentos: Boolean; var DireccionDestino: String; begin Result := False; DeshabilitarDocumentos; DireccionDestino := darRutaDocumentosPresupuesto; if not DirectoryExists(DireccionDestino) then CreateDir(DireccionDestino); HabilitarDocumentos; Result := True; end; procedure TfrPresupuestoCliente.ComprobarEstadoDirDocumentos; var RutaTemp, RutaFinal: String; begin if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin DeshabilitarDocumentos; Application.ProcessMessages; if Modo = Anadir then begin //Intentamos renombrar el directorio temporal por el real (si existiera) RutaTemp := darRutaDocumentosPresupuesto; FDirectorio := PathDelim + StringReplace(CodigoPresupuesto,'/','',[rfReplaceAll]); RutaFinal:= darRutaDocumentosPresupuesto; RenameFile(RutaTemp, RutaFinal); end; { Intentamos borrar el directorio de los documentos. Si está vacio se borrar y si no se queda } RemoveDir(darRutaDocumentosPresupuesto); Application.ProcessMessages; end; end; function TfrPresupuestoCliente.EliminarDirDocumentos: Boolean; begin Result := False; DeshabilitarDocumentos; Application.ProcessMessages; if DirectoryExists(darRutaDocumentosPresupuesto) then begin SysFunc.Deltree(darRutaDocumentosPresupuesto, True); Application.ProcessMessages; Result := DirectoryExists(darRutaDocumentosPresupuesto); end; end; function TfrPresupuestoCliente.darRutaPlanosPresupuesto: Variant; begin Result := FRootPlanos + FDirectorioPlanos; end; procedure TfrPresupuestoCliente.DeshabilitarPlanos; begin // end; procedure TfrPresupuestoCliente.HabilitarPlanos; begin tvPlanos.Directory := darRutaPlanosPresupuesto; end; procedure TfrPresupuestoCliente.tvPlanosStartScanning(Sender: TObject; Max: Integer); begin // end; procedure TfrPresupuestoCliente.tvPlanosStopScanning(Sender: TObject); begin // end; function TfrPresupuestoCliente.CrearDirPlanos: Boolean; var DireccionDestino: String; begin Result := False; DeshabilitarPlanos; DireccionDestino := darRutaPlanosPresupuesto; if not DirectoryExists(DireccionDestino) then CreateDir(DireccionDestino); HabilitarPlanos; Result := True; end; procedure TfrPresupuestoCliente.ComprobarEstadoDirPlanos; var RutaTemp, RutaFinal: String; begin if Entidad in [entPresupuestoCocina, entPresupuestoArmarios] then begin DeshabilitarPlanos; Application.ProcessMessages; if Modo = Anadir then begin //Intentamos renombrar el directorio temporal por el real (si existiera) RutaTemp := darRutaPlanosPresupuesto; FDirectorioPlanos := PathDelim + StringReplace(CodigoPresupuesto,'/','',[rfReplaceAll]); RutaFinal:= darRutaPlanosPresupuesto; RenameFile(RutaTemp, RutaFinal); end; { Intentamos borrar el directorio de los documentos. Si está vacio se borrar y si no se queda } RemoveDir(darRutaPlanosPresupuesto); Application.ProcessMessages; end; end; function TfrPresupuestoCliente.EliminarDirPlanos: Boolean; begin Result := False; DeshabilitarPlanos; Application.ProcessMessages; if DirectoryExists(darRutaPlanosPresupuesto) then begin SysFunc.Deltree(darRutaPlanosPresupuesto, True); Application.ProcessMessages; Result := DirectoryExists(darRutaPlanosPresupuesto); end; end; procedure TfrPresupuestoCliente.tvPlanosDblClick(Sender: TObject); begin if ShellExecute(Handle, nil, pchar(tvPlanos.SelectedFile), nil, nil, SW_SHOWNORMAL) <= 32 then Application.MessageBox('No se pudo visualizar el fichero', 'Error', MB_ICONEXCLAMATION); end; procedure TfrPresupuestoCliente.JvTrackBar1Change(Sender: TObject); begin tvPlanos.Size := JvTrackBar1.Position; end; procedure TfrPresupuestoCliente.actAnadirPlanoExecute(Sender: TObject); var FicheroOrigen : String; i : Integer; begin OpenDialog1.Filter := tvPlanos.Filter; try if OpenDialog1.Execute then begin for i:=0 to OpenDialog1.Files.Count - 1 do begin FicheroOrigen := OpenDialog1.Files.Strings[i]; if not esCadenaVacia(FicheroOrigen) then begin if not AnadirPlano(FicheroOrigen) then VerMensaje(msgCliPreErrAnadirDoc); end; end; end; finally OpenDialog1.Filter := ''; end; end; function TfrPresupuestoCliente.AnadirPlano(RutaPlano: String): Boolean; var DireccionDestino: String; begin try Result := False; DireccionDestino := darRutaPlanosPresupuesto + PathDelim + ExtractFileName(RutaPlano); CopiarFichero(RutaPlano, DireccionDestino); tvPlanos.AddFromFile(DireccionDestino); Result := True; finally end; end; procedure TfrPresupuestoCliente.actEliminarPlanoExecute(Sender: TObject); var cadena : String; i : Integer; begin cadena := '¿Desea borrar este plano del presupuesto?'; if (VerMensajePregunta(cadena) <> IDYES) then Exit; if not SysUtils.DeleteFile(tvPlanos.SelectedFile) then VerMensaje(msgCliPreErrEliminarDoc); tvPlanos.Delete(tvPlanos.Selected); end; procedure TfrPresupuestoCliente.actEliminarPlanoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := (Modo in [Anadir, Modificar]) and (Length(tvPlanos.SelectedFile) > 0); end; procedure TfrPresupuestoCliente.actRefrescarPlanoExecute(Sender: TObject); begin tvPlanos.Refresh; end; procedure TfrPresupuestoCliente.actAnadirPlanoUpdate(Sender: TObject); begin (Sender as TAction).Enabled := (Modo in [Anadir, Modificar]); end; procedure TfrPresupuestoCliente.actEliminarTodoPropiedadExecute(Sender: TObject); begin if (VerMensajePregunta(msgDeseaBorrarTodo) <> IDYES) then Exit; if Seccion.Visible then BorrarPropiedadesConcepto(Seccion.ItemIndex) else BorrarTabla(TablaPropiedadesMem); end; procedure TfrPresupuestoCliente.actEliminarTodoPropiedadUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (VistaPropiedades.ViewData.RecordCount = 0); end; end.