PROBLEMA EM STORED PROCEDURE???
Estou com um problema numa stored procucedure t-sql do sybase, mas é muito parecido com t-sql da microsoft.
A procedure deveria a cada alteração de produto , zerar um contador e recomeçar a montagem de data, a partir de 01.01.1900.
Veja o trecho que está dando problema no cursor:
/*Data InÃcio Vigência*/
if @cd_prod <> @cd_prod_old
begin
select @cd_prod_old = @cd_prod
select @contador = 1
select @dt_ini_vig_prod = [ô]01.01.1900[ô]
end
else
begin
select @contador = @contador + 1
if datalength(convert(varchar(2),@contador)) = 1
select @dt_ini_vig_prod = [ô]0[ô] + convert(varchar(2),@contador) + [ô].01.1900[ô]
else
select @dt_ini_vig_prod = convert(varchar(2),@contador) + [ô].01.1900[ô]
end
update #ba60_ba30_prod_t
set
dt_ini_vig_prod = @dt_ini_vig_prod
where
(cd_ps = @cd_prod_old) and
(tp_clc_prst = @tp_clc_prst) and
(cd_ind_cm_sld_dvr = @cd_ind_cm_sld_dvr) and
(pc_desc_prod = @pc_desc_prod)
Só está me atualizando os 2 primeiros produtos:
cd_ps tp_clc_prst cd_ind_cm_sld_dvr pc_desc_prod dt_ini_vig_prod
----------- ----------- ----------------- ------------ ---------------
195 13 0 0.00 01.01.1900
195 1 511 0.00 02.01.1900
Estou há mais de 3 horas vendo isto e não resolvo!!!!! [S28][S21]
Alguém já passou por isto ?? Alguma dica de como resolver ????
Observo que eu uso cursores e tabelas temporárias.
Estou tratando campos que vem valor nulo.
Enfim, estou usando todas boas práticas de programação, mas isto não está saindo [S34] .
Stored procedure completa e resultados seguem em anexo.
Grato.
A procedure deveria a cada alteração de produto , zerar um contador e recomeçar a montagem de data, a partir de 01.01.1900.
Veja o trecho que está dando problema no cursor:
/*Data InÃcio Vigência*/
if @cd_prod <> @cd_prod_old
begin
select @cd_prod_old = @cd_prod
select @contador = 1
select @dt_ini_vig_prod = [ô]01.01.1900[ô]
end
else
begin
select @contador = @contador + 1
if datalength(convert(varchar(2),@contador)) = 1
select @dt_ini_vig_prod = [ô]0[ô] + convert(varchar(2),@contador) + [ô].01.1900[ô]
else
select @dt_ini_vig_prod = convert(varchar(2),@contador) + [ô].01.1900[ô]
end
update #ba60_ba30_prod_t
set
dt_ini_vig_prod = @dt_ini_vig_prod
where
(cd_ps = @cd_prod_old) and
(tp_clc_prst = @tp_clc_prst) and
(cd_ind_cm_sld_dvr = @cd_ind_cm_sld_dvr) and
(pc_desc_prod = @pc_desc_prod)
Só está me atualizando os 2 primeiros produtos:
cd_ps tp_clc_prst cd_ind_cm_sld_dvr pc_desc_prod dt_ini_vig_prod
----------- ----------- ----------------- ------------ ---------------
195 13 0 0.00 01.01.1900
195 1 511 0.00 02.01.1900
Estou há mais de 3 horas vendo isto e não resolvo!!!!! [S28][S21]
Alguém já passou por isto ?? Alguma dica de como resolver ????
Observo que eu uso cursores e tabelas temporárias.
Estou tratando campos que vem valor nulo.
Enfim, estou usando todas boas práticas de programação, mas isto não está saindo [S34] .
Stored procedure completa e resultados seguem em anexo.
Grato.
Vilmar,
Tenta o código abaixo, verificando na SINTAX do SYBASE como funciona o DATEADD para acertar, se for preciso.
Dispensa o uso de [Ô]@Contador[Ô]. Estou presumindo que [Ô]@dt_ini_vig_prod[Ô] é do tipo DATETIME.
Se isto não funcionar, me passa a proceure inteira para eu tentar te ajudar com mais propriedade.
Abraços.
/*Data InÃcio Vigência*/
IF @cd_prod <> @cd_prod_old
BEGIN
SELECT @cd_prod_old = @cd_prod
SELECT @dt_ini_vig_prod = CONVERT(DATETIME,[ô]01.01.1900[ô])
END
ELSE
BEGIN
SELECT @dt_ini_vig_prod = DATEADD(DAY, 1, @dt_ini_vig_prod)
END
UPDATE #ba60_ba30_prod_t
SET dt_ini_vig_prod = @dt_ini_vig_prod
WHERE cd_ps = @cd_prod_old
AND tp_clc_prst = @tp_clc_prst
AND cd_ind_cm_sld_dvr = @cd_ind_cm_sld_dvr
AND pc_desc_prod = @pc_desc_prod
Tenta o código abaixo, verificando na SINTAX do SYBASE como funciona o DATEADD para acertar, se for preciso.
Dispensa o uso de [Ô]@Contador[Ô]. Estou presumindo que [Ô]@dt_ini_vig_prod[Ô] é do tipo DATETIME.
Se isto não funcionar, me passa a proceure inteira para eu tentar te ajudar com mais propriedade.
Abraços.
/*Data InÃcio Vigência*/
IF @cd_prod <> @cd_prod_old
BEGIN
SELECT @cd_prod_old = @cd_prod
SELECT @dt_ini_vig_prod = CONVERT(DATETIME,[ô]01.01.1900[ô])
END
ELSE
BEGIN
SELECT @dt_ini_vig_prod = DATEADD(DAY, 1, @dt_ini_vig_prod)
END
UPDATE #ba60_ba30_prod_t
SET dt_ini_vig_prod = @dt_ini_vig_prod
WHERE cd_ps = @cd_prod_old
AND tp_clc_prst = @tp_clc_prst
AND cd_ind_cm_sld_dvr = @cd_ind_cm_sld_dvr
AND pc_desc_prod = @pc_desc_prod
RCMRO, perfeito ;)
Matou a charada!!
Enfim, o [Ô]T-SQL[Ô] do Sybase não estava conseguindo se virar com estas conversões de número para texto e texto para número.
Meu campo era varchar(10) para que tivesse data neste formato dd.mm.yyyy (resultado de um convert(varchar(10), VALOR, 104) )
Tanto há que qdo eu inseria só o contador, fazia as alterações (updates) certinho:
1
2
3
1
2
1
1
2
3
....
Ou seja, não perdi a sequência.
O fo....da foi: num deu erro de sintaxe, fez o 1º produto certo e demais deixou a alteração sem campo algum, ou seja, em branco.
Eu acho que se fosse o T-SQL da Microsoft tinha ido num boa.
Muito obrigado, mais uma vez!!
Matou a charada!!
Enfim, o [Ô]T-SQL[Ô] do Sybase não estava conseguindo se virar com estas conversões de número para texto e texto para número.
Meu campo era varchar(10) para que tivesse data neste formato dd.mm.yyyy (resultado de um convert(varchar(10), VALOR, 104) )
Tanto há que qdo eu inseria só o contador, fazia as alterações (updates) certinho:
1
2
3
1
2
1
1
2
3
....
Ou seja, não perdi a sequência.
O fo....da foi: num deu erro de sintaxe, fez o 1º produto certo e demais deixou a alteração sem campo algum, ou seja, em branco.
Eu acho que se fosse o T-SQL da Microsoft tinha ido num boa.
Muito obrigado, mais uma vez!!
Tópico encerrado , respostas não são mais permitidas