secua Posted August 9, 2015 at 08:40 AM Report #586871 Posted August 9, 2015 at 08:40 AM 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
nunopicado Posted August 9, 2015 at 11:40 AM Report #586874 Posted August 9, 2015 at 11:40 AM 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.
secua Posted August 9, 2015 at 04:20 PM Author Report #586876 Posted August 9, 2015 at 04:20 PM 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
nunopicado Posted August 9, 2015 at 05:32 PM Report #586879 Posted August 9, 2015 at 05:32 PM 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. 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.
secua Posted August 9, 2015 at 05:53 PM Author Report #586880 Posted August 9, 2015 at 05:53 PM 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
secua Posted August 10, 2015 at 11:36 AM Author Report #586898 Posted August 10, 2015 at 11:36 AM 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
nunopicado Posted August 10, 2015 at 12:29 PM Report #586901 Posted August 10, 2015 at 12:29 PM 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; 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.
secua Posted August 10, 2015 at 01:12 PM Author Report #586905 Posted August 10, 2015 at 01:12 PM 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.
secua Posted August 10, 2015 at 02:53 PM Author Report #586919 Posted August 10, 2015 at 02:53 PM (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 August 10, 2015 at 03:56 PM by nunopicado GeShi
nunopicado Posted August 10, 2015 at 04:00 PM Report #586925 Posted August 10, 2015 at 04:00 PM (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 August 10, 2015 at 04:03 PM 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.
secua Posted August 10, 2015 at 04:36 PM Author Report #586926 Posted August 10, 2015 at 04:36 PM (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 August 10, 2015 at 05:07 PM by nunopicado GeShi
nunopicado Posted August 10, 2015 at 05:10 PM Report #586929 Posted August 10, 2015 at 05:10 PM 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. 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.
secua Posted August 11, 2015 at 11:04 AM Author Report #586948 Posted August 11, 2015 at 11:04 AM 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
nunopicado Posted August 11, 2015 at 02:09 PM Report #586953 Posted August 11, 2015 at 02:09 PM É 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.
secua Posted August 11, 2015 at 02:28 PM Author Report #586954 Posted August 11, 2015 at 02:28 PM É 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
secua Posted August 11, 2015 at 03:55 PM Author Report #586956 Posted August 11, 2015 at 03:55 PM 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
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