Jump to content

Recommended Posts

Posted

Bom dia,

Como iniciante em programação e em Delphi, estou a tentar aprender a construir um "simples" programa para lançamentos de despesas domésticas. Uma forma de aprender e faz jeito cá para casa.

No entanto, tenho algumas dúvidas e não consigo avançar, tais como:

1) Para ligação ao SQLServer estou a usar o ADOConnection, mas li algures na net que este vai ser descontinuado e que é melhor usar o SQLConnection (dbexpress), o que me dizem?

2) Para mim a parte mais complicada, necessito de efetuar o Login e que o sistema identifique e visualize apenas os meus, isto é, quando o program iniciar apenas vou ver os meus lançamentos, e os outros utilizadores o mesmo.

(O sistema de login já tenho feito, e no form principal no rodapé já aparece as iniciais de quem fez o login).

Obrigado pela ajuda,

Secua

Posted

Para a conexão, depende de que versão do Delphi estás a usar.

O melhor para mim é o UniDac (mas é a pagar).

O FireDac vem com o Delphi actualmente, e também é muito bom.

À falta de um destes, o ZeosLib também é excelente, mas tens de o instalar, pois não vem de origem (mas é gratuito).

Para o resto, crias uma tabela de users, e cada um tem um userID.

Depois, cada movimento tem um campo também UserID, onde guardas o ID do user que estiver activo no momento.

Ao consultar os movimentos, só tens de filtrar pelo UserID, e ele já so mostra os desse user.

"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.

Posted

Para a conexão, depende de que versão do Delphi estás a usar.

O melhor para mim é o UniDac (mas é a pagar).

O FireDac vem com o Delphi actualmente, e também é muito bom.

À falta de um destes, o ZeosLib também é excelente, mas tens de o instalar, pois não vem de origem (mas é gratuito).

Para o resto, crias uma tabela de users, e cada um tem um userID.

Depois, cada movimento tem um campo também UserID, onde guardas o ID do user que estiver activo no momento.

Ao consultar os movimentos, só tens de filtrar pelo UserID, e ele já so mostra os desse user.

Obrigado Nuno, quanto à versão do Delphi estou a usar o XE8.

Então achas que devo mudar o tipo de ligação à DB ? Neste momento está a funcionar e estou a usar (ADOConnection+ADOTable+DATASource),

Quanto ao user não vou pedir mais ajudas e vou tentar implementar a tua dica, caso tenha dúvidas peço uma ajuda.

Cmp

Secua

Posted

Se estás a começar um projecto agora, usar o componente actual (FireDAC) pode dar-te vantagens.

Nada como testares, mas para mim, está muito acima do ADO.

Quanto ao resto, tenta, e se houver duvida, avisa.

  • 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.

Posted

Se estás a começar um projecto agora, usar o componente actual (FireDAC) pode dar-te vantagens.

Nada como testares, mas para mim, está muito acima do ADO.

Quanto ao resto, tenta, e se houver duvida, avisa.

Assim vou fazer... Obg

Posted

Se estás a começar um projecto agora, usar o componente actual (FireDAC) pode dar-te vantagens.

Nada como testares, mas para mim, está muito acima do ADO.

Quanto ao resto, tenta, e se houver duvida, avisa.

Bom dia,

"Depois, cada movimento tem um campo também UserID, onde guardas o ID do user que estiver activo no momento."

Desculpa mas não estou a conseguir fazer este procedimento.

Já implementei a janela de login, quando passa para o ecrã principal leva a o ID do user (na tela principal tenho um painel que informa o ID da sessão).

Acho que a ideia é quando entro no form movimentos (tabela tblmovimentos), o sistema preenche o campo iduser (tblmovimentos) com o ID da tabela (tbllogin) (não sei fazer isso).

E depois ....

Consegues ajudar-me? Obrigado

Cmp

Secua

Posted

Se já fizeste o ecrã de login, e ao fazer o userID é passado para o programa principal, já tens meio caminho andado.

Tens agora 2 problemas principais a ter em conta:

1º Adicionar movimentos

2º Consultar movimentos

Vamos por partes então:

Vamos imaginar que a tua tabela de movimentos na base de dados tem os seguintes campos:

- Descrição

- Data

- Valor

Independentemente de teres estes ou outros campos, precisas de um campo integer para o userID. Se não o tiveres já, tens de o adicionar à estrutura da tabela.

1º Adicionar movimentos

Quando adicionares um movimento, a dada altura terás de o gravar na tabela de movimentos. Nesse momento, por exemplo depois do INSERT, acrescentas o valor ao campo userID. Dessa forma, o movimento que gravas ficará com indicação de a que user pertence.

Ex.:

qMovimentos.Insert;
qMovimentos.FieldValues['userID']    := fLogin.UserID; // metes aqui a variável onde tens guardado o userID.
qMovimentos.FieldValues['Descricao'] := edDescricao.Text;
qMovimentos.FieldValues['Data']      := edData.Text;
qMovimentos.FieldValues['Valor']     := edValor.Text;
qMovimentos.Post;

2º Consultar movimentos

Quando executares uma query para consultar os movimentos (SELECT), e se pretenderes ver só os movimentos de um determinado utilizador, terás de filtrar a query, colocando na cláusula WHERE o campo userID for igual ao userID seleccionado no login.

Ex.:

qMovimentos.SQL.Text := 'SELECT * FROM Movimentos WHERE userID = '+IntToStr(fLogin.UserID);
qMovimentos.Active   := 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.

Posted

Se já fizeste o ecrã de login, e ao fazer o userID é passado para o programa principal, já tens meio caminho andado.

Tens agora 2 problemas principais a ter em conta:

1º Adicionar movimentos

2º Consultar movimentos

Vamos por partes então:

Vamos imaginar que a tua tabela de movimentos na base de dados tem os seguintes campos:

- Descrição

- Data

- Valor

Independentemente de teres estes ou outros campos, precisas de um campo integer para o userID. Se não o tiveres já, tens de o adicionar à estrutura da tabela.

1º Adicionar movimentos

Quando adicionares um movimento, a dada altura terás de o gravar na tabela de movimentos. Nesse momento, por exemplo depois do INSERT, acrescentas o valor ao campo userID. Dessa forma, o movimento que gravas ficará com indicação de a que user pertence.

Ex.:

qMovimentos.Insert;
qMovimentos.FieldValues['userID']	:= fLogin.UserID; // metes aqui a variável onde tens guardado o userID.
qMovimentos.FieldValues['Descricao'] := edDescricao.Text;
qMovimentos.FieldValues['Data']	  := edData.Text;
qMovimentos.FieldValues['Valor']	 := edValor.Text;
qMovimentos.Post;

2º Consultar movimentos

Quando executares uma query para consultar os movimentos (SELECT), e se pretenderes ver só os movimentos de um determinado utilizador, terás de filtrar a query, colocando na cláusula WHERE o campo userID for igual ao userID seleccionado no login.

Ex.:

qMovimentos.SQL.Text := 'SELECT * FROM Movimentos WHERE userID = '+IntToStr(fLogin.UserID);
qMovimentos.Active   := True;

Muito obrigado Nuno. Vou seguir os passos e depois informo.

Posted (edited)

Muito obrigado Nuno. Vou seguir os passos e depois informo.

Boa tarde Nuno,

Não estou a conseguir, o código que tenho é este quando salvo um registo:

ADOabertos é uma ADOQuery ligada à tabela movimentos e onde tenho uma query para mostrar apenas os movimentos em aberto.

Tentei colocar isto mas dá erro.

dm.ADOabertos.FieldValues ['iduser'] := dm.ADOLogin.iduser;

//-----SALVAR UM NOVO REGISTO - BOTAO NOVO-----------------------------------------------

procedure Tfrmmov.BtsalvarClick(Sender: TObject);
begin
if (DBCliente.Text='')then
   begin
	 MessageBox(Handle,'O Cliente nao pode ficar vazio!','Gestão Pessoal',MB_ICONINFORMATION+MB_OK);
	 DBCliente.SetFocus;
	 exit;
   end
   else
	  begin
		dm.ADOabertos.Post;
// posso colocar aqui a instrução  ???????????
		BTNovo.Enabled:=true;
		BTSalvar.Enabled:=false;
		BTCancelar.Enabled:=false;
		BTAlterar.Enabled:=true;
		BTExcluir.Enabled:=true;
		BTPesquisar.Enabled:=true;
		BTSair.Enabled:=false;
		Desabilitacampos;
		MessageBox(Handle,'Registo salvo com sucesso!','Caixa Gest',MB_ICONINFORMATION+MB_OK);
		DBGrid1.Enabled:=true;
		dm.ADOabertos.close;
		dm.ADOabertos.open;
	  end;
end;

// -----------------------------------------------------------------

// ------------------HABILITA E DESABILITA CAMPOS -----------------------------------------------------
procedure Tfrmmov.HabilitaCampos;
begin
 DBCliente.Enabled:=true;
 DBCliente.SetFocus;
 DBdocumento.Enabled:=true;
 DBdescmovimento.Enabled:=true;
 DBLooTipoM.Enabled:=true;
 DBValor.Enabled:=true;
 DBGrid1.Enabled:=true;

end;

procedure Tfrmmov.DesabilitaCampos;
 begin
 DBCliente.Enabled:=False;
 DBdocumento.Enabled:=False;
 DBdescmovimento.Enabled:=False;
 DBLooTipoM.Enabled:=False;;
 DBValor.Enabled:=False;
 DBGrid1.Enabled:=False;
end;
Edited by nunopicado
GeShi
Posted (edited)

Tentei colocar isto mas dá erro.

dm.ADOabertos.FieldValues ['iduser'] := dm.ADOLogin.iduser;

//-----SALVAR UM NOVO REGISTO - BOTAO NOVO-----------------------------------------------

procedure Tfrmmov.BtsalvarClick(Sender: TObject);
begin
   if (DBCliente.Text='')then
      begin
        MessageBox(Handle,'O Cliente nao pode ficar vazio!','Gestão Pessoal',MB_ICONINFORMATION+MB_OK);
        DBCliente.SetFocus;
        exit;
      end
      else
         begin

// Coloca antes aqui...

           dm.ADOabertos.Post;
// posso colocar aqui a instrução  ???????????    Tens de preencher o campo antes do Post
           BTNovo.Enabled:=true;
           BTSalvar.Enabled:=false;
           BTCancelar.Enabled:=false;
           BTAlterar.Enabled:=true;
           BTExcluir.Enabled:=true;
           BTPesquisar.Enabled:=true;
           BTSair.Enabled:=false;
           Desabilitacampos;
           MessageBox(Handle,'Registo salvo com sucesso!','Caixa Gest',MB_ICONINFORMATION+MB_OK);
           DBGrid1.Enabled:=true;
           dm.ADOabertos.close;
           dm.ADOabertos.open;
         end;
   end;

Tens de adicionar essa linha antes de chamares o 'Post'.

Em alternativa, podes meter essa linha no evento OnBeforePost da query.

EDIT: Pergunta:

dm.ADOLogin é uma query também, certo?

Se sim, este identificador não existe**:

dm.ADOLogin.iduser

** a não ser que tenhas adicionado propriedades ou campos à classe com um Helper ou um Interceptor, por exemplo

Possivelmente vais querer substituir essa linha, por esta:

dm.ADOabertos.FieldValues ['iduser'] := dm.ADOLogin.FieldByName('iduser').AsInteger;
Edited by nunopicado

"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.

Posted (edited)

Espectáculo, quem sabe sabe 🙂

Marco, assim já deu:

dm.ADOabertos.FieldValues ['iduser'] := dm.ADOLogin.FieldByName('iduser').AsInteger

OK...vou agora tentar implementar a Query para abrir a form do utilzador logado.

Cmp

Secua

Edited by nunopicado
GeShi
Posted

Sempre que meteres código no forum, mete as tags CODE antes e depois (edita um post teu para veres como é que eu as pus).

Fica mais legível, e de acordo com as regras do forum.

  • 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.

Posted

Sempre que meteres código no forum, mete as tags CODE antes e depois (edita um post teu para veres como é que eu as pus).

Fica mais legível, e de acordo com as regras do forum.

Bom dia Nuno,

Alguma coisa me falha, no FormCreat acrescentei o código abaixo mas dá erro no palavra idlogin, e é o nome do campo que tenho na tabela.

procedure Tfrmmov.FormCreate(Sender: TObject);
begin
dm.ADOabertos.SQL.Text := 'SELECT * FROM tblMovimentos WHERE idlogin = '+IntToStr(dm.ADOabertos.idlogin);
keyPreview:=true;
end;

O "ADOAbertos" é o nome do componente "ADOQuery".

Cmp.

Secua

Posted

É o mesmo problema que tinhas em cima...

Não podes usar o nome do campo assim, pois ele não existe na estrutura da classe da query.

Tens de o chamar através de um dos métodos existentes, como por exemplo:

procedure Tfrmmov.FormCreate(Sender: TObject);
begin
dm.ADOabertos.SQL.Text := 'SELECT * FROM tblMovimentos WHERE idlogin = '+IntToStr(dm.ADOabertos.FieldByName('idlogin').AsInteger);
keyPreview:=true;
end;

ou melhor ainda, visto que podes pedir o valor directamente como uma string, sem teres de converter depois:

procedure Tfrmmov.FormCreate(Sender: TObject);
begin
dm.ADOabertos.SQL.Text := 'SELECT * FROM tblMovimentos WHERE idlogin = '+dm.ADOabertos.FieldByName('idlogin').AsString;
keyPreview:=true;
end;

"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.

Posted

É o mesmo problema que tinhas em cima...

Não podes usar o nome do campo assim, pois ele não existe na estrutura da classe da query.

Tens de o chamar através de um dos métodos existentes, como por exemplo:

procedure Tfrmmov.FormCreate(Sender: TObject);
begin
dm.ADOabertos.SQL.Text := 'SELECT * FROM tblMovimentos WHERE idlogin = '+IntToStr(dm.ADOabertos.FieldByName('idlogin').AsInteger);
keyPreview:=true;
end;

ou melhor ainda, visto que podes pedir o valor directamente como uma string, sem teres de converter depois:

procedure Tfrmmov.FormCreate(Sender: TObject);
begin
dm.ADOabertos.SQL.Text := 'SELECT * FROM tblMovimentos WHERE idlogin = '+dm.ADOabertos.FieldByName('idlogin').AsString;
keyPreview:=true;
end;

OK percebi... mas agora não marca erro no código, mas dá um erro quando inicia a aplicação:

"Access violation address 007DD38D in module 'caixa.exe'.Read of address 000000B4"

O que devo ter mal ?

Obg

Secua

Posted

OK percebi... mas agora não marca erro no código, mas dá um erro quando inicia a aplicação:

"Access violation address 007DD38D in module 'caixa.exe'.Read of address 000000B4"

O que devo ter mal ?

Obg

Secua

Este está ultrapassado, vou para o próximo desafio ... obg

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
×
×
  • 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.