StrataFrame Forum

BrowseDialog - SearchFields - Error

http://forum.strataframe.net/Topic21195.aspx

By Rogerio Mauri - 12/15/2008

Ivan... Boa Tarde...

Necessitarei da sua ajuda aqui, com seu bom inglês.

Observe as imagens do arquivo anexado. Um campo com um Combo BO anexado para pegar apenas os clubes habilitados para o usuário logado carrega os registros na interface de pesquisa (apaguei os dados do TopMost Text/Value para evitar que o filtro desconsidere esse campo na filtragem). No entanto o resultado da pesquisa exibe registros de outros clubes também.

ImagemConfA.jpg = Mostra o BO com Fill personalizado para trazer apenas os clubes habilitados para o usuário logado.

ImagemConfB.jpg = Onde apaguei os valores de TopMost (quero forçar a seleção).

ImagemConfC.jpg = A tela 'General' do campo IdClube configurada.

ImagemConfD.jpg = Todos os campos configurados para a pesquisa.

ImagemA.jpg = Observe que no combo exibe apenas um clube. No resultado da pesquisa, que está ordenado pelo primeiro campo, a coluna IDClube confirma que os registros do clube 1 foram listados.

ImagemB.jpg = Nesta imagem, observe que, no final, estão também os registros de outro clube (IDClube = 2) demonstrando que o módulo não filtrou corretamente os registros.

Aguardo seu retorno.

By Ivan George Borges - 12/15/2008

No seu Combo Population Settings tem uma propriedade chamada "Value Member". Você setou esta propriedade com a PrimaryKey da sua tabela de clubes?
By Rogerio Mauri - 12/16/2008

Sim...

Mas, se eu voltar as opções "Top Most Text / Top Most Value" da aba "Combo - General" para os valores padrões (<Todos> e -1) a filtragem funciona corretamente:


- Escolhendo: <Todos> -> Lista os registros de todos os clubes
- Escolhendo: Náutico... -> Lista apenas os registros desse clube.

Um detalhe. Se o usuário logado é um que está habilitado em todos os clubes então, mesmo com "Top Most Text / Top Most Value" limpos a filtragem funciona. Aparentemente só não funciona quando há uma única opção listada no combobox.

Segue imagem da configuração do "Combo Population Settings".

By Rogerio Mauri - 12/16/2008

Ivan... Acho que encontrei o problema no componente BigGrin.

Analise o segmento de código abaixo que está na classe "BrowseDialogWindow", função "HasData". Observe que estando o .SelectedIndex = 0 (é o caso quando existe apenas um registro no combobox), o SelectedValue correspondente não será retornado para _CurrentValue porque llResult será 'false' (ele testa > 0). Resultado, na cláusula Where essa condição não será adicionada como parte integrante do filtro.

Inclusive, observe no código que há um marcador de comentário logo acima, fazendo comparação com .SelectedIndex <> -1. Mudaram depois e deve haver algum motivo para isso (deve ter relação com o TopMost como default); só que acabou provocando outro erro de lógica.

            '-- Determine the type of control
            If CurrentControl.GetType() Is GetType(MicroFour.StrataFrame.UI.Windows.Forms.MaskedTextbox) Then
                With CType(CurrentControl, MicroFour.StrataFrame.UI.Windows.Forms.MaskedTextbox)
                    llReturn = .Text.Trim().Length > 0

                    If llReturn Then
                        _CurrentValue = .Text
                    End If
                End With
            ElseIf CurrentControl.GetType() Is GetType(MicroFour.StrataFrame.UI.Windows.Forms.ComboBox) Then
                With CType(CurrentControl, MicroFour.StrataFrame.UI.Windows.Forms.ComboBox)
                    'llReturn = CType(.SelectedValue, Integer) <> -1
                    llReturn = .SelectedIndex > 0

                    If llReturn Then
                        _CurrentValue = .SelectedValue
                    End If
                End With
            Else
                With CType(CurrentControl, MicroFour.StrataFrame.UI.Windows.Forms.DateTimePicker)
                    llReturn = .Checked

                    If llReturn Then
                        _CurrentValue = .Value
                    End If
                End With
            End If

 

 

By Ivan George Borges - 12/17/2008

OK. Provavelmente um valor seja esperado para TopMost. Setando um com valor -1 e texto "(não especificado)" não resolveria o seu problema?
By Rogerio Mauri - 12/17/2008

Não... Porque na verdade ele desconsidera o conteúdo do índice 0 (veja que ele não trata o conteúdo com Index = 0 e TopMost será sempre índice 0). Concluindo, utilizando ou não TopMost o resultado será sempre o mesmo. Já fiz o teste. Permanecendo como está, temos um 'bug' no diálogo de pesquisa.
By Ivan George Borges - 12/17/2008

Bom Rogério, este BrowseDialog está em uso com todo o pessoal que usa SF, ele deve estar funcionando de alguma maneira. Se você coloca um TopMost com o texto "Não Utilizado", é exatamente isto que irá acontecer, este critério de busca não será utilizado se o usuário escolher a opção "Não Utilizado".

É a mesma situação de um Textbox, se deixá-lo em branco, não será considerado para busca. A única maneira de se permitir um usuário não escolher nenhum item de um ComboBox para a sua busca, é fornecendo um valor de TopMost com um texto "Não Utilizado", senão você estaria obrigando o usuário a sempre utilizar um valor do ComboBox para a sua busca, o que pode inutilizar a utilização de um Combobox em Browse Dialogs.

Se você porém utilizar qualquer outro item do seu ComboBox, o index será diferente de zero, e o Value Member será utilizado para a busca no banco de dados. Logo, se você utilizar o TopMost da maneira que eu te descrevi, seu BrowseDialog certamente funcionará. 

By Rogerio Mauri - 12/17/2008

Ivan... Mas é essa a intenção, obrigar o usuário a escolher uma opção de filtro, excluindo a opção "Não utilizar". Seria o mesmo que forçar o usuário a fornecer um texto de filtro em um cambo TextBox (ou seja, ele não poderia ser vazio); recurso que também não existe no BrowseDialog.
By Rogerio Mauri - 12/17/2008

Um detalhe...

Concordo que se eu utilizar a opção "TopMost" o BrowseDialog irá tratá-la como tal. Mas a questão é que, no exemplo, limpei essa opção (ela não existe no combobox em tempo de execução). Portanto, se não existe, o SelectedIndex = 0 é um item válido do BO utilizado para popular o controle e o seu SelectedValue precisa ser considerado no filtro. Caso contrário, não faria sentido configurar ou não o TopMost.

By Ivan George Borges - 12/17/2008

Eu sei, entendi isto no início. Por isto que te falei que você deveria tentar usando o TopMost, pois ele me parece ser a única solução no momento tanto para o Combobox, já que é necessário haver um index que não vai gerar critério de busca.

Se você quer permitir busca em apenas alguns clubes, a estratégia provavelmente terá que ser diferente, utilizando os eventos do Browse Dialog, como o Searching, onde você pode manipular a busca a ser executada praticamente de qualquer maneira.

By Rogerio Mauri - 12/17/2008

Ok... Irei verificar outras opções, se é possível, mas fica registrada uma sugestão e uma solicitação de correção:

a) Correção: Se limpar o TopMost não altera o comportamento da busca (desconsidera index = 0), então obrigatoriamente ele deverá ser configurado; caso contrário teremos a falha em tempo de execução caso o desenvolvedor limpe os parâmetros na aba General esperando o resultado que eu mesmo imaginei.

b) Sugestão: Ajustar o controle para interpretar que ausência do parâmetro TopMost indica que o filtro sempre deverá ser configurado com o valor do SelectedValue, independente do seu index.

Recomendo adotar a sugestão, pois ampliaria o poder do BrowseDialog como ferramenta de seleção de registros e pelo que analisei no código da classe não será difícil fazer esse ajuste. Inclusive, o entendimento da lógica na aba General, nesse caso, estaria mais consistente.

By Ivan George Borges - 12/18/2008

OK, Rogério.

Depois eu vou traduzir sua mensagem e enviar para eles, mas eu sinceramente acho que esta é a funcionalidade esperada para o Combobox. Nenhum campo deveria ser obrigatório para preenchimento, é para isto que há o Searching evento para se manipular sua procura da maneira que for necessária.

Mas vou passar isto para eles.

By Rogerio Mauri - 12/18/2008

Ok Ivan...

Permanecendo então a funcionalidade atual, o TopMost sempre será obrigatório. No entanto, nem precisa ter o campo TopMostValue (valor intrínseco), apenas o TopMostText (para poder colocar o texto personalizado). Afinal, o seu 'value' não é considerado.

Com isso o código do componente precisará ser reavaliado.

By Rogerio Mauri - 12/18/2008

Ops...

Esqueci de algo importante.

Obrigado pelo acompanhamento e suporte.Smile

By Rogerio Mauri - 12/18/2008

Ivan... Ainda sobre essa questão.

Observe o descritivo do Help sobre o controle, especificamente quanto a utilização do TopMost.

Na prática, condição para criar o "None" não é possível. Sempre da "All", independente do que você coloque no par Text/Value.

By Trent L. Taylor - 12/18/2008

Rogerio,

Let me jump in here because I have had a conversation with Ivan about this.  This is not a bug and works as it is intended to work.  If you wish to override the TopMost logic in the browse dialog, then your ONLY option is to handle the Searching event of the browse dialog and then implement your logic to counteract the default behavior.  This is a prime example of why this event was created.  This is not something that is going to change within the framework since doing what you are asking would actually break every other SF user out there and would not be backward compatible.  Even if we were to make a change, this would not be implemented for another version or two.  And since the preferred method to handle this is going to be through the Searching event, then you already have a solution to do exactly what you would like. 

I thought I better jump in here because you are pressing for an answer that you are not likely to get and I wanted you to be able to spend your time working through a solution using an existing mechanism that exists within the framework. 

By Rogerio Mauri - 12/18/2008

Ok Trent...

Então, para finalizar este diálogo, poderia me dar um exemplo funcional de utilização do TopMostValue diferente de -1 ou 0 ?


 

By Rogerio Mauri - 12/18/2008

Rogerio Mauri (12/18/2008)
Então, para finalizar este diálogo, poderia me dar um exemplo funcional de utilização do TopMostValue diferente de -1 ou 0 ?  

Then, to finish this dialogue, could you give a functional example of use with different value of -1 or 0?

By Rogerio Mauri - 12/29/2008

tks...