Jump to content


Photo

¿Cómo realizar un calculo de cuadro financiero con trigger?


  • Please log in to reply
18 replies to this topic

#1 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 04 April 2012 - 09:20 PM

Hola chicos buenas noches soy nueva en este foro y en esto de programacion mas todavia
estoy viendo en la universidad postgres y nos enviaron una asignacion en donde debo realizar un calculo de cuadro financiero con trigger
y de verdad estoy muy enredada les mostrare mas o menos lo que tengo en mente aunq se que esta malo pero necesito orientacion de parte de uds los expertos

CREATE OR REPLACE FUNCTION calcular() RETURNS TRIGGER AS $calcular$
DECLARE
BEGIN
  cuota12:=(monto * 12);
  RETURN cuota12;
END;
$calcular$ LANGUAGE plpgsql;


claro ya para eso yo debo tener mi tabla que lo hice asi

create table solicitud(monto double precision,tasa double precision,plazo integer not null,monto_cuota double precision);


pero lo que me piden es que al ingresar el monto  del credito que se esta solicitando a una tasa de interes fija me muestre el monto de la cuota para cuando voy a para el 12 meses, 24 mese, y 36 meses

select * from solicitud;
monto | cuota12 | cuota24 |  cuota36

-------+------+-------+-------------

podrian ayudarme por faaaa me urge este ejercicio y bien confundida
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 04 April 2012 - 09:36 PM

Hola misol_108 bienvenida a DelphiAccess

He separado tu pregunta para que tengas más oportunidad de que te contesten, también he modificado tu post para incluir las etiquetas.

Saludos y nuevamente bienvenida
  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3283 posts
  • LocationColombia

Posted 04 April 2012 - 10:41 PM

El tema es de lógica pero ya le sabes el manejo al SQL en Postgres.
Creo que lo simple es manejar el disparador en el evento insert de esa tabla y editar sobre los campos faltantes, no sería necesario que el disparador retorne algún valor, desde allí mismo ejecutas la sentencia, algo como:

ON INSERT ...

UPDATE SOLICITUD SET (CUOTA12, CUOTA21, CUOTA36)...

creando antes las respectivas operaciones de cada cuota para pasar esos valores al query.


Saludos!
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 04 April 2012 - 11:36 PM

Hola misol_108,
Desconozco PostgreSQL por lo que mucho en eso no te puedo ser de ayuda. De lo que aprecio lo que hace falta al trigger es indicar el contexto en el que se ejecuta (before/after update/insert/delete) y la tabla.

Tu caso, al parecer por lo que describes, se trata de que al dar de alta un registro y definido el valor del campo monto, se calculen los montos a los 12, 24 y 36 meses respectivamente. De ser así entonces en la tabla además del campo monto se necesita los campos para dichos valores. Para este caso el contexto válido podría ser BEFORE INSERT (antes de insertar).

En el cuerpo del trigger por tanto, como señala felipe, tendría lugar una sentencia SQL como la del ejemplo que insertaría el registro con los demás datos calculados pasando las variables adecuadas.

Ahora bien también puede entenderse que lo que necesitas no sea un trigger sino un procedimiento almacenado, y en lugar de calcular y llenar los demás campo; simplemente que el procedimiento almacenado regrese el conjunto de datos con dicha información.
El procedimiento sería casi similar, en el cuerpo del procedimiento tendría lugar la ejecución de una consulta SQL SELECT ...
Y se aprovecharía a leer el monto y mostrar los datos calculados.

Algo así:

SELECT Monto, (Monto * 12) as Monto12, (Monto * 24) as Monto24, (Monto * 36) as Monto36
FROM solicitud
WHERE ....

Como se ve el procedimiento mostraría los datos, se trata de un procedimiento seleccionable.  Mi duda sobre si lo que buscas es un trigger o un store procedure me viene por lo que leo en tu código: CREATE O REPLACE FUNCTION, ¿Una función? y veo al final un RETURN. Como he dicho, desconozco PostgreSQL por lo que no se si así es como se declara un trigger... pero leer FUNCTION y que se espere que un trigger devuelva datos me hace dudar de si será realmente lo que yo entiendo por trigger.

Que yo sepa un trigger no puede regresar un dato, es en realidad un disparador de una rutina (instrucciones) a realizar sobre una tabla específica y NO PUEDEN regresar un valor.
Los procedimientos almacenados por otra parte están hechos para ejecutar instrucciones (y más complejas) sobre una o varias tablas y realizar operaciones sobre un conjunto de datos. Los procedimientos almacenados pueden o no, según lo que se necesite, devolver un conjunto de datos o parámetros de resultados.

¿Que es lo que en realidad necesitas?

Quisiera por favor que nos aportes la mayor cantidad de detalles posibles a fin de poder comprenderte apropiadamente. Cuanto más nos puedas puntualizar y decir sobre el problema más fácil será asesorarte.

Saludos,
  • 0

#5 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 07:45 AM

Hola chicos muchisimas gracias por sus recomendaciones las pondre en practica y cualquier cosa bueno les vuelvo a pedir ayuda

feliz semana santa y cuidense
fue un placer
  • 0

#6 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 08:19 AM

chicos me enrede con lo del codigo de verdad no entiendo
despues de rear la tabla realizo la function calcular alli en donde hago que cosa???????
y despues es que voy a realizar el disparador para despues hacer una consulta como por ejemplo

select * from solicitud;

de verdad me enrede  :cry:

AUXILIO alguien que me ayude con este codigo esto es complicado para mi por fa
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 April 2012 - 08:51 AM

Hola de nuevo,
Creo que el error está en lo conceptual, y confundes disparadores (triggers) con funciones (functions), sean de fábrica como COUNT(), AVG() o definidas por el usuario, con los procedimientos almacenados (store procedures)

Bajemos tus ideas a tierra.

1) ¿Cuál es la estructura completa de la tabla?
Saber como tienes definida la tabla ayuda a comprender que campos dispones y si es que se necesitas de otros

2) ¿Cuál es el objetivo concreto y la funcionalidad a la que se busca dar soporte?
No pienses en triggers, campos, tablas, funciones o procedimientos almacenados. Describe lo que tienes, y lo que necesitas. Explica el contexto del problema. De este modo vamos a separar lo técnico del verdadero problema.

Con estos dos puntos vamos a descubrir que y cual es el enfoque que necesitas. Por algo yo decía antes si lo que estás buscando es un trigger, una función o un procedimiento almacenado.

Tomate el tiempo para explicarnos. Se que tu tienes prisa pero lo mejor es calmarnos y empezar a dar más luz en donde vemos a oscuras. Nosotros no tenemos prisa, y una de las cosas que pedimos y que forma parte de nuestras normas de buena convivencia es que se eviten cosas como: rápido, lo necesito para ayer, me urge... Todos tenemos nuestras urgencias y acudimos al foro en cuanto disponemos de tiempo. No desesperes si no te responden a la brevedad Entonces, ¡fuera prisas! ¿Te parece?

Saludos,
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 April 2012 - 09:46 AM

Vaya, por lo que estuve buscando creo entender la razón de tal confusión. PostgreSQL y su PL/pgSQL es muy diferente al enfoque y lenguaje que utiliza no solo Firebird sino que no respeta en buena medida al estándar SQL normal. Es muy particular, y mi ver... quisquilloso.

Basa y mezcla a los triggers y procedimientos almacenados en lo que el llama FUNCTION. En síntesis, para PostgreSQL tanto un SP como un trigger no son más que una función. Y lo peor, es que para definir un trigger se necesita obligadamente que exista previamente el procedimiento almacenado para el mismo.

Aquí hay material sobre triggers, y aquí sobre procedimientos almacenados. Para interiorizarnos más es necesario leer la documentación de PL/pgSQL.

La verdad es que lo que estuve leyendo me rompió los esquemas y no me parece demasiado estándar. Se que cada motor maneja su propio subconjunto del lenguaje procedural de SQL pero ¿que no es que supuestamente existe también un estándar mínimo sobre esto?

Saludos,
  • 0

#9 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 10:12 AM

es por eso mi gran enredo porq  : aja
1.- creo mi tabla la puedo llenar si en tal caso quiero ver los datos
2.- creo la function calcular por ejemplo que es donde voy hacer los calculos valga la redundancia para las distintas cuotas
cuota12:=(monto * 12);
cuota24:=(monto * 24);
cuota32:=(monto * 32);
3.- y despues es que creo el disparador par que cuando se inserte un nuevo monto en la tabla me haga los calculo

estoy errada???? o mas perdida que antes  :s
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 April 2012 - 01:08 PM

Hola misol_108,
Creo que en realidad vamos comprendiendo. ¡A no desesperarse!
Veamos, en PostgreSQL existen los stored procedures (o procedimientos almacenados) que se declaran como una función como la que tu defines. A los triggers en PostgreSQL se les llama triggers procedures porque se declaran en dos partes: primero el procedimiento almacenado que contendrá la rutina del trigger y por el otro lado la declaración propia del trigger.  El trigger lo que hace es invocar al procedimiento almacenado vinculado a éste; allí acaba la ciencia y que genera la confusión.

Ahora bien, un procedimiento almacenado puede regresar, o no, un conjunto de datos a modo de resultado. Las operaciones dentro de un SP (abreviatura en inglés) pueden involucrar a muchas tablas. Distinto es cuando estamos haciendo un trigger, el procedimiento para el trigger regresa realmente un resultado y sólo tiene la posibilidad de operar sobre la propia tabla en la que se defina.

En otros motores de bases de datos, y en términos conceptuales, los conceptos de trigger y stored procedure son independientes. Hago esta aclaración porque en términos prácticos, PostgreSQL incurre en un error de concepto al "vender" el concepto de trigger procedures y me temo que Oracle también si es que funciona igual.

Ahora yendo a tus dudas, como dije: es necesario bajar a tierra la idea y objetivo que persigues de esto. ¿A que requisito u objetivo de contexto o negocio apunta la funcionalidad que estás proponiendo? Es decir, sin entrar en los detalles de desarrollo e implementación ¿Cuál es el objetivo a conseguir?
Esto es fundamental para determinar las posibles alternativas.

Tu dices:

creo mi tabla la puedo llenar si en tal caso quiero ver los datos

Pregunto: ¿Tiene alguna utilidad o necesidad disponer realmente de los campos, por darles nombre Monto12, Monto24 y Monto32 en la tabla? ¿Se los utilizará en algún lado esta información? ¿Para que?
¿Necesitas realmente estos campos?

A. Si en realidad tus requisitos y necesidades te están diciendo que esos datos tienen una utilidad real y operatoria y se los usa en otro lugar entonces si vale la pena almacenarlos.

B. Si tus requisitos te dicen que en realidad sólo es a efectos de visualización o presentación entonces podemos calcularlos y mostrarlos sin necesidad de tenerlos físicamente.

Si tu caso se inclina a la opción A entonces SI crea los campos para la tabla. Ahora como ya dispones de esos campos podemos preveer una alternativa basada en el uso de los trigger procedures. Explicaré, o trataré mejor dicho, de exponer un ejemplo de esto más adelante como para que te hagas una idea. No uso postgreSQL por lo que no puedo garantizar de que funcione del todo; pero al menos dará una clara idea de por donde van las cosas.

Si tu caso se inclina a la opción B, para presentar la información solicitada tenemos más alternativas:
B1. Mandar a ejecutar desde la aplicación una consulta simple que los calcule:

SELECT monto_couta, (monto_couta * 12) AS Monto12, (monto_couta * 24) as Monto24, (monto_couta * 32) as Monto32, ...
FROM solicitud


Esto es SQL estándar y funciona en todo motor de base de datos. Luego tu aplicación muestra los datos en una rejilla o grid o los controles que tu dispongas.

B2. Tener un procedimiento almacenado seleccionable. Es decir, un procedimiento almacenado (nota que no hablo de un trigger procedure) que devuelva un conjunto de datos a modo de resultado. Contar con esta opción permite que dentro del procedimiento se hagan otras operaciones de interés, y de valor de negocio. Para hacer uso de estos procedimientos se invoca de forma similar a una consulta. De hecho un procedimiento almacenado seleccionable ES una consulta:

SELECT * FROM NombreProcedimientoSeleccionable()


B3. Tener una vista, que es como una consulta pero que en vez de ser ejecutada desde el cliente queda guardada en la base de datos. Luego la aplicación manda a ejecutar la consulta y puede mostrar este dato. Este tema no lo abordaré por considerarlo que se sale de tópico y complicaría las cosas. De todas formas recomiendo la lectura sobre las Vistas (VIEW).

Volvamos al caso A. Al final comentaste esto:

y despues es que creo el disparador par que cuando se inserte un nuevo monto en la tabla me haga los calculo

Si sólo nos debiéramos guiar por esto entonces todos te diríamos que es necesario definir un stored procedure CalcularMontos y un trigger que lo mande a ejecutar, CalcularMontos por darles un nombre.

Para este caso obviamente necesitamos de los campos necesarios en la tabla. Según el supuesto, el usuario va a ingresar un registro en la tabla solicitud. De ese registro llena el campo monto_cuota y el sistema por si mismo le calculará y llenará los restantes. Eso es lo que da a entender, si necesitas vamos:

1) Definir el procedimiento del trigger. Yo lo he llamado calcular_montos():


CREATE OR REPLACE FUNCTION calcular_montos() RETURNS TRIGGER AS $calcular_montos$
  DECLARE
  BEGIN
 
  NEW.monto_cuota_12 := NEW.monto_couta * 12;
  NEW.monto_cuota_24 := NEW.monto_couta * 24;
  NEW.monto_cuota_32 := NEW.monto_couta * 32; 

  RETURN NEW;
  END;
$calcular_montos$ LANGUAGE plpgsql;


Observa que este procedure tiene en su declaración RETURNS TRIGGER. Esta es la manera que tiene PostgreSQL de indicarle al motor que se trata de un procedimiento asociado a un trigger.
Fíjate que hago uso de una variable llamada NEW. Esta variable NEW la tienen todos los motores de datos, es una variable implícita que representa a un nuevo registro que se va a insertar o bien a un registro que se va a actualizar en al menos un campo por un nuevo valor. Así como existe NEW, existe OLD que como se puede deducir representa a un registro que se va a eliminar, o bien, al registro con los valores viejos que se van a reemplazar.
Es fundamental prestar atención a esas dos variables ya que las vas a encontrar en todos los triggers.
Así como existen NEW y OLD hay otras más. En los enlaces que puse hay un listado.

Fíjate que en el ejemplo yo hago NEW.campo para acceder al campo es cuestión. Por tanto si hago NEW.monto_cuota_12 := NEW.monto_cuota * 12 lo que estoy haciendo es establecer en el campo monto_cuota_12 del nuevo registro a insertar el valor de monto_cuota multiplicado por 12.

Al final del cuerpo del procedure puede verse un RETURN NEW. Esto le indica que "confirme" los cambios sobre el registro nuevo y los almacene en la tabla.

Vamos ahora a definir el trigger:


CREATE TRIGGER calcular_montos BEFORE INSERT
    ON solicitud FOR EACH ROW
    EXECUTE PROCEDURE calcular_montos();


Vemos en su declaración un BEFORE INSERT. Esto quiere decir que el disparador se dispará justo antes de insertarse un registro en la tabla solicitud.
Vemos además que se estableció el nivel de alcance, con FOR EACH ROW. Esto indica que por cada registro que se inserte debe ejecutar el procedimiento almacenado calcular_montos().

Entonces, ahora cada vez que tu mandes a ejecutar una sentencia INSERT sobre dicha tabla, el motor disparará el tigger que éste ejecuta el procedimiento y finalmente se inserta el registro con los valores de los montos de las cuotas calculados.

Nota que en realidad el caso A y B pueden convivir sin problemas y no necesariamente son mutuamente excluyentes. Las necesidades y requisitos de negocio te deben ir aportando la información necesaria para que tomes las decisiones e implementaciones prácticas más adecuadas a cada caso. Por regla general los valores que pueden ser recalculados no se almacenan; aunque hay ocasiones, y por cuestiones de diseño, en que si se deben almacenar (por ejemplo en los casos de tablas de auditorías).

Espero haberte sido de ayuda en algo. Recomiendo que dediques parte de tu tiempo a familiarizarte con los conceptos y de la PL/pgSQL.

Saludos,
  • 0

#11 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 02:42 PM

fijense chicos lo que pude lograr hasta los momentos y sinceramente siento un logro grandisimo jajajaja aunq todavia me falta lograr lo del calculo de los microcreditos aca les dejo mi codigo

postgres@reina-laptop:/home/reina$ createuser proyect_trigger
¿Será el nuevo rol un superusuario? (s/n) s
postgres@reina-laptop:/home/reina$ psql
Bienvenido a psql 8.3.8, la terminal interactiva de PostgreSQL.

Digite:  \copyright para ver los términos de distribución
      \h para ayuda de órdenes SQL
      \? para ayuda de órdenes psql
      \g o punto y coma («;») para ejecutar la consulta
      \q para salir

postgres=# alter user proyect_trigger with password'123'
postgres=# create database proyect_cfawa;
CREATE DATABASE
postgres=# \c proyect_cfawa;
Ahora está conectado a la base de datos «proyect_cfawa».
proyect_cfawa=# create table censo_demografico(numero varchar(5) not null primary key,nombre_representante varchar(100) not null,propiedad varchar(9)not null,telefono_representante varchar(12) not null);
NOTICE:  CREATE TABLE / PRIMARY KEY creará el índice implícito «censo_demografico_pkey» para la tabla «censo_demografico»
CREATE TABLE
proyect_cfawa=# create table microcredito(id serial not null primary key, numero_casa varchar(5)not null, cantidad_microcredito integer not null,tipo_microcredito varchar(50) not null, status varchar(1) not null,sector_economico varchar(50)not null,tiempo_pago varchar(50)not null, foreign key (numero_casa) references censo_demografico(numero));
NOTICE:  CREATE TABLE creará una secuencia implícita «microcredito_id_seq» para la columna serial «microcredito.id»
NOTICE:  CREATE TABLE / PRIMARY KEY creará el índice implícito «microcredito_pkey» para la tabla «microcredito»
CREATE TABLE
proyect_cfawa=# \d censo_demografico;
                Tabla «public.censo_demografico»
        Columna        |          Tipo          | Modificadores
------------------------+------------------------+---------------
numero                | character varying(5)  | not null
nombre_representante  | character varying(100) | not null
propiedad              | character varying(9)  | not null
telefono_representante | character varying(12)  | not null
Índices:
    «censo_demografico_pkey» PRIMARY KEY, btree (numero)

proyect_cfawa=# \d microcredito;
                                        Tabla «public.microcredito»
        Columna        |        Tipo          |                      Modificadores                     
-----------------------+-----------------------+-----------------------------------------------------------
id                    | integer              | not null default nextval('microcredito_id_seq'::regclass)
numero_casa          | character varying(5)  | not null
cantidad_microcredito | integer              | not null
tipo_microcredito    | character varying(50) | not null
status                | character varying(1)  | not null
sector_economico      | character varying(50) | not null
tiempo_pago          | character varying(50) | not null
Índices:
    «microcredito_pkey» PRIMARY KEY, btree (id)
Restricciones de llave foránea:
    «microcredito_numero_casa_fkey» FOREIGN KEY (numero_casa) REFERENCES censo_demografico(numero)

proyect_cfawa=# CREATE OR REPLACE FUNCTION grabar_operaciones() RETURNS TRIGGER AS $grabar_operaciones$
DECLARE BEGIN
INSERT INTO cambios (nombre_disparador,tipo_disparador,nivel_disparador,comando) VALUES (TG_NAME,TG_WHEN,TG_LEVEL,TG_OP);
RETURN NULL;                                                                                                           
END;
$grabar_operaciones$ LANGUAGE plpgsql;
CREATE FUNCTION
proyect_cfawa=# CREATE TRIGGER grabar_operaciones AFTER INSERT OR UPDATE OR DELETE ON microcredito FOR EACH STATEMENT EXECUTE PROCEDURE grabar_operaciones();
CREATE TRIGGER
proyect_cfawa=# CREATE TRIGGER grabar_operaciones AFTER INSERT OR UPDATE OR DELETE ON censo_demografico FOR EACH STATEMENT EXECUTE PROCEDURE grabar_operaciones();
CREATE TRIGGER
proyect_cfawa=# insert into censo_demografico values('1','César López','Propia','02445532230');
INSERT 0 1
proyect_cfawa=# insert into censo_demografico values('2','Isabel Pérez','Alquilada','02445323030');
INSERT 0 1
proyect_cfawa=# insert into censo_demografico values('3','Mirian Castellanos','Propia','02441515002');
INSERT 0 1
proyect_cfawa=# insert into censo_demografico values('4','Carolina Matos','Propia','02441142365');
INSERT 0 1
proyect_cfawa=# insert into censo_demografico values('5','Ramón Muchacho','Alquilada','02443226587');
INSERT 0 1
proyect_cfawa=# select * from censo_demografico;
numero | nombre_representante | propiedad | telefono_representante
--------+----------------------+-----------+------------------------
1      | César López          | Propia    | 02445532230
2      | Isabel Pérez        | Alquilada | 02445323030
3      | Mirian Castellanos  | Propia    | 02441515002
4      | Carolina Matos      | Propia    | 02441142365
5      | Ramón Muchacho      | Alquilada | 02443226587
(5 filas)

proyect_cfawa=# select * from cambios;
            timestamp_            | nombre_disparador  | tipo_disparador | nivel_disparador | comando
----------------------------------+--------------------+-----------------+------------------+---------
2012-04-05 14:41:20.516301-04:30 | grabar_operaciones | AFTER          | STATEMENT        | INSERT
2012-04-05 14:41:34.215005-04:30 | grabar_operaciones | AFTER          | STATEMENT        | INSERT
2012-04-05 14:41:46.143157-04:30 | grabar_operaciones | AFTER          | STATEMENT        | INSERT
2012-04-05 14:41:57.556383-04:30 | grabar_operaciones | AFTER          | STATEMENT        | INSERT
2012-04-05 14:42:08.77481-04:30  | grabar_operaciones | AFTER          | STATEMENT        | INSERT
(5 filas)

  • 0

#12 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 02:45 PM

chicos fijense en este codigo por favor

proyect_cfawa=# select * from microcredito;
id | numero_casa | cantidad_microcredito | tipo_microcredito | status | sector_economico | tiempo_pago
----+-------------+-----------------------+-------------------+--------+------------------+-------------
  1 | 5          |                  5000 | Personal          | P      | Manufactura      | 12 meses
  2 | 3          |                18000 | Unifamiliar      | A      | Manufactura      | 36 meses
  3 | 2          |                36000 | Cooperativa      | A      | Comercio        | 48 meses
(3 filas)


aca es donde yo quiero hacer un codigo que me calcule la cuota a pagar mensual para esos 12 meses de esos 5000 que se esta pidiendo que es eso lo que no entiendo
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 05 April 2012 - 02:51 PM

Hola misol_108

Podrías colocar el cálculo para entender que es lo que quieres ?

5000 a 12 meses cuanto debe resultar, cual es la tasa de interes, etc...

Saludos
  • 0

#14 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 02:57 PM

el calculo asi a lo criollito seria algo asi te lo colocare sin codigo
monto= 4000
plazo=24 meses
tasa= 5% --->>0.05
cuota_mensual=????

(4000*0.05)=4200 / 24 = 175
estos 175 vendrian hacer lo que debo pagar mensualmente por ese credito de 4000 que se solicito

y esto es lo que no hayo como realizar me podrias ayudar  :) por favor
  • 0

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 April 2012 - 05:04 PM

De a lo que estoy entendiendo, el procedimiento debería ser análogo al que he descrito con el ejemplo:

NEW.cuota_mensual := (NEW.cantidad_microcredito * 1.05) / NEW.tiempo_plazo;


Esto aprovechando un trigger BEFORE INSERT y suponiendo que existe el campo cuota_mensual.
Yo en tu lugar reemplazaría el tipo de campo tiempo_plazo por un tipo numérico y no lo pondría como un campo de texto. De otro modo se hace más difícil hacer los cálculos.
Y al campo cantidad_microcredito y couta_mensual los haría de un tipo real y no entero para que acepte decimales.  ;)

Yo asumo que ese porcentaje es fijo.

Saludos,

  • 0

#16 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 05:09 PM

ok delphius tomare en cuenta tus recomendaciones y si tengo exito lo publico y sino tambien les volvere a pedir ayuda

muchisimas gracias y disculpen tanta molesti

feliz tarde ;)
  • 0

#17 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 April 2012 - 05:26 PM

Hola misol_108,
No es ninguna molestia preguntar. ¡Para eso está el foro!  :)

Total si hay problemas, aquí estaremos. PostgreSQL es uno sólo y nosotros somos muchos, con una buena paliza que le demos quedará amaestrado.  :D

Saludos,
PD: Aquí ya es de noche
  • 0

#18 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 05 April 2012 - 07:32 PM

CREATE OR REPLACE FUNCTION proteger_y_rellenar_datos() RETURNS
    TRIGGER AS $proteger_y_rellenar_datos$
DECLARE
BEGIN
  IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN
    NEW.cuota_mensual := (NEW.cantidad_microcredito * 1.05) / NEW.tiempo_plazo;
    RETURN NEW;
  ELSEIF (TG_OP = 'DELETE') THEN
    RETURN NULL;
  END IF;
END;
$proteger_y_rellenar_datos$ LANGUAGE plpgsql;

CREATE TRIGGER proteger_y_rellenar_datos BEFORE INSERT
  OR UPDATE OR DELETE
  ON amortizacion FOR EACH ROW
  EXECUTE PROCEDURE proteger_y_rellenar_datos();
proyect_cfawa=# insert into amortizacion (cantidad_microcredito,tiempo_plazo) values (5000,36);
INSERT 0 1
proyect_cfawa=# select * from amortizacion;
id_amortizacion | cantidad_microcredito | tiempo_plazo | cuota_mensual
-----------------+-----------------------+--------------+---------------
              1 |                  2000 |              |             
              2 |                  2000 |          12 |          175
              3 |                  2000 |          24 |          87.5
              4 |                  5000 |          36 |      145.833
(4 filas)


chicos esto era lo que estaba necesitando muchas gracias a todos por su ayuda feliz noche
  • 0

#19 misol_108

misol_108

    Member

  • Miembros
  • PipPip
  • 11 posts
  • LocationVenezuela

Posted 12 April 2012 - 10:20 PM

Buenas noches
disculpa la molestia tengo un problemita aca con est ejercicio de programacion que me mandaron ya cree las tablas y son estas
    postgres=# \d almacenes
            Tabla «public.almacenes»
    Columna |    Tipo      | Modificadores
    ---------+---------------+---------------
    nroalm  | INTEGER      | NOT NULL
    desalm  | CHARACTER(20) |
    Índices:
        «almacenes_pkey» PRIMARY KEY, btree (nroalm)
   
    postgres=# \d movimientos
                              Tabla «public.movimientos»
    Columna  |  Tipo  |                      Modificadores                     
    ----------+---------+----------------------------------------------------------
    id      | INTEGER | NOT NULL DEFAULT NEXTVAL('movimientos_id_seq'::regclass)
    nroalm  | INTEGER | NOT NULL
    codpro  | INTEGER | NOT NULL
    cantidad | INTEGER | NOT NULL
    Índices:
        «movimientos_pkey» PRIMARY KEY, btree (id)
    Restricciones de llave FORánea:
        «movimientos_codpro_fkey» FOREIGN KEY (codpro) REFERENCES productos(codpro)
        «movimientos_nroalm_fkey» FOREIGN KEY (nroalm) REFERENCES almacenes(nroalm)
   
    postgres=# \d auditoria
                                        Tabla «public.auditoria»
      Columna  |        Tipo          |                      Modificadores                       
    -----------+-----------------------+------------------------------------------------------------
    nrodoc    | INTEGER              | NOT NULL DEFAULT NEXTVAL('auditoria_nrodoc_seq'::regclass)
    operacion | CHARACTER VARYING(1)  | NOT NULL
    usuario  | CHARACTER VARYING(10) | NOT NULL
    fecha    | DATE                  | NOT NULL
    cantidad  | INTEGER              | NOT NULL
    despro    | CHARACTER VARYING(20) | NOT NULL
    desalm    | CHARACTER VARYING(20) | NOT NULL
    Índices:
        «auditoria_pkey» PRIMARY KEY, btree (nrodoc)
   
    postgres=# \d producto
    No se encontró relación llamada «producto».
    postgres=# \d productos
                Tabla «public.productos»
    Columna |        Tipo          | Modificadores
    ---------+-----------------------+---------------
    codpro  | INTEGER              | NOT NULL
    despro  | CHARACTER VARYING(20) | NOT NULL
    Índices:
        «productos_pkey» PRIMARY KEY, btree (codpro)
   
    postgres=# \d consolidado
        Tabla «public.consolidado»
    Columna |  Tipo  | Modificadores
    ---------+---------+---------------
    codpro  | INTEGER | NOT NULL
    total  | INTEGER | NOT NULL
    Índices:
        «consolidado_pkey» PRIMARY KEY, btree (codpro)
    Restricciones de llave FORánea:
        «consolidado_codpro_fkey» FOREIGN KEY (codpro) REFERENCES productos(codpro)
   
    postgres=#
    postgres=#
   


me piden que realize lo siguiente :
-----cree un trigger a la tabla movimientos y una funcion asociada a la bd con las siguientes condiciones
a.- antes de insertar un registro en la tabla movimientos se debe validar por funciones que exista el numero de almacen (nroalm) en la tabla almacenes y se valide que exista el codigo del producto(codpro) en la tabla productos
b.- despues debe crear el registro de la tabla movimientos que se debe consolidar con los datos de la tabla consolidado, sin importar el almacen y se debe registrar los datos de la tabla auditoria.

NOTA: se deben tener que crear 4 productos en un scrip para la tabla productos y consolidado, en esta ultima con el valor Total en cero
el campo nrodoc de auditoria debe ser un numero correlativo
los datos de operaciones son : D (delet), I (insert), U (update)
cuando se inserte datos en movimientos se suma el vaor de total de la tabla con el valor nuevo , la cantidad puede ser negativa
recuerde que en auditoria se encuentra son las descripciones de producto y almacen y deben traer los datos de sus respectivas tablas
se debe crear  un scrip donde se creen las tablas y creen los datos productos, almacenes,consolidados


AYUDENME CON ESTO PLISSSS ES UNA EVALUACION QUE DEBO ENTREGAR MAÑANA Y ESTOY MAS ENREDADA QUE MOCHO COMIENDO PESCAO PLISSSS : : : : : :

  • 0




IP.Board spam blocked by CleanTalk.