Help em SQL Parametrizada.

Delphi

18/11/2004

Olá pessoal. tudo bom ?

To com uma bronca que antes de postar o código que está ´quase Correto´, vou comentar o que quero que ele faça, e o que na realidade ele está fazendo.

Bom, tenho uma janela que registra o código do almoxarifado (empresa), o código do Treinamento, e os Funcionários que trabalham nesta empresa.

Quando comento a passagem os parametros, e defino os parametros na constante que insere diretamente os registros, ela funfa numa boa. Mas só que eu nao quero que seja assim, quero que ela registre os dados que eu passar no momento, ou seja, por parametros.

E o engraçado é que aparenta estar ótimo o código, pois faz 3 dias que to analisando este código e nao vejo o erro. Por isso venho pedir uma ajudinha a vocês.

Abaixo segue o código do botao gravar do meu formulário:

procedure TFrmListaChamada.SPGravarClick(Sender: TObject);
const
GravaLista: string = ´ insert into trn_listapresenca (almox, cod_treinamento, cod_funcionario) ´ +
´ values (:Palmox, :Ptreinamento, :PFuncionario) ´ ;

var
IndexListbox2: integer;
stringfuncionario: string;
stringempresa: string;
stringTreinamento: string;
begin
if IB_LookupCombo1.Text = ´´ then
begin
MessageDlg(´Almoxarifado não Informado.´+#13+10+´Favor Informar.´, mtWarning, [mbOK], 0);
IB_LookupCombo1.SetFocus ;
end
else
if IB_LookupCombo2.Text = ´´ then
begin
MessageDlg(´Treinamento não Informado.´+13+10+´Favor Informar´, mtWarning, [mbOK], 0);
IB_LookupCombo2.SetFocus ;
end
else
if IB_Date1.Value = 0 then
begin
MessageDlg(´Data do Treinamento não Informado.´+13+10+´Favor Informar´, mtWarning, [mbOK], 0);
IB_Date1.SetFocus ;
end
else
if listbox2.Items.Count = 0 then
begin
MessageDlg(´Nenhum Funcionário Selecionado´+#13+10+´Para Realizar o Treinamento.´+13+10+´Favor Selecionar.´, mtWarning, [mbOK], 0);
listbox1.SetFocus ;
end
else
begin
for IndexListbox2 := 0 to listbox2.Items.Count - 1 do
begin
stringfuncionario := Trim(Copy(listbox2.Items.Strings[indexlistbox2], 1, 5));
end;
stringempresa := IB_Edit1.Text ;
stringTreinamento := IB_Edit2.Text ;
with qry_lista do
begin
close;
sql.Clear ;
prepared:= false;
sql.Add(GravaLista);
prepared:= true;
ParamByName(´:Palmox´).Value := trim(stringempresa) ;
ParamByName(´:Ptreinamento´).Value := trim(stringtreinamento);
ParamByName(´:Pfuncionario´).Value := strtoint(stringfuncionario);

ExecSQL ;
end;
SPGravar.Enabled := false;
SPAlterar.Enabled := true;
SPcancelar.Enabled := false;
SPIncluir.Enabled := true;
SPFechar.Enabled := true;
SpRelatorio.Enabled := true;
MessageDlg(´Lista de Presença Salva com Sucesso.´, mtInformation, [mbOK], 0);
FrmListaChamada.FormCreate(sender as TSpeedButton);
end;







end;

:shock: :lol: :?:


Technos

Technos

Curtidas 0

Respostas

Everton

Everton

18/11/2004

Colega, o problema está nos ´:´ colocados no nome do parâmetro. Basta retirar os ´:´. Ao invés de ...

ParamByName(´:Palmox´).Value := trim(stringempresa) ; 
ParamByName(´:Ptreinamento´).Value := trim(stringtreinamento); 
ParamByName(´:Pfuncionario´).Value := strtoint(stringfuncionario); 


colocar

ParamByName(´Palmox´).Value := Trim(StringEmpresa) ; 
ParamByName(´Ptreinamento´).Value := Trim(StringTreinamento); 
ParamByName(´Pfuncionario´).Value := StrToInt(StringFuncionario); 



Pelo que entendi do seu código, você quer percorrer o ListBox para obter o código do funcionário e disparar a instrução INSERT. Se for isso, você tem que remover o ´end;´ do trecho abaixo ...

  for IndexListbox2 := 0 to listbox2.Items.Count - 1 do 
  begin 
    StringFuncionario := Trim(Copy(listbox2.Items.Strings[indexlistbox2], 1, 5)); 
  end; // <<<<<<-- Esse


... e colocar após o trecho

    ExecSQL ; 
  end; 
end; // <<<< Aqui



O código ficou assim:

procedure TFrmListaChamada.SPGravarClick(Sender: TObject); 
const 
  GravaLista: string = ´ Insert into trn_listapresenca (almox,  cod_treinamento, cod_funcionario) ´ + 
´ values (:Palmox, :Ptreinamento, :PFuncionario) ´ ; 

var 
  IndexListbox2: integer; 
  StringFuncionario: string; 
  StringEmpresa: string; 
  StringTreinamento: string; 
begin 
  if IB_LookupCombo1.Text = ´´ then 
  begin 
    MessageDlg(´Almoxarifado não Informado.´+13+10+´Favor Informar.´, mtWarning, [mbOK], 0); 
    IB_LookupCombo1.SetFocus ; 
  end 
  else if IB_LookupCombo2.Text = ´´ then 
  begin 
    MessageDlg(´Treinamento não Informado.´+#13+10+´Favor Informar´, mtWarning, [mbOK], 0); 
    IB_LookupCombo2.SetFocus ; 
  end 
  else if IB_Date1.Value = 0 then 
  begin 
    MessageDlg(´Data do Treinamento não Informado.´+13+10+´Favor Informar´, mtWarning, [mbOK], 0); 
    IB_Date1.SetFocus ; 
  end 
  else if listbox2.Items.Count = 0 then 
  begin 
    MessageDlg(´Nenhum Funcionário Selecionado´+13+10+´Para Realizar o Treinamento.´+13+10+´Favor Selecionar.´, mtWarning, [mbOK], 0); 
    ListBox1.SetFocus ; 
  end 
  else 
  begin 
    for IndexListbox2 := 0 to listbox2.Items.Count - 1 do 
    begin 
      StringFuncionario := Trim(Copy(listbox2.Items.Strings[indexlistbox2], 1, 5)); 
      StringEmpresa := IB_Edit1.Text ; 
      StringTreinamento := IB_Edit2.Text ; 
      with qry_lista do 
      begin 
        Close; 
        SQL.Clear ; 
        Prepared:= false; 
        SQL.Add(GravaLista); 
        Prepared:= true; 

        //AQUI
        ParamByName(´Palmox´).Value := Trim(StringEmpresa) ; 
        ParamByName(´Ptreinamento´).Value := Trim(StringTreinamento); 
        ParamByName(´Pfuncionario´).Value := StrToInt(StringFuncionario); 

        ExecSQL ; 
      end; 
    end;
    SPGravar.Enabled := False; 
    SPAlterar.Enabled := True; 
    SPcancelar.Enabled := False; 
    SPIncluir.Enabled := True; 
    SPFechar.Enabled := True; 
    SpRelatorio.Enabled := true; 
    MessageDlg(´Lista de Presença Salva com Sucesso.´, mtInformation, [mbOK], 0); 
    FrmListaChamada.FormCreate(sender as TSpeedButton); 
  end; 
end; 



Espero tê-lo ajudado.


GOSTEI 0
Technos

Technos

18/11/2004

Amigo, pelo o que vi na sua resposta, tem lógica.

Mas agora estou na faculdade, daqui a pouco vou pro trabalho e vo botar em prática a sua resposta. que por sinal me parece ter muito sentido.

Valeu mesmo, e se nao der certo, valeu mesmo assim, mas acredito que agora vai.

Grato.

Technos


GOSTEI 0
Technos

Technos

18/11/2004

:D
Cara, funfou muito bem.

Exatamente como voce falou, os parametros apenas recebem ´Dois pontos´, quando estão sendo passados na SQL, uma coisa bem simples que nai tinha prestado atenção. e o pior é que eu jpa tinha feito uma Pesquisa desse tipo, e nao tinha notado isso.

Apartir de agora vou prestar mais atenção com essa questão.

A resenha do Laço para pegar os Funcionários tb. eu jurava que tava certa, mas ela só pegava apenas o primeiro indice do listbox.

Valeu mesmo.


GOSTEI 0
Everton

Everton

18/11/2004

Precisando estamos aí.

Everton


GOSTEI 0
POSTAR