{ =============================================================================== Copyright (©) 2001. Rodax Software. =============================================================================== Los contenidos de este fichero son propiedad de Rodax Software titular del copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado, en su totalidad o en parte, con el permiso escrito de Rodax Software, o de acuerdo con los términos y condiciones establecidas en el acuerdo/contrato bajo el que se suministra. ----------------------------------------------------------------------------- Web: www.rodax-software.com =============================================================================== Fecha primera versión: 01-10-2001 Versión actual: 1.0.9 Fecha versión actual: 02-02-2005 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- 18-01-2002 Ordenar por descripción el grid de materiales. 07-04-2002 Adaptar todas las funciones a la transacción única. 06-05-2002 Adaptación al grid 'TdxDBGrid'. 27-05-2002 Cambio a un objeto contador (TContadorCliente) 21-10-2002 Se ha añadido el campo tipo de cliente 16-11-2002 p250. Poner el número total de clientes dados de alta en la inicialización del grid. 19-11-2003 p268. Cambiar funciones min y max cliente para que en lugar de devolverme el cliente con mayor o menor codigo me devuelva el cliente cuyo nombre seria el mayor o menor alfabeticamente. 06-03-2004 P272. Adaptación a multiempresa. 23-11-2004 p297. Solo sacar etiquetas de los clientes/proveedores etiquetados. 02-02-2005 p550. Añadimos funcion darCorreo =============================================================================== } unit TablaClientes; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, DBTables, DB, IBCustomDataSet, IBSQL, BaseDatos, IBDatabase, dxDBGrid, Contadores, Framework; type TDatosCliente = class(TObjeto) public Codigo : String; NIFCIF : String; Nombre : String; Calle : String; Numero : String; Piso : String; CodigoPostal : String; Poblacion : String; Provincia : String; Telefono1 : String; Telefono2 : String; Fax : String; Correo : String; PersonaContacto : String; Banco : String; Observaciones : String; TipoCliente: String; Iva : String; Descuento : String; constructor Create; overload; constructor Create(CodigoCliente : String); overload; procedure ObtenerDatos; override; procedure SalvarDatos; end; type TdmTablaClientes = class(TDataModule) private procedure IniciarSQL; public sqlInsertar : TStrings; sqlModificar : TStrings; sqlConsultar : TStrings; sqlEliminar : TStrings; sqlGrid : TStrings; //Metodos que llamaran a contador function DarNuevoCodigo : String; function IncrementarCodigo: boolean; function InsertarContador : boolean; function ValidarCodigo(Codigo : String) : Boolean; function FormatearCodigo(Codigo : String) : String; function DarDatosCliente(Cliente : TDatosCliente) : Boolean; function ExisteCodigo(Codigo : String) : Boolean; constructor Create (AOwner : TComponent); override; destructor Destroy; override; procedure InicializarGridClientes(var Grid: TdxDBGrid); function DarClienteMin : String; function DarClienteMax : String; function EtiquetarClientes(Codigos: TStringList; TipoOp: Integer): Boolean; function DarCorreo(Codigo: String): String; end; var dmTablaClientes: TdmTablaClientes; implementation {$R *.DFM} uses Mensajes, IB, StrFunc, Excepciones, dxDBCtrl, RdxGestorContadores, Constantes, dxGrClms; constructor TdmTablaClientes.Create (AOwner : TComponent); begin inherited; sqlInsertar := TStringList.Create; sqlModificar := TStringList.Create; sqlConsultar := TStringList.Create; sqlEliminar := TStringList.Create; sqlGrid := TStringList.Create; IniciarSQL; end; procedure TdmTablaClientes.IniciarSQL; begin with sqlInsertar do begin Add('insert into CLIENTES '); Add('(CODIGO, NIFCIF, NOMBRE, CALLE, NUMERO, PISO, '); Add('CODIGOPOSTAL, POBLACION, PROVINCIA, TELEFONO1, '); Add('TELEFONO2, FAX, CORREO, PERSONACONTACTO, '); Add('IVA, DESCUENTO, BANCO, OBSERVACIONES, TIPOCLIENTE, ETIQUETADO, '); Add('ULTIMOCAMBIO) '); Add('values (:CODIGO, :NIFCIF, :NOMBRE, :CALLE, :NUMERO, :PISO, '); Add(':CODIGOPOSTAL, :POBLACION, :PROVINCIA, :TELEFONO1, '); Add(':TELEFONO2, :FAX, :CORREO, :PERSONACONTACTO, '); Add(':IVA, :DESCUENTO, :BANCO, :OBSERVACIONES, :TIPOCLIENTE, :ETIQUETADO, '); Add('CURRENT_TIME)'); end; with sqlModificar do begin Add('update CLIENTES set '); Add('NIFCIF = :NIFCIF, '); Add('NOMBRE = :NOMBRE, '); Add('CALLE = :CALLE, '); Add('NUMERO = :NUMERO, '); Add('PISO = :PISO, '); Add('CODIGOPOSTAL = :CODIGOPOSTAL, '); Add('POBLACION = :POBLACION, '); Add('PROVINCIA = :PROVINCIA, '); Add('TELEFONO1 = :TELEFONO1, '); Add('TELEFONO2 = :TELEFONO2, '); Add('FAX = :FAX, '); Add('CORREO = :CORREO, '); Add('PERSONACONTACTO = :PERSONACONTACTO, '); Add('IVA = :IVA, '); Add('DESCUENTO = :DESCUENTO, '); Add('BANCO = :BANCO, '); Add('OBSERVACIONES = :OBSERVACIONES, '); Add('TIPOCLIENTE = :TIPOCLIENTE, '); Add('ETIQUETADO = :ETIQUETADO, '); Add('ULTIMOCAMBIO = CURRENT_TIME '); Add('where CODIGO = :CODIGO'); end; with sqlEliminar do begin Add('delete from CLIENTES '); Add('where CODIGO = :CODIGO'); end; with sqlConsultar do begin Add('select * from CLIENTES '); Add('where CODIGO = :CODIGO'); end; with sqlGrid do begin Add('select CODIGO, ETIQUETADO, NIFCIF, NOMBRE, TELEFONO1, FAX, CORREO '); Add('from CLIENTES'); Add('order by NOMBRE'); end; end; function TdmTablaClientes.DarNuevoCodigo : String; begin Result := GestorContadores.DarNuevoCodigo(contClientes); end; function TdmTablaClientes.IncrementarCodigo : boolean; begin Result := GestorContadores.IncrementarValor(contClientes); end; function TdmTablaClientes.FormatearCodigo(Codigo : String) : String; begin Result := GestorContadores.FormatearCodigo(contClientes, Codigo); end; destructor TdmTablaClientes.Destroy; begin sqlInsertar.Free; sqlModificar.Free; sqlConsultar.Free; sqlEliminar.Free; sqlGrid.Free; inherited; end; function TdmTablaClientes.ValidarCodigo(Codigo: String): Boolean; begin Result := GestorContadores.ValidarCodigo(contClientes, Codigo); end; function TdmTablaClientes.ExisteCodigo(Codigo: String): Boolean; var oSQL : TIBSQL; Contador : String; begin Result := False; if EsCadenaVacia(Codigo) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select CODIGO '); SQL.Add('from CLIENTES '); SQL.Add('where CODIGO = :CODIGO'); ParamByName('CODIGO').AsString := Codigo; try Prepare; ExecQuery; Contador := Fields[0].AsString; Result := (Codigo = Contador); finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaClientes.DarDatosCliente(Cliente: TDatosCliente): Boolean; var oSQL : TIBSQL; begin Result := False; if EsCadenaVacia(Cliente.Codigo) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select * from CLIENTES '); SQL.Add('where CODIGO = :CODIGO'); ParamByName('CODIGO').AsString := Cliente.Codigo; try Prepare; ExecQuery; // Compruebo si se han recuperado datos if (RecordCount > 0) then begin with Cliente do begin Nifcif := FieldByName('NIFCIF').AsString; Nombre := FieldByName('NOMBRE').AsString; Calle := FieldByName('CALLE').AsString; Numero := FieldByName('NUMERO').AsString; Piso := FieldByName('PISO').AsString; CodigoPostal := FieldByName('CODIGOPOSTAL').AsString; Poblacion := FieldByName('POBLACION').AsString; Provincia := FieldByName('PROVINCIA').AsString; Telefono1 := FieldByName('TELEFONO1').AsString; Telefono2 := FieldByName('TELEFONO2').AsString; Fax := FieldByName('FAX').AsString; Correo := FieldByName('CORREO').AsString; PersonaContacto := FieldByName('PERSONACONTACTO').AsString; Banco := FieldByName('BANCO').AsString; Observaciones := FieldByName('OBSERVACIONES').AsString; TipoCliente := FieldByName('TIPOCLIENTE').AsString; Iva := FieldByName('IVA').AsString; Descuento := FieldByName('DESCUENTO').AsString; Result := True; end; end; finally Close; Transaction := NIL; Free; end; end; end; procedure TdmTablaClientes.InicializarGridClientes(var Grid: TdxDBGrid); var Columna : TdxDBTreeListColumn; begin with Grid do begin DestroyColumns; ShowSummaryFooter := True; {Columna ETIQUETADO} Columna := CreateColumn(TdxDBGridImageColumn); Columna.FieldName := 'ETIQUETADO'; Columna.Caption := 'Etiquetado'; Columna.Width := 2; {Columna CODIGO} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'CODIGO'; Columna.Caption := 'Código'; Columna.Width := tamColCodigo; Columna.SummaryFooterType := cstCount; Columna.SummaryFooterFormat := 'Total: 0 clientes'; {Columna NIFCIF} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'NIFCIF'; Columna.Caption := 'NIF/CIF'; Columna.Width := tamColNIFCIF; {Columna NOMBRE} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'NOMBRE'; Columna.Caption := 'Nombre'; Columna.Width := tamColNombre; {Columna TELEFONO 1} Columna := CreateColumn(TdxDBTreeListColumn); Columna.FieldName := 'TELEFONO1'; Columna.Caption := 'Teléfono 1'; Columna.Width := tamColTelefono; {Columna FAX} Columna := CreateColumn(TdxDBTreeListColumn); Columna.Visible := True; Columna.FieldName := 'FAX'; Columna.Caption := 'Fax'; Columna.Width := tamColTelefono; {Columna CORREO} Columna := CreateColumn(TdxDBTreeListColumn); Columna.Visible := True; Columna.FieldName := 'CORREO'; Columna.Caption := 'Correo electrónico'; Columna.Width := tamColEMail; end; end; function TdmTablaClientes.InsertarContador: boolean; begin Result := GestorContadores.InsertarContador(contClientes); end; function TdmTablaClientes.DarClienteMax: String; var oSQL : TIBSQL; begin Result := ''; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion;; SQL.Add('select CODIGO '); SQL.Add('from CLIENTES '); SQL.Add('where NOMBRE = (select max(NOMBRE) from CLIENTES)'); try Prepare; ExecQuery; Result := Fields[0].AsString; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaClientes.DarClienteMin: String; var oSQL : TIBSQL; begin Result := ''; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion;; SQL.Add('select CODIGO '); SQL.Add('from CLIENTES '); SQL.Add('where NOMBRE = (select min(NOMBRE) from CLIENTES)'); try Prepare; ExecQuery; Result := Fields[0].AsString; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaClientes.etiquetarClientes(Codigos: TStringList; TipoOp: Integer): Boolean; var oSQL : TIBSQL; Cadena : String; i : Integer; begin Result := False; if Codigos.Count = 0 then Exit; //Preparamos la cadena para sql for i:=0 to Codigos.Count - 1 do begin if esCadenaVacia(Cadena) then Cadena := '''' + Codigos.Strings[i] + '''' else Cadena := Cadena + ', ''' + Codigos.Strings[i] + ''''; end; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; try SQL.Add('update CLIENTES '); if TipoOp = CTE_NOETIQUETAR then SQL.Add('set ETIQUETADO = 1 ') else SQL.Add('set ETIQUETADO = 0 '); SQL.Add('where CODIGO in ('); SQL.Add(Cadena); SQL.Add(')'); Prepare; ExecQuery; Result := True; finally Close; Transaction := NIL; Free; end; end; end; function TdmTablaClientes.DarCorreo(Codigo: String): String; var oSQL : TIBSQL; Contador : String; begin Result := ''; if EsCadenaVacia(Codigo) then Exit; oSQL := TIBSQL.Create(Self); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select CORREO '); SQL.Add('from CLIENTES '); SQL.Add('where CODIGO = :CODIGO'); ParamByName('CODIGO').AsString := Codigo; try Prepare; ExecQuery; Result := Fields[0].AsString; finally Close; Transaction := NIL; Free; end; end; end; { TDatosCliente } constructor TDatosCliente.Create; begin inherited Create; end; constructor TDatosCliente.Create(CodigoCliente: String); begin inherited Create; Codigo := CodigoCliente; // Recuperar los datos ObtenerDatos; end; procedure TDatosCliente.ObtenerDatos; var oSQL : TIBSQL; begin { if EsCadenaVacia(Codigo) and EsCadenaVacia(Nombre) then raise Exception.Create(msgCliFaltaCli);} oSQL := TIBSQL.Create(NIL); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SQL.Add('select * from CLIENTES '); if (not EsCadenaVacia(Codigo)) then begin SQL.Add('where CODIGO = :CODIGO'); ParamByName('CODIGO').AsString := Codigo; end else begin SQL.Add('where NOMBRE = :NOMBRE'); ParamByName('NOMBRE').AsString := Nombre; end; try Prepare; ExecQuery; // Compruebo si se han recuperado datos if (RecordCount > 0) then begin NIFCIF := FieldByName('NIFCIF').AsString; Nombre := FieldByName('NOMBRE').AsString; Observaciones := FieldByName('OBSERVACIONES').AsString; Calle := FieldByName('CALLE').AsString; Numero := FieldByName('NUMERO').AsString; Piso := FieldByName('PISO').AsString; CodigoPostal := FieldByName('CODIGOPOSTAL').AsString; Poblacion := FieldByName('POBLACION').AsString; Provincia := FieldByName('PROVINCIA').AsString; Telefono1 := FieldByName('TELEFONO1').AsString; Telefono2 := FieldByName('TELEFONO2').AsString; Fax := FieldByName('FAX').AsString; Correo := FieldByName('CORREO').AsString; PersonaContacto := FieldByName('PERSONACONTACTO').AsString; end; finally Close; Transaction := NIL; Free; end; end; end; procedure TDatosCliente.SalvarDatos; var oSQL : TIBSQL; begin oSQL := TIBSQL.Create(NIL); with oSQL do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; if EsCadenaVacia(Codigo) then begin Codigo := dmTablaClientes.DarNuevoCodigo; SQL.Assign(dmTablaClientes.sqlInsertar); end else SQL.Assign(dmTablaClientes.sqlModificar); ParamByName('CODIGO').AsString := Codigo; ParamByName('NIFCIF').AsString := NifCif; ParamByName('NOMBRE').AsString := Nombre; ParamByName('OBSERVACIONES').AsString := Observaciones; ParamByName('CALLE').AsString := Calle; ParamByName('NUMERO').AsString := Numero; ParamByName('PISO').AsString := Piso; ParamByName('CODIGOPOSTAL').AsString := CodigoPostal; ParamByName('POBLACION').AsString := Poblacion; ParamByName('PROVINCIA').AsString := Provincia; ParamByName('TELEFONO1').AsString := Telefono1; ParamByName('TELEFONO2').AsString := Telefono2; ParamByName('FAX').AsString := Fax; ParamByName('CORREO').AsString := Correo; ParamByName('PERSONACONTACTO').AsString := PersonaContacto; ParamByName('BANCO').AsString := Banco; ParamByName('TIPOCLIENTE').AsString := TipoCliente; ParamByName('IVA').AsString := IVA; ParamByName('DESCUENTO').AsString := Descuento; try Prepare; try ExecQuery; dmTablaClientes.IncrementarCodigo; except end; finally Close; Transaction := NIL; Free; end; end; end; end.