Fórum Devo usar select ou um view? #59832

27/05/2008

0

Pessoal, fiz esta select aqui para trazer alguns resultados que eu preciso, de um plano de contas que ja peguei montado, e precisava trazer o resultado dos movimentos lancados + as contas do plano de contas contabil.

Esta funcionando certinho o select

procedure TFmmAnoBalanco.acConfirmaExecute(Sender: TObject);
begin
  begin
    if Trim(Edit1.Text) = ´´ then
    begin
      raise Exception.Create(´Não existe dados para este ano´);
      Abort;
    end
    else
    begin
      {:Busca sempre o primeiro dia do ano}
      Label1.Caption := ´01/01/´+Edit1.Text;
      With dm.qrybalanco do
      begin
        close;
        sql.clear;
        sql.Text := ´ select distinct(substring(x.conta from 1 for 1)) Conta,  ´+
                    ´ x.nmconta, x.saldo_anterior, x.recebimento, x.pagamento, ´+
                    ´ (x.saldo_anterior + x.recebimento - x.pagamento)Sd_Atual ´+
                    ´ from(select distinct(a.conta), b.nmconta,                ´+
                    ´ ((select coalesce(sum(recebimento),0) from movcontabil   ´+
                    ´ where datamvto < :pdata and b.cdconta = substring(conta  ´+
                    ´ from 1 for 1))) - ((select coalesce(sum(pagamento),0)    ´+
                    ´ from movcontabil where datamvto < :pdata and b.cdconta = ´+
                    ´ substring(conta from 1 for 1))) Sd_Anterior, (select     ´+
                    ´ coalesce(sum recebimento),0) from movcontabil where      ´+
                    ´ extract(year from datamvto) = :p_ano and b.cdconta =     ´+
                    ´ substring(conta from 1 for 1))as recebimento,            ´+
                    ´ (select coalesce(sum pagamento),0) from movcontabil      ´+
                    ´ where extract(year from datamvto) = :p_ano and           ´+
                    ´ b.cdconta = substring(conta from 1 for 1))as pagamento   ´+
                    ´ from movcontabil a, plano_contas b where b.cdconta =     ´+
                    ´ substring(conta from 1 for 1))as x                       ´+
                    ´ union                                                    ´+
                    ´ select distinct(substring(x.conta from 1 for 2)) Conta,  ´+
                    ´ x.nmconta, x.saldo_anterior, x.recebimento, x.pagamento, ´+
                    ´ (x.saldo_anterior + x.recebimento - x.pagamento)Sd_Atual ´+
                    ´ from(select distinct(a.conta), b.nmconta,                ´+
                    ´ ((select coalesce(sum(recebimento),0) from movcontabil   ´+
                    ´ where datamvto < :pdata and b.cdconta = substring(conta  ´+
                    ´ from 1 for 2))) - ((select coalesce(sum(pagamento),0)    ´+
                    ´ from movcontabil where datamvto < :pdata and b.cdconta = ´+
                    ´ substring(conta from 1 for 2))) Sd_Anterior, (select     ´+
                    ´ coalesce(sum recebimento),0) from movcontabil where      ´+
                    ´ extract(year from datamvto) = :p_ano and b.cdconta =     ´+
                    ´ substring(conta from 1 for 2))as recebimento,            ´+
                    ´ (select coalesce(sum pagamento),0) from movcontabil      ´+
                    ´ where extract(year from datamvto) = :p_ano and           ´+
                    ´ b.cdconta = substring(conta from 1 for 2))as pagamento   ´+
                    ´ from movcontabil a, plano_contas b where b.cdconta =     ´+
                    ´ substring(conta from 1 for 2))as x                       ´+
                    ´ union                                                    ´+
                    ´ select distinct(substring(x.conta from 1 for 3)) Conta,  ´+
                    ´ x.nmconta, x.saldo_anterior, x.recebimento, x.pagamento, ´+
                    ´ (x.saldo_anterior + x.recebimento - x.pagamento)Sd_Atual ´+
                    ´ from(select distinct(a.conta), b.nmconta,                ´+
                    ´ ((select coalesce(sum(recebimento),0) from movcontabil   ´+
                    ´ where datamvto < :pdata and b.cdconta = substring(conta  ´+
                    ´ from 1 for 3))) - ((select coalesce(sum(pagamento),0)    ´+
                    ´ from movcontabil where datamvto < :pdata and b.cdconta = ´+
                    ´ substring(conta from 1 for 3))) Sd_Anterior, (select     ´+
                    ´ coalesce(sum recebimento),0) from movcontabil where      ´+
                    ´ extract(year from datamvto) = :p_ano and b.cdconta =     ´+
                    ´ substring(conta from 1 for 3))as recebimento,            ´+
                    ´ (select coalesce(sum pagamento),0) from movcontabil      ´+
                    ´ where extract(year from datamvto) = :p_ano and           ´+
                    ´ b.cdconta = substring(conta from 1 for 3))as pagamento   ´+
                    ´ from movcontabil a, plano_contas b where b.cdconta =     ´+
                    ´ substring(conta from 1 for 3))as x                       ´+
                    ´ union                                                    ´+
                    ´ select distinct(substring(x.conta from 1 for 4)) Conta,  ´+
                    ´ x.nmconta, x.saldo_anterior, x.recebimento, x.pagamento, ´+
                    ´ (x.saldo_anterior + x.recebimento - x.pagamento)Sd_Atual ´+
                    ´ from(select distinct(a.conta), b.nmconta,                ´+
                    ´ ((select coalesce(sum(recebimento),0) from movcontabil   ´+
                    ´ where datamvto < :pdata and b.cdconta = substring(conta  ´+
                    ´ from 1 for 4))) - ((select coalesce(sum(pagamento),0)    ´+
                    ´ from movcontabil where datamvto < :pdata and b.cdconta = ´+
                    ´ substring(conta from 1 for 4))) Sd_Anterior, (select     ´+
                    ´ coalesce(sum recebimento),0) from movcontabil where      ´+
                    ´ extract(year from datamvto) = :p_ano and b.cdconta =     ´+
                    ´ substring(conta from 1 for 4))as recebimento,            ´+
                    ´ (select coalesce(sum pagamento),0) from movcontabil      ´+
                    ´ where extract(year from datamvto) = :p_ano and           ´+
                    ´ b.cdconta = substring(conta from 1 for 4))as pagamento   ´+
                    ´ from movcontabil a, plano_contas b where b.cdconta =     ´+
                    ´ substring(conta from 1 for 4))as x                       ´+
                    ´ union                                                    ´+
                    ´ select distinct(x.conta) Conta,                          ´+
                    ´ x.nmconta, x.saldo_anterior, x.recebimento, x.pagamento, ´+
                    ´ (x.saldo_anterior + x.recebimento - x.pagamento)Sd_Atual ´+
                    ´ from(select distinct(a.conta), b.nmconta,                ´+
                    ´ ((select coalesce(sum(recebimento),0) from movcontabil   ´+
                    ´ where datamvto < :pdata and b.cdconta = conta)) -        ´+
                    ´ ((select coalesce(sum(pagamento),0) from movcontabil     ´+
                    ´ where datamvto < :pdata and b.cdconta = conta))          ´+
                    ´ Sd_Anterior, (select coalesce(sum recebimento),0) from   ´+
                    ´ movcontabil where extract(year from datamvto) = :p_ano   ´+
                    ´ and b.cdconta = conta))as recebimento,                   ´+
                    ´ (select coalesce(sum pagamento),0) from movcontabil      ´+
                    ´ where extract(year from datamvto) = :p_ano and           ´+
                    ´ b.cdconta = conta)as pagamento from movcontabil a,       ´+
                    ´ plano_contas b where b.cdconta = conta)as x              ´;
        Params.ParamByName(´pdata´).Value := StrToDate(Label1.Caption);
        Params.ParamByName(´p_ano´).Value := StrToInt(Edit1.Text);
        Open;
        if isEmpty then
        begin
          MessageDlg(´Não existe dados cadastrado para este ano´, mtInformation, [mbOK], 0);
          Abort;
        end
        else
        begin
           frmBalanco := TfrmBalanco.Create(Application);
        end;
    end;
  end;
end;


Mais gostaria da opnião do pessoal, se é uma boa forma fazer um select deste tipo.
Ou seja se vai ficar lento cfe. os dados cadastrados...Se tem uma maneira de melhorar a performance deste select, ou se é melhor usa-lo com view (Obs: se for usar como view, gostaria de saber como usar, pois não aprendi na pratica ainda como usar views no meu projeto) :oops:


Adriano_servitec

Adriano_servitec

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar