none
Trigger que inserta numero correlavito de otra tabla RRS feed

  • Pregunta

  •  Buenas tardes amigos , me podrían ayudar con esto   , estoy tratando de hacer  un trigger que me traiga el numero correlativo de la tabla Registro  y me los cargue en la tabla pedidos  en el campo IDPedido al momento de hacer la inserción en la tabla pedido.

    estos son los campos de mi tabla pedido

    Idpedido ,aca es donde tiene q cargar el numero correlativo  que esta disponible en la tabla registro

    CodCliente

    TipoPedido

    Descripcion

    CREATE TRIGGER InsertarPedido

    on Registro

    for insert

    as

    insert into Pedido(IdPedido)

    Select NCorrelativo from inserted 

    espero me puedan dar algunas ideas, muchas gracias 


    Daniel

    jueves, 12 de diciembre de 2019 19:38

Respuestas

  • Hola Dannycv012:

    Una de las posibles soluciones a ese escenario es:

    CREATE TABLE registro (id INT PRIMARY KEY ); GO INSERT INTO registro(id) VALUES(0); GO CREATE TABLE pedido (idpedido INT, codCliente INT, tipoPedido INT, descripcion VARCHAR(100) ); GO /* crear un trigger sobre la tabla pedido tipo instead of */ CREATE TRIGGER insertarPedido ON PEDIDO instead of insert AS

    SET XACT_ABORT ON SET TRANSACTION ISOLATION LEVEL SERIALIZABLE DECLARE @TABLE TABLE ( idpedido INT, codCliente INT, tipoPedido INT, descripcion VARCHAR(100) ); DECLARE @REGS int = (Select ISNULL(MAX(ID),0) NumBase FROM registro); ;WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS FILA FROM inserted ), Regs AS ( SELECT @REGS AS NumBase ) INSERT INTO @TABLE Select c.fila+r.NumBase as idPedido, C.codCliente, C.tipoPedido, C.descripcion from cte c cross join Regs R; UPDATE registro SET ID = @REGS + (SELECT COUNT(*) FROM @TABLE); INSERT INTO PEDIDO SELECT * FROM @TABLE; GO

    En el trigger, que sucede justo antes de insertar, recoges todos los datos que tiene inserted y los metes en una variable de tabla. Luego calculas mediante rownumber el siguiente registro, ya que tienes el último y row number numera mas 1

    Luego updateas la tabla de registro, con lo que vas a insertar

    y por ultimo insertas.

    De esta manera es independiente que tengas una insercción o varias.

    INSERT INTO PEDIDO(codCliente, tipoPedido, descripcion)
    VALUES
    (1,0,'PEDIDO1'),
    (1,0,'PEDIDO2'),
    (2,0,'PEDIDO3'),
    (2,1,'PEDIDO4');
    go
    
    INSERT INTO PEDIDO(codCliente, tipoPedido, descripcion)
    VALUES
    (20,1,'PEDIDO5');
    go
    SELECT * FROM pedido
    select * from registro

    Por si te ayuda

    Incrementales

    https://javifer2.wordpress.com/2019/11/23/id-incremental-como/

    Row_number

    https://javifer2.wordpress.com/2019/11/11/row-number-numerar-filas/

    Cte

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    jueves, 12 de diciembre de 2019 21:05
  • Hola Dannycv012:

    Te falta la columna SolicitaP en la insercción.

    INSERT INTO @TABLE 
    Select c.fila+r.NumBase as Pedido
    , C.Remision
    , C.CodClie
    ----- c.SolicitaP 
    ,C.UsurIngreso
    ,c.FechaCirugia
    ,c.FechaCompromiso
    ,c.Diagnostico
    , ....

    • Marcado como respuesta Dannycv012 viernes, 20 de diciembre de 2019 13:53
    jueves, 19 de diciembre de 2019 22:43
  • Hola Dannycv012:

    Lo primero no es molestia, todo lo contrario, para eso estamos en los foros, para poder apoyar a cualquiera que este todavía en una fase de conocimiento de la herramienta, menor, o que tenga una complicación que otros hayan resuelto, o vean como resolverla.

    Dices que quieres solo en la columna FieldName = 'prxprof',

    UPDATE SACORRELSIS SET ValueInt = @REGS + (SELECT COUNT(*) FROM @TABLE) 
    where FIELDNAME = 'PrxProf';
    Ojo no se si es correcto, porque no se muy bien lo que quieres del todo. Pruebalo, y si no es esto, me comentas.

    • Marcado como respuesta Dannycv012 viernes, 27 de diciembre de 2019 18:51
    viernes, 27 de diciembre de 2019 18:30

Todas las respuestas

  • Hola Dannycv012:

    Una de las posibles soluciones a ese escenario es:

    CREATE TABLE registro (id INT PRIMARY KEY ); GO INSERT INTO registro(id) VALUES(0); GO CREATE TABLE pedido (idpedido INT, codCliente INT, tipoPedido INT, descripcion VARCHAR(100) ); GO /* crear un trigger sobre la tabla pedido tipo instead of */ CREATE TRIGGER insertarPedido ON PEDIDO instead of insert AS

    SET XACT_ABORT ON SET TRANSACTION ISOLATION LEVEL SERIALIZABLE DECLARE @TABLE TABLE ( idpedido INT, codCliente INT, tipoPedido INT, descripcion VARCHAR(100) ); DECLARE @REGS int = (Select ISNULL(MAX(ID),0) NumBase FROM registro); ;WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS FILA FROM inserted ), Regs AS ( SELECT @REGS AS NumBase ) INSERT INTO @TABLE Select c.fila+r.NumBase as idPedido, C.codCliente, C.tipoPedido, C.descripcion from cte c cross join Regs R; UPDATE registro SET ID = @REGS + (SELECT COUNT(*) FROM @TABLE); INSERT INTO PEDIDO SELECT * FROM @TABLE; GO

    En el trigger, que sucede justo antes de insertar, recoges todos los datos que tiene inserted y los metes en una variable de tabla. Luego calculas mediante rownumber el siguiente registro, ya que tienes el último y row number numera mas 1

    Luego updateas la tabla de registro, con lo que vas a insertar

    y por ultimo insertas.

    De esta manera es independiente que tengas una insercción o varias.

    INSERT INTO PEDIDO(codCliente, tipoPedido, descripcion)
    VALUES
    (1,0,'PEDIDO1'),
    (1,0,'PEDIDO2'),
    (2,0,'PEDIDO3'),
    (2,1,'PEDIDO4');
    go
    
    INSERT INTO PEDIDO(codCliente, tipoPedido, descripcion)
    VALUES
    (20,1,'PEDIDO5');
    go
    SELECT * FROM pedido
    select * from registro

    Por si te ayuda

    Incrementales

    https://javifer2.wordpress.com/2019/11/23/id-incremental-como/

    Row_number

    https://javifer2.wordpress.com/2019/11/11/row-number-numerar-filas/

    Cte

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    jueves, 12 de diciembre de 2019 21:05
  • Javier fernandez muchas gracias , por tu ayuda  para el caso del la tabla pedido y registro me funciono muy bien , ahora tengo otro problema al querer utilizar el mismo código para otra base de datos  me salta error, soy muy nuevo en esto y estoy tratando de obtener un numero correlativo de la tabla sacorrelsis y llevarlo ala tabla tlbpedidos , pero para identificar ese numero debe hacer la consulta  en sacorrelsis en la columna  FieldName ='PrxProf' por ejemplo

    select  ValueInt from sacorrelsis where FieldName ='PrxProf  

    pero en el trigger no me funciona, espero me puedas ayudar

    CREATE  TRIGGER insertarNumeroPedido ON TlbPedidos
    instead of insert
    AS
    SET XACT_ABORT ON
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    DECLARE @TABLE TABLE ( Pedido int,
    Remision varchar(MAX),
      CodClie varchar(15),
      SolicitaP varchar(50),
      UsurIngreso nvarchar(20),
      FechaCirugia datetime,
      FechaCompromiso datetime,
      Diagnostico varchar(100),
      Profesional varchar(100),
      Recibe varchar(50),
      SSoporte int ,
      SPiezaMano int ,
      SFisioDespenser int ,
      Perforador int ,
      SReciprocante int ,
      SOscilanteMax int ,
      SOscilanteOrt int ,
      SSet int ,
      MateriaSolicitado nvarchar(500),
      Comentarios nvarchar(500),
      IdPedidos int,
      Paciente varchar(50),
      TypeID int,
      NumeroDoc nvarchar(50),
      Instrumentador varchar(100),
      Motivo varchar(200),
      IDEstado nvarchar(10)
    );
    DECLARE @REGS int = (Select ISNULL(MAX(ValueInt),0) NumBase FROM  SACORRELSIS where FieldName ='PrxProf');
    ;WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS FILA
    FROM inserted
    ), Regs AS
    (
    SELECT @REGS AS NumBase
    )
    INSERT INTO @TABLE 
    Select c.fila+r.NumBase as Pedido, C.Remision, C.CodClie, C.UsurIngreso,c.FechaCirugia,c.FechaCompromiso,c.Diagnostico,
    c.Profesional,c.Recibe,c.SSoporte,c.SPiezaMano,c.SFisioDespenser,c.Perforador,c.SReciprocante,c.SOscilanteMax,c.SOscilanteOrt,
    c.SSet,c.MateriaSolicitado,c.Comentarios,c.IdPedidos,c.Paciente,c.TypeID,c.NumeroDoc,c.Instrumentador,c.Motivo,c.IDEstado
    from cte c
    cross join Regs  R;

    UPDATE SACORRELSIS SET ValueInt = @REGS + (SELECT COUNT(*) FROM @TABLE);

    INSERT INTO TlbPedidos
    SELECT * FROM @TABLE;

    GO


    Daniel

    jueves, 19 de diciembre de 2019 21:34
  • Hola Dannycv012:

    Te falta la columna SolicitaP en la insercción.

    INSERT INTO @TABLE 
    Select c.fila+r.NumBase as Pedido
    , C.Remision
    , C.CodClie
    ----- c.SolicitaP 
    ,C.UsurIngreso
    ,c.FechaCirugia
    ,c.FechaCompromiso
    ,c.Diagnostico
    , ....

    • Marcado como respuesta Dannycv012 viernes, 20 de diciembre de 2019 13:53
    jueves, 19 de diciembre de 2019 22:43
  • Javier Fernandez , muchas gracias por tu gran ayuda era eso , me ha funcionando excelente 

    Daniel

    viernes, 20 de diciembre de 2019 14:38
  • De nada
    viernes, 20 de diciembre de 2019 14:42
  • Hola Javier , otra vez molestando por acá , tengo uno pequeño error, por que cuando se guardar el correlativo este  me actualiza toda la columna ValueInt y no   solo  la columna  cuando la   descripción en la columna  FieldName = 'prxprof', ya que los otros  campos son correlativos diferentes y no deben cambiar. espero me puedas ayudar nuevamente ,  estuve buscado pero no he podido solucionarlo ,muchas gracias 


    Daniel

    viernes, 27 de diciembre de 2019 16:39
  • Hola Dannycv012:

    Lo primero no es molestia, todo lo contrario, para eso estamos en los foros, para poder apoyar a cualquiera que este todavía en una fase de conocimiento de la herramienta, menor, o que tenga una complicación que otros hayan resuelto, o vean como resolverla.

    Dices que quieres solo en la columna FieldName = 'prxprof',

    UPDATE SACORRELSIS SET ValueInt = @REGS + (SELECT COUNT(*) FROM @TABLE) 
    where FIELDNAME = 'PrxProf';
    Ojo no se si es correcto, porque no se muy bien lo que quieres del todo. Pruebalo, y si no es esto, me comentas.

    • Marcado como respuesta Dannycv012 viernes, 27 de diciembre de 2019 18:51
    viernes, 27 de diciembre de 2019 18:30
  • Muchas gracias javier , era eso 

    Daniel

    viernes, 27 de diciembre de 2019 18:51
  • De nada
    viernes, 27 de diciembre de 2019 18:53