Unassigned Code em SP

Delphi

05/03/2008

Antes da minha SP ter parâmetros do tipo data, funcionava belezinha . Foi só colocar a data que começou a encrenca do [b:3e1b475c5e]UNASSIGNED CODE[/b:3e1b475c5e]

Tentei fazer as dicas do pessoal aqui do fórum , mas nenhuma deu certo.

FB 1.5
DBExpress


  
with dmMovimento1.qyGridAcompanh do
  begin
    CLOSE;
    sql.clear;
    sql.TEXT := ´select * from SALL_ACOMPANH(:PCODACO, :PCODCON, :PORIOCO, :PCODCLA, :PCODSTA, :PDATAIN, :PDATAFI, :PORDEM)´;
    ParamByName(´PCODACO´).value := xFiltroSelect.Key1;
    ParamByName(´PCODCON´).value := xFiltroSelect.Key2;
    ParamByName(´PORIOCO´).value := xFiltroSelect.Key3;
    ParamByName(´PCODCLA´).value := xFiltroSelect.Key4;
    ParamByName(´PCODSTA´).value := xFiltroSelect.Key5;
    ParamByName(´PDATAIN´).asdate := edDatAcoIni.date;
    ParamByName(´PDATAFI´).asdate := edDatAcoFim.date;
    ParamByName(´PORDEM´).value := xFiltroSelect.Ordenacao;
    Open;
  end;



Powerlog Tecnologia

Powerlog Tecnologia

Curtidas 0

Respostas

Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

Só para complementar:

Isso só acontece em parâmetros do tipo DATA em uma SP que me retorna a SELECT.

Em SP de Insert, Update funciona normal...


GOSTEI 0
Hall 9000

Hall 9000

05/03/2008

Uso DBExpress FB 1.5.
Tenho uma base de dados com uma tabela VENDA que tem data. Fiz um teste e funcionou.
Você tem que fazer as tradicionais ligações: sqldataset ao connection, depois um provider ao sqldataset, um clientdataset ao provider e ligar o datasource ao cds.

Na consulta vc passa o parâmetro para o sqldataset (fechado) depois da um close e open no CLIENTDATASET e NÃO no sqldataset.

procedure TForm1.Button1Click(Sender: TObject);
begin
with SQLDataSet1 do
begin
Close;
ClientDataSet1.Close;
CommandText:= ´SELECT * FROM VENDA WHERE DATA_VENDA = :DT ´;
Params.ParamByName(´DT´).AsDate:= DateEdit1.Date;
ClientDataSet1.Open;
end;
end;

Tenta isso.
Falou.


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

Colega, tentei fazer o que vc me pediu e ficou assim:

  with dmMovimento1.sqlSp_Datas do
  begin
    Close;
    CommandText:= ´select * from SALL_ACOMPANH(:PCODACO, :PCODCON, :PORIOCO, :PCODCLA, :PCODSTA, :PDATAIN, :PDATAFI, :PORDEM)´;
    Params.ParamByName(´PCODACO´).asinteger := xFiltroSelect.Key1;
    Params.ParamByName(´PCODCON´).asinteger := xFiltroSelect.Key2;
    Params.ParamByName(´PORIOCO´).asinteger := xFiltroSelect.Key3;
    Params.ParamByName(´PCODCLA´).asinteger := xFiltroSelect.Key4;
    Params.ParamByName(´PCODSTA´).asinteger := xFiltroSelect.Key5;
    Params.ParamByName(´PDATAIN´).asdate := edDatAcoIni.date;
    Params.ParamByName(´PDATAFI´).asdate := edDatAcoFim.date;
    Params.ParamByName(´PORDEM´).asstring := xFiltroSelect.Ordenacao;
    cdsacompanh.Open;
    cdsacompanh.IndexFieldNames := ´codaco;dinaco´;
  end;



Porém agora dá outro erro:

password required


Lembrando que antes dos parâmetros DATA funcionava ... :cry:


GOSTEI 0
Bico

Bico

05/03/2008

Bom dia.

Cara, trabalhar com datas em stored procedure é meio complicado.
Acredito que a forma mais fácil de solucionar este problema seria passar os parâmetros diretamente no SQL.

Por exemplo:
Esta seria minha stored procedure:
CREATE PROCEDURE TESTE_DATA (COD_PES INTEGER, DATA_INI DATE, DATA_FIM DATE)
RETURNS (NRO_NF CHAR(8), VALOR NUMERIC(12,2), DATA DATE)
AS BEGIN
  FOR
    SELECT S.NUM_DUP, S.VLR, S.DATA
    FROM SAIDA S
    WHERE S.COD_PES = :COD_PES
    AND S.DATA >= :DATA_INI
    AND S.DATA <= :DATA_FIM
    ORDER BY S.NUM_DUP
  INTO :NRO_NF, :VALOR, :DATA
  DO SUSPEND;
END;


Para executá-la diretamente no banco:
SELECT * FROM TESTE_DATA(1555, ´01.12.2007´, ´01.01.2008´)


No delphi você poderia montar o SQL da seguinte forma:
function TForm1.BuscarNotas(CodCli: integer; DTIni, DTFim: TDateTime): boolean;
var
  SQL, sDTIni, sDTFim: string;
begin
  sDTIni := FormatDateTime(´DD.MM.YYYY´, DTIni);
  sDTFim := FormatDateTime(´DD.MM.YYYY´, DTFim);
  SQL := Format(´SELECT * FROM TESTE_DATA(´ + IntToStr(CodCli) + ´, ¬s, ¬s)´, [QuotedStr(sDTIni), QuotedStr(sDTFim)]);
  ...
end;


Atenciosamente,
Fernando.


GOSTEI 0
Hall 9000

Hall 9000

05/03/2008

Essa mensagem aparece geralmente quando a propriedade LoginPrompt esta setada para True.

No seu código ainda falou fechar o cds antes de dar o Open:
with dmMovimento1.sqlSp_Datas do
begin
Close;
CommandText:= ´select * from SALL_ACOMPANH(:PCODACO, :PCODCON, :PORIOCO, :PCODCLA, :PCODSTA, :PDATAIN, :PDATAFI, :PORDEM)´;
Params.ParamByName(´PCODACO´).asinteger := xFiltroSelect.Key1;
Params.ParamByName(´PCODCON´).asinteger := xFiltroSelect.Key2;
Params.ParamByName(´PORIOCO´).asinteger := xFiltroSelect.Key3;
Params.ParamByName(´PCODCLA´).asinteger := xFiltroSelect.Key4;
Params.ParamByName(´PCODSTA´).asinteger := xFiltroSelect.Key5;
Params.ParamByName(´PDATAIN´).asdate := edDatAcoIni.date;
Params.ParamByName(´PDATAFI´).asdate := edDatAcoFim.date;
Params.ParamByName(´PORDEM´).asstring := xFiltroSelect.Ordenacao;
cdsacompanh.Close; /// ====>>> Fechar o ClientDataSet
cdsacompanh.Open;
cdsacompanh.IndexFieldNames := ´codaco;dinaco´;
end;


Estranho que funciona sem o parametro da data... esperimenta tira-lo agora e fazer um teste para ver se ainda funciona... Vc está usando o SQLConnection?


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

Colega Hall 9000: o close eu dei antes de chamar a select, pois tenho uma função que fecha todos os CDSs.

Colega Bico: já tentei passar por parâmetro nesse formato dd.mm.yyyy nas não dessa forma que vc mostrou com ¬s. Vou tentar e posto aqui...


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

Ô negócio difícil datas...

Mesmo com as dicas do Bico:

[b:5d27d19c2b]password required[/b:5d27d19c2b]


tá louco...


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

alguma luz no fim do túnel ?????


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

05/03/2008

with dmMovimento1.sqlSp_Datas do
begin
    Close;
    CommandText:= ´select * from SALL_ACOMPANH(:PCODACO, :PCODCON, :PORIOCO, :PCODCLA, :PCODSTA, :PDATAIN, :PDATAFI, :PORDEM)´;
    Params.ParamByName(´PCODACO´).asinteger := xFiltroSelect.Key1;
    Params.ParamByName(´PCODCON´).asinteger := xFiltroSelect.Key2;
    Params.ParamByName(´PORIOCO´).asinteger := xFiltroSelect.Key3;
    Params.ParamByName(´PCODCLA´).asinteger := xFiltroSelect.Key4;
    Params.ParamByName(´PCODSTA´).asinteger := xFiltroSelect.Key5;
    Params.ParamByName(´PDATAIN´).asSQLTimeStamp := DateTimeToSqlTimeStamp(edDatAcoIni.date);
    Params.ParamByName(´PDATAFI´).asSQLTimeStamp := DateTimeToSqlTimeStamp(edDatAcoFim.date);
    Params.ParamByName(´PORDEM´).asstring := xFiltroSelect.Ordenacao;
    cdsacompanh.Open;
    cdsacompanh.IndexFieldNames := ´codaco;dinaco´;
  end;

acrescente a unit SqlTimSt à cláusula uses


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

Colega Emerson...

expression evaluation not supported password required


Copiei e colei do jeito que vc informou...

Será alguma configuração no componente SQLConnection ?


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

05/03/2008

Consegui resolver passando os parâmetros como STRING.

No Delphi:
              SQL.text := ´ select * from smov_areceber_boleto(´+
                      inttostr(fFiltroSelect.key1)+´,´+inttostr(fFiltroSelect.key2)+´,´+
                           iif(fFiltroSelect.dat1 = 0 , ´null´, QuotedStr(FormatDateTime(´dd.mm.yyyy´,fFiltroSelect.dat1)))+´,´+
                           iif(fFiltroSelect.dat2 = 0 , ´null´, QuotedStr(FormatDateTime(´dd.mm.yyyy´,fFiltroSelect.dat2)))+´)´;

No IBExpert:
CREATE OR ALTER PROCEDURE SMOV_ARECEBER_BOLETO(
    PREC_CODIGO INTEGER,
    PREC_CODCLI INTEGER,
    PDATINI VARCHAR(10),
    PDATFIM VARCHAR(10))
RETURNS (
    REC_CODIGO INTEGER,
(...)
  sqltext = ´select * from ARECEBER a where 1 = 1 ´;
    if ((:pREC_CODIGO is not null) and (:pREC_CODIGO > 0)) then
      sqltext = sqltext || ´ and REC_CODIGO = ´|| :pREC_CODIGO;

    if ((:PREC_CODCLI is not null) and (:PREC_CODCLI > 0)) then
      sqltext = sqltext || ´ and REC_CODCLI = ´|| :PREC_CODCLI;

    if (:PDATINI is not null) then
      sqltext = sqltext || ´ and a.rec_datven >= ´´´||:PDATINI||´´´´;
    if (:PDATFIM is not null) then
      sqltext = sqltext || ´ and a.rec_datven <= ´´´||:PDATFIM||´´´´;



Espero ter ajudado mais alguém !

PS: Agora uso o FB 2.03, talvez também tenha feito diferença...


GOSTEI 0
POSTAR