Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Problema: record already locked by this session (https://www.clubdelphi.com/foros/showthread.php?t=57483)

alexey1982 17-06-2008 01:36:03

Problema: record already locked by this session
 
hola, io de nuevo :D tengo un problema... hace poco comence a recibir un error en tiempo de ejecucion a la hora de querer hacer una busqueda incremental en una ttable.
mira uso una pagecontrol, en una pagina uso componentes standard, dbedit y un db navigator, y en la otra page, uso un DBGRID para mostrar la busqueda incremental.. el problema que me tiene loco!! (por que no modifique nada de ese codigo en especial) es QUE ME APARECE EL BENDITO MENSAJE DE " record already locked by this session " :eek: hasta ahora solo se que el error ocurre al invocar ""SETKEY"" de la tabla... pero.. no se como hacerle.. he intentado darle ttable.unlocktable(Tlreadlock,tlwritelock) y me sale con la jalada de que la tabla NO ESTA LOCKEADA... :mad: bueno si no esta lockeada entonces que eeeessssssssssssssssssssssss :confused::confused::eek::(
una manita..... porfas!!

codigo:
Código Delphi [-]
 
procedure TClientemainf.SearchTagChange(Sender: TObject);
var txt, sfind:string;
    len:integer;
begin
 //don't do anything if user presses
 //delete or backspace
 if edFromCode = true then begin
   edFromCode := false;
   exit;
 end;
 //don't do anything if there is
 //no text in edSearch
 txt:=SEARCHTAG.Text;
 if Length(txt)=0 then exit;
 //goto nearest match
 with cliente_tb do begin
  try
  clientemainf.Cliente_tb.UnlockTable(LTrEADlOCK);
  CMD('Unlocking READ');
  clientemainf.Cliente_tb.UnlockTable(LTWriteLock);
  CMD('Unlocked Write');
  except
  on e: exception do cmd(e.Message);
  end;
   cmd('refresh');
   clientemainf.Cliente_tb.Refresh; <-- lo puse a ver si se quitaba el error pero no!!
    cmd('next setkey');
    clientemainf.Cliente_tb.SetKey;  <-----------WTF!!!:eek:
     // showmessage('setkey');
     cmd('setkey pass next fieldbyname');
   FieldByName(searchfield).AsString:=SEARCHTAG.text;
   showmessage('Set field forsearch');
   GotoNearest;
   showmessage('nearest');
 end;
 //calculate what part of text should be selected
 sfind := cliente_tb.FieldByName(searchfield).AsString;
 len := Length(sfind) - Length(txt);
 if len > 0 then begin
   edFromCode:=true;
   SEARCHTAG.Text:=sfind;
   SEARCHTAG.SelStart:=Length(txt);
   SEARCHTAG.SelLength:=len;
 end;
end;

coso 17-06-2008 13:38:37

Uf...tablas y setkey...Te recomiendo q te pases a SQL. Si no puedes, usa los filtros y no el setkey para hacer este tipo de cosas: un ejemplo para busqueda incremental (sumamente lento para base de datos grandes) con filtros.

Código Delphi [-]

procedure Busqueda(valor_a_buscar : string; tb : TTable; nombre_campo : string);
begin
   if valor_a_buscar = '' then begin tb.Filter := ''; tb.Filtered := false; exit;
 
   Tb.Filter := nombre_campo + ' = ' + AnsiquotedStr(valor_a_buscar + '*','''') ;

// si el campo a buscar es numerico, se debe sacar el ansiquotedstr y el comodin
// si el campo a buscar es datetime, usar datetostr y tener en cuenta solo el date haciendo round.

   tb.Filtered := true;
   tb.Refresh;
end;

si lo que quieres es no filtrar y solo buscar

Código Delphi [-]

procedure Buscar(texto_a_buscar : string; tb : table; campo : string);
begin
   if texto_a_buscar = '' then exit;

   tb.Locate(campo,texto_a_buscar,[loCaseInsensitive,loPartialKey];
end;

deberas tener cuidado si se usa relacion master/detail.

PD: usa SQL, te ahorraras muchos problemas.


La franja horaria es GMT +2. Ahora son las 11:00:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi