Sint

17/02/2009

estou com o seguinte problema estou tentando fazer um select somando certos campos mais o que acontece e o seguinte quando eu uso esse select que eu postei logo abaixo e o valor do campo icms_retido for maior que 0 ele soma os registros mais se caso eu lançar uma nota que nao tenha icms retido ou seja ela vai conter o valor 0 entao ele nao soma nenhum registro sendo que eu preciso que ele some todos os registros o que eu fiz de errado?     with deasy.QrySintegra do   //processa o registro compelementares do sintegra
  begin
   Close;      unprepare;
   sql.clear;
   SQL.ADD('SELECT * from nota where DATAEMISSAO BETWEEN :datahora_ini AND :datahora_fim  and(');
   SQL.Add('(modelo = ''01'') OR');
   SQL.Add('(modelo = ''1A'') OR');
   SQL.Add('(modelo = ''03'') OR');
   SQL.Add('(modelo = ''06'') OR');
   SQL.Add('(modelo = ''55'') OR');
   SQL.Add('(modelo = ''22''))');
   SQL.Add('order BY dataemissao');
   ParamByName('datahora_ini').asdatetime:= datahora_inicial;
   parambyname('datahora_fim').asdatetime:= datahora_final;
   prepare;
  Open;
  end;   deasy.QrySintegra_D.DataSource := deasy.DtsQrySintegra;   with deasy.QrySintegra_d do
  begin
   Close;
    unprepare;
   SQL.Clear;    SQL.Add('SELECT aliquota, sum(icms_retido+valor_ipi+frete+seguro+pis+outrasdespesas+complemento+servicos) v,  sum (icms_retido+valor_ipi) as o, sum(frete+seguro+pis+outrasdespesas+complemento+servicos) as b, sum(icms_especial) as i FROM nota WHERE ');
   SQL.Add('notaid = :notaid ');
   SQL.Add('GROUP BY aliquota');
   prepare;    Open;   end;      if deasy.qrysintegra_D.FieldByName('v').AsCurrency>0 then
      begin
     while not deasy.QrySintegra.EOF do
    begin
    while not deasy.QrySintegra_D.EOF do
      begin
  
       num_nf := deasy.QrySintegra.Fields.FieldByName('numeronota').AsString;
       num_nf := trim(copy(num_nf, length(num_nf) - 6, length(num_nf)));        //utilizando apenas 6 últimos digitos da NF  
       //Faz a chamada da dll passando as informações do banco de dados e armazena numa string temporária
       TempStr := Registro50(deasy.QrySintegra.Fields.FieldByName('cnpj').AsString,    //CNPJ
         deasy.QrySintegra.Fields.FieldByName('inscricao').AsString,                          //Insc_Est
         datetostr(deasy.QrySintegra.Fields.FieldByName('dataemissao').AsDateTime),      //Data_Emissao_Recebimento
         deasy.QrySintegra.Fields.FieldByName('uf').AsString,                          //UF
         deasy.QrySintegra.Fields.FieldByName('modelo').AsString,                              //Modelo
         deasy.QrySintegra.Fields.FieldByName('serie').AsString,                               //Serie
         num_nf,                                                                //Nro
         deasy.QrySintegra.Fields.FieldByName('cfop').AsString,                                   //CFOP
         deasy.QrySintegra.Fields.FieldByName('emissordocumento').asstring,                            //Emitente
         formatcurr('0.00', deasy.QrySintegra_D.Fields.FieldByName('v').AsFloat),       //Valor_Total
         formatcurr('0.00', deasy.QrySintegra_D.fields.FieldByName('b').AsFloat),           //Base_ICMS
         formatcurr('0.00', deasy.QrySintegra_D.fields.FieldByName('i').AsFloat),          //Valor_ICMS
         '0',          //Isenta
         formatcurr('0.00', deasy.QrySintegra_D.fields.FieldByName('o').AsFloat),            //Outras
         '0',       //Aliquota
         deasy.QrySintegra.Fields.FieldByName('SITUACAO').asstring               //Situacao
         );
        
       //Executa o tratamento da string temporária testando se houve erro
       //Caso haja erro, executa o log das informações inconsistentes no RichEdit
       if not Trata_SIntegra_Str(TempStr) then
        begin
         qnt_erro := qnt_erro + 1;
         Result := False;          Err_Msg := Err_Msg + #13 +
           '    Cod_NF_Entrada: ' + deasy.QrySintegra.Fields.FieldByName('NOTAID').AsString + #13 +
           '    CNPJ: ' + deasy.QrySintegra.Fields.FieldByName('cnpj').AsString + #13 +
           '    IE: ' + deasy.QrySintegra.Fields.FieldByName('inscricao').AsString + #13 +
           '    Recebimento: ' + datetostr(deasy.QrySintegra.Fields.FieldByName('dataemissao').AsDateTime) + #13 +
           '    UF: ' + deasy.QrySintegra.Fields.FieldByName('uf').AsString + #13 +
           '    Modelo: ' + deasy.QrySintegra.Fields.FieldByName('modelo').AsString + #13 +
           '    Serie: ' + deasy.QrySintegra.Fields.FieldByName('serie').AsString + #13 +
           '    Nro: ' + num_nf + #13 +
           '    CFOP: ' + deasy.QrySintegra.Fields.FieldByName('cfop').AsString + #13 +
           '    Emitente: ' + deasy.QrySintegra.Fields.FieldByName('emissordocumento').AsString + #13 +
           '    Valor_Total: ' + deasy.QrySintegra.Fields.FieldByName('icms_retido').AsString + #13 +
           '    Base ICMS: ' + deasy.QrySintegra_D.Fields.FieldByName('basedecalculo').AsString + #13 +
           '    Valor ICMS: ' + deasy.QrySintegra_D.Fields.FieldByName('valoricms').AsString + #13 +
           '    Isenta: ' + deasy.QrySintegra.FieldByName('isentas').AsString + #13 +
           '    Outras: ' + deasy.QrySintegra.FieldByName('icms_retido').AsString + #13 +
           '    Aliquota: ' + floattostr(deasy.QrySintegra_D.Fields.FieldByName('aliquota').AsFloat * 100) + #13 +
           '    Situacao: ' + deasy.QrySintegra.Fields.FieldByName('situacao').asstring
        end
else
        qnt_ok := qnt_ok + 1;        if not deasy.QrySintegra_D.EOF then
       deasy.QrySintegra_D.Next;        if quit_sintegra then
         exit;
      end;      if not deasy.QrySintegra.EOF then
     deasy.QrySintegra.Next;
     end;
    if quit_sintegra then
      exit;
    end;
   deasy.QrySintegra_D.Close;  deasy.QrySintegra_D.DataSource := nil;  deasy.QrySintegra.Close;  end;
Paulo Silva

Paulo Silva

Curtidas 0

Respostas

Wesley Yamazack

Wesley Yamazack

17/02/2009

Olá Paulo.
    Bom dia. Segue abaixo o exemplo alterado

   with deasy.QrySintegra do   //processa o registro compelementares do sintegra
    begin
       Close;
       unprepare;
       sql.clear;
       SQL.ADD('SELECT * from nota where DATAEMISSAO BETWEEN :datahora_ini AND :datahora_fim  and(');
       SQL.Add('(modelo = ''01'') OR');
       SQL.Add('(modelo = ''1A'') OR');
       SQL.Add('(modelo = ''03'') OR');
       SQL.Add('(modelo = ''06'') OR');
       SQL.Add('(modelo = ''55'') OR');
       SQL.Add('(modelo = ''22''))');
       SQL.Add('order BY dataemissao');
       ParamByName('datahora_ini').asdatetime:= datahora_inicial;
       parambyname('datahora_fim').asdatetime:= datahora_final;
       prepare;
       Open;
    end;

    deasy.QrySintegra_D.DataSource := deasy.DtsQrySintegra;

    with deasy.QrySintegra_d do
    begin
     Close;
     unprepare;
     SQL.Clear;

     SQL.Add('SELECT aliquota,                                                                          ');
     SQL.Add('       sum(icms_retido+valor_ipi+frete+seguro+pis+outrasdespesas+complemento+servicos) v, ');
     SQL.Add('       sum icms_retido+valor_ipi) as o,                                                   ');
     SQL.Add('       sum(frete+seguro+pis+outrasdespesas+complemento+servicos) as b,                    ');
     SQL.Add('       sum(icms_especial) as i                                                            ');
     SQL.Add('  FROM nota                                                                               ');
     SQL.Add(' WHERE notaid = :notaid                                                                   ');
     SQL.Add(' GROUP BY aliquota                                                                        ');
     prepare;

     Open;

    end;
     //Imagina a seguinte situação.
     {  ==========================
        aliquota  v    o    b    i
        10       0    0    0    0
        20       2    0    0    0
        30       2    2    1    0
       ==========================
           Observe que logo abaixo você testa apenas uma vez a coluna "v",
        se ela na primeira linha do teu Select, for 0(zero) ele não vai fazer nada, porém
        se a primeiraa linha do teu select, for maior do que o(zero) ai sim ele irá fazer o loop 'while not deasy.QrySintegra.EOF do'
        - Solução : Você percorrer toda a primeira tabela, depois percorrer a segunda tabela, e logo ir testando se "v" > 0 .
       }


       while not deasy.QrySintegra.EOF do
       begin
            while not deasy.QrySintegra_D.EOF do
            begin
               if deasy.qrysintegra_D.FieldByName('v').AsCurrency>0 then
               begin
                     num_nf := deasy.QrySintegra.Fields.FieldByName('numeronota').AsString;
                     num_nf := trim(copy(num_nf, length(num_nf) - 6, length(num_nf)));        //utilizando apenas 6 últimos digitos da NF

                     //Faz a chamada da dll passando as informações do banco de dados e armazena numa string temporária
                     TempStr := Registro50(deasy.QrySintegra.Fields.FieldByName('cnpj').AsString,    //CNPJ
                       deasy.QrySintegra.Fields.FieldByName('inscricao').AsString,                          //Insc_Est
                       datetostr(deasy.QrySintegra.Fields.FieldByName('dataemissao').AsDateTime),      //Data_Emissao_Recebimento
                       deasy.QrySintegra.Fields.FieldByName('uf').AsString,                          //UF
                       deasy.QrySintegra.Fields.FieldByName('modelo').AsString,                              //Modelo
                       deasy.QrySintegra.Fields.FieldByName('serie').AsString,                               //Serie
                       num_nf,                                                                //Nro
                       deasy.QrySintegra.Fields.FieldByName('cfop').AsString,                                   //CFOP
                       deasy.QrySintegra.Fields.FieldByName('emissordocumento').asstring,                            //Emitente
                       formatcurr('0.00', deasy.QrySintegra_D.Fields.FieldByName('v').AsFloat),       //Valor_Total
                       formatcurr('0.00', deasy.QrySintegra_D.fields.FieldByName('b').AsFloat),           //Base_ICMS
                       formatcurr('0.00', deasy.QrySintegra_D.fields.FieldByName('i').AsFloat),          //Valor_ICMS
                       '0',          //Isenta
                       formatcurr('0.00', deasy.QrySintegra_D.fields.FieldByName('o').AsFloat),            //Outras
                       '0',       //Aliquota
                       deasy.QrySintegra.Fields.FieldByName('SITUACAO').asstring               //Situacao
                       );

                     //Executa o tratamento da string temporária testando se houve erro
                     //Caso haja erro, executa o log das informações inconsistentes no RichEdit
                     if not Trata_SIntegra_Str(TempStr) then
                     begin
                         qnt_erro := qnt_erro + 1;
                         Result := False;

                         Err_Msg := Err_Msg + #13 +
                           '    Cod_NF_Entrada: ' + deasy.QrySintegra.Fields.FieldByName('NOTAID').AsString + #13 +
                           '    CNPJ: ' + deasy.QrySintegra.Fields.FieldByName('cnpj').AsString + #13 +
                           '    IE: ' + deasy.QrySintegra.Fields.FieldByName('inscricao').AsString + #13 +
                           '    Recebimento: ' + datetostr(deasy.QrySintegra.Fields.FieldByName('dataemissao').AsDateTime) + #13 +
                           '    UF: ' + deasy.QrySintegra.Fields.FieldByName('uf').AsString + #13 +
                           '    Modelo: ' + deasy.QrySintegra.Fields.FieldByName('modelo').AsString + #13 +
                           '    Serie: ' + deasy.QrySintegra.Fields.FieldByName('serie').AsString + #13 +
                           '    Nro: ' + num_nf + #13 +
                           '    CFOP: ' + deasy.QrySintegra.Fields.FieldByName('cfop').AsString + #13 +
                           '    Emitente: ' + deasy.QrySintegra.Fields.FieldByName('emissordocumento').AsString + #13 +
                           '    Valor_Total: ' + deasy.QrySintegra.Fields.FieldByName('icms_retido').AsString + #13 +
                           '    Base ICMS: ' + deasy.QrySintegra_D.Fields.FieldByName('basedecalculo').AsString + #13 +
                           '    Valor ICMS: ' + deasy.QrySintegra_D.Fields.FieldByName('valoricms').AsString + #13 +
                           '    Isenta: ' + deasy.QrySintegra.FieldByName('isentas').AsString + #13 +
                           '    Outras: ' + deasy.QrySintegra.FieldByName('icms_retido').AsString + #13 +
                           '    Aliquota: ' + floattostr(deasy.QrySintegra_D.Fields.FieldByName('aliquota').AsFloat * 100) + #13 +
                           '    Situacao: ' + deasy.QrySintegra.Fields.FieldByName('situacao').asstring
                     end
                     else
                        qnt_ok := qnt_ok + 1;

                     if not deasy.QrySintegra_D.EOF then
                        deasy.QrySintegra_D.Next;

                     if quit_sintegra then
                        exit;
               end;

           if not deasy.QrySintegra.EOF then
              deasy.QrySintegra.Next;
          end;
       if quit_sintegra then
          exit;
       end;
 
   deasy.QrySintegra_D.Close;
   deasy.QrySintegra_D.DataSource := nil;
   deasy.QrySintegra.Close;



Att,

Wesley Y
 
GOSTEI 0
Paulo Silva

Paulo Silva

17/02/2009

quando eu faço assim em um mes gera mais no outro trava pq esse select travaria a aplicacao?
GOSTEI 0
Paulo Silva

Paulo Silva

17/02/2009

fiz um teste com dois lançamentos funcionou , fiz com outro mes q tinha 400 ele travou legal a aplicacao
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/02/2009

Olá Paulo, meu caro.

   Posso te dar um conselho? Uma dica para te ajudar?
   Utilize DataSetProvider,e ClientDataset, para poder trabalhar com os dados. Pois eles são muito mais rapido, do que você usar a query. Já utlizou os mesmos?
   Dai ao inves de você ficar usando a query para ficar varrendo em um While, você usaaria o Clientdataset(este componente carrega todos os dados de um select, em memoria, sendo muito mais rapido para acessar o mesmos).
  Dois motivos que possa ter travado o teu programa.
  1 - Você ter caido em loop Infinito.
  2 - Você ter clicado enquanto ele estava processando os 400 registos.


Att,

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/02/2009

Olá Paulo,
  O chamado foi concluído. Mas continuamos a sua disposição

Att,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

17/02/2009

Wesley eu tentei fazer com o client dataset mais nao encontrava o param fikava dando param not found tem como vc postar um exemplo pra que eu entenda o pq desse param not found! sendo q com o componente acima listado funcionava perfeitamente!
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/02/2009

Olá Paulo, irei gravar uma video aula para você, te mandarei mais a noite, explicando como funciona o ClientdataSet ok ?

Att,

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/02/2009

Olá Paulo, bom dia.

 Segue abaixo o link da video que tinha te prometido.


  http://www.4shared.com/file/88770765/3daa7e83/Video_Chamado_Paulo.html

att,
Wesley Y

GOSTEI 0
Paulo Silva

Paulo Silva

17/02/2009

kra consegui resolver o problema eu coloquei asdate ao inves de asdatetime funcionou perfeitamente obrigadao!
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/02/2009

Olá Paulo, que bom que consegui resolver.

Ate um proximo ....

Abracos


Att,

Wesley Y
GOSTEI 0
POSTAR