Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consultar Item en Tabla en memoria (https://www.clubdelphi.com/foros/showthread.php?t=86169)

webmasterplc 26-06-2014 14:01:14

Consultar Item en Tabla en memoria
 
Buenas la consulta es como hago para saber si un registro existe en una tabla en memoria, es que no se como hacerle una consulta solo puedo eliminar el registro seleccionandolo con un dbgrid la cual uso este codigo
Código Delphi [-]
procedure TFormAgregarItems.btn1Click(Sender: TObject); 
begin
   if messagedlg ('¿Está seguro que desea eliminar la línea de concepto actual?',mtconfirmation,[mbok,mbcancel],0)=mrok then
     datos.tmhistorias.Delete;
 end;
es para evitar que se repitan registros en la tabla
la estructura es
Código Delphi [-]
codigo:integer;
descripcion:String; 
cant:Currency; 
precio:Currency
quiero evitar que se repitan por el codigo

duilioisola 26-06-2014 18:54:42

Lo mejor, creo yo, es hacer un select del código para ver si te devuelve algo. Si devuelve algo, quiere decir que ya existe y deberás evitar ese insert.
Para esto, los DataSets tiene los métoso onBeforeInsert/onBeforeUpdate

También puedes poner algo en la base de datos que no permita duplicados. Puede ser:
un PrimaryKey
un UniqueKey
un Trigger que se encargue de verificarlo.

Si de todos modos quieres hacerlo mediante el dataset en memoria:

Primero guarda el código de dónde estás.
Luego deshabilitas el dataset, para que no se refresquen los datos mientras hacer el recorrido
Recorres buscando lo el código
Vuelves a posicionarte en el código que guardaste
Habilitas el dataset

Código Delphi [-]
with DataSet do
begin
   DisableControls;
   try
      // Codigo que queremos verificar si está repetido.
      Codigo := DataSet.Codigo;
      // Algo para saber cual es el registro en el que estas
      idRegistro := DataSet.IdRegistro;

      First;
      while ((not EOF) and (DataSet.IdRegistro <> IdRegistro) and (Codigo <> DataSet.Codigo)) do
         Next;

      // Si llegue al final y en este registro no se cumple la condición quiere decir que no existe
      if ((EOF) and (DataSet.IdRegistro <> IdRegistro) and (Codigo <> DataSet.Codigo)) then
         Duplicado := False;

      // Vuelvo a reposicionar el registro
      First;
      while ((not EOF) and (DataSet.IdRegistro <> IdRegistro)) do
         Next;
   finally
      EnableControls;
   end;
end

Nota: Si estás insertando o editando, este método no sirve, porque al moverte deberás hacer un Post o un Cancel

VFont 28-06-2014 01:50:41

Y si ejecutas un query que realice un select de búsqueda del código que se introduce y si el recordcount del query te devuelve > 0 es que ya existe, si 0, lo aceptas.

Es una idea.

Saludos

webmasterplc 28-06-2014 17:59:59

Esataba pensamdo eso pero como le le hago el query

Código Delphi [-]
SQL.add ('Select codigo from ???????????');
SQL.add ('Where codigo =:Codigo');
SQL.Add ('ParamsByname('Codigo').AsInteger:=codigo');
Open;


en from que coloco si es una tabla en memoria?

newtron 29-06-2014 09:43:25

Es que una cosa que todavía, creo, no ha quedado clara es si de lo que hablas es de un dataset en memoria o de una tabla de la base de datos en memoria, que son cosas distintas.

Según lo que cuentas imagino que es un dataset en memoria con lo que tendrías que usar la opción que te propone el colega duilioisola porque dudo que puedas ejecutar una instrucción SQL en un dataset en memoria.

En caso de que fuera una tabla en memoria si que podrías pasarle una instrucción SQL como a otra tabla cualquiera de la base de datos.

Saludos

ozsWizzard 29-06-2014 11:01:14

¿Y no se puede usar algo del tipo lookup?

Ahora no tengo delphi aquí pero me suena que los componentes del tipo "dataset" suelen tener una función lookup con la que se sabe si existe un registro que cumpla una condición.


La franja horaria es GMT +2. Ahora son las 09:09:22.

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