none
Deleted RRS feed

Respuestas

  • Si lo que estas trabajando es una tabla para guardar un ticket, tal vez debas separar tu información en dos tablas
    por ejemplo:

    Una tabla de Encabezado de ticket

    CREATE TABLE TICKET
    (
    N_Tiket int NOT NULL,
    Fecha datetime NOT NULL,
    Cliente nvarchar(50) NOT NULL,
    Subtotal decimal(10,2) NOT NULL,
    Total decimal(10,2) NOT NULL,
    Metodo_Pago nvarchar(20) NOT NULL,
    CONSTRAINT pk_ticket PRIMARY KEY(N_Tiket),
    )

    Una tabla de detalle de ticket

    CREATE TABLE TICKET_DTL
    (
    N_Tiket int NOT NULL,
    Linea int NOT null,
    Producto NVARCHAR (50) NOT NULL,
    CANTIDAD INT NOT NULL,
    PRECIO NVARCHAR(50) NOT NULL,
    COMENTARIO nvarchar(150),
    CONSTRAINT fk_ticket FOREIGN KEY(N_Tiket) REFERENCES dbo.TICKET(N_Tiket),
    CONSTRAINT u_producto UNIQUE (N_Tiket,Linea)
    )


    INSERT INTO  TICKET(N_Tiket, Fecha, Cliente, Subtotal, Total, Metodo_Pago)
    VALUES        (1,'2019-04-30','QWE','444','444','EFECTIVO')
    
    INSERT INTO TICKET_DTL(N_Tiket, Linea, Producto, CANTIDAD, PRECIO,COMENTARIO)
    VALUES        (1,1,'TACO DE POLLO',1,'100','SIN CEBOLLA'),
    			  (1,2,'COSTILLA',1,'300','-'),
    			  (1,3,'COCACOLA SIN',1,'44','-'),
    			  (1,3,'SENZAO',1,'44','-')

    Cuando consultes un ticket, la columna "N_Tiket" de la tabla TICKET sera tu ID
    y en la tabla TICKET_DTL al columa "Linea" sera sera la posición del producto en el ticket

    SELECT T.N_Tiket, T.Fecha, T.Cliente, T.Subtotal, T.Total, T.Metodo_Pago, TD.Linea, TD.Producto, TD.CANTIDAD, TD.PRECIO, TD.COMENTARIO
    FROM   TICKET AS T 
    INNER JOIN TICKET_DTL AS TD ON T.N_Tiket = TD.N_Tiket 
    WHERE T.N_Tiket=1 
    ORDER BY TD.Linea

    En el momento que tu filtro apunte a un producto o a una posición, esta siempre se conservara ya que el numero de linea no cambia 

    SELECT        T.N_Tiket, T.Fecha, T.Cliente, T.Subtotal, T.Total, T.Metodo_Pago, TD.Linea, TD.Producto, TD.CANTIDAD, TD.PRECIO, TD.COMENTARIO
    FROM            TICKET AS T INNER JOIN
                             TICKET_DTL AS TD ON T.N_Tiket = TD.N_Tiket
    						 WHERE T.N_Tiket=1 AND TD.Linea=4
    
    SELECT T.N_Tiket, T.Fecha, T.Cliente, T.Subtotal, T.Total, T.Metodo_Pago, TD.Linea, TD.Producto, TD.CANTIDAD, TD.PRECIO, TD.COMENTARIO
    FROM  TICKET AS T 
    INNER JOIN TICKET_DTL AS TD ON T.N_Tiket = TD.N_Tiket
     WHERE T.N_Tiket=1 AND TD.Producto='SENZAO'

    Es una sugerencia para solucionar tu problema.

    Espero te sea de utilidad, Saludos.


    Damian C M

    martes, 30 de abril de 2019 21:05

Todas las respuestas

  • --El resultado que deseas lo puedes obtener con ROW_NUMBER()
    --Sin embargo esta función exige que ordenes por una columna
    
    WITH posicion as(
    SELECT ROW_NUMBER() OVER(ORDER BY PRODUCTO ASC) AS Posicion, PRODUCTO FROM TBLVA WHERE ID = 1
    )
    SELECT p.Posicion FROM posicion p WHERE p.Posicion=1
    
    

    No comprendo el objetivo de apuntar a la posición que devuelve sql, deberías utilizar en su lugar un campo identificador para realizar tu filtro.

    Aun así espero  que mi respuesta te sea de utilidad.


    Damian C M

    martes, 30 de abril de 2019 18:23
  • Hola EAAH:

    Hay un mátiz a esa ordenación, ya que la misma debiera de ser determinista 

    Pero esta puede ser una aproximación bastante cercana a lo que quieres, aunque tienes que tener en cuenta, que no poder preveer el orden hace que no se pueda preveer, por tanto en algunos escenarios, puede devolverte otro orden no esperado.

    insert into TBLVA (ID, PRODUCTO, COMENTARIOS, CANTIDAD, PRECIO, PRETOTAL, TOTAL, CLIENTE, EFECTIVO, CAMBIO, FECHA_HORA) VALUES (1,'ORDEN','PARA LLEVAR', 1,'0','0','$444','QWE','$500','$56','20190430'), (1,'TACO DE POLLO','SIN CEBOLLA', 1,'0','0','$444','QWE','$500','$56','20190430'), (1,'COSTILLA','1KG', 1,'0','0','$444','QWE','$500','$56','20190430'), (1,'COCACOLA SIN','', 1,'0','0','$444','QWE','$500','$56','20190430'); GO DECLARE @VARIABLEORDEN INT; SET @VARIABLEORDEN = 1; ; WITH CTE AS ( SELECT ROW_NUMBER () OVER(ORDER BY (SELECT NULL)) AS FILA , ID , PRODUCTO , COMENTARIOS , CANTIDAD , PRECIO , PRETOTAL , TOTAL , CLIENTE , EFECTIVO , CAMBIO , FECHA_HORA FROM TBLVA ) SELECT

    ID , PRODUCTO , COMENTARIOS , CANTIDAD , PRECIO , PRETOTAL , TOTAL , CLIENTE , EFECTIVO , CAMBIO , FECHA_HORA FROM CTE WHERE FILA = @VARIABLEORDEN;

    Salida

    martes, 30 de abril de 2019 18:35
  • Deleted
    martes, 30 de abril de 2019 18:43
  • Deleted
    martes, 30 de abril de 2019 18:49
  • En ese caso  solo pon

    SELECT T1.PRODUCTO FROM ( SELECT ROW_NUMBER() OVER (ORDER BY ID) AS Posicion, PRODUCTO FROM TBLVA) T1 WHERE T1.Posicion = 1


    Damian C M

    martes, 30 de abril de 2019 18:58
  • Deleted
    martes, 30 de abril de 2019 19:08
  • Si lo que estas trabajando es una tabla para guardar un ticket, tal vez debas separar tu información en dos tablas
    por ejemplo:

    Una tabla de Encabezado de ticket

    CREATE TABLE TICKET
    (
    N_Tiket int NOT NULL,
    Fecha datetime NOT NULL,
    Cliente nvarchar(50) NOT NULL,
    Subtotal decimal(10,2) NOT NULL,
    Total decimal(10,2) NOT NULL,
    Metodo_Pago nvarchar(20) NOT NULL,
    CONSTRAINT pk_ticket PRIMARY KEY(N_Tiket),
    )

    Una tabla de detalle de ticket

    CREATE TABLE TICKET_DTL
    (
    N_Tiket int NOT NULL,
    Linea int NOT null,
    Producto NVARCHAR (50) NOT NULL,
    CANTIDAD INT NOT NULL,
    PRECIO NVARCHAR(50) NOT NULL,
    COMENTARIO nvarchar(150),
    CONSTRAINT fk_ticket FOREIGN KEY(N_Tiket) REFERENCES dbo.TICKET(N_Tiket),
    CONSTRAINT u_producto UNIQUE (N_Tiket,Linea)
    )


    INSERT INTO  TICKET(N_Tiket, Fecha, Cliente, Subtotal, Total, Metodo_Pago)
    VALUES        (1,'2019-04-30','QWE','444','444','EFECTIVO')
    
    INSERT INTO TICKET_DTL(N_Tiket, Linea, Producto, CANTIDAD, PRECIO,COMENTARIO)
    VALUES        (1,1,'TACO DE POLLO',1,'100','SIN CEBOLLA'),
    			  (1,2,'COSTILLA',1,'300','-'),
    			  (1,3,'COCACOLA SIN',1,'44','-'),
    			  (1,3,'SENZAO',1,'44','-')

    Cuando consultes un ticket, la columna "N_Tiket" de la tabla TICKET sera tu ID
    y en la tabla TICKET_DTL al columa "Linea" sera sera la posición del producto en el ticket

    SELECT T.N_Tiket, T.Fecha, T.Cliente, T.Subtotal, T.Total, T.Metodo_Pago, TD.Linea, TD.Producto, TD.CANTIDAD, TD.PRECIO, TD.COMENTARIO
    FROM   TICKET AS T 
    INNER JOIN TICKET_DTL AS TD ON T.N_Tiket = TD.N_Tiket 
    WHERE T.N_Tiket=1 
    ORDER BY TD.Linea

    En el momento que tu filtro apunte a un producto o a una posición, esta siempre se conservara ya que el numero de linea no cambia 

    SELECT        T.N_Tiket, T.Fecha, T.Cliente, T.Subtotal, T.Total, T.Metodo_Pago, TD.Linea, TD.Producto, TD.CANTIDAD, TD.PRECIO, TD.COMENTARIO
    FROM            TICKET AS T INNER JOIN
                             TICKET_DTL AS TD ON T.N_Tiket = TD.N_Tiket
    						 WHERE T.N_Tiket=1 AND TD.Linea=4
    
    SELECT T.N_Tiket, T.Fecha, T.Cliente, T.Subtotal, T.Total, T.Metodo_Pago, TD.Linea, TD.Producto, TD.CANTIDAD, TD.PRECIO, TD.COMENTARIO
    FROM  TICKET AS T 
    INNER JOIN TICKET_DTL AS TD ON T.N_Tiket = TD.N_Tiket
     WHERE T.N_Tiket=1 AND TD.Producto='SENZAO'

    Es una sugerencia para solucionar tu problema.

    Espero te sea de utilidad, Saludos.


    Damian C M

    martes, 30 de abril de 2019 21:05