Pessoal,
olha eu tenho duas tabelas, a cre e cre_aux, a cre_aux vai receber os dados antes de serem enviados para a cre ... o que eu preciso é atualizar na cre_aux o número do título de forma sequencial por prefixo e parcela sem usar um cursor (só update) ... no script "sem erro" eu insero os dados de forma correta (sequencialmente por prefixo e parcela) daí o script funciona, mas no script "com erro" eu insiro desordenado e o sistema não atualiza certo (executem e vejam) ... alguém tem uma idéia?
--***** sem erro *****
create table #CRE
(
Prefixo Varchar(3),
Parcela Varchar(1),
Numero Varchar(6)
)
create table #CRE_Aux
(
Prefixo Varchar(3),
Parcela Varchar(1),
Numero Varchar(6)
)
set nocount on
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'A', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'A', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'B', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'B', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'B', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'C', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'C', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'D', '')
-- declare @contador as numeric
-- set @contador = -1
-- update Teste set Coluna1 = @contador + 1, @contador = @contador +1
declare @aux varchar(6)
declare @inc integer
declare @Prefixo Varchar(3)
declare @Parcela Varchar(1)
declare @PrefixoAnt Varchar(3)
declare @ParcelaAnt Varchar(1)
set @aux = '000000'
set @inc = 1
set @PrefixoAnt = ''
set @ParcelaAnt = ''
update #CRE_Aux
Set #CRE_Aux.Numero = Right('000000' + Cast(@aux as varchar), 6)
, @Prefixo = #CRE_Aux.Prefixo
, @Parcela = #CRE_Aux.Parcela
, @inc =
case
when (@Prefixo <> @PrefixoAnt Or @Parcela <> @ParcelaAnt) then 1
when (@PrefixoAnt = '' Or @ParcelaAnt = '') then 1
else @inc + 1
end
, @aux = Right('000000' + Cast(Coalesce(a.Numero, '000000') + @inc As Varchar), 6)
, @PrefixoAnt = #CRE_Aux.Prefixo
, @ParcelaAnt = #CRE_Aux.Parcela
from #CRE_Aux
left join (
select
Prefixo,
Parcela,
Max(Numero) Numero
from #CRE
group by Prefixo, Parcela
)a on a.Prefixo = #CRE_Aux.Prefixo
And a.Parcela = #CRE_Aux.Parcela
select * from #CRE_Aux order by Prefixo, Parcela, Numero
drop table #CRE
drop table #CRE_Aux
--***** com erro *****
create table #CRE
(
Prefixo Varchar(3),
Parcela Varchar(1),
Numero Varchar(6)
)
create table #CRE_Aux
(
Prefixo Varchar(3),
Parcela Varchar(1),
Numero Varchar(6)
)
set nocount on
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'A', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'B', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'B', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'B', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'C', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'A', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'D', '')
insert into #CRE_Aux (Prefixo, Parcela, Numero) Values ('PAR', 'C', '')
-- declare @contador as numeric
-- set @contador = -1
-- update Teste set Coluna1 = @contador + 1, @contador = @contador +1
declare @aux varchar(6)
declare @inc integer
declare @Prefixo Varchar(3)
declare @Parcela Varchar(1)
declare @PrefixoAnt Varchar(3)
declare @ParcelaAnt Varchar(1)
set @aux = '000000'
set @inc = 1
set @PrefixoAnt = ''
set @ParcelaAnt = ''
update #CRE_Aux
Set #CRE_Aux.Numero = Right('000000' + Cast(@aux as varchar), 6)
, @Prefixo = #CRE_Aux.Prefixo
, @Parcela = #CRE_Aux.Parcela
, @inc =
case
when (@Prefixo <> @PrefixoAnt Or @Parcela <> @ParcelaAnt) then 1
when (@PrefixoAnt = '' Or @ParcelaAnt = '') then 1
else @inc + 1
end
, @aux = Right('000000' + Cast(Coalesce(a.Numero, '000000') + @inc As Varchar), 6)
, @PrefixoAnt = #CRE_Aux.Prefixo
, @ParcelaAnt = #CRE_Aux.Parcela
from #CRE_Aux
left join (
select
Prefixo,
Parcela,
Max(Numero) Numero
from #CRE
group by Prefixo, Parcela
)a on a.Prefixo = #CRE_Aux.Prefixo
And a.Parcela = #CRE_Aux.Parcela
select * from #CRE_Aux order by Prefixo, Parcela, Numero
drop table #CRE
drop table #CRE_Aux
obrigado