ORDENAR RELATÓRIO CRYSTAL 8.5

ALANTB 06/04/2015 16:34:25
#445749
Olá pessoal, anteriormente já havia perguntado à respeito mas não obtive ajuda necessária para solucionar a dúvida. Mas o problema é esse: tenho um relatório do vb6/access2007/crystal 8.5 que emite um relatório com uma lista de classificação de avaliação para seleção de promoções (10 primeiros são promovidos): Matricula, Nome, Idade, Classe(ex: A,B,C,..), Data da Classe, Número de Pontos. A classificação se dá pelo número maior de pontos; havendo empate o 1º critério de desempate é o maior tempo na classe; persistindo alguns empates, o segundo critério é a idade. Dúvida: por pontos até consegui ordenar, mas como aplicar os critérios de desempate na mesma seleção???

Alan
TUNUSAT 07/04/2015 07:52:37
#445763
ALANTB,

Se você está usando uma query para fazer a pesquisa, use dentro ORDER BY mais de um capo separado por vírgula.
Se você está usando a ordenação dentro do Crystal Reports, você pode adicionar os campos desta forma (SortFields - exemplo Macoratti):

============================================================

http://www.macoratti.net/crystal.htm

---------------------------------------------------------------------------------------------------------

Private Sub imprime_Click()
CrystalReport1.Destination = 0
CrystalReport1.ReportFileName = [Ô]c:\Controle\agenda.rpt[Ô]
CrystalReport1.SortFields(0) = [Ô]+{Agenda.Sobrenome}[Ô]
CrystalReport1.Action = 1
End Sub

============================================================

[][ô]s,
Tunusat.
ALANTB 07/04/2015 09:31:55
#445766
Tunusat, é esse tipo de código que uso na impressão do meu relatório.Mas só os campos Classificação e Pontos estão ordenando corretamente pois a classificação é feita diretamente no campo.
Se eu fosse usar uma query para selecionar, ordenar e executar os desempates, como seria ? no crystal ou no form?em qual sessão?
Aguardo novas ideias....SEGUE O DESIGN DO MEU RELATÓRIO E A FUNÇÃO DO FORM:

Matricula Nome Idade Classe dataClasse Pontos Classificação
------------------------------------------------------------------------------------------------------------------------------------
75000 Claudia Garcia Leites 42 Classe B 08/14/2006 4190 1
32751 Alan Tavares Bonilha 43 Classe B 10/02/2012 4130 2
75035 Andrieli Brandeburski Pires 49 Classe B 08/11/2006 4130 3 [ô] deveria estar em 2° pois está a mais tempo na classe(08/11/2006)
49387 Vanoli da R. Flores 54 Classe C 10/10/2013 1366 4

* conforme citei anteriormente, tendo mesmo nº de pontos, desempata que esta a mais tempo na classe, persistindo empates o 2º critério é a idade.

Sub ImprimeClasse()
CrystalReport1.Reset
CrystalReport1.DataFiles(0) = App.Path & [Ô]\promove.mdb[Ô]
CrystalReport1.ReportFileName = App.Path & [Ô]ptClassificacao.rpt[Ô]
CrystalReport1.SelectionFormula = [Ô]{ConsultaClassificacao.codClasse} =[Ô] & txtCodClasse.Text
CrystalReport1.DiscardSavedData = False
CrystalReport1.WindowState = crptMaximized
CrystalReport1.WindowShowZoomCtl = True
CrystalReport1.DiscardSavedData = False
CrystalReport1.WindowShowNavigationCtls = True
CrystalReport1.WindowShowCloseBtn = True
CrystalReport1.WindowShowPrintSetupBtn = True
CrystalReport1.WindowShowPrintBtn = True
CrystalReport1.Action = 1
End Sub

TUNUSAT 07/04/2015 09:44:08
#445768
ALANTB,

Citação:

Se eu fosse usar uma query para selecionar, ordenar e executar os desempates, como seria ? no crystal ou no form?em qual sessão?


- Existem 3 formas:
1 - Você pode montar no Form dentro do VB e passar a query para o Crystal;
2 - Você pode montar dentro do Crystal;
3 - Você pode montar do banco de dados Access uma query de consulta;

Eu vou dar uma exemplo rápido, mas se você não conseguir posso tentar fazer mais sofisticado.

SELECT Matricula, Nome, Idade, Classe, dataClasse, Pontos, Classificação
FROM NomeDaSuaTabela
ORDER BY Pontos, dataClasse, Idade


[][ô]s,
Tunusat.
ALANTB 07/04/2015 10:44:28
#445770
Tunusat, só uma pergunta antes de mexer no meu código: no Order By acima se a classificação se der somente no número de pontos, sem empates, ainda assim ela passa ordenar pela dataClasse e idade? Pois se os números de pontos forem distintos , não será necessário ordenar pela dataClasse. E no caso de houver mesmo nº de pontos e mesmo tempo de classe, ai sim será preciso a classificação por idade. Sendo assim, dos três campos se o primeiro já tiver sido suficiente para classificação, o 2º e o 3º campo não são necessários. E se necessário o 1º em conjunto com o 2º, também não é necessário o 3°. Entendido? Pois se aplicar os 3 sempre não será classificado corretamente.

ORDER BY Pontos(1º), dataClasse(2º), Idade(3º)

Abaixo segue as 3 situações em que o meu relatório deve executar a seleção e aplicar desempates se necessário:

1°situação:
Nesse exemplo somente pelo campo CLASSIFICAÇÃO foi feita a lista pois os nº de pontos são diferentes, sem empates.Não sendo necessário usar o campo dataClasse e idade para desempate.

Matricula Nome Idade Classe dataClasse Pontos Classificação
------------------------------------------------------------------------------------------------------------------------------------
75000 Claudia Garcia Leites 42 Classe B 08/14/2006 4190 1
32751 Alan Tavares Bonilha 43 Classe B 10/02/2012 4130 2
75035 Andrieli Brandeburski Pires 49 Classe B 08/11/2006 4120 3
49387 Vanoli da R. Flores 54 Classe C 10/10/2013 1366 4

2º situação: Nessa o nº de pontos do 2º e 3º são iguais, o desempate se deu no campo dataClasse, o 2º é mais antigo na classe.Não sendo necessário o uso do campo Idade.

Matricula Nome Idade Classe dataClasse Pontos Classificação
------------------------------------------------------------------------------------------------------------------------------------
75000 Claudia Garcia Leites 42 Classe B 08/14/2006 4190 1
75035 Andrieli Brandeburski Pires 49 Classe B 08/11/2006 4130 2
32751 Alan Tavares Bonilha 43 Classe B 10/02/2012 4130 3
49387 Vanoli da R. Flores 54 Classe C 10/10/2013 1366 4

3º situação: os números de pontos e dataClasse do 2º e 3º lugares são iguais. O que desempatou foi o campo idade, pois o 2º é o mais velho.

Matricula Nome Idade Classe dataClasse Pontos Classificação
------------------------------------------------------------------------------------------------------------------------------------
75000 Claudia Garcia Leites 42 Classe B 08/14/2006 4190 1
75035 Andrieli Brandeburski Pires 49 Classe B 08/11/2012 4130 2
32751 Alan Tavares Bonilha 43 Classe B 08/11/2012 4130 3
49387 Vanoli da R. Flores 54 Classe C 10/10/2013 1366 4

é isso ai....



TUNUSAT 07/04/2015 12:01:20
#445779
ALANTB,

Citação:

Tunusat, só uma pergunta antes de mexer no meu código: no Order By acima se a classificação se der somente no número de pontos, sem empates, ainda assim ela passa ordenar pela dataClasse e idade?



Não, só irá passar para o próximo campo de ordenação no caso de serem iguais o campo analisado.

é isto mesmo que ocorrerá com as situações que você colocou. Por favor, teste na sua base de dados.

[][ô]s,
Tunusat.
ALANTB 07/04/2015 16:28:58
#445784
TUNUSAT, deu pra notar que sou péssimo em crystal reports, pois estou colocando a query no form e não faz efeito nenhum. Mesmo comentando a linha do bd e da query quando clico no botão imprimir, emite o relatório do crystal normalmente. O que não estou entendendo realmente é o seguinte: para fazer o relatório lá no crystal, tem um passo que pede a origem dos dados, no caso o database file; adicionar as tabelas; depois os campos,etc...Só que se eu inserir uma query no form para fazer a seleção dos dados, a conexão do banco feita na montagem do relatório ainda fica ativa. Sendo assim, como montar o relatório no crystal, mas fazer a conexão do bd no form para exibição do relatório? Segue o que eu estava tentando fazer:

Sub ImprimeTudo()
CrystalReport1.Reset
CrystalReport1.DataFiles(0) = App.Path & [Ô]\promove.mdb[Ô]
CrystalReport1.ReportFileName = App.Path & [Ô]ptClassificacao.rpt[Ô]
[ô]CrystalReport1.SelectionFormula = [Ô]{ConsultaTotalCriterio.codMatricula} =[Ô] & txtCodClasse.Text
CrystalReport1.SQLQuery = [Ô]SELECT tbFormulario.codMatricula, tbFunc.Nome, tbFunc.dataNasc, tbClasse.desClasse, tbContrato.dataClasse, tbFormulario.nroPontosTotal [Ô] & _
[Ô]FROM tbFunc INNER JOIN ((tbClasse INNER JOIN tbContrato ON tbClasse.codClasse = tbContrato.codClasse) INNER JOIN tbFormulario ON tbContrato.codMatricula = tbFormulario.codMatricula) ON tbFunc.codFunc = tbContrato.codFunc [Ô] & _
[Ô]ORDER BY tbFormulario.nroPontosTotal, tbContrato.dataClasse, tbFunc.dataNasc;[Ô]

[ô]CrystalReport1.SortFields(0) = [Ô]-{tbContrato.dataClasse}[Ô]
CrystalReport1.DiscardSavedData = False
CrystalReport1.WindowState = crptMaximized
CrystalReport1.WindowShowZoomCtl = True
CrystalReport1.DiscardSavedData = False
CrystalReport1.WindowShowNavigationCtls = True
CrystalReport1.WindowShowCloseBtn = True
CrystalReport1.WindowShowPrintSetupBtn = True
CrystalReport1.WindowShowPrintBtn = True
CrystalReport1.Action = 1
End Sub
TUNUSAT 07/04/2015 18:05:47
#445790
ALANTB,

Citação:

O que não estou entendendo realmente é o seguinte: para fazer o relatório lá no crystal, tem um passo que pede a origem dos dados, no caso o database file; adicionar as tabelas; depois os campos,etc...



Onde você monta a origem dos dados você coloca as cláusulas WHERE e ORDER BY.

Sim, como sua query não tem Cláusula [Ô]WHERE[Ô] então todos os dados virão. Se você quiser separar, por exemplo, por classe, terá que colocar uma cláusula:
WHERE classe = [ô]B[ô]

Pergunta: A Cláusula ORDER BY está funcionando corretamente?

[][ô]s,
Tunusat.
ALANTB 08/04/2015 09:38:12
#445802
TUNUSAT, a claúsula ORDER BY da query não está funcionando,....Quando uso o código abaixo funciona a seleção e emissão do relatório por classe, mas não faz a ordenação conforme os critérios d edesempate. Sendo uma consulta feita no access, teria de ser inserido critérios de exibição, mas como coloca-los no access?
Ou então como fica a query acima com WHERE?Todas tentativas que fiz somente consegui emitir o relatório ordenado por maior número de pontos, mas à partir do primeiro critério de desempate nenhum funciona...Será que há outra maneira, ou até mesmo direto no crystal???

CrystalReport1.SelectionFormula = [Ô]{ConsultaClassificacao.codClasse} =[Ô] & txtCodClasse.Text
FFCOUTO 08/04/2015 13:13:17
#445806
Resposta escolhida
Amigo basta usar a propriedade SortFields do Crystal para fazer o que você precisa. Uma para cada nível de ordenação. Passe a query sem ordenação nenhuma e use conforme abaixo.

CrystalReport1.SortFields(0) = [Ô]-{tbContrato.Pontos}[Ô]
CrystalReport1.SortFields(1) = [Ô]+{tbContrato.Classe}[Ô]
CrystalReport1.SortFields(2) = [Ô]-{tbContrato.dataClasse}[Ô]
CrystalReport1.SortFields(3) = [Ô]-{tbContrato.Idade}[Ô]


Dessa forma, a primeira classificação será data por quem tiver maior pontos. Em caso de empate, observe que eu fiz a ordenação da classe pois creio que a classe A tenha prioridade sobre a classe B e assim por diante. Se você não classficar aqui, ao tentar classificar direto pelo tempo de classe poderá haver registros de diferentes classes e por último, ficará a idade.

Caso não consiga, poste o arquivo rpt e a base de dados.
ALANTB 08/04/2015 17:14:43
#445814
Então, para melhor visão do meu sistema segue cópia......Tem muitos bugs que deixei para arrumar depois, mas já dá pra executar legal...
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas