update
Boa tarde. Alguém poderia ajudar. Uso ADO com Access. Quero, ao dar select na tabela, e ao localizar registro já existente quero que atualize os dados (update). Se não localizar registro, quero que salve na tabela. Meu código:
procedure TForm1.BitBtnSalvarClick(Sender: TObject);
Var i : Integer;
begin
inherited;
DM2.ADOQry.Close;
DM2.ADOQry.Open;
for i := 0 to item.Items.Count - 1 do
begin
DM2.ADOQry.SQL.text:= 'Select * from tab Where num_processo like :ParamNumProcListview';
DM2.ADOQry.Parameters.ParamByName('ParamNumProcListview').Value:=(item.Items[i].SubItems[0]);
if not DM2.ADOQry.IsEmpty then
begin
DM2.ADOQry.SQL.Clear;
DM2.ADOQry.SQL.Add('Update tab set nome= :ParamNomeListview, num_processo= :ParamNumProcListview, obs= DM2.ADOQrynum_processo.Value+' ;'+ :ParamObsListview where num_processo= :ParamNumProc_listview');
DM2.ADOQry.Parameters.ParamByName('ParamNomeListview').Value:=(item.Items[i].Caption);
DM2.ADOQry.Parameters.ParamByName('ParamNumProc_listview').Value:=(item.Items[i].SubItems[0]);
DM2.ADOQry.Parameters.ParamByName('ParamObsListview').Value:=(item.Items[i].SubItems[1]);
DM2.ADOQry.ExecSQL;
end
else
begin
DM2.ADOQry.Close;
DM2.ADOQry.Open;
DM2.ADOQry.Insert;
DM2.ADOQry.FieldByName('nome').AsString:= item.Items[i].Caption;
DM2.ADOQry.FieldByName('num_processo').AsString:= item.Items[i].SubItems[0];
DM2.ADOQry.FieldByName('obs').AsString:= item.Items[i].SubItems[1];
DM2.ADOQry.Post;
end;
end;
item.Clear;
Edit1.SetFocus;
end;Maurício Curi
Curtidas 0
Respostas
Vander Ferraz
01/03/2013
Cara, se entendi direito vc está usando a mesma query que já está aberta com uma lista de registros para fazer o update?
Tente colocar as atualizações em outra query.
Tente colocar as atualizações em outra query.
GOSTEI 0
Maurício Curi
01/03/2013
Se fizer como vc falou, como que setarei o registro já existente para alterá-lo? Quero que não haja duplicidade de registros. Assim, dou select na tabela pra ver se já existe o processo. Me corrija se estou errado: ao dar select com o parâmetro, ele localiza o registro comuso do parâmetro (no meu caso através das linha -2ª coluna- do listview). Obrigado.
GOSTEI 0
William
01/03/2013
Alterei algumas linhas e adicionei outro ADOQuery chamado ADOAux para executar as operações de INSERT e UPDATE, escrevi o insert como instrução SQL.
Minha única dúvida é, vc está usando um loop para selects, inserts e updates, não sei o tamanho da sua base de dados mas esse tipo de rotina pode reduzir a performance da sua aplicação.
Não testei dá uma olhada ...
Minha única dúvida é, vc está usando um loop para selects, inserts e updates, não sei o tamanho da sua base de dados mas esse tipo de rotina pode reduzir a performance da sua aplicação.
Não testei dá uma olhada ...
procedure TForm1.BitBtnSalvarClick(Sender: TObject);
Var i : Integer;
begin
inherited;
DM2.ADOQry.Close;
DM2.ADOQry.SQL.Clear;
for i := 0 to item.Items.Count - 1 do
begin
DM2.ADOQry.SQL.text:= 'Select * from tab Where num_processo like :ParamNumProcListview';
DM2.ADOQry.Parameters.ParamByName('ParamNumProcListview').Value:=(item.Items[i].SubItems[0]);
DM2.ADOQry.Open;
if not DM2.ADOQry.IsEmpty then
begin
DM2.ADOAux.Close;
DM2.ADOAux.SQL.Clear;
DM2.ADOAux.SQL.Add('Update tab set nome= :ParamNomeListview, num_processo= :ParamNumProcListview, obs= DM2.ADOQrynum_processo.Value+' ;'+ :ParamObsListview where num_processo= :ParamNumProc_listview');
DM2.ADOAux.Parameters.ParamByName('ParamNomeListview').Value:=(item.Items[i].Caption);
DM2.ADOAux.Parameters.ParamByName('ParamNumProc_listview').Value:=(item.Items[i].SubItems[0]);
DM2.ADOAux.Parameters.ParamByName('ParamObsListview').Value:=(item.Items[i].SubItems[1]);
DM2.ADOAux.ExecSQL;
end
else
begin
DM2.ADOAux.Close;
DM2.ADOAux.SQL.Clear;
DM2.ADOAux.SQL.Add('INSERT INTO tab (nome, um_processo, obs)VALUES(:nome, :num_processo, :obs)');
DM2.ADOAux.FieldByName('nome').AsString:= item.Items[i].Caption;
DM2.ADOAux.FieldByName('num_processo').AsString:= item.Items[i].SubItems[0];
DM2.ADOAux.FieldByName('obs').AsString:= item.Items[i].SubItems[1];
DM2.ADOAux.ExecSQL;
end;
end;
item.Clear;
Edit1.SetFocus;
end;GOSTEI 0
Bruno Leandro
01/03/2013
acrescentando ao que o wllfl disse eu substituiria o comando update para conforme as linhas abaixo se o DM2.ADOQrynum_processo.Value
for inteiro voce pode utilizar assim IntToStr(DM2.ADOQrynum_processo.Value)
DM2.ADOAux.SQL.Add('Update tab set nome= :ParamNomeListview, obs= :ParamObsListview where num_processo= :ParamNumProc_listview');
DM2.ADOAux.Parameters.ParamByName('ParamNomeListview').Value:=(item.Items[i].Caption);
DM2.ADOAux.Parameters.ParamByName('ParamNumProc_listview').Value:=(item.Items[i].SubItems[0]);
DM2.ADOAux.Parameters.ParamByName('ParamObsListview').Value:=( DM2.ADOQrynum_processo.Value+' ;'+item.Items[i].SubItems[1]);
DM2.ADOAux.ExecSQL;
for inteiro voce pode utilizar assim IntToStr(DM2.ADOQrynum_processo.Value)
DM2.ADOAux.SQL.Add('Update tab set nome= :ParamNomeListview, obs= :ParamObsListview where num_processo= :ParamNumProc_listview');
DM2.ADOAux.Parameters.ParamByName('ParamNomeListview').Value:=(item.Items[i].Caption);
DM2.ADOAux.Parameters.ParamByName('ParamNumProc_listview').Value:=(item.Items[i].SubItems[0]);
DM2.ADOAux.Parameters.ParamByName('ParamObsListview').Value:=( DM2.ADOQrynum_processo.Value+' ;'+item.Items[i].SubItems[1]);
DM2.ADOAux.ExecSQL;
GOSTEI 0