GARANTIR DESCONTO

Fórum DBExpress(SQLStoredProc) SQL 2000 #267627

06/02/2005

0

Ola,
Delphi 7, DBExpress.
Estou com problema ao usar SQLStoredProc em uma Procedure que contenha Params:
Segue o Codigo da Procedure :

CREATE PROCEDURE Mov_Vend @NOME AS NVARCHAR(36), @ORIG AS NVARCHAR(1)
AS
BEGIN
DECLARE @CODIGO AS NVARCHAR(10)
SET @CODIGO = NULL
BEGIN TRANSACTION
SET @CODIGO = (Select Max(Codigo)As MaxCod From Vend)
IF @CODIGO <> NULL
BEGIN
SET @CODIGO = CAST((@CODIGO) AS INTEGER) + 1
SET @CODIGO = ´00´ + CAST(@CODIGO AS NVARCHAR(2))
SET @CODIGO = SUBSTRING(@CODIGO, LEN(@CODIGO)-1, 2)
END
ELSE
BEGIN
SET @CODIGO = ´01´
END
INSERT INTO VEND (CODIGO, NOME, ORIG) Values (@CODIGO, @NOME, @ORIG)
COMMIT TRANSACTION
END
GO

Segue o Codigo no Delphi:

VAR
P1, P2: TParam;
begin
with SQLStoredProc1 do
begin
StoredProcName := ´Mov_Vend ´;
Params.Clear;
P1 := TParam.Create(Params, ptInput);
P2 := TParam.Create(Params, ptInput);
Params[0].Name := ´@NOME´;
Params[1].Name := ´@ORIG´;
ParamByName(´@NOME´).AsString := tVendNome.Value;
ParamByName(´@Orig´).AsString := ´M´;
ExecProc;
END;
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de inclusão do registro: ´ + Exc.Message);
Abort;
end;
end;
P1.Free;
P2.Free;
end;


Iranilson

Iranilson

Responder

Posts

06/02/2005

Bon Jovi

E qual erro é retornado??


Responder

Gostei + 0

07/02/2005

Iranilson

Ola!
Quando passa por ExecProc, erro eo segunte:
LIST INDEX OUT OF BOUNDS (0).

Valeu!


Responder

Gostei + 0

08/02/2005

Bon Jovi

Criando os parametros em tempo de projeto tb acontece o mesmo?

Caso tenha q criar em tempo de execução, tente de outra forma, com CreateParam:

[size=9:6aafd2514a]SQLStoredProc1.SQLConnection := SQLConnection1;
SQLStoredProc1.StoredProcName := ´dbo.Mov_Vend´;
SQLStoredProc1.Params.Clear;
SQLStoredProc1.Params.CreateParam(ftString, ´@NOME´, ptInput);
SQLStoredProc1.Params.CreateParam(ftString, ´@ORIG´, ptInput);
SQLStoredProc1.ParamByName(´@NOME´).AsString := ´xxx´;
SQLStoredProc1.ParamByName(´@ORIG´).AsString := ´M´;
SQLStoredProc1.ExecProc;[/size:6aafd2514a]


Responder

Gostei + 0

09/02/2005

Iranilson

OI
Em tempo de projeto da o mesmo erro ´LIST INDEX OUT OF BOUNDS (0). ´ Agora que vc passou este código esta dando este: ´MOV_VEND EXPECTS PARAMETER @ORIG, WHICH WAS NOT SUPPLIED´. É aparentemente é um problema facil, mais estou com esse problema ja algum tempo. espero que alguem consiga me esclarecer o que esta acontecedo. Ja postei em varios Fórum até agora nada vc foi o unico que se enteresou.
OBRIGADO BON JOVI


Responder

Gostei + 0

09/02/2005

Bon Jovi

Resolvi fazer um teste e vi q funciona criando os parametros em tempo de projeto.

Usei:

Delphi 7 update 1
MDAC 2.8
WinXP Pro SP2
SQL Server 2000 SP3

Os mais importantes são MDAC 2.8 e o Delphi 7 atualizado.

Segue código testado:

[.DFM]
object SQLConnection1: TSQLConnection
  ConnectionName = ´MSSQLConnection´
  DriverName = ´MSSQL´
  GetDriverFunc = ´getSQLDriverMSSQL´
  LibraryName = ´dbexpmss.dll´
  LoginPrompt = False
  Params.Strings = (
    ´DriverName=MSSQL´
    ´HostName=.´
    ´DataBase=tempdb´
    ´User_Name=desenv´
    ´Password=desenv´
    ´BlobSize=-1´
    ´ErrorResourceFile=´
    ´LocaleCode=0000´
    ´MSSQL TransIsolation=ReadCommited´
    ´OS Authentication=False´)
  VendorLib = ´oledb´
  Left = 84
  Top = 4
end
object SQLStoredProc1: TSQLStoredProc
  MaxBlobSize = -1
  Params = <
    item
      DataType = ftInteger
      Name = ´@RETURN_VALUE´
      ParamType = ptResult
      Size = 4
    end
    item
      DataType = ftString
      Name = ´@NOME´
      ParamType = ptInput
    end
    item
      DataType = ftString
      Name = ´@ORIG´
      ParamType = ptInput
    end>
  SQLConnection = SQLConnection1
  StoredProcName = ´dbo.Mov_Vend´
  Left = 112
  Top = 4
end


[.PAS]
procedure TForm1.Button1Click(Sender: TObject);
begin
  SQLStoredProc1.ParamByName(´@NOME´).AsString := ´xxx´;
  SQLStoredProc1.ParamByName(´@ORIG´).AsString := ´M´;
  SQLStoredProc1.ExecProc;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SQLConnection1.Connected := True;  
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SQLConnection1.Connected := False; 
end;


SQLSERVER:

CREATE TABLE VEND (CODIGO NVARCHAR(10), NOME NVARCHAR(36), ORIG NVARCHAR(1))
GO

CREATE PROCEDURE Mov_Vend @NOME AS NVARCHAR(36), @ORIG AS NVARCHAR(1) 
AS 
BEGIN 
DECLARE @CODIGO AS NVARCHAR(10) 
SET @CODIGO = NULL 
BEGIN TRANSACTION 
SET @CODIGO = (Select Max(Codigo)As MaxCod From Vend) 
IF @CODIGO <> NULL 
BEGIN 
SET @CODIGO = CAST((@CODIGO) AS INTEGER) + 1 
SET @CODIGO = ´00´ + CAST(@CODIGO AS NVARCHAR(2)) 
SET @CODIGO = SUBSTRING(@CODIGO, LEN(@CODIGO)-1, 2) 
END 
ELSE 
BEGIN 
SET @CODIGO = ´01´ 
END 
INSERT INTO VEND (CODIGO, NOME, ORIG) Values (@CODIGO, @NOME, @ORIG) 
COMMIT TRANSACTION 
END 
GO 



Responder

Gostei + 0

10/02/2005

Iranilson

Valeu! deu certo.
Obrigado mais uma vez.


Responder

Gostei + 0

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

Aceitar