 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 15, 2007 10:35 am Assunto: Problemas para gravar uma Stored Procedure? |
|
|
Olah pessoal eh o sequinte criei uma SP e preciso passar os valores para ela, mais esta gerando o sequinte erro "List index out of bounds(31)"
O problema esta somente quando tento passar por query
Código: | N := ComponentCount;
for I := 0 to N-1 do
begin
if (Components[I] is TEdit) AND ((Components[I] as TEdit).Tag > 0) AND ((Components[I] as TEdit).Text <> '') then
begin
with {dm.QSP_Todomes} DM.IBQTODOMES do
begin
close;
SQL.clear;
//Chama a Stored procedure no IBQuery para gravar
//sql.add('EXECUTE PROCEDURE SP_TodoMes (:sequencia, :ano,:conta_d, :conta_c, :mes, :valor, :historico, :contap_d, :contap_c, :nomenclatura1, :nomenclatura2, :mesvar)');
sql.add(' Insert Into todomesconta (ano, conta_d, conta_c, mes, valor, historico, contap_d, contap_c, nomenclatura1, nomenclatura2, mesvar)');
sql.add(' Values (:ano,:conta_d, :conta_c, :mes, :valor, :historico, :contap_d, :contap_c, :nomenclatura1, :nomenclatura2, :mesvar)');
//{passando dos edits para o paramentro do Stored Procedure
ParamByName('ano').AsString :=edtAno.text;
ParamByName('conta_D').AsString :=edtDebito.text;
ParamByName('conta_C').AsString :=edtCredito.Text;
ParambyName('historico').AsString :=edtHistorico.Text;
ParamByName('contap_d').AsString :=et1.text;
ParamByName('contap_c').asString :=et2.text;
ParamByName('nomenclatura1').AsString :=Label12.caption;
ParamByName('nomenclatura2').AsString :=Label13.caption;
ParamByname('mes').Value := (Components[I] as TEdit).Tag;
Case (Components[I] as TEdit).Tag of
1: ParamByName('Valor').Value:= StrToCurr((Components[I] as TEdit).Text);
2: ParamByName('Valor').Value:= StrToCurr((Components[I] as TEdit).Text);
3: ParamByName('Valor').Value:= StrToCurr((Components[I] as TEdit).Text);
{essa case vai ateh a tag do edit 12} nao postei mais o codigo pq da erro aki no forum
end;
execSQL; |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Editado pela última vez por adriano_servitec em Seg Jan 15, 2007 10:58 am, num total de 1 vez |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 15, 2007 10:37 am Assunto: |
|
|
Continuando pq nao deu para postar tudo num post
Por IBTable nao tem problema
Código: | N := ComponentCount;
for I := 0 to N-1 do
begin
if (Components[I] is TEdit) AND ((Components[I] as TEdit).Tag > 0) AND ((Components[I] as TEdit).Text <> '') then
begin
dm.IBTodoMes.Append; {para incluir na Tabela usando um DataSet}
{passando os dados do edit para o DataSet}
dm.IBTodoMesano.Value := edtAno.Text;
dm.IBTodoMesHistorico.Value := edtHistorico.Text;
dm.IBTodoMesConta_D.Value := edtDebito.Text;
dm.IBTodoMesConta_C.Value := edtCredito.Text;
dm.IBTodoMesContaP_D.Value := et1.Text;
dm.IBTodoMesContaP_C.Value := et2.Text;
dm.IBTodoMesNOMENCLATURA1.Value := LABEL12.CAPTION;
dm.IBTodoMesNOMENCLATURA2.Value := LABEL13.CAPTION;
dm.IBTodoMesMes.Value := (Components[I] as TEdit).Tag;
Case (Components[I] as TEdit).Tag of
1: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text);
2: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text);
3: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text);
4: DM.IBTodoMesValor.Value := StrToCurr((Components[I] as TEdit).Text);
{tambem vai ateh a tag do edit12}
end;
dm.IBTodoMes.Post; {para gravar na tabela}
end; |
Tambem nao da erro usando CDS
E eu preciso passar esses dados por uma Stored Procedure
Grato a ajuda de todos
Adriano. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Editado pela última vez por adriano_servitec em Seg Jan 15, 2007 10:47 am, num total de 1 vez |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 15, 2007 10:45 am Assunto: |
|
|
Desculpe postar em tanto post assim, mais foi a unica maneira que encontrei para msotrar o meu problema
Nao sei se precisa, mais tambem vou postar a StoredPorc
Código: | CREATE PROCEDURE SP_TODOMES (
SEQUENCIA INTEGER,
ANO VARCHAR(4),
CONTA_D VARCHAR(15),
CONTA_C VARCHAR(15),
MES INTEGER,
VALOR NUMERIC(15,2),
HISTORICO VARCHAR(100),
CONTAP_D VARCHAR(15),
CONTAP_C VARCHAR(15),
NOMENCLATURA1 VARCHAR(50),
NOMENCLATURA2 VARCHAR(50),
MESVAR VARCHAR(2))
AS
begin
if ( not exists(select sequencia from todomesconta where sequencia = :sequencia) )
then
Insert Into todomesconta (sequencia, ano, conta_d, conta_c, mes, valor, historico, contap_d, contap_c, nomenclatura1, nomenclatura2, mesvar)
Values (:sequencia, :ano, :conta_d, :conta_c, :mes, :valor, :historico, :contap_d, :contap_c, :nomenclatura1, :nomenclatura2, :mesvar);
Insert Into debitotmes (sequencia, ano, conta_d, conta_c, mes, valor, historico, contap_d, contap_c, nomenclatura1, nomenclatura2, mesvar)
Values (:sequencia, :ano, :conta_d, :conta_c, :mes, :valor, :historico, :contap_d, :contap_c, :nomenclatura1, :nomenclatura2, :mesvar);
Insert Into creditomes (sequencia, ano, conta_d, conta_c, mes, valor, historico, contap_d, contap_c, nomenclatura1, nomenclatura2, mesvar)
Values (:sequencia, :ano, :conta_d, :conta_c, :mes, :valor, :historico, :contap_d, :contap_c, :nomenclatura1, :nomenclatura2, :mesvar);
end |
Falando na Stored Procedure, essa que eu mostrei acima ja esta feita o probelma foi quando quis joga-la para um IBQuery de o sequinte erro na hora de ativa-la
Validation error for column, ANO "***null***" at Procedure "SP_TodoMes"
Grato a ajuda de todos
Adriano. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Qui Jan 18, 2007 6:20 pm Assunto: |
|
|
Você pode usar uma trigger!
Agora com relação ao erro anteriormente citado, deve estar relacionado ao laço (quantidade de componentes) existentes. Se o valor for maior irá aparecer essa mensagem de erro. Por exemplo, na linha
Código: | Case (Components[I] as TEdit).Tag of |
Você força que o componente contido no Array Components seja um TEdit, porém se não for, irá retornar uma mensagem de erro. Para isso,verifique se o componente é mesmo um edit usando o IS:
Código: | if Components[I] is TEdit then... |
_________________ Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Jan 18, 2007 9:38 pm Assunto: |
|
|
thomazs escreveu: | Você pode usar uma trigger!
Agora com relação ao erro anteriormente citado, deve estar relacionado ao laço (quantidade de componentes) existentes. Se o valor for maior irá aparecer essa mensagem de erro. Por exemplo, na linha
Código: | Case (Components[I] as TEdit).Tag of |
Você força que o componente contido no Array Components seja um TEdit, porém se não for, irá retornar uma mensagem de erro. Para isso,verifique se o componente é mesmo um edit usando o IS:
Código: | if Components[I] is TEdit then... |
| Olah Thomazs, obrigado amigo, por sempre estar me ajudando, mais eu nao sei como usar uma trigger neste caso, nao entendo praticamente nada de trigger e SP, estou tentando fazer mais praticamente o que eu sei eh zero. Sobre o erro acima resolvi usar as tables mesmo. Queria postar o codigo aki, mais o forum nao suporta o tamanho do codigo final. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 22, 2007 5:49 pm Assunto: |
|
|
Nao consigo passar por SP de maneira alguma
olha o codigo
Código: | procedure TForm3.b2Click(Sender: TObject);
var i, n: SmallInt;
begin
N := ComponentCount;
for I := 0 to N-1 do
begin
if (Components[I] is TEdit) AND ((Components[I] as TEdit).Tag > 0) AND ((Components[I] as TEdit).Tag < 13) and ((Components[I] as TEdit).Text <> '') then
begin
{comandos de inserção }
if application.messagebox(PChar('Deseja Gravar este Lançamento?'), PChar('Incluir Dados'+Self.Caption),MB_IConquestion +MB_YesNo)=IDYES then
begin
with dm.SPqCorr do
begin
close;
SQL.clear;
sql.add('EXECUTE PROCEDURE SP_CORRENTE (:Matricula, :Associado, :Mespgto, :Mesrefini, :Mesreffim, :valor, :ano)');
ParamByName('Matricula').Value :=Edit1.text;
ParamByName('Associado').value :=label3.caption;
ParamByName('Mespgto').value :=strtodate(maskedit1.text);
ParamByName('Mesrefini').value :=strtodate(maskedit2.text);
ParamByName('Mesreffim').value :=strtodate(maskedit3.text);
{SValor deixei como variavel Global - Variavel sValor recebendo o valor que contem no componente edtValorPadrao}
sValor := edtValorPadrao.Text;
{transforma a variavel sValor para receber valores com ponto e virgula tipo 1.000,00}
sValor := stringreplace(sValor, '.', '', [rfReplaceAll]); |
Continua o post na parte de baixo por motivo de erro do forum _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Editado pela última vez por adriano_servitec em Seg Jan 22, 2007 5:54 pm, num total de 1 vez |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 22, 2007 5:51 pm Assunto: |
|
|
2ª parte do codigo
Código: | {Case recebendo a variavel sValor}
if Components[I] is TEdit then BEGIN
Case (Components[I] as TEdit).Tag of
1: ParamByName('valor').Value := StrToCurr( sValor );
2: ParamByName('valor').Value := StrToCurr( sValor );
3: ParamByName('valor').Value := StrToCurr( sValor );
4: ParamByName('valor').Value := StrToCurr( sValor );
5: ParamByName('valor').Value := StrToCurr( sValor );
6: ParamByName('valor').Value := StrToCurr( sValor );
7: ParamByName('valor').Value := StrToCurr( sValor );
8: ParamByName('valor').Value := StrToCurr( sValor );
9: ParamByName('valor').Value := StrToCurr( sValor );
10: ParamByName('valor').Value := StrToCurr( sValor );
11: ParamByName('valor').Value := StrToCurr( sValor );
12: ParamByName('valor').Value := StrToCurr( sValor );
end; //final do case
END; //FINAL DO IF
ParamByName('ano').value :=edtano.text;
try
ExecSql;
dm.ibtCorr.CommitRetaining;
...
... |
Nao passa para a Stored Procedure.
A Stored Procedure fiz assim
Código: | CREATE PROCEDURE SP_CORRENTE (
SEQUENCIA INTEGER,
MATRICULA VARCHAR(6),
ASSOCIADO VARCHAR(50),
MESPGTO DATE,
MESREFINI DATE,
MESREFFIM DATE,
VALOR NUMERIC(15,2),
ANO VARCHAR(4))
AS
begin
if ( not exists(select sequencia from CORRENTE where sequencia = :sequencia) )
then
Insert Into CORRENTE (matricula, associado, mespgto, mesrefini, mesreffim, valor, ano)
Values (:matricula, :associado, :mespgto, :mesrefini, :mesreffim, :valor, :ano);
end |
Nao sei o que faço para conseguir jogar estes parametros para SP.
Obrigado pela ajuda
Adriano. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
Lane1902 Experiente

Registrado: Quinta-Feira, 15 de Janeiro de 2004 Mensagens: 447
|
Enviada: Sex Jan 26, 2007 5:07 am Assunto: Ola Amigo. |
|
|
Vamos ver se posso ter ajudar um pouco a solucionar o problema de envio de campos para a StoredProcedure, voce esta usando campos edit nao ?, ok entao so uma dica, pra utilizar esta procedure nomeie os campos edits com o mesmo nome da base de dados, exemplo :
Campo na base de dados = COD_CLIENTE.
Nome do Edit na tela = COD_CLIENTE.
ok.
Segue a procedure:
Declarando a procedure:
{ Trazer os Dados da Tela p/ o Banco de Dados. }
procedure PTelaBC( Objeto: TIBStoredProc; Tipo: integer );
Criando a procedure:
procedure PTelaBC( Objeto: TIBStoredProc; Tipo: integer );
(*
Nome : PTelaBC
Objetivo : Carregar os Dados da Tela p/ o Banco de Dados.
Data : 19/01/2005.
Autor : Ricardo Scarpim.
Parâmetros:
Entrada :
Objeto = TStoredProcedure.
Tipo = Incluindo / Alterando.
OBS :
No Formulário, os Campos Devem Receber o Mesmo Nome que Consta na
Tabela, a Stored Procedure Também deverá Conter o Mesmo Nome do Campo
que Constar na Tabela.
*)
Var
i : integer;
Source : TParam;
sForm : String;
Form : TForm;
begin
With DMClientes, Objeto Do
begin
{ Pega o Nome do Form Ativo. }
Form := Screen.ActiveForm;
{ Inicia a Busca Pelo Nome dos Componentes no Form. }
For i := 0 To Form.ComponentCount - 1 Do
begin
{ Processar as Mensagens. }
Application.ProcessMessages;
{ Se Estiver no Intervalo de Componentes Exigido: }
IF ( Form.Components[i].ClassName = 'TMaskEdit' ) OR
( Form.Components[i].ClassName = 'TEdit' ) OR
( Form.Components[i].ClassName = 'TRichEdit' ) OR
( Form.Components[i].ClassName = 'TMemo' ) OR
( Form.Components[i].ClassName = 'TCheckBox' ) OR
( Form.Components[i].ClassName = 'TComboBox' ) OR
( Form.Components[i].ClassName = 'TDateEdit' ) OR
( Form.Components[i].ClassName = 'TRadioGroup' ) OR
( Form.Components[i].ClassName = 'TCurrencyEdit' ) OR
( Form.Components[i].ClassName = 'TFilenameEdit' ) OR
( Form.Components[i].ClassName = 'TDirectoryEdit' ) OR
( Form.Components[i].ClassName = 'TRxSpinEdit' )then
begin
{ Localizar o Parametro na Stored Procedure. }
Source := Objeto.Params.FindParam( Form.Components[i].Name );
{ Se Localizar o Objeto. }
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;
{ Se for do Tipo Data. }
IF Source.DataType = ftDateTime then
begin
IF TEdit( Form.Components[i] ).Text <> '' then
Source.Value := StrToDateTime( TEdit( Form.Components[i] ).Text );
end;
{ Se for do Tipo Flutuante. }
IF Source.DataType in [ftFloat, ftInteger] then
begin
IF TEdit(Form.Components[i]).Text <> '' then
Source.Value := StrToFloatDef(TEdit(Form.Components[i]).Text, 0 );
end;
end;
{ Verifica se é MaskEdit. }
IF Form.Components[i] is TMaskEdit then
begin
{ Tipo de Dado = string. }
IF Source.DataType = ftString then
begin
IF( Source.Name = 'CIF' ) then
Source.Value := FFormate( TMaskEdit( Form.Components [i] ).Text, 0 )
else
Source.Value := TMaskEdit( Form.Components[i] ).Text;
end;
{ Tipo de Dado = Data e Hora. }
IF Source.DataType = ftDate then
begin
IF( ( TMaskEdit(Form.Components[i]).Text <> '' ) AND ( TMaskEdit(Form.Components[i]).Text <> ' / / ' ) ) then
Source.Value := StrToDate( TMaskEdit(Form.Components[i]).Text )
else
Source.Value := NULL;
end;
{ Tipo de Dado = Float e Integer. }
IF Source.DataType in [ftFloat, ftInteger] then
begin
IF TMaskEdit(Form.Components[i]).Text <> '' then
Source.Value := StrToFloatDef( TMaskEdit(Form.Components[i]).Text, 0 );
end;
end;
{ 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]).Lines.Text;
{ Verifica se é CheckBox. }
IF Form.Components[i] is TCheckBox then
IF TCheckBox( Form.Components[i] ).Checked then
Source.Value := 1
else
Source.Value := 0;
{ Verifica se é ComboBox. }
IF Form.Components[i] is TComboBox then
Source.Value := TComboBox( Form.Components[i]).Text;
{ Verifica se é TDateEdit. }
IF Form.Components[i] is TDateEdit then
IF( ( TDateEdit(Form.Components[i]).Text <> '' ) AND ( TDateEdit(Form.Components[i]).Text <> ' / / ' ) ) then
Source.Value := TDateEdit( Form.Components[i]).Text
else
Source.Value := NULL;
{ Verifica se é RadioGroup. }
IF Form.Components[i] is TRadioGroup then
Source.Value := TRadioGroup( Form.Components[i]).ItemIndex;
{ Verificar se é TCurrencyEdit }
IF Form.Components[i] is TCurrencyEdit then
begin
{ Tipo de Dado = Float e Integer. }
IF Source.DataType in [ftFloat, ftInteger] then
begin
IF TCurrencyEdit(Form.Components[i]).Text <> '' then
Source.Value := StrToFloatDef( TCurrencyEdit( Form.Components[i] ).Text, 0 );
end;
end;
{ Verificar se é TFileNameEdit. }
IF Form.Components[i] is TFilenameEdit then
Source.Value := TFilenameEdit( Form.Components[i] ).Text;
{ Verificar se é TDirectoryEdit. }
IF Form.Components[i] is TDirectoryEdit then
Source.Value := TDirectoryEdit( Form.Components[i] ).Text;
{ Verificar se é TRxSpinEdit. }
IF Form.Components[i] is TRxSpinEdit then
Source.Value := TRxSpinEdit( Form.Components [i] ).Text;
end;
end;
end;
{ Passagem da Operacao que a SP irá Executar: 1 - Incluir 2 - Alterar 3 - Excluir. }
Source := Params.FindParam('Tipo');
IF Source <> NIL then
Source.Value := Tipo;
{ Obter nome do formulário ativo. }
sForm := Screen.ActiveForm.Name;
{ Iniciando Transação. }
Try
begin
{ Executa Procedure. }
ExecProc;
{ Comitar a Transação. }
DMConexao.Transaction.CommitRetaining;
end;
{ Se o Banco Retornar Algum Erro... . }
except on E: EDataBaseError do
begin
{ Mostrar a Mensagem. }
MessageDlg( 'Problemas no Envio dos Dados ao Servidor!' + #13 + #10 + #13 + #10 +
'Formulário: ' + sForm + #13 + #10 +
'Procedure: ' + Objeto.Name + #13 + #10 +
'Mensagem: ' + E.Message + #13 + #10 + #13 + #10 +
'Contate o Suporte Informando os Dados Acima!', mtError, [mbOK], 0);
end;
end;
end;
end;
Chame a procedure assim :
{ Procedimento para Levar os Dados da Tela para o Banco de Dados.}
PTelaBC( SpClientes, Operacao );
Espero ter ajudado voce, caso voce queira passar parametros diretamente sem utilizar esta procedure, basta colocar o nome do edit diferente do nome na base de dados e passar como parametro antes de chamar a procedure ex:
Params [ 9].Value := ednome.text;
PTelaBC( SpClientes, Operacao );
Ok um abraco, qualquer coisa manda ver. |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|