by 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