none
Incrementar un campo en una tabla de acuerdo a cierta condición RRS feed

  • Pregunta

  • Buenas tardes, el tema es que necesito mover de posicion un registro de acuerdo a ciertas condiciones,  tengo un campo en la tabla que se llama posicion y es la posicion en la que se muestra un registro, en este caso debo de darle una posicion donde debe colocarse ese registro y debería cambiar su posicion a la nueva posicion asignada.

    Este campo no tiene nada que ver con la posicion en la que se guarde el registro como tal sino en la posicion que se mostrará en un datagridview. Por ejemplo si el registro está en la línea 05 del datagridview porque esa es la posicion que tiene asignada si yo quiero ponerlo en la posición 15 entonces debo mover todos los registros una posición menos hacia arriba hasta llegar a la posicion 05 y luego en el espacio que dejó el registro 15 que ahora es 14 ahí debo colocar el registro que antes era posicion 05.

    Aclaro que trabajo con MySql y queria ejecutar la siguiente instrucción

    ConsultaSql = "Update Resultados SET Posicion =  - 1 Where Posicion > Posicion_Anterior And Posicion <= Nueva_Posicion

    Es importante mencionar que el campo posicion es de tipo varchar y que utilizo la siguiente instrucción

    "Update Resultados SET Posicion = IFNULL(cast(posicion as unsigned),0) - 1" _
                                        & " Where Codigo_Evento ='" & Codigo_Evento & "' And Etapa = " & Etapa _
                                        & " AND Categoria = '" & Kategoria & "' And Posicion >'" _
                                        & Convert.ToString(Posicion_Anterior) & "' And Posicion <=' " & Convert.ToString(Nueva_Posicion) & "'"

    Con esta instruccion espero disminuir en uno la posicion de los registros que esten entre 06 y 15 incluidos, al tomar en cuenta el registro 06 quedará en 05 ocupando la posición del registro que estoy pasando a la posicion 15 y al tomar en cuenta el registro 15 lo estoy disminuyendo en uno para que quede en la posicion 14 y así quede el campo para el registro que estoy moviendo a la posicion 15.

    Luego de esto hago una actualización de la posicion del registro que estaba en la posicion 05 y le asigno la posicion 15.

    En teoría todo debería estar bien pero el resultado no es el esperado porque  me disminuye en uno todos los registros hasta llegar a la posicion anterior que era 05 por lo que todos los registros se mueven desde el final una posicion, cuando yo actualizo el registro en la posicion 15 ya existe otro registro en la posicion 15.

    A ver si me ayudan a ver donde está fallando la restricción de disminución de los campos porque en sana teoría sólo debería de hacerlo de la posicion 15 a la 06.


    Frank Cruz



    <link href="moz-extension://629bb10a-89f4-4d4d-8d30-2795b3f3f63e/skin/s3gt_tooltip_mini.css" rel="stylesheet" type="text/css" /><style media="print" type="text/css">#s3gt_translate_tooltip_mini { display: none !important; }</style>
    jueves, 22 de febrero de 2018 0:00

Respuestas

  • Lo siento, no sé de MySQL.  Pero en fin, pensé que le serviría ver una solución en T-SQL para SQL Server.  Con un poco de suerte y puede traducirlo fácilmente a MySQL.

    --Operamos en la base de datos temporal.
    Use tempdb;
    Go
    
    --Tabla de prueba
    Create Table dbo.tblPrueba
    (
    	Id int Identity(1, 1) Primary Key
    	, Orden int Null
    );
    Go
    
    --Inserto 20 registros de prueba.
    Insert Into dbo.tblPrueba(Orden) Values (default);
    Go 20
    Go
    
    --Preparo la tabla:  Lleno la columna Orden.
    With rankedData As (
    	Select
    		p.Id
    		, ROW_NUMBER() Over (Order By Id Asc) As rid
    	From
    		dbo.tblPrueba As p
    )
    Update dbo.tblPrueba
    Set
    	Orden = rd.rid
    From
    	dbo.tblPrueba As p
    	Inner Join
    	rankedData As rd
    	On p.Id = rd.Id
    ;
    Go
    
    --INICIO DE LA LÓGICA
    ---------------------
    
    Declare @posInicio int = 15; --Posición inicial.
    Declare @posFinal int = 5; --Posición final.
    Declare @posMenor int; --La menor de las 2 posiciones.
    Declare @posMayor int; --La mayor de las 2 posiciones.
    Declare @signo int; --Valor de incremento en la columna de orden.
    Declare @id int; --Clave primaria del registro que se debe mover.
    
    If (@posInicio > @posFinal)
    Begin
    	--Si vamos de abajo hacia arriba...
    	Set @posMenor = @posFinal;
    	Set @posMayor = @posInicio;
    	Set @signo = 1;
    End
    Else
    Begin
    	--Si vamos de arriba hacia abajo...
    	Set @posMenor = @posInicio;
    	Set @posMayor = @posFinal;
    	Set @signo = -1;
    End
    
    --Como esto es una demostración de código, este SELECT
    --simplemente muestra el estado actual de la tabla.
    --NO ES PARTE DE LA LÓGICA.
    Select * From dbo.tblPrueba Order By Orden;
    
    --No queremos que otros usuarios toquen los datos mientras trabajamos.
    Set Transaction Isolation Level Repeatable Read;
    
    --Iniciamos una transacción.
    Begin Tran;
    
    --Como esto es una demostración, yo obtengo la clave primaria del registro
    --a mover usando esta sentencia SELECT.  En un caso real la clave primaria
    --del registro es un dato previamente conocido.
    --NO ES PARTE DE LA LÓGICA, pero debe conocerse su valor.
    Select
    	@id = Id
    From
    	dbo.tblPrueba
    Where
    	Orden = @posInicio
    ;
    
    --Movemos los registros (ya sea para arriba o para abajo).
    Update dbo.tblPrueba
    Set
    	Orden = Orden + @signo
    Where
    	Orden >= @posMenor
    	And
    	Orden <= @posMayor
    ;
    
    --Movemos el registro que debía moverse a su posición final.
    Update dbo.tblPrueba
    Set
    	Orden = @posFinal
    Where
    	Id = @id
    ;
    --Completamos la transacción.
    Commit Tran;
    
    --Demostramos los resultados.
    --NO ES PARTE DE LA LÓGICA.
    Select * From dbo.tblPrueba Order By Orden;
    Go
    
    --Borramos la tabla de prueba.
    Drop Table dbo.tblPrueba;
    Go
    


    Jose R. MCP
    Code Samples

    martes, 13 de marzo de 2018 8:10