Select com parametros + DBExpress + SQL Server

Delphi

15/12/2010

Salve galera, tudo beleza??

Seguinte, estou tentando fazer algo simples. Executar um Select com passagem de parâmetro. Exemplo (apenas um exemplo):

SELECT A.PRO_COD, A.PRO_ATIVO, A.PRO_ASSUNTO, A.PRO_TRANS, A.PRO_CONTATO, A.CAP_COD_ORI, A.CAP_COD_DES
FROM TPROTOCOLOW A
LEFT OUTER JOIN TUSUEMP X ON X.CODUSU       = :GCODUSU
WHERE A.PRO_ATIVO = 'S'

No Delphi, executo o comando com o ClientDataSet (pois minha aplicação trabalha como Client/Server). Então fica assim o código:

  ClientDataSet1.Close;
  ClientDataSet1.Params.Clear;
  ClientDataSet1.CommandText := 'SELECT A.PRO_COD,A.PRO_ATIVO,A.PRO_ASSUNTO,A.PRO_TRANS, A.PRO_CONTATO, A.CAP_COD_ORI,A.CAP_COD_DES' +
                                ' FROM TPROTOCOLOW A ' +
                                ' LEFT OUTER JOIN TUSUEMP    X  ON X.CODUSU       = :GCODUSU' +
                                ' WHERE A.PRO_ATIVO = ''S''';

  ClientDataSet1.Params.ParamByName('GCODUSU').AsInteger := 7;
  ClientDataSet1.Open;

Porem ele não executa e retorna a mensagem: "Syntax error or access violation"

A aplicação rodava em Firebird e como mudei para o SQL Server 2005

O que pode ser??? Isso ocorre para qualquer parâmetro de qualquer tipo (String, Data, etc).

Abs

Carlos Souza

Carlos Souza

Curtidas 0

Respostas

Leonardo Xavier

Leonardo Xavier

15/12/2010

SELECT A.PRO_COD, A.PRO_ATIVO, A.PRO_ASSUNTO, A.PRO_TRANS, A.PRO_CONTATO, A.CAP_COD_ORI, A.CAP_COD_DES
FROM TPROTOCOLOW A
LEFT OUTER JOIN TUSUEMP X ON X.CODUSU       = :GCODUSU
WHERE A.PRO_ATIVO = 'S'

No Delphi, executo o comando com o ClientDataSet (pois minha aplicação trabalha como Client/Server). Então fica assim o código:

  ClientDataSet1.Close;
  ClientDataSet1.Params.Clear;
 
 ClientDataSet1.CommandText := 'SELECT 
A.PRO_COD,A.PRO_ATIVO,A.PRO_ASSUNTO,A.PRO_TRANS, A.PRO_CONTATO, 
A.CAP_COD_ORI,A.CAP_COD_DES' +
                                ' FROM TPROTOCOLOW A ' +
                                ' LEFT OUTER JOIN TUSUEMP    X  ON X.CODUSU       = :GCODUSU' +
                                ' WHERE A.PRO_ATIVO = ''S''';

  ClientDataSet1.Params.ParamByName('GCODUSU').AsInteger := 7;
  clientedataset1.prepared;
  ClientDataSet1.Open;



ja fez este comando diratamente por sql para ver se ele mostra o que vc deseja?
GOSTEI 0
Carlos Souza

Carlos Souza

15/12/2010

Sim. Via SQL direto no BD ele executa tranquilo desde que se substituia o :GCODUSU pelo código.

Percebi que se executado da seguinte forma funciona:

SELECT P.PRO_COD
FROM TPROTOCOLOW P
INNER JOIN TPROT_STATUS S ON S.PRO_COD = P.PRO_COD
INNER JOIN TPROT_ITEM   I ON I.PRO_COD = P.PRO_COD
WHERE P.PRO_COD = :PRO_COD

Porém, colocando o parâmetro no INNER JOIN ele não funciona: (exemplo apenas)

SELECT P.PRO_COD
FROM TPROTOCOLOW P
INNER JOIN TPROT_STATUS S ON S.PRO_COD = P.PRO_COD
INNER JOIN TPROT_ITEM   I ON I.PRO_COD = :PRO_COD

Assim retorna a mensagem: "Syntax error or access violation"

O comando "Prepared" não existe para o ClientDataSet.

Será que o DBExpress tem alguma incompatibilidade com SQL Server???
GOSTEI 0
POSTAR