none
ayuda para seleccionar datos de una tabla e insertarlo en otra pero insertando un campo calculado RRS feed

  • Pregunta

  • Hola ,quisiera ayuda con lo siguiente tengo estas dos tablas necesito seleccionar de la tabla cliente contrato y tarifa e insertarlo en la tabla facturación ,el campo factura debe generarse descuerdo al ultimo numero de factura ,el campo es de tipo varchar ,por ejemplo el ultimo numero es 000020 y las filas a insertar son 2 la primera deberá tener la factura 000021 y la segunda 000022 y asi dependiendo del numero de filas que se inserte

    lunes, 18 de noviembre de 2019 15:02

Respuestas

  • Hola Antonio Figueroa:

    Una opción es:

    create table cliente (contrato int, tarifa int)
    create table factura (factura varchar(6), contrato int, tarifa int)
    go
    insert into factura(factura, contrato, tarifa)
    values
     ('000020',1,1)
    go
    insert into cliente (contrato, tarifa)
    values
    (2,1),(2,5);
    go

    Con el escenario planteado.

    ;with f as(
    /* en el conjunto f la ultima factura */
    	select max(cast(factura as int)) factura 
    	from factura
    	), c as (
    /* en el conjunto c numero las filas que tiene cliente */
    	Select row_number() over (order by contrato, tarifa) as fila,
    			contrato,
    			tarifa
    		from cliente
    	)
    Insert into factura 
    /* inserto en factura el valor de maxima factura 000020 + la fila que tiene cliente */
    Select 
    right(cast((power(10,7)+cast (c.fila as int)+f.factura) as varchar(10)),6),
    c.contrato,
    c.tarifa
    from c
    cross join f ;
    
     

    Si tienes muchas inserciones concurrentes, entonces puedes aplicar un nivel de aislamiento serializable, para que no se pueda obtener el mismo num Factura por dos transacciones.

    Al iniciar el select pones

    Set Transaction Isolation Level Serializable.

    Espero te ayude

    lunes, 18 de noviembre de 2019 15:22
  • Deleted
    lunes, 18 de noviembre de 2019 15:24

Todas las respuestas

  • Hola Antonio Figueroa:

    Una opción es:

    create table cliente (contrato int, tarifa int)
    create table factura (factura varchar(6), contrato int, tarifa int)
    go
    insert into factura(factura, contrato, tarifa)
    values
     ('000020',1,1)
    go
    insert into cliente (contrato, tarifa)
    values
    (2,1),(2,5);
    go

    Con el escenario planteado.

    ;with f as(
    /* en el conjunto f la ultima factura */
    	select max(cast(factura as int)) factura 
    	from factura
    	), c as (
    /* en el conjunto c numero las filas que tiene cliente */
    	Select row_number() over (order by contrato, tarifa) as fila,
    			contrato,
    			tarifa
    		from cliente
    	)
    Insert into factura 
    /* inserto en factura el valor de maxima factura 000020 + la fila que tiene cliente */
    Select 
    right(cast((power(10,7)+cast (c.fila as int)+f.factura) as varchar(10)),6),
    c.contrato,
    c.tarifa
    from c
    cross join f ;
    
     

    Si tienes muchas inserciones concurrentes, entonces puedes aplicar un nivel de aislamiento serializable, para que no se pueda obtener el mismo num Factura por dos transacciones.

    Al iniciar el select pones

    Set Transaction Isolation Level Serializable.

    Espero te ayude

    lunes, 18 de noviembre de 2019 15:22
  • Deleted
    lunes, 18 de noviembre de 2019 15:24
  • me marca el siguiente error

    Mens. 102, Nivel 15, Estado 1, Línea 12
    Sintaxis incorrecta cerca de '.'.

    lunes, 18 de noviembre de 2019 16:22
  • Deleted
    lunes, 18 de noviembre de 2019 16:25