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