Files
apollinare-catering-software/docs/procedures/ROWSORT_TIPI.md
2025-12-17 13:02:12 +01:00

3.4 KiB

ROWSORT_TIPI

Codice Sorgente

PROCEDURE "ROWSORT_TIPI" (
    p_direc_cod IN VARCHAR2,
    o_return    OUT CLOB
) AS

    v_direc        VARCHAR2(4);
    v_cod_tipo     VARCHAR2(10);
    v_cod_step     NUMBER;
    v_cod_step_new NUMBER;
    v_return       CLOB;
BEGIN

		-- Separo i valori in entrata su p_direc_cod 'direc_cod' in un array ( Es: 'desc_AN' => [ 'desc', 'AN' ] )
		---- Seleziono la direzione (asc o desc)
    SELECT
        upper(result)
    INTO v_direc
    FROM
        TABLE ( string_to_table_enum(p_string => p_direc_cod, v_level => 0, p_separator => '_') )
    WHERE
        id = 1;

		---- Seleziono l'cod_tipo della riga da spostare

    SELECT
        upper(result)
    INTO v_cod_tipo
    FROM
        TABLE ( string_to_table_enum(p_string => p_direc_cod, v_level => 0, p_separator => '_') )
    WHERE
        id = 2;

    IF v_direc = 'ASC' THEN

			-- Seleziono i numeri di riga
        SELECT
            cod_step,
            cod_step - 1
        INTO
            v_cod_step,
            v_cod_step_new
        FROM
            tb_tipi_mat
        WHERE
            upper(TRIM(cod_tipo)) = upper(TRIM(v_cod_tipo));

			-- Libero i numeri di riga richiesti
			-- diminuendo il numero di riga di un valore inutilizzato (Es: 0.5)

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step - 0.5
        WHERE
            cod_tipo = v_cod_tipo;

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step - 0.5
        WHERE
            cod_step = v_cod_step_new;

			-- Sposto la riga precedente al posto di quella selezionata (Es: row 1 diventerà row 2)

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step
        WHERE
            cod_step = v_cod_step_new - 0.5;

			-- Sposto la riga selezionata al nuovo posto

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step_new
        WHERE
            cod_tipo = v_cod_tipo;

        v_return := 'cod_tipo: '
                    || v_cod_tipo
                    || ' - From Row '
                    || v_cod_step
                    || ' - To Row '
                    || v_cod_step_new;

    ELSIF v_direc = 'DESC' THEN

			-- Seleziono i numeri di riga
        SELECT
            cod_step,
            cod_step + 1
        INTO
            v_cod_step,
            v_cod_step_new
        FROM
            tb_tipi_mat
        WHERE
            upper(TRIM(cod_tipo)) = upper(TRIM(v_cod_tipo));

			-- Libero i numeri di riga richiesti
			-- diminuendo il numero di riga di un valore inutilizzato (Es: 0.5)

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step + 0.5
        WHERE
            cod_tipo = v_cod_tipo;

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step + 0.5
        WHERE
            cod_step = v_cod_step_new;

			-- Sposto la riga precedente al posto di quella selezionata (Es: row 1 diventerà row 2)

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step
        WHERE
            cod_step = v_cod_step_new + 0.5;

			-- Sposto la riga selezionata al nuovo posto

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step_new
        WHERE
            cod_tipo = v_cod_tipo;

        v_return := 'cod_tipo: '
                    || v_cod_tipo
                    || ' - From row. '
                    || v_cod_step
                    || ' - To row: '
                    || v_cod_step_new;

    END IF;

    o_return := v_return;
END;```