Help em SQL Parametrizada.
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: :?:
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
Curtidas 0
Respostas
Everton
18/11/2004
Colega, o problema está nos ´:´ colocados no nome do parâmetro. Basta retirar os ´:´. Ao invés de ...
colocar
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 ...
... e colocar após o trecho
O código ficou assim:
Espero tê-lo ajudado.
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
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
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
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.
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
18/11/2004
Precisando estamos aí.
Everton
Everton
GOSTEI 0