Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 546443
            [titulo] => ExecSQL do Firedac
            [dataCadastro] => DateTime Object
                (
                    [date] => 2016-02-22 09:36:35
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 463111
            [status] => A
            [isExample] => 
            [NomeUsuario] => Rafael Gustavo Dal Bosco
            [Apelido] => Rafael Dal Bosco
            [Foto] => 463111_20160309144828.jpg
            [Conteudo] => 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:

[code]]
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
[/code]

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

[code]
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;
[/code]

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. ) )

ExecSQL do Firedac

Dvlpp3
   - 21 fev 2016

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

      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:

Citação:
'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:

Citação:
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)

Post mais votado

Rafael Bosco
   - 22 fev 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:

#Código

]
  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:

#Código
   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.

Dvlpp3
   - 21 fev 2016

Clique na imagem para abrir em uma nova janela

Dvlpp3
   - 21 fev 2016

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

Crist
   - 21 fev 2016

Olá,
De acordo com o seu sql, o erro está neste campo fdqryNaoCumulativooperador.AsString + ',' +
Como ele vem vazio então o sql está ficando errado veja o sinal de + no seu sql.

Citação:
'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'',+(erro) ,''Vendas'',''01'',''01'',Sujeito a aliquotas normais,9359,32'

Dvlpp3
   - 21 fev 2016

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.

Dvlpp3
   - 22 fev 2016


Citação:
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:

#Código

]
  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:

#Código
   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.