CONFERENCIA

GUIGOR 18/09/2015 10:30:18
#451541
Bom dia amigos,

O seguinte, tenho uma tabela no meu banco de dados onde guarda algumas informacoes entre elas um campo chamado nsu e carrego isso em um listview entao eu preciso saber se tem algum nsu faltando por ex eu tenho eu tenho uma sequencia de numeros que vai de 5548 ate 6788 entao preciso saber se existe lagum nsu nessa sequencia faltando.


obrigado a todos
KERPLUNK 18/09/2015 20:54:29
#451565
Simples:
Faça a soma dos valores. Se der diferente do que deveria, está faltando algum. Por exemplo, vamos supor que na sua lista tenha os valores de 1 a 10. A soma dos números de 1 a 10 é 55: 1 + 2 + 3 + 4 + 5... = 55. Logo a soma do conjunto contempla todos os valores. Se tirarmos um dos ítens da lista, por exemplo, o [Ô]4[Ô], a soma será de 51 e sabemos que o valor não está correto e que o número que falta é o 4. O mesmo caso para tua soma. Você vai somar os valores, a diferença do que deveria dar a soma de tudo é o valor que falta. Se faltarem mais dois ou mais valores, não será possível saber exatamente qual, mas vamos saber que não está correto.
JABA 18/09/2015 22:28:21
#451566
Resposta escolhida
[ô]Traz todos os numeros em sequencia
rs.Open [Ô]select nsu from tabela order by asc[Ô], db, 3, 3

Dim i as integer

For i = 5548 to 6788
If rs(i-5548).Value = <> i then [ô]começa do indice zero
msgbox([Ô]O numero [Ô] & i & [Ô] está faltando[Ô])
end if
rs.MoveNext
next

KERPLUNK 19/09/2015 01:39:21
#451573
JABA,

Você pegou a idéia, é por aí. Mas...
- O valor inicial do for é determinado pelo valor que estiver no campo analisado, no primeiro registro
- O valor final é o do último registro
- Subtraindo o valor do registro, você vai ter a contagem de 0 ao último, mas se for um só registro faltando, não vai saber qual

Mas de resto é isso aí. Lembro de ter feito uma rotina parecida em uma empresa que trabalhei. A diferença era que eram mais de 20 milhões de registros. Fiz tudo em uma SP, pois era algo que precisava ser feito constantemente e precisava de um bom desempenho.
JABA 19/09/2015 01:52:01
#451575
KERPLUNK,

Eu coloquei os valores fixos para o comando [Ô]FOR[Ô] porque ele disse que a contagem era uma sequencia de numeros definida entre 5548 e 6788. Sendo assim, se os valores não forem fixos, ele poderia fazer como você mesmo disse: pegar o valor inicial e final do banco e passar como contagem no comando For.
SINCLAIR 19/09/2015 10:05:48
#451586
O Jaba está certo...

Uma pequena alterção para não pegar valores fixos, pegando sempre do menor existente para o maior que existe, seria algo como:

(Usando sintaxe PostGreSQL, creio que em Access seria trocar o Limit por Top)

[ô]Pegar o menor valor na tabela
rs.Open [Ô]select nsu as menor from tabela order by nsu asc Limit 1[Ô], db, 3, 3
Inicio = rs.fields([Ô]menor[Ô]).value

[ô]Pegar o maior valor na tabela
rs.Open [Ô]select nsu as maior from tabela order by nsu desc Limit 1[Ô], db, 3, 3
Final = rs.fields([Ô]maior[Ô]).value

[ô]Traz todos os numeros em sequencia
rs.Open [Ô]select nsu from tabela order by nsu asc[Ô], db, 3, 3

Dim i as integer

For i = Inicio to Final
If rs(i-Inicio).Value = <> i then [ô]começa do indice zero
msgbox([Ô]O numero [Ô] & i & [Ô] está faltando[Ô])
end if
rs.MoveNext
next


Com alguma mudança de sintaxe, a lógica seria esta

(Adaptado do código do Jaba)

Tudo de bom.
GUIGOR 20/09/2015 20:08:42
#451607
primeiramente muito obrigado, viz aqui um ex no acess para postar mais nao deu certo essa contagem.
JABA 20/09/2015 21:43:24
#451608
Dei umas modificadas aqui, vê se vai agora

DS2T 22/09/2015 07:58:06
#451668
Mais simples fazer que nem o Kerplunk falou ... só que usando o conceito de PA.

A soma de uma Progressão Aritmetica tem uma fórmula. Se não me engano é : Sn = (a1+an)*r/2

Basta você fazer uma consulta trazendo o SUM do campo e comparar com essa fórmula.
Nem precisa ficar usando loop...

Abraços!
SINCLAIR 22/09/2015 10:02:51
#451675
Olá colega, DS2T

O problema é que assim o GUIGOR saberia apenas se existe [Ô]buraco[Ô], mas não qual o número faltante.

Creio que a rotina em loop é mais adequada.

Só vale considerar se o loop é melhor em uma Stored Procedure ou se no código-fonte do aplicativo. De qualquer forma a lógica seria a mesma.

Tudo de bom.
IRENKO 22/09/2015 11:23:18
#451687
Ou tente isso ai:

Private Sub BuscaID()
Dim cont As Integer
Dim QtdContratos As Long
cont = 1

Set RdsGeral = ConexaoLCF.Execute([Ô]SELECT Val([Id]) AS VALORES FROM Dados ORDER BY Val([Id])[Ô])
QtdContratos = RdsGeral.RecordCount

Set RdsGeral = ConexaoLCF.Execute([Ô]SELECT max(Val([Id])) AS MaiorValor FROM Dados[Ô])

If QtdContratos = RdsGeral.Fields([Ô]MaiorValor[Ô]) Then
cont = RdsGeral.Fields([Ô]MaiorValor[Ô]) + 1
Else
Set RdsGeral = ConexaoLCF.Execute([Ô]SELECT Val([Id]) AS VALORES FROM Dados ORDER BY Val([Id])[Ô])
If RdsGeral.RecordCount > 0 Then
Do While Not RdsGeral.EOF
If RdsGeral.Fields([Ô]VALORES[Ô]) <> cont Then
Exit Do
End If
RdsGeral.MoveNext
cont = cont + 1
Loop
End If
N_ID = cont
End If
End Sub

Tenho um exemplo que precisei para pegar os numeros faltantes, depois passo pois não tenho agora.
Tópico encerrado , respostas não são mais permitidas