none
Usando cursor e loop em consulta SQL para Inserir ou Alterar Registros em nova Coluna criada RRS feed

  • Pergunta

  • Olá, bom dia amigos.

    Estou tentando desenvolver uma situação aqui internamente, onde precisarei criar uma coluna em tabela de um banco chamada Trimestre, e essa coluna irá precisar ser populada através de uma procedure em cima dos registros que já existem na tabela e nos que estarão a ser criados.

    Só que a mesma precisará adicionar esses registros com a dependência de uma coluna dessa mesma tabela, vamos a tabela

    TABELA: CARGAHORARIA

    Colunas: ID_CH, DESCR, TRIMESTRE (coluna nova criada), JAN, FEV, MAR, ABR, MAI, JUN, JUL, AGO, SET, OUT, NOV, DEZ

    A lógica em questão é preencher a tabela trimestre com uma procedure que efetuará um while do min e max do ID_CH como o contador do Min sendo acrescentado até chegar no Max ID_CH, buscando nos registros a coluna Trimestre 0 ou Nulo, e efetuando as condições referentes as colunas de meses que possuem valores, a intensão é pegar meses que existem valores e preencher o código do Trimestre na coluna Trimestre. Sendo Trimestre (JAN, FEV, MAR = 1, ABR, MAI, JUN = 2, etc..) exemplo da condição:

    - Se JAN tiver valor zero, ele vai para FEV, se tiver acima de zero ele já populariza a coluna Trimestre como 1 e sai do loop pro próximo registro.
    - Se JAN, FEV, MAR estiverem zerados, ou ABR, MAI, JUN tiver acima de zero, ele popula a coluna Trimestre para 2 e sai do loop pro próximo registro e assim vai.

    Creio que a criação desse código via procedure é possível, efetuei algumas implementações, mas travei um pouco no processo desse desenvolvimento.

    Alguém teria alguma ideia de como fazer???

    Seria algo como isso aqui

    DECLARE @Min int;

    DECLARE @Max int;

    DECLARE @Trimestre int;

    DECLARE @Mes int;

    select @Min = min(id_ch) from dbo.[Carga Horária];
    select @Max = max(id_ch) from dbo.[Carga Horária];

    while(@Min <= @Max)
    begin
    IF (SELECT count(id_ch) FROM dbo.[Carga Horária] WHERE id_ch = @Min) > 0
    begin
    select @Trimestre = trimeste from dbo.[Carga Horária] where id_ch = @Min;
    IF (@Trimestre IS NULL) OR (@Trimeste = 0)
    begin
    select @Mes = Janeiro from dbo.[Carga Horária] where id_ch = @Min
    IF (@Mes IS NULL) OR (@Mes = 0)
    begin
    SET @Mes = 0;
    UPDATE dbo.[Carga Horária] SET Trimestre = 1 WHERE id_ch = @Min;
    @Min += @Min;
    CONTINUE

    end;
    ELSEIF ....

    end;
    end;
    end;



    sexta-feira, 2 de setembro de 2022 14:54

Todas as Respostas

  • Bom dia,

    Você pode postar uma amostra de dados dessa tabela e como deve ficar a coluna nova?


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 2 de setembro de 2022 15:21
  • Vamos lá.

    TABELA: CARGA HORARIA (Atual)

    ID_CH | DESC                             | JAN | FEV | MAR | ABR | MAI | JUN | JUL | AGO | SET | OUT | NOV | DEZ

    1         | Carga Horaria 1              | 0     |  10  | 40    | 40    | 40   | 40   | 0     | 0      | 0     | 0      | 0      | 0     |

    2         | Carga Horaria 2              | 0     |   0   | 0      | 0      | 0    | 10   | 40   | 40    | 40    | 40    | 40    | 40    |

    3         | Carga Horaria 3              | 0     |   0   | 0      | 0      | 0    |  0    | 0     |  0     | 0     | 10    | 40    | 40    |

    Tabela com inserção da coluna TRIMESTRE

    TABELA: CARGA HORARIA (Coluna Trimestre inserida)

    ID_CH | DESC       | TRIMESTRE    | JAN | FEV | MAR | ABR | MAI | JUN | JUL | AGO | SET | OUT | NOV | DEZ

    1         | Carga H1 |   1                 | 0     |  10  | 40    | 40    | 40   | 40   | 0     | 0      | 0     | 0      | 0      | 0     |

    2         | Carga H2 |   2                 | 0     |   0   | 0      | 0      | 0    | 10   | 40   | 40    | 40    | 40    | 40    | 40    |

    3         | Carga H3 |   4                 | 0     |   0   | 0      | 0      | 0    |  0    | 0     |  0     | 0     | 10    | 40    | 40    |

    Mais ou menos nesses moldes

    Obrigado.

    sexta-feira, 2 de setembro de 2022 16:57
  • Acho que é possível preencher a coluna Trimestre com um Update simples com Case, sem procedure, looping e cursor. Segue sugestão para testes:

    update CargaHoraria
    set Trimestre =
        case when [Jan] > 0 or [Fev] > 0 or [Mar] > 0
            then 1
            else 
                case when [Abr] > 0 or [Mai] > 0 or [Jun] > 0 
                    then 2
                    else
                        case when [Jul] > 0 or [Ago] > 0 or [Set] > 0 
                            then 3
                            else
                                case when [Out] > 0 or [Nov] > 0 or [Dez] > 0
                                    then 4
                                    else 0
                                end
                        end
                end
        end
    where Trimestre is null
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 2 de setembro de 2022 17:44
  • Opa amigo,

    Perfeito a solução, pode resolver com certeza, de toda forma terei que adicionar um trigger para que esse processo seja executado automaticamente quando um novo registro for inserido, já que esse update nessa coluna Trimestre não será feita via sistema e esse dado será importante somente pra relatórios.

    Mas executando da forma que passastes, acredito que consigo gerar essa Trigger sem problemas.

    Muito obrigado.


    segunda-feira, 5 de setembro de 2022 13:15