Inserir um objeto de gráfico de barras em um formulário do Microsoft Access exibe os dados com uma ordem de classificação que não predefini quando projetei a consulta subjacente pela primeira vez.
Posso ver que a ordem de classificação indesejada aparece em uma propriedade fixa e não editável Transformed Row Source
que substitui a Row Source
propriedade.
`Row Source`: SELECT * FROM SumOfUtilizationByPersonnelAndDate WHERE [Month] >= 7 AND [Month] <= 7 AND [Year] >= 2019 AND [Year] <= 2019 ORDER BY [SumOfUtilization] DESC , [Created By] DESC;
`Transformed Row Source`: SELECT [Created By], Sum([SumOfUtilization]) AS [SumOfSumOfUtilization] FROM (SELECT * FROM SumOfUtilizationByPersonnelAndDate WHERE [Month] >= 7 AND [Month] <= 7 AND [Year] >= 2019 AND [Year] <= 2019 ORDER BY [SumOfUtilization] DESC , [Created By] DESC) GROUP BY [Created By] ORDER BY [Created By]
Assim que eu seleciono minha consulta preparada e devidamente classificada na Row Source
propriedade, isso imediatamente faz com que a Transformed Row Source
propriedade seja escrita - e a cláusula ORDER BY nela parece ter uma mente própria, escolhendo colunas e ordenando a sequência que eu não fiz não quero.
Além disso, a Transformed Row Source
propriedade é totalmente ineditável! A tentativa de editar manualmente o Transformed Row Source
SQL da propriedade da maneira que desejo causa a mensagem de erro,
" Você não pode atribuir um valor a este objeto.
O objeto pode ser um controle em um formulário somente leitura.
O objeto pode estar em um formulário aberto no modo Design.
O valor pode ser muito grande para este campo."
O que posso fazer para que este gráfico de barras classifique os dados como desejo? A consulta exibe os dados na ordem correta no modo Exibir. Por que o gráfico de barras não pode fazer o mesmo?
Eu tentei o tipo de gráfico Bar Clustered, Bar Stacked e Bar Stacked 100% e todos acabam com o mesmo problema. Observe que eu preciso disso para permanecer um gráfico de barras.
ATUALIZAÇÃO : Nenhum comentário feito abaixo até 17 de setembro de 2019 ajudou, além de me atualizar com o entendimento de que o Microsoft Access introduziu recentemente gráficos modernos que diferem dos gráficos clássicos. O que estou usando é um gráfico moderno. Os comentários até 17 de setembro apenas me fizeram tentar recriar isso como um gráfico clássico sem melhores resultados, mas sim com mais desvantagens.
ATUALIZAÇÃO 2 (21/09/2019): Agora tentei remover minha cláusula ORDER BY em minha consulta Row Source, mas a classificação ainda é definida incorretamente. No entanto, aprendi por meio desse exercício que a propriedade Axis (Category) Data Source em Chart Settings é o que define/seleciona essa lista de campos ORDER BY - que combina a ordem de classificação e a seleção de dados de categoria no gráfico - um casamento muito infeliz, de fato porque eu NÃO quero isso! Quaisquer que sejam os campos que eu verifique para a categoria de eixo, eles aparecerão na cláusula ORDER BY da fonte de linha transformada E TAMBÉM serão convertidos como parte do meu eixo de categoria! Não é bom! Quero que o campo Criado por APENAS seja o Eixo (Categoria), e a cláusula de ordem de classificação (ORDER BY) a ser definida como algo completamente separado, que é SumOfUtilization! Este parece ser um bug da Microsoft para o qual não tenho certeza se existe uma solução alternativa! Por enquanto, enviei comentários à Microsoft por meio do menu do Microsoft Access.
Você está classificando/ordenando por "SumOfUtilization" individual , mas apresentando/selecionando "Sum([SumOfUtilization])" .
Por que você simplesmente não adiciona uma cláusula GROUP BY (ao campo [Created By]) em sua consulta original e agrega por "Sum([SumOfUtilization])" para que ORDER BY corresponda ao Axis?
Você pode ORDER BY um valor agregado reafirmando um agregado para esse campo ("ORDER BY Sum([SumOfUtilization])") ou referindo-se a ele por seu ordinal selecionado na cláusula ORDER BY ("ORDER BY 2") .
Ou você pode consultar sua consulta original como uma subconsulta fazendo a mesma agregação GROUP BY mostrada acima.
Se necessário, há várias maneiras de trocar a exibição do Axis depois de organizar os dados corretamente. Especificamente, você pode ajustar as configurações de exibição dos gráficos, trocar o eixo principal/secundário ou manipular a ordem de SELECT da consulta.
DETALHES
Pelo que me lembro, uma cláusula ORDER BY incorporada OVERRIDES toda a classificação em nível de objeto. Uma vez que ORDER BY está fora do SQL, os objetos de apresentação são capazes de aplicar sua própria ordem de classificação.
Para substituir isso, use a consulta original como uma fonte de dados para uma subconsulta que você usa como sua fonte de dados real. Isso é o que o objeto gráfico está fazendo com você aqui.
Referência da API do gráfico: " https://docs.microsoft.com/en-us/office/vba/api/access.chart.transformedrowsource "
Olhando para o seu Row Source SELECT, parece que a ordem em que você está selecionando é o padrão do gráfico como AxisOrder. Você pode selecionar explicitamente seus valores para sequenciar o gráfico manualmente da maneira que desejar.
Como em, SELECT [SumOfUtilization], [Created By] ...
Editar: limpar.
Aliás, como o tempo havia se esgotado sem uma solução satisfatória no Access, o que acabei fazendo foi criar uma planilha do Excel vinculada à minha consulta do Access usando o botão Get Data do Excel, gerar uma tabela dinâmica a partir disso dentro do Excel e criar um gráfico baseado nessa Tabela Dinâmica. Os recursos de gráficos do Excel são muito mais excelentes e capazes do que o que parece atualmente disponível no Access, e consegui que minha ordem de classificação aparecesse exatamente como eu queria. Não é a solução que eu esperava, pois agora estou forçando meu cliente a usar dois produtos Office separados, mas funciona.
PS: Obrigado a todos que tentaram ajudar. Perdi 50 pontos de reputação que teria dado de bom grado a alguém como recompensa se eles pudessem me ajudar, mas o tempo acabou por superuser.com. Nada que eu pudesse fazer para atribuir esses pontos a ninguém agora e também não os recupero.
Encontrei nas propriedades do meu gráfico, quando selecionei meu eixo, havia propriedades que eu poderia alterar (observe as pequenas setas para baixo para aparecer à direita das opções selecionadas. É fácil perder) e, em seguida, quando voltei para aquela coisa de transformação (com o qual passei horas ficando frustrado) pude ver que agora ele havia se atualizado para fazer o que eu queria o tempo todo. Ainda estava se transformando, mas agora fazendo isso de uma forma que imitava o que minha consulta subjacente estava fazendo, então não houve diferença no final.