PROBLEMA EM STORED PROCEDURE???

VILMARBR 24/08/2009 21:09:04
#320851
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.
RCMRO 25/08/2009 09:14:30
#320877
Resposta escolhida
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
VILMARBR 25/08/2009 11:14:22
#320901
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!!
Tópico encerrado , respostas não são mais permitidas