Fórum retornar proximo codigo vago #571896
01/12/2016
0
Preciso de uma ajuda para montar um select .
Tenho uma tabela chamada "COD_BARRAS"
um campo chamado "CODIGO_BARRA"
composto de 7 digitos
sendo os 4 primeiro que corresponde ao setor e grupo pre definido pelas compradoras
e os 3 ultimos que incrementa o codigo
Preciso de um select que ao filtrar os 4 digitos primeiro o select me retorne qual o proximo codigo vago para ser usado.
lembrando que é um campo VARCHAR
Exemplos:
no campo já existes estes codigos
0110001
0110002
0110003
0110005
0851001
0851002
0851003
0851005
supomos que a secao = '01' and grupo = '10'
o proximo codigo então seria '0110004'
ou
0110001
0110002
0110003
0110004
0851001
0851002
0851003
0851004
o proximo codigo então seria '0110005'
outro exemplos
supomos que a secao = '08' and grupo = '51'
o proximo codigo então seria '0851004'
ou
0110001
0110002
0110003
0110004
0851001
0851002
0851003
0851004
o proximo codigo então seria '0851005'
Desde já muito obrigado
Paulo Agnezze
Curtir tópico
+ 0Post mais votado
02/12/2016
DECLARE secaoGrupo varchar(4) = '0851';
SELECT FIRST 1 substring(c.CODIGO_BARRA from 1 for 4) || lpad( cast( substring(c.CODIGO_BARRA from 5 for 7) + 1 as integer) ) from COD_BARRAS as c
WHERE substring(c.CODIGO_BARRA from 1 for 4) = :secaoGrupo
AND NOT EXISTS(
SELECT CODIGO_BARRA FROM COD_BARRAS
WHERE CODIGO_BARRA = substring(c.CODIGO_BARRA from 1 for 4) || lpad( cast( substring(c.CODIGO_BARRA from 5 for 7) + 1 as integer) )
AND substring(c.CODIGO_BARRA from 1 for 4) = :secaoGrupo
)
Kleber Araujo
Gostei + 2
Mais Posts
01/12/2016
Kleber Araujo
Eu fiz um sql pra vc, usando o SQL Server, pois não tenho como testar no firebird aqui na empresa, quando estiver em casa eu post no firebird, mas acredito que não mude muita coisa não, e acho que também vc vai sacar a query fácil, após o código da query estou comentando a lógica:
--aqui foi só exemplo, mas o seu valor virá da aplicação eu imagino
DECLARE @secaoGrupo AS varchar(4) = '0851'
SELECT TOP 1 SUBSTRING(c.CODIGO_BARRA,1,4) + FORMAT( CONVERT(int, SUBSTRING(c.CODIGO_BARRA, 5,7)) + 1, 'd3') as novoCodigo FROM COD_BARRAS c
WHERE SUBSTRING(c.CODIGO_BARRA,1,4) = @secaoGrupo
AND NOT EXISTS
(
SELECT CODIGO_BARRA FROM COD_BARRAS
WHERE CODIGO_BARRA = SUBSTRING(c.CODIGO_BARRA,1,4) + FORMAT( CONVERT(int, SUBSTRING(c.CODIGO_BARRA, 5,7)) + 1, 'd3')
AND SUBSTRING(c.CODIGO_BARRA,1,4) = @secaoGrupo
)
na primeira linha eu concateno as 4 primeiras posições do código + as 3 últimas posicoes transformadas em inteiro somando + 1, que já ira devolver o próximo código vago disponível,
no where só estou dizendo para selecionar somente os que começem com a mesma seção e grupo passado via aplicação ou procedure etc..., e o AND NOT EXISTS eu falo para retornar linhas do select onde não exista uma consulta onde o código seja igual ao código novo já somado com um 1 que seria o próximo,
o TOP 1 só diz para ele devolver uma linha, pois o legal dessa query que fiz é que se vc tiver 10 "buracos" nos registros tipo do 4 ao 10 está vago então essa query vai trazer todos os vagos já, basta alterar o TOP 1 para TOP a quantidade de próximos códigos disponíveis que vc quiser, amigo, depois faço no FIREBIRD, mas acho que vc vai converter tranquilo para o FireBird, abraços
Gostei + 0
02/12/2016
Paulo Agnezze
Muito obrigado pelo retorno
fico feliz contar com uma ajuda dessa
Valeu
vou testar
Gostei + 0
02/12/2016
Paulo Agnezze
perfeita esta logica , acredito que muita gente passa pelo mesmo problema que eu
e que problema
Gostei + 0
02/12/2016
Kleber Araujo
Gostei + 0
02/12/2016
Paulo Agnezze
entendi a logica mais nao roda no firebird
Gostei + 0
02/12/2016
Kleber Araujo
Gostei + 0
02/12/2016
Paulo Agnezze
Gostei + 0
02/12/2016
Kleber Araujo
Gostei + 1
05/12/2016
Paulo Agnezze
Esta dando este erro no firebird
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.
Strings cannot be added or subtracted in dialect 3.
-- LOCALIZAR O PROXIMO CODIGO VAGO
--DECLARE secaoGrupo varchar(4) = '0851';
SELECT FIRST 1 substring(c.CODIGO_BARRA from 1 for 4) || lpad(cast(substring(c.CODIGO_BARRA from 5 for 7) + 1 as integer))
from COD_BARRAS as c
--WHERE substring(c.CODIGO_BARRA from 1 for 4) = :secaoGrupo
WHERE substring(c.CODIGO_BARRA from 1 for 4) = '0851'
AND NOT EXISTS (SELECT cb.CODIGO_BARRA FROM COD_BARRAS cb
WHERE cb.CODIGO_BARRA = substring(cb.CODIGO_BARRA from 1 for 4) || lpad( cast( substring(cb.CODIGO_BARRA from 5 for 7) + 1 as integer) )
--AND substring(c.CODIGO_BARRA from 1 for 4) = :secaoGrupo
AND substring(cb.CODIGO_BARRA from 1 for 4) = '0851')
Gostei + 0
05/12/2016
Kleber Araujo
Gostei + 0
05/12/2016
Paulo Agnezze
já de cara
Gostei + 0
08/12/2016
Paulo Agnezze
Já fiz varias alterações ,mais sem sucesso
em relação a esta erro
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.
Strings cannot be added or subtracted in dialect 3.
Gostei + 0
13/12/2016
Kleber Araujo
Gostei + 1
13/12/2016
Paulo Agnezze
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)