ExecSQL do Firedac
21/02/2016
0
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:
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:
'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)
Pablo Ricardo
Post mais votado
22/02/2016
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
Mais Posts
21/02/2016
Pablo Ricardo
21/02/2016
Pablo Ricardo
21/02/2016
Pablo Ricardo
22/02/2016
Pablo Ricardo
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.
Clique aqui para fazer login e interagir na Comunidade :)