Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A


robinhocne

Pergunta

No cadastro de Alunos eu coloquei um DbGrid (DbgLan) para poder vizualizar as parcelas lançadas para o aluno selecionado, mas gostaria de colocar para dar baixa tipo assim:"Clicar na parcela da Linha do DbgLan" e coloquei um RadioButton (RdbBaixa) para poder selecionar como dar baixa e um SpeedButton (SpbBaixa) para poder assim concluir a baixa da parcela.

Na Tabela de Lancamentos eu coloquei um campo como Tipo numeric 1,0 sendo 0 Aberto e 1 Para Baixado.

Uso o Firebird 2.0.3 e Delphi 7

Como poderei atribuir?

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0
Uso o Firebird 2.0.3 e Delphi 7
robinhocne, qual componente você utiliza para acessar a tabela (qual tipo de dataset)?

Se puder ser posta em modo edição bastaria colocar no botão algo bem simples, mais ou menos assim:

procedure TCadAluno.SpbBaixaClick(Sender :TObject);
begin
  dataset.edit;
 // campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox
  if RdbBaixa.Checked then
    dataset_campo_baixado.Value := 1
  else 
    dataset_campo_baixado.Value := 0;  
  dataset.post;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

se é query, não vai funcionar.

É componente da paleta BDE ou Interbase. Se for da BDE, tenta habilitar a propriedade RequestLive (true), se for InterBase, troca por um IBDataSet (se não me engano, é este). Daí você vai poder colocar em modo edição, pois um componente do tipo TQuery - a princípio é apenas leitura.

Link para o comentário
Compartilhar em outros sites

  • 0

Mas Micheus eu uso a IbQuery para buscar os dados e mostrar no meu DbGrid, ao substituir pelo IBDataSet ele dá erro na Instrução Sql que eu faço para buscar os dados:Aqui nomei o IBdataSet p/ DsAluLan:

With DtmIza.DsAluLan do
      Begin
         Close;
         Sql.Clear;
         Sql.Add ('Select L.Aluno, L.Parcela, L.Vencimento, L.Valor, L.Emissao, L.Aluno From Lancamento L,'
                  +'Lancamento I Where L.Aluno=' + TxtMat.Text +
                  ' AND I.Codigo=L.Aluno ORDER BY L.Parcela, L.Vencimento');
         Open;
      end;
Dá esse erro:
[Warning] fLibSof.pas(153): FOR-Loop variable 'o' may be undefined after loop
[Hint] falunos.pas(260): Variable 'szBuff' is declared but never used in 'Tfrmalunos.spbsalClick'
[Error] falunos.pas(498): Undeclared identifier: 'Sql'
[Error] falunos.pas(499): Missing operator or semicolon
[Error] falunos.pas(960): Undeclared identifier: 'Tipo'
[Error] falunos.pas(962): Undeclared identifier: 'Tipo'
[Error] falunos.pas(963): Undeclared identifier: 'Tipo'
[Hint] falunos.pas(181): Private symbol 'AppEventsMessage' declared but never used
[Fatal Error] Praticas.pas(99): Could not compile used unit 'falunos.pas'

Link para o comentário
Compartilhar em outros sites

  • 0

robinhocne, se você der uma olhada nas propriedades do componente (no Object Inspector - você não olhou heim!!!), vai ver que ele não tem a propriedade SQL, mas sim uma para a consulta (SelectSQL), outra para inserção (InsertSQL), outra para atualização (RefreshSQL), outra para exclusão (DeleteSQL) e a de alteração (ModifySQL).

Mas se você achar que complica demais, então utilize outro IBQuery com uma instrução de UPDATE. No OnClick do seu botão, você utiliza uma instrução SQL similar a esta:

UPDATE Lancamento SET baixado = :baixado WHERE Codigo = :Codigo

você tem que verificar ai que campos você precisa colocar na cláusula WHERE para identificar corretamente a linha mostrada no seu DBGrid. Depois passa os parâmetros como de costume e executa ele com ExecSQL.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
robinhocne, se você der uma olhada nas propriedades do componente (no Object Inspector - você não olhou heim!!!), vai ver que ele não tem a propriedade SQL, mas sim uma para a consulta (SelectSQL), outra para inserção (InsertSQL), outra para atualização (RefreshSQL), outra para exclusão (DeleteSQL) e a de alteração (ModifySQL).

Mas se você achar que complica demais, então utilize outro IBQuery com uma instrução de UPDATE. No OnClick do seu botão, você utiliza uma instrução SQL similar a esta:

UPDATE Lancamento SET baixado = :baixado WHERE Codigo = :Codigo

você tem que verificar ai que campos você precisa colocar na cláusula WHERE para identificar corretamente a linha mostrada no seu DBGrid. Depois passa os parâmetros como de costume e executa ele com ExecSQL.

Abraços

Mas, não entendi Micheus:

1ª o UPDATE Lancamento SET baixado = :baixado WHERE Codigo = :Codigo, onde colocarei, tipo nos dados que você passou:

procedure TCadAluno.SpbBaixaClick(Sender :TObject);
begin
  dataset.edit;
// campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox
  if RdbBaixa.Checked then
    dataset_campo_baixado.Value := 1
  else
    dataset_campo_baixado.Value := 0;  
  dataset.post;
end;
ou
With DtmIza.DsAluLan do
      Begin
         Close;
         Sql.Clear;
         Sql.Add ('Select L.Aluno, L.Parcela, L.Vencimento, L.Valor, L.Emissao, L.Aluno From Lancamento L,'
                  +'Lancamento I Where L.Aluno=' + TxtMat.Text +
                  ' AND I.Codigo=L.Aluno ORDER BY L.Parcela, L.Vencimento');
         Open;
      end;

E como eu vou ligar a Query, o DataSource e o DataSet ?

Link para o comentário
Compartilhar em outros sites

  • 0

robinhocne, você tem que entender o "espírito da coisa". Lembre-se sempre que quem está com o programa na mão é você, então a gente dá a sugestão e você tenta ajustar ao seu código.

por exemplo, este código que passei:

procedure TCadAluno.SpbBaixaClick(Sender :TObject);
begin
  dataset.edit;
// campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox
  if RdbBaixa.Checked then
    dataset_campo_baixado.Value := 1
  else
    dataset_campo_baixado.Value := 0;  
  dataset.post;
end;
obviamente não está totalmente correto. Eu não sabia qual era o nome do dataset que você estava utilizando. Pelos outros posts seguintes, agora eu poderia dizer que deveria ser "DtmIza.DsAluLan", então naquele caso eu exemplificaria com:
procedure TCadAluno.SpbBaixaClick(Sender :TObject);
begin
  DtmIza.DsAluLan.edit;
// campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox
  if RdbBaixa.Checked then
    DtmIza.DsAluLanbaixado.Value := 1 // ou DtmIza.DsAluLan.FieldByName('baixado').Value := 1
  else
    DtmIza.DsAluLanbaixado.Value := 0; // ou DtmIza.DsAluLan.FieldByName('baixado').Value := 0  
  DtmIza.DsAluLan.post;
end;
Mas como depois você também disse que está utilizando um IBQuery, e ele é somente leitura, não daria para utilizar o método Edit para alterar o campo BAIXADO na linha atualmente selecionada no DBGrid. como sugeri:
Mas se você achar que complica demais, então utilize outro IBQuery com uma instrução de UPDATE. No OnClick do seu botão, você utiliza uma instrução SQL similar a esta: UPDATE Lancamento SET baixado = :baixado WHERE Codigo = :Codigo
nos resta utilizar uma querie auxiliar, ou seja, utilizar outro componente IBQuery para executar uma instrução de UPDATE no registro atualmente selecionado no seu DBGrid. Então, esta instrução seria obviamente executada no clicar do speedbutton:
procedure TCadAluno.SpbBaixaClick(Sender :TObject);
begin
  with DtmIza.UpAluLan do
  begin
    SQL.Clear;
    SQL.Add('UPDATE Lancamento ');  // tabela que terá o campo atualizado
    SQL.Add('SET baixado = :baixado');  // campo a ser atualizado com valor -> parâmetro
    SQL.Add('WHERE Codigo = :Codigo');  // campo(s) a ser(em) filtrado(s) p/ identificar o registro
 // campo da tabela receberá o valor 0 ou 1, conforme o seu radiobox
    if RdbBaixa.Checked then
      SQL.ParamByname('baixado').AsInteger := 1
    else
      SQL.ParamByname('baixado').AsInteger := 0;
    ExecSQL;  // instrução UPDATE é executa com este método, não o Open;
  end;
end;

mas novamente eu não sei quais são os campos chaves (aquele que identifica unicamente o registro na tabela LANCAMENTO e que você está mostrando os dados no seu DBGrid). Então, você terá que ajustar a cláusula WHERE para contê-los. Caso haja algum campo que faça parte da chave na tabela LANCAMENTO, mas que você não tenha incluído ele na cláusula SELECT da sua consulta DsAluLan, mas que você vai precisar dele para filtrar corretamente no UPDATE, então você deverá incluí-lo lá na sua consulta DsAluLan. Assim, você vai ter estes valores para passar nos parâmetros que você precisará no dataset UpAluLan.

Observações:

1) assumi que você adicionou o novo IBQuery (sugerido) no seu datamodule DtmIza, e deu a ele o nome UpdAluLan;

2) eu não vi a informação do estado baixado em sua consulta mostrada no DBGrid, mas se por algum acaso você vier a colocá-la, você terá que ser preocupar com a atualização da sua consulta DsAluLan, após alterar o valor do campo, ou seja, ao final da execução do update no speedbutton. Como vai fazer isto? Re-executando a sua consulta. Como fazer isto? Executando um Close seguido de um Open, mas não esqueça de concatenar qualquer parâmetro que você esteja utilizando na consulta (tipo aquele "+ TxtMat.Tex +").

Espero não o ter confundido ainda mais.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

É Micheus, me confudi um pouco, pois para mim a cada dia que vejo algo assim ainda é novo, pois estou só a um ano mexendo e tive uns curso de inicio, mas...

Fiz dessa maneira e esta dando os seguintes erros:

procedure Tfrmalunos.SpbBaixarClick(Sender: TObject);
begin
  with DtmIza.UpdAluLan do
  begin
    SQL.Clear;
    SQL.Add('UPDATE Lancamento ');  // tabela que terá o campo atualizado
    SQL.Add('SET baixado = :Tipo');  // campo a ser atualizado com valor -> parâmetro
    SQL.Add('WHERE Codigo = :Codigo, Aluno, Tipo, Parcela, Valor, Vencimento, Emissao ');  // campo(s) a ser(em) filtrado(s) p/ identificar o registro
// campo da tabela receberá o valor 0 ou 1, conforme o seu radiobox
    if RdbBaixa.Checked then
      SQL.ParambyName('Tipo').AsInteger := 1
    else
      SQL.ParamByname('Tipo').AsInteger := 0;
    ExecSQL;  // instrução UPDATE é executa com este método, não o Open;
  end;
end;
O erro esta dando no ParamByname:
[Error] falunos.pas(1082): Undeclared identifier: 'ParambyName'
[Error] falunos.pas(1082): Missing operator or semicolon
[Error] falunos.pas(1084): Undeclared identifier: 'ParamByname'
[Error] falunos.pas(1084): Missing operator or semicolon
[Fatal Error] Praticas.pas(99): Could not compile used unit 'falunos.pas'

Bom desculpas por poucas informações, mas a tabela de Lancamento e assim

Codigo

Aluno = referencia da tabela de alunos

Parcela

Valor

Vencimento = Primeiro Vencimento

Emissao

Link para o comentário
Compartilhar em outros sites

  • 0
É Micheus, me confudi um pouco, pois para mim a cada dia que vejo algo assim ainda é novo, pois estou só a um ano mexendo e tive uns curso de inicio
robinhocne, só por curiosidade, neste curso lhe ensinaram este método de programação? Assim, sem o uso de componentes Data-aware? (os tais dos DBEdits, DBComboBox,...)

Porque é o meio mais complicado para começar. (minha opinião)

Fiz dessa maneira e esta dando os seguintes erros:

O erro esta dando no ParamByname:

[Error] falunos.pas(1082): Undeclared identifier: 'ParambyName'
[Error] falunos.pas(1082): Missing operator or semicolon
[Error] falunos.pas(1084): Undeclared identifier: 'ParamByname'
[Error] falunos.pas(1084): Missing operator or semicolon
[Fatal Error] Praticas.pas(99): Could not compile used unit 'falunos.pas'
bom, a falho foi minha, mas a essas alturas, você já poderia verificar que este método estava sendo usado no local correto (você já utilizou ele antes). Na dúvida, tecle F1 sobre o método e você vai descobrir onde ele é utilizado. Ok?! ;) Então, esta parte:
...
    if RdbBaixa.Checked then
      SQL.ParambyName('Tipo').AsInteger := 1
    else
      SQL.ParamByname('Tipo').AsInteger := 0;
deveria ser:
...
    if RdbBaixa.Checked then
      ParambyName('Tipo').AsInteger := 1
    else
      ParamByname('Tipo').AsInteger := 0;

já que ParamByName é um método do Dataset (TIBQuery) e não da propriedade SQL (TStrings).

Vejo também, que você incluiu um novo parâmetro (Tipo, na cláusula WHERE), porém não o inicializou em lugar algum - tem que fazê-lo antes de chamar ExecSQL.

Mas ainda assim, você iria ter mais uma mensagem de erro, porque tem um monte de coisa seguindo o parâmetro:

SQL.Add('WHERE Codigo = :Codigo, Aluno, Tipo, Parcela, Valor, Vencimento, Emissao ');

O que é que é isto tudo? :huh:

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

robinhocne, lembra que eu disse utilizar outro IBQuery para fazer o update?

Então, você mudou seu dataset que era mostrado no DBGrid para fazer as duas funções. Não vai prestar!

Voce deve continuar mostrando os dados no DBGrid como fazia antes (se não me engano com o DsAluLan) e ter em seu datamodule DtmIza um outro IBQuery com nome UpAluLan (como você o tem agora), mas que será utilizado apenas para aquilo que eu propus ainda há pouco.

No momento, não tenho tempo para lhe fazer uma avaliação mais detalhada, mas sem dúvida você ainda terá muito o que fazer no seu projeto, e muitas dúvidas aparecerão, já que até agora tem poucos recursos (imagino que será mais complexo).

Pelo que vejo, no seu projeto, você está economizando em componentes.

Não há porque ter "medo" de utilizar vários datasets no projeto. Considero mais importante que as coisas estejam claras no código. Quando se começa a utilizar um único dataset para executar todas as coisas (mostrar dados no DBGrids, DBEdits, ... e fazer outras operações SQL) é quase certo que em algum momento vai ter dor de cabeça.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Há entendi Micheus, então eu vou usar uma Query para a busca dos dados e outra que seria a (UpAluLan) para baixar, com os seguintes dados no botão Baixar:

procedure Tfrmalunos.SpbBaixarClick(Sender: TObject);
begin
  with DtmIza.UpAluLan do
  begin
    SQL.Clear;
    SQL.Add('UPDATE Lancamento');  // tabela que terá o campo atualizado
    SQL.Add('SET baixado = :Tipo');  // campo a ser atualizado com valor -> parâmetro
    SQL.Add('WHERE Codigo = :Codigo, Aluno, Tipo, Parcela, Valor, Vencimento, Emissao');  // campo(s) a ser(em) filtrado(s) p/ identificar o registro
// campo da tabela receberá o valor 0 ou 1, conforme o seu radiobox
    if RdbBaixa.Checked then
      ParambyName('Tipo').AsInteger := 1
    else
      ParamByname('Tipo').AsInteger := 0;
    ExecSQL;  // instrução UPDATE é executa com este método, não o Open;
  end;
end;

Os , Aluno, Tipo, Parcela, Valor, Vencimento, Emissao, que você tinha perguntado anteriormente são os outros campos da tabela de Lancamentos.

?Mas umas e muitas duvidas?

Bom no DbGrid eu busco os dados, Ok.

Ai teria que selecionar a linha do grid - da parcela, ela toda para baixar?

Ai teria que clicar no radiobox que coloquei para selecionar para baixar?

E ai teria sim clicava no botão baixar para baixar a promissória?

Obrigado e até mais.

Link para o comentário
Compartilhar em outros sites

  • 0
Há entendi Micheus, então eu vou usar uma Query para a busca dos dados e outra que seria a (UpAluLan) para baixar, com os seguintes dados no botão Baixar:
isto mesmo.

mas ainda está errada a linha que questionei. A cláusula WHERE não pode estar deste jeito:

SQL.Add('WHERE Codigo = :Codigo, Aluno, Tipo, Parcela, Valor, Vencimento, Emissao');

deve ser provavelmente algo assim:

SQL.Add('WHERE Codigo = :Codigo and Vencimento = :Vencimento'); (acho que já identifica unicamente a parcela deste aluno)

e você ainda não passou o parâmetro "Codigo" e "Vencimento" que acrescentei acima, acredito que deveria ficar deste jeito:

procedure Tfrmalunos.SpbBaixarClick(Sender: TObject);
begin
  with DtmIza.UpAluLan do
  begin
    SQL.Clear;
    SQL.Add('UPDATE Lancamento');  // tabela que terá o campo atualizado
    SQL.Add('SET baixado = :Tipo');  // campo a ser atualizado com valor -> parâmetro
        SQL.Add('WHERE Codigo = :Codigo' and Vencimento = :Vencimento);
    ParambyName('Codigo').AsInteger := DtmIza.DsAluLan.FieldByName('Aluno').AsInteger;
    ParambyName('Vencimento').AsDateTime := DtmIza.DsAluLan.FieldByName('Vencimento').AsDateTime;
    if RdbBaixa.Checked then
      ParambyName('Tipo').AsInteger := 1
    else
      ParamByname('Tipo').AsInteger := 0;
    ExecSQL;  // instrução UPDATE é executa com este método, não o Open;
  end;
end;

confira se os campos são estes mesmos, bem como seus tipos (Codigo/Aluno=Integer e Vencimento=Date)

Os , Aluno, Tipo, Parcela, Valor, Vencimento, Emissao, que você tinha perguntado anteriormente são os outros campos da tabela de Lancamentos.
mas como você vê, uma instrução UPDATE não é um SELECT. Voce apenas atualiza as colunas necessárias.

Sugiro que você procure dar uma olhada em apostilas de SQL para conhecer melhor os comandos existentes e como utilizá-los.

?Mas umas e muitas duvidas?

Bom no DbGrid eu busco os dados, Ok. - Positivo!

Ai teria que selecionar a linha do grid - da parcela, ela toda para baixar? - As informações que você obtém com FieldByName do dataset ligado ao seu DBGrid, virão da linha atualmente selecionada. Para que não haja qualquer dúvida e como seu DBGrid é apenas para consulta, sugiro que você habilite na propriedade Options do DBGrid a opção dgRowSelect e dgAlwaysShowSelected. Assim, a linha selecionada ficará bem destacada.

Ai teria que clicar no radiobox que coloquei para selecionar para baixar? - Positivo!

E ai teria sim clicava no botão baixar para baixar a promissória? - Positivo!

Link para o comentário
Compartilhar em outros sites

  • 0
Está dando erro no ...FieldByName

Undeclared Identifier :'FieldByName'
se você não entender o "espírito da coisa" vai ficar complicado...

este: DtmIza.DsAluLan.FieldByName('Vencimento').AsDateTime;

a que me refiro, pode estar errado, mas a idéia é obter o campo Vencimento do dataset ligado ao seu DBGrid. Se ele não se chama DsAluLan ou se não está no datamodule DtmIza, daí é com você.

O importante é que você saiba que FieldByName é um método de um componente tipo dataset (seja Query, Table,...) e não de um TDataSource ou outra coisa. ;)

Link para o comentário
Compartilhar em outros sites

  • 0
Está dando erro no ...FieldByName

Undeclared Identifier :'FieldByName'
se você não entender o "espírito da coisa" vai ficar complicado...

este: DtmIza.DsAluLan.FieldByName('Vencimento').AsDateTime;

a que me refiro, pode estar errado, mas a idéia é obter o campo Vencimento do dataset ligado ao seu DBGrid. Se ele não se chama DsAluLan ou se não está no datamodule DtmIza, daí é com você.

O importante é que você saiba que FieldByName é um método de um componente tipo dataset (seja Query, Table,...) e não de um TDataSource ou outra coisa. ;)

Micheus,

O DsAluLan eu ligaria com o DbGrid ou o DtsAluLan que mostra os dados, pois o resto esta certo!?

Link para o comentário
Compartilhar em outros sites

  • 0
O DsAluLan eu ligaria com o DbGrid ou o DtsAluLan que mostra os dados, pois o resto esta certo!?

quando usando componentes data-aware padrões, você sempre vai ter:

- no componente data-aware, a propriedade DataSource apontando para um componente TDataSource;

- no componente datasource, a propriedade DataSet apontando para um componente dataset tipo Query ou Table (no seu caso TIBQuery ou TIBTable);

- e nestes dataset estarão os campos (fields)

então:

- se DsAluLan é um DataSource;

- se DtsAluLan é um DataSet;

- e se DBGrid é um componente data-aware....

você vai ter:

- a propriedade DataSource do seu DBGrid apontando para DsAluLan;

- a propriedade DataSet do seu DsAluLan apontando para DstAluLan;

e por fim, se DstAluLan é seu dataset, o método ParamByName só pode se aplicar sobre ele.

Então, a linha que acusa erro deve ficar:

...
  ParambyName('Vencimento').AsDateTime := DtmIza.DstAluLan.FieldByName('Vencimento').AsDateTime;
...

Link para o comentário
Compartilhar em outros sites

  • 0
O DsAluLan eu ligaria com o DbGrid ou o DtsAluLan que mostra os dados, pois o resto esta certo!?

quando usando componentes data-aware padrões, você sempre vai ter:

- no componente data-aware, a propriedade DataSource apontando para um componente TDataSource;

- no componente datasource, a propriedade DataSet apontando para um componente dataset tipo Query ou Table (no seu caso TIBQuery ou TIBTable);

- e nestes dataset estarão os campos (fields)

então:

- se DsAluLan é um DataSource;

- se DtsAluLan é um DataSet;

- e se DBGrid é um componente data-aware....

você vai ter:

- a propriedade DataSource do seu DBGrid apontando para DsAluLan;

- a propriedade DataSet do seu DsAluLan apontando para DstAluLan;

e por fim, se DstAluLan é seu dataset, o método ParamByName só pode se aplicar sobre ele.

Então, a linha que acusa erro deve ficar:

...
  ParambyName('Vencimento').AsDateTime := DtmIza.DstAluLan.FieldByName('Vencimento').AsDateTime;
...

Ixi, Micheus fiz errado.

o DtsAluLan eu tinha colocado um componente DataSource:

Deixa eu ver se eu entendi e por favor me corrige:

Porque eu fiz desse tipo, coloquei assim:

>DsAluLan (DataSource) ligando com a IbQuery (UpAluLan)

>DtsAluLan (DataSource) ligando com a IbQuery (QryAluLan)

>DbgLan (DbGrid) ligando com o DtsAluLan para mostrar os dados

Então eu devo ter:

>DsAluLan (DataSource) ligando com a IbQuery (UpAluLan)

>DtsAluLan (DataSet) ?Eu ligarei com qual?

>DbgLan (DbGrid) ?Eu ligarei com qual?

Link para o comentário
Compartilhar em outros sites

  • 0
Ixi, Micheus fiz errado.

o DtsAluLan eu tinha colocado um componente DataSource:

Deixa eu ver se eu entendi e por favor me corrige:

Porque eu fiz desse tipo, coloquei assim:

>DsAluLan (DataSource) ligando com a IbQuery (UpAluLan)

>DtsAluLan (DataSource) ligando com a IbQuery (QryAluLan)

>DbgLan (DbGrid) ligando com o DtsAluLan para mostrar os dados

Vixe digo eu. :o

Sugestão, utilize nomes mais claros para seus componentes. Por exemplo, para um datasource utilize as iniciais DS; para dataset utilize Dst;

Eu costumo prefixar com Qry os datasets do tipo TIBQuery, Tab os do tipo TIBTable e Dst os do tipo TIBDataSet, ... e por aí vai.

Vamos denovo, ao "espírito da coisa":

- de onde vem os dados que são mostrados no seu DBGrid? vem do UpAluLan ou do QryAluLan? Pelas minhas contas vem de QryAluLan!

- para mostrar estes dados de QryAluLan no DBGrid você precisa de um DataSource no meio, não é? Pelas minhas contas poderia/deveria ser o seu DtsAluLan!

então, você terá no seu DBGrid, na propriedade DataSource, o componente DtsAluLan selecionado. Por sua vez, você terá no seu componente DtsAluLan, na propriedade DataSet, o componente QryAluLan selecinado.

Pronto! Agora o seu DBGrid estará mostrando os dados que vem da sua consulta QryAluLan.

O componente UpAluLan só será utilizado para executar a instrução de UPDATE - você não ligará ele a coisa alguma. Então, não precisa de um DataSource para ele. Pelas minhas contas o tal DsAluLan!

Link para o comentário
Compartilhar em outros sites

  • 0
Ixi, Micheus fiz errado.

o DtsAluLan eu tinha colocado um componente DataSource:

Deixa eu ver se eu entendi e por favor me corrige:

Porque eu fiz desse tipo, coloquei assim:

>DsAluLan (DataSource) ligando com a IbQuery (UpAluLan)

>DtsAluLan (DataSource) ligando com a IbQuery (QryAluLan)

>DbgLan (DbGrid) ligando com o DtsAluLan para mostrar os dados

Vixe digo eu. :o

Sugestão, utilize nomes mais claros para seus componentes. Por exemplo, para um datasource utilize as iniciais DS; para dataset utilize Dst;

Eu costumo prefixar com Qry os datasets do tipo TIBQuery, Tab os do tipo TIBTable e Dst os do tipo TIBDataSet, ... e por aí vai.

Vamos denovo, ao "espírito da coisa":

- de onde vem os dados que são mostrados no seu DBGrid? vem do UpAluLan ou do QryAluLan? Pelas minhas contas vem de QryAluLan!

- para mostrar estes dados de QryAluLan no DBGrid você precisa de um DataSource no meio, não é? Pelas minhas contas poderia/deveria ser o seu DtsAluLan!

então, você terá no seu DBGrid, na propriedade DataSource, o componente DtsAluLan selecionado. Por sua vez, você terá no seu componente DtsAluLan, na propriedade DataSet, o componente QryAluLan selecinado.

Pronto! Agora o seu DBGrid estará mostrando os dados que vem da sua consulta QryAluLan.

O componente UpAluLan só será utilizado para executar a instrução de UPDATE - você não ligará ele a coisa alguma. Então, não precisa de um DataSource para ele. Pelas minhas contas o tal DsAluLan!

Exatamente, para a amostra de dados no meu DbGrid eu utilizo o QryAluLan ligando com o DtsAluLan, para a mostra de dados no grid, aqui acho que Ok!

Aqui O componente UpAluLan só será utilizado... , então eu vou ter uma IbQuery (UpAluLan) e não vou ter um DataSource!

Mas sim um IbDataSet?

estou confuso?!?!?

Link para o comentário
Compartilhar em outros sites

  • 0
Aqui O componente UpAluLan só será utilizado... , então eu vou ter uma IbQuery (UpAluLan) e não vou ter um DataSource!
Sim. Voce só precisa de um datasource ligado a este dataset se for utilizá-lo para alguma coisa. Não é o seu caso. Voce vai utilizar este dataset UpAluLan apenas para executar uma instrução SQL (UPDATE) - não vai retornar nada que precise ser mostrado em um DBGrid, por exemplo.

Mas sim um IbDataSet?

estou confuso?!?!?

até eu! :blink:

O IBDataSet foi um papo lá do início, era uma das alternativas (1ª) e se você ler denovo o post#6, verá que faz tempo que estamos falando da 2ª opção (uso de um IBQuery). Não é mesmo?!

Link para o comentário
Compartilhar em outros sites

  • 0
Aqui O componente UpAluLan só será utilizado... , então eu vou ter uma IbQuery (UpAluLan) e não vou ter um DataSource!
Sim. Voce só precisa de um datasource ligado a este dataset se for utilizá-lo para alguma coisa. Não é o seu caso. Voce vai utilizar este dataset UpAluLan apenas para executar uma instrução SQL (UPDATE) - não vai retornar nada que precise ser mostrado em um DBGrid, por exemplo.

Mas sim um IbDataSet?

estou confuso?!?!?

até eu! :blink:

O IBDataSet foi um papo lá do início, era uma das alternativas (1ª) e se você ler denovo o post#6, verá que faz tempo que estamos falando da 2ª opção (uso de um IBQuery). Não é mesmo?!

Há sim, você esta certo!

Então concretizando o que eu entendi:

Vou ter relacionado hà isso:

>Uma IbQuery (QryAluLan) ligado com um DataSource (DtsAluLan) e um DbGrid (DbgLan)ligando no meu DataSource (DtsAluLan) para me mostrar os dados.Ok!

e

>Uma IbQuery (UpAluLan) não ligado a nada, seria para executar a instrução para baixar a aprcela.Ok!

Mas faço assim:

procedure Tfrmalunos.SpbBaixarClick(Sender: TObject);
begin
  with DtmIza.UpAluLan do
  begin
    SQL.Clear;
    SQL.Add('UPDATE Lancamento');  // tabela que terá o campo atualizado
    SQL.Add('SET baixado = :Tipo');  // campo a ser atualizado com valor -> parâmetro
    SQL.Add('WHERE Codigo = :Codigo and Vencimento = :Vencimento');
    ParambyName('Codigo').AsInteger := DtmIza.DtsAluLan.FieldByName('Aluno').AsInteger;
   ParambyName('Vencimento').AsDateTime := DtmIza.DtsAluLan.FieldByName('Vencimento').AsDateTime;
    if RdbBaixa.Checked then
      ParambyName('Tipo').AsInteger := 1
    else
      ParamByname('Tipo').AsInteger := 0;
    ExecSQL;  // instrução UPDATE é executa com este método, não o Open;
  end;
end;

Ai ele dá aquele mesmo erro:

Undeclared Identifier :'FieldByName'
Editado por robinhocne
Link para o comentário
Compartilhar em outros sites

  • 0
Então concretizando o que eu entendi:

Vou ter relacionado hà isso:

>Uma IbQuery (QryAluLan) ligado com um DataSource (DtsAluLan) e um DbGrid (DbgLan)ligando no meu DataSource (DtsAluLan) para me mostrar os dados.Ok!

e

>Uma IbQuery (UpAluLan) não ligado a nada, seria para executar a instrução para baixar a aprcela.Ok!

É isso aí!

Mãos à obra! E vamos para as próximas dúvidas. :D

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, eu seleciono a parcela para baixar e clico no RadioButtons, e ai no botão baixar mas dá esse erro:

UpAluLan:Field 'Aluno' not found

dados do botão atualizado:

procedure Tfrmalunos.SpbBaixarClick(Sender: TObject);
begin
  with DtmIza.UpAluLan do
  begin
    SQL.Clear;
    SQL.Add('UPDATE Lancamento');  // tabela que terá o campo atualizado
    SQL.Add('SET baixado = :Tipo');  // campo a ser atualizado com valor -> parâmetro
    SQL.Add('WHERE Codigo = :Codigo and Vencimento = :Vencimento');
    ParambyName('Codigo').AsInteger := DtmIza.UpAluLan.FieldByName('Aluno').AsInteger;
   ParambyName('Vencimento').AsDateTime := DtmIza.UpAluLan.FieldByName('Vencimento').AsDateTime;
    if RdbBaixa.Checked then
      ParambyName('Tipo').AsInteger := 1
    else
      ParamByname('Tipo').AsInteger := 0;
    ExecSQL;  // instrução UPDATE é executa com este método, não o Open;
  end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

voltamos ao "espírito da coisa" (já não está parecendo a piadinha de todo o domingo no fantástico: "Nunca na história deste país...") :P

Voce lembra que o objetivo o update é atualizar os dados do registro visualizado no DBGrid? Então, de onde é mesmo que tem que vir as informações do campo selecionado no DBGrid? Eu acho que é do dataset que está ligado a ele - QryAluLan.

Então por que é que você ao invés de trocar o texto DtsAluLan ali do post#23 (que é o datasource) por QryAluLan, voce foi justamente trocar pelo UpAluLan (que o seu IBQuery para execução do UPDATE)?

só para não ficar dúvida: troque as linhas:

ParambyName('Codigo').AsInteger := DtmIza.UpAluLan.FieldByName('Aluno').AsInteger;

ParambyName('Vencimento').AsDateTime := DtmIza.UpAluLan.FieldByName('Vencimento').AsDateTime;

por

ParambyName('Codigo').AsInteger := DtmIza.QryAluLan.FieldByName('Aluno').AsInteger;

ParambyName('Vencimento').AsDateTime := DtmIza.QryAluLan.FieldByName('Vencimento').AsDateTime;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...