Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Se puede hacer un else en un While not query1.eof Do? (https://www.clubdelphi.com/foros/showthread.php?t=76218)

negrokau 17-10-2011 17:54:47

Cita:

Empezado por Casimiro Notevi (Mensaje 415854)
Debes explicar primero EXACTAMENTE qué quiéres hacer, porque ese while, aparentemente, no sirve para nada, como ya han comentado.

Lo que quiero que haga exactamente es que busque si el codigo ingresado ya existe, si ya existe me salte el mensage y que el focus se posiciones en cod_barra para cambiar el codigo:

Código Delphi [-]
if cod_barra.text=query1.fieldvalues['cod_barra'] then
showmessage('el codigo ingresado ya existe');
cod_barra.setfocus;
si no existe el codigo que guarde:

Código Delphi [-]
guardar.click;

se entiende ahora lo que quiero hacer?

oscarac 17-10-2011 17:57:16

entonces guiate del ejemplo que te di usando Onvalidate

la diferencia es que el mensaje te lo manda cuando sale del campo

Loviedo 17-10-2011 18:02:40

Imagino que está comprobando un Edit.text con el valor de un Campo.
Creamos una variable booleana (existe). Si lo encuentra sal del bucle.

Código Delphi [-]

existe := false;
 
query1.First;
While not query1.Eof Do
Begin
 if cod_barra.text=query1.fieldvalues['cod_barra'] then
 begin
  showmessage('el codigo ingresado ya existe');
  existe := true;
  cod_barra.setfocus;
  break;
 end;
 query1.Next;
end;

if not existe then
 guardar.click;

Otra opción es comprobar previamente con un select si existe el cod_barra.

oscarac 17-10-2011 18:24:40

Cita:

Empezado por Loviedo (Mensaje 415861)
Imagino que está comprobando un Edit.text con el valor de un Campo.
Creamos una variable booleana (existe). Si lo encuentra sal del bucle.

Loviedo si bien es cierto el codigo de Negrokau podria funcionar... lo que pretendo (al menos yo) es mostrarle la mejor opcion para que pueda validar si un campo esta repetido o no... hay muchas formas (si alguien con mas capacidad que yo pudiera mostrarnos otra bienvenida)
por eso menciono que el While esta demas

negrokau 20-10-2011 17:46:04

Cita:

Empezado por oscarac (Mensaje 415851)
yo lo tengo mas o menos asi

Código Delphi [-]
procedure TfrmCatalogoArticulo.qryArticuloKODValidate( Sender: TField);
dmComedor.qryVerificaKodArticulo.Parameters.ParamByName('KOD').Value := Sender.Value;
dmComedor.qryVerificaKodArticulo.Open;
if not dmComedor.qryVerificaKodArticulo.IsEmpty then
begin
MessageDlg('Código ya creado', mtError, [mbAbort], 0);
dmComedor.qryVerificaKodArticulo.Close;
Abort;
end;
dmComedor.qryVerificaKodArticulo.Close;


como ubicas el ONvalidate?
en el query o tabla donde estas grabando la informacion le das doble click al componente y te salen los campos persistentes.. en el campos en el cual pretendes grabar el "codigo", busca en el object inspector.. el evento Onvalidate... ahi colocas el codigo para verificar si existe o no

hola oscarac, me podrias explicar un poco mejor como configurar? te lo agradeceria...

ecfisa 20-10-2011 23:01:56

Hola negrokau.

Una opción de búsqueda es mediante un while como intentaste en tu mensaje inicial:
Código Delphi [-]
var
  Found: Boolean;
begin
  query1.First;
  Found:= False;
  while not query1.Eof and not Found do
  begin
    Found:= cod_barra.Text = query1.FieldValues['cod_barra'];
    query1.Next;
  end;
  if not Found then
   guardar.Click;
  ...
Creo que el error en tu primer código, parte de la confusión que tenés con las estructuras de control.
Como yá te han dicho más arriba, una cosa es una estructura decisión (if/then/else) y otra una de iteracion (for, while, repeat) aunque las dos últimas puedan evaluar alguna condición.

La otra opción, más eficiente, es mediante una consulta SQL:
Código Delphi [-]
function ExisteCodigo(const Value: string): Boolean;
begin
  with TQuery.Create(nil) do
  try
    DatabaseName:= 'NOMBRE_DE_TU_BD';  // Alias (o Ruta a donde esta la tabla)
    SQL.Text:= 'SELECT * FROM TU_TABLA WHERE COD_BARRA = :DATO';  // Cambia 'TU_TABLA' por tu nombre de tabla
    ParamByName('DATO').AsString:= Value;
    Open;
    Result:= not IsEmpty;
    Close;
  finally
    Free;
  end;
end;
De esta manera tu código inicial queda reducido a:
Código Delphi [-]
  if not ExisteCodigo(cod_barra.Text) then
    guardar.Click;

Un saludo.

negrokau 22-10-2011 01:29:22

disculpame la ignorancia amigo... pero como nunca hice como esta en el ejemplo que me diste... en donde lo coloco la consulta?
Código Delphi [-]
function ExisteCodigo(const Value: string): Boolean;
begin
  with TQuery.Create(nil) do
  try
    DatabaseName:= 'C:\SGC v1.0\Database\SGC_v1.GDB';  // Alias (o Ruta a donde esta la tabla)
    SQL.Text:= 'SELECT * FROM FACTURAS WHERE COD_BARRA = :DATO';  // Cambia 'TU_TABLA' por tu nombre de tabla
    ParamByName('DATO').AsString:= Value;
    Open;
    Result:= not IsEmpty;
    Close;
  finally
    Free;
  end;
end;

Casimiro Noteví 22-10-2011 10:16:52

Donde quieras, da igual.
Tan sólo recuerda que además deberás declarar la function en la sección private (arriba, al principio del código).

Código Delphi [-]
private
  function ExisteCodigo(const Value: string): Boolean;

Y ese código, esa function, la pones por ejemplo, al final del todo.

negrokau 22-10-2011 14:53:42

lo estoy probando pero me salta este error:
Declaration expected but identifier 'private' found
algo no estoy haciendo bien creo....

Casimiro Noteví 22-10-2011 15:13:54

¿Dónde lo has puesto?.

El código, pega tu código, que no somos adivinos ;)
_______________________________||
_______________________________\/

ecfisa 23-10-2011 00:29:16

Hola negrokau.

Declararlo como un método como te indica Casimiro es la mejor opción ya que no importa la posición donde ubiques el código de la función:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages,...;

type
  TForm1 = class(TForm)
    ...
  private
     function ExisteCodigo(const Value: string): Boolean;
  public
  end;

var
  Form1: TForm1;

implementation  {$R *.dfm}

// aca el resto de tu codigo

function TForm1.ExisteCodigo(const Value: string): Boolean;
begin
 with TQuery.Create(nil) do
  try
    DatabaseName:= 'C:\SGC v1.0\Database\SGC_v1.GDB';
    SQL.Text:= 'SELECT * FROM FACTURAS WHERE COD_BARRA =:DATO';
    ParamByName('DATO').AsString:= Value;
    Open;
    Result:= not IsEmpty;
    Close;
  finally
    Free;
  end;
end;

// o, si preferís aca el resto de tu codigo

end.

Otra opción es declararlo como función, pero para ello, la cabecera debe estar declarada antes del método o función que la invoque. Para asegurar el tiro, inmediatamente después a la declaración Implementation, de ese modo la función, tendrá alcance a todo código subyacente a ella:
Código Delphi [-]
...
Implementation

function ExisteCodigo(const Value: string): Boolean;
begin
  ...

Saludos.


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

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