SELECT PROX NÊMERO LIVRE

ROGERIOAZEVEDO 08/05/2014 22:16:55
#438028
Boa noite!

Tenho uma tabela onde são gravados os clientes, a coluna código do cliente não é auto incrementada, o usuário é quem cria o código do cliente, o que preciso é saber qual o próximo código livre, lembrando que quero aproveitar todos os códigos por exemplo:

Código Nome
1 Zé
2 João
3 Augusto
5 Maria
6 Tião
7 Ana
9 Beatriz
10 Júlia
11 Joana

O select dele mostrar o último código disponível mas não somente select max, ele deve avaliar o disponível seguindo a sequência ou seja o prox seria o 4, depois 8 e depois 12. Será que consegui ser claro rsrs

Abraços

PEDROALSOI 09/05/2014 07:21:39
#438031
Qual é o seu db?
ROGERIOAZEVEDO 09/05/2014 08:36:16
#438033
Oops me desculpe, é MS SQL.
ROGERIOAZEVEDO 14/05/2014 11:46:47
#438183
Alguem pode pode me ajudar???
GUIMORAES 14/05/2014 13:41:40
#438189
Olá Rogério.
Desculpa a pergunta, mais por qual motivo você quer fazer isto?
Só para entender, suponhamos que existe o cliente com o código 2, e você exclui o mesmo do seu banco de dados, você quer utilizar a mesmo numeração depois?
NILSONTRES 14/05/2014 14:00:44
#438191
Citação:

GUIMORAES123


Citação:

você quer utilizar a mesmo numeração depois?


Eu entendi que sim.

O Que pode ser um grande problema, é claro que digo sem conhecer o sistema, mas a principio isso
é inadmissível, por causa de estatísticas principalmente.
HUBER 14/05/2014 15:19:09
#438193
Olá amigo, tente colocar isso no evento gotfocus.

Dim TAUX As Recordset, ProxCod As Long, ValorCampo As Long, i As Long, Filtro As String
Filtro = [Ô]Select [Código do Cliente] from Clientes[Ô]
Set TAUX = vgDb.OpenRecordSet(Filtro, dbOpenDynaset)
If TAUX.RecordCount > 0 Then
TAUX.MoveLast: TAUX.MoveFirst
ProxCod = 0
For i = 1 To TAUX.RecordCount
ValorCampo = CLng(TAUX![Código do Cliente])
If ProxCod < ValorCampo And (ProxCod + 1) <> ValorCampo Then
ProxCod = ProxCod + 1
Exit For
Else
ProxCod = ValorCampo
End If
TAUX.MoveNext
Next i
If ProxCod = ValorCampo Then ProxCod = ProxCod + 1
Else
ProxCod = 1 [ô]se não tem registros na tabela é o primeiro passa 1
End If
txtCodigoCliente.Text = ProxCod
OMAR2011 14/05/2014 15:38:18
#438194
Ele não parou para pensar naquilo que está querendo.
Já pensou se ele tem uma tabela com 10,20 mil registros e o registro de número 8865 for deletado, como o usuário vai ficar
sabendo deste registro vago. Como fazer uma consulta para saber o valor deste registro. Diga se que não é o usuário que escolhe.
Já teve participante do fórum com a mesma ideia.

Huber Fábio, você não leu a mensagem de forma correta na qual ele propos.
GUIMORAES 14/05/2014 17:00:23
#438201
Citação:

NILSONTRES


Eu também entendi isto, mais custei a acreditar.
Não consigo imaginar o tamanho problema que ele irá enfrentar ao fazer isto, basicamente isto não se faz.

Assim como o OMAR2011 disse, imagine fazer o mesmo processo em uma base de dados com 10, 20 mil registros, se torna inviável.
ROGERIOAZEVEDO 15/05/2014 09:28:50
#438217
Olá,

Embora pareça se uma coisa realmente estranha, é isso mesmo que eu quero.

O Software em questão, é um sistema de monitoramento de alarmes, e existe um Software ERP que trabalha em conjunto com o mesmo. Esse ERP que faz exatamente o que eu citei acima, ou seja, caso eu crie um novo cliente através do software ERP, ele automaticamente pega o próximo número disponível. Na tabela de clientes existe um alto incremento, que é o código do cliente, esse outro número tem o nome [Ô]conta[Ô] e é criado manualmente.

Para manter um ordenação crescente nessa coluna o ERP pesquisa essa tabela de clientes e mostra o próximo número disponível, O fato é que pode ser necessário a criação de uma nova conta sem o uso do ERP, quando isso ocorre, para pegar o proximo número na sequencia, eu faço um select simples e jogo no excel hehe. Se o ERP faz, acredito ser possível fazer esse select para colocar em uma aplicação que eu tenho mostrando sempre o ultimo número de conta disponível.

Desculpe se não fui claro o suficiente antes. Abraços.
RO.DRIGOSG 15/05/2014 09:28:55
#438218
Bom dia Rogério,

Segue exemplo de como fazer isso em SQL, vc pode pegar o script abaixo e montar uma função para trazer o número para você.

/*
CREATE TABLE ##TESTE
(
ID INT NOT NULL
)

INSERT INTO ##TESTE VALUES (1)
INSERT INTO ##TESTE VALUES (2)
INSERT INTO ##TESTE VALUES (4)
INSERT INTO ##TESTE VALUES (6)
INSERT INTO ##TESTE VALUES (7)
*/

DECLARE @ID INT
DECLARE @SEQ INT
DECLARE @EXIT BIT

SET @SEQ = 0
SET @EXIT = 0

DECLARE CUR_PROCESSO CURSOR FOR

SELECT ID FROM ##TESTE ORDER BY ID

OPEN CUR_PROCESSO

FETCH NEXT FROM CUR_PROCESSO INTO @ID

WHILE @@FETCH_STATUS = 0 AND @EXIT = 0
BEGIN

SET @SEQ = @SEQ + 1

IF(@ID <> @SEQ)
BEGIN
SET @EXIT = 1
END

FETCH NEXT FROM CUR_PROCESSO INTO @ID

END

CLOSE CUR_PROCESSO;
DEALLOCATE CUR_PROCESSO;

PRINT [ô]O PROXIMO REGISTRO E O NUMERO: [ô] + CONVERT(VARCHAR,@SEQ)



Uma sugestão para o pessoal do fórum:
Não estou querendo causar discussão no fórum, mas acredito que o fórum seja para tirar dúvidas e não para ficarem questionando se os processos dos outros estão certos ou não. Lógico que há processos que não são viáveis ao NOSSO VER, mas não estamos aqui para ficar corrigindo os processos dos outros, além do mais, nem sabemos como funciona o sistema do nosso amigo ai. Acho que no máximo podemos dar umas dicas do que seria viável ou não e assim ELE tomará a decisão de mudar ou não as rotinas do sistema dele. Se não souberem a resposta, não fiquem questionando se o processo está certo ou não.
Esse é o meu ponto de vista.
Abraço à todos.
Página 1 de 4 [32 registro(s)]
Tópico encerrado , respostas não são mais permitidas