Ajuda na consulta de dados

Olá pessoal, estou com uma dificuldade em realizar a consultar, para que a mesma apareça em campos específicos. por exemplo.

Esta tela acima é a tela de cadastro até ai tudo bem, pois consigo cadastrar usando o histórico. Acontece que estou querendo fazer em uma outra tela parecida com está a consulta. desta forma.

As dúvidas começam nesta parte.
1- Como fazer com que os campos referente as consulta encontrada sejam linkados para cada sequencia de dados, ou seja, o campo que estar no dado1 seja alocado para o dado1. O campo que estar linkado para dado2, seja alocado para dado 2 é assim por diante.

Como você não colocou a estrutura da tabela que irá consultar, vou dar um exemplo:

Tabela “A”:

CodTag | Dado1 | Dado2 | Dado3 | Dado4
1 | 10 | 20 | 30 | 40
2 | 100 | 200 | 300 | 400

Adicione uma consulta e altere a SQL para algo do tipo:
“SELECT * FROM TABLE A WHERE CODTAG = <%varCodTag%>”

Na tela de consulta ao clicar no botão para efetuar a pesquisa crie um script do tipo:

intCodTag = Parent.Item(“dspCodTag”).Value
Set query = Parent.Item(“Consulta”)
query.SetVariableValue “varCodTag”, intCodTag
query.GetAsyncADORecordset() 'Consulta assíncrona

Prefiro utilizar uma consulta assíncrona para não “travar” o Viewer enquanto a consulta é processada…

Então, para processar a consultar deve-se criar um script no evento OnAsyncQueryFinish do objeto “Consulta” que irá executar quando a consulta terminar. No script da consulta faremos:

Sub Consulta1_OnAsyncQueryFinish(Recordset, Error)
If Not(Error) Then
If Recordset.RecordCount <> 0 Then
Recordset.MoveFirst
Parent.Item(“dspDado1”).Value = Recordset.Fields.Item(“Dado1”).Value
Parent.Item(“dspDado2”).Value = Recordset.Fields.Item(“Dado2”).Value
Parent.Item(“dspDado3”).Value = Recordset.Fields.Item(“Dado3”).Value
Parent.Item(“dspDado4”).Value = Recordset.Fields.Item(“Dado4”).Value
Else
msgbox “Sem resultados na consulta”
End If
Else
msgbox “Erro na consulta”
End If
End Sub

Bom… foi isso que entendi da sua pergunta, senão, dê mais detalhes…

1 Like

@Marcel_Ribeiro, Obrigado pela ajuda.
Conseguir implementar o código demonstrado por você acima. Porém quando adiciono o SQL para “SELECT * FROM TABLE A WHERE CODTAG = <%varCodTag%>”, apresenta a mensagem de erro na consulta.

Quando retiro este comando em SQL e deixo o padrão

SELECT cadastro.tag,cadastro.Dado01,cadastro.Dado2,cadastro.Dado3,cadastro.Dado4 FROM cadastro

A consulta só me retorna o 1 valor da tabela, ou seja, para qualquer numero que coloque sempre apresenta o mesmo valor. (obs.: Os endereços dos campos estão funcionando Blz)

A parte do comando SQL:

É justamente a parte do SQL que irá filtrar a consulta, logo se retirada irá aparece apenas o primeiro resultado.

Experimente o seguinte:

  • Clique com o botão direito no objeto Consulta e clique em “Configurar”.

  • Na aba Campos selecione os campos que deseja retornar na consulta

  • No campo Tag, na coluna Filtro configure de acordo com a imagem abaixo (adaptando os nomes ao seu caso em particular)

  • Teste a consulta na aba “Visualizar”, clicando no simbola da exclamação vermelha. Irá solicitar um valor para a variável que irá filtrar o código Tag, preencha com um valor que você sabe que existe. É para aparecer algum resultado.

Resultado:

Na sua tela o botão que irá iniciar a pesquisa terá o script que mencionei antes:

Primeiro leremos o Tag que será pesquisado. Você provavelmente estará usando um display para receber o valor, então no script, receberemos o valor do display e armazenaremos na variável intTag. (Talvez seja necessário converter para valor Inteiro (que suponho ser o tipo de dado no campo Tag da sua tabela), caso esteja como String, por isso o CInt() )

intTag = CInt(Parent.Item(“dspTag”).Value)

Após isso modificamos a variável utilizada no filtro da consulta, para filtramos o código Tag preenchido no display.

Set query = Parent.Item(“Consulta”)
query.SetVariableValue “varTag”, intTag
query.GetAsyncADORecordset()

De resto, é para funcionar como antes.

É recomendável utilizar a função GetAsyncADORecordset() para qualquer consulta? Existe desvantagem?

Como é uma consulta assíncrona, você só terá ao resultado da consulta quando ela terminar.
Não chamaria de desvantagem, mas de característica:

Se no seu script você precisar utilizar os resultados da consulta, pode ser que não funcione (é uma questão de tempo), pois o script chamará o método GetAsyncADORecordset() e continuará a partir daí, se a próxima instrução já fizer alguma referência à algum valor que você espera obter da consulta, então pode ocorrer desse valor ainda não existir pois a consulta ainda não terminou.

Na verdade nem sei se tem como você acessar o RecordSet (resultado da consulta) sem ser por algum script no evento OnAsyncQueryFinish(). Então no fim das contas, o processamento do resultado da consulta vai estar em um script separado do script que acionou a consulta, então serão dois script separados que não interagem entre si (a não ser que você armazene as variáveis em tags, mais aí é outra história).

As vantagens desse modo de consulta é que você não fica com o script interrompido enquanto a consulta é executada, como no método GetADORecordset(), além de ter acesso ao retorno do Error (que indica se a consulta teve sucesso), que é interessante para tratar erros devido à falha na conexão com o banco de dados.

1 Like

Ok @Marcel_Ribeiro.
Grato pelos esclarecimentos.

Dei uma atualizada na resposta com mais informações. lê de novo por favor.

1 Like

@Marcel_Ribeiro, Meu caro… Penei aqui viu rsrsrsrsrs…

Mais não conseguir colocar para funcionar… Pensei que pode ser os comandos que estou executando dentro da Query são em SQL. porém estou usando um BD no Access. Teria alguma mudança nos comandos ?.

Dentro da Query, Consulta1(em parte), está funcionando, mais já percebi que o problema está no reconhecimento dos valores por parte da Variável dentro da Query.
Como exemplo.: Dentro da query, quando coloco o valor da consulta no campo valor(1 ou 2), Consigo visualizar, até aí ok. Mais quando executo a aplicação só continua mostrando o conteúdo que é referente ao número que está no alocado na Query, no campo valor.

Se a consulta no E3Query está apresentando resultado então a consulta está ok, deve ser algo no script que chama a consulta.
Como você está lendo o display que contém o valor do código tag a ser pesquisado, e como está usando este valor na variável de filtro da consulta (método SetVariableValue)?
tem como você copiar aqui seu script que executa a consulta?

ps: Atenção nos campos da sua tabela, um campo tem o nome “Dado01”, os outros “Dado2, Dado3” (sem o zero), padroniza, senão fica fácil cometer erros.

Sim…

Dentro de Consulta1 >>>>>>>>>>>>>>>
Sub Consulta1_OnAsyncQueryFinish(Recordset, Error)

If Not(Error) Then
If Recordset.RecordCount <> 0 Then
Recordset.MoveFirst
Parent.Item("Texto15").Value = Recordset.Fields.Item("Dado01").Value
Parent.Item("Texto2").Value = Recordset.Fields.Item("Dado2").Value
Parent.Item("Texto5").Value = Recordset.Fields.Item("Dado3").Value
Parent.Item("Texto7").Value = Recordset.Fields.Item("Dado4").Value
Else
msgbox "Sem resultados na consulta"
End If
Else
msgbox "Erro na consulta"
End If

End Sub 

Botão pesquisar >>>>>>>>

Sub CommandButton1_Click()
    Screen.Item("Texto15").Value = ""
    Screen.Item("Texto2").Value = ""
    Screen.Item("Texto5").Value = ""
    Screen.Item("Texto7").Value = ""
    Screen.Item("Texto9").Value    = ""    

intCodTag = Parent.Item("Texto9").Value
Set query = Parent.Item("Consulta1")
query.SetVariableValue "varCodTag", intCodTag
query.GetAsyncADORecordset() 'Consulta assíncrona

End Sub

O SQL >>>>>>>>>>>
SELECT cadastro.Dado01,cadastro.Dado2,cadastro.Dado3,cadastro.Dado4
FROM cadastro WHERE cadastro.tag = <%varCodTag%>

Screen.Item(“Texto9”).Value e Parent.Item(“Texto9”).Value são displays diferentes?? Olha se o caminho dos displays está correto.

E supondo que sejam o mesmo display, fazendo Screen.Item(“Texto9”).Value = “” você estaria apagando o que estivesse escrito nele… e depois em intCodTag = Parent.Item(“Texto9”).Value estaria armazenando na variável que é usada na consulta sql

Avalia primeiro se os caminhos dos displays estão corretos (é interessante renomear os displays assim não ficam nomes genericos com “texto15, texto2, texto5”. Facilita na hora de usar nos scripts para não misturar as coisas)
Segundo avalia se é necessário nesse display “Texto9” = “”. Se for o código tag a ser pesquisado você estaria apagando ele.

Olhando aqui acho que o correto ficaria assim:

Sub CommandButton1_Click()
Screen.Item(“Texto15”).Value = “”
Screen.Item(“Texto2”).Value = “”
Screen.Item(“Texto5”).Value = “”
Screen.Item(“Texto7”).Value = “”

intCodTag = Screen.Item(“Texto9”).Value
Set query = Parent.Item(“Consulta1”)
query.SetVariableValue “varCodTag”, intCodTag
query.GetAsyncADORecordset() 'Consulta assíncrona

End Sub

@Marcel_Ribeiro, Editei o tropico, por conta dos nomes das variáveis
Porém, realizei os testes mais nada de escrever na Query da Consulta… estou com a teoria que deve ser o banco de dados, por conta de ser Access, seria isso ?

Att.

Não acredito que seja a consulta, visto que quando você testa ela pelo Query ela retorna resultado.

Você viu o código que escrevi no final do último post? Substitua o script do seu botão pesquisar por este e teste novamente. Acredito que você não esteja lendo o caminho correto do display com o código tag a ser pesquisado, por isso ao utilizar o query.SetVariableValue “varCodTag”, intCodTag , não está sendo pesquisado o código tag correto.

se der algum erro, dê um print e poste aqui.

@Marcel_Ribeiro @Gabriel @dgautomacao , realizando alguns teste aqui… depois de rever algumas dezenas de vezes está aplicação, percebi que o “problema”, era este aqui… APERTAR ENTER, após digitar o número para realizar a busca (ex. digito a TAG, aperto enter e só depois o pesquisar)… Fazendo isso consigo visualizar a consulta para todos os dados.

Bom o problema é que agora com este “plus”, necessito resolver está questão com algum script que “entenda” a chegada de 5 caractere e pressione um enter “automático”. Alguma sugestão ???

Bom, por experiência própria, acredito que o comportamento de um display seja basicamente esse mesmo.
O que você digita no display só é enviado para a propriedade “Value” do mesmo quando você aperta o ENTER, ou quando outro display, combobox, checkpoint e etc tomam o “foco” da tela. Quando você digita, não aperta o ENTER e clica no botão para pesquisar, o que você digitou não foi repassado para a propriedade “Value”.

Como alternativa, já que não dá para confiar na ação do usuário, sugiro usar o método SetFocus() no botão de pesquisa, logo no começo do script, assim o botão tomará o foco para si, fazendo que o que foi digitado no display seja transferido para a propriedade Value. Observe também se o display que captura o código tag está com a propriedade IsSetpoint = TRUE .

Sub CommandButton_Click()
SetFocus()
'SCRIPT CONTINUA IGUAL A PARTIR DAQUI
End Sub

Para validar os 5 carateres, pode usar o método Len() que retorna o tamanho de uma String

If Len(Screen.Item(“Texto9”).Value) = 5 Then
’ executa pesquisa
Else
msgbox “Código de Tag inválido”
End If