Jump to content

[Resolvido] [ajuda] mostrar dados


smack_dead
 Share

Recommended Posts

Verificas se houve login com sucesso, e guardas na variável Resultado.

Depois agarras e assumes que houve sucesso, sem usar a variável para controlar.

Ou seja, ele está a tentar mostrar dados, com ou sem login.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Já agora... nunopicado ou outros 😛 , tenho visto muita gente aqui a fazer o loop aos datasets com

for u:=0 to D.ADOQuerytable.RecordCount-1 do
begin
 D.ADOQuerytable.RecNo := u;
 ... do stuff

Tambem costumam fazer assim? Eu normalmente faço

DS.first;
While not ds.eof do
begin
   //do stuff
   ds.next
end;

penso que é mais natural e mais rapido. Estou enganado?

Edited by Kline777
Link to comment
Share on other sites

Eu costumo...

Já dos tempos do DOS, nunca gostei do EOF. Dá-me uma sensação de falta de controlo.

Preferi sempre o FOR até FileSize, com o Seek pelo meio.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Por acaso nunca fiz.

Curiosamente, a propósito de falares de ficheiros de texto, eram os únicos em que eu usava o EOF. lol

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

pois :s então mas junto com isso acho que tambem nao posso fazer um for porque agora é so um utilizador ..so tem um nome .... achas que pode ser assim?

acho que nao posso usar o for .. e tenho de usar o [ lista_info.custUserName] mas n sei como vou fazer...

Não estás a usar a tabela D.ADOQuerytable para 2 consultas diferentes?

sim estou mas fechei e abri devidamente

Edited by smack_dead
Link to comment
Share on other sites

A ver se eu entendo...

Estás a fazer uma função para login, que te devolve um cliente?

A função login termina com a primeira query. Se tiver resultados é porque encontrou o utilizador e fez o login, se não tiver resultados, o login falhou.

Tudo o resto que tens aí é algo que me transcende, até porque, apesar da função retornar um Tcustomer, em lado nenhum estás a definir o resultado.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Divide isso...

Uma coisa é o login, outra são as informações. Uma função de login, quanto a mim, deve devolver apenas true ou false, conforme esteja feito ou não.

Se quiseres mesmo que ela retorne as informações:

Não precisas de uma segunda query. Quando fazes a primeira para validar o login, se o utilizador/palavra-passe existirem, ela já terá os dados desse utilizador. Basta que, antes de fazeres o close, preencheres as informações dele.

Repara, depois de efectuado o login, a query terá sempre apenas um resultado: O do empregado que fez login.

Basta usares essa informação, caso a variável resultado seja true.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Pessoalmente, nesses casos, tenho a query de empregados acessível a todo o programa.

Depois, uma única função para login, que activa ou desactiva a query, conforme o login seja ou não bem sucedido.

Por fim, sempre que precisar de informações do utilizador, acedo simplesmente aos dados da query, caso ela esteja activa.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

function Twebserver.Login(AUserName, APassword: string) : Boolean;
begin
    // D.qUtilizadores é uma ADOQuery que deverás meter no datamodule D. Podes chamar-lhe o nome que quiseres, mas não a deves usar para mais nada durante todo o programa 

    D.qUtilizadores.SQL.Text:='Select codutilizador, codacesso from utilizadores where codutilizador='''+AUserName+''' and codacesso '''+APassword+'''';
    D.qUtilizadores.Open;

    // Verifica o utilizador
    Result := D.qUtilizadores.RecordCount>0; // Se houver registos na query, é porque encontrou o utilizador
    if not Result 
       then D.qUtilizadores.Close;  // Só se fecha a query caso não tenha resultados e o login não for bem sucedido
end;

Basicamente, é a primeira parte da tua função, mas a retornar um Boolean.

Depois, onde quiseres fazer o login, fazes algo parecido com isto:

if webserver.Login(edUsername.Text, edPassword.Text)
  then begin
          lblNome.Caption := D.qUtilizadores.FieldByName('Nome').AsString;
          lblNIF.Caption := D.qUtilizadores.FieldByName('NIF').AsString;
          .
          .
          .
       end
  else ShowMessage('O utilizador indicado não existe!');

Quando a qualquer momento, já no decorrer do programa, precisares de informação sobre o utilizador activo, basta:

if D.qUtilizadores.Active
  then begin
          .
          .
          .
       end;
Edited by nunopicado
  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Já agora... nunopicado ou outros 😛 , tenho visto muita gente aqui a fazer o loop aos datasets com

for u:=0 to D.ADOQuerytable.RecordCount-1 do
begin
 D.ADOQuerytable.RecNo := u;
 ... do stuff

Tambem costumam fazer assim? Eu normalmente faço

DS.first;
While not ds.eof do
begin
//do stuff
ds.next
end;

penso que é mais natural e mais rapido. Estou enganado?

Curiosamente é a primeira vez que tou a ver é com "For" lol 😄

Sim é mais rápido 🙂 uma Tabela como disseste é um ficheiro, e se metermos em Pseudo Código percebemos isso,

Enquanto não for fim de Ficheiro faz -> este anda um registo pra frente e se tiver o proximo registo marcado como ultimo salta

Inicio

fim

de q=0 até ao tamanho da tabela -1 -> este incrementa uma variável numérica, verifica o tamanho da tabela cada vez que incrementa a variável,

inicio subtrai 1, e ainda verifica se a variavel incrementada é igual à variável preenchida com o tamanho da tabela

fim

Eu sei que sou chato, mas efectivamente o For faz mais uns quantos passos e umas quantas verificações,

e não é querer ser preciosista, mas se for numa tabela com 1 Milhão de Registos torna-se impossível 🙂

Edited by CrominhO
  • Vote 2

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

Aqui entre nós, uma tabela com 1 milhão de registos, tinhas problemas maiores para resolver do que o ciclo que usavas! 😁

Ora, um teste simples, que vale o que vale.

A query em questão é apenas um "select *", a uma tabela com apenas 17208 linhas, que era o que aqui tinha assim de repente.

captur12.jpg

Pelo menos neste teste de joelho, lá se vai a teoria... 😉😛

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Damn.... Saí sem gravar! 🙂

Voltei a fazer, desta vez com um memo para cada ciclo, onde este vai adicionar o ID da tabela.

Compilei em release.

O resultado:

captur13.jpg

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Sr. Nuno, falta lá o menos 1 no FOR lolol é a diferença entre ir ao final do Record ver se EOF ou não lol 😄

Por acaso sempre tive a ideia que o While era mais rapido com ficheiros lol 😄

mas tamos sempre a aprender 😄

tás a fazer Batota lol 😄 :D:D põe lá o First no For também, eu sei q não é preciso, mas assim a comparação não é justa lol 😄

Edited by CrominhO

As mentes humanas são realmente um local estranho!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.