update

01/03/2013

1

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;
Responder

Posts

01/03/2013

Vander Ferraz

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.

Responder

04/03/2013

Maurício Curi

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.
Responder

04/03/2013

William

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 ...

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;
Responder

04/03/2013

Bruno Leandro

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;
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira