GARANTIR DESCONTO

Fórum Como Criar parametro em tempo de execução no ClientDataSet #267038

01/02/2005

0

Estou tentando criar parametro no ClientDataSet com a seguinte codigo:

ClientDataSet .Close;
ClientDataSet .SQL.Text := ´ SELECT * FROM FORNECEDORES ´+
´ WHERE UPPER(Nome_Forn) LIKE :parFORNECEDOR ´;

ClientDataSet .ParamByName(´parFORNECEDOR´).AsString := Edit1.Text + ´¬´;
ClientDataSet .Open;

da erro quando executo


Leorez

Leorez

Responder

Posts

02/02/2005

Bon Jovi

Antes de setar os parâmetros chame o método FetchParams:

//ClientDataSet1 estando conectado ao Provider->Query->Connection.
ClientDataSet1.[b:bd6656386b]FetchParams[/b:bd6656386b];
ClientDataSet1.Params.ParamByName(´parFORNECEDOR´).ParamType := ptInput;
ClientDataSet1.Params.ParamByName(´parFORNECEDOR´).DataType := ftString;
ClientDataSet1.Params.ParamByName(´parFORNECEDOR´).AsString := ´xxx´;
//pode dar open agora...

------------------------------------------------------

Talvez nao precise pro seu caso, mas pra realmente criar na mãozona vc pode usar CreateParam:
ClientDataSet1.Params.CreateParam(ftString, ´parFORNECEDOR´, ptInput);

--------------------
Shaman forever
--------------------

[img:bd6656386b]http://www.shamanonline.com.br/images/news/551.jpg[/img:bd6656386b]


Responder

Gostei + 0

23/11/2006

Macario

Ola.

Estou tento dificuldade em utilizar parametros em runtime.
Tenho a seguinte instrucao ´fixa´ dentro do SQLDataSet:
select * from TABELA
where CAMPO = :PARAMCAMPO

Onde CAMPO e do tipo varchar.

Mas agora preciso passar este comando em runtime, no evento BeforeOpen do SQLDataSet.

Ocorre o seguinte erro: [b:a8bce215f8]No valur for parameter PARAMCAMPO[/b:a8bce215f8]

Quando efetuo o Open do ClientDataset ligado ao SQLDataSet com a instrucao.

Ja tentei o meto CreateParam mas nao obtive sucesso.

Alguem teria um exemplo funcional?


Grato. :roll:


Responder

Gostei + 0

23/11/2006

Brunolspp

Exemplos de utilização de ClientDataSet

Inclusive com criação dinamica de sql e parametrização de comandos em:
http://cc.borland.com/Author.aspx?ID=795118

No mais, estou as ordens

Abração


Responder

Gostei + 0

24/11/2006

Marco Salles

A dica do macario , aparentemente resolveria o problema ... Com um detalhe... Ela deve ser processada com o clientDataset Fechado...Isto é:

Fechar o clientDataset ClientDataSet1.FetchParams; abrir o clientDataset


Ja tentei o meto CreateParam mas nao obtive sucesso.


também acho que isto deve ser feito com o clientDatset Fechado


Responder

Gostei + 0

24/11/2006

Macario

Ola.

Detalhando melhor o meu problema.


[u:36ca53701c]Exemplo 1[/u:36ca53701c]
Banco A: + TabelaVenda + TabelaCliente select V.Nota, C.NomeCli, sum(V.Venda) as Total from TABELAVENDA V inner join TABELACLIENTE C on (V.CODCLI = C.CODCLI) where V.CODCLI = :CODCLI


O exemplo 1 trata de uma situação normal onde esta instrução esta no componente TSQLDataSet ja em tempo de projeto. E as duas tabelas encontram-se no mesmo database.

No codigo delphi fica.
  DM.cdsConsultaVenda.close;
  DM.cdsConsultaVenda.params.parambyname(´CODCLI´).AsInteger := iCodigo;
  DM.cdsConsultaVenda.Open;



[u:36ca53701c]Exemplo 2[/u:36ca53701c]
Banco A: + TabelaVenda Banco B + TabelaCliente select V.Nota, C.NomeCli, sum(V.Venda) as Total from BANCOA.dbo.TABELAVENDA V inner join BANCOB.dbo.TABELACLIENTE C on (V.CODCLI = C.CODCLI) where V.CODCLI = :CODCLI


O exemplo 2 trata de uma situação onde ja nao posso mais deixar a instrução estatica no componente SQLDataSet, pois apenas em tempo de execução é passado o nome dos Bancos, As tabelas podem estar em posições inversas(Venda em BancoB e Cliente em BancoA).

Uso este codigo em varios pontos do sistema
  DM.cdsConsultaVenda.close;
  DM.cdsConsultaVenda.params.parambyname(´CODCLI´).AsInteger := iCodigo;
  DM.cdsConsultaVenda.Open;

Agora nao estou conseguindo manter desta forma por que nao consigo trabalhar com o parametro.

Estou tentando criar os parametros no BeforeOpen do SQLDataSet esta forma é a correta?

No BeforeOpen do SQLDataSet tenho o seguinte codigo:

var
 iValueParam :  integer;
begin
  iValueParam := cdsConsultaVenda.params.parambyname(´CODCLI´).AsInteger;
  sdsConsultaVenda.CommandText :=  ´select V.Nota, C.NomeCli, sum(V.Venda) as Total from ´+[color=red]sDataBaseDBOTabelaVEnda[/color]+´  V
  inner join ´+[color=red]sDataBaseDBOTabelaCliente[/color]+´ C on (V.CODCLI = C.CODCLI)
  where V.CODCLI = :CODCLI´
  
  if(Agora devo criar o parametro no SQLDataSet ou no ClientDataSet) then
  sdsConsultaVenda.params.CreateParam(ftInteger, ´CODCLI´, ptInPut);
  else
  cdsConsultaVenda.params.CreateParam(ftInteger, ´CODCLI´, ptInPut);

end;



Responder

Gostei + 0

24/11/2006

Brunolspp

pq vc não cria o comando td e passa pela propriedade commandtext do clientdataset, é uma solução imediata, talves não das melhores.

para fazer isso e necessario q a propriedade allowcommandtext do datasetprovider esteja habilitada.

dai vc faria td pelo clientdataset mesmo, tomando cuidado de modificar o sql somente no where e não nos campos retornados se o seu clientdataset tiver os tfields ja tipificados.

no mais, estou as ordens

http://cc.borland.com/Author.aspx?ID=795118

Abração


Responder

Gostei + 0

24/11/2006

Macario

Ola Bruno.

Entao seria uma saida passar tudo diretamente, mas no meu caso torna-se uma grande alteração dentro do sistema(um ERP com varios modulos) .


Responder

Gostei + 0

24/11/2006

Marco Salles

independemente do que voce esta fazendo a dica do Bon Jovi deve resolver.. é claro que esses parametros ja deveria ter sido definidos previamente na TsqlQuery..

Esses parametros ja estão previamente definidos ????

Agora , ao se usar o ComadText , deve-se usar cds.Execute ao inves do tradicional cds.open e outra , ao se usar o qry.SQL.CommaText deve-se usar o qry.ExecSQL(false) ao inves do qry.OPen



Responder

Gostei + 0

24/11/2006

Macario

[quote:2fec42ee69=´Marco Salles´]
Esses parametros ja estão previamente definidos ????

[/quote:2fec42ee69]


Sim como mencionei estao no CLientDataSet.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar