es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice el cursor con 2 tablas para insertar filas.

Tengo 2 tablas: “items” y “cost”.

En la tabla “items”, tengo el código antiguo del artículo y el código nuevo del artículo.

En la tabla “cost”, tengo el código del artículo y el costo.

Quiero crear nuevas filas en la tabla “cost” para el código nuevo del artículo de acuerdo con el costo que ya existe para el código antiguo del artículo.

Por ejemplo:

Espero ver este resultado después de ejecutar el cursor en la tabla “cost”:

Intento ejecutar esto, pero lleva mucho tiempo y duplica cada fila 100000 veces:

DECLARE @item_code_old nvarchar (50)
DECLARE @item_code_new nvarchar (50)

DECLARE CostCURSOR CURSOR FOR
SELECT item_code_old, item_code_new
FROM item
WHERE company = ‘AEW’ AND item_code_new IS NOT NULL

OPEN CostCURSOR

FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new

WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @item_code_old = item_code_old
FROM cost
WHERE company = ‘AEW’ AND year = 2021

INSERT INTO cost
    SELECT
        company,
        year,
        month,
        @item_code_new,
        unit_cost
    FROM
        cost
    WHERE
        company = 'AEW' AND year = 2021

FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new

END

CLOSE CostCURSOR
DEALLOCATE CostCURSOR

¿Qué me falta?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que no está utilizando el cursor para extraer la fila correcta de la tabla “cost”. En su lugar, siempre selecciona el costo de la primera fila donde “company = ‘AEW'” y “year = 2021”. Para solucionar esto, se debería utilizar el cursor para obtener el valor correcto de “unit_cost” para el código de producto antiguo, y luego utilizar este valor en la declaración “INSERT” para el código de producto nuevo.

    Aquí tienes una versión actualizada del código que debería funcionar:

    DECLARE @item_code_old nvarchar(50)
    DECLARE @item_code_new nvarchar(50)
    DECLARE @unit_cost decimal(18, 2)
    
    DECLARE CostCURSOR CURSOR FOR
    SELECT item_code_old, item_code_new 
    FROM items 
    WHERE company = 'AEW' AND item_code_new IS NOT NULL
    
    OPEN CostCURSOR 
    FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new
    
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        -- Obtener el costo unitario para el código de producto antiguo
        SELECT @unit_cost = unit_cost 
        FROM cost 
        WHERE company = 'AEW' AND year = 2021 AND item_code = @item_code_old
    
        -- Insertar una nueva fila para el código de producto nuevo con el mismo costo
        INSERT INTO cost
        (company, year, month, item_code, unit_cost)
        SELECT 
            'AEW', 2021, month, @item_code_new, @unit_cost
        FROM 
            cost 
        WHERE 
            company = 'AEW' AND year = 2021 AND item_code = @item_code_old
    
        FETCH NEXT FROM CostCURSOR INTO @item_code_old, @item_code_new
    END
    
    CLOSE CostCURSOR 
    DEALLOCATE CostCURSOR
    

    En esta versión del código, se utiliza el cursor para extraer los valores de item_code_old y item_code_new de la tabla items, al igual que antes. Pero luego se declara una nueva variable @unit_cost para almacenar el costo unitario del código de producto antiguo.

    Dentro del bucle WHILE, se utiliza una declaración SELECT para obtener el valor correcto de @unit_cost de la tabla cost, en función del valor de @item_code_old. Luego, se utiliza una declaración INSERT para agregar una nueva fila a la tabla cost para el código de producto nuevo, con el mismo costo que el código de producto antiguo.

    La diferencia clave en este código es que se utiliza el cursor para extraer el valor correcto de unit_cost de la tabla cost, en lugar de utilizar siempre el mismo valor para cada nueva fila. Esto debería dar como resultado la salida esperada que se muestra en la última imagen.

Comments are closed.