Popular runtime Clientdataset to run an SQL query ? Delphi

Asked

Viewed 1,079 times

1

I need to configure the CDS to save the result of the query, but without dragging the components, since in this case I am not using any form, but returns error 'Invalid Field Type' in the fields informed. Follows my code:

begin
  CDSEstoque  := TClientDataSet.Create(Application);
  SDSEstoque.Close;
  CDSEstoque.Close;

  CDSEstoque.FieldDefs.Clear;
  CDSEstoque.FieldDefs.add('ID_PRODUTO', ftInteger);
  CDSEstoque.FieldDefs.add('NOME_PRODUTO', ftString, 50);
  CDSEstoque.FieldDefs.add('NCM', ftString, 8);
  CDSEstoque.FieldDefs.add('QTDADE', ftCurrency);
  CDSEstoque.FieldDefs.add('CUSTO_TOTAL', ftCurrency);
  CDSEstoque.FieldDefs.add('CUSTO_UNI', ftCurrency);
  CDSEstoque.FieldDefs.add('UND', ftString, 2);
  CDSEstoque.CreateDataSet;

  DataEstoque := FormatDateTime('yyyy-mm-dd', pDataFim);

  SDSEstoque.SQLConnection := TDBExpress.getConexao;
  SDSEstoque.CommandText   := 'SELECT M.ID_PRODUTO, A.NOME_PRODUTO, A.NCM, SUM(M.QUANTIDADE) AS QTDADE, ' +
  'SUM(M.VALOR_TOTAL) AS CUSTO_TOTAL, '+
  '(SUM(M.VALOR_TOTAL) / SUM(M.QUANTIDADE)) AS CUSTO_UNI, B.SIGLA AS UND '+
  'FROM movimento_produto M '+
  'INNER JOIN produto A ON (A.ID = M.ID_PRODUTO) '+
  'INNER JOIN unidade_produto B ON (B.ID = A.ID_UNIDADE) '+
  'WHERE (M.DATA_MOVIMENTO <= '+QuotedStr(DataEstoque)+') '+
  'AND QTDADE > 0 GROUP BY M.ID_PRODUTO ORDER BY A.NOME_PRODUTO;';

  CDSEstoque.Open;
  SDSEstoque.Open;
end;
  • could not be the quantity field that is declared as currency in the clientdataset? CDSEstoque.FieldDefs.add('QTDADE', ftCurrency); , generally Qtde. fields are integer

  • but the quantity can be broken, for example 1,5 1,7

  • And another question would be, if I’m creating the CDS correctly

  • What is "Sdsestoque"? And where is the CDS being related to a Datasetprovider?

1 answer

1

I decided to change the Cdsestoque, from Tclientdataset to Tsqlquery, and the code was like this:

procedure PopulaCDSBlocoH(pDataFim: TDate);
var
   SQL, DataEstoque: String;
   cdsTemp:           TClientDataSet;
begin
   CDSEstoque  := TSQLQuery.Create(nil);
   DataEstoque := FormatDateTime('yyyy-mm-dd', pDataFim);

   SQL         :=  'SELECT M.ID_PRODUTO, A.NOME_PRODUTO, A.NCM, SUM(M.QUANTIDADE) AS QTDADE, ' +
   'SUM(M.VALOR_TOTAL) AS CUSTO_TOTAL, '+
   '(SUM(M.VALOR_TOTAL) / SUM(M.QUANTIDADE)) AS CUSTO_UNI, B.SIGLA AS UND '+
   'FROM movimento_produto M '+
   'INNER JOIN produto A ON (A.ID = M.ID_PRODUTO) '+
   'INNER JOIN unidade_produto B ON (B.ID = A.ID_UNIDADE) '+
   'WHERE (M.DATA_MOVIMENTO <= '+QuotedStr(DataEstoque)+') '+
   'AND M.QUANTIDADE > 0 GROUP BY M.ID_PRODUTO ORDER BY A.NOME_PRODUTO';

   CDSEstoque.SQLConnection := TDBExpress.getConexao;
   CDSEstoque.SQL.Text      := SQL;
   CDSEstoque.Open;
   CDSEstoque.First;

end;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.