Interbase (Stored Procedures)

Firebird

11/12/2003

Olá!

Tenho uma rotina em meus fontes que ativa alguns botões e na hora de gravar os dados ela executa uma SP, só que quando a SP é executada me é dado esse erro:
Required param value not set

O que poderá ser isso? E como faria para resolver?

Obrigado.


Martins

Martins

Curtidas 0

Respostas

Afarias

Afarias

11/12/2003

a STORED PROCEDURE tem algum parâmetro de entrada que vc deve preencher. Use a propriedade Params para isso.


T+


GOSTEI 0
Martins

Martins

11/12/2003

Olá A. Farias!
Como vai V.Sa.?

A. Farias a minha SP é essa:

begin
/*Inclusão de Dados*/
IF (TIPO=1) then
begin
/* Gera um novo codigo a partir de generator */
select gen_id (gen_empresa_id,1) from rdb$database INTO :REG;
insert into empresa (codigo, razao, mes_ano, endereco, complemento, numero, bairro,
distrito, sub_distrito, cidade, estado, cep, fone, fax, cnpj,
insc_est, insc_mun, cpf, e_mail, url, cnae_f, descr_cnae, nat_estab,
atividade, cod_mun_rais, nat_jur_rais, cod_pag_gps, tipo_empresa,
mes_dissidio, fpas, cnae, cod_cei, cod_ter, perc_ter, inss_empregador,
inss_empresa, capital_ini, arredonda, perc_sat, op_fgts, perc_slr_educ)

values (:codigo, :razao, :mes_ano, :endereco, :complemento, :numero, :bairro,
:distrito, :sub_distrito, :cidade, :estado, :cep, :fone, :fax,:cnpj,
:insc_est, :INSC_MUN, :cpf, :e_mail, :url,:cnae_f, :descr_cnae, :nat_estab,
:atividade, :cod_mun_rais, :nat_jur_rais, :cod_pag_gps, :tipo_empresa,
:mes_dissidio, :fpas, :cnae, :cod_cei, :cod_ter, :perc_ter, :inss_empregador,
:inss_empresa, :capital_ini, :arredonda, :perc_sat, :op_fgts, :perc_slr_educ);
suspend;
end
/* Alteração*/

if (TIPO=2) then
begin
update empresa set
razao =:razao,
mes_ano =:mes_ano,
endereco =:endereco,
complemento =:complemento,
numero =:numero,
bairro =:bairro,
distrito =:distrito,
sub_distrito =:sub_distrito,
cidade =:cidade,
estado =:estado,
cep =:cep,
fone =:fone,
fax =:fax,
cnpj =:cnpj,
insc_est =:insc_est,
insc_mun =:insc_mun,
cpf =:cpf,
e_mail =:e_mail,
url =:url,
cnae_f =:cnae_f,
descr_cnae =:descr_cnae
where codigo =:codigo;
end

/*Exlusão*/

if (TIPO=3) then
begin
delete from empresa where codigo =:codigo;
suspend;
end
end

Utilizo em meu DataModule os componentes:

IBDatabase, IBTransaction, IBStoredproc, IBTable (Estou pensando em mudar para IBDataset ou IBQuery / Estou vendo tb a possibilidade de mudar DBExpress).

No meu IBStoredproc tenho:
AutoCalcFields:True, meu database, Filtered: false, ForceRefresh:false,
nome da minha SP, ObjectView:false, e meus parametros, etc...

Esse é o codigo fonte:
procedure Tela_Banco( SP:TIBStoredProc; Form:TForm; Tipo:Integer );
var
i: integer;
Source: TParam;
sForm: String;
begin
for i := 0 to Form.ComponentCount-1 do
begin
//--> Localizar o Parametro na Stored Procedure
Source := SP.Params.FindParam( Form.Components[i].Name );
if Source <> nil then
begin
//--> Verifica se é Edit
if Form.Components[i] is TEdit then
begin
if Source.DataType = ftString then
Source.Value := TEdit(Form.Components[i]).Text;
if Source.DataType = ftDateTime then
begin
if TEdit(Form.Components[i]).Text <> ´´ then
Source.Value := StrToDateTime(TEdit(Form.Components[i]).Text);
end;
if Source.DataType in [ftFloat, ftInteger] then
begin
if TEdit(Form.Components[i]).Text <> ´´ then
Source.Value := StrToFloat(TEdit(Form.Components[i]).Text);
end;
end;
//--> Verifica se é MaskEdit
if Form.Components[i] is TMaskEdit then
begin
if Source.DataType = ftString then
Source.Value := TMaskEdit(Form.Components[i]).Text;
if Source.DataType = ftDateTime then
begin
if TMaskEdit(Form.Components[i]).Text <> ´´ then
Source.Value := StrToDateTime(TMaskEdit(Form.Components[i]).Text)
else
Source.Clear;
end;
if Source.DataType in [ftFloat, ftInteger] then
begin
if TMaskEdit(Form.Components[i]).Text <> ´´ then
Source.Value := StrToFloat(TMaskEdit(Form.Components[i]).Text);
end;
end;
//--> Verifica se é ComboBox
if Form.Components[i] is TComboBox then
Source.Value := TComboBox(Form.Components[i]).Text;
//--> Verifica se é DBLookupComboBox
if Form.Components[i] is TDBLookupComboBox then
Source.Value := Trim(TDBLookupComboBox(Form.Components[i]).KeyValue);
//--> Verifica se é RichEdit
if Form.Components[i] is TRichEdit then
Source.Value := TRichEdit(Form.Components[i]).Text;
//--> Verifica se é Memo
if Form.Components[i] is TMemo then
Source.Value := TMemo(Form.Components[i]).Text;
//--> Verifica se é TDateEdit (RX)
if Form.Components[i] is TDateEdit then
if TDateEdit(Form.Components[i]).Text <> ´ / / ´ then
Source.Value := TDateEdit(Form.Components[i]).Date
else
Source.Clear;
//--> Verifica se é TRxCalcEdit
if Form.Components[i] is TRxCalcEdit then
Source.Value := TRxCalcEdit(Form.Components[i]).Value;
//--> Verifica se é TComboEdit (RX)
if Form.Components[i] is TComboEdit then
Source.Value := TComboEdit(Form.Components[i]).Text;
end;
end;
//--> Passagem da operacao que a SP irá executar, 1 - Incluir, 2 - Alterar, 3 - Excluir
Source := SP.Params.FindParam(´TIPO´);
if Source <> nil then
Source.Value := Tipo;
//--> Obter nome do formulário ativo
sForm := Screen.ActiveForm.Name;
//--> Abrir transação
try
SP.ExecProc; //--> Executa Procedure [color=red:bbd8a98891](Quando executo aqui me é mostrado o erro!) [/color:bbd8a98891]
DMFolha.Conexao.Commit; //--> ´Comita´ transacao
DMFolha.Conexao.CommitRetaining; //--> ´Commita´ transação e reinicia
except on E: EDataBaseError do //--> Se o banco retornar algum erro...
begin
DMFolha.Conexao.Rollback; //--> Desfaz...
MessageDlg(´Problemas no envio dos dados ao servidor!´+#13+10+13+10+
´Formulário: ´+sForm+13+10+
´Procedure: ´+SP.StoredProcName+13+10+
´Mensagem: ´+E.Message+13+10+13+10+
´Contate o suporte informando os dados acima!´, mtError, [mbOK], 0);
end;
end;
end;


GOSTEI 0
Afarias

Afarias

11/12/2003

Wooouuu!!!


bom, o q pude observar :

1- vc não abre a transação
2- um commitRetaining após um commit é inútil e vai gerar erro
3- vc preenche os parâmetros de acordo com os componentes, quando deveria fazer o contrário (eu acho)

4- se continuar com problemas, tente dar um prepare no StoredProc antes de preencher os parâmetros.

5- como SP é um parâmetro ... vc deveria controlar a transação a partir dele::

Sp.Transaction.StartTransaction;

{...}

Sp.Transaction.Commit;




T+


GOSTEI 0
Martins

Martins

11/12/2003

Quando eu dou um clique com o botao direito sobre a minha IBStored Proc e seleciono execute me diz : Requerid param value not set

Mas quando é sobre uma SQLStoredProc não me dá esse erro, por que será?


GOSTEI 0
Afarias

Afarias

11/12/2003

|Mas quando é sobre uma SQLStoredProc não me dá esse erro, por que
|será?

que diferença isso faz?? Qual a utilidade de executar um procedimento em tempo de projeto??



T+


GOSTEI 0
Jb_holambra

Jb_holambra

11/12/2003

No projeto do delphi:

No form de inclusão
...

SP.ParamByName(´TIPO´).value := 1;
SP.ParamByName(´NOME´).value := edtnome.Text;
SP.ParamByName...
...
SP.Execute;

...

Na Store procedure:

CREATE PROCEDURE CADASTRO_FULANOS
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE NOME VARCHAR(20);
...
begin

/*Inclusão de Dados*/
IF (TIPO=1) then
begin
INSERT INTO TBL_FULANOS (NOME,...) VALUES ( :NOME, ...);
end;
...
end


GOSTEI 0
POSTAR