Ir a contenido



Necesito ayuda con base de datos


  • Por favor inicia una sesión para responder
38 respuestas en este tema
  • Pper
  • Provincia:Madrid


Una solución rápida que se me ocurre para automatizar el calculo de la bonificación.

1º Llevar el campo de bonificación a una tabla nueva que relacione el tipo de empleado con las distintos percepciones.

En al tabla Percepciones-Trabajador se agrega la columna tipo de devengo, el tipo de trabajador, y la cantidad

Ejemplo:

Tabla Percepciones

Tipo de Devengo | texto descriptivo
0                          |  “Salario Base”
1                          |   ”Bonificacion por venta”
 

Tabla Percepciones-Trabajador

Tipo de Trabajado  | Tipo de Devengo | Cantidad

0 (Dependiente)     | 0 (Salario Base)   | 2500€ ( xD)

0 (Dependiente)     | 1 (Bonificacion)    | 50€ (50€ x venta)

2º Ahora se podria agregar una tabla nomina
Tabla Nomina (Es una 1-N porque una nomina es solo de una empleado, pero un empleado puede tener N nominas)
ID empleado | Nº Nomina | Fecha Inicio | Fecha Fin | Total

3º Una tabla devengos
Tabla Devengos
Nº Nomina | Tipo de devengo (Lo cojo de Percepciones) | Cantidad (Opcional, Por ejemplo util para bonificaciones) | Total
0                |  0                                                                     | 1*                                                                                        | 2*

1*- La cantidad se calcula segun convenga (por ejemplo usando count en un select facturas where idEmpleado=0 and fecha BETWEEN 01/01/2017 AND 01/02/2017, asi calculo la cantidad segun el nº de facturas).
2*- Simplemente multiplico la columna Devengos.Cantidad con la columna Percepciones-Trabajador.Cantidad que tengan el mismo id de devengo.

 

Nota: Se me ha ido la olla xD .
Si solo necesitas calcular el numero de Bonificaciones, podrias sacar ese campo a una tabla que incluya como PK(id de empleado(FK) la fecha de iniciofecha de inicio)  y cantidad, y calculas la cantidad como el select de 1*

Nota2: Si no te interesa separar por periodos y solo actualizar el total.
Creo que podrías crear un trigger, asi cada vez que se inserte una nueva factura, se actualice la tabla dependiente actualizando el campo bonificacion de quien te interese. En este enlace te explican como hacerlo en oracle

  • Valorado por amok

Escrito 10 febrero 2017 - 11:40        Editado por Pper, 10 febrero 2017 - 11:52.



  • amok
  • Provincia:Sevilla


Si, lo que quiero es crear un trigger que me actulice sólo las bonificaciones según la factura, o las dietas según el servicio. Se me ocurre poner en la entidad servicio un atributo booleano que podría llamar Desplazamiento y si es true aplicarle la dieta.

 

La cosa es que he intentado hacer el trigger y no me actualiza nada.

 

Este seria para actualizar la bonificación del dependiente si la factura >=1000

 

Spoiler

Escrito 10 febrero 2017 - 20:26        Editado por amok, 10 febrero 2017 - 21:42.


  • Pper
  • Provincia:Madrid


De implementacion con oracle DB me pillas oxidado. ¿Podrias exportar la base de datos en un .sql?, y si es con registros mejo. Asi seria mas fácil testear el qué o el por qué no funciona.

Escrito 11 febrero 2017 - 10:34


  • amok
  • Provincia:Sevilla


Os paso el export. Tiene datos de prueba, pero no son muy adecuados. Los he ido probando para hacer pruebas.

Evidentemente tendría que cambiarlos

 

Spoiler

Sobretodo el TRIGGER "SERVTEC"."T_ACT_BONIFICACION" que no se que se ,e escapa.


gracias


Escrito 12 febrero 2017 - 13:54        Editado por amok, 12 febrero 2017 - 14:23.


  • Pper
  • Provincia:Madrid


  CREATE OR REPLACE TRIGGER "SERVTEC"."T_ACT_BONIFICACION" 
    BEFORE INSERT
    ON FACTURA
    FOR EACH ROW
DECLARE
    V_IMPTOTAL FACTURA.IMPTOTAL%TYPE;
    V_IDEMP DEPENDIENTE.IDEMP%TYPE;
    V_EXISTEBONIFICACION BOOLEAN;
BEGIN
    V_EXISTEBONIFICACION := FALSE;
    
  SELECT IDEMP
    INTO V_IDEMP
    FROM FACTURA
    WHERE IDFAC = :NEW.IDFAC;
    
    --IF V_IDEMP IS NOT NULL THEN
    V_EXISTEBONIFICACION := TRUE;
       
    
    SELECT IMPTOTAL
      INTO V_IMPTOTAL
      FROM FACTURA
      WHERE IDFAC = :NEW.IDFAC;
      
      IF :NEW.IMPTOTAL >= 1000 THEN
      UPDATE DEPENDIENTE
      SET BONIFICACION=BONIFICACION + 30
      WHERE IDEMP = V_IDEMP;
      END IF;
    
   -- END IF; 
EXCEPTION

  WHEN NO_DATA_FOUND THEN
    IF V_EXISTEBONIFICACION THEN
    RAISE_APPLICATION_ERROR (-20001, 'VENTA SIN BONIFICACION');
    
  END IF;
  END;

No te esta funcionando por BEFORE, lo que esta haciendo el gestor de base de datos es lanzar el trigger antes de insertar la fila, como no ha insertado la fila, el select no devuelve nada.

 

Haz la prueba con esta version:

create or replace TRIGGER "SERVTEC"."T_ACT_BONIFICACION" 
    after INSERT 
    ON FACTURA
    FOR EACH ROW
BEGIN
      IF :NEW.IMPTOTAL >= 1000 THEN
      UPDATE DEPENDIENTE
      SET BONIFICACION=BONIFICACION + 30
      WHERE IDEMP = :NEW.IDEMP;
      END IF;
END;
  

 

  • Valorado por amok

Escrito 12 febrero 2017 - 20:44


  • amok
  • Provincia:Sevilla


Funciona perfecto!!

 

Pensé que era mucho mas complejo.

 

Voy a intentar hacer algunos yo solo.

 

Gracias por ayudarme ;)


Escrito 12 febrero 2017 - 21:38


  • amok
  • Provincia:Sevilla


Me he dado cuenta que debería hacer antes procedimientos.

He intentado hacerlos pero no me hacen nada

He intantado hacer uno facilillo con el del trigger pero no me actualiza la bonificacación

 

create or replace PROCEDURE "P_ACT_BONIFICACION"
(P_IDFAC VARCHAR2)
IS
BEGIN
UPDATE DEPENDIENTE
SET BONIFICACION = BONIFICACION + 30
WHERE IDEMP = (SELECT IDEMP
FROM FACTURA
WHERE IDFAC = P_IDFAC);
END;


También he intentado crear otro procedimiento para que reste el valor de la compra al cliente particular así

 

create or replace PROCEDURE "P_ACT_SALDO_PARTICULAR"
(P_IDFAC VARCHAR2)
IS
BEGIN
UPDATE PARTICULAR
SET SALDO = SALDO - (SELECT SUM (Totall)
from
(select cantidad*precio Totall
from lin_fact
join componente
using (idcom)
where idfac = P_IDFAC
UNION
select cantidad*precio Totall
from lin_fact
join servicio
using (idser)
where idfac = P_IDFAC))

WHERE IDCLI = (SELECT IDCLI
FROM FACTURA
WHERE IDFAC = P_IDFAC);
END;

Escrito 20 febrero 2017 - 16:41        Editado por amok, 20 febrero 2017 - 19:27.


  • amok
  • Provincia:Sevilla


Sigo con mis dudas:

 

pues tengo un problema con el procedimiento factura, os explico.

Quiero actualizar el IMPTOTAL de una factura que tengo

Lo que quiero es que desde un procedimiento me lo haga automáticamente cuando selecciono bien un componente o un servicio
y me lo multiplique por la cantidad

Este es mi procedimiento almacenado
 

create or replace PROCEDURE P_INSERTFACTURA

(P_IDFAC FACTURA.IDFAC%TYPE,

P_IDCLI FACTURA.IDCLI%TYPE,

P_IDEMP FACTURA.IDEMP%TYPE,

P_CANTIDAD LIN_FACT.CANTIDAD%TYPE,

P_IDCOM COMPONENTE.IDCOM%TYPE

)



IS



V_PRECIO COMPONENTE.PRECIO%TYPE;

V_IMPTOTAL FACTURA.IMPTOTAL%TYPE;

V_IVA FACTURA.IVA%TYPE;

BEGIN



 SELECT PRECIO

    INTO V_PRECIO

    FROM COMPONENTE

    WHERE IDCOM = P_IDCOM;



V_IMPTOTAL := (P_CANTIDAD * V_PRECIO);



V_IVA := V_IMPTOTAL * 0.21;



INSERT INTO FACTURA VALUES (

P_IDFAC,

P_IDCLI,

SYSDATE,

V_IMPTOTAL,

V_IVA,

P_IDEMP);



END;

Y esta la llamada al procedimiento

DECLARE

V_IDFAC FACTURA.IDFAC%TYPE := '&IDFAC';

V_IDCLI FACTURA.IDCLI%TYPE := '&IDCLI';

V_IDEMP FACTURA.IDEMP%TYPE := '&IDEMP';





BEGIN





P_INSERTFACTURA

(

V_IDFAC,

V_IDCLI,

V_IDEMP

);







END;

Estas son las tablas

TABLA FACTURA

IDFAC - IDCLI - FECHA - IMPTOTAL - IVA - IDEMP

TABLA LIN_FACT

IDLIN - IDFAC - CANTIDAD - IDCOM - IDSER

TABLA COMPONENTE

IDCOM - NOMBRE - PRECIO - CATEGORIA - MARCA - CARACTERISTICAS

TABLA SERVICIO

IDSER - NOMBRE - PRECIO - DESCRIPCION

Cuando inserto los datos me devuelve



Informe de error -

ORA-06550: line 10, column 1:

PLS-00306: wrong number or types of arguments in call to 'P_INSERTFACTURA'

ORA-06550: line 10, column 1:

PL/SQL: Statement ignored

06550. 00000 -  "line %s, column %s:\n%s"

*Cause:    Usually a PL/SQL compilation error.

*Action:

¿Alguna idea?

Ayudadme por favor :fp:


Escrito 25 febrero 2017 - 14:42        Editado por amok, 25 febrero 2017 - 14:42.


  • amok
  • Provincia:Sevilla


Bueno, mas o menos lo tengo resuelto (aunque con errores)

 

Me podriasis ayudar con las subqueries?

 

Quiero sacar el componente mas vendido

 

Os pongo de nuevo el modelo e/r

 

Spoiler

 

Por favor, ayudadme que esto parece un monólogo.


Escrito Ayer, 12:19        Editado por amok, Ayer, 13:27.


  • Maxmalkav
  • Provincia:Sevilla


Bueno, mas o menos lo tengo resuelto (aunque con errores)

 

Me podriasis ayudar con las subqueries?

 

Quiero sacar el componente mas vendido

 

Os pongo de nuevo el modelo e/r

 

Spoiler

 

Por favor, ayudadme que esto parece un monólogo.

 

Inner join entre tablas  "componente" y "lin_factura", group by usando algo como el id del producto y haciendo sumatorio de la cantidad, y para rematar, haces max de ese sumatorio.

 

Yo hace 10+ años que no escribo una query así, pero creo que la idea va por ahí :-)

 

EDIT: esta pregunta es muy similar:

http://stackoverflow...elling-products

en tu caso, hay que hacer un JOIN entre tablas, pero el resto es bastante bastante parecido.

  • Valorado por amok

Escrito Ayer, 13:45        Editado por Maxmalkav, Ayer, 13:47.


  • amok
  • Provincia:Sevilla


 

Bueno, mas o menos lo tengo resuelto (aunque con errores)

 

Me podriasis ayudar con las subqueries?

 

Quiero sacar el componente mas vendido

 

Os pongo de nuevo el modelo e/r

 

Spoiler

 

Por favor, ayudadme que esto parece un monólogo.

 

Inner join entre tablas  "componente" y "lin_factura", group by usando algo como el id del producto y haciendo sumatorio de la cantidad, y para rematar, haces max de ese sumatorio.

 

Yo hace 10+ años que no escribo una query así, pero creo que la idea va por ahí :-)

 

EDIT: esta pregunta es muy similar:

http://stackoverflow...elling-products

en tu caso, hay que hacer un JOIN entre tablas, pero el resto es bastante bastante parecido.

 

 

Con esta querie, me salen toda la suma de cantidades de los componentes.

 

Pero tengo el problema que IDCOM también puede tener valor NULL y casualmente es el que mas cantidades suma.

SELECT IDCOM, SUM(CANTIDAD)
  FROM LIN_FACT
  GROUP BY IDCOM
  ORDER BY SUM(CANTIDAD) DESC;

Hay alguna manera de excluir a los que tengan valor NULL ??


Escrito Ayer, 14:07        Editado por amok, Ayer, 14:09.


  • Maxmalkav
  • Provincia:Sevilla


 

 

Bueno, mas o menos lo tengo resuelto (aunque con errores)

 

Me podriasis ayudar con las subqueries?

 

Quiero sacar el componente mas vendido

 

Os pongo de nuevo el modelo e/r

 

Spoiler

 

Por favor, ayudadme que esto parece un monólogo.

 

Inner join entre tablas  "componente" y "lin_factura", group by usando algo como el id del producto y haciendo sumatorio de la cantidad, y para rematar, haces max de ese sumatorio.

 

Yo hace 10+ años que no escribo una query así, pero creo que la idea va por ahí :-)

 

EDIT: esta pregunta es muy similar:

http://stackoverflow...elling-products

en tu caso, hay que hacer un JOIN entre tablas, pero el resto es bastante bastante parecido.

 

 

Con esta querie, me salen toda la suma de cantidades de los componentes.

 

Pero tengo el problema que IDCOM también puede tener valor NULL y casualmente es el que mas cantidades suma.

SELECT IDCOM, SUM(CANTIDAD)
  FROM LIN_FACT
  GROUP BY IDCOM
  ORDER BY SUM(CANTIDAD) DESC;

Hay alguna manera de excluir a los que tengan valor NULL ??

 

 

precisamente un INNER JOIN entre las tablas "idcom" y "componente" te devolvería sólo los componentes que aparecen en ambas tablas (es decir, si el idcom de una "línea de factura" no aparece en la tabla componentes, quedará fuera de la query, esto te librará de campos nulos.


Escrito Ayer, 14:12


  • lastMonkey
  • Provincia:Santa Cruz de Tenerife


SELECT IDCOM, SUM(CANTIDAD)
FROM LIN_FACT

WHERE IDCOM IS NOT NULL 
GROUP BY IDCOM
ORDER BY SUM
(CANTIDAD) DESC;

  • Valorado por amok

Escrito Ayer, 14:14


  • amok
  • Provincia:Sevilla


SELECT IDCOM, SUM(CANTIDAD)
FROM LIN_FACT

WHERE IDCOM IS NOT NULL 
GROUP BY IDCOM
ORDER BY SUM
(CANTIDAD) DESC;

 

 

Genial, así me salen todos. Lo único que me queda es que sólo me salga uno (el mayor)


Escrito Ayer, 14:19        Editado por amok, Ayer, 14:19.


  • nolo6969
  • Provincia:Barcelona


@Maxmalkav Acabo de leerme el hilo completo y me has recordado hace 18 años cuando realicé mi CFGS con Chen como modelo de Entidad/realación.

 

A día de hoy, entre eso y descomponer el problema en el enunciado más simple posible (que lo utilizabamos en Oracle-Develop), llegabamos donde queríamos.

 

 

@OP / @AMOK Ahora estas estudiando y haces lo modelos como quieras y demás, pero el ejercicio bueno habría sido plantear un problema y que con un modelo de ER haberlo solucionado, ya que es así lo que ocurren en el mundo empresarial... Adaptas tu KnowHow al problema del cliente y no a la inversa ;)

 

Suerte!

  • Valorado por amok

Escrito Ayer, 15:23

eManu|Virtualización

WEB: http://www.eManu.es
FACEBOOK: eManu|Virtualización
TWITTER: @eManu_es
ITPro.es: eManu


0 usuario(s) estan leyendo este tema

0 miembros, 0 invitados, 0 usuarios anónimos