[resolvido] Agregação com critérios (MÁX E MÍN)

Moderador: Avelino Sampaio

jonascruz
Mensagens: 7
Registrado em: 16 Mar 2016, 13:49
Localização: Rio de Janeiro

[resolvido] Agregação com critérios (MÁX E MÍN)

Mensagempor jonascruz » 01 Nov 2017, 17:37

pessoal, boa tarde.

Estou tentando fazer esse select no access e estou quebrando a cabeça.

Na tabela, existem STATION duplicados. Eu quero exibir STATION e SECTOR onde o HEIGHT for maior e em caso de empate, o menor FLOOR.
Importante que seja exibido apenas 1 STATION apenas.

Obrigado.
Você deve estar registrado e autenticado para ter acesso ao arquivo anexo.

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.


Avatar do usuário
Damasceno Jr.
Mensagens: 361
Registrado em: 08 Jun 2015, 01:30
Localização: Medicilândia-Pará

Re: AGREGAÇÃO COM CRITÉRIOS (MÁX E MÍN)

Mensagempor Damasceno Jr. » 01 Nov 2017, 21:02

Deixa o VBA trabalhar para você.

Crie uma tabela temporária com os campos STATION, SECTOR, FLOOR e HEIGHT com as mesmas propriedades dos da sua tabela principal.

Substitua as partes destacadas em vermelho com o nome da sua tabela original e o nome dado a sua tabela temporária.

E então chame pela fncFiltra que o VBA colocará na sua tabela temporária os dados conforme você deseja.

Código:
Public Function fncFiltra()
Dim rs1 As Recordset 'memória para a tabela original
Dim rs2 As Recordset 'memória para a tabela temporária
Dim strTemp As String 'variável para o controle do valor STATION

Set rs1 = CurrentDb.OpenRecordset("select STATION, SECTOR, FLOOR, HEIGHT " & _
"from NomeDaTabelaOriginal " & _
"order by STATION, HEIGHT desc, FLOOR;") 'abre a tabela original classificando
'os dados de forma decrescente para o HEIGHT
'e crescente para o FLOOR


CurrentDb.Execute "delete * from temp_TabelaTemporaria;" 'delete todos os registros da tabela temporária
Set rs2 = CurrentDb.OpenRecordset("temp_TabelaTemporaria") 'abro a tabela temporária para inserir registros

While Not rs1.EOF 'enquanto não tiver olhado todos os registros da tabela original
'repita a partir deste ponto


If strTemp <> rs1("STATION") Then 'se o STATION avaliado anteriormente for diferente do
'STATION da vez

rs2.AddNew 'prepara a tabela para entrada de registro
rs2("STATION") = rs1("STATION") '
rs2("SECTOR") = rs1("SECTOR")
rs2("FLOOR") = rs1("FLOOR")
rs2("HEIGHT") = rs1("HEIGHT")
rs2.Update 'salva o registro
strTemp = rs1("STATION") 'e guardo na variável este STATION
End If

rs1.MoveNext 'vou para o próximo registro da tabela original

Wend 'ponto com o fim do loop

rs1.Close: Set rs1 = Nothing 'descarrego a tabela original da memória
rs2.Close: Set rs2 = Nothing 'descarrego a tabela temporária da memória

End Function
Quanto mais o tempo passa, mais descubro e mais me apaixono por MS Access.

jonascruz
Mensagens: 7
Registrado em: 16 Mar 2016, 13:49
Localização: Rio de Janeiro

Re: AGREGAÇÃO COM CRITÉRIOS (MÁX E MÍN)

Mensagempor jonascruz » 06 Nov 2017, 16:09

Damasceno Jr. escreveu:Deixa o VBA trabalhar para você.

Crie uma tabela temporária com os campos STATION, SECTOR, FLOOR e HEIGHT com as mesmas propriedades dos da sua tabela principal.

Substitua as partes destacadas em vermelho com o nome da sua tabela original e o nome dado a sua tabela temporária.

E então chame pela fncFiltra que o VBA colocará na sua tabela temporária os dados conforme você deseja.

Código:
Public Function fncFiltra()
Dim rs1 As Recordset 'memória para a tabela original
Dim rs2 As Recordset 'memória para a tabela temporária
Dim strTemp As String 'variável para o controle do valor STATION

Set rs1 = CurrentDb.OpenRecordset("select STATION, SECTOR, FLOOR, HEIGHT " & _
"from NomeDaTabelaOriginal " & _
"order by STATION, HEIGHT desc, FLOOR;") 'abre a tabela original classificando
'os dados de forma decrescente para o HEIGHT
'e crescente para o FLOOR


CurrentDb.Execute "delete * from temp_TabelaTemporaria;" 'delete todos os registros da tabela temporária
Set rs2 = CurrentDb.OpenRecordset("temp_TabelaTemporaria") 'abro a tabela temporária para inserir registros

While Not rs1.EOF 'enquanto não tiver olhado todos os registros da tabela original
'repita a partir deste ponto


If strTemp <> rs1("STATION") Then 'se o STATION avaliado anteriormente for diferente do
'STATION da vez

rs2.AddNew 'prepara a tabela para entrada de registro
rs2("STATION") = rs1("STATION") '
rs2("SECTOR") = rs1("SECTOR")
rs2("FLOOR") = rs1("FLOOR")
rs2("HEIGHT") = rs1("HEIGHT")
rs2.Update 'salva o registro
strTemp = rs1("STATION") 'e guardo na variável este STATION
End If

rs1.MoveNext 'vou para o próximo registro da tabela original

Wend 'ponto com o fim do loop

rs1.Close: Set rs1 = Nothing 'descarrego a tabela original da memória
rs2.Close: Set rs2 = Nothing 'descarrego a tabela temporária da memória

End Function


Ficou muito bom o código, apesar de não conhecer bem VBA para Access.
Esse select tem 10.000 linhas e será usado para um JOIN com outra tabela com 20.000 linhas. Tomara que não fique pesado.

Vou testar e te aviso o resultado aqui.

Muito obrigado pelo código

jonascruz
Mensagens: 7
Registrado em: 16 Mar 2016, 13:49
Localização: Rio de Janeiro

Re: Agregação com critérios (MÁX E MÍN)

Mensagempor jonascruz » 09 Nov 2017, 13:14

@Damasceno Jr. Boa tarde.

Fiz o que vc orientou, criei a Public Function fncFiltra() no Módulo: mdFiltraCompart como na imagem, mas não entendi como "executar" essa função quando faço a consulta.

Código adaptado.
Não seria possível fazer essa consulta direto no SQL para agrupar por STATION usando os critérios de ordenação?
Algo semelhante a rank, top, limit,...

Código: Selecionar todos

Public Function fncFiltra()
Dim rs1 As Recordset 'memória para a tabela original
Dim rs2 As Recordset 'memória para a tabela temporária
Dim strTemp As String 'variável para o controle do valor STATION

Set rs1 = CurrentDb.OpenRecordset("select STATION, DETENTOR_SOLICITANTE" & _
                                  "from Compartilhamento " & _
                                  "order by STATION, AREA_UTILIZADA_EV, AREA_UTILIZADA_SOLO desc;") 'abre a tabela original classificando
                                                                  'os dados de forma decrescente para o HEIGHT
                                                                  'e crescente para o FLOOR
                                 
CurrentDb.Execute "delete * from temp_Compartilhamento;" 'delete todos os registros da tabela temporária
Set rs2 = CurrentDb.OpenRecordset("temp_Compartilhamento") 'abro a tabela temporária para inserir registros

While Not rs1.EOF 'enquanto não tiver olhado todos os registros da tabela original
                  'repita a partir deste ponto

    If strTemp <> rs1("STATION") Then 'se o STATION avaliado anteriormente for diferente do STATION da vez
        rs2.AddNew 'prepara a tabela para entrada de registro
            rs2("STATION") = rs1("STATION") '
            rs2("DETENTOR_SOLICITANTE") = rs1("DETENTOR_SOLICITANTE")
            rs2("AREA_UTILIZADA_SOLO") = rs1("AREA_UTILIZADA_SOLO")
            rs2("AREA_UTILIZADA_EV") = rs1("AREA_UTILIZADA_EV")
        rs2.Update 'salva o registro
        strTemp = rs1("STATION") 'e guardo na variável este STATION
    End If
   
    rs1.MoveNext 'vou para o próximo registro da tabela original

Wend 'ponto com o fim do loop

rs1.Close: Set rs1 = Nothing 'descarrego a tabela original da memória
rs2.Close: Set rs2 = Nothing 'descarrego a tabela temporária da memória

End Function
Você deve estar registrado e autenticado para ter acesso ao arquivo anexo.

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.


Avatar do usuário
Damasceno Jr.
Mensagens: 361
Registrado em: 08 Jun 2015, 01:30
Localização: Medicilândia-Pará

Re: Agregação com critérios (MÁX E MÍN)

Mensagempor Damasceno Jr. » 09 Nov 2017, 17:39

Crie uma macro que execute a função e abra a consulta.

Se quiser, pode até nomeá-la como AutoExec que assim que você abrir o banco de dados ela será executada automaticamente.
Você deve estar registrado e autenticado para ter acesso ao arquivo anexo.
Quanto mais o tempo passa, mais descubro e mais me apaixono por MS Access.

jonascruz
Mensagens: 7
Registrado em: 16 Mar 2016, 13:49
Localização: Rio de Janeiro

Re: Agregação com critérios (MÁX E MÍN)

Mensagempor jonascruz » 10 Nov 2017, 12:15

Consegui fazer o módulo da macro ser chamada, mas a macro em si está com algum problema.
Tem alguma ideia do que pode ser?

Código: Selecionar todos

Public Function fncFiltra()
Dim rs1 As Recordset 'memória para a tabela original
Dim rs2 As Recordset 'memória para a tabela temporária
Dim strTemp As String 'variável para o controle do valor STATION

Set rs1 = CurrentDb.OpenRecordset("select C.STATION, C.DETENTOR_SOLICITANTE " & _
                                  "from Compartilhamento C " & _
                                  "order by C.STATION, C.AREA_UTILIZADA_EV, C.AREA_UTILIZADA_SOLO desc;") 'abre a tabela original classificando
                                                                  'os dados de forma decrescente para o HEIGHT
                                                                  'e crescente para o FLOOR
                                 
CurrentDb.Execute "delete * from temp_Compartilhamento;" 'delete todos os registros da tabela temporária
Set rs2 = CurrentDb.OpenRecordset("temp_Compartilhamento") 'abro a tabela temporária para inserir registros

While Not rs1.EOF 'enquanto não tiver olhado todos os registros da tabela original
                  'repita a partir deste ponto

    If strTemp <> rs1("STATION") Then 'se o STATION avaliado anteriormente for diferente do STATION da vez
        rs2.AddNew 'prepara a tabela para entrada de registro
            rs2("STATION") = rs1("STATION") '
            rs2("DETENTOR_SOLICITANTE") = rs1("DETENTOR_SOLICITANTE")
            rs2("AREA_UTILIZADA_SOLO") = rs1("AREA_UTILIZADA_SOLO")
            rs2("AREA_UTILIZADA_EV") = rs1("AREA_UTILIZADA_EV")
        rs2.Update 'salva o registro
        strTemp = rs1("STATION") 'e guardo na variável este STATION
    End If
   
    rs1.MoveNext 'vou para o próximo registro da tabela original

Wend 'ponto com o fim do loop

rs1.Close: Set rs1 = Nothing 'descarrego a tabela original da memória
rs2.Close: Set rs2 = Nothing 'descarrego a tabela temporária da memória

End Function

Você deve estar registrado e autenticado para ter acesso ao arquivo anexo.

Avatar do usuário
Damasceno Jr.
Mensagens: 361
Registrado em: 08 Jun 2015, 01:30
Localização: Medicilândia-Pará

Re: Agregação com critérios (MÁX E MÍN)

Mensagempor Damasceno Jr. » 10 Nov 2017, 14:01

Adicione o que se destaca em vermelho:

Código:
...
Set rs1 = CurrentDb.OpenRecordset("select C.STATION, C.DETENTOR_SOLICITANTE, AREA_UTILIZADA_SOLO, AREA_UTILIZADA_EV " & _
"from Compartilhamento C " & _
"order by C.STATION, C.AREA_UTILIZADA_EV, C.AREA_UTILIZADA_SOLO desc;")
...


Obs.: Não esqueça de após "AREA_UTILIZADA_EV" há um espaço (" ")
Quanto mais o tempo passa, mais descubro e mais me apaixono por MS Access.

jonascruz
Mensagens: 7
Registrado em: 16 Mar 2016, 13:49
Localização: Rio de Janeiro

Re: Agregação com critérios (MÁX E MÍN)

Mensagempor jonascruz » 16 Nov 2017, 12:02

@Damasceno Jr.
Muito obrigado pela ajuda e desculpe a demora em responder, mas funcionou perfeitamente.

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.



Voltar para “Consultas”

Quem está online

Usuários neste fórum: Nenhum usuário registrado e 2 visitantes