smack_dead Posted March 19, 2014 Report Share Posted March 19, 2014 (edited) Huuum tenho esta função para o login em que ele vê se o utilizador e a pass estão correctos se sim ele mostra a informação do user... Edited June 6, 2014 by smack_dead Link to comment Share on other sites More sharing options...
Kline777 Posted March 19, 2014 Report Share Posted March 19, 2014 Não estás a usar a tabela D.ADOQuerytable para 2 consultas diferentes? 1 Report Link to comment Share on other sites More sharing options...
nunopicado Posted March 19, 2014 Report Share Posted March 19, 2014 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 More sharing options...
Kline777 Posted March 19, 2014 Report Share Posted March 19, 2014 (edited) 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 March 19, 2014 by Kline777 Link to comment Share on other sites More sharing options...
nunopicado Posted March 19, 2014 Report Share Posted March 19, 2014 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 More sharing options...
Kline777 Posted March 19, 2014 Report Share Posted March 19, 2014 Ok mas aqui nao estamos a falar de ficheiros de texto... Hei-de fazer alguns testes para ver a rapidez do loop com as 2 versoes... Link to comment Share on other sites More sharing options...
nunopicado Posted March 19, 2014 Report Share Posted March 19, 2014 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 More sharing options...
smack_dead Posted March 20, 2014 Author Report Share Posted March 20, 2014 (edited) 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 March 27, 2014 by smack_dead Link to comment Share on other sites More sharing options...
nunopicado Posted March 20, 2014 Report Share Posted March 20, 2014 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 More sharing options...
smack_dead Posted March 20, 2014 Author Report Share Posted March 20, 2014 então a função login tem o objectivo de verificar se o user existe com a pass se existir mostra as informações dele.... Link to comment Share on other sites More sharing options...
nunopicado Posted March 20, 2014 Report Share Posted March 20, 2014 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. 1 Report "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 More sharing options...
smack_dead Posted March 21, 2014 Author Report Share Posted March 21, 2014 mas então como e que sugeres crio duas funções uma para o login e outra para mostrar as informações? Link to comment Share on other sites More sharing options...
nunopicado Posted March 21, 2014 Report Share Posted March 21, 2014 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. 1 Report "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 More sharing options...
smack_dead Posted March 21, 2014 Author Report Share Posted March 21, 2014 (edited) podes-me dar o exemplo? se faz favor.. Edited March 21, 2014 by smack_dead Link to comment Share on other sites More sharing options...
nunopicado Posted March 21, 2014 Report Share Posted March 21, 2014 (edited) 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 March 21, 2014 by nunopicado 1 Report "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 More sharing options...
CrominhO Posted March 21, 2014 Report Share Posted March 21, 2014 (edited) 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 March 21, 2014 by CrominhO 2 Report As mentes humanas são realmente um local estranho! Link to comment Share on other sites More sharing options...
nunopicado Posted March 21, 2014 Report Share Posted March 21, 2014 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. 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 More sharing options...
Kline777 Posted March 21, 2014 Report Share Posted March 21, 2014 (edited) Fizeste em release? a optimização do codigo pode actuar aí penso eu... põe ai um codigo no loop a fazer qq coisa. Só para ver 🙂 Edited March 21, 2014 by Kline777 Link to comment Share on other sites More sharing options...
nunopicado Posted March 21, 2014 Report Share Posted March 21, 2014 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: 1 Report "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 More sharing options...
CrominhO Posted March 21, 2014 Report Share Posted March 21, 2014 (edited) 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 March 21, 2014 by CrominhO As mentes humanas são realmente um local estranho! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now