
SET SQL DIALECT 3; 

/* CREATE DATABASE '10.0.1.50/3055:appadvancepedidos' PAGE_SIZE 4096 DEFAULT CHARACTER SET WIN1252; */


/*  Generators or sequences */
CREATE GENERATOR GEN_CLIENTESDESCUENTOSWEB;
CREATE GENERATOR GEN_CLIENTESPRECIOSESPECIALES;

COMMIT WORK;

/* Table: AGENCIASTRANSPORTES, Owner: MICROLAND */
CREATE TABLE AGENCIASTRANSPORTES (EMPRESA INTEGER NOT NULL,
        AGENCIATRANSPORTE VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        SUCLIENTE VARCHAR(20),
        TELEFONO1 VARCHAR(15),
        TELEFONO2 VARCHAR(15),
        FAX VARCHAR(15),
        EMAIL VARCHAR(100),
        PERSONACONTACTO VARCHAR(40),
        CONTACTO INTEGER,
        MATRICULA VARCHAR(30),
        CONDUCTOR VARCHAR(40),
        OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        SEMIREMOLQUE VARCHAR(30),
        SIGLA VARCHAR(2) DEFAULT '',
        DOMICILIO VARCHAR(40),
        NUMERO INTEGER,
        ESCALERA VARCHAR(4),
        PISO VARCHAR(3),
        PUERTA VARCHAR(2),
        MANO VARCHAR(3),
        CODIGOPOSTAL VARCHAR(5),
        POBLACION VARCHAR(40),
        PROVINCIA VARCHAR(40),
        PAIS VARCHAR(40),
        NIF VARCHAR(15),
        TARA NUMERIC(15, 3) DEFAULT 0,
CONSTRAINT PK_AGENCIASTRANSPORTES PRIMARY KEY (EMPRESA, AGENCIATRANSPORTE));

/* Table: APKARTICULOS, Owner: MICROLAND */
CREATE TABLE APKARTICULOS (EMPRESA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        TIPO CHAR(1),
        FAMILIA VARCHAR(15),
        SUBFAMILIA VARCHAR(15),
        GRUPO VARCHAR(15),
        SUBGRUPO VARCHAR(15),
        ACTIVO SMALLINT DEFAULT 0 NOT NULL,
        IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        IMAGENPATH VARCHAR(100),
CONSTRAINT PK_APKARTICULOS PRIMARY KEY (EMPRESA, ARTICULO));

/* Table: APKARTICULOSFORMATOS, Owner: MICROLAND */
CREATE TABLE APKARTICULOSFORMATOS (EMPRESA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        FORMATO VARCHAR(5) NOT NULL,
        PREDETERMINADO SMALLINT DEFAULT 0 NOT NULL,
CONSTRAINT PK_APKARTICULOSFORMATOS PRIMARY KEY (EMPRESA, ARTICULO, FORMATO));

/* Table: APKAVISOS, Owner: MICROLAND */
CREATE TABLE APKAVISOS (EMPRESA INTEGER NOT NULL,
        ID INTEGER NOT NULL,
        PUNTO SMALLINT NOT NULL,
        MENSAJE BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        ORDEN INTEGER DEFAULT 0 NOT NULL,
        FONDO VARCHAR(15) default 'Danger' NOT NULL,
CONSTRAINT PK_APKAVISOS PRIMARY KEY (EMPRESA, ID, PUNTO));

/* Table: APKAVISOSARTICULOS, Owner: MICROLAND */
CREATE TABLE APKAVISOSARTICULOS (EMPRESA INTEGER NOT NULL,
        ID INTEGER NOT NULL,
        PUNTO SMALLINT NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        MENSAJE BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        ORDEN INTEGER DEFAULT 0 NOT NULL,
        FONDO VARCHAR(15) default 'Danger' NOT NULL,
CONSTRAINT PK_APKAVISOSARTICULOS PRIMARY KEY (EMPRESA, ID, PUNTO));

/* Table: APKAVISOSCLIENTES, Owner: MICROLAND */
CREATE TABLE APKAVISOSCLIENTES (EMPRESA INTEGER NOT NULL,
        ID INTEGER NOT NULL,
        PUNTO SMALLINT NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        MENSAJE BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        ORDEN INTEGER DEFAULT 0 NOT NULL,
        FONDO VARCHAR(15) default 'Danger' NOT NULL,
CONSTRAINT PK_APKAVISOSCLIENTES PRIMARY KEY (EMPRESA, ID, PUNTO));

/* Table: APKAVISOSCONFIRMADOS, Owner: MICROLAND */
CREATE TABLE APKAVISOSCONFIRMADOS (EMPRESA INTEGER NOT NULL,
        ID INTEGER NOT NULL,
        PUNTO SMALLINT NOT NULL,
        USUARIO VARCHAR(64) NOT NULL,
CONSTRAINT PK_APKAVISOSCONFIRMADOS PRIMARY KEY (EMPRESA, ID, PUNTO, USUARIO));

/* Table: APKCLIENTES, Owner: MICROLAND */
CREATE TABLE APKCLIENTES (EMPRESA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        EMAIL VARCHAR(100),
        MOSTRARDESCUENTO1 SMALLINT DEFAULT 0,
        MOSTRARDESCUENTO2 SMALLINT DEFAULT 0,
        MOSTRARDESCUENTO3 SMALLINT DEFAULT 0,
        MOSTRARPRECIO SMALLINT DEFAULT 0,
        TIPOFACTURACION VARCHAR(5),
        DELEGACION VARCHAR(3),
        ALMACEN VARCHAR(3),
CONSTRAINT PK_APKCLIENTES PRIMARY KEY (EMPRESA, CLIENTE, OBRA));

/* Table: APKFAMILIAS, Owner: MICROLAND */
CREATE TABLE APKFAMILIAS (EMPRESA INTEGER NOT NULL,
        FAMILIA VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 80,
CONSTRAINT PK_APKFAMILIAS PRIMARY KEY (EMPRESA, FAMILIA));

/* Table: APKFORMATOS, Owner: MICROLAND */
CREATE TABLE APKFORMATOS (EMPRESA INTEGER NOT NULL,
        FORMATO VARCHAR(5) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        NUMEROMULTIPLOS INTEGER DEFAULT 0 NOT NULL,
        MULTIPLO1 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        MULTIPLO2 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        MULTIPLO3 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        DESCRIPCIONCORTA VARCHAR(8) DEFAULT '' NOT NULL,
CONSTRAINT PK_APKFORMATOS PRIMARY KEY (EMPRESA, FORMATO));

/* Table: APKGRUPOS, Owner: MICROLAND */
CREATE TABLE APKGRUPOS (EMPRESA INTEGER NOT NULL,
        GRUPO VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 80,
CONSTRAINT PK_APKGRUPOS PRIMARY KEY (EMPRESA, GRUPO));

/* Table: APKPEDIDODETALLE, Owner: MICROLAND */
CREATE TABLE APKPEDIDODETALLE (EMPRESA INTEGER NOT NULL,
        PEDIDO INTEGER NOT NULL,
        PROVEEDOR VARCHAR(15) NOT NULL,
        LINEA INTEGER NOT NULL,
        ARTICULO VARCHAR(32),
        UNIDADES DECIMAL(15, 3) DEFAULT 0 NOT NULL,
        NUMEROMULTIPLOS INTEGER DEFAULT 0 NOT NULL,
        MULTIPLO1 DECIMAL(15, 3) DEFAULT 0 NOT NULL,
        MULTIPLO2 DECIMAL(15, 3) DEFAULT 0 NOT NULL,
        MULTIPLO3 DECIMAL(15, 3) DEFAULT 0 NOT NULL,
        CANTIDAD NUMERIC(15, 3) DEFAULT 0,
        PRECIO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        DESCUENTO1 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DESCUENTO2 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DESCUENTO3 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        IMPORTE DECIMAL(15, 2) DEFAULT 0 NOT NULL,
        OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        TALLA VARCHAR(5),
        COLOR VARCHAR(5),
        FECHAHORALTA TIMESTAMP,
        FECHAHORMODIFICACION TIMESTAMP,
        DESCUENTO4 NUMERIC(5, 3),
        DESCUENTO5 NUMERIC(5, 3),
        PORCIVA NUMERIC(5, 3),
        CUOTAIVA NUMERIC(5, 3),
        PORCRECARGO NUMERIC(5, 3),
        CUOTARECARGO NUMERIC(5, 3),
        PORCRETENCION NUMERIC(5, 3),
        CUOTARETENCION NUMERIC(5, 3),
        BASEIMPONIBLE NUMERIC(5, 3),
        IMPORTEBRUTO NUMERIC(5, 3),
        FORMATO VARCHAR(5),
        ESTADO SMALLINT DEFAULT 1 NOT NULL,
CONSTRAINT PK_APKPEDIDOSDETALLE PRIMARY KEY (EMPRESA, PEDIDO, PROVEEDOR, LINEA));

/* Table: APKPEDIDOS, Owner: MICROLAND */
CREATE TABLE APKPEDIDOS (EMPRESA INTEGER NOT NULL,
        PEDIDO INTEGER NOT NULL,
        PROVEEDOR VARCHAR(15) NOT NULL,
        FECHA DATE NOT NULL,
        HORA TIME NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        FECHAHORALTA TIMESTAMP,
        FECHAHORMODIFICACION TIMESTAMP,
        ESTADO SMALLINT DEFAULT 0 NOT NULL,
        ESTADOSITUACION VARCHAR(5) DEFAULT '' NOT NULL,
        USUARIOALTA VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAALTA DATE,
        USUARIOHORAALTA TIME,
        USUARIOMODIFICACION VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAMODIFICACION DATE,
        USUARIOHORAMODIFICACION TIME,
CONSTRAINT PK_APKPEDIDOS PRIMARY KEY (EMPRESA, PEDIDO, PROVEEDOR));

/* Table: APKSUBFAMILIAS, Owner: MICROLAND */
CREATE TABLE APKSUBFAMILIAS (EMPRESA INTEGER NOT NULL,
        SUBFAMILIA VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 80,
CONSTRAINT PK_APKSUBFAMILIAS PRIMARY KEY (EMPRESA, SUBFAMILIA));

/* Table: APKSUBGRUPOS, Owner: MICROLAND */
CREATE TABLE APKSUBGRUPOS (EMPRESA INTEGER NOT NULL,
        SUBGRUPO VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 80,
CONSTRAINT PK_APKSUBGRUPOS PRIMARY KEY (EMPRESA, SUBGRUPO));

/* Table: APKTRANSPORTISTAS, Owner: MICROLAND */
CREATE TABLE APKTRANSPORTISTAS (EMPRESA INTEGER NOT NULL,
        USUARIO VARCHAR(32) NOT NULL,
        AGENCIATRANSPORTE VARCHAR(15) NOT NULL,
        APLICACION VARCHAR(100) DEFAULT 'winclassadvancesign' NOT NULL,
        PDA INTEGER,
CONSTRAINT PK_APKTRANSPORTISTAS PRIMARY KEY (EMPRESA, USUARIO, AGENCIATRANSPORTE));

/* Table: APKUSUARIOS, Owner: MICROLAND */
CREATE TABLE APKUSUARIOS (EMPRESA INTEGER NOT NULL,
        USUARIO VARCHAR(64) NOT NULL,
        CLAVE VARCHAR(32) NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        DELEGACION VARCHAR(3),
        ALMACEN VARCHAR(3),
        TIPOFACTURACION VARCHAR(5),
        FORMAPAGO VARCHAR(5),
        TIPOIMPUESTO SMALLINT DEFAULT 0 NOT NULL,
        RETENCION NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DTOPP NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DTOCOMERCIAL NUMERIC(5, 2) DEFAULT 0 NOT NULL,
CONSTRAINT PK_APKUSUARIOS PRIMARY KEY (EMPRESA, USUARIO));

/* Table: APKUSUARIOSFAVORITOS, Owner: MICROLAND */
CREATE TABLE APKUSUARIOSFAVORITOS (EMPRESA INTEGER NOT NULL,
        USUARIO VARCHAR(64) NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
CONSTRAINT PK_APKUSUARIOSFAVORITOS PRIMARY KEY (EMPRESA, USUARIO, ARTICULO));

/* Table: ARTICULOS, Owner: MICROLAND */
CREATE TABLE ARTICULOS (EMPRESA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        DESCRIPCION VARCHAR(100) NOT NULL,
        DESCRIPCIONAMPLIADA BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        FECHAALTA DATE NOT NULL,
        FECHAACTUALIZACION DATE NOT NULL,
        ESTADO VARCHAR(14),
        PROVEEDOR VARCHAR(14),
        IVACOMPRAS VARCHAR(5),
        IVAVENTAS VARCHAR(5),
        TIPO VARCHAR(5),
        INCLUIRTARIFA SMALLINT DEFAULT 0 NOT NULL,
        CADUCIDADES SMALLINT DEFAULT 0 NOT NULL,
        PRECIONETO SMALLINT DEFAULT 0 NOT NULL,
        UNIDADVENTA VARCHAR(5),
        UNIDADCOMPRA VARCHAR(5),
        BONIFICACIONCOMPRA VARCHAR(5),
        BONIFICACIONVENTA VARCHAR(5),
        TEMPORADA VARCHAR(5),
        PRECIODEFECTO SMALLINT DEFAULT 0 NOT NULL,
        OBSERVACIONES BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        WEBDESCRIPCION VARCHAR(100),
        WEBDESCRIPCIONAMPL BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        WEBFICHATECNICA BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        WEBACTD SMALLINT DEFAULT 0 NOT NULL,
        WEBACTA SMALLINT DEFAULT 0 NOT NULL,
        PVUNIDADES NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        PVPRECIO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        PVPESO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        PRECIOVALORACION CHAR(1),
        FAMILIA VARCHAR(15),
        SUBFAMILIA VARCHAR(15),
        GRUPO VARCHAR(15),
        SUBGRUPO VARCHAR(15),
        MARCA VARCHAR(15),
        LOTES SMALLINT DEFAULT 0 NOT NULL,
        SERIES SMALLINT DEFAULT 0 NOT NULL,
        TALLAS SMALLINT DEFAULT 0 NOT NULL,
        COLORES SMALLINT DEFAULT 0 NOT NULL,
        MULTIUBICACIONES SMALLINT DEFAULT 0 NOT NULL,
        ACTUALIZASTOCK SMALLINT DEFAULT 1 NOT NULL,
        IMAGEN INTEGER DEFAULT 0 NOT NULL,
        PRECIOMEDIOCOMPRA NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        PRECIOMEDIOVENTA NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        SECUENCIA VARCHAR(32),
        MEDIDAS VARCHAR(15),
        REFERENCIAPRECIO VARCHAR(15),
        PESO NUMERIC(15, 4) DEFAULT 0 NOT NULL,
        NOAPLICARDTOPP SMALLINT DEFAULT 0 NOT NULL,
        NOAPLICARDTOCLTE SMALLINT DEFAULT 0 NOT NULL,
        NOAPLICARDTOPROV SMALLINT DEFAULT 0 NOT NULL,
        ORIGEN VARCHAR(10),
        CATEGORIA VARCHAR(10),
        VARIEDAD VARCHAR(10),
        CALIBRE VARCHAR(10),
        ETIQUETA SMALLINT DEFAULT 0 NOT NULL,
        B2B SMALLINT DEFAULT 1 NOT NULL,
        B2C SMALLINT DEFAULT 1 NOT NULL,
        NOAPLICARRETENCION SMALLINT DEFAULT 0 NOT NULL,
        FACTOR1 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        FACTOR2 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        CODIGOBARRAS VARCHAR(32),
        CODIGOPROVEEDOR VARCHAR(32),
        CODIGOEDI VARCHAR(32),
        CODIGOFARMACIA VARCHAR(32),
        CODIGOBALANZA VARCHAR(32),
        CODIGOOTROS VARCHAR(32),
        EXISTENCIA NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        INCLUIRTABLET SMALLINT DEFAULT 1 NOT NULL,
        TRANSPORTEONU VARCHAR(40),
        TRANSPORTEDENOMINACION VARCHAR(40),
        TRANSPORTEETIQUETA VARCHAR(40),
        TRANSPORTEGRUPOEMBALAJE VARCHAR(40),
        TRANSPORTETIPOBULTO VARCHAR(40),
        TRANSPORTEPESO NUMERIC(15, 3),
        TRAZABILIDADAUTOMATICA SMALLINT DEFAULT 0 NOT NULL,
        GRUPOINCREMENTO VARCHAR(15),
        PUNTOVERDE NUMERIC(15, 5) DEFAULT 0,
        BOUTIQUETEMPORADA VARCHAR(30),
        BOUTIQUETIPO VARCHAR(30),
        BOUTIQUEMODELO VARCHAR(30),
        BOUTIQUESERIE VARCHAR(30),
        BOUTIQUECOLOR VARCHAR(30),
        BOUTIQUETALLA VARCHAR(30),
        BOUTIQUECOLORPROV VARCHAR(30),
        LICORESGRADOS NUMERIC(15, 3),
        LICORESCC NUMERIC(15, 3),
        LICORESTIPO VARCHAR(2) DEFAULT '00',
        LICORESTIPOPRODUCTO VARCHAR(1) DEFAULT 'V',
        LICORESLIBRO SMALLINT DEFAULT 0,
        OSCOMMERCE INTEGER DEFAULT 0 NOT NULL,
        DESCRIPCIONENRIQUECIDA BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        ADJUNTOS SMALLINT DEFAULT 0 NOT NULL,
        RAEE NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        GESTIONMANUALEXISTENCIAMINIMA SMALLINT DEFAULT 0 NOT NULL,
        GESTIONMANUALEXISTENCIAMAXIMA SMALLINT DEFAULT 0 NOT NULL,
        TPV SMALLINT DEFAULT 1 NOT NULL,
        CLASIFICACION VARCHAR(15),
        FAMILIADESCUENTO VARCHAR(40),
CONSTRAINT PK_ARTICULOS PRIMARY KEY (EMPRESA, ARTICULO));

/* Table: ARTICULOSACCESOS, Owner: MICROLAND */
CREATE TABLE ARTICULOSACCESOS (EMPRESA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        TIPO CHAR(1) NOT NULL,
        CODIGOADICIONAL VARCHAR(32) NOT NULL,
        PREDETERMINADO SMALLINT DEFAULT 0 NOT NULL,
        DESCRIPCION VARCHAR(40),
        PROVEEDOR VARCHAR(14) DEFAULT NULL,
        UNIDADESEMBALAJE NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        EMBALAJE VARCHAR(5),
CONSTRAINT PK_ARTICULOSACCESOS PRIMARY KEY (EMPRESA, ARTICULO, TIPO, CODIGOADICIONAL));

/* Table: ARTICULOSDESCUENTOSCANTIDAD, Owner: MICROLAND */
CREATE TABLE ARTICULOSDESCUENTOSCANTIDAD (EMPRESA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        CANTIDAD NUMERIC(15, 2) NOT NULL,
        DESCUENTO NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        INDEFINIDO SMALLINT DEFAULT 0 NOT NULL,
        FECHAINICIAL DATE,
        FECHAFINAL DATE,
        TIPO VARCHAR(10),
CONSTRAINT PK_ARTICULOSDESCUENTOSCANTIDAD PRIMARY KEY (EMPRESA, ARTICULO, CANTIDAD));

/* Table: ARTICULOSPRECIOSCANTIDAD, Owner: MICROLAND */
CREATE TABLE ARTICULOSPRECIOSCANTIDAD (EMPRESA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        CANTIDAD NUMERIC(15, 3) NOT NULL,
        PRECIO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        INDEFINIDO SMALLINT DEFAULT 0 NOT NULL,
        FECHAINICIAL DATE,
        FECHAFINAL DATE,
        TIPO VARCHAR(10),
CONSTRAINT PK_ARTICULOSPRECIOSCANTIDAD PRIMARY KEY (EMPRESA, ARTICULO, CANTIDAD));

/* Table: CLIENTES, Owner: MICROLAND */
CREATE TABLE CLIENTES (EMPRESA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        DELEGACION VARCHAR(3) DEFAULT '000' NOT NULL,
        CUENTA VARCHAR(14),
        NOMBRE VARCHAR(40),
        RAZONSOCIAL VARCHAR(40),
        SIGLA VARCHAR(2) DEFAULT '',
        DOMICILIO VARCHAR(40),
        NUMERO INTEGER,
        ESCALERA VARCHAR(4),
        PISO VARCHAR(3),
        PUERTA VARCHAR(2),
        MANO VARCHAR(3),
        CODIGOPOSTAL VARCHAR(5),
        POBLACION VARCHAR(40),
        PROVINCIA VARCHAR(40),
        PAIS VARCHAR(40),
        NIF VARCHAR(15),
        TELEFONO1 VARCHAR(15),
        EXTENSION1 VARCHAR(15),
        TELEFONO2 VARCHAR(15),
        EXTENSION2 VARCHAR(15),
        FAX VARCHAR(15),
        MOVIL VARCHAR(15),
        EMAIL VARCHAR(100),
        WEB VARCHAR(200),
        PERSONACONTACTO VARCHAR(40),
        DTOPP NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DTOCOMERCIAL NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DTOPRODUCTO NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        RETENCION VARCHAR(5),
        RETENCIONBASETOTAL SMALLINT DEFAULT 0 NOT NULL,
        FORMAPAGO VARCHAR(5),
        DIAPAGO1 INTEGER DEFAULT 0 NOT NULL,
        DIAPAGO2 INTEGER DEFAULT 0 NOT NULL,
        DIAPAGO3 INTEGER DEFAULT 0 NOT NULL,
        SWIFT VARCHAR(11),
        CCC0 VARCHAR(4),
        CCC1 VARCHAR(4),
        CCC2 VARCHAR(4),
        CCC3 VARCHAR(2),
        CCC4 VARCHAR(10),
        ESTADO VARCHAR(5),
        TARIFA SMALLINT DEFAULT 1 NOT NULL,
        GRUPODESCUENTO VARCHAR(5),
        GRUPOPRECIO VARCHAR(5),
        FACTURAPORALBARAN SMALLINT DEFAULT 0 NOT NULL,
        FACTURAPOROBRA SMALLINT DEFAULT 0 NOT NULL,
        IMPRESIONDETALLADA SMALLINT DEFAULT 1 NOT NULL,
        COPIASFACTURA SMALLINT DEFAULT 1 NOT NULL,
        COPIASALBARAN SMALLINT DEFAULT 1 NOT NULL,
        CREDITOCAUCION SMALLINT DEFAULT 0 NOT NULL,
        CREDITOCAUCIONCLASIFICACION VARCHAR(40),
        CREDITOCAUCIONRIESGOMAXIMO NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        CREDITOCAUCIONRIESGOCURSO NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        CREDITOCAUCIONAVISO CHAR(1) DEFAULT 'N',
        CREDITOCAUCIONDIAS INTEGER DEFAULT 0 NOT NULL,
        CREDITOCAUCIONEXCESODIAS SMALLINT DEFAULT 0 NOT NULL,
        CREDITOCAUCIONCLIENTE SMALLINT DEFAULT 0 NOT NULL,
        CREDITOCAUCIONNUMEROASEGURADORA VARCHAR(15),
        CREDITOCAUCIONIMPORTECONTRATADO NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        CREDITOCAUCIONRIESGOMAXIMO2 NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        CREDITOCAUCIONRIESGOCURSO2 NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        CREDITOCAUCIONAVISO2 CHAR(1) DEFAULT 'N',
        CREDITOCAUCIONDIAS2 INTEGER DEFAULT 0 NOT NULL,
        AGENTE VARCHAR(15),
        FECHAALTA DATE NOT NULL,
        FECHAACTUALIZACION DATE NOT NULL,
        LIBREA1 VARCHAR(40),
        LIBREA2 VARCHAR(40),
        LIBREA3 VARCHAR(40),
        LIBREA4 VARCHAR(40),
        LIBREA5 VARCHAR(40),
        LIBREN1 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        LIBREN2 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        LIBREN3 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        LIBREN4 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        LIBREN5 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        CONTACTO INTEGER DEFAULT 0 NOT NULL,
        ADJUNTO INTEGER DEFAULT 0 NOT NULL,
        OBSERVACIONES BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        PORTES CHAR(1) DEFAULT 'D' NOT NULL,
        AGENCIATRANSPORTE CHAR(15),
        TIPOIMPUESTO SMALLINT DEFAULT 0 NOT NULL,
        ZONA VARCHAR(5),
        RUTA VARCHAR(5),
        SECTOR VARCHAR(5),
        CONDICIONESPROPIAS SMALLINT DEFAULT 0 NOT NULL,
        IDENTIFICADORELECTRONICO VARCHAR(32),
        DOCUMENTOPREDETERMINADO SMALLINT DEFAULT 0 NOT NULL,
        OBRAAFACTURAR INTEGER DEFAULT 0 NOT NULL,
        FACTOR NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        EMAILFACTURACION VARCHAR(100),
        EMAILFACTURACIONALTERNATIVO VARCHAR(100),
        TIPO CHAR(1) DEFAULT 'H' NOT NULL,
        FACTURARPADRE SMALLINT DEFAULT 0 NOT NULL,
        CONTRATOACTIVO SMALLINT DEFAULT 0 NOT NULL,
        CONTRATOACTUALIZACIONES INTEGER DEFAULT 0 NOT NULL,
        REFERENCIACLIENTE VARCHAR(25),
        CLIENTECADENA VARCHAR(14),
        CLIENTEPRECIOS VARCHAR(14),
        PORCENTAJERAPPEL NUMERIC(5, 2),
        PORCENTAJEPUBLICIDAD NUMERIC(5, 2),
        ULTIMAVENTA DATE,
        ULTIMAVISITA DATE,
        DIASAVISO INTEGER DEFAULT 0 NOT NULL,
        AVISOULTIMAVENTA VARCHAR(200),
        ADJUNTOS SMALLINT DEFAULT 0 NOT NULL,
        SMS VARCHAR(15),
        LOGO INTEGER DEFAULT 0 NOT NULL,
        NIVEL VARCHAR(5),
CONSTRAINT PK_CLIENTES PRIMARY KEY (EMPRESA, CLIENTE, OBRA));

/* Table: CLIENTESDESCUENTOSCANTIDAD, Owner: MICROLAND */
CREATE TABLE CLIENTESDESCUENTOSCANTIDAD (EMPRESA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        CANTIDAD NUMERIC(15, 2) NOT NULL,
        DESCUENTO NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        INDEFINIDO SMALLINT DEFAULT 0 NOT NULL,
        FECHAINICIAL DATE,
        FECHAFINAL DATE,
CONSTRAINT PK_CLIENTESDESCUENTOSCANTIDAD PRIMARY KEY (EMPRESA, CLIENTE, OBRA, ARTICULO, CANTIDAD));

/* Table: CLIENTESDESCUENTOSESPECIALES, Owner: MICROLAND */
CREATE TABLE CLIENTESDESCUENTOSESPECIALES (EMPRESA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        NUMERO INTEGER NOT NULL,
        ARTICULO VARCHAR(32),
        FAMILIA VARCHAR(15),
        SUBFAMILIA VARCHAR(15),
        GRUPO VARCHAR(15),
        SUBGRUPO VARCHAR(15),
        DESCUENTO1 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DESCUENTO2 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DESCUENTO3 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DESCUENTO4 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        DESCUENTO5 NUMERIC(5, 2) DEFAULT 0 NOT NULL,
        INDEFINIDO SMALLINT,
        FECHAINICIAL DATE,
        FECHAFINAL DATE,
        NUMEROPADRE INTEGER,
        ORIGEN VARCHAR(5),
CONSTRAINT PK_CLIENTESDESCUENTOSESPECIALES PRIMARY KEY (EMPRESA, CLIENTE, OBRA, NUMERO));

/* Table: CLIENTESDESCUENTOSIMPORTE, Owner: MICROLAND */
CREATE TABLE CLIENTESDESCUENTOSIMPORTE (EMPRESA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        DELEGACION VARCHAR(3) NOT NULL,
        TARIFA INTEGER NOT NULL,
        IMPORTEDESCUENTO NUMERIC(15, 2) DEFAULT 0 NOT NULL,
        PORCENTAJEDESCUENTO NUMERIC(5, 2) DEFAULT 0,
        INDEFINIDO SMALLINT DEFAULT 0 NOT NULL,
        FECHAINICIAL DATE,
        FECHAFINAL DATE,
        NETO SMALLINT DEFAULT 0 NOT NULL,
        OBSERVACIONES BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
CONSTRAINT PK_CLIENTESDESCUENTOSIMPORTE PRIMARY KEY (EMPRESA, CLIENTE, OBRA, DELEGACION, TARIFA));

/* Table: CLIENTESDESCUENTOSWEB, Owner: MICROLAND */
CREATE TABLE CLIENTESDESCUENTOSWEB (EMPRESA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        NUMERO INTEGER NOT NULL,
        ARTICULO VARCHAR(32),
        FAMILIA VARCHAR(15),
        SUBFAMILIA VARCHAR(15),
        GRUPO VARCHAR(15),
        SUBGRUPO VARCHAR(15),
        DESCUENTO NUMERIC(5, 2) DEFAULT 0 NOT NULL,
CONSTRAINT PK_CLIENTESDESCUENTOSWEB PRIMARY KEY (EMPRESA, CLIENTE, OBRA, NUMERO));

/* Table: CLIENTESTARIFASPRECIOSNETOS, Owner: MICROLAND */
CREATE TABLE CLIENTESTARIFASPRECIOSNETOS (EMPRESA INTEGER NOT NULL,
        TARIFA INTEGER NOT NULL,
        CLIENTE VARCHAR(14) NOT NULL,
        OBRA INTEGER DEFAULT 0 NOT NULL,
        USUARIOALTA VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAALTA DATE,
        USUARIOHORAALTA TIME,
        USUARIOMODIFICACION VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAMODIFICACION DATE,
        USUARIOHORAMODIFICACION TIME,
CONSTRAINT PK_CLIENTESTARIFASPRECIOSNETOS PRIMARY KEY (EMPRESA, TARIFA, CLIENTE, OBRA));

/* Table: COLORES, Owner: MICROLAND */
CREATE TABLE COLORES (EMPRESA INTEGER NOT NULL,
        COLOR VARCHAR(5) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        CODIGOCOLOR VARCHAR(10) DEFAULT 0,
        ORDEN INTEGER DEFAULT 0 NOT NULL,
CONSTRAINT PK_COLORES PRIMARY KEY (EMPRESA, COLOR));

/* Table: DELEGACIONES, Owner: MICROLAND */
CREATE TABLE DELEGACIONES (EMPRESA INTEGER NOT NULL,
        DELEGACION VARCHAR(3) NOT NULL,
        NOMBRE VARCHAR(40) NOT NULL,
        SIGLA VARCHAR(2),
        DOMICILIO VARCHAR(40),
        NUMERO INTEGER,
        ESCALERA VARCHAR(4),
        PISO VARCHAR(3),
        PUERTA VARCHAR(2),
        MANO VARCHAR(3),
        POBLACION VARCHAR(40),
        CODIGOPOSTAL VARCHAR(5),
        PROVINCIA VARCHAR(40),
        PAIS VARCHAR(40),
        TELEFONO1 VARCHAR(15),
        TELEFONO2 VARCHAR(15),
        FAX VARCHAR(15),
        EMAIL VARCHAR(100),
        PRECIOSVENTAPROPIOS SMALLINT DEFAULT 0 NOT NULL,
        PRECIOSCOMPRAPROPIOS SMALLINT DEFAULT 0 NOT NULL,
        CONTACTOS INTEGER,
        ADJUNTO INTEGER,
CONSTRAINT PK_DELEGACIONES PRIMARY KEY (EMPRESA, DELEGACION));

/* Table: FAMILIAS, Owner: MICROLAND */
CREATE TABLE FAMILIAS (EMPRESA INTEGER NOT NULL,
        FAMILIA VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        IMAGEN INTEGER DEFAULT 0 NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        OSCOMMERCE INTEGER DEFAULT 0,
        MARGENMINIMO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        MARGENMAXIMO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        FECHAALTA DATE,
CONSTRAINT PK_FAMILIAS PRIMARY KEY (EMPRESA, FAMILIA));

/* Table: GRUPOS, Owner: MICROLAND */
CREATE TABLE GRUPOS (EMPRESA INTEGER NOT NULL,
        GRUPO VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        IMAGEN INTEGER DEFAULT 0 NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        OSCOMMERCE INTEGER DEFAULT 0,
CONSTRAINT PK_GRUPOS PRIMARY KEY (EMPRESA, GRUPO));

/* Table: OFERTASVENTA, Owner: MICROLAND */
CREATE TABLE OFERTASVENTA (EMPRESA INTEGER NOT NULL,
        DELEGACION VARCHAR(3) NOT NULL,
        OFERTA INTEGER NOT NULL,
        TARIFA SMALLINT DEFAULT 0 NOT NULL,
        DESCRIPCION VARCHAR(40),
        FECHAINICIO DATE,
        FECHAFIN DATE,
CONSTRAINT PK_OFERTASVENTA PRIMARY KEY (EMPRESA, DELEGACION, OFERTA));

/* Table: OFERTASVENTADETALLE, Owner: MICROLAND */
CREATE TABLE OFERTASVENTADETALLE (EMPRESA INTEGER NOT NULL,
        DELEGACION VARCHAR(3) NOT NULL,
        OFERTA INTEGER DEFAULT 0 NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        PRECIO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        NOAPLICARDTOPP SMALLINT DEFAULT 0 NOT NULL,
        NOAPLICARDTOCLTE SMALLINT DEFAULT 0 NOT NULL,
        PRECIONETO SMALLINT DEFAULT 0 NOT NULL,
CONSTRAINT PK_OFERTASVENTADETALLE PRIMARY KEY (EMPRESA, DELEGACION, OFERTA, ARTICULO));

/* Table: SISTEMACFGDOCUMENTOS, Owner: MICROLAND */
CREATE TABLE SISTEMACFGDOCUMENTOS (TIPODOC SMALLINT DEFAULT 0 NOT NULL,
        NOMBRE VARCHAR(15) DEFAULT '' NOT NULL,
        DESCRIPCION VARCHAR(40) DEFAULT '' NOT NULL,
        DEUSUARIO SMALLINT DEFAULT 1 NOT NULL,
        DISENYO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        DOTMATRIX SMALLINT DEFAULT 0,
        COPIAS SMALLINT DEFAULT 0);

/* Table: SISTEMACONFIGURACION, Owner: MICROLAND */
CREATE TABLE SISTEMACONFIGURACION (EMPRESA INTEGER NOT NULL,
        CLAVE VARCHAR(64) NOT NULL,
        VALOR VARCHAR(16383),
CONSTRAINT PK_SISTEMACONFIGURACION PRIMARY KEY (EMPRESA, CLAVE));

/* Table: SISTEMAEMPRESAS, Owner: MICROLAND */
CREATE TABLE SISTEMAEMPRESAS (EMPRESA INTEGER DEFAULT 0 NOT NULL,
        DESCRIPCION VARCHAR(40) DEFAULT '' NOT NULL,
        PRODUCTO VARCHAR(4) DEFAULT '' NOT NULL,
        NIF VARCHAR(15) DEFAULT '' NOT NULL,
        SIGLA VARCHAR(2) DEFAULT '' NOT NULL,
        DOMICILIO VARCHAR(40) DEFAULT '' NOT NULL,
        POBLACION VARCHAR(40) DEFAULT '' NOT NULL,
        PROVINCIA VARCHAR(40) DEFAULT '' NOT NULL,
        NUMERO INTEGER DEFAULT 0 NOT NULL,
        ESCALERA VARCHAR(4) DEFAULT '' NOT NULL,
        PISO VARCHAR(3) DEFAULT '' NOT NULL,
        PUERTA VARCHAR(2) DEFAULT '' NOT NULL,
        MANO VARCHAR(3) DEFAULT '' NOT NULL,
        CODPOSTAL VARCHAR(5) DEFAULT '' NOT NULL,
        PAIS VARCHAR(40) DEFAULT '' NOT NULL,
        TELEFONO1 VARCHAR(15) DEFAULT '' NOT NULL,
        TELEFONO2 VARCHAR(15) DEFAULT '' NOT NULL,
        FAX VARCHAR(15) DEFAULT '' NOT NULL,
        EXTENSION VARCHAR(3) DEFAULT '' NOT NULL,
        EMAIL VARCHAR(50) DEFAULT '' NOT NULL,
        WEB VARCHAR(50) DEFAULT '' NOT NULL,
        ALMACENAMIENTOEXTERNO SMALLINT DEFAULT 0,
        BDDATOS VARCHAR(254),
        BDMODULOS VARCHAR(254),
        LOGO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        DATOSFISCALES VARCHAR(200),
        INICIOEJERCICIO DATE,
        FINEJERCICIO DATE,
        SUFIJOSEPA VARCHAR(3),
        IDACREEDORSEPA VARCHAR(16),
        USUARIOALTA VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAALTA DATE,
        USUARIOHORAALTA TIME,
        USUARIOMODIFICACION VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAMODIFICACION DATE,
        USUARIOHORAMODIFICACION TIME,
        CUERPOMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80,
CONSTRAINT PK_SISTEMAEMPRESAS PRIMARY KEY (EMPRESA));

/* Table: SISTEMAREGISTROLAYOUTS, Owner: MICROLAND */
CREATE TABLE SISTEMAREGISTROLAYOUTS (ID INTEGER NOT NULL,
        TIPO SMALLINT DEFAULT 0 NOT NULL,
        USUARIO VARCHAR(32),
        DESCRIPTION VARCHAR(100),
        CLASSNAME VARCHAR(64),
        GRIDNAME VARCHAR(64),
        VIEWNAME VARCHAR(64),
        LAYOUT BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
        LAYOUTDATE DATE,
        QUICKFILTERFIELD VARCHAR(32),
CONSTRAINT PK_SISTEMAREGISTROLAYOUTS PRIMARY KEY (ID));

/* Table: SISTEMAUSUARIOS, Owner: MICROLAND */
CREATE TABLE SISTEMAUSUARIOS (USUARIO VARCHAR(64) NOT NULL,
        CLAVE VARCHAR(32) NOT NULL,
        PERFIL VARCHAR(32) DEFAULT 'Usuarios' NOT NULL,
        NOMBRE VARCHAR(40) NOT NULL,
        IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 80,
        TECLADO VARCHAR(32) DEFAULT 'WinClass' NOT NULL,
        CARACTERISTICAS VARCHAR(200) DEFAULT '' NOT NULL,
        FECHACADUCIDAD DATE,
        RECURSO INTEGER,
        LOGINID VARCHAR(32) DEFAULT '' NOT NULL,
        NUNCACADUCA SMALLINT DEFAULT 0 NOT NULL,
        CAMBIARCADA INTEGER DEFAULT 30 NOT NULL,
        CAMBIARINICIO SMALLINT DEFAULT 1 NOT NULL,
        BLOQUEADA SMALLINT DEFAULT 0 NOT NULL,
        EMAIL VARCHAR(100),
CONSTRAINT PK_SISTEMAUSUARIOS PRIMARY KEY (USUARIO));

/* Table: SUBFAMILIAS, Owner: MICROLAND */
CREATE TABLE SUBFAMILIAS (EMPRESA INTEGER NOT NULL,
        SUBFAMILIA VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        IMAGEN INTEGER DEFAULT 0 NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        OSCOMMERCE INTEGER DEFAULT 0,
CONSTRAINT PK_SUBFAMILIAS PRIMARY KEY (EMPRESA, SUBFAMILIA));

/* Table: SUBGRUPOS, Owner: MICROLAND */
CREATE TABLE SUBGRUPOS (EMPRESA INTEGER NOT NULL,
        SUBGRUPO VARCHAR(15) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        IMAGEN INTEGER DEFAULT 0 NOT NULL,
        DESCRIPCIONAMPLIADA VARCHAR(300),
        OSCOMMERCE INTEGER DEFAULT 0,
CONSTRAINT PK_SUBGRUPOS PRIMARY KEY (EMPRESA, SUBGRUPO));

/* Table: TALLAS, Owner: MICROLAND */
CREATE TABLE TALLAS (EMPRESA INTEGER NOT NULL,
        TALLA VARCHAR(5) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        ORDEN INTEGER DEFAULT 0 NOT NULL,
CONSTRAINT PK_TALLAS PRIMARY KEY (EMPRESA, TALLA));

/* Table: TARIFASPRECIOSNETOS, Owner: MICROLAND */
CREATE TABLE TARIFASPRECIOSNETOS (EMPRESA INTEGER NOT NULL,
        TARIFA INTEGER NOT NULL,
        DESCRIPCION VARCHAR(40),
        USUARIOALTA VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAALTA DATE,
        USUARIOHORAALTA TIME,
        USUARIOMODIFICACION VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAMODIFICACION DATE,
        USUARIOHORAMODIFICACION TIME,
CONSTRAINT PK_TARIFASPRECIOSNETOS PRIMARY KEY (EMPRESA, TARIFA));

/* Table: TARIFASPRECIOSNETOSDETALLE, Owner: MICROLAND */
CREATE TABLE TARIFASPRECIOSNETOSDETALLE (EMPRESA INTEGER NOT NULL,
        TARIFA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        PRECIO NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        NOAPLICARDTOPP SMALLINT DEFAULT 0 NOT NULL,
        NOAPLICARDTOCLTE SMALLINT DEFAULT 0 NOT NULL,
        USUARIOALTA VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAALTA DATE,
        USUARIOHORAALTA TIME,
        USUARIOMODIFICACION VARCHAR(32) DEFAULT 'Desconocido' NOT NULL,
        USUARIOFECHAMODIFICACION DATE,
        USUARIOHORAMODIFICACION TIME,
CONSTRAINT PK_TARIFASPRECIOSNETOSDETALLE PRIMARY KEY (EMPRESA, TARIFA, ARTICULO),
CONSTRAINT FK_TARIFASPRECIOSNETOSDETALLE03 UNIQUE (EMPRESA, ARTICULO) USING INDEX NDX_TARIFASPRECIOSNETOS3);

/* Table: TARIFASVENTA, Owner: MICROLAND */
CREATE TABLE TARIFASVENTA (EMPRESA INTEGER NOT NULL,
        DELEGACION VARCHAR(3) NOT NULL,
        TARIFA SMALLINT DEFAULT 0 NOT NULL,
        DESCRIPCION VARCHAR(40),
        FECHAULTACTUALIZACION DATE NOT NULL,
        USUARIO VARCHAR(32) NOT NULL,
        NOAPLICARDTOPP SMALLINT DEFAULT 0 NOT NULL,
        NOAPLICARDTOCLTE SMALLINT DEFAULT 0 NOT NULL,
        PRECIONETO SMALLINT DEFAULT 0 NOT NULL,
        IVAINCLUIDO SMALLINT DEFAULT 0 NOT NULL,
CONSTRAINT PK_TARIFASVENTA PRIMARY KEY (EMPRESA, DELEGACION, TARIFA));

/* Table: TARIFASVENTADETALLE, Owner: MICROLAND */
CREATE TABLE TARIFASVENTADETALLE (EMPRESA INTEGER NOT NULL,
        DELEGACION VARCHAR(3) NOT NULL,
        TARIFA INTEGER NOT NULL,
        ARTICULO VARCHAR(32) NOT NULL,
        PRECIOBASE SMALLINT DEFAULT 3 NOT NULL,
        IMPORTEINCREMENTO NUMERIC(15, 2) DEFAULT       0 NOT NULL,
        PORCENTAJEINCREMENTO NUMERIC(15, 2) DEFAULT          0 NOT NULL,
        REDONDEO NUMERIC(15, 2) DEFAULT             0 NOT NULL,
        PRECIOVENTA NUMERIC(15, 5) DEFAULT           0 NOT NULL,
        ACTUALIZAENTRADACOMPRAS SMALLINT DEFAULT 0 NOT NULL,
        ACTUALIZAVALIDACOMPRAS SMALLINT DEFAULT 0 NOT NULL,
        ACTUALIZASOLICITACONFIRM SMALLINT DEFAULT 0 NOT NULL,
        ULTIMAACTUALIZACION DATE NOT NULL,
        USUARIO VARCHAR(32) NOT NULL,
        ACTREGISTROARTICULOSGENERAL SMALLINT DEFAULT 0 NOT NULL,
        ACTREGISTROARTICULOSALMACEN SMALLINT DEFAULT 0 NOT NULL,
        TIPOAPLICACIONPORCENTAJE SMALLINT DEFAULT 0 NOT NULL,
CONSTRAINT PK_TARIFASVENTADETALLE PRIMARY KEY (EMPRESA, DELEGACION, TARIFA, ARTICULO));

/* Table: TIPOSIVA, Owner: MICROLAND */
CREATE TABLE TIPOSIVA (EMPRESA INTEGER NOT NULL,
        TIPOIVA VARCHAR(5) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        PORCENTAJEIVA NUMERIC(6, 3) DEFAULT 0 NOT NULL,
        PORCENTAJERECARGO NUMERIC(6, 3) DEFAULT 0,
        PORCENTAJEIVAESPECIAL NUMERIC(6, 3) DEFAULT 0,
        PORCENTAJEIGIC NUMERIC(6, 3) DEFAULT 0,
CONSTRAINT PK_TIPOSIVA PRIMARY KEY (EMPRESA, TIPOIVA));

/* Table: UNIDADESVENTA, Owner: MICROLAND */
CREATE TABLE UNIDADESVENTA (EMPRESA INTEGER NOT NULL,
        UNIDAD VARCHAR(5) NOT NULL,
        DESCRIPCION VARCHAR(40) NOT NULL,
        NUMEROMULTIPLOS INTEGER DEFAULT 0 NOT NULL,
        MULTIPLO1 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        MULTIPLO2 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        MULTIPLO3 NUMERIC(15, 3) DEFAULT 0 NOT NULL,
        DESCRIPCIONCORTA VARCHAR(8) DEFAULT '' NOT NULL,
CONSTRAINT PK_UNIDADESVENTA PRIMARY KEY (EMPRESA, UNIDAD));

/*  External Function declarations */
DECLARE EXTERNAL FUNCTION FN_SYSCHECKBLOB
INTEGER
RETURNS INTEGER BY VALUE 
ENTRY_POINT 'SysCheckBlob' MODULE_NAME 'advanceblobudf';

DECLARE EXTERNAL FUNCTION FN_SYSREADBLOB
INTEGER, BLOB
RETURNS PARAMETER 2
ENTRY_POINT 'SysReadBlob' MODULE_NAME 'advanceblobudf';


COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored functions headers */
CREATE OR ALTER FUNCTION DIV (DIVIDENDO BIGINT,
DIVISOR BIGINT)
RETURNS BIGINT
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION ENCODEDATE (I1 INTEGER,
I2 INTEGER,
I3 INTEGER)
RETURNS TIMESTAMP
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION FILLZERO (STR VARCHAR(255) CHARACTER SET WIN1252,
LEN SMALLINT)
RETURNS VARCHAR(255) CHARACTER SET WIN1252
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION GET_LOGGED_USER RETURNS VARCHAR(32) CHARACTER SET WIN1252
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION SET_LOGGED_USER (NEWUSER VARCHAR(32) CHARACTER SET WIN1252)
RETURNS VARCHAR(32) CHARACTER SET WIN1252
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION STRLEN (STR VARCHAR(32765) CHARACTER SET WIN1252)
RETURNS INTEGER
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION STRPOS (SUB VARCHAR(32765) CHARACTER SET WIN1252,
STR VARCHAR(32765) CHARACTER SET WIN1252)
RETURNS INTEGER
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION STRREPLACE (STR VARCHAR(255) CHARACTER SET WIN1252,
FIND VARCHAR(255) CHARACTER SET WIN1252,
REPL VARCHAR(255) CHARACTER SET WIN1252)
RETURNS VARCHAR(255) CHARACTER SET WIN1252
AS 
BEGIN END ^
CREATE OR ALTER FUNCTION SUBSTR (STR VARCHAR(255) CHARACTER SET WIN1252,
NDX INTEGER,
CNT INTEGER)
RETURNS VARCHAR(255) CHARACTER SET WIN1252
AS 
BEGIN END ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures headers */
CREATE OR ALTER PROCEDURE FN_SYSREADSECUREBLOB (PID INTEGER)
RETURNS (OBJETOBLOB BLOB)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_CODIGOARTICULO (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PTIPO VARCHAR(1) CHARACTER SET WIN1252,
PPROVEEDOR VARCHAR(14) CHARACTER SET WIN1252)
RETURNS (EMPRESA INTEGER,
ARTICULO VARCHAR(32) CHARACTER SET WIN1252,
TIPO CHAR(1) CHARACTER SET WIN1252,
CODIGOADICIONAL VARCHAR(32) CHARACTER SET WIN1252,
REFERENCIA VARCHAR(32) CHARACTER SET WIN1252,
FAMILIA VARCHAR(15) CHARACTER SET WIN1252,
SUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
GRUPO VARCHAR(15) CHARACTER SET WIN1252,
SUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
DESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
DESCRIPCIONAMPLIADA BLOB CHARACTER SET WIN1252,
DESCRIPCIONENRIQUECIDA BLOB CHARACTER SET WIN1252,
DESCRIPCIONPROVEEDOR VARCHAR(100) CHARACTER SET WIN1252,
IVACOMPRAS VARCHAR(5) CHARACTER SET WIN1252,
IVAVENTAS VARCHAR(5) CHARACTER SET WIN1252,
UNIDADVENTA VARCHAR(5) CHARACTER SET WIN1252,
NUMEROMULTIPLOS INTEGER,
MULTIPLO1 NUMERIC(15, 3),
MULTIPLO2 NUMERIC(15, 3),
MULTIPLO3 NUMERIC(15, 3),
UNIDADCOMPRA VARCHAR(5) CHARACTER SET WIN1252,
NUMEROMULTIPLOS_COMPRA INTEGER,
MULTIPLO1_COMPRA NUMERIC(15, 3),
MULTIPLO2_COMPRA NUMERIC(15, 3),
MULTIPLO3_COMPRA NUMERIC(15, 3),
ACTUALIZASTOCK SMALLINT,
PROVEEDOR VARCHAR(14) CHARACTER SET WIN1252,
LOTES SMALLINT,
SERIES SMALLINT,
CADUCIDADES SMALLINT,
TALLAS SMALLINT,
COLORES SMALLINT,
MULTIUBICACIONES SMALLINT,
TRAZABILIDADAUTOMATICA SMALLINT,
OBSERVACIONES BLOB CHARACTER SET WIN1252,
WEBDESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
WEBDESCRIPCIONAMPL BLOB CHARACTER SET WIN1252,
WEBFICHATECNICA BLOB CHARACTER SET WIN1252,
CANTIDAD NUMERIC(15, 3),
PRECIO NUMERIC(15, 3),
REFERENCIAPRECIO VARCHAR(15) CHARACTER SET WIN1252,
TIPOARTICULO VARCHAR(5) CHARACTER SET WIN1252,
SECUENCIA VARCHAR(32) CHARACTER SET WIN1252,
MEDIDAS VARCHAR(15) CHARACTER SET WIN1252,
PESO NUMERIC(15, 4),
ESTADO VARCHAR(5) CHARACTER SET WIN1252,
CODIGOBARRAS VARCHAR(32) CHARACTER SET WIN1252,
CODIGOEDI VARCHAR(32) CHARACTER SET WIN1252,
CODIGOFARMACIA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOBALANZA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOOTROS VARCHAR(32) CHARACTER SET WIN1252,
IMAGEN INTEGER,
RAEE NUMERIC(15, 2),
UNIDADESEMBALAJE NUMERIC(15, 3),
EMBALAJE VARCHAR(5) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENCLIENTESDESCUENTOS (PEMPRESA INTEGER,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENCLIENTESPRECIOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
TARIFA INTEGER)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENDTOPORCANTIDADART (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCANTIDAD DECIMAL(15, 3),
PFECHA DATE)
RETURNS (DESCUENTO NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENDTOPORCANTIDADCLTE (PEMPRESA INTEGER,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCANTIDAD DECIMAL(15, 3),
PFECHA DATE)
RETURNS (DESCUENTO NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENERPRECIOVENTA (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PTARIFA INTEGER,
PFECHA DATE,
PCANTIDAD NUMERIC(15, 3),
PENVASE VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (TARIFA INTEGER,
PRECIO NUMERIC(15, 5),
PRECIOBRUTO NUMERIC(15, 5),
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2),
COSTE NUMERIC(15, 6),
RECARGO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
NOAPLICARRETENCION SMALLINT,
APLICADO VARCHAR(150) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSDIRECT (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSDTOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (GRUPODESCUENTO VARCHAR(5) CHARACTER SET WIN1252,
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSDTOS_EX (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (GRUPODESCUENTO VARCHAR(5) CHARACTER SET WIN1252,
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSPRECIOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSTRAMOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PCANTIDAD NUMERIC(15, 3))
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSPRECIOSMARGENES (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PALMACEN VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENGRUPOSPRECIOSPRECIOS (PEMPRESA INTEGER,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENOFERTASVENTADESCUENTOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PTARIFA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENPRECIOCANTIDADART (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCANTIDAD DECIMAL(15, 3),
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 3))
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENPRECIOMARGENCLIENTE (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PALMACEN VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENPRECIOTARIFA (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PTARIFA INTEGER,
PFECHA DATE,
PPRECIONETO SMALLINT)
RETURNS (TARIFA INTEGER,
PRECIO DECIMAL(15, 5),
COSTE DECIMAL(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
IVAINCLUIDO SMALLINT,
APLICADO VARCHAR(150) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_OBTENTARIFAPRECIONETO (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER)
RETURNS (TARIFA INTEGER,
PRECIO DECIMAL(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_PARAMETROSORDENDTOSVENTA (PEMPRESA INTEGER)
RETURNS (PARAMETROS VARCHAR(16000) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_PARAMETROSORDENPRECIOVENTA (PEMPRESA INTEGER)
RETURNS (PARAMETROS VARCHAR(16000) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_SEPARARPARAMETROS (PARAMETROS VARCHAR(16000) CHARACTER SET WIN1252)
RETURNS (VALOR VARCHAR(168) CHARACTER SET WIN1252,
ACCION VARCHAR(1) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_SUB_CODIGOARTICULO (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PTIPO VARCHAR(1) CHARACTER SET WIN1252,
PPROVEEDOR VARCHAR(14) CHARACTER SET WIN1252,
PBUSCARESPECIAL SMALLINT)
RETURNS (EMPRESA INTEGER,
ARTICULO VARCHAR(32) CHARACTER SET WIN1252,
TIPO CHAR(1) CHARACTER SET WIN1252,
CODIGOADICIONAL VARCHAR(32) CHARACTER SET WIN1252,
DESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
DESCRIPCIONAMPLIADA BLOB CHARACTER SET WIN1252,
DESCRIPCIONENRIQUECIDA BLOB,
DESCRIPCIONPROVEEDOR VARCHAR(100) CHARACTER SET WIN1252,
IVACOMPRAS VARCHAR(5) CHARACTER SET WIN1252,
IVAVENTAS VARCHAR(5) CHARACTER SET WIN1252,
UNIDADVENTA VARCHAR(5) CHARACTER SET WIN1252,
UNIDADCOMPRA VARCHAR(5) CHARACTER SET WIN1252,
ACTUALIZASTOCK SMALLINT,
PROVEEDOR VARCHAR(14) CHARACTER SET WIN1252,
FAMILIA VARCHAR(15) CHARACTER SET WIN1252,
SUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
GRUPO VARCHAR(15) CHARACTER SET WIN1252,
SUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
LOTES SMALLINT,
SERIES SMALLINT,
CADUCIDADES SMALLINT,
TALLAS SMALLINT,
COLORES SMALLINT,
MULTIUBICACIONES SMALLINT,
TRAZABILIDADAUTOMATICA SMALLINT,
OBSERVACIONES BLOB CHARACTER SET WIN1252,
WEBDESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
WEBDESCRIPCIONAMPL BLOB CHARACTER SET WIN1252,
WEBFICHATECNICA BLOB CHARACTER SET WIN1252,
CANTIDAD NUMERIC(15, 3),
PRECIO NUMERIC(15, 3),
REFERENCIAPRECIO VARCHAR(15) CHARACTER SET WIN1252,
TIPOARTICULO VARCHAR(5) CHARACTER SET WIN1252,
SECUENCIA VARCHAR(32) CHARACTER SET WIN1252,
MEDIDAS VARCHAR(15) CHARACTER SET WIN1252,
PESO NUMERIC(15, 4),
ESTADO VARCHAR(5) CHARACTER SET WIN1252,
CODIGOBARRAS VARCHAR(32) CHARACTER SET WIN1252,
CODIGOPROVEEDOR VARCHAR(32) CHARACTER SET WIN1252,
CODIGOEDI VARCHAR(32) CHARACTER SET WIN1252,
CODIGOFARMACIA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOBALANZA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOOTROS VARCHAR(32) CHARACTER SET WIN1252,
IMAGEN INTEGER,
RAEE NUMERIC(15, 2),
UNIDADESEMBALAJE NUMERIC(15, 3),
EMBALAJE VARCHAR(5) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_SUB_OBTENERPRECIOVENTA (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PALMACEN VARCHAR(3) CHARACTER SET WIN1252,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PTARIFA INTEGER,
PFECHA DATE,
PCANTIDAD NUMERIC(15, 3),
PENVASE VARCHAR(15) CHARACTER SET WIN1252,
PORDENPRECIOS VARCHAR(16000) CHARACTER SET WIN1252,
PORDENDESCUENTOS VARCHAR(16000) CHARACTER SET WIN1252)
RETURNS (TARIFA INTEGER,
PRECIO NUMERIC(15, 5),
PRECIOBRUTO NUMERIC(15, 5),
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2),
COSTE NUMERIC(15, 6),
RECARGO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
NOAPLICARRETENCION SMALLINT,
APLICADO VARCHAR(150) CHARACTER SET WIN1252,
GRUPODESCUENTO VARCHAR(5) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SP_SUB_SEPARARCADENA (PCADENA VARCHAR(5000) CHARACTER SET WIN1252,
PSEPARADOR VARCHAR(1) CHARACTER SET WIN1252)
RETURNS (SUBCADENA VARCHAR(50) CHARACTER SET WIN1252)
AS 
BEGIN SUSPEND; END ^
CREATE OR ALTER PROCEDURE SYS_CURRENTUSER RETURNS (USUARIO VARCHAR(32) CHARACTER SET WIN1252,
FECHA DATE,
HORA TIME)
AS 
BEGIN SUSPEND; END ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;

/*  Index definitions for all user tables */
CREATE INDEX IDX_ARTICULOS01 ON ARTICULOS (EMPRESA, DESCRIPCION);
CREATE INDEX IDX_ARTICULOS010 ON ARTICULOS (EMPRESA, BOUTIQUETALLA);
CREATE INDEX IDX_ARTICULOS011 ON ARTICULOS (EMPRESA, BOUTIQUECOLOR);
CREATE INDEX IDX_ARTICULOS02 ON ARTICULOS (EMPRESA, FAMILIA);
CREATE INDEX IDX_ARTICULOS03 ON ARTICULOS (EMPRESA, SUBFAMILIA);
CREATE INDEX IDX_ARTICULOS04 ON ARTICULOS (EMPRESA, GRUPO);
CREATE INDEX IDX_ARTICULOS05 ON ARTICULOS (EMPRESA, SUBGRUPO);
CREATE INDEX IDX_ARTICULOS06 ON ARTICULOS (EMPRESA, PROVEEDOR);
CREATE INDEX IDX_ARTICULOS07 ON ARTICULOS (EMPRESA, BOUTIQUETEMPORADA);
CREATE INDEX IDX_ARTICULOS08 ON ARTICULOS (EMPRESA, BOUTIQUEMODELO);
CREATE INDEX IDX_ARTICULOS09 ON ARTICULOS (EMPRESA, BOUTIQUESERIE);
CREATE INDEX NDX_ARTICULOSACCESOS ON ARTICULOSACCESOS (EMPRESA, TIPO, CODIGOADICIONAL);
CREATE INDEX IDX_CLIENTES01 ON CLIENTES (EMPRESA, NOMBRE);
CREATE INDEX IDX_CLIENTES02 ON CLIENTES (EMPRESA, RAZONSOCIAL);
CREATE INDEX CLIENTESDTOSESPECIALES_1 ON CLIENTESDESCUENTOSESPECIALES (EMPRESA, CLIENTE, OBRA, ARTICULO, FAMILIA, SUBFAMILIA, GRUPO, SUBGRUPO);
CREATE INDEX NDX_SISTEMAREGISTROLAYOUTS1 ON SISTEMAREGISTROLAYOUTS (TIPO, CLASSNAME, GRIDNAME, VIEWNAME);
CREATE INDEX NDX_SISTEMAREGISTROLAYOUTS2 ON SISTEMAREGISTROLAYOUTS (TIPO, USUARIO, CLASSNAME, GRIDNAME, VIEWNAME);
CREATE INDEX NDX_SISTEMAREGISTROLAYOUTS3 ON SISTEMAREGISTROLAYOUTS (TIPO, USUARIO);
CREATE INDEX NDX_SISTEMAREGISTROLAYOUTS4 ON SISTEMAREGISTROLAYOUTS (TIPO, CLASSNAME, GRIDNAME, VIEWNAME);
CREATE INDEX NDX_SISTEMAUSUARIOS01 ON SISTEMAUSUARIOS (LOGINID);
CREATE INDEX NDX_SISTEMAUSUARIOS02 ON SISTEMAUSUARIOS (USUARIO, CLAVE);

ALTER TABLE AGENCIASTRANSPORTES ADD CONSTRAINT E_AGENCIASTRANSPORTES FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKARTICULOS ADD CONSTRAINT E_APKARTICULOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKARTICULOS ADD CONSTRAINT FK_APKARTICULOS01 FOREIGN KEY (EMPRESA, FAMILIA) REFERENCES APKFAMILIAS (EMPRESA, FAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE APKARTICULOS ADD CONSTRAINT FK_APKARTICULOS02 FOREIGN KEY (EMPRESA, SUBFAMILIA) REFERENCES APKSUBFAMILIAS (EMPRESA, SUBFAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE APKARTICULOS ADD CONSTRAINT FK_APKARTICULOS03 FOREIGN KEY (EMPRESA, GRUPO) REFERENCES APKGRUPOS (EMPRESA, GRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE APKARTICULOS ADD CONSTRAINT FK_APKARTICULOS04 FOREIGN KEY (EMPRESA, SUBGRUPO) REFERENCES APKSUBGRUPOS (EMPRESA, SUBGRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE APKARTICULOSFORMATOS ADD CONSTRAINT E_APKARTICULOSFORMATOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKARTICULOSFORMATOS ADD CONSTRAINT FK_APKARTICULOSFORMATOS01 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES APKARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE APKARTICULOSFORMATOS ADD CONSTRAINT FK_APKARTICULOSFORMATOS02 FOREIGN KEY (EMPRESA, FORMATO) REFERENCES APKFORMATOS (EMPRESA, FORMATO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE APKAVISOS ADD CONSTRAINT E_APKAVISOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKAVISOSARTICULOS ADD CONSTRAINT E_APKAVISOSARTICULOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKAVISOSARTICULOS ADD CONSTRAINT FK_APKAVISOSARTICULOS FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES APKARTICULOS (EMPRESA, ARTICULO);

ALTER TABLE APKAVISOSCLIENTES ADD CONSTRAINT E_APKAVISOSCLIENTES FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKAVISOSCLIENTES ADD CONSTRAINT FK_APKAVISOSCLIENTES FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES APKCLIENTES (EMPRESA, CLIENTE, OBRA);

ALTER TABLE APKAVISOSCONFIRMADOS ADD CONSTRAINT FK_APKAVISOSCONFIRMADOS01 FOREIGN KEY (EMPRESA, ID, PUNTO) REFERENCES APKAVISOS (EMPRESA, ID, PUNTO) ON DELETE CASCADE;

ALTER TABLE APKCLIENTES ADD CONSTRAINT E_APKCLIENTES FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKCLIENTES ADD CONSTRAINT FK_APKCLIENTES01 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON DELETE CASCADE;

ALTER TABLE APKFAMILIAS ADD CONSTRAINT E_APKFAMILIAS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKFORMATOS ADD CONSTRAINT E_APKFORMATOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKGRUPOS ADD CONSTRAINT E_APKGRUPOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKPEDIDODETALLE ADD CONSTRAINT FK_APKPEDIDODETALLE01 FOREIGN KEY (EMPRESA, PEDIDO, PROVEEDOR) REFERENCES APKPEDIDOS (EMPRESA, PEDIDO, PROVEEDOR) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKPEDIDODETALLE ADD CONSTRAINT FK_APKPEDIDODETALLE02 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES APKARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE;

ALTER TABLE APKPEDIDOS ADD CONSTRAINT FK_APKPEDIDOS01 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA);

ALTER TABLE APKSUBFAMILIAS ADD CONSTRAINT E_APKSUBFAMILIAS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKSUBGRUPOS ADD CONSTRAINT E_APKSUBGRUPOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKTRANSPORTISTAS ADD CONSTRAINT E_APKTRANSPORTISTAS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKTRANSPORTISTAS ADD CONSTRAINT FK_APKTRANSPORTISTAS01 FOREIGN KEY (EMPRESA, AGENCIATRANSPORTE) REFERENCES AGENCIASTRANSPORTES (EMPRESA, AGENCIATRANSPORTE) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKUSUARIOS ADD CONSTRAINT E_APKUSUARIOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKUSUARIOS ADD CONSTRAINT FK_APKUSUARIOS04 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON UPDATE CASCADE;

ALTER TABLE APKUSUARIOSFAVORITOS ADD CONSTRAINT E_APKUSUARIOSFAVORITOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKUSUARIOSFAVORITOS ADD CONSTRAINT FK_APKUSUARIOSFAVORITOS01 FOREIGN KEY (EMPRESA, USUARIO) REFERENCES APKUSUARIOS (EMPRESA, USUARIO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE APKUSUARIOSFAVORITOS ADD CONSTRAINT FK_APKUSUARIOSFAVORITOS02 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES APKARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE ARTICULOS ADD CONSTRAINT E_ARTICULOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS02 FOREIGN KEY (EMPRESA, UNIDADVENTA) REFERENCES UNIDADESVENTA (EMPRESA, UNIDAD) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS03 FOREIGN KEY (EMPRESA, UNIDADCOMPRA) REFERENCES UNIDADESVENTA (EMPRESA, UNIDAD) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS09 FOREIGN KEY (EMPRESA, FAMILIA) REFERENCES FAMILIAS (EMPRESA, FAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS10 FOREIGN KEY (EMPRESA, SUBFAMILIA) REFERENCES SUBFAMILIAS (EMPRESA, SUBFAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS11 FOREIGN KEY (EMPRESA, GRUPO) REFERENCES GRUPOS (EMPRESA, GRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS12 FOREIGN KEY (EMPRESA, SUBGRUPO) REFERENCES SUBGRUPOS (EMPRESA, SUBGRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE ARTICULOSACCESOS ADD CONSTRAINT FK_ARTICULOSACCESOS01 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE ARTICULOSDESCUENTOSCANTIDAD ADD CONSTRAINT FK_ARTICULOSDESCUENTOSCANTID01 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE ARTICULOSPRECIOSCANTIDAD ADD CONSTRAINT FK_ARTICULOSPRECIOSCANTID01 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTES ADD CONSTRAINT E_CLIENTES FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES01 FOREIGN KEY (EMPRESA, AGENCIATRANSPORTE) REFERENCES AGENCIASTRANSPORTES (EMPRESA, AGENCIATRANSPORTE) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSCANTIDAD ADD CONSTRAINT FK_CLIENTESDESCUENTOSCANTIDAD01 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSCANTIDAD ADD CONSTRAINT FK_CLIENTESDESCUENTOSCANTIDAD02 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSESPECIALES ADD CONSTRAINT FK_CLIENTESDESCUENTOSESPECIAL01 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSESPECIALES ADD CONSTRAINT FK_CLIENTESDESCUENTOSESPECIAL02 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSESPECIALES ADD CONSTRAINT FK_CLIENTESDESCUENTOSESPECIAL03 FOREIGN KEY (EMPRESA, FAMILIA) REFERENCES FAMILIAS (EMPRESA, FAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSESPECIALES ADD CONSTRAINT FK_CLIENTESDESCUENTOSESPECIAL04 FOREIGN KEY (EMPRESA, SUBFAMILIA) REFERENCES SUBFAMILIAS (EMPRESA, SUBFAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSESPECIALES ADD CONSTRAINT FK_CLIENTESDESCUENTOSESPECIAL05 FOREIGN KEY (EMPRESA, GRUPO) REFERENCES GRUPOS (EMPRESA, GRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSESPECIALES ADD CONSTRAINT FK_CLIENTESDESCUENTOSESPECIAL06 FOREIGN KEY (EMPRESA, SUBGRUPO) REFERENCES SUBGRUPOS (EMPRESA, SUBGRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSIMPORTE ADD CONSTRAINT FK_CLIENTESDESCUENTOSIMPORTE01 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSWEB ADD CONSTRAINT FK_CLIENTESDESCUENTOSWEB01 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSWEB ADD CONSTRAINT FK_CLIENTESDESCUENTOSWEB02 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESDESCUENTOSWEB ADD CONSTRAINT FK_CLIENTESDESCUENTOSWEB03 FOREIGN KEY (EMPRESA, FAMILIA) REFERENCES FAMILIAS (EMPRESA, FAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSWEB ADD CONSTRAINT FK_CLIENTESDESCUENTOSWEB04 FOREIGN KEY (EMPRESA, SUBFAMILIA) REFERENCES SUBFAMILIAS (EMPRESA, SUBFAMILIA) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSWEB ADD CONSTRAINT FK_CLIENTESDESCUENTOSWEB05 FOREIGN KEY (EMPRESA, GRUPO) REFERENCES GRUPOS (EMPRESA, GRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESDESCUENTOSWEB ADD CONSTRAINT FK_CLIENTESDESCUENTOSWEB06 FOREIGN KEY (EMPRESA, SUBGRUPO) REFERENCES SUBGRUPOS (EMPRESA, SUBGRUPO) ON UPDATE CASCADE ON DELETE SET NULL;

ALTER TABLE CLIENTESTARIFASPRECIOSNETOS ADD CONSTRAINT FK_CLIENTESTARIFASPRECIOSNETO01 FOREIGN KEY (EMPRESA, TARIFA) REFERENCES TARIFASPRECIOSNETOS (EMPRESA, TARIFA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE CLIENTESTARIFASPRECIOSNETOS ADD CONSTRAINT FK_CLIENTESTARIFASPRECIOSNETO02 FOREIGN KEY (EMPRESA, CLIENTE, OBRA) REFERENCES CLIENTES (EMPRESA, CLIENTE, OBRA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE COLORES ADD CONSTRAINT E_COLORES FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE DELEGACIONES ADD CONSTRAINT E_DELEGACIONES FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE FAMILIAS ADD CONSTRAINT E_FAMILIAS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE GRUPOS ADD CONSTRAINT E_GRUPOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE OFERTASVENTA ADD CONSTRAINT E_OFERTASVENTA FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE OFERTASVENTA ADD CONSTRAINT FK_OFERTASVENTA01 FOREIGN KEY (EMPRESA, DELEGACION) REFERENCES DELEGACIONES (EMPRESA, DELEGACION) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE OFERTASVENTA ADD CONSTRAINT FK_OFERTASVENTA02 FOREIGN KEY (EMPRESA, DELEGACION, TARIFA) REFERENCES TARIFASVENTA (EMPRESA, DELEGACION, TARIFA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE OFERTASVENTADETALLE ADD CONSTRAINT FK_OFERTASVENTADETALLE01 FOREIGN KEY (EMPRESA, DELEGACION, OFERTA) REFERENCES OFERTASVENTA (EMPRESA, DELEGACION, OFERTA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE OFERTASVENTADETALLE ADD CONSTRAINT FK_OFERTASVENTADETALLE02 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE SISTEMAREGISTROLAYOUTS ADD CONSTRAINT FK_SISTEMAREGISTROLAYOUTS02 FOREIGN KEY (USUARIO) REFERENCES SISTEMAUSUARIOS (USUARIO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE SUBFAMILIAS ADD CONSTRAINT E_SUBFAMILIAS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE SUBGRUPOS ADD CONSTRAINT E_SUBGRUPOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TALLAS ADD CONSTRAINT E_TALLAS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASPRECIOSNETOS ADD CONSTRAINT E_TARIFASPRECIOSNETOS FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASPRECIOSNETOSDETALLE ADD CONSTRAINT FK_TARIFASPRECIOSNETOSDETALLE01 FOREIGN KEY (EMPRESA, TARIFA) REFERENCES TARIFASPRECIOSNETOS (EMPRESA, TARIFA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASPRECIOSNETOSDETALLE ADD CONSTRAINT FK_TARIFASPRECIOSNETOSDETALLE02 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASVENTA ADD CONSTRAINT E_TARIFASVENTA FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASVENTA ADD CONSTRAINT FK_TARIFASVENTA01 FOREIGN KEY (EMPRESA, DELEGACION) REFERENCES DELEGACIONES (EMPRESA, DELEGACION) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASVENTADETALLE ADD CONSTRAINT FK_TARIFASVENTADETALLE01 FOREIGN KEY (EMPRESA, DELEGACION, TARIFA) REFERENCES TARIFASVENTA (EMPRESA, DELEGACION, TARIFA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TARIFASVENTADETALLE ADD CONSTRAINT FK_TARIFASVENTADETALLE02 FOREIGN KEY (EMPRESA, ARTICULO) REFERENCES ARTICULOS (EMPRESA, ARTICULO) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE TIPOSIVA ADD CONSTRAINT E_TIPOSIVA FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE UNIDADESVENTA ADD CONSTRAINT E_UNIDADESVENTA FOREIGN KEY (EMPRESA) REFERENCES SISTEMAEMPRESAS (EMPRESA) ON UPDATE CASCADE ON DELETE CASCADE;

/*  Exceptions */
CREATE EXCEPTION EX_GENERICA '';

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored functions bodies */

ALTER FUNCTION DIV (DIVIDENDO BIGINT,
DIVISOR BIGINT)
RETURNS BIGINT
AS 
BEGIN
   IF (DIVISOR <> 0) THEN
       RETURN DIVIDENDO/DIVISOR;
   ELSE RETURN NULL;
END ^

ALTER FUNCTION ENCODEDATE (I1 INTEGER,
I2 INTEGER,
I3 INTEGER)
RETURNS TIMESTAMP
AS 
DECLARE VARIABLE D VARCHAR(10) ;
DECLARE VARIABLE Y VARCHAR(4) ;
BEGIN
   Y = FILLZERO(I3,4);
   D = Y || '/' || I2 || '/'|| I1;
   RETURN CAST(D AS DATE);
END ^

ALTER FUNCTION FILLZERO (STR VARCHAR(255) CHARACTER SET WIN1252,
LEN SMALLINT)
RETURNS VARCHAR(255) CHARACTER SET WIN1252
AS 
DECLARE VARIABLE RES VARCHAR(256) ;
BEGIN
   RES = COALESCE(STR,'');

   WHILE(CHAR_LENGTH(RES) < LEN) DO RES = '0' || RES;

   RETURN RES;
END ^

ALTER FUNCTION GET_LOGGED_USER RETURNS VARCHAR(32) CHARACTER SET WIN1252
AS 
DECLARE VARIABLE USERNAME VARCHAR(255);
BEGIN
  USERNAME = RDB$GET_CONTEXT('USER_SESSION', 'LOGGED_USER');
  RETURN COALESCE(SUBSTRING (USERNAME FROM 1 FOR 32),'Desconocido');
END ^

ALTER FUNCTION SET_LOGGED_USER (NEWUSER VARCHAR(32) CHARACTER SET WIN1252)
RETURNS VARCHAR(32) CHARACTER SET WIN1252
AS 
DECLARE VARIABLE USERNAME VARCHAR(255);
BEGIN
  IF (NEWUSER IS NOT NULL AND TRIM(NEWUSER) <> '') THEN RDB$SET_CONTEXT('USER_SESSION', 'LOGGED_USER',NEWUSER);
  RETURN GET_LOGGED_USER();
END ^

ALTER FUNCTION STRLEN (STR VARCHAR(32765) CHARACTER SET WIN1252)
RETURNS INTEGER
AS 
BEGIN
  RETURN CHAR_LENGTH(STR);
END ^

ALTER FUNCTION STRPOS (SUB VARCHAR(32765) CHARACTER SET WIN1252,
STR VARCHAR(32765) CHARACTER SET WIN1252)
RETURNS INTEGER
AS 
BEGIN
   RETURN POSITION(SUB,STR);
END ^

ALTER FUNCTION STRREPLACE (STR VARCHAR(255) CHARACTER SET WIN1252,
FIND VARCHAR(255) CHARACTER SET WIN1252,
REPL VARCHAR(255) CHARACTER SET WIN1252)
RETURNS VARCHAR(255) CHARACTER SET WIN1252
AS 
BEGIN
      RETURN REPLACE(str, find, repl);
END ^

ALTER FUNCTION SUBSTR (STR VARCHAR(255) CHARACTER SET WIN1252,
NDX INTEGER,
CNT INTEGER)
RETURNS VARCHAR(255) CHARACTER SET WIN1252
AS 
BEGIN
      RETURN SUBSTRING(STR FROM NDX FOR CNT);
END ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures bodies */

ALTER PROCEDURE FN_SYSREADSECUREBLOB (PID INTEGER)
RETURNS (OBJETOBLOB BLOB)
AS 
DECLARE VVALIDO INTEGER;
begin
  SELECT fn_syscheckblob (:PID) FROM RDB$DATABASE INTO :VVALIDO;

  IF (VVALIDO = 1) THEN BEGIN
    SELECT fn_sysreadblob(:PID) FROM RDB$DATABASE INTO :OBJETOBLOB;
  END ELSE
    OBJETOBLOB = NULL;

  suspend;
end ^

ALTER PROCEDURE SP_CODIGOARTICULO (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PTIPO VARCHAR(1) CHARACTER SET WIN1252,
PPROVEEDOR VARCHAR(14) CHARACTER SET WIN1252)
RETURNS (EMPRESA INTEGER,
ARTICULO VARCHAR(32) CHARACTER SET WIN1252,
TIPO CHAR(1) CHARACTER SET WIN1252,
CODIGOADICIONAL VARCHAR(32) CHARACTER SET WIN1252,
REFERENCIA VARCHAR(32) CHARACTER SET WIN1252,
FAMILIA VARCHAR(15) CHARACTER SET WIN1252,
SUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
GRUPO VARCHAR(15) CHARACTER SET WIN1252,
SUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
DESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
DESCRIPCIONAMPLIADA BLOB CHARACTER SET WIN1252,
DESCRIPCIONENRIQUECIDA BLOB CHARACTER SET WIN1252,
DESCRIPCIONPROVEEDOR VARCHAR(100) CHARACTER SET WIN1252,
IVACOMPRAS VARCHAR(5) CHARACTER SET WIN1252,
IVAVENTAS VARCHAR(5) CHARACTER SET WIN1252,
UNIDADVENTA VARCHAR(5) CHARACTER SET WIN1252,
NUMEROMULTIPLOS INTEGER,
MULTIPLO1 NUMERIC(15, 3),
MULTIPLO2 NUMERIC(15, 3),
MULTIPLO3 NUMERIC(15, 3),
UNIDADCOMPRA VARCHAR(5) CHARACTER SET WIN1252,
NUMEROMULTIPLOS_COMPRA INTEGER,
MULTIPLO1_COMPRA NUMERIC(15, 3),
MULTIPLO2_COMPRA NUMERIC(15, 3),
MULTIPLO3_COMPRA NUMERIC(15, 3),
ACTUALIZASTOCK SMALLINT,
PROVEEDOR VARCHAR(14) CHARACTER SET WIN1252,
LOTES SMALLINT,
SERIES SMALLINT,
CADUCIDADES SMALLINT,
TALLAS SMALLINT,
COLORES SMALLINT,
MULTIUBICACIONES SMALLINT,
TRAZABILIDADAUTOMATICA SMALLINT,
OBSERVACIONES BLOB CHARACTER SET WIN1252,
WEBDESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
WEBDESCRIPCIONAMPL BLOB CHARACTER SET WIN1252,
WEBFICHATECNICA BLOB CHARACTER SET WIN1252,
CANTIDAD NUMERIC(15, 3),
PRECIO NUMERIC(15, 3),
REFERENCIAPRECIO VARCHAR(15) CHARACTER SET WIN1252,
TIPOARTICULO VARCHAR(5) CHARACTER SET WIN1252,
SECUENCIA VARCHAR(32) CHARACTER SET WIN1252,
MEDIDAS VARCHAR(15) CHARACTER SET WIN1252,
PESO NUMERIC(15, 4),
ESTADO VARCHAR(5) CHARACTER SET WIN1252,
CODIGOBARRAS VARCHAR(32) CHARACTER SET WIN1252,
CODIGOEDI VARCHAR(32) CHARACTER SET WIN1252,
CODIGOFARMACIA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOBALANZA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOOTROS VARCHAR(32) CHARACTER SET WIN1252,
IMAGEN INTEGER,
RAEE NUMERIC(15, 2),
UNIDADESEMBALAJE NUMERIC(15, 3),
EMBALAJE VARCHAR(5) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VQRY VARCHAR(3000) ;
BEGIN
/*************************************************************************************
 * NOS DEVUELVE EL CODIGO DE ARTICULO DE LA TABLA DE ARTICULO                        *
 * SI NO ENCUENTRA EL ARTICULO LO BUSCA EN TABLAS CREATENATIVAS                       *
 * SI ENCUENTRA MAS DE UN RESULTADO NOS DEVUELVE TODOS                               *
 *************************************************************************************/
  IF (PTIPO IS NULL)      THEN PTIPO = '';
  IF (PPROVEEDOR IS NULL) THEN PPROVEEDOR = '';
  IF (PARTICULO IS NULL)  THEN PARTICULO = '';
  IF (PEMPRESA IS NULL)   THEN PEMPRESA = 0;

  VQRY = 'SELECT Empresa, Articulo, Descripcion, DescripcionAmpliada, DESCRIPCIONENRIQUECIDA,
             CodigoAdicional, DescripcionProveedor,
             IvaCompras, IvaVentas, UnidadVenta, UnidadCompra,
             ActualizaStock, Proveedor, Familia, SubFamilia, Grupo, SubGrupo,
             Lotes, Series, Caducidades, Tallas, Colores, Multiubicaciones, TRAZABILIDADAUTOMATICA,
             Observaciones, webdescripcion, webdescripcionampl, WebFichaTecnica, Tipo,
             Cantidad,
             Precio,
             ReferenciaPrecio, TipoArticulo, Secuencia, Medidas, Peso, Estado,
             CODIGOBARRAS, CODIGOPROVEEDOR, CODIGOEDI, CODIGOFARMACIA, CODIGOBALANZA, CODIGOOTROS,
             IMAGEN, RAEE, UNIDADESEMBALAJE, EMBALAJE
        FROM sp_sub_codigoarticulo('||:pEmpresa ||','''|| :pArticulo || ''','''|| :pTipo||''','''||:pProveedor ||''', 1)';

  FOR EXECUTE STATEMENT VQRY
        INTO :Empresa, :Articulo, :Descripcion, :DescripcionAmpliada, :DESCRIPCIONENRIQUECIDA,
             :CodigoAdicional, :DescripcionProveedor,
             :IvaCompras, :IvaVentas, :UnidadVenta, :UnidadCompra,
             :ActualizaStock, :Proveedor, :Familia, :SubFamilia, :Grupo, :SubGrupo,
             :Lotes, :Series, :Caducidades, :Tallas, :Colores, :Multiubicaciones, :TRAZABILIDADAUTOMATICA,
             :Observaciones, :webdescripcion, :webdescripcionampl, :WebFichaTecnica, :Tipo,
             :Cantidad, :Precio, :ReferenciaPrecio,
             :TipoArticulo, :Secuencia, :Medidas, :Peso, :Estado, :CODIGOBARRAS,
             :REFERENCIA,:CODIGOEDI, :CODIGOFARMACIA, :CODIGOBALANZA, :CODIGOOTROS,
             :IMAGEN, :RAEE, :UNIDADESEMBALAJE, :EMBALAJE
  DO
  BEGIN
    -- Calculamos el campo referencia del proveedor
/*      REFERENCIA = '';
      IF (TIPO = 'P') then
        REFERENCIA = CODIGOADICIONAL;
      ELSE
        SELECT FIRST 1 CODIGOADICIONAL
          FROM Articulosaccesos
         WHERE Empresa = :pEmpresa
           AND Articulo = :Articulo
           AND Tipo = 'P'
         ORDER BY PREDETERMINADO DESC
          INTO :REFERENCIA;
*/
    -- Buscamos datos para la unidad de venta
      NumeroMultiplos = 0;
      Multiplo1 = 0;
      Multiplo2 = 0;
      Multiplo3 = 0;
      IF ((UNIDADVENTA IS NOT NULL) AND (UNIDADVENTA <> '')) THEN
        SELECT UV.NumeroMultiplos, UV.Multiplo1, UV.Multiplo2, UV.Multiplo3
          FROM UNIDADESVENTA UV
         WHERE UV.Empresa = :pEmpresa
           AND UV.Unidad = :UNIDADVENTA
          INTO :NumeroMultiplos, :Multiplo1, :Multiplo2, :Multiplo3;

      IF (UNIDADESEMBALAJE > 0) THEN
      BEGIN
         NumeroMultiplos = 1;
         Multiplo1 = UNIDADESEMBALAJE;
      END

    -- Buscamos datos para la unidad de compra
      NumeroMultiplos_Compra = 0;
      Multiplo1_Compra = 0;
      Multiplo2_Compra = 0;
      Multiplo3_Compra = 0;
      IF ((UNIDADCOMPRA IS NOT null) AND (UNIDADCOMPRA <> '')) THEN
        SELECT UV.NumeroMultiplos, UV.Multiplo1, UV.Multiplo2, UV.Multiplo3
          FROM UNIDADESVENTA UV
         WHERE UV.Empresa = :pEmpresa
           AND UV.Unidad = :UNIDADCOMPRA
          INTO :NumeroMultiplos_Compra, :Multiplo1_Compra, :Multiplo2_Compra, :Multiplo3_Compra;

    -- Devolvemos el articulo
      SUSPEND;
  END
END ^

ALTER PROCEDURE SP_OBTENCLIENTESDESCUENTOS (PEMPRESA INTEGER,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
DECLARE VARIABLE vQry VARCHAR(2000);
BEGIN
  /**********************************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR EL PRECIO Y DESCUENTOS ESPECIALES DE UN CLIENTE PARA UN ARTICULO */
  /**********************************************************************************************/
  -- Controles Iniciales
    IF (PEMPRESA IS NULL) THEN PEMPRESA = 0;
    IF (PCLIENTE IS NULL) THEN PCLIENTE = '';
    IF (PCLIENTE IS NULL) THEN POBRA    = 0;
    IF (PFECHA IS NULL)   THEN PFECHA   = CURRENT_DATE;

  -- Parámetros opcionales
    IF (pObra IS NULL) THEN pObra = 0;
    IF (pArticulo IS NULL) THEN pArticulo = '';
    IF (pFamilia IS NULL) THEN pFamilia = '';
    IF (pSubFamilia IS NULL) THEN pSubFamilia = '';
    IF (pGrupo IS NULL) THEN pGrupo = '';
    IF (pSubGrupo IS NULL) THEN pSubGrupo = '';

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 DESCUENTO1, DESCUENTO2, DESCUENTO3, DESCUENTO4, DESCUENTO5 '
         || ' FROM clientesdescuentosespeciales '
         || 'WHERE Empresa = ' || pEmpresa
         || '  AND Cliente = ''' || pCliente || ''''
         || '  AND Obra = ' || pObra
         || '  AND ((Indefinido = 1) OR (FechaInicial <= ''' || pFecha || ''' AND FechaFinal >= ''' || pFecha || '''))';

  -- Parametros opcionales
    IF (pArticulo <> '') THEN
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    ELSE
      vQry = vQry || ' AND (Articulo is null)';

    IF (pFamilia <> '') THEN
    BEGIN
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';

      IF (pSubFamilia <> '') THEN
      BEGIN
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';

        IF (pGrupo <> '') THEN
        BEGIN
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          IF (pSubGrupo <> '') THEN
            vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
          ELSE
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        END
        ELSE
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      END
      ELSE
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    END
    ELSE
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC,INDEFINIDO DESC ';

  -- Lanzamos el Qry
    EXECUTE STATEMENT vQry INTO :Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5;

  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENCLIENTESPRECIOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
TARIFA INTEGER)
AS 
DECLARE VARIABLE vQry VARCHAR(2000);
BEGIN
  /**********************************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR EL PRECIO Y DESCUENTOS ESPECIALES DE UN CLIENTE PARA UN ARTICULO */
  /**********************************************************************************************/
  -- Controles Iniciales
    IF ((pEmpresa IS NULL) or (pEmpresa < 1900)) THEN EXCEPTION EX_GENERICA 'SP_OBTENCLIENTESPRECIOS:Falta informar o es incorrecta la empresa';
    IF ((pCliente IS NULL) or (pCliente = ''))   THEN EXCEPTION EX_GENERICA 'SP_OBTENCLIENTESPRECIOS:Falta informar o es incorrecto el cliente';
    IF (pFecha IS NULL) THEN EXCEPTION ex_generica 'SP_OBTENCLIENTESPRECIOS:Falta informar o es incorrecta la fecha de cálculo de la tarifa';

  -- Parámetros opcionales
    IF (pObra IS NULL) THEN pObra = 0;
    IF (pArticulo IS NULL) THEN pArticulo = '';
    IF (pFamilia IS NULL) THEN pFamilia = '';
    IF (pSubFamilia IS NULL) THEN pSubFamilia = '';
    IF (pGrupo IS NULL) THEN pGrupo = '';
    IF (pSubGrupo IS NULL) THEN pSubGrupo = '';

  -- Inicializamos variables
    PrecioNeto = null;
    NoAplicarDtoClte = null;
    NoAplicarDtoPP = null;

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 CASE WHEN T1.APLICA=0 THEN  T1.PRECIO ELSE COALESCE(T2.PRECIOVENTA,T1.PRECIO) END , '
         || '  T1.PRECIONETO, T1.NOAPLICARDTOCLTE, T1.NOAPLICARDTOPP,CAST(CASE WHEN T1.APLICA=0 THEN  NULL ELSE T1.TARIFA END AS INTEGER) '
         || ' FROM CLIENTESPRECIOSESPECIALES T1'
         || ' LEFT JOIN TARIFASVENTADETALLE T2 ON (T2.EMPRESA=T1.EMPRESA AND T2.DELEGACION='''||PDELEGACION||''' AND T2.TARIFA=T1.TARIFA AND T2.ARTICULO=T1.ARTICULO)'
         || 'WHERE T1.EMPRESA = ' || pEmpresa
         || '  AND T1.CLIENTE = ''' || coalesce(pCliente,'') || ''''
         || '  AND T1.OBRA = ' || pObra
         || '  AND ((T1.INDEFINIDO = 1) OR (T1.FECHAINICIAL <= ''' || pFecha || ''' AND T1.FECHAFINAL >= ''' || pFecha || '''))';

  -- Parametros opcionales
    IF (pArticulo <> '') THEN
      vQry = vQry || ' AND ((T1.Articulo IS NULL) or (T1.Articulo = ''' || pArticulo || '''))';
    ELSE
      vQry = vQry || ' AND (T1.Articulo IS NULL)';

    IF (pFamilia <> '') THEN
    BEGIN
      vQry = vQry || ' AND ((T1.Familia IS NULL) or (T1.Familia = ''' || pFamilia || '''))';

      IF (pSubFamilia <> '') THEN
      BEGIN
        vQry = vQry || ' AND ((T1.SubFamilia IS NULL) or (T1.SubFamilia = ''' || pSubFamilia || '''))';

        IF (pGrupo <> '') THEN
        BEGIN
          vQry = vQry || ' AND ((T1.Grupo IS NULL) or (T1.Grupo = ''' || pGrupo || '''))';

          IF (pSubGrupo <> '') THEN
            vQry = vQry || ' AND ((T1.SubGrupo IS NULL) or (T1.SubGrupo = ''' || pSubGrupo || '''))';
          ELSE
            vQry = vQry || ' AND (T1.SubGrupo IS NULL) ';
        END
        ELSE
          vQry = vQry || ' AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
      END
      ELSE
        vQry = vQry || ' AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
    END
    ELSE
      vQry = vQry || ' AND (T1.Familia IS NULL) AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY T1.ARTICULO DESC, T1.FAMILIA DESC, T1.SUBFAMILIA DESC, T1.GRUPO DESC, T1.SUBGRUPO DESC, T1.INDEFINIDO DESC, 5 ';

  -- Lanzamos el Qry
    EXECUTE STATEMENT vQry INTO :Precio, :PrecioNeto, :NoAplicarDtoClte, :NoAplicarDtoPP, :TARIFA;

  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENDTOPORCANTIDADART (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCANTIDAD DECIMAL(15, 3),
PFECHA DATE)
RETURNS (DESCUENTO NUMERIC(5, 2))
AS 
BEGIN
  -- Controles iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900)) then EXCEPTION EX_GENERICA 'SP_OBTENDTOPORCANTIDADART:Falta informar o es incorrecta la empresa';
    if ((pArticulo is null) or (pArticulo = '')) then EXCEPTION EX_GENERICA 'SP_OBTENDTOPORCANTIDADART:Falta informar o es incorrecto el artículo';
    if (pFecha is null) then EXCEPTION ex_generica 'SP_OBTENDTOPORCANTIDADART:Falta informar o es incorrecta la fecha';

  -- Controles opcionales e inicializaciones
    Descuento = null;

--    descuento = 0;
  -- Lanzamos el select

    pcantidad  = abs(pCantidad);

    FOR SELECT FIRST 1 DESCUENTO
          FROM ARTICULOSDESCUENTOSCANTIDAD
         WHERE EMPRESA = :PEMPRESA
           AND ARTICULO = :PARTICULO
           AND CANTIDAD <= :PCANTIDAD
           AND ((INDEFINIDO = 1) OR (FECHAINICIAL <= :PFECHA AND FECHAFINAL >= :PFECHA))
         ORDER BY CANTIDAD DESC
          INTO :DESCUENTO  DO  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENDTOPORCANTIDADCLTE (PEMPRESA INTEGER,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCANTIDAD DECIMAL(15, 3),
PFECHA DATE)
RETURNS (DESCUENTO NUMERIC(5, 2))
AS 
begin
  -- Controles iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900)) then EXCEPTION EX_GENERICA 'SP_OBTENDTOPORCANTIDADCLTE:Falta informar o es incorrecta la empresa';
    if ((pCliente is null) or (pCliente = ''))   then EXCEPTION EX_GENERICA 'SP_OBTENDTOPORCANTIDADCLTE:Falta informar o es incorrecto el cliente';
    if ((pArticulo is null) or (pArticulo = '')) then EXCEPTION EX_GENERICA 'SP_OBTENDTOPORCANTIDADCLTE:Falta informar o es incorrecto el artículo';
    if (pFecha is null) then EXCEPTION ex_generica 'SP_OBTENDTOPORCANTIDADCLTE:Falta informar o es incorrecta la fecha de cálculo de la tarifa';

  -- Controles opcionales e inicializaciones
    if (pObra is null) then pObra = 0;
    Descuento = null;

    pcantidad = abs(pCantidad);
--    descuento = 0;
  -- Lanzamos el select
    SELECT FIRST 1 Descuento
      FROM clientesdescuentoscantidad
     WHERE Empresa = :pEmpresa
       AND Cliente = :pCliente
       AND Obra = :pObra
       AND Articulo = :pArticulo
       AND Cantidad <= :pCantidad
       AND ((Indefinido = 1) or
            (coalesce(FechaInicial,:pfecha) <= :pFecha and coalesce(FechaFinal,:pfecha) >= :pFecha))
     ORDER BY Cantidad DESC
      INTO :Descuento;

  suspend;
end ^

ALTER PROCEDURE SP_OBTENERPRECIOVENTA (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PTARIFA INTEGER,
PFECHA DATE,
PCANTIDAD NUMERIC(15, 3),
PENVASE VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (TARIFA INTEGER,
PRECIO NUMERIC(15, 5),
PRECIOBRUTO NUMERIC(15, 5),
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2),
COSTE NUMERIC(15, 6),
RECARGO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
NOAPLICARRETENCION SMALLINT,
APLICADO VARCHAR(150) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VORDENPRECIOS VARCHAR(16000);
DECLARE VARIABLE VORDENDESCUENTOS VARCHAR(16000);
BEGIN
    PRECIO = 0;
    FOR SELECT TARIFA, PRECIOVENTA AS PRECIO, 0 AS PRECIOBRUTO,
              0 AS DESCUENTO1, 0 AS DESCUENTO2, 0 AS DESCUENTO3, 0 AS DESCUENTO4, 0 AS DESCUENTO5,
              0 AS COSTE, 0 AS RECARGO, PRECIOBASE AS PRECIONETO, 0 AS NOAPLICARDTOCLTE,
              0 AS NOAPLICARDTOPP, 0 AS NOAPLICARRETENCION, '' AS APLICADO
   FROM TARIFASVENTADETALLE WHERE EMPRESA = :PEMPRESA AND DELEGACION = :PDELEGACION AND ARTICULO = :PARTICULO
   INTO :TARIFA, :PRECIO, :PRECIOBRUTO,
        :DESCUENTO1, :DESCUENTO2, :DESCUENTO3, :DESCUENTO4, :DESCUENTO5,
        :COSTE, :RECARGO, :PRECIONETO, :NOAPLICARDTOCLTE,
        :NOAPLICARDTOPP,:NOAPLICARRETENCION, :APLICADO
   DO SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSDIRECT (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
DECLARE VARIABLE VGRUPODESCUENTO VARCHAR(15);
  DECLARE VARIABLE VQRY VARCHAR(2000);
  DECLARE VARIABLE LOOP SMALLINT;
  DECLARE VARIABLE EXEC SMALLINT;

BEGIN
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS Y DESCUENTOS ESPECIALES  */
  /************************************************************************/
  -- CONTROLES INICIALES
    IF ((PEMPRESA IS NULL) OR (PEMPRESA < 1900))     THEN EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSDTOS:Falta informar o es incorrecta la empresa';
    IF ((PDELEGACION IS NULL) OR (PDELEGACION = '')) THEN EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSDTOS:Falta informar o es incorrecta la delegación';
    IF ((PCLIENTE IS NULL) OR (PCLIENTE = ''))       THEN EXIT;

  -- PARÃ '';
    IF (PGRUPO IS NULL) THEN PGRUPO = '';
    IF (PSUBGRUPO IS NULL) THEN PSUBGRUPO = '';
    VGRUPODESCUENTO = NULL;

  -- BUSCAMOS EL GRUPO DE DESCUENTO DEL CLIENTE
    SELECT GRUPODESCUENTO
      FROM CLIENTES
     WHERE EMPRESA = :PEMPRESA
       AND CLIENTE = :PCLIENTE
       AND OBRA = :POBRA
      INTO :VGRUPODESCUENTO;

    IF ((VGRUPODESCUENTO IS NULL) OR (VGRUPODESCUENTO = '')) THEN EXIT;

    LOOP = 1;
    WHILE (LOOP <= 5) DO
    BEGIN
        EXEC = 0;
        -- MONTAMOS LA BASE DEL QRY
        VQRY = 'SELECT FIRST 1 DESCUENTO1, DESCUENTO2, DESCUENTO3, DESCUENTO4, DESCUENTO5 '
             || ' FROM GRUPOSDESCUENTOSDIRECTOS '
             || 'WHERE EMPRESA = ' || PEMPRESA
             || '  AND DELEGACION = ''' || PDELEGACION || ''''
             || '  AND GRUPODESCUENTO = ''' || VGRUPODESCUENTO || '''';

        IF (LOOP = 1 AND  PARTICULO <> '') THEN
        BEGIN
          VQRY = VQRY || ' AND (ARTICULO = ''' || PARTICULO || ''')';
          EXEC = 1;
        END

        IF (LOOP = 2 AND  PFAMILIA <> '') THEN
        BEGIN
          VQRY = VQRY || ' AND (FAMILIA = ''' || PFAMILIA || ''')';
          EXEC = 1;
        END

        IF (LOOP = 3 AND  PSUBFAMILIA <> '') THEN
        BEGIN
          VQRY = VQRY || ' AND (SUBFAMILIA = ''' || PSUBFAMILIA || ''')';
          EXEC = 1;             
        END

        IF (LOOP = 4 AND  PGRUPO <> '') THEN
        BEGIN
          VQRY = VQRY || ' AND (GRUPO = ''' || PGRUPO || ''')';
          EXEC = 1;
        END

        IF (LOOP = 5 AND  PSUBGRUPO <> '') THEN
        BEGIN
          VQRY = VQRY || ' AND (SUBGRUPO = ''' || PSUBGRUPO || ''')';
          EXEC = 1;
        END

      -- ORDENACION
      VQRY = VQRY || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC ';

      -- LANZAMOS EL QRY
        IF (EXEC = 1) THEN
           FOR EXECUTE STATEMENT VQRY INTO :DESCUENTO1, :DESCUENTO2, :DESCUENTO3, :DESCUENTO4, :DESCUENTO5
             DO LOOP = 5;

        LOOP = LOOP + 1;
    END
  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSDTOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (GRUPODESCUENTO VARCHAR(5) CHARACTER SET WIN1252,
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
DECLARE VARIABLE VGRUPODESCUENTO VARCHAR(5);
DECLARE VARIABLE VQRY VARCHAR(2000);
BEGIN
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS Y DESCUENTOS ESPECIALES  */
  /************************************************************************/
  -- Controles Iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900))     then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSDTOS:Falta informar o es incorrecta la empresa';
    if ((pDelegacion is null) or (pDelegacion = '')) then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSDTOS:Falta informar o es incorrecta la delegación';
    if ((pCliente is null) or (pCliente = ''))       then EXIT;

  -- Parámetros opcionales
    if (pObra is null) then pObra = 0;
    if (pArticulo is null) then pArticulo = '';
    if (pFamilia is null) then pFamilia = '';
    if (pSubFamilia is null) then pSubFamilia = '';
    if (pGrupo is null) then pGrupo = '';
    if (pSubGrupo is null) then pSubGrupo = '';
    vGrupoDescuento = null;

  -- Buscamos el grupo de descuento del cliente
    SELECT GRUPODESCUENTO
      FROM CLIENTES
     WHERE Empresa = :pEmpresa
       AND Cliente = :pCliente
       AND Obra = :pObra
      INTO :vGrupoDescuento;

    if ((vGrupoDescuento is null) or (vGrupoDescuento = '')) then exit;

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 DESCUENTO1, DESCUENTO2, DESCUENTO3, DESCUENTO4, DESCUENTO5 '
         || ' FROM GRUPOSDESCUENTOSDTOS '
         || 'WHERE EMPRESA = ' || pEmpresa
         || '  AND DELEGACION = ''' || pDelegacion || ''''
         || '  AND GRUPODESCUENTO = ''' || vGrupoDescuento || '''';

  -- Parametros opcionales
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (Articulo is null)';

    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';

      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';

        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';

/* ESTO ES UN PARCHE PARA AZULEJERA/ALUMINOX QUE TIENE CARGADOS CEROS
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (Articulo is null)';

    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''0'') or (Familia = ''' || pFamilia || '''))';

      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''0'') or (SubFamilia = ''' || pSubFamilia || '''))';

        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''0'') or (Grupo = ''' || pGrupo || '''))';

          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((SubGrupo is null) or (subgrupo = ''0'') or (SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';


*/

    -- Ordenacion
      VQRY = VQRY || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC';

  -- Lanzamos el Qry
  FOR EXECUTE STATEMENT VQRY INTO :DESCUENTO1, :DESCUENTO2, :DESCUENTO3, :DESCUENTO4, :DESCUENTO5
  DO BEGIN
       GRUPODESCUENTO = VGRUPODESCUENTO;
  END




--  IF (COALESCE(DESCUENTO1, 0) + COALESCE(DESCUENTO2, 0) + COALESCE(DESCUENTO3, 0) +
--      COALESCE(DESCUENTO4, 0) + COALESCE(DESCUENTO5, 0) <> 0 ) THEN GRUPODESCUENTO = VGRUPODESCUENTO;


  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSDTOS_EX (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (GRUPODESCUENTO VARCHAR(5) CHARACTER SET WIN1252,
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
DECLARE VARIABLE VGRUPODESCUENTO VARCHAR(5);
DECLARE VARIABLE VGRUPODESCUENTO2 VARCHAR(5);
DECLARE VARIABLE VQRY VARCHAR(2000);
BEGIN
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS Y DESCUENTOS ESPECIALES  */
  /************************************************************************/
  -- Controles Iniciales
    IF ((pEmpresa IS NULL) OR (pEmpresa < 1900))     THEN EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSDTOS:Falta informar o es incorrecta la empresa';
    IF ((pDelegacion IS NULL) OR (pDelegacion = '')) THEN EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSDTOS:Falta informar o es incorrecta la delegación';
    IF ((pCliente IS NULL) OR (pCliente = ''))       THEN EXIT;

  -- Parámetros opcionales
    IF (pObra IS NULL) THEN pObra = 0;
    IF (pArticulo IS NULL) THEN pArticulo = '';
    IF (pFamilia IS NULL) THEN pFamilia = '';
    IF (pSubFamilia IS NULL) THEN pSubFamilia = '';
    IF (pGrupo IS NULL) THEN pGrupo = '';
    IF (pSubGrupo IS NULL) THEN pSubGrupo = '';
    vGrupoDescuento = NULL;
    vGrupoDescuento2 = NULL;

    SELECT GRUPODESCUENTO
      FROM CLIENTES
     WHERE Empresa = :pEmpresa
       AND Cliente = :pCliente
       AND Obra = :pObra
      INTO :vGrupoDescuento;

  vGrupoDescuento2 = vGrupoDescuento;


  -- Buscamos el grupo de descuento del cliente
    vQry = ' SELECT FIRST 1 GRUPODESCUENTO FROM CLIENTESEXCEPCIONESGRUPODTO '
        ||   ' WHERE Empresa = ' || :pEmpresa
        ||   '   AND Cliente = ''' || :pCliente || ''''
        ||   '   AND Obra = ' || :pObra;

  -- Parametros opcionales
    IF (pArticulo <> '') THEN
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    ELSE
      vQry = vQry || ' AND (Articulo is null)';

    IF (pFamilia <> '') THEN
    BEGIN
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';

      IF (pSubFamilia <> '') THEN
      BEGIN
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';

        IF (pGrupo <> '') THEN
        BEGIN
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          IF (pSubGrupo <> '') THEN
            vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
          ELSE
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        END
        ELSE
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      END
      ELSE
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    END
    ELSE
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY Articulo DESC, Familia DESC, SubFamilia DESC, Grupo DESC, SubGrupo DESC ';

    EXECUTE STATEMENT vQry INTO :vGrupoDescuento;

    IF ((vGrupoDescuento IS NULL) OR (vGrupoDescuento = '')) THEN EXIT;
    IF (vGrupoDescuento = vGrupoDescuento2) THEN EXIT;

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 DESCUENTO1, DESCUENTO2, DESCUENTO3, DESCUENTO4, DESCUENTO5 '
         || ' FROM gruposdescuentosdtos '
         || 'WHERE Empresa = ' || pEmpresa
         || '  AND Delegacion = ''' || pDelegacion || ''''
         || '  AND GrupoDescuento = ''' || vGrupoDescuento || '''';

  -- Parametros opcionales
    IF (pArticulo <> '') THEN
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    ELSE
      vQry = vQry || ' AND (Articulo is null)';

    IF (pFamilia <> '') THEN
    BEGIN
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';

      IF (pSubFamilia <> '') THEN
      BEGIN
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';

        IF (pGrupo <> '') THEN
        BEGIN
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          IF (pSubGrupo <> '') THEN
            vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
          ELSE
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        END
        ELSE
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      END
      ELSE
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    END
    ELSE
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY Articulo DESC, Familia DESC, SubFamilia DESC, Grupo DESC, SubGrupo DESC ';

  -- Lanzamos el Qry
  FOR EXECUTE STATEMENT vQry INTO :Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5
  DO GRUPODESCUENTO = VGRUPODESCUENTO;

/*  IF (COALESCE(DESCUENTO1, 0) + COALESCE(DESCUENTO2, 0) + COALESCE(DESCUENTO3, 0) +
      COALESCE(DESCUENTO4, 0) + COALESCE(DESCUENTO5, 0) <> 0 ) THEN GRUPODESCUENTO = VGRUPODESCUENTO;*/

  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSPRECIOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
declare variable vGrupoDescuento VARCHAR(15);
  declare variable vQry VARCHAR(2000);
begin
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS Y DESCUENTOS ESPECIALES  */
  /************************************************************************/
  -- Controles Iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900))     then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSPRECIOS:Falta informar o es incorrecta la empresa';
    if ((pDelegacion is null) or (pDelegacion = '')) then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSPRECIOS:Falta informar o es incorrecta la delegación';
    if ((pCliente is null) or (pCliente = ''))       then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSPRECIOS:Falta informar o es incorrecto el cliente';

  -- Parámetros opcionales
    if (pObra is null) then pObra = 0;
    if (pArticulo is null) then pArticulo = '';
    if (pFamilia is null) then pFamilia = '';
    if (pSubFamilia is null) then pSubFamilia = '';
    if (pGrupo is null) then pGrupo = '';
    if (pSubGrupo is null) then pSubGrupo = '';
    vGrupoDescuento = null;

  -- Inicializamos valores
    PrecioNeto = null;
    NoAplicarDtoClte = null;
    NoAplicarDtoPP = null;

  -- Buscamos el grupo de descuento del cliente
    SELECT GRUPODESCUENTO
      FROM CLIENTES
     WHERE Empresa = :pEmpresa
       AND Cliente = :pCliente
       AND Obra = :pObra
      INTO :vGrupoDescuento;

    if ((vGrupoDescuento is null) or (vGrupoDescuento = '')) then exit;

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 PRECIO, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP '
         || ' FROM gruposdescuentosprecios '
         || 'WHERE Empresa = ' || pEmpresa
         || '  AND Delegacion = ''' || pDelegacion || ''''
         || '  AND GrupoDescuento = ''' || vGrupoDescuento || '''';

  -- Parametros opcionales
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (Articulo is null)';

    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';

      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';

        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC ';

  -- Lanzamos el Qry
    EXECUTE STATEMENT vQry INTO :Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP;

  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSDESCUENTOSTRAMOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PCANTIDAD NUMERIC(15, 3))
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
declare variable vGrupoDescuento VARCHAR(15);
  declare variable vQry VARCHAR(2000);
begin
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS Y DESCUENTOS ESPECIALES  */
  /************************************************************************/
  -- Controles Iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900))     then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSTRAMOS:Falta informar o es incorrecta la empresa';
    if ((pDelegacion is null) or (pDelegacion = '')) then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSTRAMOS:Falta informar o es incorrecta la delegación';
    if ((pCliente is null) or (pCliente = ''))       then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSDESCUENTOSTRAMOS:Falta informar o es incorrecto el cliente';

  -- Parámetros opcionales
    if (pObra is null) then pObra = 0;
    if (pArticulo is null) then pArticulo = '';
    if (pFamilia is null) then pFamilia = '';
    if (pSubFamilia is null) then pSubFamilia = '';
    if (pGrupo is null) then pGrupo = '';
    if (pSubGrupo is null) then pSubGrupo = '';
    vGrupoDescuento = null;

  -- Buscamos el grupo de descuento del cliente
    SELECT GRUPODESCUENTO
      FROM CLIENTES
     WHERE Empresa = :pEmpresa
       AND Cliente = :pCliente
       AND Obra = :pObra
      INTO :vGrupoDescuento;

    if ((vGrupoDescuento is null) or (vGrupoDescuento = '')) then exit;

    if ((PCANTIDAD is null)) then exit;

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 DESCUENTO1, DESCUENTO2, DESCUENTO3, DESCUENTO4, DESCUENTO5 '
         || ' FROM gruposdescuentostramos '
         || 'WHERE Empresa = ' || pEmpresa
         || '  AND Delegacion = ''' || pDelegacion || ''''
         || '  AND GrupoDescuento = ''' || vGrupoDescuento || ''''
         || '  AND ' || PCANTIDAD || ' BETWEEN DESDECANTIDAD AND HASTACANTIDAD ';

  -- Parametros opcionales
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (Articulo is null)';

    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';

      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';

        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC ';


  -- Lanzamos el Qry
    EXECUTE STATEMENT vQry INTO :Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5;

  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSPRECIOSMARGENES (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PALMACEN VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
DECLARE VARIABLE VGRUPOPRECIO VARCHAR(15);
DECLARE VARIABLE VQRY VARCHAR(2000);
DECLARE VARIABLE vCOSTE   NUMERIC(15,5);
DECLARE VARIABLE vMARGEN  NUMERIC(5,2);
DECLARE VARIABLE VUSUARIO VARCHAR(32) ;

BEGIN
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS Y DESCUENTOS ESPECIALES  */
  /************************************************************************/
  -- Controles Iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900))     then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSPRECIOSMARGENES:Falta informar o es incorrecta la empresa';
    if ((pCliente is null) or (pCliente = ''))       then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSPRECIOSMARGENES:Falta informar o es incorrecto el cliente';

  -- Parámetros opcionales
    if (pObra is null) then pObra = 0;
    if (pArticulo is null) then pArticulo = '';
    if (pFamilia is null) then pFamilia = '';
    if (pSubFamilia is null) then pSubFamilia = '';
    if (pGrupo is null) then pGrupo = '';
    if (pSubGrupo is null) then pSubGrupo = '';
    vGRUPOPRECIO = null;

  -- Inicializamos valores
    PrecioNeto = null;
    NoAplicarDtoClte = null;
    NoAplicarDtoPP = null;

  -- Buscamos el grupo de descuento del cliente
    SELECT GRUPOPRECIO FROM CLIENTES
     WHERE EMPRESA = :PEMPRESA AND CLIENTE = :PCLIENTE AND OBRA = :POBRA
      INTO :VGRUPOPRECIO;

    IF (COALESCE(VGRUPOPRECIO,'')<>'') THEN
    BEGIN
        -- Montamos la base del Qry
        VQRY = 'SELECT FIRST 1 MARGEN, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP '
             || ' FROM GRUPOSPRECIOSMARGENES '
             || 'WHERE EMPRESA = ' || PEMPRESA
             || '  AND GRUPOPRECIO = ''' || vGRUPOPRECIO || '''';
        
        -- Parametros opcionales
        if (pArticulo <> '') then
          vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
        else
          vQry = vQry || ' AND (Articulo is null)';
        
        if (pFamilia <> '') then
        begin
          vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';
        
          if (pSubFamilia <> '') then
          begin
            vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';
        
            if (pGrupo <> '') then
            begin
              vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';
        
              if (pSubGrupo <> '') then
                vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
              else
                vQry = vQry || ' AND (SubGrupo IS NULL) ';
            end
            else
              vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
          end
          else
            vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
        
        -- Ordenacion
          VQRY = VQRY || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC ';
        
        -- Lanzamos el Qry
        EXECUTE STATEMENT vQry INTO :VMARGEN, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP;
        
        IF (COALESCE(VMARGEN,0)<>0) THEN
        BEGIN
           IF (PALMACEN IS NULL) THEN
           BEGIN
--              SELECT USUARIO FROM SYS_CURRENTUSER INTO :VUSUARIO;
--              SELECT VALOR FROM SYS_READ_REGISTRY_SETTINGS(:PEMPRESA,:VUSUARIO || ' almacen') INTO :PALMACEN;
                SELECT VALOR FROM SISTEMACONFIGURACION WHERE EMPRESA = :PEMPRESA AND CLAVE = :PEMPRESA||' almacen ' INTO:PALMACEN;
           END
        
        END
        IF (PRECIO IS NOT NULL) THEN
        BEGIN
           SUSPEND;
           EXIT;
        END
  END
  /****************************************************************************/
  /*** BUSCAMOS POR TODOS LOS POSIBLES GRUPOS DE PRECIOS DEL CLIENTES *********/
  /****************************************************************************/

      -- Montamos la base del Qry
    VQRY = 'SELECT FIRST 1 T1.MARGEN, T1.PRECIONETO, T1.NOAPLICARDTOCLTE, T1.NOAPLICARDTOPP '
         || ' FROM GRUPOSPRECIOSMARGENES T1'
         || ' LEFT JOIN CLIENTESGRUPOSPRECIOS T2 ON (T1.EMPRESA=T2.EMPRESA AND T1.GRUPOPRECIO=T2.GRUPOPRECIO)'
         || 'WHERE T1.EMPRESA = ' || PEMPRESA
         || '  AND T2.CLIENTE = ''' || PCLIENTE || ''' '
         || '  AND T2.OBRA    = ' || POBRA || ' ';
    
    -- Parametros opcionales
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((T1.Articulo is null) or (T1.Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (T1.Articulo is null)';
    
    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((T1.Familia is null) or (T1.Familia = ''' || pFamilia || '''))';
    
      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((T1.SubFamilia is null) or (T1.SubFamilia = ''' || pSubFamilia || '''))';
    
        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((T1.Grupo is null) or (T1.Grupo = ''' || pGrupo || '''))';
    
          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((T1.SubGrupo is null) or (T1.SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (T1.SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (T1.Familia IS NULL) AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
    
    -- Ordenacion
      VQRY = VQRY || ' ORDER BY T1.ARTICULO, T1.FAMILIA, T1.SUBFAMILIA, T1.GRUPO, T1.SUBGRUPO ';
    
    -- Lanzamos el Qry
    EXECUTE STATEMENT vQry INTO :VMARGEN, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP;
    
    IF (COALESCE(VMARGEN,0)<>0) THEN
    BEGIN
       IF (PALMACEN IS NULL) THEN
       BEGIN
--          SELECT USUARIO FROM SYS_CURRENTUSER INTO :VUSUARIO;
--          SELECT VALOR FROM SYS_READ_REGISTRY_SETTINGS(:PEMPRESA,:VUSUARIO || ' almacen') INTO :PALMACEN;
                SELECT VALOR FROM SISTEMACONFIGURACION WHERE EMPRESA = :PEMPRESA AND CLAVE = :PEMPRESA||' almacen ' INTO:PALMACEN;
       END
    END
    IF (PRECIO IS NOT NULL) THEN SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENGRUPOSPRECIOSPRECIOS (PEMPRESA INTEGER,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
declare variable vGRUPOPRECIO VARCHAR(15);
  declare variable vQry VARCHAR(2000);
begin
  /************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR GRUPOS DE PRECIOS                          */
  /************************************************************************/
  -- Controles Iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900))     then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSPRECIOSMARGENES:Falta informar o es incorrecta la empresa';
    if ((pCliente is null) or (pCliente = ''))       then EXCEPTION EX_GENERICA 'SP_OBTENGRUPOSPRECIOSMARGENES:Falta informar o es incorrecto el cliente';

  -- Parámetros opcionales
    if (pObra is null) then pObra = 0;
    if (pArticulo is null) then pArticulo = '';
    if (pFamilia is null) then pFamilia = '';
    if (pSubFamilia is null) then pSubFamilia = '';
    if (pGrupo is null) then pGrupo = '';
    if (pSubGrupo is null) then pSubGrupo = '';
    vGRUPOPRECIO = null;

  -- Inicializamos valores
    PrecioNeto = null;
    NoAplicarDtoClte = null;
    NoAplicarDtoPP = null;

  -- Buscamos el grupo de descuento del cliente
    SELECT GRUPOPRECIO FROM CLIENTES
     WHERE EMPRESA = :PEMPRESA AND CLIENTE = :PCLIENTE AND OBRA = :POBRA
      INTO :VGRUPOPRECIO;

    IF (COALESCE(VGRUPOPRECIO,'')<>'') THEN
    BEGIN
          -- Montamos la base del Qry
            VQRY = 'SELECT FIRST 1 PRECIO, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP '
                 || ' FROM GRUPOSPRECIOSPRECIOS '
                 || 'WHERE EMPRESA = ' || PEMPRESA
                 || '  AND GRUPOPRECIO = ''' || vGRUPOPRECIO || '''';
        
          -- Parametros opcionales
            if (pArticulo <> '') then
              vQry = vQry || ' AND ((Articulo is null) or (Articulo = ''' || pArticulo || '''))';
            else
              vQry = vQry || ' AND (Articulo is null)';
        
            if (pFamilia <> '') then
            begin
              vQry = vQry || ' AND ((Familia is null) or (Familia = ''' || pFamilia || '''))';
        
              if (pSubFamilia <> '') then
              begin
                vQry = vQry || ' AND ((SubFamilia is null) or (SubFamilia = ''' || pSubFamilia || '''))';
        
                if (pGrupo <> '') then
                begin
                  vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';
        
                  if (pSubGrupo <> '') then
                    vQry = vQry || ' AND ((SubGrupo is null) or (SubGrupo = ''' || pSubGrupo || '''))';
                  else
                    vQry = vQry || ' AND (SubGrupo IS NULL) ';
                end
                else
                  vQry = vQry || ' AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
              end
              else
                vQry = vQry || ' AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
            end
            else
              vQry = vQry || ' AND (Familia IS NULL) AND (SubFamilia IS NULL) AND (Grupo IS NULL) AND (SubGrupo IS NULL) ';
        
            -- Ordenacion
              VQRY = VQRY || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC ';
        
          -- Lanzamos el Qry
          EXECUTE STATEMENT vQry INTO :Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP;
        
          IF (PRECIO IS NOT NULL) THEN
          BEGIN
             SUSPEND;
             EXIT;
          END
  END

  /****************************************************************************/
  /*** BUSCAMOS POR TODOS LOS POSIBLES GRUPOS DE PRECIOS DEL CLIENTES *********/
  /****************************************************************************/

  -- Montamos la base del Qry
    VQRY = 'SELECT FIRST 1 T1.PRECIO, T1.PRECIONETO, T1.NOAPLICARDTOCLTE, T1.NOAPLICARDTOPP '
         || ' FROM GRUPOSPRECIOSPRECIOS T1'
         || ' LEFT JOIN CLIENTESGRUPOSPRECIOS T2 ON (T1.EMPRESA=T2.EMPRESA AND T1.GRUPOPRECIO=T2.GRUPOPRECIO)'
         || 'WHERE T1.EMPRESA = ' || PEMPRESA
         || '  AND T2.CLIENTE = ''' || PCLIENTE || ''' '
         || '  AND T2.OBRA    = ' || POBRA || ' ';

  -- Parametros opcionales
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((T1.Articulo is null) or (T1.Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (T1.Articulo is null)';

    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((T1.Familia is null) or (T1.Familia = ''' || pFamilia || '''))';

      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((T1.SubFamilia is null) or (T1.SubFamilia = ''' || pSubFamilia || '''))';

        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((T1.Grupo is null) or (T1.Grupo = ''' || pGrupo || '''))';

          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((T1.SubGrupo is null) or (T1.SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (T1.SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (T1.Familia IS NULL) AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';

    -- Ordenacion
      VQRY = VQRY || ' ORDER BY T1.ARTICULO DESC, T1.FAMILIA DESC, T1.SUBFAMILIA DESC, T1.GRUPO DESC, T1.SUBGRUPO DESC ';

  -- Lanzamos el Qry
  EXECUTE STATEMENT vQry INTO :Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP;

  IF (PRECIO IS NOT NULL) THEN SUSPEND;

END ^

ALTER PROCEDURE SP_OBTENOFERTASVENTADESCUENTOS (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PTARIFA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2))
AS 
DECLARE VARIABLE vQry VARCHAR(2000);
BEGIN
  /**********************************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR LOS DESCUENTOS ESPECIALES EN OFERTA DE UN ARTICULO */
  /**********************************************************************************************/
  -- Controles Iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900)) then EXCEPTION EX_GENERICA 'SP_OBTENOFERTASVENTADESCUENTOS:Falta informar o es incorrecta la empresa';
    if (pFecha is null) then EXCEPTION ex_generica 'SP_OBTENOFERTASVENTADESCUENTOS:Falta informar o es incorrecta la fecha de cálculo de la tarifa';

  -- Parámetros opcionales
    if (pArticulo is null) then pArticulo = '';
    if (pFamilia is null) then pFamilia = '';
    if (pSubFamilia is null) then pSubFamilia = '';
    if (pGrupo is null) then pGrupo = '';
    if (pSubGrupo is null) then pSubGrupo = '';

  -- Montamos la base del Qry
    vQry = 'SELECT FIRST 1 T1.DESCUENTO1, T1.DESCUENTO2, T1.DESCUENTO3, T1.DESCUENTO4, T1.DESCUENTO5 '
         || ' FROM OFERTASVENTADETALLE2 T1 '
         || ' JOIN OFERTASVENTA T2 ON (T2.EMPRESA = T1.EMPRESA AND T2.DELEGACION = T1.DELEGACION AND T2.OFERTA = T1.OFERTA)'
         || 'WHERE T1.EMPRESA = ' || PEMPRESA
         || '  AND T1.DELEGACION = ''' || PDELEGACION || ''' '
         || '  AND T2.TARIFA = ' || PTARIFA || ' '
         || '  AND ((T1.INDEFINIDO = 1) OR (T1.FECHAINICIAL <= ''' || PFECHA || ''' AND T1.FECHAFINAL >= ''' || PFECHA || '''))';

  -- Parametros opcionales
    if (pArticulo <> '') then
      vQry = vQry || ' AND ((T1.Articulo is null) or (T1.Articulo = ''' || pArticulo || '''))';
    else
      vQry = vQry || ' AND (T1.Articulo is null)';

    if (pFamilia <> '') then
    begin
      vQry = vQry || ' AND ((T1.Familia is null) or (T1.Familia = ''' || pFamilia || '''))';

      if (pSubFamilia <> '') then
      begin
        vQry = vQry || ' AND ((T1.SubFamilia is null) or (T1.SubFamilia = ''' || pSubFamilia || '''))';

        if (pGrupo <> '') then
        begin
          vQry = vQry || ' AND ((Grupo is null) or (Grupo = ''' || pGrupo || '''))';

          if (pSubGrupo <> '') then
            vQry = vQry || ' AND ((T1.SubGrupo is null) or (T1.SubGrupo = ''' || pSubGrupo || '''))';
          else
            vQry = vQry || ' AND (T1.SubGrupo IS NULL) ';
        end
        else
          vQry = vQry || ' AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
      end
      else
        vQry = vQry || ' AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';
    end
    else
      vQry = vQry || ' AND (T1.Familia IS NULL) AND (T1.SubFamilia IS NULL) AND (T1.Grupo IS NULL) AND (T1.SubGrupo IS NULL) ';

    -- Ordenacion
      vQry = vQry || ' ORDER BY T1.Articulo DESC, T1.Familia DESC, T1.SubFamilia DESC, T1.Grupo DESC, T1.SubGrupo DESC ';

  -- Lanzamos el Qry
    EXECUTE STATEMENT vQry INTO :Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5;
  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENPRECIOCANTIDADART (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCANTIDAD DECIMAL(15, 3),
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 3))
AS 
BEGIN
  -- Controles iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900)) then EXCEPTION EX_GENERICA 'SP_OBTENPRECIOCANTIDADART:Falta informar o es incorrecta la empresa';
    if ((pArticulo is null) or (pArticulo = '')) then EXCEPTION EX_GENERICA 'SP_OBTENPRECIOCANTIDADART:Falta informar o es incorrecto el artículo';
    if (pFecha is null) then EXCEPTION ex_generica 'SP_OBTENPRECIOCANTIDADART:Falta informar o es incorrecta la fecha';

  -- Controles opcionales e inicializaciones
    PRECIO = null;

--    descuento = 0;
  -- Lanzamos el select

    pcantidad  = abs(pCantidad);

    FOR SELECT FIRST 1 PRECIO
          FROM ARTICULOSPRECIOSCANTIDAD
         WHERE EMPRESA = :PEMPRESA
           AND ARTICULO = :PARTICULO
           AND CANTIDAD <= :PCANTIDAD
           AND ((INDEFINIDO = 1) OR (FECHAINICIAL <= :PFECHA AND FECHAFINAL >= :PFECHA))
         ORDER BY CANTIDAD DESC
          INTO :PRECIO  DO  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENPRECIOMARGENCLIENTE (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PALMACEN VARCHAR(3) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PSUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
PGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PSUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
PFECHA DATE)
RETURNS (PRECIO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
DECLARE VARIABLE VQRY VARCHAR(2000);
DECLARE VARIABLE vCOSTE   NUMERIC(15,5);
DECLARE VARIABLE vMARGEN  NUMERIC(5,2);
DECLARE VARIABLE VUSUARIO VARCHAR(32) ;

BEGIN
   /**************************************************************************/
   /* BUSCAR EL PRECIO DE VENTA A PARTIR DEL COSTE X MARGEN CLIENTE          */
   /**************************************************************************/

  -- Controles Iniciales
    IF ((PEMPRESA IS NULL) OR (PEMPRESA < 1900)) THEN EXCEPTION EX_GENERICA 'SP_OBTENPRECIOMARGENCLIENTE:Falta informar o es incorrecta la empresa';
    IF ((PCLIENTE IS NULL) OR (PCLIENTE = ''))   THEN EXCEPTION EX_GENERICA 'SP_OBTENPRECIOMARGENCLIENTE:Falta informar o es incorrecto el cliente';
    IF (PFECHA IS NULL) THEN EXCEPTION EX_GENERICA 'SP_OBTENPRECIOMARGENCLIENTE:Falta informar o es incorrecta la fecha';

  -- Parámetros opcionales
    IF (POBRA IS NULL)       THEN POBRA = 0;
    IF (PARTICULO IS NULL)   THEN PARTICULO = '';
    IF (PFAMILIA IS NULL)    THEN PFAMILIA = '';
    IF (PSUBFAMILIA IS NULL) THEN PSUBFAMILIA = '';
    IF (PGRUPO IS NULL)      THEN PGRUPO = '';
    IF (PSUBGRUPO IS NULL)   THEN PSUBGRUPO = '';

  -- Inicializamos variables
    PrecioNeto = null;
    NoAplicarDtoClte = null;
    NoAplicarDtoPP = null;

  -- Montamos la base del Qry
    VQRY = 'SELECT FIRST 1 MARGEN, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP  '
         || ' FROM CLIENTESMARGENCOSTES '
         || 'WHERE EMPRESA = ' || PEMPRESA
         || '  AND CLIENTE = ''' || COALESCE(PCLIENTE,'') || ''''
         || '  AND OBRA = ' || POBRA
         || '  AND ((INDEFINIDO = 1) OR (FECHAINICIAL <= ''' || PFECHA || ''' AND FECHAFINAL >= ''' || PFECHA || '''))';

  -- Parametros opcionales
    IF (PARTICULO <> '') THEN
      VQRY = VQRY || ' AND ((ARTICULO IS NULL) OR (ARTICULO = ''' || PARTICULO || '''))';
    ELSE
      VQRY = VQRY || ' AND (ARTICULO IS NULL)';

    IF (PFAMILIA <> '') THEN
    BEGIN
      VQRY = VQRY || ' AND ((FAMILIA IS NULL) OR (FAMILIA = ''' || PFAMILIA || '''))';

      IF (PSUBFAMILIA <> '') THEN
      BEGIN
        VQRY = VQRY || ' AND ((SUBFAMILIA IS NULL) OR (SUBFAMILIA = ''' || PSUBFAMILIA || '''))';

        IF (PGRUPO <> '') THEN
        BEGIN
          VQRY = VQRY || ' AND ((GRUPO IS NULL) OR (GRUPO = ''' || PGRUPO || '''))';

          IF (PSUBGRUPO <> '') THEN
            VQRY = VQRY || ' AND ((SUBGRUPO IS NULL) OR (SUBGRUPO = ''' || PSUBGRUPO || '''))';
          ELSE
            VQRY = VQRY || ' AND (SUBGRUPO IS NULL) ';
        END
        ELSE
          VQRY = VQRY || ' AND (GRUPO IS NULL) AND (SUBGRUPO IS NULL) ';
      END
      ELSE
        VQRY = VQRY || ' AND (SUBFAMILIA IS NULL) AND (GRUPO IS NULL) AND (SUBGRUPO IS NULL) ';
    END
    ELSE
      VQRY = VQRY || ' AND (FAMILIA IS NULL) AND (SUBFAMILIA IS NULL) AND (GRUPO IS NULL) AND (SUBGRUPO IS NULL) ';

    -- ORDENACION
      VQRY = VQRY || ' ORDER BY ARTICULO DESC, FAMILIA DESC, SUBFAMILIA DESC, GRUPO DESC, SUBGRUPO DESC, INDEFINIDO DESC  ';

  -- Lanzamos el Qry
    EXECUTE STATEMENT VQRY INTO :VMARGEN, :PRECIONETO, :NOAPLICARDTOCLTE, :NOAPLICARDTOPP;

    IF (COALESCE(VMARGEN,0)<>0) THEN
    BEGIN
       IF (PALMACEN IS NULL) THEN
       BEGIN
          SELECT VALOR FROM sistemaconfiguracion WHERE CLAVE = :PEMPRESA||' almacen ' INTO :PALMACEN;
       END
    END

    SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENPRECIOTARIFA (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PTARIFA INTEGER,
PFECHA DATE,
PPRECIONETO SMALLINT)
RETURNS (TARIFA INTEGER,
PRECIO DECIMAL(15, 5),
COSTE DECIMAL(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
IVAINCLUIDO SMALLINT,
APLICADO VARCHAR(150) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VIMPORTEDESCUENTO NUMERIC(15,2);
DECLARE VARIABLE VPORCENTAJEDESCUENTO NUMERIC(5,2);
DECLARE VARIABLE VPRECIONETO SMALLINT;
BEGIN
  /**************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR EL PRECIO DE TARIFA DE UN ARTICULO / CLIENTE */
  /**************************************************************************/

  -- Controles iniciales
    if ((pEmpresa is null) or (pEmpresa < 1900))     then EXCEPTION ex_generica 'SP_OBTENPRECIOTARIFA: Falta informar o es incorrecta la empresa';
    if ((pDelegacion is null) or (pDelegacion = '')) then EXCEPTION EX_GENERICA 'SP_OBTENPRECIOTARIFA: Falta informar o es incorrecta la delegación';
    if ((pArticulo is null) or (pArticulo = ''))     then EXCEPTION EX_GENERICA 'SP_OBTENPRECIOTARIFA: Falta informar o es incorrecto el artículo';

    if (pFecha is null) then EXCEPTION EX_GENERICA 'SP_OBTENPRECIOTARIFA: Falta informar o es incorrecta la fecha';

  -- controles adicionales o de parametros opcionales
    if (pObra is null) then pObra = 0;
    if (pTarifa is null) then pTarifa = 0;
    if (pCliente is null) then pCliente = '';

    if ((pTarifa = 0) and (pCliente = '')) then exit;

  -- Inicializamos valores
    Precio = null;
    Coste = 0;
    Tarifa = pTarifa;
    PRECIONETO = NULL;
    NOAPLICARDTOCLTE = NULL;
    NOAPLICARDTOPP = NULL;
    IVAINCLUIDO = 0;


    /* COMPROBAMOS SI TIENE PRECIO POR TARIFA PRECIOS NETOS*/
    FOR SELECT TARIFA, PRECIO, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP
          FROM SP_OBTENTARIFAPRECIONETO(:PEMPRESA, :PARTICULO, :PCLIENTE, :POBRA)
        INTO :PTARIFA, :PRECIO,:PRECIONETO, :NOAPLICARDTOCLTE, :NOAPLICARDTOPP
    DO BEGIN
         Aplicado = 'Tarifas precios netos';
         TARIFA = PTARIFA;
         SUSPEND;
         EXIT;
    END


  -- Si la tarifa solicitada es 0 buscamos la tarifa del cliente
    IF (Tarifa = 0) THEN
    BEGIN
      SELECT Empresa, Tarifa
        FROM Clientes
       WHERE Empresa = :pEmpresa
         AND Cliente = :pCliente
         AND Obra = :pObra
        INTO :pEmpresa, :Tarifa;

      -- Control de existencia del cliente (Sin cliente no hay tarifa)
        if (pEmpresa is null) then EXCEPTION EX_GENERICA 'No se ha podido determinar la tarifa: el cliente no existe o es incorrecto.';
    END


  -- Buscamos el precio de tarifa
    SELECT FIRST 1 T2.PRECIO, T2.PRECIONETO, T2.NOAPLICARDTOCLTE, T2.NOAPLICARDTOPP
      FROM OFERTASVENTA T1
           INNER JOIN OFERTASVENTADETALLE T2 ON (T2.EMPRESA = T1.EMPRESA AND T2.DELEGACION = T1.DELEGACION AND T2.OFERTA = T1.OFERTA)
     WHERE T1.EMPRESA = :PEMPRESA
       AND T1.DELEGACION = :PDELEGACION
       AND T1.TARIFA = :TARIFA
       AND T2.ARTICULO = :PARTICULO
       AND ((T1.FECHAINICIO IS NULL) OR (T1.FECHAINICIO <= :PFECHA AND T1.FECHAFIN >= :PFECHA))
    INTO :PRECIO, :PRECIONETO, :NOAPLICARDTOCLTE, :NOAPLICARDTOPP;

    IF (PRECIO IS NULL) THEN
    BEGIN
      SELECT FIRST 1 T1.PRECIOVENTA, T2.PRECIONETO, T2.NOAPLICARDTOCLTE, T2.NOAPLICARDTOPP, T2.IVAINCLUIDO
        FROM TARIFASVENTADETALLE T1
        JOIN TARIFASVENTA T2 ON (T1.EMPRESA = T2.EMPRESA AND T1.DELEGACION = T2.DELEGACION AND T1.TARIFA = T2.TARIFA)
       WHERE T1.EMPRESA = :PEMPRESA
         AND T1.DELEGACION = :PDELEGACION
         AND T1.TARIFA = :TARIFA
         AND T1.ARTICULO = :PARTICULO
        INTO :PRECIO, :PRECIONETO, :NOAPLICARDTOCLTE, :NOAPLICARDTOPP, :IVAINCLUIDO;
        APLICADO = 'Tarifa venta ' || PTARIFA;
    END
    ELSE
      APLICADO = 'Oferta precio';

  /* buscamos descuentos en importe*/
  IF (PPRECIONETO <> 1) THEN
  FOR SELECT FIRST 1 COALESCE(IMPORTEDESCUENTO,0),COALESCE(PORCENTAJEDESCUENTO,0), NETO FROM CLIENTESDESCUENTOSIMPORTE
     WHERE Empresa = :pEmpresa
       AND Cliente = :pCliente
       AND Obra = :pObra
       AND Delegacion = :pDelegacion
       AND Tarifa = :Tarifa
       AND (IndefinIdo = 1 OR :PFECHA BETWEEN FechaInicial AND FechaInicial)
       INTO :vIMPORTEDESCUENTO, :vPORCENTAJEDESCUENTO,  PRECIONETO DO
--   IF (precioneto <> 1) THEN
      BEGIN
         IF (:vIMPORTEDESCUENTO <> 0) THEN BEGIN  PRECIO = PRECIO - vIMPORTEDESCUENTO; APLICADO = 'Tarifa dto importe'; END
         IF (:vPORCENTAJEDESCUENTO <> 0) THEN  BEGIN PRECIO = PRECIO - (PRECIO * vPORCENTAJEDESCUENTO / 100.00); APLICADO = 'Tarifa dto importe'; END
      END

  SUSPEND;
END ^

ALTER PROCEDURE SP_OBTENTARIFAPRECIONETO (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER)
RETURNS (TARIFA INTEGER,
PRECIO DECIMAL(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT)
AS 
DECLARE VARIABLE vIMPORTEDESCUENTO     NUMERIC(15,2);
DECLARE VARIABLE vPORCENTAJEDESCUENTO  NUMERIC(5,2);
DECLARE VARIABLE VPRECIONETO SMALLINT;

BEGIN
  /**************************************************************************/
  /* PROCEDIMIENTO PARA BUSCAR EL PRECIO EN TARIFAS PRECIOS NETOS           */
  /**************************************************************************/

  -- CONTROLES ADICIONALES O DE PARAMETROS OPCIONALES
    PEMPRESA = COALESCE(PEMPRESA,0);
    PARTICULO = COALESCE(PARTICULO,'');
    POBRA = COALESCE(POBRA,0);
    PCLIENTE = COALESCE(PCLIENTE,'');

  -- INICIALIZAMOS VALORES
    TARIFA = NULL;
    PRECIO = NULL;
    PRECIONETO = NULL;
    NOAPLICARDTOCLTE = NULL;
    NOAPLICARDTOPP = NULL;

    FOR SELECT FIRST 1 T1.TARIFA, T1.PRECIO, T1.NOAPLICARDTOPP, T1.NOAPLICARDTOCLTE,1
      FROM TARIFASPRECIOSNETOSDETALLE T1
      JOIN CLIENTESTARIFASPRECIOSNETOS T2 ON (T2.EMPRESA=T1.EMPRESA AND T2.TARIFA=T1.TARIFA)
      WHERE T1.EMPRESA  = :PEMPRESA
        AND T1.ARTICULO = :PARTICULO
        AND T2.CLIENTE  = :PCLIENTE
        AND T2.OBRA     = :POBRA
        AND T1.PRECIO <> 0
    INTO :TARIFA, :PRECIO, :NOAPLICARDTOPP, :NOAPLICARDTOCLTE, :PRECIONETO
    DO SUSPEND;
END ^

ALTER PROCEDURE SP_PARAMETROSORDENDTOSVENTA (PEMPRESA INTEGER)
RETURNS (PARAMETROS VARCHAR(16000) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VCLAVE VARCHAR(64);
DECLARE VARIABLE VVALOR VARCHAR(168);
DECLARE VARIABLE VACCION VARCHAR(1);
DECLARE VARIABLE VSEP VARCHAR(1);
BEGIN
      PARAMETROS = '';
      VSEP = '';
      FOR SELECT Clave, Valor FROM SISTEMACONFIGURACION
             WHERE clave STARTING :pempresa||' descuentos '
             ORDER BY clave
              INTO :vClave, :vValor DO

      BEGIN
            IF (StrPos('accion', vClave) <> 0) THEN
              vAccion = vValor;
            ELSE
              IF (StrPos('orden', vClave) <> 0) THEN
                IF ((vAccion <> '2'))  THEN
                BEGIN
                   PARAMETROS = PARAMETROS || VSEP || VVALOR || '##' || VACCION;
                   VSEP = '|';
                END
        END

  SUSPEND;
END ^

ALTER PROCEDURE SP_PARAMETROSORDENPRECIOVENTA (PEMPRESA INTEGER)
RETURNS (PARAMETROS VARCHAR(16000) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VCLAVE VARCHAR(64);
DECLARE VARIABLE VVALOR VARCHAR(168);
DECLARE VARIABLE VSEP VARCHAR(1);
BEGIN
      PARAMETROS = '';
      VSEP = '';
      FOR SELECT Clave, Valor FROM SISTEMACONFIGURACION
             WHERE clave STARTING :pempresa||' precios_'
             ORDER BY clave
              INTO :vClave, :vValor DO

      BEGIN

          IF (StrPos('orden', vClave) <> 0) THEN
            BEGIN
               PARAMETROS = PARAMETROS || VSEP || VVALOR;
               VSEP = '|';    
            END
       end
  SUSPEND;
END ^

ALTER PROCEDURE SP_SEPARARPARAMETROS (PARAMETROS VARCHAR(16000) CHARACTER SET WIN1252)
RETURNS (VALOR VARCHAR(168) CHARACTER SET WIN1252,
ACCION VARCHAR(1) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE SUBCADENA VARCHAR(200) ;
DECLARE VARIABLE vPos INTEGER;
DECLARE VARIABLE vPos2 INTEGER;
BEGIN
   vPos = Strpos('|', PARAMETROS);
   WHILE (vPos <> 0) DO
   BEGIN
        -- Calculamos el campo a enlazar y si se tiene que repetir el bucle
        SUBCADENA = SubStr(PARAMETROS, 1, vPos - 1);
        PARAMETROS = SubStr(PARAMETROS, vPos + 1, Strlen(PARAMETROS));

        vPos2  = Strpos('##',SUBCADENA);
        VALOR  = Substr(SUBCADENA,1,vPos2 -1);
        ACCION = Substr(SUBCADENA,vPos2 +2,1);
        vPos = Strpos('|', PARAMETROS);
        SUSPEND;
   END
   IF (TRIM(PARAMETROS) <> '') THEN
    BEGIN
        vPos2  = Strpos('##',PARAMETROS);
        VALOR  = Substr(PARAMETROS,1,vPos2 -1);
        ACCION = Substr(PARAMETROS,vPos2 +2,1);
        SUSPEND;
    END
END ^

ALTER PROCEDURE SP_SUB_CODIGOARTICULO (PEMPRESA INTEGER,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PTIPO VARCHAR(1) CHARACTER SET WIN1252,
PPROVEEDOR VARCHAR(14) CHARACTER SET WIN1252,
PBUSCARESPECIAL SMALLINT)
RETURNS (EMPRESA INTEGER,
ARTICULO VARCHAR(32) CHARACTER SET WIN1252,
TIPO CHAR(1) CHARACTER SET WIN1252,
CODIGOADICIONAL VARCHAR(32) CHARACTER SET WIN1252,
DESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
DESCRIPCIONAMPLIADA BLOB CHARACTER SET WIN1252,
DESCRIPCIONENRIQUECIDA BLOB,
DESCRIPCIONPROVEEDOR VARCHAR(100) CHARACTER SET WIN1252,
IVACOMPRAS VARCHAR(5) CHARACTER SET WIN1252,
IVAVENTAS VARCHAR(5) CHARACTER SET WIN1252,
UNIDADVENTA VARCHAR(5) CHARACTER SET WIN1252,
UNIDADCOMPRA VARCHAR(5) CHARACTER SET WIN1252,
ACTUALIZASTOCK SMALLINT,
PROVEEDOR VARCHAR(14) CHARACTER SET WIN1252,
FAMILIA VARCHAR(15) CHARACTER SET WIN1252,
SUBFAMILIA VARCHAR(15) CHARACTER SET WIN1252,
GRUPO VARCHAR(15) CHARACTER SET WIN1252,
SUBGRUPO VARCHAR(15) CHARACTER SET WIN1252,
LOTES SMALLINT,
SERIES SMALLINT,
CADUCIDADES SMALLINT,
TALLAS SMALLINT,
COLORES SMALLINT,
MULTIUBICACIONES SMALLINT,
TRAZABILIDADAUTOMATICA SMALLINT,
OBSERVACIONES BLOB CHARACTER SET WIN1252,
WEBDESCRIPCION VARCHAR(100) CHARACTER SET WIN1252,
WEBDESCRIPCIONAMPL BLOB CHARACTER SET WIN1252,
WEBFICHATECNICA BLOB CHARACTER SET WIN1252,
CANTIDAD NUMERIC(15, 3),
PRECIO NUMERIC(15, 3),
REFERENCIAPRECIO VARCHAR(15) CHARACTER SET WIN1252,
TIPOARTICULO VARCHAR(5) CHARACTER SET WIN1252,
SECUENCIA VARCHAR(32) CHARACTER SET WIN1252,
MEDIDAS VARCHAR(15) CHARACTER SET WIN1252,
PESO NUMERIC(15, 4),
ESTADO VARCHAR(5) CHARACTER SET WIN1252,
CODIGOBARRAS VARCHAR(32) CHARACTER SET WIN1252,
CODIGOPROVEEDOR VARCHAR(32) CHARACTER SET WIN1252,
CODIGOEDI VARCHAR(32) CHARACTER SET WIN1252,
CODIGOFARMACIA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOBALANZA VARCHAR(32) CHARACTER SET WIN1252,
CODIGOOTROS VARCHAR(32) CHARACTER SET WIN1252,
IMAGEN INTEGER,
RAEE NUMERIC(15, 2),
UNIDADESEMBALAJE NUMERIC(15, 3),
EMBALAJE VARCHAR(5) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VQRY VARCHAR(1100);
DECLARE VARIABLE BUCLE INTEGER;
BEGIN
    ARTICULO = NULL;
    CANTIDAD = 0;
    PRECIO   = 0;
    UNIDADESEMBALAJE = 0;

  /* Buscamos directamente el articulo que nos han pasado */
    SELECT T1.Empresa, T1.Articulo, T1.Descripcion, T1.Articulo, T1.Descripcion, T1.DescripcionAmpliada,
           T1.IvaCompras, T1.IvaVentas, T1.UnidadVenta, T1.UnidadCompra,
           T1.ActualizaStock, T1.Proveedor, T1.Familia, T1.SubFamilia, T1.Grupo, T1.SubGrupo,
           T1.Lotes, T1.Series, T1.Caducidades, T1.Tallas, T1.Colores, T1.Multiubicaciones, T1.TRAZABILIDADAUTOMATICA,
           T1.Observaciones, T1.webdescripcion, T1.webdescripcionampl, t1.WebFichaTecnica,
           T1.ReferenciaPrecio, T1.Tipo, T1.Secuencia, T1.Medidas, T1.Peso,T1.ESTADO,T1.Codigobarras,
           T1.CODIGOPROVEEDOR, T1.CODIGOEDI, T1.CODIGOFARMACIA, T1.CODIGOBALANZA, T1.CODIGOOTROS,
           T1.IMAGEN, T1.DESCRIPCIONENRIQUECIDA, T1.RAEE
    FROM ARTICULOS T1
     WHERE T1.Empresa = :pEmpresa
       AND T1.Articulo = :pArticulo
      INTO :Empresa, :Articulo, :Descripcion, :CodigoAdicional, :DescripcionProveedor, :DescripcionAmpliada,
           :IvaCompras, :IvaVentas, :UnidadVenta, :UnidadCompra,
           :ActualizaStock, :Proveedor, :Familia, :SubFamilia, :Grupo, :SubGrupo,
           :Lotes, :Series, :Caducidades, :Tallas, :Colores, :Multiubicaciones, :TRAZABILIDADAUTOMATICA,
           :Observaciones, :webdescripcion, :webdescripcionampl, :WebFichaTecnica,
           :ReferenciaPrecio, :TipoArticulo, :Secuencia, :Medidas, :Peso, :ESTADO, :CODIGOBARRAS,
           :CODIGOPROVEEDOR, :CODIGOEDI, :CODIGOFARMACIA, :CODIGOBALANZA, :CODIGOOTROS,
           :IMAGEN, :DESCRIPCIONENRIQUECIDA, :RAEE;

    IF (Articulo IS NOT NULL) THEN /* Si existe el articulo directamente lo devolvemos */
    BEGIN
       IF (COALESCE(PPROVEEDOR,'') <> '') THEN
          SELECT FIRST 1 CODIGOADICIONAL FROM ARTICULOSACCESOS WHERE EMPRESA = :EMPRESA
                                                         AND ARTICULO = :ARTICULO
                                                         AND TIPO = 'P'
                                                         AND PROVEEDOR = :PPROVEEDOR
                                                         ORDER BY PREDETERMINADO DESC
                                 INTO :CODIGOPROVEEDOR;
       SUSPEND;
    END

  /* Si no existe el articulo buscamos en codigos de articulo alternativos */
    IF (pProveedor IS NOT NULL AND pProveedor <> '' /*AND BUCLE = 1*/) THEN BUCLE = 0; ELSE BUCLE = 1;

    WHILE (BUCLE < 2) DO
    BEGIN
        BUCLE = BUCLE + 1;
        IF ((Articulo IS NULL) OR (Articulo = '') ) THEN
        BEGIN
          vQry =  'SELECT T1.Empresa, T1.Articulo, T1.Descripcion, T1.TIPO, T1.CODIGOADICIONAL, '
               ||        'T2.Descripcion, T2.IvaCompras, T2.IvaVentas, T2.UnidadVenta, T2.UnidadCompra,'
               ||        'T2.ActualizaStock, T2.Lotes, T2.Series, T2.Caducidades, T2.Tallas, T2.Colores, T2.Multiubicaciones,T2.TRAZABILIDADAUTOMATICA, '
               ||        'T2.Familia, T2.SubFamilia, T2.Grupo, T2.SubGrupo,'
               ||        'T2.Observaciones, T2.webdescripcion, T2.webdescripcionampl, T2.WEBFICHATECNICA, T2.DESCRIPCIONAMPLIADA, '
               ||        'T2.ReferenciaPrecio, T2.Tipo, T2.Secuencia, T2.Medidas, T2.Peso, T2.ESTADO,'
               ||        'T2.CODIGOBARRAS,T2.CODIGOPROVEEDOR, T2.CODIGOEDI, T2.CODIGOFARMACIA, T2.CODIGOBALANZA, T2.CODIGOOTROS, T2.IMAGEN,'
               ||        'T2.DESCRIPCIONENRIQUECIDA, T2.RAEE, T1.UNIDADESEMBALAJE, T1.EMBALAJE '
               ||  ' FROM ARTICULOSACCESOS T1 '
               ||  ' LEFT JOIN ARTICULOS T2 ON (T1.EMPRESA = T2.EMPRESA AND T1.ARTICULO = T2.ARTICULO) '
               || ' WHERE T1.EMPRESA = ' || pEmpresa
               ||   ' AND T1.CODIGOADICIONAL = ''' || pArticulo || ''' '
               ||   ' AND T2.EMPRESA IS NOT NULL ';
    
          IF (pProveedor IS NOT NULL AND pProveedor <> '' AND BUCLE = 1) THEN
            vQry = vQry || ' AND T1.Proveedor = ''' || pProveedor || ''' AND T1.TIPO =''P'' ';

          IF (pTipo IS NOT NULL AND pTipo <> '' AND BUCLE = 2) THEN
            vQry = vQry || ' AND T1.TIPO = ''' || pTipo || ''' ';
    
    
          vQry = vQry || ' ORDER BY T1.TIPO, T1.CODIGOADICIONAL ';
    
          FOR EXECUTE STATEMENT vQry
            INTO :Empresa, :Articulo, :DescripcionProveedor, :Tipo, :CodigoAdicional, :Descripcion,
                 :IvaCompras, :IvaVentas, :UnidadVenta, :UnidadCompra, :ActualizaStock, :Lotes,
                 :Series, :Caducidades, :Tallas, :Colores, :Multiubicaciones, :TRAZABILIDADAUTOMATICA,
                 :Familia, :SubFamilia, :Grupo, :SubGrupo,
                 :Observaciones, :webdescripcion, :webdescripcionampl,
                 :WebFichaTecnica, :DescripcionAmpliada,
                 :ReferenciaPrecio, :TipoArticulo, :Secuencia, :Medidas, :Peso, :ESTADO,
                 :CODIGOBARRAS, :CODIGOPROVEEDOR, :CODIGOEDI, :CODIGOFARMACIA, :CODIGOBALANZA, :CODIGOOTROS,
                 :IMAGEN, :DESCRIPCIONENRIQUECIDA, :RAEE, :UNIDADESEMBALAJE, :EMBALAJE
          DO BEGIN
                IF (COALESCE(PPROVEEDOR,'') <> '') THEN
                     SELECT FIRST 1 CODIGOADICIONAL FROM ARTICULOSACCESOS WHERE EMPRESA = :EMPRESA
                                                                            AND ARTICULO = :ARTICULO
                                                                            AND TIPO = 'P'
                                                                            AND PROVEEDOR = :PPROVEEDOR
                                                                       ORDER BY PREDETERMINADO DESC
                                                    INTO :CODIGOPROVEEDOR;
    
                SUSPEND;                -- devolvemos todos los codigos alternativos encontrados
             END

    
        END
       IF (((Articulo IS NULL) OR (Articulo = '')) AND (COALESCE(PPROVEEDOR,'') = '') AND (BUCLE = 1)) THEN EXIT;


    END /* FIN DEL WHILE*/

  /* Si no existe el articulo buscamos en codigos de barras especiales por empresa */
    IF (((Articulo IS NULL) OR (Articulo = '')) AND (PBUSCARESPECIAL = 1)) THEN
    BEGIN
      /* Calculamos el codigo de articulo del codigo leido */
      /*Articulo = NULL;
      SELECT ARTICULO, PRECIO, CANTIDAD
        FROM SP_SUB_CODIGOARTICULO2(:PEMPRESA, :PARTICULO)
        INTO :Articulo, :Precio, :Cantidad;   */

      /* Si hemos encontrado codigo de articulo buscamos el articulo */

      IF (Articulo IS NOT NULL) THEN
      BEGIN
        vQry = 'SELECT Empresa, Articulo, Descripcion, DescripcionAmpliada,
                   CodigoAdicional, DescripcionProveedor,
                   IvaCompras, IvaVentas, UnidadVenta, UnidadCompra,
                   ActualizaStock, Proveedor, Familia, SubFamilia, Grupo, SubGrupo,
                   Lotes, Series, Caducidades, Tallas, Colores, Multiubicaciones, TRAZABILIDADAUTOMATICA,
                   Observaciones, webdescripcion, webdescripcionampl, WebFichaTecnica, Tipo,
                   ReferenciaPrecio, Tipo, Secuencia, Medidas, Peso, Estado, CODIGOBARRAS,
                   CODIGOPROVEEDOR, CODIGOEDI, CODIGOFARMACIA, CODIGOBALANZA, CODIGOOTROS,
                   IMAGEN, DESCRIPCIONENRIQUECIDA, RAEE, UNIDADESEMBALAJE, EMBALAJE
             FROM sp_sub_codigoarticulo('||:pEmpresa||','''|| :Articulo ||''', '''',null, null)';

        FOR EXECUTE STATEMENT VQRY
             INTO :Empresa, :Articulo, :Descripcion, :DescripcionAmpliada,
                  :CodigoAdicional, :DescripcionProveedor,
                  :IvaCompras, :IvaVentas, :UnidadVenta, :UnidadCompra,
                  :ActualizaStock, :Proveedor, :Familia, :SubFamilia, :Grupo, :SubGrupo,
                  :Lotes, :Series, :Caducidades, :Tallas, :Colores, :Multiubicaciones, :TRAZABILIDADAUTOMATICA,
                  :Observaciones, :webdescripcion, :webdescripcionampl, :WebFichaTecnica, :Tipo,
                  :ReferenciaPrecio, :TipoArticulo, :Secuencia, :Medidas, :Peso, :Estado,
                  :CODIGOBARRAS, :CODIGOPROVEEDOR, :CODIGOEDI, :CODIGOFARMACIA, :CODIGOBALANZA, :CODIGOOTROS,
                  :IMAGEN, :DESCRIPCIONENRIQUECIDA, :RAEE, :UNIDADESEMBALAJE, :EMBALAJE
        DO
          SUSPEND;
      END
    END

    /* si no encontro ningun articulo busca por descripcion */
END ^

ALTER PROCEDURE SP_SUB_OBTENERPRECIOVENTA (PEMPRESA INTEGER,
PDELEGACION VARCHAR(3) CHARACTER SET WIN1252,
PALMACEN VARCHAR(3) CHARACTER SET WIN1252,
PARTICULO VARCHAR(32) CHARACTER SET WIN1252,
PCLIENTE VARCHAR(14) CHARACTER SET WIN1252,
POBRA INTEGER,
PTARIFA INTEGER,
PFECHA DATE,
PCANTIDAD NUMERIC(15, 3),
PENVASE VARCHAR(15) CHARACTER SET WIN1252,
PORDENPRECIOS VARCHAR(16000) CHARACTER SET WIN1252,
PORDENDESCUENTOS VARCHAR(16000) CHARACTER SET WIN1252)
RETURNS (TARIFA INTEGER,
PRECIO NUMERIC(15, 5),
PRECIOBRUTO NUMERIC(15, 5),
DESCUENTO1 NUMERIC(5, 2),
DESCUENTO2 NUMERIC(5, 2),
DESCUENTO3 NUMERIC(5, 2),
DESCUENTO4 NUMERIC(5, 2),
DESCUENTO5 NUMERIC(5, 2),
COSTE NUMERIC(15, 6),
RECARGO NUMERIC(15, 5),
PRECIONETO SMALLINT,
NOAPLICARDTOCLTE SMALLINT,
NOAPLICARDTOPP SMALLINT,
NOAPLICARRETENCION SMALLINT,
APLICADO VARCHAR(150) CHARACTER SET WIN1252,
GRUPODESCUENTO VARCHAR(5) CHARACTER SET WIN1252)
AS 
DECLARE VARIABLE VSW_OBLIGATORIO SMALLINT;
DECLARE VARIABLE VSW_ADDDTO SMALLINT;
DECLARE VARIABLE VFAMILIA VARCHAR(15);
DECLARE VARIABLE VSUBFAMILIA VARCHAR(15);
DECLARE VARIABLE VGRUPO VARCHAR(15);
DECLARE VARIABLE VSUBGRUPO VARCHAR(15);
DECLARE VARIABLE VPRECIO DECIMAL(15,5);
DECLARE VARIABLE VVALOR VARCHAR(168);
DECLARE VARIABLE VACCION VARCHAR(1);
DECLARE VARIABLE VDESCUENTOS VARCHAR(1000);
DECLARE VARIABLE VDESCUENTOS2 VARCHAR(1000);
DECLARE VARIABLE VDESCUENTO NUMERIC(5,2);
DECLARE VARIABLE VPRECIONETO SMALLINT;
DECLARE VARIABLE VNOAPLICARDTOPP SMALLINT;
DECLARE VARIABLE VNOAPLICARDTOCLTE SMALLINT;
DECLARE VARIABLE VPRECIONETO2 SMALLINT;
DECLARE VARIABLE VNOAPLICARDTOPP2 SMALLINT;
DECLARE VARIABLE VNOAPLICARDTOCLTE2 SMALLINT;
DECLARE VARIABLE VCONTARDESCUENTOS SMALLINT;
DECLARE VARIABLE VCONTAR SMALLINT;
DECLARE VARIABLE VCONTAR2 SMALLINT;
DECLARE VARIABLE VGRUPODESCUENTO VARCHAR(15);
DECLARE VARIABLE VCLIENTEPRECIOS VARCHAR(14);
DECLARE VARIABLE TARIFANETA SMALLINT;
DECLARE VARIABLE vAPLICADO VARCHAR(150);
DECLARE VARIABLE WTARIFA INTEGER;

BEGIN
   /*
     SIEMPRE QUE SE ACTUALICE ESTE PROCEDIMIENTO
     TAMBIEN ACTURALIZAR EL PROCEDIMIENTO SP_OBTENERPRECIOVENTA
   */

  /*****************************************************************/
  /* PROCEDIMIENTO PARA CALCULAR EL PRECIO DE VENTA DE UN ARTICULO */
  /*****************************************************************/
  -- Controles iniciales
    IF ((pEmpresa IS NULL) OR (pEmpresa < 1900)) THEN EXCEPTION EX_GENERICA 'Falta informar o es incorrecta la empresa';
    IF ((pArticulo IS NULL) OR (pArticulo = '')) THEN EXIT;-- EXCEPTION EX_GENERICA 'Falta informar o es incorrecto el artículo';

  -- Controles opcionales
    IF (pTarifa IS NULL) THEN pTarifa = 0;
    IF (pCantidad IS NULL) THEN pCantidad = 0;
    IF (pEnvase IS NULL) THEN pEnvase = '';
    IF (pFecha IS NULL) THEN pFecha = CURRENT_DATE;

  -- Inicializamos variables de trabajo
    vSW_Obligatorio = 0;
    vPrecioNeto = 0;
    vNoAplicarDtoClte = 0;
    vNoAplicarDtoPP = 0;
    Coste = 0;
    Precio = 0;
    PrecioBruto = 0;
    PrecioNeto = 0;
    NoAplicarDtoClte = 0;
    NoAplicarDtoPP = 0;
    vDescuentos = '';
    Aplicado = '';

    /* COMPROBAMOS SI TIENE LOS PRECIOS DE OTRO CLIENTE*/

    SELECT CLIENTEPRECIOS FROM CLIENTES WHERE EMPRESA = :PEMPRESA AND CLIENTE = :PCLIENTE AND OBRA = :POBRA
       INTO :VCLIENTEPRECIOS;

    IF (VCLIENTEPRECIOS IS NOT NULL) THEN
    BEGIN
       PCLIENTE = :VCLIENTEPRECIOS;
       POBRA    = 0 ;
    END


  -- Buscamos el articulo y sus datos de la ficha
    SELECT Empresa, Familia, SubFamilia, Grupo, SubGrupo, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP, NoAplicarRetencion
      FROM Articulos
     WHERE Empresa = :pEmpresa
       AND Articulo = :pArticulo
      INTO :pEmpresa, :vFamilia, :vSubFamilia, :vGrupo, :vSubGrupo, :PrecioNeto, :NoAplicarDtoClte, :NoAplicarDtoPP, :NoAplicarRetencion;

  -- Control de existencia del articulo
    IF (pEmpresa IS NULL) THEN EXCEPTION EX_GENERICA 'No se ha encontrado la tarifa: el artículo informado no existe o es incorrecto';

    TARIFANETA = 0;

  -- COMPROBAMOS LAS TARIFAS DE PRECIOS NETOS QUE ES LA QUE PREVALECE SOBRE TODO
    FOR SELECT TARIFA, PRECIO, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP
          FROM SP_OBTENTARIFAPRECIONETO(:PEMPRESA, :PARTICULO, :PCLIENTE, :POBRA)
          INTO :TARIFA, :PRECIOBRUTO, :PRECIONETO, :vNoAplicarDtoClte, :vNoAplicarDtoPP
    DO BEGIN
          Aplicado = 'Tarifas precios netos';
          TARIFANETA = 1;
          COSTE = 0;
          RECARGO = 0;
          IF (vNoAplicarDtoPP = 1)   THEN NoAplicarDtoPP = 1;
          IF (vNoAplicarDtoClte = 1) THEN NoAplicarDtoClte = 1;
    END


  -- Miramos si el articulo esta marcado como precio neto o hay que calcular precio venta
    IF (TARIFANETA = 0) THEN
    BEGIN
        IF (PrecioNeto = 1) THEN                                 -- 0 = Precio calculado / 1 = Precio Neto
        BEGIN
          Aplicado = 'Precio Neto';
    
          -- Buscamos el precio de tarifa
            SELECT TARIFA, PRECIO, COSTE, NOAPLICARDTOCLTE, NOAPLICARDTOPP
              FROM SP_OBTENPRECIOTARIFA(:pEmpresa, :pDelegacion, :pArticulo, :pCliente, :pObra, :pTarifa, :pFecha,:PrecioNeto)
              INTO :TARIFA, :PRECIOBRUTO, :COSTE, :vNoAplicarDtoClte, :vNoAplicarDtoPP;
    
            IF (vNoAplicarDtoPP = 1)   THEN NoAplicarDtoPP = 1;
            IF (vNoAplicarDtoClte = 1) THEN NoAplicarDtoClte = 1;
        END
        ELSE
        BEGIN
    /*****************/
    /* P R E C I O S */
    /*****************/
          -- Buscamos los distintos precios de venta en el orden de la configuracion de empresa
          FOR SELECT VALOR, ACCION FROM SP_SEPARARPARAMETROS(:PORDENPRECIOS)
              INTO :vVALOR, :vACCION DO
          BEGIN
              -- Miramos si estamos procesando un nombre de origen o una accion
                Precio = 0;
                IF ((vAccion = '1') OR (vSW_Obligatorio = 0 and vAccion <> '2'))  THEN
                    BEGIN
                      -- Buscamos el precio
                      IF (vValor = 'tarifa') THEN
                      BEGIN
                        SELECT TARIFA, PRECIO, COSTE, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP, APLICADO
                          FROM SP_OBTENPRECIOTARIFA(:pEmpresa, :pDelegacion, :pArticulo, :pCliente, :pObra, :pTarifa, :pFecha,0)
                          INTO :TARIFA, :vPRECIO, :COSTE, :vPrecioNeto, :vNoAplicarDtoClte, :vNoAplicarDtoPP, :vaplicado;
                          IF (VAPLICADO is not null) THEN VVALOR = VAPLICADO;
                      END
                      ELSE IF (vValor = 'especiales' AND COALESCE(:pCliente,'') <> '') THEN
                      BEGIN
                        SELECT Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP, Tarifa
                          FROM SP_OBTENCLIENTESPRECIOS(:pEmpresa, :pDelegacion, :pCliente, :pObra, :pArticulo, :vFamilia, :vSubFamilia, :vGrupo, :vSubGrupo, :pFecha)
                          INTO :vPrecio, :vPrecioNeto, :vNoAplicarDtoClte, :vNoAplicarDtoPP, :WTARIFA;
                          IF (WTARIFA IS NOT NULL AND WTARIFA<>0) THEN
                          BEGIN
                              TARIFA = WTARIFA;
                              VVALOR = 'Tarifa Venta ' || TARIFA;
                          END
                      END
                      ELSE IF (vValor = 'descuentos' AND COALESCE(:pCliente,'') <> '') THEN
                      BEGIN
                        SELECT Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP
                          FROM SP_OBTENGRUPOSDESCUENTOSPRECIOS(:pEmpresa, :pDelegacion, :pCliente, :pObra, :pArticulo, :vFamilia, :vSubFamilia, :vGrupo, :vSubGrupo)
                          INTO :vPrecio, :vPrecioNeto, :vNoAplicarDtoClte, :vNoAplicarDtoPP;
                      END
                      ELSE IF (vValor = 'margenclientecoste' AND COALESCE(:pCliente,'') <> '') THEN
                      BEGIN
                        -- TODO FALTA REALIZAR QUE RECIBA EL ALMACEN
                        SELECT PRECIO, PRECIONETO, NOAPLICARDTOCLTE, NOAPLICARDTOPP
                          FROM SP_OBTENPRECIOMARGENCLIENTE (:PEMPRESA, :PDELEGACION,:PALMACEN, :PCLIENTE, :POBRA, :PARTICULO, :VFAMILIA, :VSUBFAMILIA, :VGRUPO, :VSUBGRUPO, :PFECHA)
                          INTO :vPrecio, :vPrecioNeto, :vNoAplicarDtoClte, :vNoAplicarDtoPP;
                      END
                      ELSE IF (vValor = 'grupospreciosmargenes' AND COALESCE(:pCliente,'') <> '') THEN
                      BEGIN
                        -- TODO FALTA REALIZAR QUE RECIBA EL ALMACEN
                        SELECT Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP
                          FROM SP_OBTENGRUPOSPRECIOSMARGENES(:pEmpresa,:PDELEGACION,:PALMACEN, :pCliente, :pObra, :pArticulo, :vFamilia, :vSubFamilia, :vGrupo, :vSubGrupo,:PFECHA)
                          INTO :vPrecio, :vPrecioNeto, :vNoAplicarDtoClte, :vNoAplicarDtoPP;
                      END
                      ELSE IF (vValor = 'grupospreciosprecios' AND COALESCE(:pCliente,'') <> '') THEN
                      BEGIN
                        SELECT Precio, PrecioNeto, NoAplicarDtoClte, NoAplicarDtoPP
                          FROM SP_OBTENGRUPOSPRECIOSPRECIOS(:pEmpresa, :pCliente, :pObra, :pArticulo, :vFamilia, :vSubFamilia, :vGrupo, :vSubGrupo)
                          INTO :vPrecio, :vPrecioNeto, :vNoAplicarDtoClte, :vNoAplicarDtoPP;
                      END
                      ELSE IF (vValor = 'precioscantidadarticulo' ) THEN
                      BEGIN
                        FOR SELECT PRECIO FROM SP_OBTENPRECIOCANTIDADART(:PEMPRESA, :PARTICULO, :PCANTIDAD, :PFECHA) INTO :VPRECIO
                          DO BEGIN
                                :vPrecioNeto        = 0;
                                :vNoAplicarDtoClte  = 0;
                                :vNoAplicarDtoPP    = 0;
                             END 
                      END
    
                      -- Acumulamos el precio leido, Si existe miramos si es 'Sobreescribe' para no procesar mas 'Sobreescribe'
                      IF (vPrecio IS NOT NULL) THEN
                      BEGIN
                        PrecioBruto = PrecioBruto + vPrecio;
                        IF (vValor <> '') THEN
                           Aplicado = Aplicado || vValor || ';';
                        IF (vAccion = '0') THEN
                        BEGIN
                          vSW_Obligatorio = 1;
    
                          IF (vPrecioNeto IS NOT NULL)       THEN vPrecioNeto2 = vPrecioNeto;
                          IF (vNoAplicarDtoClte IS NOT NULL) THEN vNoAplicarDtoClte2 = vNoAplicarDtoClte;
                          IF (vNoAplicarDtoPP IS NOT NULL)   THEN vNoAplicarDtoPP2 = vNoAplicarDtoPP;
                        END
                      END
                    END
            END
    
            IF (vPrecioNeto2 IS NOT NULL AND PRECIONETO<>1)            THEN PrecioNeto = vPrecioNeto2;
            IF (vNoAplicarDtoClte2 IS NOT NULL AND NOAPLICARDTOCLTE<>1)THEN NoAplicarDtoClte = vNoAplicarDtoClte2;
            IF (vNoAplicarDtoPP2 IS NOT NULL AND NOAPLICARDTOPP<>1)    THEN NoAplicarDtoPP = vNoAplicarDtoPP2;
    
            IF (PrecioNeto IS NULL)       THEN PrecioNeto = 0;
            IF (NoAplicarDtoClte IS NULL) THEN NoAplicarDtoClte = 0;
            IF (NoAplicarDtoPP IS NULL)   THEN NoAplicarDtoPP = 0;
    
            Aplicado = Aplicado || ';';
    /***********************/
    /* D E S C U E N T O S */
    /***********************/
          -- Si el precio no es neto
          IF (PrecioNeto = 0) THEN
          BEGIN
            -- Inicializamos sw de proceso de valor obligatorio
              vSW_Obligatorio = 0;
    
              --buscamos descuento En ofertas
              Descuento1 = NULL;
              Descuento2 = NULL;
              Descuento3 = NULL;
              Descuento4 = NULL;
              Descuento5 = NULL;
              EXECUTE PROCEDURE SP_OBTENOFERTASVENTADESCUENTOS(PEMPRESA,:PDELEGACION, :PTARIFA, PARTICULO, VFAMILIA, VSUBFAMILIA, VGRUPO, VSUBGRUPO, PFECHA)
                         RETURNING_VALUES (:DESCUENTO1, :DESCUENTO2, :DESCUENTO3, :DESCUENTO4, :DESCUENTO5);

              IF ((Descuento1 IS NOT NULL)AND(Descuento1 <> 0)) THEN
                  BEGIN
                    vSW_AddDto = 1;
                    vDescuentos = vDescuentos || Descuento1 || ';';
                  END
                
              IF ((Descuento2 IS NOT NULL) AND (Descuento2 <> 0)) THEN
                  BEGIN
                    vSW_AddDto = 1;
                    vDescuentos = vDescuentos || Descuento2 || ';';
                  END
                
              IF ((Descuento3 IS NOT NULL)AND(Descuento3 <> 0)) THEN
                  BEGIN
                    vSW_AddDto = 1;
                    vDescuentos = vDescuentos || Descuento3 || ';';
                  END
                
              IF ((Descuento4 IS NOT NULL)AND(Descuento4 <> 0)) THEN
                  BEGIN
                    vSW_AddDto = 1;
                    vDescuentos = vDescuentos || Descuento4 || ';';
                  END
                
              IF ((Descuento5 IS NOT NULL) AND (Descuento5 <> 0)) THEN
                  BEGIN
                    vSW_AddDto = 1;
                    vDescuentos = vDescuentos || Descuento5 || ';';
                  END
    
                -- Marcamos como procesado el descuento si es obligatorio para evitar mas descuentos obligatorios
              IF (vSW_AddDto = 1) THEN
                BEGIN
                    Aplicado = Aplicado || 'Ofertas descuento';
                    vSW_Obligatorio = 1;
                END
    
    
            -- Calculamos los descuentos en funcion del orden establecido por el usuario y la existencia de registros
    
            vContarDescuentos = 0;
    
            IF (vSW_Obligatorio = 0) THEN
            FOR SELECT VALOR, ACCION FROM SP_SEPARARPARAMETROS(:PORDENDESCUENTOS)
                INTO :vVALOR, :vACCION DO
            BEGIN
              -- Miramos si estamos procesando un nombre de origen o una accion
               IF ((vAccion <> '2') and (vSW_Obligatorio = 0))  THEN
                  BEGIN
                    vSW_AddDto = 0;
    
                    -- Inicializamos variables de descuento
                    Descuento1 = NULL;
                    Descuento2 = NULL;
                    Descuento3 = NULL;
                    Descuento4 = NULL;
                    Descuento5 = NULL;
    
                    -- Buscamos el descuento
                    IF (vValor = 'descuentoproducto') THEN
                    BEGIN
                      SELECT COALESCE(DTOPRODUCTO,0) FROM CLIENTES WHERE EMPRESA = :PEMPRESA AND CLIENTE = :PCLIENTE AND OBRA = :POBRA
                      INTO :Descuento1;
                    END
                    ELSE IF (vValor = 'cantidadcliente') THEN
                    BEGIN
                      EXECUTE PROCEDURE SP_ObtenDtoPorCantidadClte(pEmpresa, pCliente, pObra, pArticulo, pCantidad, pFecha)
                         RETURNING_VALUES (:Descuento1);
                    END
                    ELSE IF (vValor = 'cantidadarticulo') THEN
                    BEGIN
                      EXECUTE PROCEDURE SP_ObtenDtoPorCantidadArt(pEmpresa, pArticulo, pCantidad, pFecha)
                         RETURNING_VALUES (:Descuento1);
                    END
                    ELSE IF (vValor = 'especiales') THEN
                    BEGIN
                      EXECUTE PROCEDURE SP_ObtenClientesDescuentos(pEmpresa, pCliente, pObra, pArticulo, vFamilia, vSubFamilia, vGrupo, vSubGrupo, pFecha)
                         RETURNING_VALUES (:Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5);
                    END
                    ELSE IF (vValor = 'descuentos') THEN
                    BEGIN
                      EXECUTE PROCEDURE sp_obtengruposdescuentosDtos(pEmpresa, pDelegacion, pCliente, pObra, pArticulo, vFamilia, vSubFamilia, vGrupo, vSubGrupo)
                        RETURNING_VALUES (:vGRUPODESCUENTO, :Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5);
                        IF (VGRUPODESCUENTO IS NOT NULL) THEN GRUPODESCUENTO = VGRUPODESCUENTO;
                    END
                    ELSE IF (vValor = 'descuentosexcepciones' ) THEN
                    BEGIN
                      EXECUTE PROCEDURE Sp_Obtengruposdescuentosdtos_Ex(pEmpresa, pDelegacion, pCliente, pObra, pArticulo, vFamilia, vSubFamilia, vGrupo, vSubGrupo)
                        RETURNING_VALUES (:vGRUPODESCUENTO, :Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5);
                        IF (VGRUPODESCUENTO IS NOT NULL) THEN GRUPODESCUENTO = VGRUPODESCUENTO;
                    END
                    ELSE IF (vValor = 'tramoscantidad') THEN
                    BEGIN
                      EXECUTE PROCEDURE sp_obtengruposdescuentosTramos(pEmpresa, pDelegacion, pCliente, pObra, pArticulo, vFamilia, vSubFamilia, vGrupo, vSubGrupo,pCantidad)
                          RETURNING_VALUES (:Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5);
                    END
                    ELSE IF (vValor = 'descuentosdirectos') THEN
                    BEGIN
                      EXECUTE PROCEDURE sp_obtengruposDescuentosDirect(pEmpresa, pDelegacion, pCliente, pObra, pArticulo, vFamilia, vSubFamilia, vGrupo, vSubGrupo)
                          RETURNING_VALUES (:Descuento1, :Descuento2, :Descuento3, :Descuento4, :Descuento5);
                    END
    
    
                    IF ((vAccion = '0')AND (Descuento1 IS NOT NULL)) THEN /* sobreescribir */
                    IF (vValor = 'descuentos' OR vValor = 'descuentosexcepciones'  OR vValor = 'especiales') THEN
                    BEGIN
                        IF (DESCUENTO1 IS NOT NULL) THEN VDESCUENTOS = '';
                    END
                    ELSE
                    BEGIN
                       vContar = 0;
                       vContar2 = 0;
                       SELECT COUNT(SUBCADENA) FROM sp_sub_separarcadena(:vDescuentos, ';')
                        INTO :vContar;
    
                       vDescuentos2 = '';
                       IF (COALESCE(vContar,0) <> 0) THEN
                       BEGIN
                           FOR SELECT CAST(SUBCADENA AS NUMERIC(5,2)) FROM sp_sub_separarcadena(:vDescuentos, ';')
                               INTO :vDescuento
                              DO
                              IF (vContar2 < vContar - vContarDescuentos) THEN
                              BEGIN
                                  vDescuentos2 = vDescuentos2 || vDescuento || ';';
                                  vContar2 = vContar2 + 1;
                              END
    
                           vDescuentos = vDescuentos2;
                       END
                    END
                    vContarDescuentos = 0;
    
                    IF ((Descuento1 IS NOT NULL) AND(Descuento1 <> 0)) THEN
                     BEGIN
                       vSW_AddDto = 1;
                       vContarDescuentos = vContarDescuentos +1;
                       vDescuentos = vDescuentos || Descuento1 || ';';
                     END
                    IF ((Descuento2 IS NOT NULL) AND(Descuento2 <> 0)) THEN
                     BEGIN
                       vSW_AddDto = 1;
                       vContarDescuentos = vContarDescuentos +1;
                       vDescuentos = vDescuentos || Descuento2 || ';';
                     END
                    IF ((Descuento3 IS NOT NULL) AND(Descuento3 <> 0)) THEN
                     BEGIN
                       vSW_AddDto = 1;
                       vContarDescuentos = vContarDescuentos +1;
                       vDescuentos = vDescuentos || Descuento3 || ';';
                     END
                    IF ((Descuento4 IS NOT NULL) AND(Descuento4 <> 0)) THEN
                     BEGIN
                       vSW_AddDto = 1;
                       vContarDescuentos = vContarDescuentos +1;
                       vDescuentos = vDescuentos || Descuento4 || ';';
                     END
                    IF ((Descuento5 IS NOT NULL) AND(Descuento5 <> 0)) THEN
                     BEGIN
                       vSW_AddDto = 1;
                       vContarDescuentos = vContarDescuentos +1;
                       vDescuentos = vDescuentos || Descuento5 || ';';
                     END
    
                    -- Marcamos como procesado el descuento si es obligatorio para evitar mas descuentos obligatorios
                    IF (vSW_AddDto = 1) THEN
                    BEGIN
                        Aplicado = Aplicado || vValor || ';';
                    END
                  END
            END
          END
        END
    END
  -- Recogemos los descuentos acumulados
    Descuento1 = NULL;
    Descuento2 = NULL;
    Descuento3 = NULL;
    Descuento4 = NULL;
    Descuento5 = NULL;
    IF (vDescuentos <> '') THEN
      FOR SELECT FIRST 5 CAST(SUBCADENA AS NUMERIC(5,2)) FROM SP_SUB_SEPARARCADENA(:vDescuentos, ';')
       INTO :vDescuento
      DO
      BEGIN
        IF (Descuento1 IS NULL) THEN Descuento1 = vDescuento; ELSE
        IF (Descuento2 IS NULL) THEN Descuento2 = vDescuento; ELSE
        IF (Descuento3 IS NULL) THEN Descuento3 = vDescuento; ELSE
        IF (Descuento4 IS NULL) THEN Descuento4 = vDescuento;
        ELSE
          Descuento5 = vDescuento;
      END

/*****************/
/* E N V A S E S */
/*****************/
  -- Si hay envase buscamos el posible recargo por envase
    Recargo = 0;
    /*IF (pEnvase <> '') THEN
    BEGIN
      SELECT RecargoNeto
        FROM sp_obtenerprecioenvase(:pEmpresa, :pEnvase, :pArticulo, :pCliente, :pObra, 1)
        INTO :Recargo;

      IF (Recargo IS NULL) THEN Recargo = 0;
      PrecioBruto = PrecioBruto + Recargo;
    END      */

/********************************************/
/* CALCULOS FINALES CON LOS DATOS RECOGIDOS */
/********************************************/
  -- Aplicamos los descuentos y el recargo al precio bruto para devolver el precio definitivo
    Precio = PrecioBruto;
    IF (Descuento1 IS NULL) THEN Descuento1 = 0; ELSE Precio = Precio - (Precio * (Descuento1 / 100.00));
    IF (Descuento2 IS NULL) THEN Descuento2 = 0; ELSE Precio = Precio - (Precio * (Descuento2 / 100.00));
    IF (Descuento3 IS NULL) THEN Descuento3 = 0; ELSE Precio = Precio - (Precio * (Descuento3 / 100.00));
    IF (Descuento4 IS NULL) THEN Descuento4 = 0; ELSE Precio = Precio - (Precio * (Descuento4 / 100.00));
    IF (Descuento5 IS NULL) THEN Descuento5 = 0; ELSE Precio = Precio - (Precio * (Descuento5 / 100.00));
  APLICADO = STRREPLACE(APLICADO,';;',';');
  SUSPEND;
END ^

ALTER PROCEDURE SP_SUB_SEPARARCADENA (PCADENA VARCHAR(5000) CHARACTER SET WIN1252,
PSEPARADOR VARCHAR(1) CHARACTER SET WIN1252)
RETURNS (SUBCADENA VARCHAR(50) CHARACTER SET WIN1252)
AS 
declare variable vPos INTEGER;
begin
  /* Procedimiento para separar en subcadenas delimitadas por un separador */

  -- Inicializamos variables de trabajo
    if (pSeparador is null) then pSeparador = '';

  -- Solo procesamos si hay separador
    if (pSeparador <> '') then
    begin
      vPos = Strpos(pSeparador, pCadena);
      WHILE (vPos <> 0) do
      begin
        -- Calculamos el campo a enlazar y si se tiene que repetir el bucle
        SubCadena = SubStr(pCadena, 1, (vPos - 1));
        pCadena = SubStr(pCadena, (vPos + 1), Strlen(pCadena));
        vPos = Strpos(pSeparador, pCadena);
        suspend;
      end
    end

  -- Devolvemos el resto
    SubCadena = pCadena;
    if (SubCadena <> '') then suspend;
end ^

ALTER PROCEDURE SYS_CURRENTUSER RETURNS (USUARIO VARCHAR(32) CHARACTER SET WIN1252,
FECHA DATE,
HORA TIME)
AS 
BEGIN
  FECHA = CURRENT_DATE;
  HORA = CURRENT_TIME;
  USUARIO = GET_LOGGED_USER();
  SUSPEND;
END ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
SET TERM ^ ;

/* Triggers only will work for SQL triggers */
CREATE TRIGGER TG_APKAVISOS_BF FOR APKAVISOS 
ACTIVE BEFORE UPDATE POSITION 0 
as
BEGIN
      DELETE FROM apkavisosconfirmados where EMPRESA = OLD.EMPRESA AND ID = OLD.ID AND PUNTO = OLD.PUNTO;
END ^

CREATE TRIGGER APKPEDIDOS_BF FOR APKPEDIDOS 
ACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS
BEGIN
  IF (INSERTING) THEN
    BEGIN
       SELECT USUARIO, FECHA, HORA FROM SYS_CURRENTUSER
       INTO NEW.USUARIOALTA, NEW.USUARIOFECHAALTA, NEW.USUARIOHORAALTA;
       NEW.USUARIOMODIFICACION      = NEW.USUARIOALTA;
       NEW.USUARIOFECHAMODIFICACION = NEW.USUARIOFECHAALTA;
       NEW.USUARIOHORAMODIFICACION  = NEW.USUARIOHORAALTA;
    END ELSE
  IF (UPDATING) THEN
    BEGIN
       SELECT USUARIO, FECHA, HORA FROM SYS_CURRENTUSER
         INTO NEW.USUARIOMODIFICACION, NEW.USUARIOFECHAMODIFICACION,
              NEW.USUARIOHORAMODIFICACION;

    END
END ^


SET TERM ; ^
COMMIT WORK;

/* Grant permissions for this database */
GRANT CREATE DATABASE TO USER MICROLAND;
