MC3000 - Casi terminada

MC3000 - Casi terminada

Postby ramirezosvaldo » Tue Dec 20, 2005 4:23 pm

Estimados ...

Gracias a todos los que fueron de ayuda.
Antonio muchas gracias
Hector, mil gracias por el empuje ( Todo un guru en "C" y sus derivados )
Y a los los demas ... ( Ya parece carta ...)


Ya entregre mi primera parte de mi programa a mi cliente ( es sencillo )
Pero me gustaria que lo vieran. Este programa es tambien el que activa el lector de un Symbol MC3000 OS Core.

Espero que les ayude en algo

/*
Program : Inventory.prg
Author : Osvaldo Ramirez , Hector Pezoa
Date : 01 Dic, 2005
update : 15 Dic, 2005

Revision ...

1.- Agregar el codigo de barras para cuando el lector no pueda leer
2.- Agregar el encargado, cuando se le avise que una cantidad de existencia no coincida

*/

#include "FWCE.ch"
#include "hbclass.ch"
#include "Directry.ch"
#pragma comment (lib,"scnapi32")

#define crlf chr(13)+chr(10)
#define CRLF chr(13)+chr(10)
#define CR chr(13)

FUNCTION Main()
* begin

PRIVATE oWnd
PRIVATE cLog := ""
PRIVATE nCant := 1 , oCant
PRIVATE nExist := 0
private oInvPC , oMsg
PRIVATE cBarCode := space(15) , oBarCode
PRIVATE files_dir := "\\caja1\c\"
PRIVATE cEncargado := space(15) , oEncargado
PRIVATE cCurDir := curdir()
PRIVATE lUsers := .f.

PRIVATE dFecha := date() , oFecha
PRIVATE cHora := time() , oHora
PRIVATE nNumInventario := 0 , oNumInventario // El no. de inventario es una varible o archivo en el sistema


/* Primero Pedimos la fecha y hora del sistema.

DEFINE WINDOW oWnd TITLE "Sistema de Toma de Inventario v12.15"

@ 1.0,02 SAY "Fecha :" SIZE 60, 18
@ 1.0,09 GET oFecha VAR dFecha picture "@D" SIZE 70, 20
@ 2.5,02 SAY "Hora :" SIZE 60, 18
@ 2.5,10 GET oHora VAR cHora picture "99:99:99" SIZE 70 , 20
@ 3.8,02 SAY "#-Inventario:" SIZE 75, 18
@ 3.98,11 GET oNumInventario VAR nNumInventario picture "999999" SIZE 70, 20

@ 12, 2 BUTTON "Aceptar" SIZE 80, 30 ACTION oWnd:END()
@ 12,35 BUTTON "Cerrar App" SIZE 80, 30 ACTION oWnd:END()

oWnd:Activate()
*/

if file( files_dir+"pos\datafile\users.dbf")
copy file (files_dir+"pos\datafile\users.dbf") to ( "users.dbf" )
endif

if file( "users.dbf" )
lUsers := .T.
use ( "users.dbf" ) alias USERS NEW
index on upper( user_id ) to ( "users1.ntx" )
go top
endif

* ShowKeyboard()

DEFINE WINDOW oWnd TITLE "Sistema de Toma de Inventario v12.15"

@ 1.0,02 SAY "Cantidad :" SIZE 70, 20
@ 1.0,12 GET oCant VAR nCant picture "99999" VALID CheckCant() SIZE 40, 20
@ 2.3,02 SAY "Codigo :" SIZE 70, 20
@ 2.5,12 GET oBarCode VAR cBarcode picture "@!" VALID CheckBarCode() SIZE 120, 20
@ 3.5,02 SAY "Encargado:" SIZE 70, 20
@ 3.9,12 GET oEncargado VAR cEncargado picture "@!" VALID GrabaEncargado() SIZE 120, 20

@ 6.0,02 SAY oInvPC var "Inventario PC: :" SIZE 150, 20
@ 8.0,02 SAY oMsg var "Ultimo Mensaje ..............." SIZE 400, 20


@ 12, 2 BUTTON "Terminar" SIZE 80, 30 ACTION oWnd:END()

oWnd:Activate()


if ! empty( cLog ) // Significa que hubo activad
if file( files_dir+"download\inventa.log" )
cLog := memoread( files_dir+"download\inventa.log" ) + cLog
endif
memowrit( files_dir+"download\inventa.log" , cLog )
endif

* HideKeyboard()

RETURN NIL

FUNCTION CheckCant()
* begin
LOCAL cFile , cRet , nActual := 0 , lReturn := .f.

IF oCant:nLastKey = 13

cBarCode := ""
cRet := SCAN_OPEN()
IF valtype( cRet ) = "C"
FOR i := 1 TO len( cRet )
IF substr(cRet,i,1) $"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-/"
cBarCode += substr(cRet,i,1)
ENDIF
NEXT
ENDIF
cBarCode := alltrim(cBarcode)+space(15-len(alltrim(cBarcode)))

if ! empty( cBarCode )

cFile := files_dir+"download\"+alltrim(cBarcode)+strzero(nCant,4,0)+".exi"
IF ! file( cfile )
* Si no existe, vera si hay un articulo y traerse las existencias actuales
nActual := Existencias( cBarCode )
else
nActual := nCant
ENDIF

if nActual <> -777
oInvPC:VarPut( "Inventario PC:"+transform( nActual ,"99999" ))
oInvPc:refresh()
if nActual = nCant
oMsg:VarPut( "!! INVENTARIO CORRECTO, CONTINUE !!")
elseif nCant > nActual // Sobrantes
oMsg:VarPut( "!! SOBRANTES, CUENTE DE NUEVO !!" )
elseif nCant < nActual // Faltantes
oMsg:VarPut( "!! FALTANTES, CUENTE DE NUEVO !!" )
endif
else
oMsg:VarPut( "!! ARTICULO NO EXISTE, INTENTE DE NUEVO !!" )
ENDIF
oMsg:refresh()
* Grabar Log
cLog += cBarcode+strzero(nCant,4,0)+strzero(nActual,4,0)+dtos(date())+time()+cEncargado + CR
oCant:VarPut(1)
oCant:refresh()

oBarCode:VarPut(space(15))
oBarCode:refresh()
endif
else
lReturn := .T.
endif
return lReturn

function CheckBarCode()
* begin
local cFile , cRet , nActual := 0 , lReturn := .f.

if oBarCode:nLastKey = 38
return .t.
endif

if oBarCode:nLastKey = 13
cBarCode := alltrim(cBarcode)+space(15-len(alltrim(cBarcode)))
cFile := files_dir+"download\"+alltrim(cBarcode)+strzero(nCant,4,0)+".exi"
if ! empty( cBarCode )
if ! file( cFile )
nActual := Existencias( cBarCode )
lReturn := .T. // Pasa al campo de encargado
else
nActual := nCant // Debera devolverse al campo de nCantidad
endif
if nActual <> -777
oInvPC:VarPut( "Inventario PC:"+transform( nActual ,"99999" ))
oInvPc:refresh()
if nActual = nCant
oMsg:VarPut( "!! INVENTARIO CORRECTO, CONTINUE !!")
elseif nCant > nActual // Sobrantes
oMsg:VarPut( "SOBRANTES, RETENGA MCIA Y QUE FIRME ENCARGADO" )
elseif nCant < nActual // Faltantes
oMsg:VarPut( "FALTANTES, AVISE Y TECLE GAFETE EL ENCARGADO" )
endif
else
oMsg:VarPut( "!! ARTICULO NO EXISTE, INTENTE DE NUEVO !!" )
oMsg:refresh()
lReturn := .f.
ENDIF
oMsg:refresh()

nExist := nActual

* Grabar Log
cLog += cBarcode+strzero(nCant,4,0)+strzero(nActual,4,0)+dtos(date())+time()+cEncargado + CR
if ! lReturn
oBarCode:oJump := oCant
endif
else
oMsg:VarPut( "!! TECLE SU CODIGO DE BARRAS!!" )
oMsg:refresh()
ENDIF
ELSE
if empty( cBarcode )
oMsg:VarPut( "!! TECLE SU CODIGO DE BARRAS!!" )
oMsg:refresh()
endif
ENDIF
RETURN lReturn

FUNCTION GrabaEncargado()
* begin
LOCAL cFile , cRet , cVar

IF oEncargado:nLastKey = 13
if lUsers
if USERS->(DbSeek(cEncargado))
cVar := cBarcode+strzero(nCant,4,0)+strzero(nExist,4,0)+dtos(date())+time()+cEncargado + CR

cLog += cVAr
oCant:VarPut(1)
oCant:refresh()
oBarCode:VarPut(space(15))
oBarCode:refresh()
oMsg:VarPut( "SE GRABO DIFERENCIAS :"+alltrim(USERS->user_name))
oMsg:refresh()
oInvPC:VarPut( "Inventario PC:"+transform( 0 ,"99999" ))
oInvPc:refresh()
oEncargado:VarPut(space(15))
oEncargado:refresh()
oEncargado:oJump := oCant


else
msginfo( "Empleado no exite" )
return .f.
endif
endif
ENDIF
RETURN .T.


FUNCTION Existencias( cBarCode )
* Begin
LOCAL cFile := files_dir+"download\"+alltrim(cBarcode)+"*.exi"
LOCAL aFiles := Directory( cFile )
LOCAL nCount := Len(aFiles)
LOCAL nExist := NIL
LOCAL i
asort( aFiles ,,, {|aX,aY|dtos(aX[F_DATE ])+aX[F_TIME] < dtos(aY[F_DATE ])+aY[F_TIME]})
FOR i := 1 TO nCount
nExist := val( substr( aFiles[i][1] , len( aFiles[i][1])-7 ) )
NEXT
if nExist = NIL
nExist := -777
endif
RETURN nExist

* Funciones que no corren en Symbol MC3000
FUNCTION cesetmenu() ; RETURN NIL
FUNCTION getmenu() ; RETURN NIL
FUNCTION readbitmap() ; RETURN NIL
FUNCTION palbmpread() ; RETURN NIL

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>
#include "Scancapi.h"

LPSCAN_BUFFER lpScanBuffer = NULL;
BOOL bUseText = TRUE;
DWORD dwScanSize = 7095;
DWORD dwScanTimeout = 0;

#define BUFFER_SIZE 7095
#define DEFAULT_TIMEOUT 10000

HANDLE hScanner = NULL;
TCHAR szScannerName[MAX_PATH] = TEXT("SCN1:");
DWORD dwResult ;
CHAR Buffer ;
UINT uMsg ;
DWORD dwTimeout ;

HB_FUNC( SCAN_OPEN )
{
dwResult = SCAN_Open( szScannerName, &hScanner );
if ( dwResult == E_SCN_SUCCESS )
{
dwResult = SCAN_Enable( hScanner );
if ( dwResult == E_SCN_SUCCESS )
{

BOOL state = TRUE;
dwResult = SCAN_SetSoftTrigger(hScanner, &state);
if (dwResult == E_SCN_SUCCESS) {
// allocate a new scan buffer
lpScanBuffer = SCAN_AllocateBuffer(TRUE /* data as chars */, BUFFER_SIZE);
if (lpScanBuffer) {
dwResult = SCAN_ReadLabelWait(hScanner, lpScanBuffer, DEFAULT_TIMEOUT);
if (dwResult == E_SCN_SUCCESS)
{
hb_retclen( (char *)SCNBUF_GETDATA(lpScanBuffer),25);
}
}
SCAN_DeallocateBuffer(lpScanBuffer);
}
state = FALSE;
SCAN_SetSoftTrigger(hScanner, &state);

}
else
{
MessageBox( GetActiveWindow(), L"Error en SCAN_Enable", L"Ok", 0 );

}
}
else
{
MessageBox( GetActiveWindow(), L"Error en SCAN_Open", L"Ok", 0 );
}
}

#pragma ENDDUMP
ramirezosvaldo
 
Posts: 101
Joined: Mon Oct 10, 2005 6:48 pm
Location: Cd. Juarez Chihuahua

Postby Antonio Linares » Tue Dec 20, 2005 5:29 pm

Osvaldo,

Enhorabuena :)

Por que no pones algunas imágenes de la aplicación funcionando en el emulador para que veamos que tal se ve ?

Las imagenes las puedes situar en http://www.imageshack.us y aquí copiar el enlace para que las veamos. Gracias.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby josevalle » Tue Dec 20, 2005 6:00 pm

Enhorabuena Osvaldo ( y Antonio claro):

Con esto subis un poco la capacidad de todos nosotros.

Unas preguntas y sugerencias Osvaldo:

¿La funcion c SCAN_OPEN no sería mejor ponerle otro nombre?. Por Ejemplo LEE_SCANER

Me parece que a) Abre el scanner, b) Activa el scanner, c) Lee el codigo, etc

Los de Symbol me dijeron que después de la lectura convenía desactivar el scaner para ahorrar bateria.

Espero que nos sigas contando tus progresos.
Jose Valle
Bilbao
Spain
User avatar
josevalle
 
Posts: 65
Joined: Fri Oct 14, 2005 6:20 pm
Location: Bilbao

Postby ramirezosvaldo » Tue Dec 20, 2005 10:59 pm

Estimado Jose

Gracias por los tip.

Por lo pronto, esta es la primera app, espero poder hacer mas para otros clientes.
De todos modos hay una funcion que nos gustaria probar: SCAN_ReadLabelMsg -- Esta funcion, manda un evento con la lectura a un hwnd de una ventana, aun no hemos podido activarla y ver como seria el flujo de programa. Ahora aunado con el aprendizaje de las clases de FiveWin, tambien, hay que probrar y probrar.

De todos modos cualquier cosa nueva q implementemos, con gusto las pondre para ayuda de nososotros.

Saludos
Osvaldo Ramirez
ramirezosvaldo
 
Posts: 101
Joined: Mon Oct 10, 2005 6:48 pm
Location: Cd. Juarez Chihuahua

Postby ramirezosvaldo » Mon Jan 23, 2006 4:48 pm

Hola Antonio....

Es posible, bajo el emulador echar a andar el Scaner ?
La libreria que uso es scnapi32.lib ...

Saludos
Osvaldo Ramirez
ramirezosvaldo
 
Posts: 101
Joined: Mon Oct 10, 2005 6:48 pm
Location: Cd. Juarez Chihuahua

Postby Antonio Linares » Mon Jan 23, 2006 6:27 pm

Osvaldo,

Supongo que el escaner tienes que conectarlo fisicamente, no ? Donde lo conectas en el Pocket PC ?

La aplicación si te funcionará en el emulador, pero no creo que encuentre el escaner.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby ramirezosvaldo » Thu Jan 26, 2006 6:09 pm

Estimado Antonio

Tienes razon, como conectar el scanner al emulador.
Aun si se pudiera echar a andar la lib scnapi32.dll dentro
del emulador, de nada serviria, pues no habria lectura
de codigo de barras.
Bueno mejor olvidarlo.

Te comento que la aplicacion ( muy sencilla ) ha estado
funcionado muy bien, q porcierto tengo que subir las fotos
para que las vean, una vez que las tome.

He cambiando un poco el procedimiento, en la toma de inventario
de medicamentos, tanto en mi punto de venta como en la app de la
symbol.

Ejemplo :

En mi punto de venta, al iniciar solamente la caja1, creo un archivo texto con el nombre del codigo de barras + su extencion ( .EXI ) y adentro del
archivo grabo toda la informacion, existencia, precios, marca y linea.
Antes no lo hacia asi.

Ahora en mi app de symbol, cuando se escanea un codigo, voy directamente a revisar atravez de la red, en la caja1 en el directorio, ese archivo y si lo encuentro, lo habro y leeo la informacion y comparamos.

De esta manera me ha funcionado mejor q con la manera anterior.

Tengo algunos problemas, pero muy pequenos.

Ejemplo :

La app en symbol, por cada leida de codigos,los voy almacenado en una variable y la voy sumando, pero al mismo momento la voy grabando en la caja1 atravez de la red como un arhcivo llamaod inventa.log
ahi, voy dejando todo lo que se va tomando.
El problema es que aveces no me graba todo.
He puesto un contador, para que el usuario me grabe o se salga de la app
cada 100 articulos y los suba a mi punto de venta. Me ha funcionado, pero de mi toma de inventario global creo que se pierde la lectura el 1 o 2 %

Bueno, eso es todo por el momento.

Saludos
Osvaldo Ramirez
ramirezosvaldo
 
Posts: 101
Joined: Mon Oct 10, 2005 6:48 pm
Location: Cd. Juarez Chihuahua

Postby josevalle » Wed Jun 07, 2006 10:00 pm

Hola Osvaldo y Antonio

Con la librería scnapi y el emulador se me plantea el problema de que cuando compilo para el cliente debo incluir tu función y cuando compilo para probar yo en el emulador debo quitarla (si no la quito me dice que falta parte del programa). Y claro alguna vez se la he enviado al cliente mal compilada.

¿Alguna idea de como solucionarlo?
Jose Valle
Bilbao
Spain
User avatar
josevalle
 
Posts: 65
Joined: Fri Oct 14, 2005 6:20 pm
Location: Bilbao

Postby Antonio Linares » Thu Jun 08, 2006 6:23 am

Jose,

Que versión de Windows Mobile tiene el cliente y cual usas tú en el emulador ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby josevalle » Thu Jun 08, 2006 5:53 pm

Hola Antonio:

en el emulador:

Windows mobile 2003 ver 4.21.1088

En la pda Symbol

Pocket pc ver 4.20.0

Supongo que en la pda hay alguna dll propia
Jose Valle
Bilbao
Spain
User avatar
josevalle
 
Posts: 65
Joined: Fri Oct 14, 2005 6:20 pm
Location: Bilbao

Postby Antonio Linares » Thu Jun 08, 2006 6:20 pm

Jose,

Las funciones SH... sólo están disponibles en el Pocket PC con Windows Mobile.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby josevalle » Thu Jun 08, 2006 11:55 pm

Hola Antonio:

He instalado el emulador que sugería Roman Modic.. pero no funcionaba

He encontrado el archivo:

ScnApi32.dll

en la pda, lo he copiado al directorio que el emulador reconoce como storage card y funciona. Por supuesto no hace nada pero no da error que era de lo que se trataba.

Había buscado el archivo en la pda, pero con el file explorer no se veian las dll, buscando desde el pc (activesync) ha sido fácil.

Como siempre gracias por tu ayuda, incluso en este caso que es el primero que no has solucionado (y que no era importante) seguro que si nadie responde nada tampoco yo hubiera buscado la solución.
Jose Valle
Bilbao
Spain
User avatar
josevalle
 
Posts: 65
Joined: Fri Oct 14, 2005 6:20 pm
Location: Bilbao

Postby ramirezosvaldo » Fri Jun 09, 2006 3:43 am

Estimado Jose

Bueno, lo importante es que ya tengas solucionado el problema.

Yo en mi caso, se la pido a mi cliente la symbol el fin de semana y trabajo en ella directamente, sin pasar por el emulador.

Saludos
Osvaldo Ramirez
ramirezosvaldo
 
Posts: 101
Joined: Mon Oct 10, 2005 6:48 pm
Location: Cd. Juarez Chihuahua

Postby josevalle » Fri Jun 09, 2006 3:50 am

Hola Osvaldo.

Aprovecho para darte las gracias (con Hector ya he hablado) por la rutina del scanner y algunas ideas que saqué de tu programa.

Hasta pronto
Jose Valle
Bilbao
Spain
User avatar
josevalle
 
Posts: 65
Joined: Fri Oct 14, 2005 6:20 pm
Location: Bilbao

Postby Antonio Linares » Fri Jun 09, 2006 4:40 am

Jose,

Me alegro de que lo hayas solucionado :)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Next

Return to FiveWin para Pocket PC

Who is online

Users browsing this forum: No registered users and 26 guests