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

Ahhhhh, agora você falou o que você quer na verdade, olha uma coisa é inserir novo registro outra coisa é editar um registro.

Num post acima, onde mostrei um exemplo, usei seu proprio tópico onde ta inserindo novos registros, só implementei esse novo critério.

Deixa eu ver se entendi:

Primeiro você gera as parcelas, tudo igualzinho, ae DEPOIS você altera o valor de determinadas parcelas???? é isso mesmo?

bom... se for isso, seria algo +ou- assim:

while not ClientDataSet1.Eof do begin
     ClientDataSet1.Edit;

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

     ClientDataSet1.ApplyUpdates(-1);// atualizar o registro
     ClientDataSet1.Next;
  end;

tenta ae... a ideia seria basicamente essa.

Abs. Progr'amador

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

  • 0

olá amigo, estou indo agora pra uma reunião com cliente, voltando vou testar e posto o resultado aqui.

acho que essas dúvidas que estou tendo devem ser na verdade até que um tanto quanto básicas, o "problema" é que na verdade eu sou publicitário e tenho também uma gráfica... agora terminando minha pós no final do ano, ano que vem vou fazer um curso de programação e ter mais tempo pra estudar tb. mas como tenho urgencia nesse sistema estou recorrendo as duvidas aqui... por isso agradeço a todos vocês pela força que estão dando. porém mesmo assim sempre que sobra um tempo estou pegando coisas pra estudar.

valeu mesmo, abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

tentei fazer o seguinte, mas não deu muito certo..

var
  valor, valor2  : real;
  id, i : string;
  valor2Ini, valor2Fim  : string;
begin
 while not dm.cds_pag_inq.Eof do begin
     dm.cds_pag_inq.Edit;

     id := f_cad_inquilinos.DBEdit1.text; // aqui a idéia era ele filtrar somente as aprcelas que são da ID de um determinado cliente
     valor2 := StrToFloat(edt_valor1.text); // aqui é o valor antigo
     valor := StrToFloat(edt_valor2.text); // aqui é o novo valor
     valor2Ini := edt_par.text; // aqui seria  a parcela DE
     valor2Fim := edt_ate.text; //aqui seria a parcela ATE

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

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

bom, o resultado é que ele troca de tudo o valor, independente do numero da parcela que você coloca e independente da ID que pertence a parcela.

como arrumo isso?

valeu!!

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

  • 0

Faça exatamente assim:

var
  valor, valor2  : real;
  id : string;
  valor2Ini, valor2Fim, i  : integer;
begin
  i := 0;
  id := f_cad_inquilinos.DBEdit1.text;
  valor2 := StrToFloat(edt_valor1.text); // aqui é o valor antigo
  valor := StrToFloat(edt_valor2.text); // aqui é o novo valor
  valor2Ini := StrToInt(edt_par.text); // aqui seria  a parcela DE
  valor2Fim := StrToInt(edt_ate.text); //aqui seria a parcela ATE

  with dm do begin
     cds_pag_inq.Filtered := False;
     cds_pag_inq.Filter := 'id_inq='+id;
     cds_pag_inq.Filtered := True;

     cds_pag_inq.First;
     while not cds_pag_inq.Eof do begin
        inc(i);
        cds_pag_inq.Edit;

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

        cds_pag_inq.ApplyUpdates(-1);// atualizar o registro
        cds_pag_inq.Next;
     end;
     cds_pag_inq.Filter := '';
     cds_pag_inq.Filtered := False;
  end;
end;

Ae qualquer coisa, é só postar.

Abs. Progr'amador

Link para o comentário
Compartilhar em outros sites

  • 0

olá amigo, isso deu certo pra trocar os valores de um determinado cliente, porém ele ainda troca de tudo não obedece o valor de tal aprcela a tal.

será que é porque estamos fazendo a "pesquisa e troca" por (exempo) de 8 até 15 e não de 8/36 até 15/36?

pois quando geramos parcelas, o campo nº da parcelafica gravado assim:

1/36

2/36....

valeu...

Link para o comentário
Compartilhar em outros sites

  • 0

Ola,

Se você tiver usando exatamente o código que te passei, deveria da certo.

Primeiro que declarei as variaveis valor2ini, valor2fim e i tipo integer, sendo assim não teria como nenhuma desses varaveis receber um valor desse tipo (1/36), e com certeza daria erro.

O codigo que postei funciona dessa forma:

Variaveis valor2ini, valor2fim recebem valores inteiros, exemplo: 8 e 15 (cada uma).

A variavel i tb recebe valor inteiro, que no caso é incrementado em casa loop ( inc(i) ).

To testanto essas 3 variaveis, em nenhum momento testei o campo da tabela diretamente.

Postae o codigo que você ta usando.

Abs. Progr'amador

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

  • 0

olá, então eu copiei o codigo e colei...

é que assim, dexa eu tentar explicar melhor...

eu tenho o botão Gerar aqui que ele gera todas as parcelas..

mas esse botão Gerar grava na tabela, no campo parcela assim:

1/36

2/36

ai o botão Reajustar (essa programação que você me passou), ele procura somente o número interito (integer) parcela 8, não é?

mas na verdade no banco de dados está gravado 8/36... será que não é por isso que não está funcionando?

não sei se consegui explicar...

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

  • 0

Olá MagoDanger,

Ok, então vamos usar o campo da tabela.

mas só verifica se ta correto o nome do campo que usei no código: cds_pag_inqparcelas.Value

var
  valor, valor2  : real;
  id : string;
  valor2Ini, valor2Fim, i  : integer;
begin
  i := 0;
  id := f_cad_inquilinos.DBEdit1.text;
  valor2 := StrToFloat(edt_valor1.text); // aqui é o valor antigo
  valor := StrToFloat(edt_valor2.text); // aqui é o novo valor
  valor2Ini := StrToInt(edt_par.text); // aqui seria  a parcela DE
  valor2Fim := StrToInt(edt_ate.text); //aqui seria a parcela ATE

  with dm do begin
     cds_pag_inq.Filtered := False;
     cds_pag_inq.Filter := 'id_inq='+id;
     cds_pag_inq.Filtered := True;


     cds_pag_inq.First;
     while not cds_pag_inq.Eof do begin

        i := StrToInt(Copy(cds_pag_inqparcelas.Value,1,pos('/',cds_pag_inqparcelas.Value)-1));

        cds_pag_inq.Edit;

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

        cds_pag_inq.ApplyUpdates(-1);// atualizar o registro
        cds_pag_inq.Next;
     end;
     cds_pag_inq.Filter := '';
     cds_pag_inq.Filtered := False;
  end;
end;

Abs. Progr'amador

;)

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia amigo!

Acabei de testar, mas ainda não deu certo...

Se eu preencho os campos "DE" e "ATE" assim: DE: 3/10 ATÉ: 6/10 aparece que esse não é um valor válido (integer)

Se eu coloco apenas DE: 3 ATÉ: 6 ele subistitui apenas os últimos 3 registros...

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia amigo!

Acabei de testar, mas ainda não deu certo...

Se eu preencho os campos "DE" e "ATE" assim: DE: 3/10 ATÉ: 6/10 aparece que esse não é um valor válido (integer)

Se eu coloco apenas DE: 3 ATÉ: 6 ele subistitui apenas os últimos 3 registros...

Olá MagoDanger,

Estranho, colocando somento os numero (3 e 6) deveria funcionar.

você já fez o teste, debugando se entra esse IF, quando chega nesse intervalo de valores ?

if (i >= valor2Ini) and (i <= valor2Fim) then

cds_pag_inqValor.Value := valor2

pode ser algum falha no momento da gravação do registro.

Abs. Progr'amador

Link para o comentário
Compartilhar em outros sites

  • 0

então velinho, será que não daria pra no campo DE e no ATE ser preenchido assim: DE 5/36 ATE 8/36

porque para o mesmo cliente, as vezes tem outros pagamentos, por exemplo:

IPTU:

1/10

2/10

DESCONTO:

1/36

2/36

..... se colocar só, por exemplo

5 até 8... ele substituiria de todos os lançamentos... quando deveria só modificar da mensalidade...

(não sei se consegui explicar direito)...

obrigadoo!

Link para o comentário
Compartilhar em outros sites

  • 0

Ok,

Então tente essa loucura ae: :rolleyes:

var
  valor, valor2  : real;
  a, b, i, x : integer;
  valor2Ini, valor2Fim, ttparc, id  : string;
  parc_alt: array[1..100] of String;

  function StrZero(Valor:string; QtdZero:integer):String;
  var
    I,Tamanho:integer;
    aux: string;
  begin
    aux:=Valor;
    Tamanho:=length(Valor);
    Valor:='';
    for I:=1 to QtdZero-tamanho do
    Valor:=Valor+'0';
    aux:=Valor+aux;
    StrZero:=aux;
  end;

begin

  id := f_cad_inquilinos.DBEdit1.text;
  valor2 := StrToFloat(edt_valor1.text); // aqui é o valor antigo
  valor := StrToFloat(edt_valor2.text); // aqui é o novo valor
  valor2Ini := edt_par.text); // aqui seria  a parcela DE
  valor2Fim := edt_ate.text); //aqui seria a parcela ATE

  a := StrToInt(Copy(valor2Ini,1,pos('/',valor2Ini)-1));
  b := StrToInt(Copy(valor2Fim,1,pos('/',valor2Fim)-1));
  ttparc := Copy(valor2Ini,pos('/',valor2Ini)+1,2);
  x := 0;
  for i:=a to b do begin
     inc(x);
     parc_alt[x] := StrZero(IntToStr(i),2)+'/'+ttparc;
  end;

  with dm do begin
     cds_pag_inq.Filtered := False;
     cds_pag_inq.Filter := 'id_inq='+id;
     cds_pag_inq.Filtered := True;

     for i := 1 to x do begin
        if cds_pag_inq.locate('parcelas',parc_alt[i],[]) then begin
           cds_pag_inq.Edit;
           cds_pag_inqValor.Value := valor2;
           cds_pag_inq.ApplyUpdates(-1);// atualizar o registro
        end;
     end;

     cds_pag_inq.Filter := '';
     cds_pag_inq.Filtered := False;
  end;
end;

Abs. Progr'amador.

Link para o comentário
Compartilhar em outros sites

  • 0

vixi, tão se esgotandos meus cartuchos! ^_^

Deste de o inicio tinha um erro bobo no código (falta de atenção).

O parametro valor2 recebia o valor do edt_valor1.text que seria o valor antigo, e o parametro valor recebia o novo valor, ou seja, tava invertido, já que eu estava utilizando o valor2 para atualizar os regtistros.

De qualquer forma ae vai mais um modo, que é até mais simples.

var
  valor : real;
  id, parcIni, parcFim : string;
begin
  id := f_cad_inquilinos.DBEdit1.text;
  valor := StrToFloat(edt_valor2.text); // aqui é o novo valor
  parcIni := edt_par.text; // aqui seria  a parcela DE --formato: 00/00
  parcFim := edt_ate.text; //aqui seria a parcela ATE --formato: 00/00
  with dm do begin
     // filtra o ID e o intervalo das parcelas a serem alteradas. 
     cds_pag_inq.Filtered := False;
     cds_pag_inq.Filter := 'id_inq='+id+' and parcelas >= '+QuotedStr(parcIni)+' and parcelas <= '+QuotedStr(parcFim);
     cds_pag_inq.Filtered := True;

     cds_pag_inq.First;
     while not cds_pag_inq.Eof do begin
        cds_pag_inq.Edit;
        cds_pag_inqValor.Value := valor;
        cds_pag_inq.ApplyUpdates(-1);// atualizar o registro
        cds_pag_inq.Next;
     end;
     cds_pag_inq.Filter := '';
     cds_pag_inq.Filtered := False;
  end;
end;
se não de certo, ae temos que mudar o esquema, adicione outra query pra execultar um UPDATE nesses registros dessa forma:
qryUpdate.SQL.Close;
  qryUpdate.SQL.Clear;
  qryUpdate.SQL.Add('update NomeDaTabela set valor = '+QuotedStr(FloatToStr(valor)));
  qryUpdate.SQL.Add('where parcelas >= '+QuotedStr(parcIni)+' and parcelas <= '+QuotedStr(parcFim)+'');
  qryUpdate.SQL.Add('  and id_inq='+QuotedStr(id));
  qryUpdate.SQL.ExecSQL;

Se dê erro você fala, é que to um pouco ocupado e fiz com muito pressa.

Abs. Progr'amador

Editado por Progr'amador
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...