retornar proximo codigo vago
Bom dia
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
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
Curtidas 0
Melhor post
Kleber Araujo
02/12/2016
Olá, fiz uma conversão da query mas não tenho como testar aqui agora, pode ser que de algum errinho, mas se der vai ser coisa mínima, dá uma testada ai:
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
)
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
)
GOSTEI 2
Mais Respostas
Kleber Araujo
01/12/2016
Fala Paulo, td blz
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
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
Paulo Agnezze
01/12/2016
Bom dia
Muito obrigado pelo retorno
fico feliz contar com uma ajuda dessa
Valeu
vou testar
Muito obrigado pelo retorno
fico feliz contar com uma ajuda dessa
Valeu
vou testar
GOSTEI 0
Paulo Agnezze
01/12/2016
Falar com quem sabe é outra coisa
perfeita esta logica , acredito que muita gente passa pelo mesmo problema que eu
e que problema
perfeita esta logica , acredito que muita gente passa pelo mesmo problema que eu
e que problema
GOSTEI 0
Kleber Araujo
01/12/2016
Opa que isso agradeço o Feedback, e fico feliz em ter ajudado, é sim nós de Ti, passamos por muitos problemas como esse, e as vezes é bom ter alguém para nos ajudar, eu mesmo já fui ajudado muitas vezes e agora quero contribuir com a comunidade ajudando no que posso, ia pedir pra deixar um joinha lá na resposta pra me ajudar, valeuuu
GOSTEI 0
Paulo Agnezze
01/12/2016
Vou esperar vc me passar os comandos pelo firebird
entendi a logica mais nao roda no firebird
entendi a logica mais nao roda no firebird
GOSTEI 0
Kleber Araujo
01/12/2016
hum blza, vou converter para o firebird e logo mais te mando
GOSTEI 0
Paulo Agnezze
01/12/2016
valeu mais uma vez muito obrigado
GOSTEI 0
Kleber Araujo
01/12/2016
Opa, se der certo não esqueça de deixa os joinhas lá nas minhas respostas, pra me dar uma força, valeuuu, qualquer coisa só mandar ai blz
GOSTEI 1
Paulo Agnezze
01/12/2016
Bom dia
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')
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
Kleber Araujo
01/12/2016
Opa Boa tarde blz, começou a dar esse erro ou já de cara que foi executar essa query deu erro?, eu vou poder ver em casa, vou instalar o firebird e fazer uns testes dai consigo corrigir amigo, logo te retorno
GOSTEI 0
Paulo Agnezze
01/12/2016
boa tarde
já de cara
já de cara
GOSTEI 0
Paulo Agnezze
01/12/2016
Boa tarde
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.
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
Kleber Araujo
01/12/2016
Olá td bem, desculpe a ausência, eu estava meio enrolado estes ultimos dias, a partir de hj a noite vou retomar minhas atividade no Dev Media pra ajudar a galera, provavelmente amanhã já terei uma resolução para seu problema
GOSTEI 1
Paulo Agnezze
01/12/2016
Valeu obrigado
GOSTEI 0