ExecSQL do Firedac

21/02/2016

Tenho uma função de insert que somente escrevi, em suma, não funciona.

      fdqryGeneric.Active := False;
      fdqryGeneric.SQL.Clear;
      fdqryGeneric.SQL.Add('DELETE FROM PROCESSADO_REAL WHERE COD_SESSAO =' +
        IntToStr(CodSessao));
      fdqryGeneric.ExecSQL;

      fdqryGeneric.Active := False;
      fdqryGeneric.SQL.Clear;
      fdqryGeneric.SQL.Add('INSERT INTO PROCESSADO_REAL(' +
        'cod_sessao, grupo, tipo, operador, operacao, cst_sai_apur, cst_apur,' +
        'nat_rec, vl_total) VALUES (' + IntToStr(CodSessao) + ',' +
        QuotedStr(fdqryNaoCumulativogrupo.AsString) + ',' +
        QuotedStr(fdqryNaoCumulativotipo.AsString) + ',' +
        fdqryNaoCumulativooperador.AsString + ',' +
        QuotedStr(fdqryNaoCumulativooperacao.AsString) + ',' +
        QuotedStr(fdqryNaoCumulativocst_sai_apur.AsString) + ',' +
        QuotedStr(fdqryNaoCumulativocst_apur.AsString) + ',' +
        fdqryNaoCumulativonat_rec.AsString + ',' +
        FloatToStr(fdqryNaoCumulativovl_total.AsFloat));
      fdqryGeneric.ExecSQL;



Fica assim a slq.text:

'INSERT INTO PROCESSADO_REAL(cod_sessao, grupo, tipo, operador, operacao, cst_sai_apur, cst_apur,nat_rec, vl_total) VALUES (4,''1-Receitas Totais'',''1.1-Vendas de Mercadorias Sujeitas à Alíquotas Normais'',+,''Vendas'',''01'',''01'',Sujeito a aliquotas normais,9359,32'


Percebe-se que o quotestr não funciona. Um amigo falou que quando ele passa ele tira as aspas duplas, que nesse ponto está tranquilo. Porém o erro em si:


First chance exception at $7664D928. Exception class Exception with message 'Erro: [FireDAC][Phys][PG][libpq] ERROR: syntax error at end of input'. Process FacGestao.exe (1568) Thread Exit: Thread ID: 3224. Process FacGestao.exe (1568) First chance exception at $7664D928. Exception class Exception with message 'Erro: [FireDAC][Phys][PG][libpq] ERROR: syntax error at end of input'. Process FacGestao.exe (1568) First chance exception at $7664D928. Exception class Exception with message 'Erro: [FireDAC][Phys][PG][libpq] ERROR: syntax error at or near ","'. Process FacGestao.exe (1568)

Melhor resposta

22/02/2016

Brother, eu utilizo bastante o FireDac, e os inserts, updates, eu faço da seguinte forma:


Criei uma classe chamada TSQL, e nela eu coloco diversas funções que resultam nas SQLs que eu quero, depois, utilizo elas, exemplo do seu insert:

]
  class function TSQL.InsertAlgoSQL: String;
  begin
    Result := 'INSERT INTO PROCESSADO_REAL' + sLineBreak +
                   '(COD_DESSAO, GRUPO, TIPO, OPERADOR, OPERACAO, CST_SAI_APUR,' + sLineBreak + 
                   'CST_APUR, NAT_REC, VL_TOTAL)VALUES' + sLineBreak + 
                   '(:COD_DESSAO, :GRUPO, :TIPO, :OPERADOR, :OPERACAO, :CST_SAI_APUR,' + sLineBreak +
                   ':CST_APUR, :NAT_REC, :VL_TOTAL)';
  end;
  
// os dois pontos em questão, são os parâmetros da SQL


Posteriormente, em uma outra Classe, eu tenho uma função Boolean, que '' executa '' a SQL, através do FireDac:

   function InsertAlgo: System.Boolean;
   begin
      try
        fQuery.SQL.Clear;
        fQuery.SQL.Add(TSQL.InsertAlgoSQL);
        // Parâmetro da SQL
        
        fQuery,ParamByName('COD_DESSAO').AsInteger := CodDessao;
        fQuery,ParamByName('GRUPO').AsString := Grupo;
        fQuery,ParamByName('TIPO').AsString := Tipo;
        fQuery,ParamByName('OPERADOR').AsString := Operador;
        fQuery,ParamByName('OPERACAO').AsString := Operacao;
        fQuery,ParamByName('CST_SAI_APUR').AsString := CstSaiApur;
        fQuery,ParamByName('CST_APUR').AsString:= CstApur;
        fQuery,ParamByName('NAT_REC').AsString := NatRec;
        fQuery,ParamByName('VL_TOTAL').AsCurrency := VlTotal;

        fQuery,ExecSQL;
        fQuery.Connection.Commt;
        Result := System.True;
      except
        raise;
      end;    
   end;


Acredito que dessa forma, o código fique mais Clean, e manutenção fique mais fácil, sem contar que você pode controlar os parâmetros através das variaveis, e não diretamente na SQL.

Rafael Bosco

Responder Citar

Outras Respostas

21/02/2016

Dvlpp3

[img]http://arquivo.devmedia.com.br/forum/imagem/229843-20160221-164858%20%281%29.png[/img]
Responder Citar

21/02/2016

Dvlpp3

os textos que não estão com '' coloquei o quotestr porém continua o mesmo erro.
Responder Citar

21/02/2016

Dvlpp3

Nops... retorna '+' ou '-' ou ' '. É uma string mesmo. Joguei no quoted também e não resolveu. Criei outro dataset e passei como parâmetro e funcionou, agora do primeiro jeito... impossível. Como estava com pressa não deu pra descobrir o erro.
Responder Citar

22/02/2016

Dvlpp3

Brother, eu utilizo bastante o FireDac, e os inserts, updates, eu faço da seguinte forma: Criei uma classe chamada TSQL, e nela eu coloco diversas funções que resultam nas SQLs que eu quero, depois, utilizo elas, exemplo do seu insert:
]
  class function TSQL.InsertAlgoSQL: String;
  begin
    Result := 'INSERT INTO PROCESSADO_REAL' + sLineBreak +
                   '(COD_DESSAO, GRUPO, TIPO, OPERADOR, OPERACAO, CST_SAI_APUR,' + sLineBreak + 
                   'CST_APUR, NAT_REC, VL_TOTAL)VALUES' + sLineBreak + 
                   '(:COD_DESSAO, :GRUPO, :TIPO, :OPERADOR, :OPERACAO, :CST_SAI_APUR,' + sLineBreak +
                   ':CST_APUR, :NAT_REC, :VL_TOTAL)';
  end;
  
// os dois pontos em questão, são os parâmetros da SQL
Posteriormente, em uma outra Classe, eu tenho uma função Boolean, que '' executa '' a SQL, através do FireDac:
   function InsertAlgo: System.Boolean;
   begin
      try
        fQuery.SQL.Clear;
        fQuery.SQL.Add(TSQL.InsertAlgoSQL);
        // Parâmetro da SQL
        
        fQuery,ParamByName('COD_DESSAO').AsInteger := CodDessao;
        fQuery,ParamByName('GRUPO').AsString := Grupo;
        fQuery,ParamByName('TIPO').AsString := Tipo;
        fQuery,ParamByName('OPERADOR').AsString := Operador;
        fQuery,ParamByName('OPERACAO').AsString := Operacao;
        fQuery,ParamByName('CST_SAI_APUR').AsString := CstSaiApur;
        fQuery,ParamByName('CST_APUR').AsString:= CstApur;
        fQuery,ParamByName('NAT_REC').AsString := NatRec;
        fQuery,ParamByName('VL_TOTAL').AsCurrency := VlTotal;

        fQuery,ExecSQL;
        fQuery.Connection.Commt;
        Result := System.True;
      except
        raise;
      end;    
   end;
Acredito que dessa forma, o código fique mais Clean, e manutenção fique mais fácil, sem contar que você pode controlar os parâmetros através das variáveis, e não diretamente na SQL.


Foi justamente assim que fiz, passando parâmetros já que não encontrei o erro que estava dando. Muito obrigado pela resposta.
Responder Citar