PROCURAR CÓDIGO DISPONÍVEL

 Tópico anterior Próximo tópico Novo tópico

PROCURAR CÓDIGO DISPONÍVEL

C#

 Compartilhe  Compartilhe  Compartilhe
#484091 - 23/08/2018 08:07:46

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Boa dia pessoal!
Imaginem a seguinte situação: uma tabela está assim:

Id (int) - Codigo (int) - Descricao (varchar)
1         -      01           - Descrição 1
2         -      03           - Descrição 2
3         -      04           - Descrição 3
4         -      05           - Descrição 4

Reparem que entre o Id 1 e 2 está faltando o código "02". Estou tentando uma maneira de descobrir se existe um "código disponível" entre os registros da tabela, mas não estou conseguindo organizar a ideia pra fazer essa query. Alguém poderia me ajudar nessa?
Abraços a todos.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#484096 - 23/08/2018 08:58:36

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Rapaz, cria um Stored Procedure ou uma fuction.

Stored Procedure /;

  BEGIN
DECLARE sloop INT;
DECLARE v1 INT DEFAULT 0;
DECLARE codigoinicial INT;
DECLARE scodigo INT;
SET codigoinicial = (select min(a.codigo) from aaaaaatesteexcluir a);
  SET SLOOP = (SELECT COUNT(a.id) FROM aaaaaatesteexcluir a);
sloop:WHILE v1 < sloop DO
   set scodigo = (select a.codigo from aaaaaatesteexcluir a where a.id  = v1 limit 1);
   if codigoinicial != scodigo then
        select codigoinicial +1;
        leave sloop;
    end if;
    SET v1 = v1 + 1;
  END WHILE sloop;
END


Function :

  BEGIN
DECLARE sloop INT;
DECLARE v1 INT DEFAULT 0;
DECLARE codigoinicial INT;
DECLARE scodigo INT;
SET codigoinicial = (select min(a.codigo) from aaaaaatesteexcluir a);
  SET SLOOP = (SELECT COUNT(a.id) FROM aaaaaatesteexcluir a);
sloop:WHILE v1 < sloop DO
   set scodigo = (select a.codigo from aaaaaatesteexcluir a where a.id  = v1 limit 1);
   if codigoinicial != scodigo then
        return codigoinicial +1;
        leave sloop;
    end if;
    SET v1 = v1 + 1;
  END WHILE sloop;
END



Grupo DotNet.Br no FaceBook



#484097 - 23/08/2018 08:59:45

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Observe que em amgas as funções retorna apenas o primeiro codigo disponivel.


Grupo DotNet.Br no FaceBook



#484098 - 23/08/2018 09:16:57

FFCOUTO
COM LEVY GASPARIAN
Cadast. em:Março/2005


Tente este código:
SELECT MIN(codigo) + 1 FROM SuaTabela AS t1 LEFT JOIN SuaTabela AS t2 on t1.codigo + 1 = t2.codigo;


Cursos de Excel e VB6:
www.cursoexcelvba.com.br


#484105 - 23/08/2018 10:38:48

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Essa consulta me retorna os números faltantes, porém gostaria de "transformar" em LinQ.

SELECT
  g1.CodigoGrupo - 1 AS livre
FROM
  grupo AS g1
  LEFT JOIN grupo AS g2 ON g1.CodigoGrupo - 1 = g2.CodigoGrupo
WHERE
  g2.CodigoGrupo IS NULL AND g1.CodigoGrupo > 1;


FoxMan, sua sugestão para mim não funciona pois eu uso Entity Framework com banco de dados Sql CE e ele não tem suporte a Stored Procedures (pelo menos eu pesquisei e me disseram isso).
É exatamente isso que eu precisava, porém tem que ser sem o uso de Stored Procedures.


____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#484106 - 23/08/2018 10:40:13

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


À propósito, no LinQPad eu consigo "transformar" essa query de SQL para LINQ?

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#484107 - 23/08/2018 11:56:24

SONILDO
CAMPO GRANDE
Cadast. em:Agosto/2009


Estava com um problema bem parecido
e o que me ajudou foi uma SQL que me retorna todos os produtos com lacunas de sequencia.

segue :
Public Overloads Function getCodigoDisponivel() As String
        Dim codigoDisponivel As String = 1
        db = New AcessoDB
        cmd = New OleDbCommand()

        Try
            cmd.CommandText = "SELECT e.codigo-'1' AS Lacuna FROM estoque e WHERE e.codigo<>'1' AND NOT EXISTS (SELECT b.codigo FROM estoque b WHERE b.codigo=e.codigo-'1')"
            cmd.Connection = db.Conectar("Estoque.mdb")
            dr = cmd.ExecuteReader()

            If dr.HasRows Then
                While dr.Read
                    codigoDisponivel = dr("lacuna").ToString
                End While
                Return codigoDisponivel
            Else
                Return codigoDisponivel
            End If
        Catch ex As Exception
            'Throw ex
            Return codigoDisponivel
        Finally
            db.Desconectar()
            db = Nothing
            dr.Close()
            cmd = Nothing
            dr = Nothing
        End Try



#484110 - 23/08/2018 22:42:45

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Se é um valor apenas, é fácil saber qual está faltando, pura matemática: Some todos os que tem e some todos os que deveria ser. Por exemplo, sua tabela tem 1, 2, 4 e 5. Some 1+2+4+5, você  terá 12, mas a soma de 1+2+3+4+5 é 15, então 15 - 12, te revela o número que falta. Agora se for mais complexo que isso(faltando e/ou sobrando vários valores), você entra em um problema várias ordens de magnitude maior, conhecido como "gaps and islands". É solúvel mas não muito simples, veja aqui

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#484111 - 24/08/2018 08:16:33

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Pessoal, obrigado pelas respostas, mas pensei em uma solução bem simples para o meu caso:
Primeiro crio um contador, depois faço uma lista dos registros da tabela, aí com um foreache percorro a lista e comparo o código do grupo com o contador.
Se for diferente, é porque está faltando aquele código, aí ele sai do loop e me informa o número do código.

int contador = 1;
var lista = db.Grupo.OrderBy(x => x.CodigoGrupo).ToList();
foreach (var item in lista)
{
    if (item.CodigoGrupo != contador)
    {
        MessageBox.Show("Código faltante: " + contador.ToString().PadLeft(2, '0'));
        break;
    }
    contador++;
}


____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#484126 - 24/08/2018 23:24:06

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
Pessoal, obrigado pelas respostas, mas pensei em uma solução bem simples para o meu caso:

Legal....

Aqui no meu sisema ficaria assim :

MessageBox(SQL.RetornaCodigoLivre());


E em SQL.RetoraCodigoLivre(), seria algo como :

return MySqlToString("Call spRetornaCodigoLivre()");


Veja o codigo que uso para retornar (uma lista de produtos, ou apenas a quantidade) produtos vendidos no botão btnBuscaQtdeItens.

private void btnBuscaQtdeItens_Click(object sender, EventArgs e)
{
     Acoes.Mensagem = Controle.Acao.RetornaPrdutosVendidos().Count + " Produto(s) Encontrado(s)";
}








Grupo DotNet.Br no FaceBook



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PERCIFILHO em 27/08/2018 11:34:07