Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Lector óptico y Enter

Hola buenas noches amigos.

Estoy trabajando con: Delphi6 - FB 2.0 - IBX - Win10

Les comento, estoy desarrollando una pantalla de captura para punto de venta, usando teclado y lector óptico. Para el caso de la captura del código por teclado me muestra unos mensajes de advertencia dependiendo del estatus del producto (POR ACABARSE, SIN KARDEX, AGOTADO, ETC), usando la tecla TAB o ENTER q es la condición para disparar un evento que realiza la validación de los estatus del producto.

Para el caso de captura del código de producto (CODIGO DE BARRAS) usando el lector, estos mensajes no se muestran para nada....como le hago para que lo realice como si estuviese usando el teclado?

Sé q algunos lectores -si no es que todos- usan un ENTER al final de la lectura, les muestro lo que tengo:

Tengo esto en el evento OnKeyPress del objeto TMaskEdit:
Código Delphi [-]
    if (Key=#13) then
    begin
        Key:=#0;
        Perform(WM_NEXTDLGCTL,0,0);
    end;

Y esto tengo en el evento OnExit del objeto TMaskEdit
Código Delphi [-]
procedure TfrmVentas.mskCodProdExit(Sender: TObject);
begin
    if NOT(mskCodProd.Text='') then
    begin
        qryProductos.Close;
        qryProductos.ParamByName('COD_BAR').AsString:=mskCodProd.Text;
        qryProductos.Open;
        if qryProductos.IsEmpty then
        begin
             Application.MessageBox('Este código de producto no existe en el catálogo, o bien, aún no ha sido activado','Error',mb_Ok+mb_IconError);
             mskCodProd.SetFocus;
        end Else
        begin
            qryValidaInv.Close;
            qryValidaInv.ParamByName('PROD_ID').AsString:=mskCodProd.Text;
            qryValidaInv.Open;
            if qryValidaInv.IsEmpty then
            begin
                 Application.MessageBox('Este PRODUCTO no tiene KARDEX creado','Aviso',mb_Ok+mb_IconInformation);
                 mskCodProd.SetFocus;
            end Else
            begin
               if not(qryValidaInv.FieldByName('KAR_M_EXISTENCIAS').IsNull) then
               begin
                   if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger=0 then
                   begin
                       Panel8.Visible:=True;
                       Application.MessageBox('Este producto esta AGOTADO, no tiene existencias','Aviso',mb_Ok+mb_IconWarning);
                       Limpiar();
                   end Else
                   begin
                       if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger<=qryValidaInv.FieldByName('KAR_M_STOCK_MINIM  O').AsInteger then
                       begin
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                       end;
                       sBtnAdd.Enabled:=True;
//                       btnImprimir.Enabled:=True;
                       mskCant.Text:=IntToStr(1);
                   end;
               end Else
               begin
                   Application.MessageBox('Este producto aún NO TIENE EXISTENCIAS registradas','Aviso',mb_Ok+mb_IconInformation);
                   mskCodProd.SetFocus;
               end;
            end;
        end;
    end;
end;

Usando el teclado funciona a la perfección, muestra los mensajes, pero cuando uso el lector óptico no los muestra. Alguien le ha pasado algo similar?, como puedo resolver esto?
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 05-05-2021 a las 05:03:18.
Responder Con Cita
  #2  
Antiguo 05-05-2021
Arturo.Molina Arturo.Molina is offline
Miembro
 
Registrado: feb 2018
Posts: 28
Poder: 0
Arturo.Molina Va por buen camino
Hola nRoman,
no entiendo bien tu problema, pero podría ser que no tuvieras configurado el lector para que envíe un retorno de carro al final del código leído.


Yo uso un HoneyWell modelo Eclipse y trae una plantilla con códigos de barras que permite cambiar diferentes parámetros del mismo, entre ellos, si añade o no el CR al final de código.


Si no tienes esa plantilla, busca en la web del fabricante que seguro que deben tenerla.


Saludos
Responder Con Cita
  #3  
Antiguo 05-05-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Cita:
Empezado por Arturo.Molina Ver Mensaje
Hola nRoman,
no entiendo bien tu problema, pero podría ser que no tuvieras configurado el lector para que envíe un retorno de carro al final del código leído.


Yo uso un HoneyWell modelo Eclipse y trae una plantilla con códigos de barras que permite cambiar diferentes parámetros del mismo, entre ellos, si añade o no el CR al final de código.


Si no tienes esa plantilla, busca en la web del fabricante que seguro que deben tenerla.


Saludos
Hola Arturo. Gracias por contestar.

Si tiene configurado el retorno de carro ya que lo he usado en excel y ahi me captura el código y posteriormente se pasa a la siguiente celda de abajo, lo cual me hace entender que si tiene eso configurado.

Mas bien, el proceso de lectura como que lo hace MUUYY RAPIDO y el enter lo aplica cuando el mensaje se muestra, es tan rápido todo que no muestra la ventana del mensaje, la cual trae 1 solo botón...que al dar click sobre él, la ventana del msg se cierra.

Creo que esto es lo que esta pasando....

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #4  
Antiguo 05-05-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Cita:
Empezado por mRoman Ver Mensaje
Hola buenas noches amigos.

Estoy trabajando con: Delphi6 - FB 2.0 - IBX - Win10

Les comento, estoy desarrollando una pantalla de captura para punto de venta, usando teclado y lector óptico. Para el caso de la captura del código por teclado me muestra unos mensajes de advertencia dependiendo del estatus del producto (POR ACABARSE, SIN KARDEX, AGOTADO, ETC), usando la tecla TAB o ENTER q es la condición para disparar un evento que realiza la validación de los estatus del producto.

Para el caso de captura del código de producto (CODIGO DE BARRAS) usando el lector, estos mensajes no se muestran para nada....como le hago para que lo realice como si estuviese usando el teclado?

Sé q algunos lectores -si no es que todos- usan un ENTER al final de la lectura, les muestro lo que tengo:

Tengo esto en el evento OnKeyPress del objeto TMaskEdit:
Código Delphi [-]
    if (Key=#13) then
    begin
        Key:=#0;
        Perform(WM_NEXTDLGCTL,0,0);
    end;

Y esto tengo en el evento OnExit del objeto TMaskEdit
Código Delphi [-]
procedure TfrmVentas.mskCodProdExit(Sender: TObject);
begin
    if NOT(mskCodProd.Text='') then
    begin
        qryProductos.Close;
        qryProductos.ParamByName('COD_BAR').AsString:=mskCodProd.Text;
        qryProductos.Open;
        if qryProductos.IsEmpty then
        begin
             Application.MessageBox('Este código de producto no existe en el catálogo, o bien, aún no ha sido activado','Error',mb_Ok+mb_IconError);
             mskCodProd.SetFocus;
        end Else
        begin
            qryValidaInv.Close;
            qryValidaInv.ParamByName('PROD_ID').AsString:=mskCodProd.Text;
            qryValidaInv.Open;
            if qryValidaInv.IsEmpty then
            begin
                 Application.MessageBox('Este PRODUCTO no tiene KARDEX creado','Aviso',mb_Ok+mb_IconInformation);
                 mskCodProd.SetFocus;
            end Else
            begin
               if not(qryValidaInv.FieldByName('KAR_M_EXISTENCIAS').IsNull) then
               begin
                   if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger=0 then
                   begin
                       Panel8.Visible:=True;
                       Application.MessageBox('Este producto esta AGOTADO, no tiene existencias','Aviso',mb_Ok+mb_IconWarning);
                       Limpiar();
                   end Else
                   begin
                       if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger<=qryValidaInv.FieldByName('KAR_M_STOCK_MINIM  O').AsInteger then
                       begin
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                       end;
                       sBtnAdd.Enabled:=True;
//                       btnImprimir.Enabled:=True;
                       mskCant.Text:=IntToStr(1);
                   end;
               end Else
               begin
                   Application.MessageBox('Este producto aún NO TIENE EXISTENCIAS registradas','Aviso',mb_Ok+mb_IconInformation);
                   mskCodProd.SetFocus;
               end;
            end;
        end;
    end;
end;

Usando el teclado funciona a la perfección, muestra los mensajes, pero cuando uso el lector óptico no los muestra. Alguien le ha pasado algo similar?, como puedo resolver esto?
Básicamente hace un ENTER AUTOMATICO en esta parte del código cuando uso el LECTOR...el cuadro de dialogo NO SE ESPERA a que presiones el botón OK,...se APLICA el ENTER en el cuadro de dialogo, porque el lector lo envía y el cuadro de dialogo lo acepta....SE SUPONE QUE NO DEBERIA HACER ESTO...

Código Delphi [-]
                       if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger<=qryValidaInv.FieldByName('KAR_M_STOCK_MINIM  O').AsInteger then
                       begin
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                       end;
                       sBtnAdd.Enabled:=True;
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 05-05-2021 a las 20:54:37.
Responder Con Cita
  #5  
Antiguo 06-05-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Una solución no muy optima

Bueno hasta el momento funciona asi: (UNA SOLUCION NO MUY OPTIMA Y MUCHO MENOS PROFESIONAL!!)

Código Delphi [-]
                       if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger<=qryValidaInv.FieldByName('KAR_M_STOCK_MINIM  O').AsInteger then
                       begin
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                       end;

Repitiendo 2 veces la linea de código....solo asi me muestra el mensaje...pero cuando se usa el teclado lo muestra -obvio- 2 VECES!!!...q joda!

(Código completo)
Código Delphi [-]
procedure TfrmVentas.mskCodProdExit(Sender: TObject);
begin
    if NOT(mskCodProd.Text='') then
    begin
        qryProductos.Close;
        qryProductos.ParamByName('COD_BAR').AsString:=mskCodProd.Text;
        qryProductos.Open;
        if qryProductos.IsEmpty then
        begin
             Application.MessageBox('Este código de producto no existe en el catálogo, o bien, aún no ha sido activado','Error',MB_OK+MB_ICONERROR);
             Application.MessageBox('Este código de producto no existe en el catálogo, o bien, aún no ha sido activado','Error',MB_OK+MB_ICONERROR);
//             mskCodProd.SetFocus;
             FormShow(Sender);
        end Else
        begin
            qryValidaInv.Close;
            qryValidaInv.ParamByName('PROD_ID').AsString:=mskCodProd.Text;
            qryValidaInv.Open;
            if qryValidaInv.IsEmpty then
            begin
                 Application.MessageBox('Este PRODUCTO no tiene KARDEX creado','Aviso',mb_Ok+mb_IconInformation);
                 Application.MessageBox('Este PRODUCTO no tiene KARDEX creado','Aviso',mb_Ok+mb_IconInformation);
                 FormShow(Sender);
            end Else
            begin
               if not(qryValidaInv.FieldByName('KAR_M_EXISTENCIAS').IsNull) then
               begin
                   if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger=0 then
                   begin
                       Panel8.Visible:=True;
                       Application.MessageBox('Este producto esta AGOTADO, no tiene existencias','Aviso',mb_Ok+mb_IconWarning);
                       Application.MessageBox('Este producto esta AGOTADO, no tiene existencias','Aviso',mb_Ok+mb_IconWarning);
                       Limpiar();
                   end Else
                   begin
                       if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger<=qryValidaInv.FieldByName('KAR_M_STOCK_MINIM  O').AsInteger then
                       begin
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                           Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation);
                       end;
                       sBtnAdd.Enabled:=True;
                       mskCant.Text:=IntToStr(1);
                   end;
               end Else
               begin
                   Application.MessageBox('Este producto aún NO TIENE EXISTENCIAS registradas','Aviso',mb_Ok+mb_IconInformation);
                   Application.MessageBox('Este producto aún NO TIENE EXISTENCIAS registradas','Aviso',mb_Ok+mb_IconInformation);
                   FormShow(Sender);
               end;
            end;
        end;
    end;
end;

Lo q hace FormShow:
Código Delphi [-]
procedure TfrmVentas.FormShow(Sender: TObject);
begin
    BD.trsBDWine.Active:=false;
    bd.trsBDWine.StartTransaction;
    Limpiar();
    IniciaRegNvo();
end;

Lo q hace Limpiar():
Código Delphi [-]
procedure TfrmVentas.Limpiar;
begin
    mskCodProd.Text:='';
    mskCant.Text:='';
    mskCodProd.SetFocus;
    sBtnAdd.Enabled:=False;
    qryProductos.Close;
    Panel8.Visible:=False;
//    btnImprimir.Enabled:=False;
end;

Lo q hace IniciaRegNvo():
Código Delphi [-]
procedure TfrmVentas.IniciaRegNvo;
begin
    nRegNvo:=0;
    qryUltimoTCK.Close;
    qryUltimoTCK.Open;
    nTicket:=qryUltimoTCK.fieldByName('ULTIMO_TCK').AsInteger;
//*************************************************************************
    dsVentaM.Open;
    dsVentaM.Append;
    dsVentaM.FieldByName('VENTA_NUM_TICKET').AsInteger:=nTicket+1;
    dsVentaM.FieldByName('ESTATUS_VENTA_ID').AsInteger:=1;
    dsVentaM.Post;

    dsVentaD.Open;
//*************************************************************************
    sbtnBorrar.Enabled:=False;
    qryVentaID.Close;
    qryVentaID.Open;
    nVentaID:=qryVentaID.fieldByName('ID').AsInteger;
    nConsec:=0;
    nTotImporte:=0;
    Label8.Caption:='';
end;
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 06-05-2021 a las 02:28:55.
Responder Con Cita
  #6  
Antiguo 06-05-2021
Arturo.Molina Arturo.Molina is offline
Miembro
 
Registrado: feb 2018
Posts: 28
Poder: 0
Arturo.Molina Va por buen camino
Cita:
Empezado por mRoman Ver Mensaje
Bueno hasta el momento funciona asi: (UNA SOLUCION NO MUY OPTIMA Y MUCHO MENOS PROFESIONAL!!)

Código Delphi [-] if qryValidaInv.fieldByName('KAR_M_EXISTENCIAS').AsInteger<=qryValidaInv.FieldByName('KAR_M_STOCK_MINIM O').AsInteger then begin Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation); Application.MessageBox('Este producto esta por acabarse, favor de realizar pedido','Advertencia',mb_Ok+mb_IconExclamation); end;


Repitiendo 2 veces la linea de código....solo asi me muestra el mensaje...pero cuando se usa el teclado lo muestra -obvio- 2 VECES!!!...q joda!

Hola mRoman,
otra posible solución menos "repetitiva" podría ser insertar un retardo justo al principio del procedimiento, tal que así:


Código Delphi [-]
procedure TfrmVentas.mskCodProdExit(Sender: TObject);
begin
  sleep( 500 );   <--- Esto le da medio segundo al procedimiento para limpiar la cola de mensajes de windows
  if NOT(mskCodProd.Text='') then
Responder Con Cita
  #7  
Antiguo 07-05-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Cita:
Empezado por Arturo.Molina Ver Mensaje
Hola mRoman,
otra posible solución menos "repetitiva" podría ser insertar un retardo justo al principio del procedimiento, tal que así:


Código Delphi [-]
procedure TfrmVentas.mskCodProdExit(Sender: TObject);
begin
  sleep( 500 );   <--- Esto le da medio segundo al procedimiento para limpiar la cola de mensajes de windows
  if NOT(mskCodProd.Text='') then
Ok...lo intento.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #8  
Antiguo 07-05-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Cita:
Empezado por Arturo.Molina Ver Mensaje
Hola mRoman,
otra posible solución menos "repetitiva" podría ser insertar un retardo justo al principio del procedimiento, tal que así:


Código Delphi [-]
procedure TfrmVentas.mskCodProdExit(Sender: TObject);
begin
  sleep( 500 );   <--- Esto le da medio segundo al procedimiento para limpiar la cola de mensajes de windows
  if NOT(mskCodProd.Text='') then
Lo siento amigo Arturo, no me funcionó, siguió teniendo el mismo comportamiento.

De todas maneras gracias.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #9  
Antiguo 15-06-2021
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Poder: 21
mRoman Va por buen camino
Hola...que tal.

Solo para no dejar sin conclusión este hilo....resulta que el problema del DOBLE ENTER del lector óptico, estaba en la propia configuración del lector. Utilice el manual de códigos de barra que viene junto con el dispositivo y escanea el que reinicia a la configuración de fábrica...y listo!, quedó solucionado.

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lector RFID petercat Varios 9 07-04-2016 20:52:19
Lector huellas newtron Varios 6 26-03-2016 08:55:10
Busqueda Con Lector Optico. ingmichel Internet 9 12-02-2008 22:45:54
Lector de Biometria APC JerS Varios 3 02-11-2006 15:29:31
Es imposible un lector de DVD???? gandalf_27 Varios 2 15-06-2006 16:07:40


La franja horaria es GMT +2. Ahora son las 01:01:15.


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
Copyright 1996-2007 Club Delphi