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

Filtrar e depois Trasferir Vários Dados


MagoDanger

Pergunta

Pessoal, estou com um pequeno problema entre filtrar e transferir vários dados de uma tabela para outra.

tenho aqui a tabela aonde os recibos são gerados: tbl_pag_inq e a tabela para onde os dados devem ir que é: tbl_gerados_inq

fiz um filtro por data de vencimento (tem varias datas diferentes de vencimento de um cliente dentro do mes, então esse filtro pega tudo o que vence dentro do mes, independente do dia)

Esse filtro está tudo certo e funcionado. Ficou assim:

var
  Present: TDateTime; dataini, datafim : Tdate;
  Ano, Mes, Dia : Word;
begin
  dm.q_pag_inq.First;
  Present:= EndOfTheMonth(Date);
  DecodeDate(Present, Ano, Mes, Dia);
  dataini := StartOfTheMonth(Date);
  datafim := EndOfTheMonth(Date);
  DateEdit1.Date := dataini;
  DateEdit2.Date := datafim;
begin
with dm.q_pag_inq do
begin
 Close;
 SQL.Clear;
 SQL.Add('select * from tbl_pag_inq where vencimento Between :dataini and :datafim');
 SQL.Add('AND id_inq = ' + QuotedStr(f_cad_inquilinos.Edt_inq.Text));
 SQL.Add('AND baixados = ' + QuotedStr(f_cad_inquilinos.edt_baixa.Text) + 'order by vencimento asc');
 Parameters.ParamByName('dataini').Value := DateEdit1.date;
 Parameters.ParamByName('datafim').Value := DateEdit2.date;
 Open;

end; end; end;
*** até aqui eu fiz o filtro, gera o recibo tudo certinho... porém, quando o usuario solicitar esse filtro dos pagamentos abertos no mes e gerar recibos todos os valores devem ser transferidos para uma outra tabela (tbl_gerados_inq)... e é aqui que eu não consigo. depois de toda essa programação ai em cima, tentei fazer isso:
begin
dm.q_pag_inq.Close;
dm.q_pag_inq.sql.Clear;
dm.q_pag_inq.sql.add('INSERT INTO tbl_gerados_inq SELECT * FROM tbl_pag_inq where vencimento between :dataini and :datafim');
dm.q_pag_inq.SQL.Add('AND id_inq = ' + QuotedStr(f_cad_inquilinos.Edt_inq.Text)); //aqui ele filtra pelo codigo do cliente
dm.q_pag_inq.SQL.Add('AND baixados = ' + QuotedStr(f_cad_inquilinos.edt_baixa.Text) + 'order by vencimento asc'); //aqui ele filtra os campos que estão como baixados "N"
dm.q_pag_inq.ExecSQL;

** não dá erro... mas também não funciona

*** Além de transferir somente os dados filtrados, precisaria também alterar todos os campos BAIXADOS de "N" para "A" dos que forem ser transferidos. //essa parte eu nem tenho ideia de como fazer

Os nome das Querys:

tbl_gerados_inq -> q_gerados_inc

tbl_pag_inq -> q_pag_inq

Obs: As 2 tabelas criei exatamente iguais

Obrigado!!!

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0
quando o usuario solicitar esse filtro dos pagamentos abertos no mes e gerar recibos todos os valores devem ser transferidos para uma outra tabela (tbl_gerados_inq)...

se voce já tem os dados resultantes de uma sql, e quer Copiar registro de uma tabela para outra faça:

usando table

while not Table2.Eof do 
begin
  Table1.Fields[0].value := Table2.Fields[0].value
  table2.next
end
ou usando query
while not Query1.Eof do 
begin
  Query2.Fields[0].value := Query1.Fields[0].value
  Query1.next
end
ou usando ClientDataSet1
while not ClientDataSet1.Eof do 
begin
  ClientDataSet2.Fields[0].value := ClientDataSet1.Fields[0].value
  ClientDataSet1.next
end

OBS: a estrutura de ambas as tabelas deve ser a mesma.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu fiz umas alterações aqui mas não deu certo isso ai... dexa eu explicar o que eu fiz... :wacko:

Tem um botão que filtra todos os vencimentos do mês e soma os resultados (Crédito - Débito), assim:

Esse está funcionando tudo certinho....

var
  Present: TDateTime; dataini, datafim : Tdate;
  Ano, Mes, Dia : Word;
  somac : Double;
  somad : Double;
  resultado : Double;
begin
  somac:=0;
  somad:=0;
  dm.q_pag_inq.First;
  Present:= EndOfTheMonth(Date);
  DecodeDate(Present, Ano, Mes, Dia);
  dataini := StartOfTheMonth(Date);
  datafim := EndOfTheMonth(Date);
  DateEdit1.Date := dataini;
  DateEdit2.Date := datafim;
begin
with dm.q_pag_inq do
begin
 Close;
 SQL.Clear;
 SQL.Add('select * from tbl_pag_inq where vencimento Between :dataini and :datafim');
 SQL.Add('AND id_inq = ' + QuotedStr(f_cad_inquilinos.Edt_inq.Text));
 SQL.Add('AND baixados = ' + QuotedStr(f_cad_inquilinos.edt_baixa.Text) + 'order by vencimento asc');
 Parameters.ParamByName('dataini').Value := DateEdit1.date;
 Parameters.ParamByName('datafim').Value := DateEdit2.date;
 Open;
 while not dm.q_pag_inq.Eof do
begin
  if dm.q_pag_inq.fieldbyname('tipo').AsString = 'C' then
  somac := somac + dm.q_pag_inq.Fieldbyname('valor').AsFloat
else
  somad := somad + dm.q_pag_inq.Fieldbyname('valor').AsFloat;
  dm.q_pag_inq.Next;
  label3.Caption := FloatToStrF(somac,ffCurrency , 15,2);
  label4.Caption := FloatToStrF(somad,ffCurrency , 15,2);
  resultado := (somad - somac);
  label5.Caption := FloatToStrF(resultado,ffCurrency , 15,2);
  bt_gerar.Visible := true;
end; end;  end; end;
Depois disso tem um outro botão que gera o recibo... e somente depois que o cliente pedir pra gerar recibo é que deve transferir os dados filtrados... esse botão está assim:
begin
qr_rec_inq := Tqr_rec_inq.Create(Self);
qr_rec_inq.qr_total.Caption := f_rec_inq.Label5.Caption;
qr_rec_inq.qr_locatario.caption := f_cad_inquilinos.DBEdit2.Text;
qr_rec_inq.qr_endereco.caption := f_cad_inquilinos.db_endereco.Text;
qr_rec_inq.qr_bairro.caption := f_cad_inquilinos.db_bairro.Text;
qr_rec_inq.qr_n.caption := f_cad_inquilinos.db_n.Text;
begin
  qr_rec_inq.QRImage1.Picture.Bitmap := Nil;
  if dm.q_config.Fields.FieldByName('logo').AsString <> '' then
  if FileExists(dm.q_config.fields.fieldbyname('logo').AsString) then
  qr_rec_inq.QRImage1.Picture.LoadFromFile(dm.q_config.fields.fieldbyname('logo').AsString);
  qr_rec_inq.QuickRep1.Preview;
  begin
while dm.q_pag_inq.Eof do
begin
  dm.q_gerados_inq.Fields[0].value := dm.q_pag_inq.Fields[0].value;
  dm.q_pag_inq.next;
f_rec_inq.close;
end; end; end; end;

Ele gera o recibo com os dados filtrados anteriormente e o valor final, tudo certo... mas não transfere os dados...

aparece o seguinte erro:

q_gerados_inq: Dataset not in edit or insert mode

o que tem de errado?

=////

obrigado novamente!!

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

q_gerados_inq: Dataset not in edit or insert mode

O DataSet não esta em modo de edição ou inserção

experimente assim:

while dm.q_pag_inq.Eof do
begin
  dm.q_gerados_inq.Last; 
  dm.q_gerados_inq.append;
  dm.q_gerados_inq.Edit;
  dm.q_gerados_inq.Fields[0].value := dm.q_pag_inq.Fields[0].value;
  dm.q_pag_inq.next;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

humm...

ainda não deu certo...

ele trava o sistema, copia apenas o campo id_inq e o resto não copia nada... e fica inserindo sem apra isso no banco de dados.. criou quase 23 mil registros... rss....

oque qsera que tem de errado?

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

var
  i: integer;
  NomeCampo: String;
begin
  dm.q_pag_inq.First;
  While Not dm.q_pag_inq.Eof Do 
     Begin
        dm.q_gerados_inq.Append;
        For i := 0 To dm.q_pag_inq.FieldCount - 1 Do 
            Begin
                NomeCampo := dm.q_pag_inq.Fields[i].FieldName;
                dm.q_gerados_inq.FieldbyName(NomeCampo).Value := 
                dm.q_pag_inq.FieldbyName(NomeCampo).Value;
            End;
        dm.q_gerados_inq.Post; 
        dm.q_pag_inq.Next;
        Application.ProcessMessages;
     End;
End;
Essa rotina só vai funcionar se as tabelas estiverem a mesma estrutura. Se você estiver usando interbase, pode usar um comando mais simples
insert into tabela2
select * from tabela1

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

olá amigo...

copiei essa programação que você passou mas dai ele só copiava 1 ...

então tirei isso aqui:

Application.ProcessMessages;

ai agora ta certinho copiando tudo.... tem algum problema sem isso ai?

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

ixi...

só que agora eu precisaria deletar as informações da tabela anterior...

coloquei um

dm.q_pag_inq.Delete;
depois do
dm.q_gerados_inq.Post;

mas dai ele só transfere 1 e deleta ele... paro de transferir tudo!!!

=///

como faço pra deletar todos os filtrados e transferidos??

Link para o comentário
Compartilhar em outros sites

  • 0

Todas essas dúvidas voce tira lendo as apostilas de delphi...

delete from tabela
with dm.q_pag_inq do
begin
   Close;
   SQL.Clear;
   SQL.Add('delete from dm.q_gerados_inq where vencimento Between :dataini and :datafim');
   SQL.Add('AND id_inq = ' + QuotedStr(f_cad_inquilinos.Edt_inq.Text));
   SQL.Add('AND baixados = ' + QuotedStr(f_cad_inquilinos.edt_baixa.Text) + 'order by vencimento asc');
   Parameters.ParamByName('dataini').Value := DateEdit1.date;
   Parameters.ParamByName('datafim').Value := DateEdit2.date;
   Open;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

eu pensei que tinha um jeito mais simples pra colocar junto aqui:

begin  //transfere todos os filtrados
  dm.q_pag_inq.First;
  While Not dm.q_pag_inq.Eof Do
     Begin
        dm.q_gerados_inq.Append;
        For i := 0 To dm.q_pag_inq.FieldCount - 1 Do
            Begin
                NomeCampo := dm.q_pag_inq.Fields[i].FieldName;
                dm.q_gerados_inq.FieldbyName(NomeCampo).Value :=
                dm.q_pag_inq.FieldbyName(NomeCampo).Value;
            End;
        dm.q_gerados_inq.Post;
        dm.q_pag_inq.Next;
fiz isso logo apos essa instrução.. mas não da certo =/
begin
with dm.q_pag_inq do
begin
   Close;
   SQL.Clear;
   SQL.Add('delete from tbl_pag_inq where vencimento Between :dataini and :datafim');
   Parameters.ParamByName('dataini').Value := DateEdit3.date;
   Parameters.ParamByName('datafim').Value := DateEdit4.date;
   Open;
end;

aparece o erro:

o provedor atual não oferece suoprte para retornar varios conjuntos de registros de uma unica execução
Link para o comentário
Compartilhar em outros sites

  • 0
eu pensei que tinha um jeito mais simples

e tem, mas voce tem que saber extamente o que quer e como quer fazer

exemplo:

delete from tabela

deleta todos os registros de uma tabela, mas se voce não quer deletar todos os registros, voce tem que usar a clausula where para selecionar somente aqueles que deseja apagar.

http://www.edudelphipage.com.br/dicas_text...ia=3&busca=

http://www.greatis.com/delphicb/tips/lib/d...-copytable.html

OBS: mas como eu disse, voce deve ler mais sobre o delphi

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

olá amigo...

olha quase deu certo assim:

seguindo as coisas que você me ajudou

begin  //transfere todos os filtrados
  dm.q_pag_inq.First;
  While Not dm.q_pag_inq.Eof Do
     Begin
        dm.q_gerados_inq.Append;
        For i := 0 To dm.q_pag_inq.FieldCount - 1 Do
            Begin
                NomeCampo := dm.q_pag_inq.Fields[i].FieldName;
                dm.q_gerados_inq.FieldbyName(NomeCampo).Value :=
                dm.q_pag_inq.FieldbyName(NomeCampo).Value;
            End;
        dm.q_gerados_inq.Post;
        dm.q_pag_inq.Next;
        

begin //acrescentei isso para deletar
  with dm.q_pag_inq do
    while RecordCount > 0 do
      Delete;
end;

end; end; end; end;  end;
agora sim ele deleta todos os dados filtrados... só que vamos supor: filtro 2 dados da tabela ele transfere só 1 e deleta os 2... como fazer pra primeiro ele transferir tudo e só depois deletar? obrigado mais uma vez PS: coloquei isso em um botao separado:
begin //acrescentei isso para deletar
  with dm.q_pag_inq do
    while RecordCount > 0 do
      Delete;
end;

então se eu clicar no botao gerar (que filtra e transfere os dados pra oura tabela)

e depois clicar nesse botao deletar... ai da tudo certo...

mas quando coloca junto no mesmo botão... ai não da!

=///

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

procedure TForm1.Button1Click(Sender: TObject);
begin  //transfere todos os filtrados
  dm.q_pag_inq.First;
  While Not dm.q_pag_inq.Eof Do
     Begin
        dm.q_gerados_inq.Append;
        For i := 0 To dm.q_pag_inq.FieldCount - 1 Do
            Begin
                NomeCampo := dm.q_pag_inq.Fields[i].FieldName;
                dm.q_gerados_inq.FieldbyName(NomeCampo).Value :=
                dm.q_pag_inq.FieldbyName(NomeCampo).Value;
            End;
        dm.q_gerados_inq.Post;
        dm.q_pag_inq.Next;
     End; // finaliza o while

  //acrescentei isso para deletar
  with dm.q_pag_inq do
    while RecordCount > 0 do
      Delete;
   end;
end;

toma cuidado com esses Ends;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

montei tudo aqui, mas na hora da baixa tive um problema que não havia pensando antes...

pra transferir do aberto pra baixa usei esse mesmo esquema:

var
  i: integer;
  NomeCampo: String;
begin  //transfere todos os filtrados
  dm.q_gerados_inq.First;
  While Not dm.q_gerados_inq.Eof Do
     Begin
        dm.q_baixa_inq.Append;
        For i := 0 To dm.q_gerados_inq.FieldCount - 1 Do
            Begin
                NomeCampo := dm.q_gerados_inq.Fields[i].FieldName;
                dm.q_baixa_inq.FieldbyName(NomeCampo).Value :=
                dm.q_gerados_inq.FieldbyName(NomeCampo).Value;
            End;
        dm.q_baixa_inq.Post;
        dm.q_gerados_inq.Next;
        End;
  with dm.q_gerados_inq do
    while RecordCount > 0 do
      Delete;
      end;

só que a tabela de baixados tem um campo a mais que é o "data_baixa"

essa data fica preenchida na edit - edt_data

como faço pra alem de transferir todos pra oura tabela, também jogar em todos campos "data_baixa" a data que foi preenchida no edt_data?

desculpa por tantas perguntas.....

obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá MagoDanger

Deixa eu me meter na conversa....

acho que é so você adicionar a linha do campo antes do dm.q_baixa_inq.Post;

ficando assim:

var
  i: integer;
  NomeCampo: String;
begin  //transfere todos os filtrados
  dm.q_gerados_inq.First;
  While Not dm.q_gerados_inq.Eof Do
     Begin
        dm.q_baixa_inq.Append;
        For i := 0 To dm.q_gerados_inq.FieldCount - 1 Do
            Begin
                NomeCampo := dm.q_gerados_inq.Fields[i].FieldName;
                dm.q_baixa_inq.FieldbyName(NomeCampo).Value :=
                dm.q_gerados_inq.FieldbyName(NomeCampo).Value;
            End;
        dm.q_baixa_inq.FieldbyName('data_baixa').Value := StrToDate(edt_data.text);
        dm.q_baixa_inq.Post;
        dm.q_gerados_inq.Next;
        End;
  with dm.q_gerados_inq do
    while RecordCount > 0 do
      Delete;
      end;

Abs. Progr'amador

Link para o comentário
Compartilhar em outros sites

  • 0

e lá vem outra dúvida!!

=//

hoje fazendo uns testes aqui no sistema surgiu um outro pequeno problema... testei fazer umas coisas aqui, mas não funcionou não..

vamos supor que eu gerei 24 parcelas de R$ 600,00

1/24 - R$ 600,00

2/24 - R$ 600,00

3/24 - R$ 600,00

... e assmi por diante.

só que surgiu um reajuste a partir da 8 parcela de R$ 50,00

como faço para fazer assim, digitar 650,00 em um campo, e no outro informar 8/24 até 24/24

e o sisetma trocar o valor de todas essas parcelas nesse intervalo...

8/24 - R$ 650,00

9/24 - R$ 650,00 e assim por diante?

obrigado mais uma vez... :blush:

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

Olá MagoDanger,

usando a logica do seu tópico anterior --> (Resolvido) Gerar Pagamentos

ficaria +ou- assim:

var valor, valor2 : real; venc, qtde_parc, i, valor2Ini, valor2Fim : integer; s : string;
begin
  valor := StrToFloat(Edit1.text);
  valor2 := 650,00;
  valor2Ini := 8;
  valor2Fim := 24;
  Venc := StrToFloat (Edit2.text);
  parcelas := StrToInt(Edit3.text);
  memo1.Clear;
  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  Present:= Now;  //  coloque a data inicial aqui ( no lugar do now )
  DecodeDate(Present, Year, Month, Day);
  mes := month;

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        // Atribuir os valores das variaveis aos campos do registro na tabela

        if mes > 11 then
           begin
              mes := 1;
              Year := Year + 1;
           end
        else
           inc(mes);

        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String

        if (i >= valor2Ini) and (i <= valor2Fim) then
           ClientDataSet1Valor.Value      :=  valor2  // campo Float
        else ClientDataSet1Valor.Value      :=  valor;  // campo Float

        ClientDataSet1Vencimento.Value :=  strtodate(IntToStr(Day) + '/' + IntToStr(Mes) + '/' + IntToStr(Year)));  // campo Data
        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

    end;

Abs. Progr'amador

Editado por Progr'amador
Link para o comentário
Compartilhar em outros sites

  • 0

boa noite!

Pessoal ,não deu certo aqui...

Montei a tela:

Valor Anterior - edt_valor1.text

Novo Valor - edt_valor2.text

Parcela De - edt_par.text

Até - edt_ate.text

Depois no botão Reajustar, coloquei o seguinte:

var
  valor, valor2, valor2Ini, valor2Fim  : real;
  i : integer;
begin
  valor := StrToFloat(edt_valor1.text);
  valor2 := StrToFloat(edt_valor2.text);
  valor2Ini := StrToFloat(edt_par.text);
  valor2Fim := StrToFloat(edt_ate.text);

  dm.q_pag_inq.Active := false;
  dm.cds_pag_inq.Active := false;
  dm.q_pag_inq.Active := true;
  dm.cds_pag_inq.Active := true;

     begin

        dm.cds_pag_inq.Edit;  // editar registro

        if (i >= valor2Ini) and (i <= valor2Fim) then
               dm.cds_pag_inqValor.Value      :=  valor2  
        else   dm.cds_pag_inqValor.Value      :=  valor;  

          dm.cds_pag_inq.Post;  // salvar o registro
        //  dm.cds_pag_inq.ApplyUpdates(-1);// atualizar o registro
 end; end;

Dai então preenchi nos campos que citei acima:

Valor Anterior - 852,00

Novo Valor - 900,00

Parcela De - 5

Até - 9

Mas não acontece nada, não atualiza os valores e também não mostra nenhum erro... O que fiz de errado?

valeu....

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

estava me referindo a esse post e tambem ao outro que o amigo Prog'amador já citou para voce

usando a logica do seu tópico anterior --> (Resolvido) Gerar Pagamentos

voce tem que ter uma visão global do sistema ... olhe com calma que voce resolve o problema

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
boa noite!

Pessoal ,não deu certo aqui...

...

...

...

Dai então preenchi nos campos que citei acima:

Valor Anterior - 852,00

Novo Valor - 900,00

Parcela De - 5

Até - 9

Mas não acontece nada, não atualiza os valores e também não mostra nenhum erro... O que fiz de errado?

Olá MagoDanger,

Uma forma de entender como seu programa ta trabalhando, é usando o DEBUG.

Execulte o seu projeto e vai debugando (F8) linha por linha, que você vai encontrar o erro/falha, essa é uma forma bem eficaz de se fazer uma analize no seu código.

Abs. Progr'amador

Editado por Progr'amador
Link para o comentário
Compartilhar em outros sites

  • 0

pessoal, não consigo de jeito nenhum fazer isso...

porque na programação tem last? é pra ir no ultimo registr?

porque append se eun ão quero inserir nada?

porque tem que fazer todo calculo de mes e acrescentar +??

não to entendendo nada, por favor me ajudem

eu só quero reajustar parcelas... se foram 24 parcelas geradas

e eu quero que a parcela de 12/24 até a 17/24 (por exemplo) passe de R$ 600,00 para R$ 650,00 só quero alterar o valor... data de vencimento, numero da parcela vai continuar a mesma...

como posso fazer isso?

=///

obrigado!

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,5k
×
×
  • Criar Novo...