SQL-VALORES DUPLICADOS
Olá,
Tenho uma tabela com 2 campos, o campo1 tem numeros de 1 a 3 e o campo 2 tem valor igual para cada conjunto de 1 a 3. Eu pretendia adicionar um 3º campo de nome "contador" de modo que a tabela fique com o aspecto seguinte:
Campo1 Campo2 Contador
1 15 1
2 15 1
3 15 1
1 45 2
2 45 2
3 45 2...etc
Os numeros do campo2 são aleatórios, portanto não os posso prever. Neste caso são o 15 e o 45...mas também podia ser 3, 45, 78. No entanto aparecem sempre por ordem crescente.
A conexão a esta BD é feita por ADO e eu precisava de uma query (SQL) que coloque os valores no campo "Contador" da forma que descrevi.
Complicado, né!!??
Um obrigado adiantado pela vossa ajuda!
Tenho uma tabela com 2 campos, o campo1 tem numeros de 1 a 3 e o campo 2 tem valor igual para cada conjunto de 1 a 3. Eu pretendia adicionar um 3º campo de nome "contador" de modo que a tabela fique com o aspecto seguinte:
Campo1 Campo2 Contador
1 15 1
2 15 1
3 15 1
1 45 2
2 45 2
3 45 2...etc
Os numeros do campo2 são aleatórios, portanto não os posso prever. Neste caso são o 15 e o 45...mas também podia ser 3, 45, 78. No entanto aparecem sempre por ordem crescente.
A conexão a esta BD é feita por ADO e eu precisava de uma query (SQL) que coloque os valores no campo "Contador" da forma que descrevi.
Complicado, né!!??
Um obrigado adiantado pela vossa ajuda!
Por favor ajudem-me![S43][S43][S43]
Tou bloqueado neste problema.
Só precisava de uma instrução SQL ou código que me coloca-se numeros por ordem crescente no campo "Contador" baseado nos valores do campo2.
Ou seja (mais 1 exemplo):
Campo 2 Contador
10 1 onde tiver nº duplicado coloca 1
10 1
37 2 onde tiver nº duplicado pela 2Âê vez, coloca 2
37 2
37 2
56 3 e por aà fora....
69 4
69 4
70 5
Podem-me ajudar?
Tou a desesperar......[S51]
Tou bloqueado neste problema.
Só precisava de uma instrução SQL ou código que me coloca-se numeros por ordem crescente no campo "Contador" baseado nos valores do campo2.
Ou seja (mais 1 exemplo):
Campo 2 Contador
10 1 onde tiver nº duplicado coloca 1
10 1
37 2 onde tiver nº duplicado pela 2Âê vez, coloca 2
37 2
37 2
56 3 e por aà fora....
69 4
69 4
70 5
Podem-me ajudar?
Tou a desesperar......[S51]
tabela.open "select * from tabela order by contador",base,adopenkeyset
Miguel..a gente a té poderia tentar fazer uma instrução só sql que fizesse isso..mas eu acho qeu, se desse certo pra começar, ficaria bem complicada.
Como vc vai fazer uma vez só...que acha de fazer uma proc com um cursor..e ir andando linha a linha.....Faz um cursor que anda neste select principal. crie uma variavel pro contador e uma pra verificar o campo 2. Inicialize a variavel que verifica o campo 2 com 0.Se por acaso o campo 2 mudar, vc soma 1 no contador..caso contrario..vc continuar com o valor do contador e dá um update na tabela pra esta linha com o contador.
Se tiver problema em fazer esta proc..me avise que a gente faz juntos.
Como vc vai fazer uma vez só...que acha de fazer uma proc com um cursor..e ir andando linha a linha.....Faz um cursor que anda neste select principal. crie uma variavel pro contador e uma pra verificar o campo 2. Inicialize a variavel que verifica o campo 2 com 0.Se por acaso o campo 2 mudar, vc soma 1 no contador..caso contrario..vc continuar com o valor do contador e dá um update na tabela pra esta linha com o contador.
Se tiver problema em fazer esta proc..me avise que a gente faz juntos.
Seguindo as pistas do amigo Laerte, consegui fazer o seguinte:
Obviamente este código não faz o que pretendo, pois tá colocando o nº 1 em todo os campos do contador.
A minha dúvida agora, é onde e como colocar o código que incremente 1 à  variavel X e mantenha esse valor até o campo2 mudar.
Isto tá me a dar uma dor de cabeça...! [S52]
Dim X as integer
Ligar.Open "DRIVER={Microsoft Access Driver (*.mdb)};dbq=" & App.Path & "\BD.mdb"
rS.Open "Tabela", Ligar, adOpenDynamic, adLockOptimistic
rS.Close
For n = 1 To 500
rS.Open "Update Dados SET Contador=" & X & " where Campo2=" & n & ""
Next nObviamente este código não faz o que pretendo, pois tá colocando o nº 1 em todo os campos do contador.
A minha dúvida agora, é onde e como colocar o código que incremente 1 à  variavel X e mantenha esse valor até o campo2 mudar.
Isto tá me a dar uma dor de cabeça...! [S52]
Algumas obs no código postado.
Não é necessário esse código.Ele abre tabela inteira e depois fecha. Não faz nada aqui. Além que o tipo do cursor adOpenDynamic não é suportado pelo ACCESS. Não da erro mas como não é suportado ele vai para o tipo default, se não me engano é o Static.
Bastaria esse código.Sendo que não uso Update, e Delete do SQL por não retornar erro caso não tenha o registro. De uma olhada no artigo 5 de programação de banco de dados.
Experimenta o código.
rS.Open "Tabela", Ligar, adOpenDynamic, adLockOptimistic
rS.Close Não é necessário esse código.Ele abre tabela inteira e depois fecha. Não faz nada aqui. Além que o tipo do cursor adOpenDynamic não é suportado pelo ACCESS. Não da erro mas como não é suportado ele vai para o tipo default, se não me engano é o Static.
For n = 1 To 500
rS.Open "Update Dados SET Contador=" & X & " where Campo2=" & n & ""
Next nBastaria esse código.Sendo que não uso Update, e Delete do SQL por não retornar erro caso não tenha o registro. De uma olhada no artigo 5 de programação de banco de dados.
Experimenta o código.
With Rs
.CursorLocation = adUseServer
.Open "select Contador from tabela order by campo2", Ligar, adOpenStatic, adLockOptimistic
end With
If Not (Rs.EOF) Then
Rs.MoveFirst
Temp=Rs(0)
Contador=1
Do While Not (Rs.EOF)
if Temp=Rs(0) then
Rs!Contador=Contador
else
Temp=Rs(0)
Contador=Contador+1
Rs!Contador=Contador
end if
Rs.MoveNext
Loop
End If
Excelente Renato Mattos,
Funcionou na perfeição.
Muito obrigado a todos.
Funcionou na perfeição.
Muito obrigado a todos.
Tópico encerrado , respostas não são mais permitidas