Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Tengo una Duda

Estas en el tema de Tengo una Duda en el foro de Bases de Datos General en Foros del Web. Hola a todos , tengo una Duda, este es mi SP usando el insert into CREATE PROCEDURE Usp_Producto_Adicionar @IdProducto int output, @IdCate int, @IdProvee int, ...
  #1 (permalink)  
Antiguo 28/04/2010, 08:23
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Pregunta Tengo una Duda

Hola a todos ,

tengo una Duda, este es mi SP usando el insert into

CREATE PROCEDURE Usp_Producto_Adicionar
@IdProducto int output,
@IdCate int,
@IdProvee int,
@Nombre varchar(30),
@Descripcion varchar(30),
@Categoria nvarchar(40),
@FechaEntrada smalldatetime,
@Proveedor nvarchar(40),
@Unidades_De_Entrada nvarchar(20),
@Precio smallmoney,
@Cantidad decimal
As
Insert Into Productos(IdProveedor,IdCategoria,NombreInsumo,Des cripcion,NombreCategoria,FechaEntrada,NombreProvee dor,Unidades_De_Entrada,Precio,Cantidad)
Values(@IdProvee,@IdCate,@Nombre,@Descripcion,@Cat egoria,@FechaEntrada,@Proveedor,@Unidades_De_Entra da,@Precio,@Cantidad)
set @IdProducto=@@identity
RETURN @IdProducto

mi duda esta en que el campo NombreCategoria y NombreProveedor estan en tablas diferentes Categorias y Proveedores y no se por que me sale error al ejecutar el SP si las tablas estan relacionadas o necesito algo mas un SELECT con inner join para mostrar la selacion y despues aplico Insert into ?
toda sugerencia sera bien recibida
  #2 (permalink)  
Antiguo 28/04/2010, 08:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tengo una Duda

Si estás ingresando en una tabla, ¿cómo esperas que inserte datos en dos diferentes?
Creo que estás confundiendo el hecho de tener tablas relacionadas con el que la relación genere acciones no indicadas, como es el INSERT.
Cuando defines una FK en una tabla lo que le dices al DBMS es que verifique cualquier inserción futura o valor presente de ese campo contra la tabla referida, pero eso no implica que el DBMS inserte en la referida un valor. Ese valor debe existir antes de realizar inserciones o actualizaciones en la tabla dependiente.
¿Se entiende la idea?
Además de eso, ten en cuenta que un INSERT opera sobre una sola tabla, y no sobre varias. Por caso, el INNER JOIN no es una cláusula admitida del INSERT, por lo que jamás funcionará allí.

¿Se entiende la idea?

La única posibilidad de hacer lo que pides en una sola sentencia, desde el punto de vista del ANSI-SQL (es decir, sin los agregados hechos por Microsoft al SQL Server), es usar un TRIGGER para realizar la inserción previa en la tabla referida. Pero esto no funciona en todos los DBMS, por lo que habría que analizar el caso.
En lugar de eso, ¿por qué no pones los dos inserts, a cada tabla, en el orden correcto?
Sería más simple.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/04/2010, 08:52
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Respuesta: Tengo una Duda

Hola Gracias por Responder ,
ya entendi pero TRIGGER? seria una opcion buena pero todavia no me enseñan eso por ahora estoy con SP y VIEW .

bueno regresando al tema me sugieres que aplique un insert into a cada tabla ? mi idea era usar un insert into para poder usarlo en un Metodo (Function) para que carge un Formualrio de ingreso de datos y luego grabarlos en un Datagridview y si aplico 3 insert into tendria que hacer tres Function para cada SP o un Function que llame alos 3 SP ? no creo que se pueda o si ? por favor ayudame a resolver este problemita. gracias
  #4 (permalink)  
Antiguo 28/04/2010, 09:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tengo una Duda

Estás confundiendo un SP con un INSERT.
Un stored procedure no necesariamente contiene una sola sentencia, ni tampoco tiene determinado usar una en especial.
Un stored procedure es un script de sentencias y comandos SQL que realizan una tarea repetitiva, y que pueden implicar múltiples lecturas, procesos iterativos y decisorios. En ese contexto, no existe ninguna razon para que todos los INSERT/UPDATE/DELETE no puedan ser ejecutados en un sólo SP... con lo que en realidad sólo tendrías una llamada a función en tu aplicación.

¿Se comprende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 28/04/2010, 09:38
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Respuesta: Tengo una Duda

Hola , gracias por responder
ya entendi la idea, una ultima peticion me podrias dar un ejemplo de como usar 2 o mas insert into en un SP para tomarlo como ejemplo.
mis tablas son Productos , Categorias , Proveedores
quiero mostrar todo los campos de Productos , el NombreCategoria y NombreProveedor

gracias Nuevamente.
  #6 (permalink)  
Antiguo 28/04/2010, 11:33
 
Fecha de Ingreso: abril-2010
Ubicación: Lima-Peru
Mensajes: 96
Antigüedad: 14 años
Puntos: 2
Respuesta: Tengo una Duda

bueno quedaria algo asi , corrigeme por favor si me equivoco

CREATE PROCEDURE usp_Producto_Adicionar
@IdProducto int output,
@IdCate int,
@IdProvee int,
@Nombre varchar(30),
@Descripcion varchar(30),
@Categoria nvarchar(40),
@FechaEntrada smalldatetime,
@FechaSalida smalldatetime,
@Proveedor nvarchar(40),
@Unidades_De_Entrada nvarchar(20),
@Precio smallmoney,
@Cantidad decimal
As
Insert Into Productos(IdProveedor,IdCategoria,NombreInsumo,Des cripcion,FechaEntrada,FechaSalida,Unidades_De_Entr ada,Precio,Cantidad)
Values(@IdProvee,@IdCate,@Nombre,@Descripcion,@Fec haEntrada,@FechaSalida,@Unidades_De_Entrada,@Preci o,@Cantidad)

insert into Categorias(IdCategoria,NombreCategoria)
values(@IdCate,@Categoria)
insert into Proveedores(IdProveedor,NombreProveedor)
values(@IdProvee,@Proveedor)

set @IdProducto=@@identity
RETURN @IdProducto

me esta Funcionando bien :D
  #7 (permalink)  
Antiguo 28/04/2010, 12:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tengo una Duda

Exactamente así. Bien logrado.


Toma nota de que los stored procedures son herramientas muy poderosas que además de permitirte hacer secuencias de ordenes muy complejas, también permiten aumentar la seguridad de la base, ya que son invulnerables al sql-injection y permiten (como las vistas) que los usuarios puedan hacer gran cantidad de cosas sin violar su nivel de privilegios ni tener que aumentárselos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:34.