From 8d47d749e68b535b5fed478629d5e45fa0b2b4f5 Mon Sep 17 00:00:00 2001 From: jdg Date: Sun, 12 Sep 2021 22:14:42 +0200 Subject: [PATCH] First commit 18/11/2001 --- .../BDEDLL/BDEMONTREL.bpr | 179 + .../BDEDLL/BDEMONTREL.cpp | 1639 ++++++++ .../BDEDLL/BDEMONTREL.dll | Bin 0 -> 21504 bytes .../BDEDLL/BDEMONTREL.h | 79 + .../BDEDLL/BDEMONTREL.lib | Bin 0 -> 6052 bytes .../EserguiBDE/BDEMONTREL.bpr | 179 + .../EserguiBDE/BDEMONTREL.cpp | 1639 ++++++++ .../EserguiBDE/BDEMONTREL.dll | Bin 0 -> 20992 bytes .../EserguiBDE/BDEMONTREL.h | 79 + .../EserguiBDE/BDEMONTREL.lib | Bin 0 -> 6052 bytes .../EserguiBDE/Dialogo.cpp | 1458 ++++++++ .../EserguiBDE/Dialogo.h | 88 + .../EserguiBDE/Drivers.dat | 9 + .../EserguiBDE/ESERGUISA.bpr | 181 + .../EserguiBDE/ESERGUISA.cpp | 26 + .../EserguiBDE/ESERGUISA.exe | Bin 0 -> 102912 bytes .../EserguiBDE/ESERGUISA.res | Bin 0 -> 876 bytes .../EserguiBDE/Elemento.dat | 71 + .../EserguiBDE/Enraf.dat | 31 + .../EserguiBDE/Esergui.cpp | 3283 +++++++++++++++++ .../EserguiBDE/Esergui.h | 470 +++ .../EserguiBDE/IDAPI.CFG | Bin 0 -> 1313 bytes .../EserguiBDE/Lineas.dat | 30 + .../EserguiBDE/Pcomm.dll | Bin 0 -> 57856 bytes .../EserguiBDE/Principal.cpp | 1289 +++++++ .../EserguiBDE/Principal.dfm | Bin 0 -> 3685 bytes .../EserguiBDE/Principal.h | 130 + .../EserguiBDE/PruebaError.txt | 547 +++ .../EserguiBDE/Report.cpp | 14 + .../EserguiBDE/Report.dfm | Bin 0 -> 6028 bytes .../EserguiBDE/Report.h | 35 + .../EserguiBDE/Transfer.dat | Bin 0 -> 9453 bytes .../EserguiBDE/cam_fich.dat | 4 + InterBase.bpr | 103 + InterBase.cpp | 22 + InterBase.exe | Bin 0 -> 29184 bytes InterBase.res | Bin 0 -> 876 bytes MySQL_ADO.cpp | 51 + MySQL_ADO.dfm | 317 ++ MySQL_ADO.h | 78 + MySQL_wADO.bpr | 122 + MySQL_wADO.cpp | 22 + MySQL_wADO.exe | Bin 0 -> 34816 bytes MySQL_wADO.res | Bin 0 -> 876 bytes ProjectGroup1.bpg | 25 + README.md | 9 + mySQLDACB5.bpl | Bin 0 -> 367104 bytes 47 files changed, 12209 insertions(+) create mode 100644 Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.bpr create mode 100644 Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.cpp create mode 100644 Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.dll create mode 100644 Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.h create mode 100644 Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.lib create mode 100644 Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.bpr create mode 100644 Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.cpp create mode 100644 Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.dll create mode 100644 Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.h create mode 100644 Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.lib create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Dialogo.cpp create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Dialogo.h create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Drivers.dat create mode 100644 Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.bpr create mode 100644 Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.cpp create mode 100644 Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.exe create mode 100644 Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.res create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Elemento.dat create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Enraf.dat create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Esergui.cpp create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Esergui.h create mode 100644 Esergui -BDE utilizando API/EserguiBDE/IDAPI.CFG create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Lineas.dat create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Pcomm.dll create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Principal.cpp create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Principal.dfm create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Principal.h create mode 100644 Esergui -BDE utilizando API/EserguiBDE/PruebaError.txt create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Report.cpp create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Report.dfm create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Report.h create mode 100644 Esergui -BDE utilizando API/EserguiBDE/Transfer.dat create mode 100644 Esergui -BDE utilizando API/EserguiBDE/cam_fich.dat create mode 100644 InterBase.bpr create mode 100644 InterBase.cpp create mode 100644 InterBase.exe create mode 100644 InterBase.res create mode 100644 MySQL_ADO.cpp create mode 100644 MySQL_ADO.dfm create mode 100644 MySQL_ADO.h create mode 100644 MySQL_wADO.bpr create mode 100644 MySQL_wADO.cpp create mode 100644 MySQL_wADO.exe create mode 100644 MySQL_wADO.res create mode 100644 ProjectGroup1.bpg create mode 100644 README.md create mode 100644 mySQLDACB5.bpl diff --git a/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.bpr b/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.bpr new file mode 100644 index 0000000..6d0f0a6 --- /dev/null +++ b/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.bpr @@ -0,0 +1,179 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = BDEMONTREL.dll +OBJFILES = BDEMONTREL.obj +RESFILES = +RESDEPEN = $(RESFILES) +LIBFILES = +LIBRARIES = +SPARELIBS = Vcl40.lib +PACKAGES = Vcl40.bpi Vclx40.bpi vcljpg40.bpi bcbsmp40.bpi Qrpt40.bpi Vcldb40.bpi \ + ibsmp40.bpi vcldbx40.bpi TeeUI40.bpi teedb40.bpi tee40.bpi nmfast40.bpi \ + dclocx40.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I$(BCB)\include;$(BCB)\include\vcl -WD -Od -Hc -H=$(BCB)\lib\vcl40.csm -w -Ve \ + -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I$(BCB)\include;$(BCB)\include\vcl -$YD -$W -$O- -v -JPHNE -M +RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpd -x -Gn -Gi -v +# --------------------------------------------------------------------------- +ALLOBJ = c0d32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=3082 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- diff --git a/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.cpp b/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.cpp new file mode 100644 index 0000000..62e1393 --- /dev/null +++ b/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.cpp @@ -0,0 +1,1639 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +#include "stdlib.h" +#include "stdio.h" +#include "dos.h" +#include "alloc.h" +#include "BDEMONTREL.h" + +char FicheroError[DIM_FICHEROTXT]=""; + +//--------------------------------------------------------------------------- +// Important note about DLL memory management when your DLL uses the +// static version of the RunTime Library: +// +// If your DLL exports any functions that pass String objects (or structs/ +// classes containing nested Strings) as parameter or function results, +// you will need to add the library MEMMGR.LIB to both the DLL project and +// any other projects that use the DLL. You will also need to use MEMMGR.LIB +// if any other projects which use the DLL will be perfomring new or delete +// operations on any non-TObject-derived classes which are exported from the +// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling +// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases, +// the file BORLNDMM.DLL should be deployed along with your DLL. +// +// To avoid using BORLNDMM.DLL, pass string information using "char *" or +// ShortString parameters. +// +// If your DLL uses the dynamic version of the RTL, you do not need to +// explicitly add MEMMGR.LIB as this will be done implicitly for you +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//=============================================================== +// Funcion: +// IndCampo (dbiTabla* psT,char *pszCampo); +// +// Entrada: psT - Puntero a la tabla. +// szCampo - Nombre del campo descriptor. +// +// Devuelve: 1..N - Numero del campo descriptor . +// 0 - Campo desconocido. +// +// Description: +// Devuelve el numero del campo descriptor de entrada. +//================================================================ + +int IndCampo (dbiTabla* psT,char *pszCampo) +{ + int nI; + + nI = 0; + while ((nI < psT->curProps.iFields) && strcmp ((psT->pFldArray+nI)->szName,pszCampo)) + nI++; + if (nI == psT->curProps.iFields) + nI = -1; + nI++; + + return (nI); +} + +//=============================================================== +// Function: +// LIBError (char *pszDescError,char *pszContext1,char *pszContext2); +// +// Input: pszDescError - Descripcion error +// pszContext1 - Contexto 1 +// pszContext2 - Contexto 2 +// +// Description: +// Visualiza una ventana con informacion sobre el error de libreria. +// En la version grafica se grabara en logger y se +// presentara una ventana no bloqueante. +//================================================================ +/* +void LIBError (char *pszDescError,char *pszContext1,char *pszContext2) +{ +/* char szDes [TAMAX_BUFFER_TXT + 1]; + char szHora[TAMAX_HORA+1]; + char szFecha[TAMAX_FECHA+1]; + + CapturaFechaHora(szFecha,szHora); + Formatea (szDes,sizeof(szDes), + "%s. 1) %s. 2) %s", + pszDescError,pszContext1,pszContext2); + ExcepcionHistoricoTxt(szFecha,szHora,"Error","LIBDBI",szDes,NULL,NULL,NULL,NULL,NULL); + Formatea (szDes,sizeof(szDes), + "%s\n1) %s\n2) %s", + pszDescError,pszContext1,pszContext2); + poAplicacion->MessageBox(szDes,"Error librería DBI",MB_OK); +}*/ + +//=============================================================== +// Funcion: +// DBIError(DBIResult CodError); +// +// Entrada: CodError - Codigo del error +// +// Descripcion: +// Visualiza una ventana con informacion sobre el error DBI. +// En la version grafica se grabara en logger y se +// presentara una ventana no bloqueante. +//================================================================ +void DBIError (DBIResult CodError) +{ + DBIResult rslt; + DBIErrInfo ErrInfo; + DBIMSG ErrDesc; + char szDes [TAM_MAX_CADENA]; + + rslt = DbiGetErrorInfo(TRUE,ErrInfo); + if (rslt == DBIERR_NONE) + { + if (CodError == ErrInfo.iError) + { + sprintf (szDes, + "Error Info %s (%d,%d:%d). 1) %s. 2) %s. 3) %s. 4) %s", + ErrInfo.szErrCode,CodError,ErrCat(CodError),ErrCode(CodError), + ErrInfo.szContext[1],ErrInfo.szContext[2],ErrInfo.szContext[3],ErrInfo.szContext[4]); + if(strcmp(FicheroError,"")) + GenerarError(szDes); + } + else + { + rslt = DbiGetErrorString(CodError,ErrDesc); + if (rslt == DBIERR_NONE) + { + sprintf(szDes,"Error String %s (%d,%d:%d)", + ErrDesc,CodError,ErrCat(CodError),ErrCode(CodError)); + if(strcmp(FicheroError,"")) + GenerarError(szDes); + } + else + { + if(strcmp(FicheroError,"")) + GenerarError("Error Dbidif sin información"); + } + } + } + else + { + if(strcmp(FicheroError,"")) + GenerarError("Error Dbidif sin información"); + } +} + +//=============================================================== +// Funcion: +// AnsiToNativo (char *pszValorAnsi); +// +// Entrada: +// pszValorAnsi - Valor Ansi a convertir. +// +// Devuelve: +// Valor convertido +// +// Descripcion: +// Convierte una cadena ANSI al lenguaje nativo de la +// base de datos. Una cadena ANSI es, por ejemplo, la +// definida internamente en un fichero fuente. +//================================================================ + +DBIResult AnsiToNativo (char *pszAnsi,char *pszNativo) +{ + DBIResult rslt; + void *pLdObj; + int bDataLoss; + + rslt = DbiGetLdObj(NULL,pLdObj); + if (rslt == DBIERR_NONE) + rslt = DbiAnsiToNative(pLdObj,pszNativo,pszAnsi,0,bDataLoss); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// InicializarBDE(char *pszIniFile) +// +// Entrada: pszIniFile - Nombre fichero de configuracion con extension .CFG +// +// Devuelve: DBIResult +// +// Descripcion: +// Inicializa IDAPI indicada. +//=============================================================== + +DBIResult InicializarBDE(char *pszIniFile) +{ + DBIResult rslt; + DBIEnv envr; + + strcpy (envr.szWorkDir,""); + strcpy (envr.szIniFile,pszIniFile); + strcpy (envr.szLang,""); + strcpy (envr.szClientName,""); + envr.bForceLocalInit = FALSE; + + rslt = DbiInit(&envr); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} +//=============================================================== +// Funcion: +// ConectarBDE(char *pszBaseDatos,hDBIDb *hBaseDatos) +// +// Entrada: pszBaseDatos - Nombre base de datos. +// hDBIDb *hBaseDatos - Puntero a la base de Datos +// +// Devuelve: DBIResult +// +// Descripcion: +// Inicializa IDAPI indicada. +//=============================================================== + +DBIResult ConectarBDE(char *pszBaseDatos,hDBIDb *hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiOpenDatabase(pszBaseDatos,NULL,dbiREADWRITE,dbiOPENSHARED, + NULL,0,NULL,NULL,*hBaseDatos); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} +//=============================================================== +// Funcion: +// DesconectarBDE (hDBIDb hBaseDatos) +// +// Entrada: hDBIDb hBaseDatos - Base de Datos +// +// Devuelve: DBIResult. +// +// Descripcion: +// Cierra la Database. +//================================================================ +DBIResult DesconectarBDE (hDBIDb hBaseDatos) +{ + DBIResult rslt; + rslt = DbiCloseDatabase(hBaseDatos); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} +//=============================================================== +// Funcion: +// FinalizarBDE (void) +// +// Devuelve: DBIResult. +// +// Descripcion: +// Finaliza el IDAPI. +//================================================================ + +DBIResult FinalizarBDE (void) +{ + DBIResult rslt; + rslt = DbiExit(); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CargarDirDbf(char *pszDir); +// +// Entrada: char *pszDir - puntero al directorio de la base de datos +// hDBIDb hBaseDatos - Nombre de la base de datos +// +// Devuelve: DBIResult. +// +// Descripcion: +// Carga en pszDir el directorio donde se encuentran los +// dbf para esta base de datos +//================================================================ + +DBIResult CargarDirBDE (char *pszDir,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiGetDirectory(hBaseDatos,TRUE,pszDir); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} + +//=============================================================== +// Funcion: +// AbrirTablaBDE (dbiTabla *psT, char *pszNombreTabla,char *pszNombreTag,bool bExclusivo); +// +// Entrada: psT - Puntero a la tabla. +// pszNombreTabla - Nombre de la tabla (sin extensión). +// pszNombreTag - Nombre indice de apertura (en orden natural sera NULL). +// bExclusivo - TRUE si se abre en exclusiva. +// +// Devuelve: DBIResult. +// +// Descripcion: +// Abre la tabla indicada, con indice o no activo, +// en modo exclusivo o no y se posiciona en el primer registro. +//================================================================ + +DBIResult AbrirTablaBDE (dbiTabla *psT, char *pszNombreTabla,char *pszNombreTag,bool bExclusivo,hDBIDb hBaseDatos) +{ + int iReproceso; + char szNombreIndice [DBIMAXTBLNAMELEN+1]; + DBIResult rslt; + DBIShareMode eModo; + + psT->bTablaAbierta = FALSE; + iReproceso = DEF_MAXREPOPENTABLE; + (bExclusivo ? eModo = dbiOPENEXCL : eModo = dbiOPENSHARED); + *szNombreIndice = 0; + if (pszNombreTag) + { + strcpy (szNombreIndice,pszNombreTabla); + strcat (szNombreIndice,DEF_MDXEXT); + } + + do + { + rslt = DbiOpenTable (hBaseDatos,pszNombreTabla,szDBASE,szNombreIndice,pszNombreTag, + 0,dbiREADWRITE,eModo,xltNONE,FALSE,NULL,psT->hCur); + if (rslt == DBIERR_NONE) + { + DbiGetCursorProps (psT->hCur, psT->curProps); + psT->pRecBuf = (PByte) malloc (psT->curProps.iRecBufSize); + if (psT->pRecBuf) + { + psT->pFldArray = (pFLDDesc) malloc (sizeof(FLDDesc) * psT->curProps.iFields); + if (psT->pFldArray) + { + DbiGetFieldDescs (psT->hCur,psT->pFldArray); + DbiSetProp(psT->hCur,curSOFTDELETEON,TRUE); + DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,NULL); + psT->bTablaAbierta = TRUE; + } + else + { + rslt = DBIERR_NOMEMORY; + free (psT->pRecBuf); + DbiCloseCursor (psT->hCur); + } + } + else + { + rslt = DBIERR_NOMEMORY; + DbiCloseCursor (psT->hCur); + } + } + else + if (rslt == DBIERR_FILEBUSY) + { + iReproceso--; + Sleep (RETARDO_ABRIR_TABLA); + } + } + while (iReproceso && (rslt == DBIERR_FILEBUSY)); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CerrarTablaBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Cierra la tabla indicada. +//================================================================ + +DBIResult CerrarTablaBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DBIERR_NONE; + if (psT->bTablaAbierta) + { + free (psT->pFldArray); + free (psT->pRecBuf); + rslt = DbiCloseCursor (psT->hCur); + psT->bTablaAbierta = FALSE; + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// ContarRegBDE (dbiTabla* psT,UINT32 *nRN) +// +// Entrada: psT - Puntero a la tabla. +// +// Salida nRN - Puntero al numero de registros. +// +// Devuelve: DBIResult +// +// Descripcion: +// Devuelve el numero de registros en la tabla. +//================================================================ + +DBIResult ContarRegBDE (dbiTabla* psT,int *nRN) +{ + DBIResult rslt; + + rslt = DbiGetRecordCount(psT->hCur,*nRN); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// NumRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Salida nRN - Puntero al numero del registro. +// +// Devuelve: DBIResult +// +// Descripcion: +// Devuelve el ordinal del registro en curso +//================================================================ + +DBIResult NumRegBDE (dbiTabla* psT,int *nRN) +{ + DBIResult rslt; + + rslt = DbiGetRecord(psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + *nRN = (int) psT->recProps.iPhyRecNum; + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrRegBDE (dbiTabla* psT,int nNumRec,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// nNumRec - Numero de registro. +// bRD - TRUE, si esta borrado. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el registro indicado +//================================================================ + +DBIResult IrRegBDE (dbiTabla* psT,int nNumRec,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToRecordNo (psT->hCur,nNumRec); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetRecord(psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// EstaRegBorBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Salida bRD - Puntero al dato. +// +// Devuelve: DBIResult +// +// Descripcion: +// Devuelve si el registro en curso está marcado para borrar. +//================================================================ + +DBIResult EstaRegBorBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiGetRecord(psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BorrarRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Marca el registro en curso para borrar. +//================================================================ + +DBIResult BorrarRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiDeleteRecord(psT->hCur,psT->pRecBuf); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// RecRegBorBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Desmarca el registro en curso para borrar. +//================================================================ + +DBIResult RecRegBorBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiUndeleteRecord(psT->hCur); + if(rslt != DBIERR_NONE && rslt!=DBIERR_NA)//10756 El Reg no esta borrado + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// VerBorradosBDE (dbiTabla* psT,bool bON); +// +// Entrada: psT - Puntero a la tabla. +// bON - TRUE, los registros marcados son utilizables. +// +// Devuelve: DBIResult +// +// Descripcion: +// Cambia la propiedad SET DELETED +//================================================================ + +DBIResult VerBorradosBDE (dbiTabla* psT,bool bON) +{ + DBIResult rslt; + + rslt = DbiSetProp(psT->hCur,curSOFTDELETEON,bON); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrPrimerRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el primer registro +//================================================================ + +DBIResult IrPrimerRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToBegin (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrUltimoRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el ultimo registro +//================================================================ + +DBIResult IrUltimoRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToEnd (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetPriorRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrSiguienteRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el siguiente registro de la tabla. +//================================================================ + +DBIResult IrSiguienteRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + + if(rslt != DBIERR_NONE && rslt!=DBIERR_EOF)//8706 Fin de registros + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrAnteriorRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el siguiente registro de la tabla. +//================================================================ + +DBIResult IrAnteriorRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiGetPriorRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + if(rslt != DBIERR_NONE && rslt!=DBIERR_BOF)//8705 Principio de registros + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// SelIndBDE (dbiTabla* psT,char* szNombreTag); +// +// Entrada: psT - Puntero a la tabla. +// szNombreIndice - Nombre del Indice en el que se quiere buscar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Selecciona el indice en la tabla indicada. +//================================================================ + +DBIResult SelIndBDE (dbiTabla* psT,char* szNombreTag) +{ + char szNombreIndice [DBIMAXTBLNAMELEN+1]; + DBIResult rslt; + + strcpy (szNombreIndice,psT->curProps.szName); + strcat (szNombreIndice,DEF_MDXEXT); + rslt = DbiSwitchToIndex (psT->hCur,szNombreIndice,szNombreTag,NULL,false); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BuscarValorExactoBDE(dbiTabla *psT,char *pszValor,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// szValor - Valor del Indice a encontrar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Busca un valor índice exacto en la tabla y se posiciona en el +// registro correspondiente. +//================================================================ + +DBIResult BuscarValorExactoBDE (dbiTabla *psT,char *pszValor,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToKey (psT->hCur,keySEARCHEQ,true,0,0,(PByte)pszValor); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE && rslt!=DBIERR_RECNOTFOUND)//8710 no encontro busqueda + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BuscarValorAproxBDE (dbiTabla *psT,char *pszValor,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// szValor - Valor del Indice a encontrar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Busca un valor índice aproximado en la tabla y se posiciona en el +// registro correspondiente. +//================================================================ + +DBIResult BuscarValorAproxBDE (dbiTabla *psT,char *pszValor,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToKey (psT->hCur,keySEARCHGEQ,true,0,0,(PByte) pszValor); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE && rslt!=DBIERR_RECNOTFOUND) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BlanquearRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Blanquea el registro seleccionado. +//================================================================ + +DBIResult BlanquearRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiInitRecord (psT->hCur,psT->pRecBuf); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// AnadirRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Añade un nuevo registro en blanco en la tabla. +//================================================================ + +DBIResult AnadirRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiInitRecord (psT->hCur,psT->pRecBuf); + if (rslt == DBIERR_NONE) + { + rslt = DbiAppendRecord (psT->hCur,psT->pRecBuf); + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// LeerCampoBDE (dbiTabla* psT,int nInd,char *pszValor,bool *bVacio); +// +// Entrada: psT - Puntero a la tabla. +// nInd - Indice del campo que se quiere leer. +// szValor - Valor del campo leido. Opcional. +// nLon - sizeof (szValorCampo). Opcional. +// bVacio - TRUE, si campo vacio. Opcional. +// +// Devuelve: DBIResult +// +// Descripcion: +// Lee un campo de la tabla indicada. +//================================================================ + +DBIResult LeerCampoBDE (dbiTabla* psT,int nInd,char *pszValor, bool *bVacio) +{ + DBIResult rslt; + int nV,nLon; + + nLon=psT->pFldArray[nInd-1].iLen; + memset (pszValor,0,nLon+1); + rslt = DbiGetField (psT->hCur,(unsigned short)nInd,psT->pRecBuf,(PByte)pszValor,nV); + if (rslt == DBIERR_NONE && bVacio) + *bVacio = (nV == 1); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// LeerCampoNBDE (dbiTabla* psT,char* szNombre,char *pszValor,bool *bVacio); +// +// Entrada: psT - Puntero a la tabla. +// szCampo - Nombre del campo que se quiere leer. +// szValor - Valor del campo leido. Opcional. +// nLon - sizeof (szValorCampo). Opcional. +// bVacio - TRUE, si campo vacio. Opcional. +// +// Devuelve: DBIResult +// +// Descripcion: +// Lee un campo de la tabla indicada. +//================================================================ + +DBIResult LeerCampoNBDE (dbiTabla* psT,char* szCampo,char *pszValor,bool *bVacio) +{ + return (LeerCampoBDE (psT,IndCampo(psT,szCampo),pszValor,bVacio)); +} + +//=============================================================== +// Funcion: +// ModificarCampoBDE (dbiTabla* psT,int nInd,char *pszValor); +// +// Entrada: psT - Puntero a la tabla. +// nInd - Indice del campo que se quiere escribir. +// szValor - Valor del campo escrito. NULL si se quiere limpiar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Modifica un campo en la tabla indicada. +//================================================================ + +DBIResult ModificarCampoBDE (dbiTabla* psT,int nInd,char *pszValor) +{ + DBIResult rslt; + int nLon; + char *sValor; + + nLon=psT->pFldArray[nInd-1].iLen; + sValor=(char*)malloc(nLon); + memset (sValor,' ',nLon); + if(nLon>(int)strlen(pszValor)) + strncpy (sValor,pszValor,strlen(pszValor)); + else + strncpy (sValor,pszValor,nLon); + + rslt = DbiPutField (psT->hCur,(unsigned short)nInd,psT->pRecBuf,(PByte)sValor); + if (rslt == DBIERR_NONE) + rslt = DbiModifyRecord (psT->hCur,psT->pRecBuf,TRUE); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + free(sValor); + + return (rslt); +} + +//=============================================================== +// Funcion: +// ModificarCampoNBDE (dbiTabla* psT,char* szNombre,char* pszValor); +// +// Input: psT - Puntero a la tabla. +// szNombre - Nombre del campo que se quiere escribir. +// szValor - Valor del campo escrito. NULL si se quiere limpiar. +// +// Return: DBIResult +// +// Description: +// Modifica un campo en la tabla indicada. +//================================================================ + +DBIResult ModificarCampoNBDE (dbiTabla* psT,char *pszNombre,char *pszValor) +{ + return (ModificarCampoBDE (psT,IndCampo(psT,pszNombre),pszValor)); +} + +//=============================================================== +// Funcion: +// DuplicarRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Duplica un registro +//================================================================ + +DBIResult DuplicarRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + char *psReg; + + psReg = (char *) malloc (psT->curProps.iRecBufSize); + if (psT->pRecBuf) + { + memcpy (psReg,psT->pRecBuf,psT->curProps.iRecBufSize); + rslt = AnadirRegBDE (psT); + if (rslt == DBIERR_NONE) + { + memcpy (psT->pRecBuf,psReg,psT->curProps.iRecBufSize); + rslt = DbiModifyRecord (psT->hCur,psT->pRecBuf,TRUE); + } + free (psReg); + } + else + rslt = DBIERR_NOMEMORY; + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// EliminarBorradosTablaBDE (dbiTabla *psT); +// +// Entrada: psT - Puntero a la tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Empaqueta la tabla indicada. +//================================================================ + +DBIResult EliminarBorradosTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiPackTable(hBaseDatos,psT->hCur,NULL,NULL,TRUE); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// VaciarTablaBDE (dbiTabla *psT); +// +// Entrada: psT - Puntero a la tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Vacía la tabla indicada. +//================================================================ + +DBIResult VaciarTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiEmptyTable(hBaseDatos,psT->hCur,NULL,NULL); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// ReindexarTablaBDE (dbiTabla *psT); +// +// Entrada: psT- Puntero a latabla +// +// Devuevle: DBIResult +// +// Descripcion: +// Reindexa la tabla indicada. +//================================================================ + +DBIResult ReindexarTablaBDE (dbiTabla *psT) +{ + DBIResult rslt; + + rslt = DbiRegenIndexes(psT->hCur); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CopiarTablaBDE (dbiTabla *psT,char *pszNomDestTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Copia la tabla indicada. +//================================================================ + +DBIResult CopiarTablaBDE (char *pszNomOrigTable,char *pszNomDestTable,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiCopyTable (hBaseDatos,TRUE,pszNomOrigTable,szDBASE,pszNomDestTable); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// RenombrarTablaBDE (char *pszNomOldTable,char *pszNomNewTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Renombra la tabla indicada. +//================================================================ + +DBIResult RenombrarTablaBDE (char *pszNomOldTable,char *pszNomNewTable,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiRenameTable (hBaseDatos,pszNomOldTable,szDBASE,pszNomNewTable); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BorrarTablaBDE (char *pszNomTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Renombra la tabla indicada. +//================================================================ + +DBIResult BorrarTablaBDE (char *pszNomTable,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiDeleteTable (hBaseDatos,pszNomTable,szDBASE); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CopiarEstruTablaBDE (dbiTabla *psT,char *pszNomDestTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Genera una tabla con la estructura de la tabla indicada. +//================================================================ + +DBIResult CopiarEstruTablaBDE (dbiTabla *psT,char *pszNomDestTabla,hDBIDb hBaseDatos) +{ + DBIResult rslt; + CRTblDesc DescTabla; + pIDXDesc pIndArray; + + pIndArray = (pIDXDesc) malloc (sizeof(IDXDesc) * psT->curProps.iIndexes); + if (pIndArray) + { + rslt = DbiGetIndexDescs (psT->hCur,pIndArray); + if (rslt == DBIERR_NONE) + { + memset (&DescTabla,0,sizeof(CRTblDesc)); + strcpy (DescTabla.szTblName,pszNomDestTabla); + strcpy (DescTabla.szTblType,szDBASE); + + DescTabla.iFldCount = psT->curProps.iFields; + DescTabla.pfldDesc = psT->pFldArray; + + DescTabla.iIdxCount = psT->curProps.iIndexes; + DescTabla.pidxDesc = pIndArray; + + rslt = DbiCreateTable (hBaseDatos,TRUE,DescTabla); + } + + free (pIndArray); + } + else + rslt = DBIERR_NOMEMORY; + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CopiarATextoBDE (dbiTabla* psT,char *pszNomText); +// +// Entrada: psT - Puntero a la tabla. +// pszNomText - Nombre fichero texto +// +// Devuelve: DBIResult +// +// Descripcion: +// Copia una tabla a un fichero texto. +//================================================================ + +DBIResult CopiarATextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos) +{ + DBIResult rslt; + CRTblDesc DescTxt; + hDBICur hTxtCur; + pFLDDesc pTxtFld; + int NumReg = 0; + + memset (&DescTxt,0,sizeof (CRTblDesc)); + + strcpy (DescTxt.szTblName,pszNomText); + strcpy (DescTxt.szTblType,szASCII); + + rslt = DbiCreateTable (hBaseDatos,TRUE,DescTxt); + if (rslt == DBIERR_NONE) + { + rslt = DbiOpenTable (hBaseDatos,pszNomText,"ASCIIDRV",NULL,NULL,0,dbiREADWRITE, + dbiOPENSHARED,xltFIELD,FALSE,NULL,hTxtCur); + if (rslt == DBIERR_NONE) + { + pTxtFld = (pFLDDesc) malloc (psT->curProps.iFields * sizeof(FLDDesc)); + if (pTxtFld) + { + rslt = DbiTranslateRecordStructure (szDBASE,psT->curProps.iFields,psT->pFldArray, + szASCII,NULL,pTxtFld,0); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetFieldMap (hTxtCur,psT->curProps.iFields,pTxtFld); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (hTxtCur); + if (rslt == DBIERR_NONE) + rslt = DbiBatchMove(NULL,psT->hCur,NULL,hTxtCur,batchAPPEND, + 0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL, + NULL,NULL,FALSE,FALSE,NumReg,TRUE); + } + } + } + free (pTxtFld); + } + else + rslt = DBIERR_NOMEMORY; + + DbiCloseCursor (hTxtCur); + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// AnadirDesdeTextoBDE (dbiTabla* psT,char *pszNomText); +// +// Entrada: psT - Puntero a la tabla. +// pszNomText - Nombre fichero texto +// +// Devuelve: DBIResult +// +// Descripcion: +// Copia a una tabla desde un fichero texto. +//================================================================ + +DBIResult AnadirDesdeTextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos) +{ + DBIResult rslt; + hDBICur hTxtCur; + pFLDDesc pTxtFld; + int NumReg = 0; + + rslt = DbiOpenTable (hBaseDatos,pszNomText,"ASCIIDRV",NULL,NULL,0,dbiREADWRITE, + dbiOPENSHARED,xltFIELD,FALSE,NULL,hTxtCur); + if (rslt == DBIERR_NONE) + { + pTxtFld = (pFLDDesc) malloc (psT->curProps.iFields * sizeof(FLDDesc)); + if (pTxtFld) + { + rslt = DbiTranslateRecordStructure (szDBASE,psT->curProps.iFields,psT->pFldArray, + szASCII,NULL,pTxtFld,0); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetFieldMap (hTxtCur,psT->curProps.iFields,pTxtFld); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (hTxtCur); + if (rslt == DBIERR_NONE) + rslt = DbiBatchMove(NULL,hTxtCur,NULL,psT->hCur,batchAPPEND, + 0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL, + NULL,NULL,FALSE,FALSE,NumReg,TRUE); + } + } + } + free (pTxtFld); + } + else + rslt = DBIERR_NOMEMORY; + + DbiCloseCursor (hTxtCur); + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// SelecReintBloqueoBDE (int nSegundos); +// +// Entrada: nSegundos - Nº de segundos de reintento +// +// Devuelve: DBIResult +// +// Descripcion: +// Actualiza el numero de segundos de reintento por bloqueo. +// No tiene aplicacion en las aperturas de tabla. +//================================================================ + +DBIResult SelecReintBloqueoBDE (int nSegundos) +{ + DBIResult rslt; + + rslt = DbiSetLockRetry ((unsigned short) nSegundos); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// void GenerarError(char *Error) +// +// Entrada: char *Error - Cadena del Error producido +// +// Descripcion: +// Genera Errores en el fichero de nombre a eleccion por el usuario +// +//================================================================ + +void GenerarError(char *Error) +{ + FILE *fichero; + char szHora[DIM_HORA+1]; + char szFecha[DIM_FECHA+1]; + + CapturarFechaHora(szFecha,szHora); + + if(strcmp(FicheroError,"")) + { + if( (fichero=fopen(FicheroError,"at"))!=NULL) + { + fputs(szFecha,fichero); + fputc(' ',fichero); + fputs(szHora,fichero); + fputc(' ',fichero); + fputs(Error,fichero); + fputc('\n',fichero); + fclose(fichero); + } + } +} + +//=============================================================== +// Funcion: +// void CapturarFechaHora(char *pszFecha,char *pszHora) +// +// Entrada: +// char *pszFecha - Puntero a char para la Fecha +// char *pszHora - Puntero a char para la Hora +// +// Descripcion: +// Formatea la fecha y hora actual +// +//================================================================ + +void CapturarFechaHora(char *pszFecha,char *pszHora) +{ + struct date sfecha; + struct time shora; + + getdate(&sfecha); + sprintf(pszFecha,"%02d/%02d/%4d",sfecha.da_day,sfecha.da_mon,sfecha.da_year); + + gettime(&shora); + sprintf(pszHora,"%02d:%02d:%02d",shora.ti_hour,shora.ti_min,shora.ti_sec); +} + +//=============================================================== +// Funcion: +// bool ComprobarNomFichError(char *Nombre) +// +// Entrada: +// char *Nombre - Nombre del fichero de Error +// +// Devuelve: +// bool - Si es correcto true sino false +// +// Descripcion: +// Comprueba si el nombre del fichero de Error es correcto +// +//================================================================ + +bool ComprobarNomFichError(char *Nombre) +{ + bool bcorrecto; + if (strlen(Nombre)<49) + { + strcpy(FicheroError,Nombre); + bcorrecto=true; + } + else + bcorrecto=false; + + return bcorrecto; +} + +//=============================================================== +// Funcion: +// char * ReservarMemoria(dbiTabla* psT,char *pszCampo) +// +// Entrada: +// dbiTabla* psT - Puntero a la tabla. +// char *pszCampo - Puntero al Campo. +// +// Devuelve: +// char * - Direccion de la zona de memoria reservada +// +// Descripcion: +// Reserva memoria a la variable con respecto al campo +// +//================================================================ + +char * ReservarMemoria(dbiTabla* psT,char *pszCampo) +{ + int CantidadMemoria; + char *Memoria; + + CantidadMemoria=ConseguirLongitud(psT,pszCampo); + if(CantidadMemoria) + { + //Reservamos memoria + Memoria=(char *)malloc(CantidadMemoria+1); + memset(Memoria,0,CantidadMemoria+1); + if(Memoria==NULL) + GenerarError("Error No hay memoria disponible"); + } + else Memoria=NULL; + + return Memoria; +} + +//=============================================================== +// Funcion: +// void LiberarMemoria(char *Memoria) +// +// Entrada: +// char *Memoria - Variable a liberar. +// +// Descripcion: +// Libera memoria de la variable con respecto al campo +// +//================================================================ + +void LiberarMemoria(char *Memoria) +{ + if(Memoria) + free(Memoria); + Memoria=NULL; +} + +//=============================================================== +// Funcion: +// int ConseguirLongitud(dbiTabla* psT,char *pszCampo) +// +// Entrada: +// dbiTabla* psT - Puntero a la tabla. +// char *pszCampo - Puntero al Campo. +// +// Devuelve: +// int - Longitud del Campo +// +// Descripcion: +// Consigue la longitud del campo deseado +// +//================================================================ + +int ConseguirLongitud(dbiTabla* psT,char *pszCampo) +{ + int nLon,indice; + + //Inicializamos longitud + nLon=0; + //Buscamos el indice del campo + indice=IndCampo(psT,pszCampo); + if(indice) + { + //Miramos cuanto mide el campo + nLon=psT->pFldArray[indice-1].iLen; + } + + return nLon; +} + +//=============================================================== +// Funcion: +// void LeerArrayCampoBDE(dbiTabla *psT,char *pszCampo,char **pszsCampoN, BYTE byRango) +// +// Entrada: +// dbiTabla* psT - Puntero a la tabla. +// char *pszCampo - Puntero al Campo. +// char **pszsCampoN - Variable de Array[byRango] +// BYTE byRango - Numero del Array a[9] seria 9 +// +// Descripcion: +// Lee un Array de campo +// +//================================================================ + +void LeerArrayCampoBDE(dbiTabla *psT,char *pszCampo,char **pszsCampoN, BYTE byRango) +{ + int ni; + char *pszNombreCampo; + + if(byRangob=CO%5ldJJH7lN0OKUWuS{h`F5)E3SL9eV>mivQt+k|nsbIzsq%d-Ey z2)G=KRhrIcw&yNfkhFS?-Mf9fDQ!BFK*`pr^d=~#JP@VP{wB)eN!MPCJ&DA5S_Z|2 z2LdF6N4(k?`#%}TtY+-y9K5>#Lj^#zS@EQqo?_xtB1$9Ch_4Gkc9#MSPqE;W10iB0zHI<%Fc-k^6rV*g6n>ff|1tvG zj~5rSeaF&vaJ=K?x#k_WloYc>PWw%G#R@57%4%;z-P;OJfrY8LoL!E2{}W{Lh^%Jp znFua7zZm2d_MQ))0`*J=G3)Zt>C3C^JX=2eF{(Z9ThHX9%Uh!8MV=rW~ z58L2|y=U8dFu#90IkDgO#CXQ`|J%c082_?b6)U7@vdFmI?}NgBnMfo=SyhXfzjzr& z7yozQ@jX$U;W;oYU*>Wp3P_G;TNu-m3Gmh5R-aNmoxcgn4q}V-vq-0AU<2g$>qeEC zy6BIE33a*)MqNm|_)1{Cup7z!DUodcJT&MCsCk80Y_CqP7W z8y9zzOjm9Eq`jxs=bu!}ya~zMVM%0ATibhXsjKsLWc$J>*#F_I8EBXORr|ZTV%Jfz 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 + +#define DEF_MDXEXT ".MDX" +#define DEF_MAXREPOPENTABLE 15 +#define TAM_MAX_CADENA 513 +#define TAMANO_DATE_DBF 8 +#define RETARDO_ABRIR_TABLA 1000 + +#define DSCERR_NOINITDBI "Librería no inicializada" +#define DSCERR_NOMEMRECBUF "Insuficiente memoria buffer tabla" +#define DSCERR_NOMEMDESCFLD "Insuficiente memoria campos tabla" + +#define DIM_FECHA 10 +#define DIM_HORA 8 +#define DIM_FICHEROTXT 50 + +#define NUMERO_MAXIMO_ARRAY 99 + +#define BDE_FIN_FICHERO 8706 + +typedef struct +{ + hDBICur hCur; + PBYTE pRecBuf; + CURProps curProps; + RECProps recProps; + pFLDDesc pFldArray; + bool bTablaAbierta; +} dbiTabla; + +extern "C" __declspec(dllexport) void LiberarMemoria(char *Memoria); +extern "C" __declspec(dllexport) char * ReservarMemoria(dbiTabla* psT,char *pszCampo); +extern "C" __declspec(dllexport) bool ComprobarNomFichError(char *Nombre); +extern "C" __declspec(dllexport) void CapturarFechaHora(char *pszFecha,char *pszHora); +extern "C" __declspec(dllexport) void GenerarError(char *Error); +extern "C" __declspec(dllexport) int IndCampo (dbiTabla* psT,char* pszCampo); +extern "C" __declspec(dllexport) DBIResult AnsiToNativo (char *pszAnsi,char *pszNativo); +extern "C" __declspec(dllexport) DBIResult InicializarBDE(char *pszIniFile); +extern "C" __declspec(dllexport) DBIResult ConectarBDE(char *pszBaseDatos,hDBIDb *hBaseDatos); +extern "C" __declspec(dllexport) DBIResult DesconectarBDE (hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult FinalizarBDE (void); +extern "C" __declspec(dllexport) DBIResult CargarDirBDE (char *pszDir,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult AbrirTablaBDE (dbiTabla *psT, char *pszNombreTabla,char *pszNombreTag,bool bExclusivo,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult CerrarTablaBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult ContarRegBDE (dbiTabla* psT,int *nRN); +extern "C" __declspec(dllexport) DBIResult NumRegBDE (dbiTabla* psT,int *nRN); +extern "C" __declspec(dllexport) DBIResult IrRegBDE (dbiTabla* psT,int nNumRec,bool *bRD); +extern "C" __declspec(dllexport) DBIResult EstaRegBorBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult BorrarRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult RecRegBorBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult VerBorradosBDE (dbiTabla* psT,bool bON); +extern "C" __declspec(dllexport) DBIResult IrPrimerRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult IrUltimoRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult IrSiguienteRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult IrAnteriorRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult SelIndBDE (dbiTabla* psT,char* szNombreTag); +extern "C" __declspec(dllexport) DBIResult BuscarValorExactoBDE (dbiTabla *psT,char *pszValor,bool *bRD); +extern "C" __declspec(dllexport) DBIResult BuscarValorAproxBDE (dbiTabla *psT,char *pszValor,bool *bRD); +extern "C" __declspec(dllexport) DBIResult BlanquearRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult AnadirRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult LeerCampoBDE (dbiTabla* psT,int nInd,char *pszValor,bool *bVacio); +extern "C" __declspec(dllexport) DBIResult LeerCampoNBDE (dbiTabla* psT,char* szNombre,char *pszValor,bool *bVacio); +extern "C" __declspec(dllexport) DBIResult ModificarCampoBDE (dbiTabla* psT,int nInd,char *pszValor); +extern "C" __declspec(dllexport) DBIResult ModificarCampoNBDE (dbiTabla* psT,char *pszNombre,char *pszValor); +extern "C" __declspec(dllexport) DBIResult DuplicarRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult EliminarBorradosTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult VaciarTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult ReindexarTablaBDE (dbiTabla *psT); +extern "C" __declspec(dllexport) DBIResult CopiarTablaBDE (char *pszNomOrigTable,char *pszNomDestTable,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult RenombrarTablaBDE (char *pszNomOldTable,char *pszNomNewTable,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult BorrarTablaBDE (char *pszNomTable,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult CopiarEstruTablaBDE (dbiTabla *psT,char *pszNomDestTabla,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult CopiarATextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult AnadirDesdeTextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult SelecReintBloqueoBDE (int nSegundos); +extern "C" __declspec(dllexport) int ConseguirLongitud(dbiTabla* psT,char *pszCampo); +extern "C" __declspec(dllexport) void LeerArrayCampoBDE(dbiTabla* psT,char* pszCampo,char **CampoN, BYTE byRango); +extern "C" __declspec(dllexport) void EscribirArrayCampoBDE(dbiTabla *psT,char *pszCampo,char **pszsCampoN, BYTE byRango); +extern "C" __declspec(dllexport) void CopiarCampo (dbiTabla *pTDestino,char *pszCampoDes,dbiTabla *pTOrigen,char *pszCampoOri); diff --git a/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.lib b/Esergui -BDE utilizando API/BDEDLL/BDEMONTREL.lib new file mode 100644 index 0000000000000000000000000000000000000000..0ed432051b413cbebec8a9049623a3cdbfcd6a6f GIT binary patch literal 6052 zcma)AOOxBi5vFsCZOL+8RXN4Z`{8mP${!dEhU9300d{7{+Y|g0QNu6M!~;tUyPndu}CvzwMf2PZ#JWMpNzi! z--qVbSdo5N-+etAy?f!18>!;###VRuX?n4eCgWGWI@OPsCE}C-#?OU<7Wj&^m>8>lMOyNy zh-KK2sYsGjF4Rk@1kup_OeZh}zI!uGPNm0WYy!UWmq8IglgYD;N{hZ6Hs`*tal)*L ze5vUyv9cEtyH8C)q4qYHYMix($KEE)m~NI(*F>{?DmhsqmTRf3&;e#_>?Vb<)}72F zO+7?Ypuu!1q9NvhM0TT&BQnl(N+k3p(@CF`3N<4RI)WUn&N>ZAuX0H$+~fG2h{`qO&S>O7z1D;@?{X#&!yzNE9*h~~OeB9Cyn@er`nA?s% z=F;qAuGW1Fw*Ac3@x0x|ToW1fO`W_O)fJd%Zk>F^E_cDgp~`i(kX;+_RPmf@i+Rcv zj_Wk^WNsCQ?F~9=_?3l9Qp97Y<~*Iy4MFFrrK5}lcQ+Z`1=OA93A+_!g9=;)y&H@e z&yq|}y3N9&vn&b}!OtqQ5e*``&t?`XFZ{B=QR7!hw|q!@6&wrn{wf!A@=-y=Ba`NT z{ZrtIvqY$v)Z-p=H~Rr8mfFc^F^tD2Y<7Bt9qkMpC*Lj?dhBjdi(&n8DPX95*0p}= zFA=h?b*{zSkLM7$6ro`b1?@(mHH4|`u@V-+(<5}|Zy)A^{>?08u?W%*L%MW& zL0IW)4Jx99Vji)XF|+LEb%@=_*Q^_zHiS#7&x5d;rVz-BqhK&T z!e>7{d2qntea8>x4AS0%$fVu^qw+Y)Z%z;7HWJ*_9tOVs-nKj#^V1=1-JLZgj?PXn zNV|YZ1+#M9rqFsjdtSv6-sNC~Wv~utDI+mgHrPpRf&$`{X>nfWB+IU5H0qcrTcq$m zTnV<2Mk-DddRz%u!0zP?Ev*m}mLzocQ5s!HH zz=I!M5;Oo9H;#^|?+|tCTV$-dCw}XBY=cDxqlG{s*wVhc@New;e zT8dH~rA6{Ae;EoiX`ch3dr3f6LGDnDm?U>EQL42J>g5(Z4?!eSax;YhG+0>i!q?=-n@n@odRw?xh$WoX07rlLkK|fro!*+<$HE7TY zDHo6X!g;ALCrFCm_n>?z9Iw`%>cQaD1XFHc3ohpI2Xyx1WpsF470tZZ)Qxys ztoHRq_V1DXBcIJ4n)>ZU@~@HnVi|3U-QN%8`#ZyS#kv|yhWeM3WrGWSF({2p$5Iz* zRPMB1SAVM@^I?y_!!&-l45^phQn%y7!^U|XYT+Nz=TDbnQ*B|xyHR`pcFqepLQiZb zC8o=2w=Um4MJ2Jke)x_qclGw}$=g6KkDEB04b9OpG^}@X7$(yk9m&j=Z{IVW$2o!% zyDo>xH2AO^?jTgVeYB}zOfL^U4d0~Pl~4iEG<9?S2%zHg;$eRP+PGYORZQ!qIH!Jr z6YvvwT5Mr~?utg$+i|t}YQQtqK$nkY^QLIha$7gm1;5mRq`GrL2YH>;diPku!D*6u zcVF!f>vO3@bt}c-!v14;S12p-xN54q>V5RnBhyXbz*CwsS}u8>ugkl`{j{#XIhXl4 jR`jFgatVJgU&0e{^&L2G&N%=2Uht=Q{NcYJj7I+l)B)Eu literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.bpr b/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.bpr new file mode 100644 index 0000000..6d0f0a6 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.bpr @@ -0,0 +1,179 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = BDEMONTREL.dll +OBJFILES = BDEMONTREL.obj +RESFILES = +RESDEPEN = $(RESFILES) +LIBFILES = +LIBRARIES = +SPARELIBS = Vcl40.lib +PACKAGES = Vcl40.bpi Vclx40.bpi vcljpg40.bpi bcbsmp40.bpi Qrpt40.bpi Vcldb40.bpi \ + ibsmp40.bpi vcldbx40.bpi TeeUI40.bpi teedb40.bpi tee40.bpi nmfast40.bpi \ + dclocx40.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I$(BCB)\include;$(BCB)\include\vcl -WD -Od -Hc -H=$(BCB)\lib\vcl40.csm -w -Ve \ + -r- -a8 -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tWM \ + -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I$(BCB)\include;$(BCB)\include\vcl -$YD -$W -$O- -v -JPHNE -M +RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpd -x -Gn -Gi -v +# --------------------------------------------------------------------------- +ALLOBJ = c0d32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=3082 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- diff --git a/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.cpp b/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.cpp new file mode 100644 index 0000000..62e1393 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.cpp @@ -0,0 +1,1639 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +#include "stdlib.h" +#include "stdio.h" +#include "dos.h" +#include "alloc.h" +#include "BDEMONTREL.h" + +char FicheroError[DIM_FICHEROTXT]=""; + +//--------------------------------------------------------------------------- +// Important note about DLL memory management when your DLL uses the +// static version of the RunTime Library: +// +// If your DLL exports any functions that pass String objects (or structs/ +// classes containing nested Strings) as parameter or function results, +// you will need to add the library MEMMGR.LIB to both the DLL project and +// any other projects that use the DLL. You will also need to use MEMMGR.LIB +// if any other projects which use the DLL will be perfomring new or delete +// operations on any non-TObject-derived classes which are exported from the +// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling +// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases, +// the file BORLNDMM.DLL should be deployed along with your DLL. +// +// To avoid using BORLNDMM.DLL, pass string information using "char *" or +// ShortString parameters. +// +// If your DLL uses the dynamic version of the RTL, you do not need to +// explicitly add MEMMGR.LIB as this will be done implicitly for you +//--------------------------------------------------------------------------- +int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) +{ + return 1; +} +//=============================================================== +// Funcion: +// IndCampo (dbiTabla* psT,char *pszCampo); +// +// Entrada: psT - Puntero a la tabla. +// szCampo - Nombre del campo descriptor. +// +// Devuelve: 1..N - Numero del campo descriptor . +// 0 - Campo desconocido. +// +// Description: +// Devuelve el numero del campo descriptor de entrada. +//================================================================ + +int IndCampo (dbiTabla* psT,char *pszCampo) +{ + int nI; + + nI = 0; + while ((nI < psT->curProps.iFields) && strcmp ((psT->pFldArray+nI)->szName,pszCampo)) + nI++; + if (nI == psT->curProps.iFields) + nI = -1; + nI++; + + return (nI); +} + +//=============================================================== +// Function: +// LIBError (char *pszDescError,char *pszContext1,char *pszContext2); +// +// Input: pszDescError - Descripcion error +// pszContext1 - Contexto 1 +// pszContext2 - Contexto 2 +// +// Description: +// Visualiza una ventana con informacion sobre el error de libreria. +// En la version grafica se grabara en logger y se +// presentara una ventana no bloqueante. +//================================================================ +/* +void LIBError (char *pszDescError,char *pszContext1,char *pszContext2) +{ +/* char szDes [TAMAX_BUFFER_TXT + 1]; + char szHora[TAMAX_HORA+1]; + char szFecha[TAMAX_FECHA+1]; + + CapturaFechaHora(szFecha,szHora); + Formatea (szDes,sizeof(szDes), + "%s. 1) %s. 2) %s", + pszDescError,pszContext1,pszContext2); + ExcepcionHistoricoTxt(szFecha,szHora,"Error","LIBDBI",szDes,NULL,NULL,NULL,NULL,NULL); + Formatea (szDes,sizeof(szDes), + "%s\n1) %s\n2) %s", + pszDescError,pszContext1,pszContext2); + poAplicacion->MessageBox(szDes,"Error librería DBI",MB_OK); +}*/ + +//=============================================================== +// Funcion: +// DBIError(DBIResult CodError); +// +// Entrada: CodError - Codigo del error +// +// Descripcion: +// Visualiza una ventana con informacion sobre el error DBI. +// En la version grafica se grabara en logger y se +// presentara una ventana no bloqueante. +//================================================================ +void DBIError (DBIResult CodError) +{ + DBIResult rslt; + DBIErrInfo ErrInfo; + DBIMSG ErrDesc; + char szDes [TAM_MAX_CADENA]; + + rslt = DbiGetErrorInfo(TRUE,ErrInfo); + if (rslt == DBIERR_NONE) + { + if (CodError == ErrInfo.iError) + { + sprintf (szDes, + "Error Info %s (%d,%d:%d). 1) %s. 2) %s. 3) %s. 4) %s", + ErrInfo.szErrCode,CodError,ErrCat(CodError),ErrCode(CodError), + ErrInfo.szContext[1],ErrInfo.szContext[2],ErrInfo.szContext[3],ErrInfo.szContext[4]); + if(strcmp(FicheroError,"")) + GenerarError(szDes); + } + else + { + rslt = DbiGetErrorString(CodError,ErrDesc); + if (rslt == DBIERR_NONE) + { + sprintf(szDes,"Error String %s (%d,%d:%d)", + ErrDesc,CodError,ErrCat(CodError),ErrCode(CodError)); + if(strcmp(FicheroError,"")) + GenerarError(szDes); + } + else + { + if(strcmp(FicheroError,"")) + GenerarError("Error Dbidif sin información"); + } + } + } + else + { + if(strcmp(FicheroError,"")) + GenerarError("Error Dbidif sin información"); + } +} + +//=============================================================== +// Funcion: +// AnsiToNativo (char *pszValorAnsi); +// +// Entrada: +// pszValorAnsi - Valor Ansi a convertir. +// +// Devuelve: +// Valor convertido +// +// Descripcion: +// Convierte una cadena ANSI al lenguaje nativo de la +// base de datos. Una cadena ANSI es, por ejemplo, la +// definida internamente en un fichero fuente. +//================================================================ + +DBIResult AnsiToNativo (char *pszAnsi,char *pszNativo) +{ + DBIResult rslt; + void *pLdObj; + int bDataLoss; + + rslt = DbiGetLdObj(NULL,pLdObj); + if (rslt == DBIERR_NONE) + rslt = DbiAnsiToNative(pLdObj,pszNativo,pszAnsi,0,bDataLoss); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// InicializarBDE(char *pszIniFile) +// +// Entrada: pszIniFile - Nombre fichero de configuracion con extension .CFG +// +// Devuelve: DBIResult +// +// Descripcion: +// Inicializa IDAPI indicada. +//=============================================================== + +DBIResult InicializarBDE(char *pszIniFile) +{ + DBIResult rslt; + DBIEnv envr; + + strcpy (envr.szWorkDir,""); + strcpy (envr.szIniFile,pszIniFile); + strcpy (envr.szLang,""); + strcpy (envr.szClientName,""); + envr.bForceLocalInit = FALSE; + + rslt = DbiInit(&envr); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} +//=============================================================== +// Funcion: +// ConectarBDE(char *pszBaseDatos,hDBIDb *hBaseDatos) +// +// Entrada: pszBaseDatos - Nombre base de datos. +// hDBIDb *hBaseDatos - Puntero a la base de Datos +// +// Devuelve: DBIResult +// +// Descripcion: +// Inicializa IDAPI indicada. +//=============================================================== + +DBIResult ConectarBDE(char *pszBaseDatos,hDBIDb *hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiOpenDatabase(pszBaseDatos,NULL,dbiREADWRITE,dbiOPENSHARED, + NULL,0,NULL,NULL,*hBaseDatos); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} +//=============================================================== +// Funcion: +// DesconectarBDE (hDBIDb hBaseDatos) +// +// Entrada: hDBIDb hBaseDatos - Base de Datos +// +// Devuelve: DBIResult. +// +// Descripcion: +// Cierra la Database. +//================================================================ +DBIResult DesconectarBDE (hDBIDb hBaseDatos) +{ + DBIResult rslt; + rslt = DbiCloseDatabase(hBaseDatos); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} +//=============================================================== +// Funcion: +// FinalizarBDE (void) +// +// Devuelve: DBIResult. +// +// Descripcion: +// Finaliza el IDAPI. +//================================================================ + +DBIResult FinalizarBDE (void) +{ + DBIResult rslt; + rslt = DbiExit(); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CargarDirDbf(char *pszDir); +// +// Entrada: char *pszDir - puntero al directorio de la base de datos +// hDBIDb hBaseDatos - Nombre de la base de datos +// +// Devuelve: DBIResult. +// +// Descripcion: +// Carga en pszDir el directorio donde se encuentran los +// dbf para esta base de datos +//================================================================ + +DBIResult CargarDirBDE (char *pszDir,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiGetDirectory(hBaseDatos,TRUE,pszDir); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return rslt; +} + +//=============================================================== +// Funcion: +// AbrirTablaBDE (dbiTabla *psT, char *pszNombreTabla,char *pszNombreTag,bool bExclusivo); +// +// Entrada: psT - Puntero a la tabla. +// pszNombreTabla - Nombre de la tabla (sin extensión). +// pszNombreTag - Nombre indice de apertura (en orden natural sera NULL). +// bExclusivo - TRUE si se abre en exclusiva. +// +// Devuelve: DBIResult. +// +// Descripcion: +// Abre la tabla indicada, con indice o no activo, +// en modo exclusivo o no y se posiciona en el primer registro. +//================================================================ + +DBIResult AbrirTablaBDE (dbiTabla *psT, char *pszNombreTabla,char *pszNombreTag,bool bExclusivo,hDBIDb hBaseDatos) +{ + int iReproceso; + char szNombreIndice [DBIMAXTBLNAMELEN+1]; + DBIResult rslt; + DBIShareMode eModo; + + psT->bTablaAbierta = FALSE; + iReproceso = DEF_MAXREPOPENTABLE; + (bExclusivo ? eModo = dbiOPENEXCL : eModo = dbiOPENSHARED); + *szNombreIndice = 0; + if (pszNombreTag) + { + strcpy (szNombreIndice,pszNombreTabla); + strcat (szNombreIndice,DEF_MDXEXT); + } + + do + { + rslt = DbiOpenTable (hBaseDatos,pszNombreTabla,szDBASE,szNombreIndice,pszNombreTag, + 0,dbiREADWRITE,eModo,xltNONE,FALSE,NULL,psT->hCur); + if (rslt == DBIERR_NONE) + { + DbiGetCursorProps (psT->hCur, psT->curProps); + psT->pRecBuf = (PByte) malloc (psT->curProps.iRecBufSize); + if (psT->pRecBuf) + { + psT->pFldArray = (pFLDDesc) malloc (sizeof(FLDDesc) * psT->curProps.iFields); + if (psT->pFldArray) + { + DbiGetFieldDescs (psT->hCur,psT->pFldArray); + DbiSetProp(psT->hCur,curSOFTDELETEON,TRUE); + DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,NULL); + psT->bTablaAbierta = TRUE; + } + else + { + rslt = DBIERR_NOMEMORY; + free (psT->pRecBuf); + DbiCloseCursor (psT->hCur); + } + } + else + { + rslt = DBIERR_NOMEMORY; + DbiCloseCursor (psT->hCur); + } + } + else + if (rslt == DBIERR_FILEBUSY) + { + iReproceso--; + Sleep (RETARDO_ABRIR_TABLA); + } + } + while (iReproceso && (rslt == DBIERR_FILEBUSY)); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CerrarTablaBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Cierra la tabla indicada. +//================================================================ + +DBIResult CerrarTablaBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DBIERR_NONE; + if (psT->bTablaAbierta) + { + free (psT->pFldArray); + free (psT->pRecBuf); + rslt = DbiCloseCursor (psT->hCur); + psT->bTablaAbierta = FALSE; + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// ContarRegBDE (dbiTabla* psT,UINT32 *nRN) +// +// Entrada: psT - Puntero a la tabla. +// +// Salida nRN - Puntero al numero de registros. +// +// Devuelve: DBIResult +// +// Descripcion: +// Devuelve el numero de registros en la tabla. +//================================================================ + +DBIResult ContarRegBDE (dbiTabla* psT,int *nRN) +{ + DBIResult rslt; + + rslt = DbiGetRecordCount(psT->hCur,*nRN); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// NumRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Salida nRN - Puntero al numero del registro. +// +// Devuelve: DBIResult +// +// Descripcion: +// Devuelve el ordinal del registro en curso +//================================================================ + +DBIResult NumRegBDE (dbiTabla* psT,int *nRN) +{ + DBIResult rslt; + + rslt = DbiGetRecord(psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + *nRN = (int) psT->recProps.iPhyRecNum; + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrRegBDE (dbiTabla* psT,int nNumRec,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// nNumRec - Numero de registro. +// bRD - TRUE, si esta borrado. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el registro indicado +//================================================================ + +DBIResult IrRegBDE (dbiTabla* psT,int nNumRec,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToRecordNo (psT->hCur,nNumRec); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetRecord(psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// EstaRegBorBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Salida bRD - Puntero al dato. +// +// Devuelve: DBIResult +// +// Descripcion: +// Devuelve si el registro en curso está marcado para borrar. +//================================================================ + +DBIResult EstaRegBorBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiGetRecord(psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BorrarRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Marca el registro en curso para borrar. +//================================================================ + +DBIResult BorrarRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiDeleteRecord(psT->hCur,psT->pRecBuf); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// RecRegBorBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Desmarca el registro en curso para borrar. +//================================================================ + +DBIResult RecRegBorBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiUndeleteRecord(psT->hCur); + if(rslt != DBIERR_NONE && rslt!=DBIERR_NA)//10756 El Reg no esta borrado + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// VerBorradosBDE (dbiTabla* psT,bool bON); +// +// Entrada: psT - Puntero a la tabla. +// bON - TRUE, los registros marcados son utilizables. +// +// Devuelve: DBIResult +// +// Descripcion: +// Cambia la propiedad SET DELETED +//================================================================ + +DBIResult VerBorradosBDE (dbiTabla* psT,bool bON) +{ + DBIResult rslt; + + rslt = DbiSetProp(psT->hCur,curSOFTDELETEON,bON); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrPrimerRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el primer registro +//================================================================ + +DBIResult IrPrimerRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToBegin (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrUltimoRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el ultimo registro +//================================================================ + +DBIResult IrUltimoRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToEnd (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetPriorRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrSiguienteRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el siguiente registro de la tabla. +//================================================================ + +DBIResult IrSiguienteRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + + if(rslt != DBIERR_NONE && rslt!=DBIERR_EOF)//8706 Fin de registros + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// IrAnteriorRegBDE (dbiTabla* psT,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Se posiciona en el siguiente registro de la tabla. +//================================================================ + +DBIResult IrAnteriorRegBDE (dbiTabla* psT,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiGetPriorRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + if(rslt != DBIERR_NONE && rslt!=DBIERR_BOF)//8705 Principio de registros + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// SelIndBDE (dbiTabla* psT,char* szNombreTag); +// +// Entrada: psT - Puntero a la tabla. +// szNombreIndice - Nombre del Indice en el que se quiere buscar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Selecciona el indice en la tabla indicada. +//================================================================ + +DBIResult SelIndBDE (dbiTabla* psT,char* szNombreTag) +{ + char szNombreIndice [DBIMAXTBLNAMELEN+1]; + DBIResult rslt; + + strcpy (szNombreIndice,psT->curProps.szName); + strcat (szNombreIndice,DEF_MDXEXT); + rslt = DbiSwitchToIndex (psT->hCur,szNombreIndice,szNombreTag,NULL,false); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BuscarValorExactoBDE(dbiTabla *psT,char *pszValor,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// szValor - Valor del Indice a encontrar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Busca un valor índice exacto en la tabla y se posiciona en el +// registro correspondiente. +//================================================================ + +DBIResult BuscarValorExactoBDE (dbiTabla *psT,char *pszValor,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToKey (psT->hCur,keySEARCHEQ,true,0,0,(PByte)pszValor); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE && rslt!=DBIERR_RECNOTFOUND)//8710 no encontro busqueda + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BuscarValorAproxBDE (dbiTabla *psT,char *pszValor,bool *bRD); +// +// Entrada: psT - Puntero a la tabla. +// szValor - Valor del Indice a encontrar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Busca un valor índice aproximado en la tabla y se posiciona en el +// registro correspondiente. +//================================================================ + +DBIResult BuscarValorAproxBDE (dbiTabla *psT,char *pszValor,bool *bRD) +{ + DBIResult rslt; + + rslt = DbiSetToKey (psT->hCur,keySEARCHGEQ,true,0,0,(PByte) pszValor); + if (rslt == DBIERR_NONE) + { + rslt = DbiGetNextRecord (psT->hCur,dbiNOLOCK,psT->pRecBuf,&psT->recProps); + if (rslt == DBIERR_NONE) + { + if (bRD) + *bRD = psT->recProps.bDeleteFlag; + } + } + + if(rslt != DBIERR_NONE && rslt!=DBIERR_RECNOTFOUND) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BlanquearRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Blanquea el registro seleccionado. +//================================================================ + +DBIResult BlanquearRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiInitRecord (psT->hCur,psT->pRecBuf); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// AnadirRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Añade un nuevo registro en blanco en la tabla. +//================================================================ + +DBIResult AnadirRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + + rslt = DbiInitRecord (psT->hCur,psT->pRecBuf); + if (rslt == DBIERR_NONE) + { + rslt = DbiAppendRecord (psT->hCur,psT->pRecBuf); + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// LeerCampoBDE (dbiTabla* psT,int nInd,char *pszValor,bool *bVacio); +// +// Entrada: psT - Puntero a la tabla. +// nInd - Indice del campo que se quiere leer. +// szValor - Valor del campo leido. Opcional. +// nLon - sizeof (szValorCampo). Opcional. +// bVacio - TRUE, si campo vacio. Opcional. +// +// Devuelve: DBIResult +// +// Descripcion: +// Lee un campo de la tabla indicada. +//================================================================ + +DBIResult LeerCampoBDE (dbiTabla* psT,int nInd,char *pszValor, bool *bVacio) +{ + DBIResult rslt; + int nV,nLon; + + nLon=psT->pFldArray[nInd-1].iLen; + memset (pszValor,0,nLon+1); + rslt = DbiGetField (psT->hCur,(unsigned short)nInd,psT->pRecBuf,(PByte)pszValor,nV); + if (rslt == DBIERR_NONE && bVacio) + *bVacio = (nV == 1); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// LeerCampoNBDE (dbiTabla* psT,char* szNombre,char *pszValor,bool *bVacio); +// +// Entrada: psT - Puntero a la tabla. +// szCampo - Nombre del campo que se quiere leer. +// szValor - Valor del campo leido. Opcional. +// nLon - sizeof (szValorCampo). Opcional. +// bVacio - TRUE, si campo vacio. Opcional. +// +// Devuelve: DBIResult +// +// Descripcion: +// Lee un campo de la tabla indicada. +//================================================================ + +DBIResult LeerCampoNBDE (dbiTabla* psT,char* szCampo,char *pszValor,bool *bVacio) +{ + return (LeerCampoBDE (psT,IndCampo(psT,szCampo),pszValor,bVacio)); +} + +//=============================================================== +// Funcion: +// ModificarCampoBDE (dbiTabla* psT,int nInd,char *pszValor); +// +// Entrada: psT - Puntero a la tabla. +// nInd - Indice del campo que se quiere escribir. +// szValor - Valor del campo escrito. NULL si se quiere limpiar. +// +// Devuelve: DBIResult +// +// Descripcion: +// Modifica un campo en la tabla indicada. +//================================================================ + +DBIResult ModificarCampoBDE (dbiTabla* psT,int nInd,char *pszValor) +{ + DBIResult rslt; + int nLon; + char *sValor; + + nLon=psT->pFldArray[nInd-1].iLen; + sValor=(char*)malloc(nLon); + memset (sValor,' ',nLon); + if(nLon>(int)strlen(pszValor)) + strncpy (sValor,pszValor,strlen(pszValor)); + else + strncpy (sValor,pszValor,nLon); + + rslt = DbiPutField (psT->hCur,(unsigned short)nInd,psT->pRecBuf,(PByte)sValor); + if (rslt == DBIERR_NONE) + rslt = DbiModifyRecord (psT->hCur,psT->pRecBuf,TRUE); + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + free(sValor); + + return (rslt); +} + +//=============================================================== +// Funcion: +// ModificarCampoNBDE (dbiTabla* psT,char* szNombre,char* pszValor); +// +// Input: psT - Puntero a la tabla. +// szNombre - Nombre del campo que se quiere escribir. +// szValor - Valor del campo escrito. NULL si se quiere limpiar. +// +// Return: DBIResult +// +// Description: +// Modifica un campo en la tabla indicada. +//================================================================ + +DBIResult ModificarCampoNBDE (dbiTabla* psT,char *pszNombre,char *pszValor) +{ + return (ModificarCampoBDE (psT,IndCampo(psT,pszNombre),pszValor)); +} + +//=============================================================== +// Funcion: +// DuplicarRegBDE (dbiTabla* psT); +// +// Entrada: psT - Puntero a la tabla. +// +// Devuelve: DBIResult +// +// Descripcion: +// Duplica un registro +//================================================================ + +DBIResult DuplicarRegBDE (dbiTabla* psT) +{ + DBIResult rslt; + char *psReg; + + psReg = (char *) malloc (psT->curProps.iRecBufSize); + if (psT->pRecBuf) + { + memcpy (psReg,psT->pRecBuf,psT->curProps.iRecBufSize); + rslt = AnadirRegBDE (psT); + if (rslt == DBIERR_NONE) + { + memcpy (psT->pRecBuf,psReg,psT->curProps.iRecBufSize); + rslt = DbiModifyRecord (psT->hCur,psT->pRecBuf,TRUE); + } + free (psReg); + } + else + rslt = DBIERR_NOMEMORY; + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// EliminarBorradosTablaBDE (dbiTabla *psT); +// +// Entrada: psT - Puntero a la tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Empaqueta la tabla indicada. +//================================================================ + +DBIResult EliminarBorradosTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiPackTable(hBaseDatos,psT->hCur,NULL,NULL,TRUE); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// VaciarTablaBDE (dbiTabla *psT); +// +// Entrada: psT - Puntero a la tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Vacía la tabla indicada. +//================================================================ + +DBIResult VaciarTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiEmptyTable(hBaseDatos,psT->hCur,NULL,NULL); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// ReindexarTablaBDE (dbiTabla *psT); +// +// Entrada: psT- Puntero a latabla +// +// Devuevle: DBIResult +// +// Descripcion: +// Reindexa la tabla indicada. +//================================================================ + +DBIResult ReindexarTablaBDE (dbiTabla *psT) +{ + DBIResult rslt; + + rslt = DbiRegenIndexes(psT->hCur); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CopiarTablaBDE (dbiTabla *psT,char *pszNomDestTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Copia la tabla indicada. +//================================================================ + +DBIResult CopiarTablaBDE (char *pszNomOrigTable,char *pszNomDestTable,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiCopyTable (hBaseDatos,TRUE,pszNomOrigTable,szDBASE,pszNomDestTable); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// RenombrarTablaBDE (char *pszNomOldTable,char *pszNomNewTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Renombra la tabla indicada. +//================================================================ + +DBIResult RenombrarTablaBDE (char *pszNomOldTable,char *pszNomNewTable,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiRenameTable (hBaseDatos,pszNomOldTable,szDBASE,pszNomNewTable); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// BorrarTablaBDE (char *pszNomTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Renombra la tabla indicada. +//================================================================ + +DBIResult BorrarTablaBDE (char *pszNomTable,hDBIDb hBaseDatos) +{ + DBIResult rslt; + + rslt = DbiDeleteTable (hBaseDatos,pszNomTable,szDBASE); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CopiarEstruTablaBDE (dbiTabla *psT,char *pszNomDestTable); +// +// Entrada: tabla +// +// Devuelve: DBIResult +// +// Descripcion: +// Genera una tabla con la estructura de la tabla indicada. +//================================================================ + +DBIResult CopiarEstruTablaBDE (dbiTabla *psT,char *pszNomDestTabla,hDBIDb hBaseDatos) +{ + DBIResult rslt; + CRTblDesc DescTabla; + pIDXDesc pIndArray; + + pIndArray = (pIDXDesc) malloc (sizeof(IDXDesc) * psT->curProps.iIndexes); + if (pIndArray) + { + rslt = DbiGetIndexDescs (psT->hCur,pIndArray); + if (rslt == DBIERR_NONE) + { + memset (&DescTabla,0,sizeof(CRTblDesc)); + strcpy (DescTabla.szTblName,pszNomDestTabla); + strcpy (DescTabla.szTblType,szDBASE); + + DescTabla.iFldCount = psT->curProps.iFields; + DescTabla.pfldDesc = psT->pFldArray; + + DescTabla.iIdxCount = psT->curProps.iIndexes; + DescTabla.pidxDesc = pIndArray; + + rslt = DbiCreateTable (hBaseDatos,TRUE,DescTabla); + } + + free (pIndArray); + } + else + rslt = DBIERR_NOMEMORY; + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// CopiarATextoBDE (dbiTabla* psT,char *pszNomText); +// +// Entrada: psT - Puntero a la tabla. +// pszNomText - Nombre fichero texto +// +// Devuelve: DBIResult +// +// Descripcion: +// Copia una tabla a un fichero texto. +//================================================================ + +DBIResult CopiarATextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos) +{ + DBIResult rslt; + CRTblDesc DescTxt; + hDBICur hTxtCur; + pFLDDesc pTxtFld; + int NumReg = 0; + + memset (&DescTxt,0,sizeof (CRTblDesc)); + + strcpy (DescTxt.szTblName,pszNomText); + strcpy (DescTxt.szTblType,szASCII); + + rslt = DbiCreateTable (hBaseDatos,TRUE,DescTxt); + if (rslt == DBIERR_NONE) + { + rslt = DbiOpenTable (hBaseDatos,pszNomText,"ASCIIDRV",NULL,NULL,0,dbiREADWRITE, + dbiOPENSHARED,xltFIELD,FALSE,NULL,hTxtCur); + if (rslt == DBIERR_NONE) + { + pTxtFld = (pFLDDesc) malloc (psT->curProps.iFields * sizeof(FLDDesc)); + if (pTxtFld) + { + rslt = DbiTranslateRecordStructure (szDBASE,psT->curProps.iFields,psT->pFldArray, + szASCII,NULL,pTxtFld,0); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetFieldMap (hTxtCur,psT->curProps.iFields,pTxtFld); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (hTxtCur); + if (rslt == DBIERR_NONE) + rslt = DbiBatchMove(NULL,psT->hCur,NULL,hTxtCur,batchAPPEND, + 0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL, + NULL,NULL,FALSE,FALSE,NumReg,TRUE); + } + } + } + free (pTxtFld); + } + else + rslt = DBIERR_NOMEMORY; + + DbiCloseCursor (hTxtCur); + } + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// AnadirDesdeTextoBDE (dbiTabla* psT,char *pszNomText); +// +// Entrada: psT - Puntero a la tabla. +// pszNomText - Nombre fichero texto +// +// Devuelve: DBIResult +// +// Descripcion: +// Copia a una tabla desde un fichero texto. +//================================================================ + +DBIResult AnadirDesdeTextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos) +{ + DBIResult rslt; + hDBICur hTxtCur; + pFLDDesc pTxtFld; + int NumReg = 0; + + rslt = DbiOpenTable (hBaseDatos,pszNomText,"ASCIIDRV",NULL,NULL,0,dbiREADWRITE, + dbiOPENSHARED,xltFIELD,FALSE,NULL,hTxtCur); + if (rslt == DBIERR_NONE) + { + pTxtFld = (pFLDDesc) malloc (psT->curProps.iFields * sizeof(FLDDesc)); + if (pTxtFld) + { + rslt = DbiTranslateRecordStructure (szDBASE,psT->curProps.iFields,psT->pFldArray, + szASCII,NULL,pTxtFld,0); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetFieldMap (hTxtCur,psT->curProps.iFields,pTxtFld); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (psT->hCur); + if (rslt == DBIERR_NONE) + { + rslt = DbiSetToBegin (hTxtCur); + if (rslt == DBIERR_NONE) + rslt = DbiBatchMove(NULL,hTxtCur,NULL,psT->hCur,batchAPPEND, + 0,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL, + NULL,NULL,FALSE,FALSE,NumReg,TRUE); + } + } + } + free (pTxtFld); + } + else + rslt = DBIERR_NOMEMORY; + + DbiCloseCursor (hTxtCur); + } + + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// SelecReintBloqueoBDE (int nSegundos); +// +// Entrada: nSegundos - Nº de segundos de reintento +// +// Devuelve: DBIResult +// +// Descripcion: +// Actualiza el numero de segundos de reintento por bloqueo. +// No tiene aplicacion en las aperturas de tabla. +//================================================================ + +DBIResult SelecReintBloqueoBDE (int nSegundos) +{ + DBIResult rslt; + + rslt = DbiSetLockRetry ((unsigned short) nSegundos); + if(rslt != DBIERR_NONE) + DBIError (rslt); + + return (rslt); +} + +//=============================================================== +// Funcion: +// void GenerarError(char *Error) +// +// Entrada: char *Error - Cadena del Error producido +// +// Descripcion: +// Genera Errores en el fichero de nombre a eleccion por el usuario +// +//================================================================ + +void GenerarError(char *Error) +{ + FILE *fichero; + char szHora[DIM_HORA+1]; + char szFecha[DIM_FECHA+1]; + + CapturarFechaHora(szFecha,szHora); + + if(strcmp(FicheroError,"")) + { + if( (fichero=fopen(FicheroError,"at"))!=NULL) + { + fputs(szFecha,fichero); + fputc(' ',fichero); + fputs(szHora,fichero); + fputc(' ',fichero); + fputs(Error,fichero); + fputc('\n',fichero); + fclose(fichero); + } + } +} + +//=============================================================== +// Funcion: +// void CapturarFechaHora(char *pszFecha,char *pszHora) +// +// Entrada: +// char *pszFecha - Puntero a char para la Fecha +// char *pszHora - Puntero a char para la Hora +// +// Descripcion: +// Formatea la fecha y hora actual +// +//================================================================ + +void CapturarFechaHora(char *pszFecha,char *pszHora) +{ + struct date sfecha; + struct time shora; + + getdate(&sfecha); + sprintf(pszFecha,"%02d/%02d/%4d",sfecha.da_day,sfecha.da_mon,sfecha.da_year); + + gettime(&shora); + sprintf(pszHora,"%02d:%02d:%02d",shora.ti_hour,shora.ti_min,shora.ti_sec); +} + +//=============================================================== +// Funcion: +// bool ComprobarNomFichError(char *Nombre) +// +// Entrada: +// char *Nombre - Nombre del fichero de Error +// +// Devuelve: +// bool - Si es correcto true sino false +// +// Descripcion: +// Comprueba si el nombre del fichero de Error es correcto +// +//================================================================ + +bool ComprobarNomFichError(char *Nombre) +{ + bool bcorrecto; + if (strlen(Nombre)<49) + { + strcpy(FicheroError,Nombre); + bcorrecto=true; + } + else + bcorrecto=false; + + return bcorrecto; +} + +//=============================================================== +// Funcion: +// char * ReservarMemoria(dbiTabla* psT,char *pszCampo) +// +// Entrada: +// dbiTabla* psT - Puntero a la tabla. +// char *pszCampo - Puntero al Campo. +// +// Devuelve: +// char * - Direccion de la zona de memoria reservada +// +// Descripcion: +// Reserva memoria a la variable con respecto al campo +// +//================================================================ + +char * ReservarMemoria(dbiTabla* psT,char *pszCampo) +{ + int CantidadMemoria; + char *Memoria; + + CantidadMemoria=ConseguirLongitud(psT,pszCampo); + if(CantidadMemoria) + { + //Reservamos memoria + Memoria=(char *)malloc(CantidadMemoria+1); + memset(Memoria,0,CantidadMemoria+1); + if(Memoria==NULL) + GenerarError("Error No hay memoria disponible"); + } + else Memoria=NULL; + + return Memoria; +} + +//=============================================================== +// Funcion: +// void LiberarMemoria(char *Memoria) +// +// Entrada: +// char *Memoria - Variable a liberar. +// +// Descripcion: +// Libera memoria de la variable con respecto al campo +// +//================================================================ + +void LiberarMemoria(char *Memoria) +{ + if(Memoria) + free(Memoria); + Memoria=NULL; +} + +//=============================================================== +// Funcion: +// int ConseguirLongitud(dbiTabla* psT,char *pszCampo) +// +// Entrada: +// dbiTabla* psT - Puntero a la tabla. +// char *pszCampo - Puntero al Campo. +// +// Devuelve: +// int - Longitud del Campo +// +// Descripcion: +// Consigue la longitud del campo deseado +// +//================================================================ + +int ConseguirLongitud(dbiTabla* psT,char *pszCampo) +{ + int nLon,indice; + + //Inicializamos longitud + nLon=0; + //Buscamos el indice del campo + indice=IndCampo(psT,pszCampo); + if(indice) + { + //Miramos cuanto mide el campo + nLon=psT->pFldArray[indice-1].iLen; + } + + return nLon; +} + +//=============================================================== +// Funcion: +// void LeerArrayCampoBDE(dbiTabla *psT,char *pszCampo,char **pszsCampoN, BYTE byRango) +// +// Entrada: +// dbiTabla* psT - Puntero a la tabla. +// char *pszCampo - Puntero al Campo. +// char **pszsCampoN - Variable de Array[byRango] +// BYTE byRango - Numero del Array a[9] seria 9 +// +// Descripcion: +// Lee un Array de campo +// +//================================================================ + +void LeerArrayCampoBDE(dbiTabla *psT,char *pszCampo,char **pszsCampoN, BYTE byRango) +{ + int ni; + char *pszNombreCampo; + + if(byRangoPqm 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 + +#define DEF_MDXEXT ".MDX" +#define DEF_MAXREPOPENTABLE 15 + +#define TAMANO_DATE_DBF 8 + +#define DSCERR_NOINITDBI "Librería no inicializada" +#define DSCERR_NOMEMRECBUF "Insuficiente memoria buffer tabla" +#define DSCERR_NOMEMDESCFLD "Insuficiente memoria campos tabla" + +#define DIM_FECHA 10 +#define DIM_HORA 8 +#define DIM_FICHEROTXT 50 + +#define NUMERO_MAXIMO_ARRAY 99 + +#define BDE_FIN_FICHERO DBIERR_EOF +#define BDE_SIN_ERROR DBIERR_NONE + +typedef struct +{ + hDBICur hCur; + PBYTE pRecBuf; + CURProps curProps; + RECProps recProps; + pFLDDesc pFldArray; + bool bTablaAbierta; +} dbiTabla; + +extern "C" __declspec(dllexport) void LiberarMemoria(char *Memoria); +extern "C" __declspec(dllexport) char * ReservarMemoria(dbiTabla* psT,char *pszCampo); +extern "C" __declspec(dllexport) bool ComprobarNomFichError(char *Nombre); +extern "C" __declspec(dllexport) void CapturarFechaHora(char *pszFecha,char *pszHora); +extern "C" __declspec(dllexport) void GenerarError(char *Error); +extern "C" __declspec(dllexport) int IndCampo (dbiTabla* psT,char* pszCampo); +extern "C" __declspec(dllexport) DBIResult AnsiToNativo (char *pszAnsi,char *pszNativo); +extern "C" __declspec(dllexport) DBIResult InicializarBDE(char *pszIniFile); +extern "C" __declspec(dllexport) DBIResult ConectarBDE(char *pszBaseDatos,hDBIDb *hBaseDatos); +extern "C" __declspec(dllexport) DBIResult DesconectarBDE (hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult FinalizarBDE (void); +extern "C" __declspec(dllexport) DBIResult CargarDirBDE (char *pszDir,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult AbrirTablaBDE (dbiTabla *psT, char *pszNombreTabla,char *pszNombreTag,bool bExclusivo,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult CerrarTablaBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult ContarRegBDE (dbiTabla* psT,int *nRN); +extern "C" __declspec(dllexport) DBIResult NumRegBDE (dbiTabla* psT,int *nRN); +extern "C" __declspec(dllexport) DBIResult IrRegBDE (dbiTabla* psT,int nNumRec,bool *bRD); +extern "C" __declspec(dllexport) DBIResult EstaRegBorBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult BorrarRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult RecRegBorBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult VerBorradosBDE (dbiTabla* psT,bool bON); +extern "C" __declspec(dllexport) DBIResult IrPrimerRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult IrUltimoRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult IrSiguienteRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult IrAnteriorRegBDE (dbiTabla* psT,bool *bRD); +extern "C" __declspec(dllexport) DBIResult SelIndBDE (dbiTabla* psT,char* szNombreTag); +extern "C" __declspec(dllexport) DBIResult BuscarValorExactoBDE (dbiTabla *psT,char *pszValor,bool *bRD); +extern "C" __declspec(dllexport) DBIResult BuscarValorAproxBDE (dbiTabla *psT,char *pszValor,bool *bRD); +extern "C" __declspec(dllexport) DBIResult BlanquearRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult AnadirRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult LeerCampoBDE (dbiTabla* psT,int nInd,char *pszValor,bool *bVacio); +extern "C" __declspec(dllexport) DBIResult LeerCampoNBDE (dbiTabla* psT,char* szNombre,char *pszValor,bool *bVacio); +extern "C" __declspec(dllexport) DBIResult ModificarCampoBDE (dbiTabla* psT,int nInd,char *pszValor); +extern "C" __declspec(dllexport) DBIResult ModificarCampoNBDE (dbiTabla* psT,char *pszNombre,char *pszValor); +extern "C" __declspec(dllexport) DBIResult DuplicarRegBDE (dbiTabla* psT); +extern "C" __declspec(dllexport) DBIResult EliminarBorradosTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult VaciarTablaBDE (dbiTabla *psT,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult ReindexarTablaBDE (dbiTabla *psT); +extern "C" __declspec(dllexport) DBIResult CopiarTablaBDE (char *pszNomOrigTable,char *pszNomDestTable,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult RenombrarTablaBDE (char *pszNomOldTable,char *pszNomNewTable,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult BorrarTablaBDE (char *pszNomTable,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult CopiarEstruTablaBDE (dbiTabla *psT,char *pszNomDestTabla,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult CopiarATextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult AnadirDesdeTextoBDE (dbiTabla* psT,char *pszNomText,hDBIDb hBaseDatos); +extern "C" __declspec(dllexport) DBIResult SelecReintBloqueoBDE (int nSegundos); +extern "C" __declspec(dllexport) int ConseguirLongitud(dbiTabla* psT,char *pszCampo); +extern "C" __declspec(dllexport) void LeerArrayCampoBDE(dbiTabla* psT,char* pszCampo,char **CampoN, BYTE byRango); +extern "C" __declspec(dllexport) void EscribirArrayCampoBDE(dbiTabla *psT,char *pszCampo,char **pszsCampoN, BYTE byRango); +extern "C" __declspec(dllexport) void CopiarCampo (dbiTabla *pTDestino,char *pszCampoDes,dbiTabla *pTOrigen,char *pszCampoOri); diff --git a/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.lib b/Esergui -BDE utilizando API/EserguiBDE/BDEMONTREL.lib new file mode 100644 index 0000000000000000000000000000000000000000..0ed432051b413cbebec8a9049623a3cdbfcd6a6f GIT binary patch literal 6052 zcma)AOOxBi5vFsCZOL+8RXN4Z`{8mP${!dEhU9300d{7{+Y|g0QNu6M!~;tUyPndu}CvzwMf2PZ#JWMpNzi! z--qVbSdo5N-+etAy?f!18>!;###VRuX?n4eCgWGWI@OPsCE}C-#?OU<7Wj&^m>8>lMOyNy zh-KK2sYsGjF4Rk@1kup_OeZh}zI!uGPNm0WYy!UWmq8IglgYD;N{hZ6Hs`*tal)*L ze5vUyv9cEtyH8C)q4qYHYMix($KEE)m~NI(*F>{?DmhsqmTRf3&;e#_>?Vb<)}72F zO+7?Ypuu!1q9NvhM0TT&BQnl(N+k3p(@CF`3N<4RI)WUn&N>ZAuX0H$+~fG2h{`qO&S>O7z1D;@?{X#&!yzNE9*h~~OeB9Cyn@er`nA?s% z=F;qAuGW1Fw*Ac3@x0x|ToW1fO`W_O)fJd%Zk>F^E_cDgp~`i(kX;+_RPmf@i+Rcv zj_Wk^WNsCQ?F~9=_?3l9Qp97Y<~*Iy4MFFrrK5}lcQ+Z`1=OA93A+_!g9=;)y&H@e z&yq|}y3N9&vn&b}!OtqQ5e*``&t?`XFZ{B=QR7!hw|q!@6&wrn{wf!A@=-y=Ba`NT z{ZrtIvqY$v)Z-p=H~Rr8mfFc^F^tD2Y<7Bt9qkMpC*Lj?dhBjdi(&n8DPX95*0p}= zFA=h?b*{zSkLM7$6ro`b1?@(mHH4|`u@V-+(<5}|Zy)A^{>?08u?W%*L%MW& zL0IW)4Jx99Vji)XF|+LEb%@=_*Q^_zHiS#7&x5d;rVz-BqhK&T z!e>7{d2qntea8>x4AS0%$fVu^qw+Y)Z%z;7HWJ*_9tOVs-nKj#^V1=1-JLZgj?PXn zNV|YZ1+#M9rqFsjdtSv6-sNC~Wv~utDI+mgHrPpRf&$`{X>nfWB+IU5H0qcrTcq$m zTnV<2Mk-DddRz%u!0zP?Ev*m}mLzocQ5s!HH zz=I!M5;Oo9H;#^|?+|tCTV$-dCw}XBY=cDxqlG{s*wVhc@New;e zT8dH~rA6{Ae;EoiX`ch3dr3f6LGDnDm?U>EQL42J>g5(Z4?!eSax;YhG+0>i!q?=-n@n@odRw?xh$WoX07rlLkK|fro!*+<$HE7TY zDHo6X!g;ALCrFCm_n>?z9Iw`%>cQaD1XFHc3ohpI2Xyx1WpsF470tZZ)Qxys ztoHRq_V1DXBcIJ4n)>ZU@~@HnVi|3U-QN%8`#ZyS#kv|yhWeM3WrGWSF({2p$5Iz* zRPMB1SAVM@^I?y_!!&-l45^phQn%y7!^U|XYT+Nz=TDbnQ*B|xyHR`pcFqepLQiZb zC8o=2w=Um4MJ2Jke)x_qclGw}$=g6KkDEB04b9OpG^}@X7$(yk9m&j=Z{IVW$2o!% zyDo>xH2AO^?jTgVeYB}zOfL^U4d0~Pl~4iEG<9?S2%zHg;$eRP+PGYORZQ!qIH!Jr z6YvvwT5Mr~?utg$+i|t}YQQtqK$nkY^QLIha$7gm1;5mRq`GrL2YH>;diPku!D*6u zcVF!f>vO3@bt}c-!v14;S12p-xN54q>V5RnBhyXbz*CwsS}u8>ugkl`{j{#XIhXl4 jR`jFgatVJgU&0e{^&L2G&N%=2Uht=Q{NcYJj7I+l)B)Eu literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/Dialogo.cpp b/Esergui -BDE utilizando API/EserguiBDE/Dialogo.cpp new file mode 100644 index 0000000..e7dbd6e --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Dialogo.cpp @@ -0,0 +1,1458 @@ +//--------------------------------------------------------------------------- +// DIALOGO CON EL BUR BROWN +//--------------------------------------------------------------------------- +#include +#include "Dialogo.h" +#include "Principal.h" + +//--------------------------------------------------------------------------- +#pragma hdrstop +#pragma package(smart_init) + +//--------------------------------------------------------------------------- +DWORD DWContadorID,DWAUTID,DWPSEID,DWPSSID,DWALBID; +BYTE byTiempoEsperaAUT; +BYTE byTiempoEsperaPSE; +BYTE byTiempoEsperaPSS; +BYTE byTiempoEsperaALB; +BYTE byTiempoEsperaRespOCA; +char *pszPeriodicaBBDIA[NUM_PERIODICA_AUT]; + +//--------------------------------------------------------------------------- +// void DialogoAutorizacion(hDBIDb Form1->hBaseDatos) +// Entrada: +// hDBIDb Form1->hBaseDatos:Puntero a la Base de Datos +//--------------------------------------------------------------------------- +void DialogoAutorizacion(void) +{ + FILE *pTransfer; + TRAPERDat sTRAPERIODICADat[NUM_MAXIMO_PERIODICA]; + TRAOCADat sTRAOCASIONALDat; + BYTE byi,byj,byEstado,byNumPer; + DatosAutorizacion sDatos; + + char sSentencia[TAM_MAXIMO_OCASIONAL]; + char sNumeroEle[3]; + char *pszMensaje; + char cServidor,cReferencia,cReferenciaTemp,cDatoCorrecto; + char cDiez[2],cTrece[2]; + char sDatoTecleado[NUM_MAX_TECLAS]; + long lDesplazamiento; + int nValorPERBBDIA,nError; + bool bRespuestaPER; + bool bFinalizaAUT,bTipoEntrada,bRepetido; + + //Inicializamos variables + cDiez[0]=10; + cDiez[1]=0; + cTrece[0]=13; + cTrece[1]=0; + byEstado=0; + cServidor='1'; + cReferencia=1; + nValorPERBBDIA=0; + + //Leemos la estructura de la periodica + Transfer->LeerEstructura(sTRAPERIODICADat,&sTRAOCASIONALDat); + + //Obtenemos el Servidor con el que vamos a trabajar + byNumPer=0; + while(strcmp(sTRAPERIODICADat[byNumPer].cTipoIDTRAPER,"BBRAUT") && byNumPerEscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,"BBRAUT") ); + + //Inicializamos el caracter y esperamos a que sea la respuesta correcta + memset(pszPeriodicaBBDIA[0],0,sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat); + cReferenciaTemp=0; + cDatoCorrecto='0'; + + //Mientras la referencia o el dato no sean los correctos + while( (cReferenciaTemp!=cReferencia || cDatoCorrecto!='S') && byTiempoEsperaAUT) + { + //Nos situamos en la posicion del Bur Brown de Autorizacion + fseek(pTransfer, lDesplazamiento, SEEK_SET); + //Leemos el caracter de referencia + fread(pszPeriodicaBBDIA[0],sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat,1,pTransfer); + cReferenciaTemp=*(pszPeriodicaBBDIA[0]+UBICACION_REFERENCIA); + cDatoCorrecto=*(pszPeriodicaBBDIA[0]+UBICACION_DATO_CORRECTO); + } + + if(byTiempoEsperaAUT) + { + //Ponemos por defecto el Numero de Elemento de Cisterna + strcpy(sNumeroEle,NUM_ELE_CIS_TAR); + memset(sNumeroEle,0,2); + //Obtenemos el valor de la respuesta + if(bTipoEntrada) + { + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[0]+UBICACION_DATO_LEIDO_TAR); + memcpy(sNumeroEle,pszPeriodicaBBDIA[0]+UBICACION_ELEMENTO_TAR,2); + } + else + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[0]+UBICACION_DATO_LEIDO_TEC); + + //Comprobamos si la respuesta es Correcta + if( !strstr(pszPeriodicaBBDIA[0]+UBICACION_DATO_LEIDO_TEC,"F") && nValorPERBBDIA>0 && nValorPERBBDIA<10000 && strstr(sNumeroEle,NUM_ELE_CIS_TAR) ) + { + bRespuestaPER=true; + //Comprobamos la Cisterna + Formatea(sDatoTecleado,NUM_MAX_TECLAS,"%04d",nValorPERBBDIA); + nError=Autorizacion->ComprobarCisterna(sDatoTecleado,Form1->hBaseDatos); + //Si fue correcto pasamos al siguiente estado + if(nError==AUT_CIS_CORRECTO) + byEstado=1; + else + MostrarResultado(cServidor,"BBRAUT",nError); + } + else if( !strstr(sNumeroEle,NUM_ELE_CIS_TAR) ) + MostrarResultado(cServidor,"BBRAUT",TAR_CIS_INVALIDA); + else + { + if( strstr(pszPeriodicaBBDIA[0]+UBICACION_DATO_LEIDO_TEC,"F5") ) + MostrarResultado(cServidor,"BBRAUT",DIA_CANCELADO); + else if( strstr(pszPeriodicaBBDIA[0]+UBICACION_DATO_LEIDO_TEC,"F") ) + MostrarResultado(cServidor,"BBRAUT",TEC_FUNCION_INVALIDA); + else + MostrarResultado(cServidor,"BBRAUT",ENT_TECLADO_INVALIDA); + } + } + } + + break; + +//************************************SEGUNDA PARTE DEL DIALOGO****************************/ + + case 1: + + //Inicializamos la sentencia + memset(sSentencia,0,TAM_MAXIMO_OCASIONAL); + memset(sDatoTecleado,0,NUM_MAX_TECLAS); + + //Conseguimos la referencia + ConseguirReferencia(&cReferencia); + + //Peticion del codigo del Conductor + if(bTipoEntrada) + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,"BBRAUT",BB_ENTRADA_TARJETA,cReferencia,"14","Intro Tarj Con"); + else + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,"BBRAUT",BB_ENTRADA_TECLADO,cReferencia,"13","Intro Cod Con"); + + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,"BBRAUT") ); + + //Inicializamos el caracter y esperamos a que sea la respuesta correcta + memset(pszPeriodicaBBDIA[1],0,sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat); + cReferenciaTemp=0; + cDatoCorrecto='0'; + byTiempoEsperaAUT=30; + + while( (cReferenciaTemp!=cReferencia || cDatoCorrecto!='S') && byTiempoEsperaAUT) + { + //Nos situamos en la posicion del Bur Brown de Autorizacion + fseek(pTransfer, lDesplazamiento, SEEK_SET); + //Leemos el caracter de referencia + fread(pszPeriodicaBBDIA[1], sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat , 1, pTransfer); + cReferenciaTemp=*(pszPeriodicaBBDIA[1]+UBICACION_REFERENCIA); + cDatoCorrecto=*(pszPeriodicaBBDIA[1]+UBICACION_DATO_CORRECTO); + } + + //Si no paso el tiempo de espera + if(byTiempoEsperaAUT) + { + //Ponemos por defecto el Numero de Elemento de Cisterna + strcpy(sNumeroEle,NUM_ELE_CON_TAR); + memset(sNumeroEle,0,2); + //Obtenemos el tamaño de la respuesta + if(bTipoEntrada) + { + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[1]+UBICACION_DATO_LEIDO_TAR); + memcpy(sNumeroEle,pszPeriodicaBBDIA[1]+UBICACION_ELEMENTO_TAR,2); + } + else + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[1]+UBICACION_DATO_LEIDO_TEC); + + //Comprobamos si la respuesta es Correcta + if( !strstr(pszPeriodicaBBDIA[1]+UBICACION_DATO_LEIDO_TEC,"F") && nValorPERBBDIA>0 && nValorPERBBDIA<10000 && strstr(sNumeroEle,NUM_ELE_CON_TAR) ) + { + bRespuestaPER=true; + //Comprobamos el Conductor + Formatea(sDatoTecleado,NUM_MAX_TECLAS,"%04d",nValorPERBBDIA); + nError=Autorizacion->ComprobarConductor(sDatoTecleado,Form1->hBaseDatos); + //Si fue correcto pasamos al siguiente estado + if(nError==AUT_CON_CORRECTO) + byEstado=2; + else + MostrarResultado(cServidor,"BBRAUT",nError); + } + else if( !strstr(sNumeroEle,NUM_ELE_CIS_TAR) ) + MostrarResultado(cServidor,"BBRAUT",TAR_CON_INVALIDA); + else if( strstr(pszPeriodicaBBDIA[1]+UBICACION_DATO_LEIDO_TEC,"F5") ) + { + MostrarResultado(cServidor,"BBRAUT",DIA_CANCELADO); + byEstado=0; + } + else + { + if( strstr(pszPeriodicaBBDIA[1]+UBICACION_DATO_LEIDO_TEC,"F") ) + MostrarResultado(cServidor,"BBRAUT",TEC_FUNCION_INVALIDA); + else + MostrarResultado(cServidor,"BBRAUT",ENT_TECLADO_INVALIDA); + } + } + else + { + MostrarResultado(cServidor,"BBRAUT",SUP_TIEMPO_ENT_TECLADO); + byEstado=0; + } + + break; + +//************************************TERCERA PARTE DEL DIALOGO****************************/ + + case 2: + + //Inicializamos las variables + memset(sSentencia,0,TAM_MAXIMO_OCASIONAL); + + //Conseguimos la referencia + ConseguirReferencia(&cReferencia); + + //Peticion del codigo de Tractor + Autorizacion->LeerEstructura(&sDatos); + pszMensaje = (char *) malloc ( sizeof("Tractor ") + sizeof(sDatos.pszMatriculaTraCis) ); + strcpy(pszMensaje,"TRAC. "); + StrCat(pszMensaje,sDatos.pszMatriculaTraCis); + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,"BBRAUT",BB_ENTRADA_TECLADO,cReferencia,"16",pszMensaje); + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,"BBRAUT") ); + + free(pszMensaje); + + //Guardamos el valor adecuado + memset(pszPeriodicaBBDIA[2],0,sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat); + cReferenciaTemp=0; + cDatoCorrecto='0'; + byTiempoEsperaAUT=30; + + while( (cReferenciaTemp!=cReferencia || cDatoCorrecto!='S') && byTiempoEsperaAUT) + { + //Nos situamos en la posicion del Bur Brown de Autorizacion + fseek(pTransfer, lDesplazamiento, SEEK_SET); + //Leemos el caracter de referencia + fread(pszPeriodicaBBDIA[2], sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat, 1, pTransfer); + cReferenciaTemp=*(pszPeriodicaBBDIA[2]+UBICACION_REFERENCIA); + cDatoCorrecto=*(pszPeriodicaBBDIA[2]+UBICACION_DATO_CORRECTO); + } + + //Si no paso el tiempo de espera + if(byTiempoEsperaAUT) + { + //Comprobamos si la respuesta es Correcta + if( strstr(pszPeriodicaBBDIA[2]+UBICACION_DATO_LEIDO_TEC,"F4") ) + { + bRespuestaPER=true; + //Comprobamos el Tractor + nError=Autorizacion->ComprobarTractor(sDatos.pszMatriculaTraCis,NULL,Form1->hBaseDatos); + //Si fue correcto pasamos al siguiente estado + if(nError==AUT_TRA_CORRECTO) + byEstado=3; + else + MostrarResultado(cServidor,"BBRAUT",nError); + } + else if (strstr(pszPeriodicaBBDIA[2]+UBICACION_DATO_LEIDO_TEC,"F8") ) + { + //Inicializamos las variables + memset(sSentencia,0,TAM_MAXIMO_OCASIONAL); + memset(sDatoTecleado,0,NUM_MAX_TECLAS); + + //Pedimos por codigo por teclado + ConseguirReferencia(&cReferencia); + //Pedimos memoria para el mensaje + pszMensaje = (char *) malloc ( sizeof("Intro Cod Tract") ); + strcpy(pszMensaje,"Intro Cod Tract"); + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,"BBRAUT",BB_ENTRADA_TECLADO,cReferencia,"15",pszMensaje); + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,"BBRAUT") ); + + //Liberamos mensaje + free(pszMensaje); + + //Guardamos el valor adecuado + memset(pszPeriodicaBBDIA[2],0,sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat); + cReferenciaTemp=0; + cDatoCorrecto='0'; + byTiempoEsperaAUT=30; + + while( (cReferenciaTemp!=cReferencia || cDatoCorrecto!='S') && byTiempoEsperaAUT) + { + //Nos situamos en la posicion del Bur Brown de Autorizacion + fseek(pTransfer, lDesplazamiento, SEEK_SET); + //Leemos el caracter de referencia + fread(pszPeriodicaBBDIA[2], sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat, 1, pTransfer); + cReferenciaTemp=*(pszPeriodicaBBDIA[2]+UBICACION_REFERENCIA); + cDatoCorrecto=*(pszPeriodicaBBDIA[2]+UBICACION_DATO_CORRECTO); + } + + //Si no paso el tiempo de espera + if(byTiempoEsperaAUT) + { + //Obtenemos el tamaño de la respuesta + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[2]+UBICACION_DATO_LEIDO_TEC); + + if( !strstr(pszPeriodicaBBDIA[2]+UBICACION_DATO_LEIDO_TEC,"F") && nValorPERBBDIA>0 && nValorPERBBDIA<1000 ) + { + bRespuestaPER=true; + //Comprobamos el Conductor + Formatea(sDatoTecleado,NUM_MAX_TECLAS,"%03d",nValorPERBBDIA); + nError=Autorizacion->ComprobarTractor(NULL,sDatoTecleado,Form1->hBaseDatos); + //Si fue correcto pasamos al siguiente estado + if(nError==AUT_TRA_CORRECTO) + byEstado=3; + else + MostrarResultado(cServidor,"BBRAUT",nError); + } + else + MostrarResultado(cServidor,"BBRAUT",TEC_FUNCION_INVALIDA); + } + else + { + MostrarResultado(cServidor,"BBRAUT",SUP_TIEMPO_ENT_TECLADO); + byEstado=0; + } + } + else if (strstr(pszPeriodicaBBDIA[2]+UBICACION_DATO_LEIDO_TEC,"F5") ) + { + MostrarResultado(cServidor,"BBRAUT",DIA_CANCELADO); + byEstado=0; + } + else + { + if (strstr(pszPeriodicaBBDIA[2]+UBICACION_DATO_LEIDO_TEC,"F1") ) + MostrarResultado(cServidor,"BBRAUT",TEC_FUNCION_INVALIDA); + else + MostrarResultado(cServidor,"BBRAUT",ENT_TECLADO_INVALIDA); + } + } + else + { + MostrarResultado(cServidor,"BBRAUT",SUP_TIEMPO_ENT_TECLADO); + byEstado=0; + } + + break; + +//************************************CUARTA PARTE DEL DIALOGO*****************************/ + + case 3: + + //Inicializamos las variables + memset(sSentencia,0,TAM_MAXIMO_OCASIONAL); + memset(sDatoTecleado,0,NUM_MAX_TECLAS); + + //Conseguimos la referencia + ConseguirReferencia(&cReferencia); + + //Peticion del codigo de Suministrador + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,"BBRAUT",BB_ENTRADA_TECLADO,cReferencia,"13","Intro Cod Sum"); + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,"BBRAUT") ); + + //Guardamos el valor adecuado + memset(pszPeriodicaBBDIA[3],0,sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat); + cReferenciaTemp=0; + cDatoCorrecto='0'; + byTiempoEsperaAUT=30; + + while( (cReferenciaTemp!=cReferencia || cDatoCorrecto!='S') && byTiempoEsperaAUT) + { + //Nos situamos en la posicion del Bur Brown de Autorizacion + fseek(pTransfer, lDesplazamiento, SEEK_SET); + //Leemos el caracter de referencia + fread(pszPeriodicaBBDIA[3], sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat, 1, pTransfer); + cReferenciaTemp=*(pszPeriodicaBBDIA[3]+UBICACION_REFERENCIA); + cDatoCorrecto=*(pszPeriodicaBBDIA[3]+UBICACION_DATO_CORRECTO); + } + + //Si no paso el tiempo de espera + if(byTiempoEsperaAUT) + { + //Obtenemos el tamaño de la respuesta + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[3]+UBICACION_DATO_LEIDO_TEC); + + //Comprobamos si la respuesta es Correcta + if( !strstr(pszPeriodicaBBDIA[3]+UBICACION_DATO_LEIDO_TEC,"F") && nValorPERBBDIA>0 && nValorPERBBDIA<10 ) + { + bRespuestaPER=true; + //Comprobamos el Suministrador + Formatea(sDatoTecleado,NUM_MAX_TECLAS,"%01d",nValorPERBBDIA); + nError=Autorizacion->ComprobarSuministrador(sDatoTecleado,Form1->hBaseDatos); + //Si fue correcto pasamos al siguiente estado + if(nError==AUT_SUM_CORRECTO) + byEstado=4; + else + MostrarResultado(cServidor,"BBRAUT",nError); + } + else if( strstr(pszPeriodicaBBDIA[3]+UBICACION_DATO_LEIDO_TEC,"F5") ) + { + MostrarResultado(cServidor,"BBRAUT",DIA_CANCELADO); + byEstado=0; + } + else + { + if( strstr(pszPeriodicaBBDIA[3]+UBICACION_DATO_LEIDO_TEC,"F") ) + MostrarResultado(cServidor,"BBRAUT",TEC_FUNCION_INVALIDA); + else + MostrarResultado(cServidor,"BBRAUT",ENT_TECLADO_INVALIDA); + } + } + else + { + MostrarResultado(cServidor,"BBRAUT",SUP_TIEMPO_ENT_TECLADO); + byEstado=0; + } + + break; + +//************************************QUINTA PARTE DEL DIALOGO*****************************/ + + case 4: + + //Inicializamos el numero de pedidos + byi=4; + byTiempoEsperaAUT=30; + bFinalizaAUT=false; + + while(byTiempoEsperaAUT && !bFinalizaAUT) + { + //Inicializamos la respuesta correcta + bRespuestaPER=false; + byTiempoEsperaAUT=30; + //Mientras no haya respuesta correcta o timeout + while( !bRespuestaPER && byTiempoEsperaAUT ) + { + //Inicializamos las variables + memset(sSentencia,0,TAM_MAXIMO_OCASIONAL); + memset(sDatoTecleado,0,NUM_MAX_TECLAS); + + //Conseguimos la referencia + ConseguirReferencia(&cReferencia); + + //Peticion del numero de Pedido + //Formateamos la sentencia + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,"BBRAUT",BB_ENTRADA_TECLADO,cReferencia,"16","Intro Num Pedido"); + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,"BBRAUT") ); + + //Guardamos el valor adecuado + memset(pszPeriodicaBBDIA[byi],0,sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat); + cReferenciaTemp=0; + cDatoCorrecto='0'; + byTiempoEsperaAUT=30; + + while( (cReferenciaTemp!=cReferencia || cDatoCorrecto!='S') && byTiempoEsperaAUT) + { + //Nos situamos en la posicion del Bur Brown de Autorizacion + fseek(pTransfer, lDesplazamiento, SEEK_SET); + //Leemos el caracter de referencia + fread(pszPeriodicaBBDIA[byi], sTRAPERIODICADat[byNumPer].lTamPeriodicaTRAPERDat, 1, pTransfer); + cReferenciaTemp=*(pszPeriodicaBBDIA[byi]+UBICACION_REFERENCIA); + cDatoCorrecto=*(pszPeriodicaBBDIA[byi]+UBICACION_DATO_CORRECTO); + } + + //Si no paso el tiempo de espera + if(byTiempoEsperaAUT) + { + //Obtenemos el tamaño de la respuesta + nValorPERBBDIA=atoi(pszPeriodicaBBDIA[byi]+UBICACION_DATO_LEIDO_TEC); + + //Comprobamos si la respuesta es Correcta + if( !strstr(pszPeriodicaBBDIA[byi]+UBICACION_DATO_LEIDO_TEC,"F") && nValorPERBBDIA>0 && nValorPERBBDIA<10000000000 ) + { + bRespuestaPER=true; + //Comprobamos el Pedido + itoa(nValorPERBBDIA,sDatoTecleado,10); + nError=Autorizacion->ComprobarPedidos(sDatoTecleado,Form1->hBaseDatos); + //Si fue correcto pasamos al siguiente estado + if(nError==AUT_ORC_CORRECTO) + { + bRepetido=false; + for(byj=4;byj4) + MostrarResultado(cServidor,"BBRAUT",OPERACION_OK); + else + { + MostrarResultado(cServidor,"BBRAUT",AUT_SIN_PED_SELECCIONADOS); + bFinalizaAUT=false; + bRespuestaPER=false; + } + } + else if( strstr(pszPeriodicaBBDIA[byi]+UBICACION_DATO_LEIDO_TEC,"F5") ) + MostrarResultado(cServidor,"BBRAUT",DIA_CANCELADO); + } + } + } + else + MostrarResultado(cServidor,"BBRAUT",SUP_TIEMPO_ENT_TECLADO); + } + } + + byEstado=0; + + break; + } + +//************************************TERMINAMOS LA FUNCION********************************/ + + } + //Cerramos el fichero + fclose(pTransfer); + Sleep(100); + } +} + +//--------------------------------------------------------------------------- +void DialogoPesoEntrada(void) +{ + //Bucle infinito + while(1) + { + Sleep(100); + } +} + +//--------------------------------------------------------------------------- +void DialogoPesoSalida(void) +{ + //Bucle infinito + while(1) + { + Sleep(100); + } +} + +//--------------------------------------------------------------------------- +void DialogoAlbaran(void) +{ + //Bucle infinito + while(1) + { + Sleep(100); + } +} + +//--------------------------------------------------------------------------- +bool ComprobarTecladoTarjeta(void) +{ + dbiTabla TPrm; + bool bTipoEntrada; + char *pszTipoEntrada; + + //Damos por defecto que es Tarjeta + bTipoEntrada=true; + + //Reservamos memoria para la Tolerancia + AbrirTablaBDE(&TPrm,"SIMICPRM",NULL,false,Form1->hBaseDatos); + pszTipoEntrada=ReservarMemoria(&TPrm,"PRMTACPRM"); + LeerCampoNBDE(&TPrm,"PRMTACPRM",pszTipoEntrada,NULL); + CerrarTablaBDE(&TPrm); + + if( !strcmp(pszTipoEntrada,"T") ) + bTipoEntrada=false; + + return bTipoEntrada; +} + +//--------------------------------------------------------------------------- +void Temporizador(void) +{ + //Inicializamos los contadores de tiempo + byTiempoEsperaAUT=0; + byTiempoEsperaPSE=0; + byTiempoEsperaPSS=0; + byTiempoEsperaALB=0; + byTiempoEsperaRespOCA=0; + //4 lineas temporales + byTiempoEsperaPSE=30; + byTiempoEsperaPSS=20; + byTiempoEsperaALB=10; + + while(1) + { + if(byTiempoEsperaAUT) + byTiempoEsperaAUT--; + if(byTiempoEsperaPSE) + byTiempoEsperaPSE--; + if(byTiempoEsperaPSS) + byTiempoEsperaPSS--; + if(byTiempoEsperaALB) + byTiempoEsperaALB--; + if(byTiempoEsperaRespOCA) + byTiempoEsperaRespOCA--; + //Los 4 Form son temporales para ver que funciona + Form1->Edit2->Text=byTiempoEsperaAUT; + Form1->Edit3->Text=byTiempoEsperaPSE; + Form1->Edit4->Text=byTiempoEsperaPSS; + Form1->Edit5->Text=byTiempoEsperaALB; + Sleep(TIEMPO_CONTADOR_SEGUNDO); + } +} + +//--------------------------------------------------------------------------- +BYTE CargarThreads(void) +{ + BYTE byValorDevuelto; + + //Inicializamos las variables + byValorDevuelto=0; + + //Inicializamos el Thread de contadores del Dialogo + Form1->HDContadores=CreateThread( 0, 0, (LPTHREAD_START_ROUTINE) Temporizador, 0, 0, &DWContadorID); + if(Form1->HDContadores==0) + byValorDevuelto=THREAD_CONT_NO_INICIADO; + + //Inicializamos el Thread de Autorizacion + Form1->HDAUT=CreateThread( 0, 0, (LPTHREAD_START_ROUTINE) DialogoAutorizacion, 0, 0, &DWAUTID); + if(Form1->HDAUT==0) + byValorDevuelto=THREAD_AUT_NO_INICIADO; + + //Inicializamos el Thread del Peso de Entrada + Form1->HDPSE=CreateThread( 0, 0, (LPTHREAD_START_ROUTINE) DialogoPesoEntrada, 0, 0, &DWPSEID); + if(Form1->HDPSE==0) + byValorDevuelto=THREAD_PSE_NO_INICIADO; + + //Inicializamos el Thread del Peso de Salida + Form1->HDPSS=CreateThread( 0, 0, (LPTHREAD_START_ROUTINE) DialogoPesoSalida, 0, 0, &DWPSSID); + if(Form1->HDPSS==0) + byValorDevuelto=THREAD_PSS_NO_INICIADO; + + //Inicializamos el Thread del Albaran + Form1->HDALB=CreateThread( 0, 0, (LPTHREAD_START_ROUTINE) DialogoAlbaran, 0, 0, &DWALBID); + if(Form1->HDALB==0) + byValorDevuelto=THREAD_ALB_NO_INICIADO; + + return byValorDevuelto; +} + +//--------------------------------------------------------------------------- +void TerminarThread(HANDLE ThreadID) +{ + bool bResult; + BYTE byi; + DWORD dwEstado; + + if(ThreadID!=NULL) + { + bResult = GetExitCodeThread(ThreadID,&dwEstado); + if(bResult && (dwEstado == STILL_ACTIVE) ) + { + if(ThreadID==Form1->HDAUT) + { + //Pedimos memoria para la Periodica + for(byi=0;byiEscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,pszTipoID) ); + +} + +//-------------------------------------------------------------------------------------------- +void ConseguirReferencia(char *cReferencia) +{ + (*cReferencia)++; + if( (*cReferencia)==100 ) + (*cReferencia)=1; +} + +//-------------------------------------------------------------------------------------------- +bool EsperarRespuestaOcasional(char cServidor,char *pszTipoId) +{ + bool bRespuestaOCA,bRespuestaOk; + char sTexto[TAM_MAXIMO_OCASIONAL]; + char sRespuestaOCA[TAM_MAXIMO_OCASIONAL];//Estructura de la respuesta + + //Inicializamos las variables + memset(sRespuestaOCA,0,TAM_MAXIMO_OCASIONAL); + memset(sTexto,0,TAM_MAXIMO_OCASIONAL); + bRespuestaOCA=false; + bRespuestaOk=false; + + //Asignamos la respuesta que esperamos + sRespuestaOCA[0]=cServidor; + memcpy(sRespuestaOCA+1,pszTipoId,6); + sRespuestaOCA[7]='S'; + byTiempoEsperaRespOCA=2; + + //Mientras la Respuesta no sea ok + while(!bRespuestaOk && byTiempoEsperaRespOCA) + { + //Mientras no haya respuesta leemos + while(!bRespuestaOCA && byTiempoEsperaRespOCA) + { + Transfer->LeerOcasional(sTexto,NUM_OCASIONAL); + if(strcmp(sTexto,"")) + bRespuestaOCA=true; + } + //Si la respuesta fue correcta + if( !memcmp(sRespuestaOCA,sTexto,7)) + bRespuestaOk=true; + } + + return bRespuestaOk; +} + +//-------------------------------------------------------------------------------------------- +void MostrarResultado(char cServidor,char *sTipoID,int nResultado) +{ + char cDiez[2],cTrece[2],sTamano[3],cReferencia; + char sSentencia[TAM_MAXIMO_OCASIONAL]; + char *pszMensaje; + bool bEntro; + + //Inicializamos variables + cDiez[0]=10; + cDiez[1]=0; + cTrece[0]=13; + cTrece[1]=0; + cReferencia=1; + bEntro=true; + + //En funcion del Resultado enviamo una cadena + switch(nResultado) + { + + case AUT_CIS_VALOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO EXISTE") ); + strcpy(pszMensaje,"CISTERNA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO EXISTE"); + strcpy(sTamano,"19"); + + break; + + case AUT_CIS_BORRADO: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA BORRADA") ); + strcpy(pszMensaje,"CISTERNA BORRADA"); + strcpy(sTamano,"16"); + + break; + + case AUT_CIS_TARJETA_CADUCADA: + + pszMensaje = (char *) malloc ( sizeof("CADUCADA TARJETA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("TRANSPORTE") ); + strcpy(pszMensaje,"CADUCADA TARJETA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"TRANSPORTE"); + strcpy(sTamano,"28"); + + break; + + case AUT_CIS_ADR_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("A.D.R. CADUCADO") ); + strcpy(pszMensaje,"A.D.R. CADUCADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_CIS_ITV_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("I.T.V. CADUCADO") ); + strcpy(pszMensaje,"I.T.V. CADUCADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_CIS_SEGURO_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("POLIZA SEGURO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("CADUCADA") ); + strcpy(pszMensaje,"POLIZA SEGURO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"CADUCADA"); + strcpy(sTamano,"23"); + + break; + + case AUT_EST_CIS_YA_DENTRO: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA YA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("AUTORIZADA") ); + strcpy(pszMensaje,"CISTERNA YA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"AUTORIZADA"); + strcpy(sTamano,"23"); + + break; + + case AUT_CON_VALOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("CONDUCTOR")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO EXISTE") ); + strcpy(pszMensaje,"CONDUCTOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO EXISTE"); + strcpy(sTamano,"20"); + + break; + + case AUT_CON_BORRADO: + + pszMensaje = (char *) malloc ( sizeof("CONDUCTOR") + sizeof(cDiez) + sizeof(cTrece) + sizeof("BORRADO") ); + strcpy(pszMensaje,"CONDUCTOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"BORRADO"); + strcpy(sTamano,"18"); + + break; + + case AUT_CON_CARNET_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("CARNET CADUCADO") ); + strcpy(pszMensaje,"CARNET CADUCADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_CON_ADR_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("A.D.R. CADUCADO") ); + strcpy(pszMensaje,"A.D.R. CADUCADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_EST_CON_YA_DENTRO: + + pszMensaje = (char *) malloc ( sizeof("CONDUCTOR YA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("AUTORIZADO") ); + strcpy(pszMensaje,"CONDUCTOR YA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"AUTORIZADO"); + strcpy(sTamano,"24"); + + break; + + case AUT_TRA_VALOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("TRACTOR")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO EXISTE") ); + strcpy(pszMensaje,"TRACTOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO EXISTE"); + strcpy(sTamano,"18"); + + break; + + case AUT_TRA_BORRADO: + + pszMensaje = (char *) malloc ( sizeof("TRACTOR BORRADO") ); + strcpy(pszMensaje,"TRACTOR BORRADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_TRA_TARJETA_CADUCADA: + + pszMensaje = (char *) malloc ( sizeof("CADUCADA TARJETA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("TRANSPORTE") ); + strcpy(pszMensaje,"CADUCADA TARJETA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"TRANSPORTE"); + strcpy(sTamano,"28"); + + break; + + case AUT_TRA_ADR_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("A.D.R. CADUCADO") ); + strcpy(pszMensaje,"A.D.R. CADUCADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_TRA_ITV_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("I.T.V. CADUCADO") ); + strcpy(pszMensaje,"I.T.V. CADUCADO"); + strcpy(sTamano,"15"); + + break; + + case AUT_TRA_SEGURO_CADUCADO: + + pszMensaje = (char *) malloc ( sizeof("CADUCADA POLIZA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("SEGURO") ); + strcpy(pszMensaje,"CADUCADA POLIZA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"SEGURO"); + strcpy(sTamano,"23"); + + break; + + case AUT_EST_TRA_YA_DENTRO: + + pszMensaje = (char *) malloc ( sizeof("TRACTOR YA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("AUTORIZADO") ); + strcpy(pszMensaje,"TRACTOR YA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"AUTORIZADO"); + strcpy(sTamano,"22"); + + break; + + case AUT_SUM_VALOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("SUMINISTRADOR")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO EXISTE") ); + strcpy(pszMensaje,"SUMINISTRADOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO EXISTE"); + strcpy(sTamano,"24"); + + break; + + case AUT_SUM_BORRADO: + + pszMensaje = (char *) malloc ( sizeof("SUMINISTRADOR") + sizeof(cDiez) + sizeof(cTrece) + sizeof("BORRADO") ); + strcpy(pszMensaje,"SUMINISTRADOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"BORRADO"); + strcpy(sTamano,"22"); + + break; + + case AUT_ORC_PEDIDO_DUPLICADO: + + pszMensaje = (char *) malloc ( sizeof("PED. DUPLICADO") ); + strcpy(pszMensaje,"PED. DUPLICADO"); + strcpy(sTamano,"14"); + + break; + + case AUT_ORC_VALOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("PED. NO EXISTE") ); + strcpy(pszMensaje,"PED. NO EXISTE"); + strcpy(sTamano,"14"); + + break; + + case AUT_ORC_BORRADO: + + pszMensaje = (char *) malloc ( sizeof("PED. BORRADO") ); + strcpy(pszMensaje,"PED. BORRADO"); + strcpy(sTamano,"12"); + + break; + + case AUT_ORC_ESTADO_ACABADO: + + pszMensaje = (char *) malloc ( sizeof("PED.") + sizeof(cDiez) + sizeof(cTrece) + sizeof("NO PENDIENTE") ); + strcpy(pszMensaje,"PED."); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO PENDIENTE"); + strcpy(sTamano,"18"); + + break; + + case AUT_ORC_OTRO_SUMINISTRADOR: + + pszMensaje = (char *) malloc ( sizeof("PED. OTRO") + sizeof(cDiez) + sizeof(cTrece) + sizeof("SUMINISTRADOR") ); + strcpy(pszMensaje,"PED. OTRO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"SUMINISTRADOR"); + strcpy(sTamano,"24"); + + break; + + case AUT_ORC_OTRA_CISTERNA: + + pszMensaje = (char *) malloc ( sizeof("PED.") + sizeof(cDiez) + sizeof(cTrece) + sizeof("OTRA CISTERNA") ); + strcpy(pszMensaje,"PED."); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"OTRA CISTERNA"); + strcpy(sTamano,"19"); + + break; + + case AUT_ORC_FECHA_MENOR_QUE_HOY: + + pszMensaje = (char *) malloc ( sizeof("PED. CADUCADO") ); + strcpy(pszMensaje,"PED. CADUCADO"); + strcpy(sTamano,"13"); + + break; + + case AUT_SIN_PED_SELECCIONADOS: + + pszMensaje = (char *) malloc ( sizeof("SIN PEDIDO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("SELECCIONADO") ); + strcpy(pszMensaje,"SIN PEDIDO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"SELECCIONADO"); + strcpy(sTamano,"24"); + + break; + + case AUT_SUP_NUM_MAX_PED: + + pszMensaje = (char *) malloc ( sizeof("SUPERADO NUMERO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("PEDIDO MAXIMO") ); + strcpy(pszMensaje,"SUPERADO NUMERO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"MAXIMO DE PEDIDO"); + strcpy(sTamano,"33"); + + break; + + case AUT_PED_YA_INTRODUCIDO: + + pszMensaje = (char *) malloc ( sizeof("PEDIDO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("YA INTRODUCIDO") ); + strcpy(pszMensaje,"PEDIDO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"YA INTRODUCIDO"); + strcpy(sTamano,"22"); + + break; + + case PEE_ESTADO_NO_AUTORIZADO: + + pszMensaje = (char *) malloc ( sizeof("ESTADO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO AUTORIZADO") ); + strcpy(pszMensaje,"ESTADO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO AUTORIZADO"); + strcpy(sTamano,"21"); + + break; + + case PEE_PESO_FUERA_DE_TOLERANCIA: + + pszMensaje = (char *) malloc ( sizeof("PESO FUERA DE")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("TOLERANCIA") ); + strcpy(pszMensaje,"PESO FUERA DE"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"TOLERANCIA"); + strcpy(sTamano,"25"); + + break; + + case PEE_TRACTOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("TRACTOR")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO ENCONTRADO") ); + strcpy(pszMensaje,"TRACTOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO ENCONTRADO"); + strcpy(sTamano,"22"); + + break; + + case PEE_CISTERNA_NO_ENCONTRADA: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO ENCONTRADA") ); + strcpy(pszMensaje,"CISTERNA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO ENCONTRADA"); + strcpy(sTamano,"23"); + + break; + + case PEE_CISTERNA_SIN_ORDEN: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("SIN ORDEN") ); + strcpy(pszMensaje,"CISTERNA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"SIN ORDEN"); + strcpy(sTamano,"19"); + + break; + + case PEE_CONDUCTOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("CONDUCTOR")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO ENCONTRADO") ); + strcpy(pszMensaje,"CONDUCTOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO ENCONTRADO"); + strcpy(sTamano,"24"); + + break; + + case PES_CISTERNA_SIN_ORDEN: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("SIN ORDEN") ); + strcpy(pszMensaje,"CISTERNA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"SIN ORDEN"); + strcpy(sTamano,"19"); + + break; + + case PES_ESTADO_NO_CARGADO: + + pszMensaje = (char *) malloc ( sizeof("ESTADO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO CARGADO") ); + strcpy(pszMensaje,"ESTADO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO CARGADO"); + strcpy(sTamano,"18"); + + break; + + case PES_PESO_FUERA_DE_TOLERANCIA: + + pszMensaje = (char *) malloc ( sizeof("PESO FUERA DE")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("TOLERANCIA") ); + strcpy(pszMensaje,"PESO FUERA DE"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"TOLERANCIA"); + strcpy(sTamano,"25"); + + break; + + case PES_CISTERNA_NO_ENCONTRADA: + + pszMensaje = (char *) malloc ( sizeof("CISTERNA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO ENCONTRADA") ); + strcpy(pszMensaje,"CISTERNA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO ENCONTRADA"); + strcpy(sTamano,"23"); + + break; + + case PES_TRACTOR_NO_ENCONTRADO: + + pszMensaje = (char *) malloc ( sizeof("TRACTOR")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO ENCONTRADO") ); + strcpy(pszMensaje,"TRACTOR"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO ENCONTRADO"); + strcpy(sTamano,"22"); + + break; + + case ALB_CAR_NO_ENCONTRADA: + + pszMensaje = (char *) malloc ( sizeof("CARGA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO ENCONTRADA") ); + strcpy(pszMensaje,"CARGA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO ENCONTRADA"); + strcpy(sTamano,"20"); + + break; + + case ALB_ESTADO_NO_AUTORIZADO: + + pszMensaje = (char *) malloc ( sizeof("ESTADO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("NO AUTORIZADO") ); + strcpy(pszMensaje,"ESTADO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"NO AUTORIZADO"); + strcpy(sTamano,"21"); + + break; + + case TAR_CIS_INVALIDA: + + pszMensaje = (char *) malloc ( sizeof("TARJETA CISTERNA")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("INVALIDA") ); + strcpy(pszMensaje,"TARJETA CISTERNA"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"INVALIDA"); + strcpy(sTamano,"26"); + + break; + + case TAR_CON_INVALIDA: + + pszMensaje = (char *) malloc ( sizeof("TARJETA COND.")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("INVALIDA") ); + strcpy(pszMensaje,"TARJETA COND."); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"INVALIDA"); + strcpy(sTamano,"23"); + + break; + + case TEC_FUNCION_INVALIDA: + + pszMensaje = (char *) malloc ( sizeof("TECLAS FUNCION")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("INVALIDAS") ); + strcpy(pszMensaje,"TECLAS FUNCION"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"INVALIDAS"); + strcpy(sTamano,"25"); + + break; + + case ENT_TECLADO_INVALIDA: + + pszMensaje = (char *) malloc ( sizeof("ENTRADA TECLADO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("INVALIDA") ); + strcpy(pszMensaje,"ENTRADA TECLADO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"INVALIDA"); + strcpy(sTamano,"25"); + + break; + + case SUP_TIEMPO_ENT_TECLADO: + + pszMensaje = (char *) malloc ( sizeof("SUPERADO TIEMPO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("ENTRADA DATO") ); + strcpy(pszMensaje,"SUPERADO TIEMPO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"ENTRADA DATO"); + strcpy(sTamano,"29"); + + break; + + case DIA_CANCELADO: + + pszMensaje = (char *) malloc ( sizeof("DIALOGO")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("CANCELADO") ); + strcpy(pszMensaje,"DIALOGO"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"CANCELADO"); + strcpy(sTamano,"18"); + + break; + + case OPERACION_OK: + + pszMensaje = (char *) malloc ( sizeof("OPERACION OK") ); + strcpy(pszMensaje,"OPERACION OK"); + strcpy(sTamano,"12"); + + break; + + default: + bEntro=false; + } + + if(bEntro) + { + //Conseguimos la referencia + ConseguirReferencia(&cReferencia); + + //Formateamos la sentencia + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,sTipoID,BB_MENSAJE_BLOQUEO,cReferencia,sTamano,pszMensaje); + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while( !EsperarRespuestaOcasional(cServidor,sTipoID) ); + + Sleep(TIEMPO_MENSAJE_PANTALLA); + free(pszMensaje); + } +} +//----------------------------------------------------------------------- +void AnimacionMontrel(char cServidor,char *sTipoID,char cReferencia) +{ + int ni,nj; + char sMontrel[7]; + char *pszMensaje; + char sSentencia[TAM_MAXIMO_OCASIONAL]; + char cDiez[2],cTrece[2]; + + //Inicializamos variables + cDiez[0]=10; + cDiez[1]=0; + cTrece[0]=13; + cTrece[1]=0; + nj=0; + strcpy(sMontrel,"MONTREL"); + pszMensaje = (char *) malloc (16); + memset(pszMensaje,0,16); + + while(nj<7) + { + ni=14; + while(ni>=nj) + { + memset(pszMensaje+nj,' ',(14-nj)); + memcpy(pszMensaje+ni,sMontrel+nj,1); + //Formateamos la sentencia + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,sTipoID,BB_MENSAJE_BLOQUEO,cReferencia,"14",pszMensaje); + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + Sleep(200); + ni--; + } + EsperarRespuestaOcasional(cServidor,"BBRAUT"); + nj++; + + } + + free(pszMensaje); + + //Creamos el mensaje + pszMensaje = (char *) malloc ( sizeof("MONTREL")+ sizeof(cDiez) + sizeof(cTrece) + sizeof("ING. ELECTRICA") ); + strcpy(pszMensaje,"MONTREL"); + StrCat(pszMensaje,cDiez); + StrCat(pszMensaje,cTrece); + StrCat(pszMensaje,"ING. ELECTRICA"); + //Formateamos la sentencia + Formatea(sSentencia,TAM_MAXIMO_OCASIONAL,"%c%s%s%c%s%s",cServidor,sTipoID,BB_MENSAJE_BLOQUEO,cReferencia,"23",pszMensaje); + //Mientras no recibamos una respuesta correcta + do + Transfer->EscribirOcasional(sSentencia,NUM_OCASIONAL); + while(!EsperarRespuestaOcasional(cServidor,"BBRAUT")); + + free(pszMensaje); +} diff --git a/Esergui -BDE utilizando API/EserguiBDE/Dialogo.h b/Esergui -BDE utilizando API/EserguiBDE/Dialogo.h new file mode 100644 index 0000000..4c30f73 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Dialogo.h @@ -0,0 +1,88 @@ +//---------------------------------------------------------------------- +#ifndef DialogoH +#define DialogoH +#endif + +//----------------------CODIGOS DEL BURR BROWN-------------------------- +#define BB_VACIA_BUFFER "*3" +#define BB_PARA_COMUNICA "*4" +#define BB_REANUDA_COMUNICA "*5" +#define BB_DEF_TECLA_FUNCION "*6" +#define BB_ENTRADA_TARJETA "*11" +#define BB_ENTRADA_TECLADO "*12" +#define BB_MENSAJE_BLOQUEO "*13" +#define BB_MENSAJE_SCROLL "*14" +#define BB_ENTRADA_SECRETO "*15" +#define BB_CAMBIA_A_TARJETA "*21" +#define BB_CAMBIA_A_TECLADO "*22" +#define BB_CAM_TEC_TARJ_DES "*23" + +//----------------------VARIABLES GLOBALES------------------------------ +#define NUM_MAX_CAR_TEC_FUNCION 100 +#define NUM_OCASIONAL 1 +#define NUM_PERIODICA_AUT 13 +#define TIEMPO_MENSAJE_PANTALLA 12000 //Milesimas de segundos +#define TIEMPO_CONTADOR_SEGUNDO 1000 //Milesimas de segundos + +//----------------------DEFINICION DE FUNCIONES ------------------------ +#define F1 "01" +#define F2 "02" +#define F3 "03" +#define F4 "04" +#define F5 "05" +#define F6 "06" +#define F7 "07" +#define F8 "08" + +//-----------CODIGOS DEL NUMERO DE ELEMENTOS DE LA TARJETA-------------- +#define NUM_ELE_CIS_TAR "01" +#define NUM_ELE_TRA_TAR "02" +#define NUM_ELE_CON_TAR "03" + +//----------------POSICIONES DE LA RESPUESTA PERIODICA------------------ +#define UBICACION_DATO_CORRECTO 4 +#define UBICACION_REFERENCIA 5 +#define UBICACION_DATO_LEIDO_TEC 6 +#define UBICACION_DATO_LEIDO_TAR 12 +#define UBICACION_ELEMENTO_TAR 10 + +//----------------------ERRORES DE LOS THREADS-------------------------- +#define THREAD_CONT_NO_INICIADO 1 +#define THREAD_AUT_NO_INICIADO 2 +#define THREAD_PSE_NO_INICIADO 3 +#define THREAD_PSS_NO_INICIADO 4 +#define THREAD_ALB_NO_INICIADO 5 + +//----------------------Declaracion de Funciones------------------------ +void Temporizador(void); +void DialogoAutorizacion(void); +void DialogoPesoEntrada(void); +void DialogoPesoSalida(void); +void DialogoAlbaran(void); +void ConseguirReferencia(char *cReferencia); +bool ComprobarTecladoTarjeta(void); +bool EsperarRespuestaOcasional(char cServidor,char *pszTipoId); +void DefinirTeclasFuncion(char cServidor,char *pszTipoID,char *Tecla,char *Mensaje,char cReferencia); +void MostrarResultado(char cServidor,char *sTipoID,int nResultado); +void AnimacionMontrel(char cServidor,char *sTipoID,char cReferencia); + +//----------------------Estructura del Dialogo------------------------------- +typedef struct +{ + char sCodigoCisDIA[4]; + char sCodigoConDIA[4]; + char sMatriculaTraDIA[11]; + char cCodigoSumDIA; + BYTE byNumeroPedidoDIA[9]; +}DIA; + +//----------------------VARIABLES EXTERNAS----------------------------------- +extern BYTE CargarThreads(void); +extern void TerminarThread(HANDLE ThreadID); +extern void DialogoAutorizacion(void); +extern void DialogoPesoEntrada(void); +extern void DialogoPesoSalida(void); +extern void DialogoAlbaran(void); +extern void Temporizador(void); +extern bool ComprobarTecladoTarjeta(void); + diff --git a/Esergui -BDE utilizando API/EserguiBDE/Drivers.dat b/Esergui -BDE utilizando API/EserguiBDE/Drivers.dat new file mode 100644 index 0000000..5ace343 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Drivers.dat @@ -0,0 +1,9 @@ +SERVER 0000 0000 0001 +BASEPE 0001 0011 0016 +PLCDRV 0066 0130 0257 +VEGDRV 0018 0146 0144 +HELDRV 0129 0038 0038 +BBRDRV 0040 0025 0026 +VALDRV 0020 0130 0023 +TAQENT 0010 0090 0090 +ACCDRV 0045 0090 0014 diff --git a/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.bpr b/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.bpr new file mode 100644 index 0000000..ba586bc --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.bpr @@ -0,0 +1,181 @@ +# --------------------------------------------------------------------------- +!if !$d(BCB) +BCB = $(MAKEDIR)\.. +!endif + +# --------------------------------------------------------------------------- +# IDE SECTION +# --------------------------------------------------------------------------- +# The following section of the project makefile is managed by the BCB IDE. +# It is recommended to use the IDE to change any of the values in this +# section. +# --------------------------------------------------------------------------- + +VERSION = BCB.04.04 +# --------------------------------------------------------------------------- +PROJECT = ESERGUISA.exe +OBJFILES = ESERGUISA.obj Principal.obj Esergui.obj Report.obj Dialogo.obj +RESFILES = ESERGUISA.res +RESDEPEN = $(RESFILES) Principal.dfm Report.dfm +LIBFILES = BDEMONTREL.lib +LIBRARIES = +SPARELIBS = Vcl40.lib Qrpt40.lib vclx40.lib vcldb40.lib +PACKAGES = Vcl40.bpi Vclx40.bpi vcljpg40.bpi bcbsmp40.bpi Qrpt40.bpi Vcldb40.bpi \ + ibsmp40.bpi vcldbx40.bpi TeeUI40.bpi teedb40.bpi tee40.bpi nmfast40.bpi \ + dclocx40.bpi +DEFFILE = +# --------------------------------------------------------------------------- +PATHCPP = .; +PATHASM = .; +PATHPAS = .; +PATHRC = .; +DEBUGLIBPATH = $(BCB)\lib\debug +RELEASELIBPATH = $(BCB)\lib\release +USERDEFINES = +SYSDEFINES = _RTLDLL;NO_STRICT;USEPACKAGES +# --------------------------------------------------------------------------- +CFLAG1 = -I"..\..\..\Archivos de programa\Borland\CBuilder4\Projects";$(BCB)\include;$(BCB)\include\vcl \ + -Od -Hc -H=$(BCB)\lib\vcl40.csm -w -Ve -r- -a8 -k -y -v -vi- -c -b- -w-par \ + -w-inl -Vx -tW -tWM -D$(SYSDEFINES);$(USERDEFINES) +PFLAGS = -U"..\..\..\Archivos de programa\Borland\CBuilder4\Projects";$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -I"..\..\..\Archivos de programa\Borland\CBuilder4\Projects";$(BCB)\include;$(BCB)\include\vcl \ + -$YD -$W -$O- -v -JPHNE -M +RFLAGS = -i"..\..\..\Archivos de programa\Borland\CBuilder4\Projects";$(BCB)\include;$(BCB)\include\vcl +AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zd +LFLAGS = -L"..\..\..\Archivos de programa\Borland\CBuilder4\Projects";$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ + -aa -Tpe -x -Gn -v +# --------------------------------------------------------------------------- +ALLOBJ = c0w32.obj Memmgr.Lib $(PACKAGES) sysinit.obj $(OBJFILES) +ALLRES = $(RESFILES) +ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib +# --------------------------------------------------------------------------- +!ifdef IDEOPTIONS + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=3082 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +InMemoryExe=0 +ShowInfoMsgs=0 + +!endif + +# --------------------------------------------------------------------------- +# MAKE SECTION +# --------------------------------------------------------------------------- +# This section of the project file is not used by the BCB IDE. It is for +# the benefit of building from the command-line using the MAKE utility. +# --------------------------------------------------------------------------- + +.autodepend +# --------------------------------------------------------------------------- +!if !$d(BCC32) +BCC32 = bcc32 +!endif + +!if !$d(CPP32) +CPP32 = cpp32 +!endif + +!if !$d(DCC32) +DCC32 = dcc32 +!endif + +!if !$d(TASM32) +TASM32 = tasm32 +!endif + +!if !$d(LINKER) +LINKER = ilink32 +!endif + +!if !$d(BRCC32) +BRCC32 = brcc32 +!endif + +# --------------------------------------------------------------------------- +!if $d(PATHCPP) +.PATH.CPP = $(PATHCPP) +.PATH.C = $(PATHCPP) +!endif + +!if $d(PATHPAS) +.PATH.PAS = $(PATHPAS) +!endif + +!if $d(PATHASM) +.PATH.ASM = $(PATHASM) +!endif + +!if $d(PATHRC) +.PATH.RC = $(PATHRC) +!endif +# --------------------------------------------------------------------------- +$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) + $(BCB)\BIN\$(LINKER) @&&! + $(LFLAGS) + + $(ALLOBJ), + + $(PROJECT),, + + $(ALLLIB), + + $(DEFFILE), + + $(ALLRES) +! +# --------------------------------------------------------------------------- +.pas.hpp: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.pas.obj: + $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } + +.cpp.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.obj: + $(BCB)\BIN\$(BCC32) $(CFLAG1) -n$(@D) {$< } + +.c.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.cpp.i: + $(BCB)\BIN\$(CPP32) $(CFLAG1) -n. {$< } + +.asm.obj: + $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ + +.rc.res: + $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< +# --------------------------------------------------------------------------- diff --git a/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.cpp b/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.cpp new file mode 100644 index 0000000..862ddad --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.cpp @@ -0,0 +1,26 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop +USERES("ESERGUISA.res"); +USEFORM("Principal.cpp", Form1); +USEUNIT("Esergui.cpp"); +USELIB("BDEMONTREL.lib"); +USEFORM("Report.cpp", QuickReport1); /* TQuickRep: DesignClass */ +USEUNIT("Dialogo.cpp"); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->CreateForm(__classid(TQuickReport1), &QuickReport1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.exe b/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.exe new file mode 100644 index 0000000000000000000000000000000000000000..26b95de9341aab932c7d6869237c8a81927522a0 GIT binary patch literal 102912 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 w53<(vbpZ+*@&$_ER{Co_l|e z+%S{1oE$0B_;c^KP!g!ZIQQ%YPhPVXm3<8uv6V@hZ(hf39p79Or&-x)n0`Lak-5GhY}YY@IF zLd!>rs+-fQe>WH>raxwy!dnnUf%=Y?g#sy|I>N2l)rE4Yt?xoKH}9=ZK_r-n*Hf9* z<}_q)q&frKP#7+W`tcO?_daHJDq~+K&R!5_VHI_T z9?&@JRZk+FQD;<&b7uO$D;U)FI(YF?<+4A)`Dc8p4n`ei`i^>3AjT1u;vAVS^Ihs~ z-(We4{3@}dj;Nz?zN2n+;Q!buqEeirZrwMRiKC5{qX!0XbRgq3igVPV9koFZmExT3*UnZlsO_m;(boJ^ z%m5PAl;)_T^}eGv_5Bz}REl%drX8h;qh_n7TsVNEol!>{eMkG$2{DeS6z6E4cJw&) zwzpW0S~2%Zl%l4nqs_jfR`nPb8lxQ{mEs(=YDZJVQLE)>-T;moqmH)uj#|{@7)Ml! zbJU_8?Wf-MeU_uoFbX9~(YC0goxY=H^~O)_6j3S8QL}cmSRA!kj=}>t+8TA#>O0!0 z7R5NCQko!Ln zb@+}N)yALLSx2QfM~&LicyZ)d?Wk}7M-5R&UB07j>YFi+s1)aDn|8F9dfSsNM~5&~ zOO&EbQAfSLqpfPsMmt4RigUD8JGwy}rC5$C25_`7>L@wMn^0^~*T*=bQkHz`yp#&3Q~XbmSaLu4LPy&>v0-FLfLee|G}zA%+Svi#~# znl@{$N)2R2nLwnSp!U(mh~H8)<^x1_5E*BT@P3(uclI*|4rI|72@;a?SPILfpf-7@8rmivyX zRB4POD#baf(vF6Sqj8p_aRWG79(AKe1*R|Umk|GD@4sKc$k!{u~1 zBgP^1;v7;-JN$sE=pdhC2brvs#`Ed%gU~_lvpUFsU<#Hf*>j^&H2G01VHB~R-6ig(Tkd{_iCLly4MyD^@ZHU)yYI)iqh6dlYH4?= zaA(z{ApEKnaoE2eO^-TMzQeh6cub5#>cu&vmUj3MRZ)-r%zCsFGc+WP_2?niqrY19 z=y5IUH_+xqqv-LYn9V3E?z3~5dT~)uOGh!1QEZ=UczREmUj1Takt!ZH)jBMlcVlN z`R=CE-Gmr-)QfXRE$yzAs@qE}cOPRml_+(SqVBSMcX@Qz61G!Ey*PK&((dNKomFLd zZ9x@_!~RuvV$|Vy-(fBt&WdqJy*P)|(he0>QDqgY>`Z8X-!zuE^nZ$5@6SDH5ntE~JP)mn%1;PnQFoRzVr%p3D z5#I2JjpF?!ujek5Ao{P0W<`UT?*}oFL5zzDf_ia5P)i5#0#p+Q(GVNNE0}O4Y8;u- zAeQ(+jAszPSZC)1_2Pn{mJVX_KtXJd4I*!VAVx=nSm_5bjzOFi69o0*f}oZT;u)wW z%!#eBLF~p9Em2O4iUv{T2QijG{H)f_3F^fKK`kA`MF_%g8zE_&gPX(2*^BFYU^XSZ z{>>(d<^?rM!sy?5WJJTL^TWtu7$?PqLA|&zsHMaBwWzXTRQ{fHXxjRh`yiFZnlO_X zR^{ZEaO-9xE_krxNjij%rw%hdWEMLf-sSF|0H#;3@6@t>V`X|Y1)Ka7WHJRsxX2To zYEmyQ1=P|hI0RL1Ex>B)%*9A!eHB{1dJEGsHtx7SE;Z_Yi|>9k-M@LSwm~AM&?dra{+POcO^%0 zAv7H3Z50KEzw=Vz$K09R^aiJxygE7s`Od4OH-0D_b5-$jmIf{l^}&z6dUq*DMeEMw zN04NmhKiC%o8+b+{Lt*YoZ-Y&2!cLQ}bn>mztQsBd>dbUu&HF z@}M2~JQMg-Kkzji?ySHMG3(+k@A=nh_tgg4nle5^Oy?pdlYtLjg?kCBo6EoJ-Y!1d z)WyEfgSeD@xAFN$ngqIWDfxKu+3jCFD~Hd{^O3g)Gn^fDqTZ_-eD%L@q{@f7cl}F3 z+;7ze`~JnvQWsik1FcPEjI^Q(ClU3$8^^nU@uf+Ucc|t0&3JCXy9rZn%-{13ldsKd zRyQAq(Y>5;9Y8XkGRa7hxD=AXaVV0n{A4@{39N?sR!B{&NzLnsA`+lgx@Tolvr=2} zMo{ewcQbT|Rgc=_Tm3m?e3?sgm&2-Zb+a)U=j`}gOuE&rzR52<6LXObJqb#7pOtO8 zT)peI(c4iaC&m^?PDHQE_DaUKq5(A>V8)(P$!fVz-|@OAX_4a&{g|B;^$OGilyPNC z#?9=(&|l$ZLEKTQg*!@d9GQ6kRX_OB9RU+_>*{&e@hP?a=dv`TN1mT6>b>d)UwxCOZt^^t>MYm}WcDOc?@{0M z)o=6EO=iCdiI=YXP<*)kx6M55B9AKRd~B^Pmi96Bb7ao2walD0^DM-SXewWv#eBha z`PRzStxh?U$VM{DB=J|U(~U%NC}FKP&pHGVgx^ROnk3%kt3T_hn>Y;qQk$Cr8 zcyYRn^TsuHoTU<{+&ug>ltzL$zi;9kGFZI+- zh;K2EVzN^D8=fUKxnCl<(-GXB>IoR9lA`x11kv2wX8?{dUEPnii0;3(n$srqm8n|Y zIrPB^(Aptd>FOb^#U^vp5In~*10=GYCTLz6;riw9Sg5`yTIqYL%Ww$4tN0f`7;|QX z`x$cahuXDA(%7e_BhW}SPaSbPLzp`LKuo4z*A6nbCG-#zOjf$B6n$Z9J2lNBALX_eni0Lh7jfkdD9u>{$zierMLPF#?t zhx|MA;*&ipipU!dc$;-N(4_{&KvF3V(%f+H(*%$iQOI0pN0$Vt)V90roTN@1qPepm zF9BkD6cP6j1P-pNFGrl}H5;;;N^v=9?jiU$^y1T<8ikze?D&TS*`bcJ5yRAp3)0*y z@Mr?Wlqe!^3i!U{;vf&`nPD&iWO5X;%-PW`LAI-#V-TqmhuE$Wk3cUz z*-jL(0y(*VUHxk2i{SH#<9eB*<1Z+D6ou2fZtKx+$6q z@r}@n&q<#C7(`rh545bSU&A1$*pPCb78j(s61XD#byXE8`^zAooQfMLlMZZHSHA!p^_dM>O{KUxxj{pongDWV6mojfj*BG7IyK%# z3{xjA$U2SK3cdJbH$@S7nfWFhh6C%>yLZ^>rcxZFxy)Ri0J1R(S(3D4q6Ar^LNSQc zi9WGz$>HkBfDJ0n0i{E}9Ea$Tuhf6j z^(khG&%a95(cS8tWs z`9ZbV{HUguu3U=~;5I~Yc?FpX*G~nj)iJ=-ivuq6fkz|&-V_DinzZ9)33xdJ9utF0 zwK!aA>40}YH9jLYMsa!VcPb9U)k_GxZ-t!`)QbbAmIhvs0C+2xYW|PvlHOfL~(g-HXn!K>bV476a!4XIACgN;0RRX1Fnh!_ayCDA_31P?uZy% zs>R__OXL26xK^{iq7NcDi&a&ag3VbcXUd^^UQ3C8j>cP?sOiIL^`7N8H@*uoxJyAI zFp8Dt)-)APiS74yyJI-@x7EM;bp&#GZ zx|p0^^>bhS0LLb41vK|R#g}pz@%?Za;+q37cLoUaFE?>~3&mldI^TD=*mG#&djk?b zzOae!2=H}sCVT28|29MYsQH)2_&!>S_;v%#eFlW_ZI-7~`sLpr#Ua-Je1|V{(6Y*R zf*oJ4sAK)lSKs8RoA{Cw#Fy;ocgakehxfbiT{7lfF?_#F`we^_jDG%#@0Z~NS>C&e zo`KyYCl56G8;M@SQsPy*a+w*f^W<&O~3v z9s4~zwt%llvVHZlv)}Dw8K$E!k5)csK$qLWQQ6Q#`N+G2P>v{j{_OJM@xJ-l&auas zHw+!gc7k{bSg|uSh&M&ubnEg3OHgyXHQ@Zdn&OwaMm~EmUWzanqP>AG6epf^>|-C5 zgmS_fwqDr|7pH^+cuojf;K@;sdQTrk#_Q#5vFlYYYHlcHUGd8g7hMVLpP&-U8n{^x z`zDdOCT=SEnci`V?w8ZNW7DQ1Kn&%#MXv|!N@m@b>rejkjC+>a&okCAP2XJXJ+@)2@IJ_Rd)lal*$&?*08BmUU2h#|hd6<)6p6b2pE&6V! zAb@zaGrqq;4UBP&W+JarZMcbX7I}FlJr)%+6672CCf?6b6HL5qj5lA$I~*Eu@ebGV z{sld2qIervr4X;zm$JVz<>&XF-N;b8ZN{gCUb*d%^7qp+bs1jMwG8;1P5H&Q(fB;d zb7li2`txv?2<}{`Xx2@@TY`7J;kD5|`oQ?{bp^F73XVP26K=C_W*Ov}y0UP^t+y=g zS5f|_SfgyLnM)R$Za&7Zl%ctXSGl^+DfJBNK1 z=uIjc8Y%CSdEy+ow#Qrf?ed6kkLmEnEx4cQLVL8bYa`<0&n}CG8}Y6QV6weU$3Ktx z^V%Qx|KDQ%-R+n?dey?6Ee&(nN|Z=dlW(tI3Z@w&<9smpF#zHI5jr2t+zfX@`@?=v#bCs>YGzqrr&Nqm`d zJmPkS=PS6dbj7VJ%IGZ7yC9+JV|sn%K=pr=%lJ+GFJ8KM>9X&m`;YzoKbAjwooM-= zpNp5|C6(f}p!!{OL*kBG4m73n#hVo+?5hrVXBv1!*1Bff91e5@)xzrmya*$7GhVdN zj=B-fPc2Zx;SOsH)SyHimSfzKbN4ZO0+FQ7WKd^aAQHt}(=rYxM!eG9izN(P5dQ~y zQ};uVa6Kisc89F+u8J>%qeYnZriQ~57O2@GOqEOK(-=h{67&qSM3y45EXda7M{xg7 z4PMe3anh=Xf&(Bdbwo->scUthi+FYyxjotKWdL%AAKnBfIEYPjQ`|wxkQx7(zATUu zS)S^qQf2~A_GQFOcTb|sU@DAK$S8xE;bvNx`?SnG*T-t&s2Q2KHtz>t@)>DfsM1&c zYXT9brtDkpL?8TFtz0urEAz}eM!9_A-au~`x}VPTu+zz%v#|3qcTU01m+;k@j-5l~ z9BVjUqIP3AnS(4XJHB#tuT$=cL-}}YJ*75pbSTiP3m5fuP0M_o$6953C4zLn<0q?7 zad7g=b`{*klax8WLc479M5fD@Z>=|Fo0q8zcO+O|;jU7vB|}q8;f`|){JaXP zc>?4W#CZ2Q%1q%-^<^yFvF<`E@^gF{3wNTs%)&g*m$7n9a(`f9{u47nUGT)5>{eQs zZ}>7|X1iev^BG@8%v|?D3-cjgM$A0-VGHvfUq;O7?yoJ(n|v8D%iQf2=9RvTm@D1q zEzI+L88ClSf%@XUXu+l$@ldpv%3Z-i_YDj8-9?gq_gx<^u5xe0EqyWdHLdD9XsYht zd=GII{FeR($u#(v@720_hRx?&{S97X8onARq#^MJ<*8^DpQ4T(dKHGc-#TFk>h=(j zaG15eK>ZhHgt~5*UxBK}Y#bl1r>sytEHYN@@~`P?`I}aTFpBoo)CsCTh)%jR#T1NA zR#VgOzSOhf+%IbKWlD*vC|#0?$o zyEvtGZ56_eZR>IU_<78avzQ*!9aaL+YwLv=Nn_f2od|VX9|xh`*5`^$xAkKoGi|-5 z1|jI?uA+VU(_6t+A;~+_;(t@eti4#WmO%#9B0)5b{^<=Af0ts@?!V`YQE1yXQasH{ z$T(lj>c5HNSr+*5z8J0Q=?03gx4{2#i`4;a+f4B-7Wf~1F~PS`e7gm{%@-4V8^w27 z;P-2>TkRvpwXREh`?an|2y&nABd&D~jW;M;;{L?<7}v56d>)66f$7nKLU}4)xtull z3)V%};9l;q2J?MqQiDI^4r}ngxf4@^`5x_lHF(s`N3Fq)NVloMGFHXa-`^o__X$7v zLbZEgwEnVA#MIw55lVx;!>+px!e`wrFZSwf6O37J%P%!U)YCh`QEww$T)i>fK{Hrx zGu@jR!|wzs9WQOi+pU=kU-ip{FB9d$2-qbWuuVH|fuGoRJPJ*OV|E{+lUo#Dl1w1G zP(4?oGod!{<;|6=zr;LhE&JLxs1l}1f%>PYq~Nts?z<8{*+JFrvAf*AS%5EiY!%M$ zDF|0<<(o9Oa&-@G@*WHidjfxR4!wm~nd{x|zbu5Gi7py5UbgLiWd%|d6)1PeG0aMh zzE}$YBs02Pb+s-f%xdxhB2&N&mE$wdirMp*IlKU*147bQaE4L)0ymm7JOk^38aSL?a8^k~l(cKGlGHw@m zJ?xIRK*qawS=uLAl5uXeWz#1(I_YEG`z*=(M#7{|bbn%@wOW!%?xU8?lNQ=!_X$g~ z!LrGApRv&Hv?RIi3zp4%3oXxm*^*pg*-Urew9v*`k}~%_%Vvayw$eRhNqXl?ZRX_Q z@>TAq7TRB;lC>2MdW*vls(%1!PG$3;plaqG&i{CZ=pK7)4jMAnZndLD!+5ZZ8iND9 z^0HI(B{d>Ug~*$1-Kl->eWnrCz})+%ACYsTVWnG%5F~;(vx>~afvys#!ks%DBwW1# zm(qjkUC3Cov&gF_uTY(C5&+yaGMBi(GH{HLlOmZ(OrkJM%L4U*pkXNqLYYTgZdvXz zLc+={V!9>#rDfURAk(h4VAos1%@oeJESFiZGJjZP2@5St&Xn9T3-)45$f<>wCx5)b z&#!x-?%pjnt(X}Us3#y}e%&ul$P22!3s0w-L!0}MWzc2`o5hJXS`>BiB%M4aHtd87 zRGx9tBu>af9k6g(i4)ekXGL*dCeALg>HCZ}j>h34g!?A>_2lFI_8Nsp?oNbtfLg;Xt=WmNI;eG;rG*zIO7t;tbx~`KrInfptD9Qiw6s2&n*gf^ zTDoNpO|CaI>qzsnZp1={uoi1J|!}olmUXFxblBXM` z7g+rIl+g7l;fyy>Na;xk?P|;Dd&UR_ekAmoJdmji>_st3eHrDSN~8If(Mgu4#3uY) z(2>BAiq%JuxT`UY`za0JAY5%CzRpkS3c$OI=%b#pLUjXVXik1gS6luc5LpUSH(*M+ zO6%Th87(kIM@y-^Apd^LXq@FKaY{$i&qJ2U7uWiQeI&6-CQTl*O!oXolPo(wyD^RQ z^Yc9%c=WdSw!*BlJQ#iaPS0E?d$?7I5$W$*yT_gKk3rSVqlYO3;r>pP! zIvHw$uQOhqc4%R>FOz8r%XNS>#S4{`Z}vr$kTbc0#CfDR!>4(gPr#XhH z8Dh+nOpaRWyK=}$F2^Y~UJj|eiHBeFl^b|C!dK?#qXzrR9B)+5Y-RzGt@=%iGbx6QzY-QK1!j$Qzj?P&4?c|sD=d=4&*Z1eM z!&QO)e0F&1{Qi7)y=r8C{sHn2U(+w14)Q*o)yny0=LX?%gbnkp1EARI}o#9l<5{~wgt zI91AjP+~u!KDe4WGq5}MKkB*vpu|30{p3F=v5!$@RPwvwy>_?pI~?fm@W`j6&}m>A zr~*g?Zjq8}B5PXu@GPFJS$o;ux!BJ|TnX7AwXfn*r~GW#>QUnbP6i^4yQE&G30evU zs-(^f6RUiL2<1l2^5bzL-#3`&x6mGJN`1vK7(tw}TD`E?gf7#4iv4DIG{P@Xmln$y zA=fqXVC(LZPL;x-x?O}g`|fe~kzG%Ap}N*%ce`&{P*Xj2m)l{1jPuw^FLD@=&LYVt zas0?2Ou6z8xvJf3#hrj301mc^^r@wHkfginXPLK#Y_bS1y! zRT35a8Un_p+z~+ZGWkmF1#>J^hoHLSa?~kI7jaMsRh8x2ufLJN?BrLnic6csQR8dU z=?v0(eo$6TLO-^j?Oo>p)_r1SGR+&!h)nKppT%?{r()||J22d@Takx-y_j&==eXmk zXG(0LuNTv|_E7Iq%kLClPo~FSU1y)?=30J7`g$>bJE%9q^85EfFC8&{Ws*7D^7{v^ z$48EPWkqmMGS*bMBACP-u4y~m;aV8)M3EK2Bi!M|t1sbJRs;`&!>Vut;4n+TlWlsZ zOHJ21N=@ZXbotQa&z}mwMO}}((q)wrKQXtVbsOrny^ffP)%!hxkI|$L%jZ50vzN|K zL6=hXS}&qH5;%+oF|_mpeFnN1Np^3v(tRELVhSj&>{nPb(rR~8t(HNjG}b zjFHowcF7o4heCCy@9}7X$_dZ=5~!|XQ+>0e10+7QDIbwC4ZnZwXC-F#eTBE25<{Jh6zVC=Sl}o5iS5@=*X4gzvwqiD*h@f%oN~-= z5LO-2Kr=u}ylUrkWS|%IhwP7glF@k_3E(EsPTbX@XEO7l1;i_^mvLa0hQ!V26Wb{6~Y z6{EFD3l{k}+Vps%jqG@lZu}n7V+N2Oxm7}oO$Yvi#9|InPgBIX%`dqV!nY)NLnD42 zGs6!q9Z~u3@5=pPJm;OqOydc!zCQ>Z+Gp$!oC+k3wId+ zC#GHi&D=Kuv~u61Z*g&7%!I)l@2PriAGDms0f;4C>vwVPVU9!VceQDdD1-A$phg+( z@eI!5Vl+D983*GTJjsbM>56A`$1^ymG^xYg1HIBGFV06Y&|9Ro%FKve;s7Fch69Mk zB@~4=yv81x`5frgue8!x8qRnvRJDsk2=hI^SHBBQ=Vv&17tZZCbV~Uoka4~-kc^}C zKr+r829j~q8A!%H7qUp87x#DItysHoCTFU9+WNO~CSodj&u|VlwQLpm+ALe@hMHdR zyr!YN`#;yTtdXdJ9HkIKQVnB5;ERhP$xo@=DKlTE{7q>D6xJ3WgdlQzo|=Gu zcTN&MWP}s9<>z6b)#^YXhPtj)^;r}EA$C+$8KHo!tT zWogf)SAKa#TGc-p2Unmfu%li>H*FyG8dNhGgMr$Eethsfr*Rl3OEv7*f20JI+1FGVl93PsWAcW0G;IbApsA z$FII2IHubr0Spbo;qZiK^dx12$Tg!9E*4wYe)Y;J*G&bBqYF;yoHQ}b}MKAb#kyo|T(_BmS~l<<6G~?UZ545*b?hYtppJ`@lkS1N;cq z(AC565vJu}7=9zSzJ+JBP^el%Bp$GR zujK(lJX>=jWov_Kh1lc%Pim~AMpACLrE{ECL2+s`%Oc0b8_Dn88|Y>R^9Ht6!zx#I zV}3gqy__7M5e_s2!}%@v`dSw&G7z{a{cHEw$ngrP)*fh)_^0JHm?M%TRO*!Fs2_^^R7u2q0L}>)A1HKJdp>4~4~YAM?!9CdrxvR3XeNvG_Lc7aUa;pF zHrK{hxes{|>4wc-IoEy61NkDGNlO)waqd$d$orbj6w9?yS&l!5P~B%e%jb;>ax9|L zV^&Pv-JZ`)T7`Z8wyiXN#WP-OB<#~0D0$oSj9cd=Acmjn{?&sjFl>fD%I)-UE;VfC zL5BNp59DkMB;Ad8AgNIhSyFU|9%u6M6U@Mo4OZbGF`P`fCsKvg=Z{7OJxX*@u!Ab6 zQ-#%Ut5$I@1j9YY!+szUHYZu`WDk3VRtX0V1l=n7J0&FmTPmUs}S88)+-Q&M-Shm)iwY(7%0t^P9RG6W|{%#|aN#xR?caV8?3p z$5I8P|Bf`aarPvrI2B|wQ!k4*xrlzmEcp0U%e#`nsTxNGc&cXeQ##+!{~g5>=VG2G zHcPcYds;Ni3!3e5V2HHeZD<<{j6#*HGsJJYAHfc1*plc1ccqtapH5-&(;<x^5A88uQqMRG-3AXW@@O&>lhuXt|7lP_8?hkGc7w^K82YNrU zU0&$EKp)Lg6S;$TDeeipjA==;bLas;G2dQhm$l&!JAuh-KSLo*I&=qw)Y=nxDd`Zu z;)*Uie;1}t>jEzY)%y}rstM!>j=VrV;l2svBfW0|Y1c=yIG=1$Pvgk+GW3rZS4*0H zOQj%-}fDGRj^zP=?K*cDX&zKlNG zr_NHZU=PXbEETWslAqA)Zn0pL4`~bI^w(mM*y(+gMV(d%MEfi?M8FKZSaJ)VI%gMJ6;`fp>;dUI(HBu4@-bzVpdyxs3ZvFKH!eT!>7 z3-fUCE=X8ySUfAx>Y8z{=gSCy$K|7VTt33fyFFEZ*pC8oI`OotE@o7znyOdGWQ{w* z*EtYiJ^)zs_gsSX%IgLW;QgFE5=@V}@0(uuuYAjdZ=QU<7{P?YOh4|}odjE+63Ba7 z@e;s6sZ4#h3i{?h^32U^|2~5x`eIb;o{LI6LsrLzJoy4nauYs7wx(q)Zg$~3l%I*k z$%$O(#3|?k`mOJgd$NiUly1-E-`4j;U+6BPyqfZ$dR*kVMj%65vRg)3n6d)3PRl&i zG%tPL$qxPT<*Rp#KL%5%4x+TY{^MEn@aSe_l9QsogRI4hW4NA*G56Es4#X7o3tT|) z-oYwoKxx$#u-7r;v9Eh2XxawVzr=|bH13*{peZX*Z)%yo=(`yL_aU*&LI)aD0V}-W z0*?U0^%NGWLJ{ig1D$C0#y39JWFeHt_#W*xiEjcFs5!n&&zE*lX27RtnU3pC2;6;Q zIa|(ypFqVh#k3ehPbfGl?YUuO<}8^~2&0+NXCR}|UGQWR*ZkyuXI}H`+Yeo?!fK9J#^Gw6}@ zsc7|!$V2y2rsfbsFljwaLP!mVb+){9ahz>T3Quu|9S?g4#7n|EFhGc2k{^h-*O{0} zvy*8S=KGrplq+T&yUMdow&B&KlohHwG$duGxf5x5u4TDMOC|YlG9SEDhO22FR3|15 z;VJ^<5U9Qx_iPrb4<~x%m{uJ|719mUEfQZ;DNrYgFWy?f-m}NOfwF4Kf@+k=u<+g^ zrIxA&OHSg+&+=2;QaW=jq(*Uu)00oJtgrpo3X9A7`oV&-hj`KUm*84U7-1dAcgbac zerB=2XKc&5Dt@9pgM&ocK~0W5w0c^ckB|xoBOeE z7_VLw7TbBU`n~M)#4J_)M)ui#j8>2NI-}H2e4P{(_I1+L8eb<QF_?NphUXW54jVq_mxav*Afg_GQP4kUZmRa)_lxrvA~4fO;#`H z!*0Z`w(I>~cZS55uCCHaM(aYt(p5d>Nm&2EN_wE@vOw1=yd$CayyEW5io5P+`+FTJ zFz)p=r~^$KW&Hp8QO5s$s1OpLbch&k$*Pj)s*9`S>)azn(W?4 znS2JOK-FoPr#cdcF+BzSapYej{z{~IevG+{H}da|8ToT{IfUz}*ni|dA2WV`S= zm??T`W0OQd0G#(|8R|mls*JSfk}7+#M7{|~dN_KD(L63#ESEy{CrsT;0bJuHD_l)k zQ2kA0GKyaW8Jq5C_gNZ;sZgL!FwUg$a@c+w>5+ETC!^HwkF!UqdhPKxph`J?(;LRW zF6kIWfCpj$cE$iy>m-iz0Q%1Zr0@#WFi*oCH1t@Z`=TjSkOU>G3uT`s|Q-4_1sP{*jv1u>1nd}*}<$FBE65__c+>R zbRe!~casUObT=n+C#Jo#zsWu`roWm0*O>mMKp#qf6VUqu_b302m@IrevW9BqjpLs( zUDbLVpD>O|$#DC~GvoLQ;mJsw!yo=9#G$ejOb^R zSFgwMkx}%VQSSMc_E(~9#yj`hl$de+ua+dm8?En-I=%|JZjKn}k$J9hTqN*%_}yfI zjCOCZwAWgaRByCCGYWq@;axG%BlF>Nb-L~ncs(#ru|U$jA^gu!)T6bzx8Oii1N-$7 z)Sv;+>o)z%e`fGU^js}obhllpJ#%^6-AKOa?w=RFto23E{A!cexsO<84RPY!by?;% z+0rJjo4HA>a_`S`U$o?7`^lGhexJdc zE~R__-8X!{2k7?=+SltYeFJ2uK$6^#$Tz)toABjM9r0Ure;s;a4|;#tbZFN_p}!z> zHz7PTJ15In}V1?=yM5CKT%GwD=p|L;*xyKriE{32nRVUL#P&1S4E+N zguapx)vRzqHP(W@R$P)_s7efUG(%jBB^IkhJ5{+*k*iN@EVW&h8rOb~gi~MSV@s(aT*TW((Djz~hNEfsU^e1D zXldVkH0?>az~nw+X-_(u_9~ouyH8l!!;Yridoi`NPuUgs_N7G(E4BCIPv-F6(b4_ew;N7K$Y9@_u3v_I1``^2f7eF7_< zc{J<`EW4Rnn6~y29AIFOinS0B<_RWVhiB)(#bmZ-y#7c1lwwvBzQ_odezR1Ka7?Sj z<=i}Vhj2Wjvb9T8NsLuv4f`84Gsdv-e)bgV(iq#uwQS>ROq@Aer%I1AXZ=@SWidR@ zb>mvrc=eGmy_g$o*aFpSWO~<THgh9k{H&Jhm4W4~i0X-f<*a%tJg}UVP2EPh zU*-M_r%ryAyk_0n0=3u3_~t@;ph1_LcV z?f_BTt3pmXHhMb5J0P$+JxJ7f%9A=AefD4w@9xMl3-xuBhdviMlWHeX&Dc@v zt6fC3Z&0neN=|XUZmE^}Y5}TErdoZIoY_Ra7EQ|KzS?Z6&7@kmOV*FuEwvH8+G48R zNVV!r8IpcuslA`V#u^#fp0!NR*QPN_Z0YW9ODUzF5_&856-(ozOcn*IhVQGaW{LZ@rP0z)V`7c_ zS4-j1ehOtZd2Xkrv8JDf?*80=TS{{iD6ubmv&QzZg)LU1`w0$|%rN_buJC2h?SE8+6xLx}Tpe`G7tRV|78ep52PIexy4PtNRRx z**{rtYzf!1vc#D1;ffd&-trz}!tN%xSzm0SMc#^CaRdY znSQx%@6>RZxmlq0Q_t&Z-;)E=`nPxpOfU^`SEnp@>vd6m3m-b=Bj^x9tSr1K>jfCe zs!z9DPaf|adcx!3#nhkUx;@lNGz$fG#3}zl#p=(U^4Ypq|398py{M$?w{dcnaT<~<`whk!x4$8g7_ z>k|>CyIJI+K;2WhW8Q-FrV&me5AnMfaL0twWQ5bnBkbkeF|ZFA;e7H4do_0q?A=CK zMjl}oamTYx2Fl9j&zD~(jdTM=sqC2I*8Ma zyisf>WBOm<{z`Op5Qk6F<=rYaloz_siLSR1Ylyh&^{{*$7s@h>#;ePW~WcZsgXA8zCw zVx#fj5?zh|uMDr&$E39nX$n{G=Oj+87ZsCMG&{FP@F^^GKNega%VQeLO*x6>D#q>+ z(bch38~JF;!;}}eBScrnve3xKlUJ|tzb?8OKVam!Vx#dd6i)jjmDoLx*C6o zkuMP&jen!)YWxpR)b*l5Y&8BIqO0-$VB{ObM&qv&U5)>kk#7+jjsJ7e)%ev$zEf;8 z{?nqX@fR9-o7ialJ)*1e14e#OY&8C#MOWjGG4fuq(fI!mU5!6P%j0|Nc9wO0Ln?|> zHH=^u=(6r$y-q!uWkq3uJBa(Hw|-U>)7?z+w6S}V=;~O0V&oIWhW0`CT+!9B{J_Zb z#75(PM|3FM{&7!OEPciZ;vC;Tj_oN&Rn@j6fr)&Bx)}xV@^W zi5GhA!r2{WS1QHvKUk89lEMc|Mn%74fh%?V+(p?C^)9*;LSr6S+2Z5w05^(zfVgM( z$8E&f0dP-Bgj;QJaSrS7yFy#`;`Sn=E5niH&b^c-V{?GRDfEjnCs` z=pTE0jP~SHa-7XGa-1`rV|1GRZ|Ce+OEH6$QfqHYJq@}02jr7{faHYA+j>Xw(mJtt$3cye1~T`k?sN#PGpdUn5@Znc=(mq`0wy6)I9SYo@?|` z+;@0#G}rnL&u|o~{T&|OLur49=Rxn-e23>=@7R2Y=leKDtt_cU$|McDTvt8D3+&^+OF zJkyn&Ra=ymTsu80C7hd;5)2n*r4)v7RG@A|k)UVCy$Hv-b&Ng$#+(qfLevV07EZ^g zrCvor;@^9Iy+>ULZ&l6Zr=rus4NLgKd8jxQZ#)j=r=xnRQ%r&o%c0)__t29db#?CC z(K$GsRKH^PFZ9vi8A#IIW z*}&fGaA>4Nb?Kn;lT|U;k!?iA{Yc4bF5s9SONf05y;e}B!-%x`zCYoWfqC@p-&$>) ztHDu6>T`TEIaC2PXUe2~NYC-=LvrfKiM+1(B!_uN9=-`P3l|)#-$|?Iqjc5pl%?;T zn!-%jJ2jQIox`i&DL+13+*_!Smng~W``pdgnWcUV$TiK_MV=1=GULA+yuA`SA=ENC zq*p>+#|M#7$LUZNiFFo4kG7$j>>WI9Md{kTQB8{PECa< zvz<|;)8pQ$7|i&GH4c1h>XwHw%nUBMr50;+*GU<3(3_N8p2j=>M%4yKH=!(?>vva9 z8d83&*`LsC-kV@_Po(bX+F<6*xLI&Oef1`W%7<$Ta-2|l?Z_h3tI+Z5d6e|%Y#i)X zk3x>jJ@hwJZPwEXsI&b46mfYUT+rui=I7)#=xmn|)L}K(Jg8>aP9_A86XG_8_O=6;BlpehY_K#c`;6 zb?C&w#eIe9mqvXz8icNAtlQ{2XhXAJ#kF{5DC;3xWIE;(?ALRauDEqp8NN(+3nmS^ zj4Gydevs`rx>W=t7x&=EbfRhXyDHyLDl{EvTKx-^e@!Y-y;J4sR3?Y%QB|nlCT*Ax zH8nEV$6_@JW!8ZQOv-S~2TcABmVC#q@8O;+pz;a|Mn*z2(uH+Fb>In;JH@0|?eI)` z#iX)1Sv}}knMX~oF;;jKSrg zD0Gw12BDjUZV|dw=r*B^LYsu{6xuAbMQE$geL~xW?iboF^ng$fUXd{eg({(4Lc4`> zgo}(xK^8>DqzcUxnk96S(8)rBLW_jDLYD}w5LzX4qtH!4w+U?&+A4IPP$jfWD6>8? zh9w;tGww>#@j@pGog{R!&}^Z(Li2=97aA1GuNmUi5Mx|9S|YSUXqC{-LbnLrDs-FB zM$$-ROsgF26WSs4pwM2SeL}b8F}_BjO+t4HZ5G-hv{mRnp>0C<3vCyAKxl{1gF=bwW1?oqrYMED`DoT_SY3&@!Pbg{~4>A+$x6C) zx>4vRp$$Se3*91gtI%yi8-+Fr-6^zLXp7KRq5Fik3EeNWUFZR!9YPNZRYJRjb_?wh z+AFkAsPjE37ojOaQ-!7r%@8_D=xCwYLUV=Y37sx9D6~kZD|Cs_3ZYd(HwxV(beqsd zq5Fik3EdBh>C6}xDK5-7K_8 z=uV++LiY>J!|7pU%ygkap+!Px3!N);zR(h(uFxeymkTWux>D#Wp%p@_gw_aMFSJhR z2B8~;ZW7uclqaf@FIz*V zv_fc=(2YVj2~7zKrqFbu8A3-19W69dXqM2iLdOXmFLa{NNkS(J%@&#~G*9Ssp+TWV zLT3w|D|Eil5}|cMHwfJ*bd%5qp__$n5xP}q5VOk2m?ELGh0YZ^UucO?SLhO<%Y~K+ zT`6>x&3W}#bzZWX#sXrs_3p*w{(3vChFDs-RF zHlh24whKKVv_t4Y(Et4<$br+V{+JE+M4Uf4gBxA}J+qCRGqz=rwziR03@0sljdZ!t zCgH4-{TiVggf3gr6&PxzHM+lZ3YJr+$~vUZKfvl9MiUw9xTFCkxFJS|oJ7&?Q1w3at`aCv=n0 z16XZw&QL-}z0LhBq2q=22;Y(YRH2iFHj3>Qq0K_~3GEe{ELQ14+k}o5I#%dJp$A2? zUFd8Ve$Q-Sc@1u6*_}}#rS__nT5vcyizFxS5LzRgwX**sp+6P+xX|X|)bABKegyYj zp$$UYg{DiXJuUjr34KZETSEUK^rF|ruh4Z;QcntfK)QX=OH{g%)#g@26f zj}Usf&>dp?q|iM=Ul)2r=rFN5N$6Wb&k}lp&`X7WESi52>Y~)V_rG1ftaQnOr6rkD z&pR*k{LHD#mj9si)?3`N%nL8MTM-X z6qAIB^*@w-E^5JY)&%_a*1;MDenrr`@WP8Pbf(Unky|{qXl9{vMft+avSlU9GH+T|TDtJ2 zvSrS!g_+Asmz9(+T9#S9G&4|Ix~%llOed$fXdbNQU7a(1X5qXUGv@_n;IODLCwHbV zyL@J0%<K4;Uy#N4!f{bf;Z=d691k}~ z2L(ZYXJAe%y4ur>x|`cZpvoJR>L$Z_XsmQ$q>?;CO^K$0p2WFsh z6ch*M<;|R9Or{SQ42t_GvV2yD+Gjh%!|E+ILJU?f;@2tQ6g-&b$2{gvzX97#m+@oEA zwdW<$57bNT|84Jk;G?Rp{9nSK3=j|zHCk$?Hm0dkI`6&t|9{9NB$$Md447IpOfmzB zPG-i*1cI`fwb5oRtJG4PwX|g|b*YVhSf!d;s%TkFUFwf2+SCuVtg<$>Xj!E;wN!uK zd*6L;?!3GS=+<`Ij}K1foOAEF|L?iy-Fx4?>TiCe`IJ%yYK%>!N0UG1$cjj)-W;wr zLoZ>CQ6uk@BW|f{sH;MeC`|(m2cep~l2It(bQg&sLew)xB1Jvd_O|B~GikFC zO?GnFp~U)>c^y=IcQm1de>#5DDB?u->!Q!J3*ji*c70tVeuZ!d)xjzZEX=w2^p9Z9 z`$wg#>#OsmL9?3GOZ$9z(q<+0aP#Us`EYaH>gwi}Ns()^*-SLqvo4-l5+jKw86X`N zcs<6v-b@q)nJ};G>gbH4W_i!*xEK|Pz95y1CXqOWkPuJAyK!NBDic$5Z^S3O42<-DGDTsaXTmg(9M&u}rZsxXR)^LyG+aWaCiwk+SC=>uJ2 z76j~}ruNM?MxS8xZblzx^Z`bbW3#9Mgg>JcSL~tk*MfpcP;lbD5ID9(3sxO}G2@4I z{4nE3bo@1p9|K>X2NDl&la0dmrPcECekv%O(Ig0k z$|r&_1>}W1F%HjiIB_H8L!JSHG!QlrtD{GB^d23(TSpJ; z=v_K`r;gsCqqpnmAsxLF9bLU8|$RIy$JMy*k>dqpdpHqN5k<=t>=3uA|L5dJ&_EKA6B7q^egs z(MMIhkHZH!e2Bw$arg*_k8=1JhmUjk1c#fB=i)8n@JbGMa(FF=w{mzVhxc*#Acqfe z_%03~;qXxoALHIk!<`&n%i*mY-pS#896re5Lma+~!$&xLl*7k3d>pu{<4OZeYWQIek8pVG zeZ-4Eg@ar?!(4cKIsCwBgiXTY%f$5iAUI07mjPGvsMd{27b??QPQLYh$PaSzL#H9H zrl(MysP4yfbvCY}kLu_nI{L7VR@$eam5)+}Ia;Zo9IdpA96hQFZ@-S-r=$1k=n);g zM@R40(Zf1=myX`4qj%`&?K*l$M{m>7TXpmn9X+U{2Xu75j^3=J`*d_xN2hgkLPvM% z=$MXPtE1QG=vGFP{$r)M(q~4w_B+Pm;~YN0;id_$zj1gahdVjEmcv^)ypzNGIDC-9 zhd6u}hmUahD2I=6_&A48aJcCYT>3e@lEa-GUd!RF9Nx*{eH=c>;X@q0i^E4ae3Zk- zIDDMLCpg^nHkW=5ujFtihu3m=D{xi6oYb|C39fw{;@U^&$y|JWz~8I3>reaMe< z@)PevzVc7G^gDqMUm2WoO{DWQ{A_`reWwU#H~g62A#vxP18alA3GhmaLX#d81izJlqh&$i3Ggoll!5QXuN`0k+>W)mV+eO9@KU%9 z1CE>%6vjY51K0;R05}RL2ORuKP}mEZ2LTs=UW4D=fPO$J=rTYSxPaf)_$>y!1$-fX zPvUni;BCZF0r~`f#{sVcUIIwqy$bg+#4!)}BjBwAeLsHpM1#V9{5}sD0W1LjqrzO2 zzXPeHneJ!@*4komOs-}y-HMqx@c?x`hjYdpsp@!; zI?il~Cb}{r`7EFa$Mp7Mnzrj&8j?6hd9$?X+ryMDVY9PGC^fq()s5NK_Gm^tN*N|~ zQg@t^b6a}5yOLy57}K#C@})$PP|_5SbzwsPIHhKgIocj_RztC1s)x^|sXlRnI?dAp zZ;JP%#FGY02}^hga(-BwccydB;&g?r1)$6gizcwA2_;K=v)NQqETx|2k-%f|>Lf{H zRGd$lrG%-n7E;z+#UCjzcq^OClNM2)DU?8QM3bU9kCe(Oc?O&9V-u!gCFRaSq0&iK zaj`;IvsqBlLg|_HWRg;}QlcbGClbYTg$2U?^Mb-0r3$MO_~7Sk;V?KTI5y=@nP&>a z7X*dbHE1JMnRqlCpD#3hEGW#P3@oz5FBEox{)llqp+PJZS~1}@SFK#iJ4-NMjE=zC z17)2jjDWQuuhN;{rc2)TW9o5bAN-h=wH>T)VQsB3(ty7N!)lL;g~AMLT%o!)YOYwXRQ+i@ETj{j z5-=7$u|h`zRxu@3RYfAID*|B>bva%O1b?K zAvLy!km|2`c{Ougy`o?yus+1%XtgeRem?K?kMO;|0QPx2$hUFXAq-X&T=A&Y!xax#WLoiXMWz%KLYks3;ELE#pdzb2Qnn~*7BNd-0~{OV z>gD*Gk6AUIO~FvGN~*A@3(A^igrZ6sD5@lpah15?7lnzxL~3;%_Wn?eRU#<0$MPCY z)fu#YnFOmQP^^mqL)1*)A!&2~Q^M1_|~F9J_rQ>829KNeTHIEAlBWd#vHozNWQE?2My| zfb)m=S*ZhKW&^>LQs>)Jq@|j*rAQscs3S5)$~;$dQw|<#kt(Ngswp#0<0%t_cErkthE}N2fzQfZ$*8_Tv640}1?U3SzNd_e>A6!yMM6XL zG%98|Lha}{|>x*@MNBz{a} z%>k~g6(|^~!n_nHbwkpE0SQG&Fr{V)rc?~UlzJhUQY{2iYK34*rBIC43Bi;qp;$-_ zIhT5)oHHI(pe><#?2lENbEtl)0D$%-7)b(q71c2Cu{D_at8ED}Y(-Nw!B!LL+UiDv zLz<1>pisb!$BLTp6lwTl4H!HWHSMW%5F;3PIWvV};ISc*q)-_g2~RUW7^Z|rGz$E& zN+jX2mnK?aq?(lQm{o!BRGu;hK^8*}{t|yV^N3+2JjD)y6vK$W6?ko>t&(BHUsH(j z7zSRr4zIG*AH%?_Ux9p59>c(E&_-y6Dd91#hVWQfv0PFWMqiQ@f20fmG+ykar{$O5 zMZl|TY+*cx5r1_xsy_uI;f1Ohk73{;^^C_b@Q`}OV;Fc%p*qH67zwW_q=u(p#NP@v zEer!Mf-RRyw`LfTRTM93hhgBM2AL{h7~$2`s5}J&4=H6lhJlBaG9JT-KaIyQ@N&j1 z!@xsqOgS-(_zP953QNIAcy-u-PnAEzz(Z_|$1w1abH-yB;f0{esVu`tc&oJV6bw9+ z5c9_{@Twb@G9JUg3$0eeV;Fdtkz)QBMtDsjm8W3fHERACMtJCr%BaUM!mF!cJoFEO zfrp$k9>c&x&KZwk;34OX$1uVR)u}uM1CR6oHrgr}9R*nT$SE5~_lcP=V!pCDWS1VQxON(0ZMIzEh=-bMv3dT0Yw&fwQ>O{SuWN?&R=V ziYxJ}=}>>mo}7A~a~EW-r|@$Ce#qfg{6o&asysi(dz0W;8X#X3leMu$SO+@?K-R|2 z$J&y*Hb&0bB5Pxv;E}bl!RLcQ5U?Dywl)SnSsOb6+0G|&Yh#DtM_n6x5n=FaW9@L` z*T%MhP6EiIyYjl~cjSsQx+{4jv5jolBP6Tg1IVt~3fHpG?r@UsnY72rxh zJ>XWrX21qO8c+k+0cZu>378`k;iMe0v?T~mGv%_l*p1-k)V>YvgDU~htG#4U|0fX z9QFt(LmQcI`LLZBmeJoab73`he5CH4TZB9wTUjJ50$mPx01U$W19)3Op9B#4QT&j4a|>&*93YE;}L(CfY%8+3-~pYwSm_U zdJFS+6#M{qL!fsu9+9mBZ#U?@fc}Gb&vha%E#QrUKE(W0!aBGDym8Pc8IQ=W2XFB* zqy^xm7K9*N170WSEP(j=$^t>S4!nNQTLAk?hfAIS+yvfE(0c*ovCbVXxedHg(1!qn zpb7t9z&ir^7~mD~isucNd<(n@(9>%b*$8;|g0~y=nz~#*9s;iubQUoCjNy`nfXBca z1ic+Vo__HD6TG#{QE!(P2~UA0{O7<6f?fkCpFdpU1pJbO2RaKN&ra}u4PHO!Er2&b z6aJgv4T0VXxbn>5lF9|cC4T~MH|V_p@>~mENlTG%0Q6zN2x!7T6TETICje@Fd;~n9 zzDOtqkmruGhD$C2uMBiK;Azl={~7QspuK>;g~KH`16<(Mf{p;l^D1~%;H?Fn0Qk>V zWE;Ti13ds(ea>*nTEJ!CZ3Vp@K%O1oMZwzzdJo_PXu`i5ynUb#0M?#6Tyhm)19)Sg zj{?+u{3CeBL7xOnzz>n#0-mV>eF3n$Y`Ek>z*oUDgI)|E&xPj=m)r%O6Lc7m22J?) zf)@cD1H1^{8-Nk;(x5j3$g}$V;gTPLHwbzg;BL@_|1@|zKo0|Ee`L7i0>IC~8v(r^ zK%N`HI||-G(1!t)<}b}9@LTX|8&L)T`=a5J=@$%_ybazy&<6nISq zp0~kk0Iw5t7Eu3jMfS7c^@H957`os~a|y)38v?x(K%N)i_Zsj_O=uf{c^4|O{ori{ zy$7%cybXYV2CoUa&FHxkZsbva?*n}RFb-I>sz_)AWB^+M_W_;&ybV~e8toCV25>!K z7vLGdalpdMiiG8W1Yjp%FW?~HDBvx?>{cbtzhqn&BF?2OULIcyUO(gW_&30NgzBc5qJ$^=jY$N+`_`vF2H z>H@G9uobWu@G9W^F0@;~I>0S}`vETjF1QN%9NW`Ku8t|Za^Ba4KM%hScv&TU z9=`xQKjZWG8t|@Vd>+38yaySd#}9#bg7JBLK`-o30C{-49=rtO^Y|^`-2)h9ZhHDf z@ZVu>JicfHbSHp3JbpQN*D^kj4}mwr_&okRcyBR2k1yN^Jqu_C+yyuYH~~1P4|Ww` z5bz-21i-ur?HaHduoG|q@D8BzTJ&?k-GHY7v#*0cKn8Ft;BEkU{*rO+MVyCOygdFk zc;|0c(!=9U@R}K)$FBnKX2$379pLR_d>(%hypxR2<7NK9$yXK2FB;{ZQ$); zd>(%Wyf+x1$LC*PBwPrP0AWA`uny1%7zEr2xCgKo@C@Kpz&n6>H^4>*SOLocF+d;S z7Qha`!+@s%t9u=-ei{a zuVBk29CX$l#D{R%E_^iw+iU zq`s?N;q$RIzh{a1R5aF%@7{Vd9dRz64n9<*GFDrc#8GR>4ka0U9)k5P*-T43TOUuZ z&vxo_NL}G%$gjzyx|^yxqZ#6w(ejqNcOspa4jNXdXT4!qRf&S3@OcT=VjVaUrv;zb zqz@^wqWvlyRu;s!W$9?PgXShpGON|6>SJjfpI^qq?88fZgsBEK$!BOCR+aH_p7Isu zR6fhwV_BLB!x(Ea@i<=zd>yE%YK(8>y>QK?0ZZOhiD*v`mzTO8wAfT;Q$sX~pLTLDk(zIOiHpWn1ED($ZA_OH*jf(PUi= z#}|^Wg_WB$UXyC{@2bnLb+^j#&*e&14|6 zDvh%dT92locDwL|rGF{ntOBQ)nl4H|Cq%N64aypHxNj2fjMl$rG z_(MHCUF%scT?QWbI*)L2c|mKff-6ayre&FEy0fdJP;&`t?ncce*o3>8&@Ku}Ywm{9 zE!kK{HZz63Q{AVQj#TyH^xkgv89#CwSH^Q?d{V=Jy+S|p50diIVvZ;uV-qIn8C~i2 zOsrrZRo#t}L&L-gvdMyFfjAX+Bk>@#b25Px7Kl9OZYWJY$}SYK5L8@^1XZ_4D4oWa z{M1AYwsfX8>Ux(Gy-OK-GzVH@O2~QA&Apr@V&JYE20$E?o}$^4nt{Oju7PZwYRl4I zM(daPQknoEPNl9`X|P5^B@|^v#z&}klBxnBlY)VX8cj^)C!VcIb@Xb%XeG?0u!P(P1$B+wk-8u`EYPRXx?$&|O49L6wkuBiEvyM` zoUOr5Qf2g>97i+WEeywe;!sekF_rDYK`h$qcv>_tKRDhBq>Oql&^E{mbX;rxM(sD> z5}2Hig0GSWwN>7ZAzSGK2FWH$$S4H`UqRn<3|#mv9Z+XD>Uw=ng9Sset6&V|*ZfpH z(=ZI2N2KtplhJl;BvzY`mNO%%yh2uea>FVunex7LxhS$4AU}M05jsfnSJ%CM3R58G zZakusGnxw90*dQYk`eWwCz=+;Kh#sQw~kCFk@RVuy};a(=57>CPMQtD%y-aeJkvtb z`OPbAE<~;+R7I2IV5yd_YpFtkeJSpq(0gMO{NClrS!90>2UcrRD1=}uK8VoyL7rZyRBfz%2-$3N8U`B zjq@A6Merq~njUKRF|H@voK6fG)l-3#Dy5)$G7hOOxq-dgP3;f44#ziib;L<7<9#%0 zYCaW+o0xs9KuEwwgMY!=Lm4c^jBJdSRTrLuJ`0#x1=4hCGs3ux6mv;un;F*j6vkYE zG^rAtEoK<<`!M_p#5l?LE8y?_8gRyCcQMrDT7apSpaU>5MXx~r!PLq92~Q}{eB8`?1Mjcoquz2%`cPOd#83DfBku5>Qz ziYW^r`f-Bu6G^4jKnj#WeSF<1;t6M>>s5;#7OOHi;AKYT7pMueUalsHVQ!QHqNWjk zT{n3_nxe(#b*mtTrYYx?GBp^0qJxmzM)XeD>Kx!pd@CX3Wy3pB1_zjgcaBI znZj+1NKH`MT%+x&-a^y&Irl=+9awIQ7g~BCDOTK##NirGZYU^B;#S;^gsE#^x;-&P z+^A#XZX}M`b{qhV{W=ATE$2S9bcBY3cfsKQW_m0aTP{49eatYyMBY;Dy~x=TTH15I ztNY>|y~-kOTN|_v{G|4~Gy9&!3G?k(~=WS&(VJj_F zi*d5-?1#=dP#c1>1q)bqfRHr2| z=Y3@}T`(nzk!qwV>X~}1TUXtk&eAz}HJMYCK*4saD}kw7udW5IY+f4ei8DJHn{Bed z$!ZPBTj6zK-viJZ1!q=9)Fr6gKi8>YmNI*kR68jvaxYR`0KB1lA32?Al@ z8rLY#BB3Ho*sd%Va;7|?QZ$e+B2=J|$@!?uKtFWH^EfSC>wC$97}=FW0wU>K+S}6+ z&0uvgm8tH-?t~PJVJWU!zor-aD41UyFVYrDMq^zn12kUz={i=XDvF&#jZAV`Jc;G1 z485$GmPj;BZiUFy#5+2pwYZyIxCpX%t5Ys;XiRn2;1*ZK`)asgk~^N+5G6;s;8KVv zj+_(Pu(s9?yi3H#V2hOt040fvwdaFAb&m1I4TOx%Qon>emAp&AnAQXX00g{p^D-6O2iIG}Kp zPnzVP{L&4(2$|p{cHs=PW@ta$6I*_bvcg{8o{VE{zqd;mhg(|}*$_&0wVm&PtoGsHFsmER44QBOjejruxtvIM}HIKcU=eBwm~s07AJv#hY>F(pzsMs-MX@=C~?6B&aB+J zWo@D~=+7X1rd4jO-3EaDP zwt%yT@Qo_k+{DX*5CPr_SamzT-2;3bu=Pv$z6QTX0BeB@_+5nGX92Z(H-YO>C6|-6slXQo3Wp>CA1{o z7e_Bak5#%EzBM4bR$&}W+W$p#mAYA6UB#y>*rzZbb$)YU=;t+06^^!8Kn4?Kr|RTg zr_?Mqn$YXZO6np#z0w5P!K47S$ho~2TF_mS=Uw^y=hCj&(uzII`=DDTJG#=*1Y738 zR~K<1$g!Da0On+S_Y|qa^trlnqNO6utI1S8Uzs{#i1L1*w&@BA}1A}2WbMF1q;VjSszHI?+5uF+=*{q zp3zGA4Gi=%`du3S;2@(*Hlh><2az(xT@W^I+$acXl{&>Q35A1cz>S~;{4)R_0|feo z;v4o&f@$yW6LN3__(|c0ckkNr%c1MM?oAcf1ZJIa@kQrGnrbZUCaxJ&2~Q_$wbOnm zOv9?~w66&>=mPMx(&CxQYVowTqLM1Sh+%*8%n~-(&%g{@DpNA6Be67_tigvJr8RiX zTtYsEgOOTtMz|Umb<{`Ns%k^cE!7cR(pXfe0of;n?bJkzyKk#EUvO2p>~)5&(SlH84g^HwBc%Dmf(3^q=h<|x6pknbr< z=4|X~i1u}LW4w%&tVq($(R2@+Q2l({vI|Q^LL=P_Oq>YNB7MiBVP) z#XYPdiqF&PVPS>x@@>xIJ<*Kf#D=7vT+l@{tC;O7$-6HO_b_Vv^K#{5H$iFv&#a*L z3Tol-*9@Yxb1BTfHBytGTfyHZ$@%B*jMO~Ot{~PDy-1StsoV{zd74>4FALOC#N8dp zrzdw~r6x&&XE!2h(z;6$`4F^AEVTe;RaKC0fHKLbCZB&9A}_99k*P_WA{7}jrIXQw z^KMP#W%Do0)Iyk7k$0z}7LLJHi+pJ6RhwEkrV4fiqZUHmos7IJ%7@hmy@*i@VqR56 zG||zUh-S>hK?}&};>N<^Nm_VkR8^=EO%;r7BpFkd6koT(Ei}EGu--(}Q#UM0e4s7VLadjOJL}Tv3h1VcbE= z^?dlUIU;K#xfa5%dDWz6R**^0oXX*E1mz=E zZ-mtZODdF`LbXWqZVp9p(TCVB`3H-as_QqHc@vePj1Hg0svUFwG}Vsjm_COtIWj|} z1jb7u+Hv(xwu~4RW zQ;VTkm?XBMH=FLwF6~N|Oea=DDHUaFs8$0 z`X|j@p-HWp=8#HWqSoy_%JVF#+ua1;@Y<}PU?RE2N9Xa9d6{-46s4UJ6Idw={#FCN z6#nq{SPG_0yK;#`F8}&F9QZP*Q(r3no?1d_rk%7O<=P6oRk7_q<%>>YYxTm%7&#llQ!~|;o>4FYuwVbqS1`|W}52jYU*&iPDs}c{~V(X|B7ue z%FI^wqu1ay+%$*U5o!97r^$3#Diga5U;EE85l7PHi!p7dtF>wCiuh_PF8V9i+E0$< z*P75uEAu;;@_WCv_BU52#UJ*hzp0+2-JhfA!CKm(<}*EL*DQg*xE@rDw*E(;{1lbA z>N}ct6n}s*p6gL_vr%FwFUQBUUF$aS%FuKwW%%8YIlc~CUU1PaHZzzzdb@G7L^rWB z$@^x)jHUJ^W?3|EGLs#FOU#liNlRqv6bd(+d*VPl@S-1en>WNeU&Bj(%G|-`LChPX z9j~Ppo8`q0@!`d0_+MgPMGo|dnz7rZ1IL5C7Byo>%X+-fy3JUxH)9tIUc1&~3ktdE z*Br-uiaCY@8i=+}Etygml!h8x>fYP@=kK{!fKvJjU~Y_NGO3MuZvyX0N0S+8)xx3{ zhGKRRbBw(#QCqXPf;BMBz?k-V;R70J|9rNl(heK$Eh%7YG7E!Qn%Y>U_AsRYrk$aT zS!x&C{ns`%LJwfjQb#IuvDGx2&yD{%OpSAJ8y+qeZ8V3g%~iN%Z&f|DI;L#M?{6-D z>epG*x}Lgh6!T5Oduq*CEuB=064jH_KCRSZrP7XzvwtR@>!E{Okm;ab{q@X7#lpXEh-egMD{996{C~|KwSGSl~u2MT{b)y;oo2!@A zHQ={p75rd;S-s)|sQwS?B|%lZR;9~ckoU4M?XUQbr_}X_?|6pqc$)o?cXOoDag~Xx zkN-VRPt3}+vzsz=78G|;CZGTB{5?)lm1NrKwV-UW7CU5$1haWM-6=zM^sr4os`H1x zQ`H1IZo=AA%78PA}5v*#V0I8}?q|-Qc~= zyUY8S_XY2p-csL1KELlWU)uLizPo%s@E!8K=9}g}&;J>Jwf}Se@B8=r|DXS5|J(jE z1C@b5;DG!K`DOXnalds$toK_Vw~kw1 zw+gnIwr8zJtP|Gxwu@|QY};(RY<}*#)8dWd*TmbzUE;&yv*MHD5%CRij`XfrCS5F5Ne-z=YL~8) zQqrJwr}TjIZ_+;L8R<9DFQo}-w)_eCT-hQol`of5a-aMU@{RIW$=dr z%)P<=ZM4C89+T%{&u2Yf_dMv??Rmyi23A)dUtwX@)r3%=^OOD;Jd+J9{6zp zTkhz-r=;a9aYVdAx=T7wzFMAd{hsx5+q<@%_BzMw4%zuF=O3NJt}77oqaK&H%3JGQ z@4dtObMMREac_yw?%U-1Ji`1p-}Aon{Gaew`j`1P`1kln{X$@VpggcRur`nm3g0K&Hy}|P}&qJPPJ-_wL@qQ8^wt27fe%1S+_gU|+yk)*R-?hFG-w%C%@{Rg` z;%^OX4BQd;Uf@vR&A<-JZp*0UkY&tr($Xp(6uoFk328uzNt>lDQdZg~jY`F+vqAZO zS+IK1Beq%hSWj4kwga{!wiCAL_LH_!`#$?2`?&qMeZnp{td3eo%(2FiaO`mGahz~m z;p|2U3$7Win_YLg9&x?kddoH2?QkDPKkx96!rG1W?*U(MSGeol8TXL;5%)Bdc{$4b zR?lmmH$3x@qdxC2~RR(gEpZ=_1)LUnXy}{)_cq z>yy_1vi{L}w(T>v&)L@6vbI~%OCPr#w!LMWZ@<_cwqI%Qv)^tXwm)Hi8Eqoz=y80( zvD5LG<3-0G9c50Nv)P$)egn1i5c=*km&vurb*Zb#)#wl+qw2dc9*@$em_d*GmdqRuRET1)S^Tl zbYAR^xkV2G+p4tJO_n<>*P@s26=Sx4w0*<&1KXI*YhP*awBKOA!+tNc%bWJOj!!!L zXu%1`=MmCA$IB?;KR6aSMQ4rk3TM`NtMduh5%l7P?j`P8_uKBXJu{#=7kh3-{a5=3 z{6F%a^e+lH0}1Hg*Pwre9k>evKg-d-uk+mI`HtsDXhSDFChvvbMsEw+<=4EU-k*5? z+dJJC@P&PAe4Bj_`SwDqF7TfVo!afs_-{eW{E7d+{hxqF4F>uHLxCRzUP9P2Epsdl zmM+UpmT#cGUbiH~Ys6vk-^G{3aq*+lh0;3dYUx(#9_d+WOj;#(K`-4WKOjFT|Cjtn z`D|;*S_AEyh3@^f_50SeZNTf7FALMZ-FPyglZ7%J-u0SH3^`ru)nMANSk*et$E@f|S3{zs3I*|9AZN z`=6kr!ZGx)S%JF1sz6tuH}Fq^uLQn>e)8kMbAkC5za?S06Mf|^OS#xA_KWw4H(P&Z zJ#2l)It?Si#kP9eN?VVu&vqx$`Izkq+qmsD+id&C?U&oXVt?3v*#3_FW6(Y89A9+o zhVChHe%kq2=S|LkcmBdT%Vl##UH|O*zUvjw+a8PebKZpaHSZhVMLrKS!8YG6-@QK4 z$;m$ByM23n_hD4~jqelwsQ(}QX{7S2fv*R?8~9n^ZH%a2w0_n4UF$>E-y>D$+CE`( z*s5%o**a_+ZJ)P&)%GphL$)8;29O%F!|TX81|8cS2OZ-M!FiVRT&LSP;5_1txi-7D zx`tc_Tt{8=+^z1Y`zm)2#;Tj#2i!K#GEakNwdZordQU%E$}c=k-kZ=qws?Prkyr42 z#5d1!zGaEUZRxSxVEMA;o0bPKIy?)_{ifwzXvB|+vKSCs#5S=eD?KXxr!)s+*Cnz;z7&1?YI&plMft1pcjbrV|CE0w z|3?13JjZ&j^%ASYda3m?>($ncR^gx^jKVszA~!+wiF)+qR_B$@nDZ)U+PT5G*?FUL z5WQrZ^G@du=iSa>=lvL=A93z?KIJ^Ha$8txLV>R?%yQ9;QMA=^J=y%-g*y6a|G359L zw97rH_Xiz&9gjOk9Zx$BIbOi{^NQn`;|<4z;~mFz=WOSE=Q++r&I_HD&LvLC=Ct{3 zVT@i)w$-pR+HIY-BsAHzwtm~qwk@{XZ9~uyJ8k#acH16=1@gFU)b_OPknII%{3BI||LO6wA<6}D0k zy|v!jY;Cn(X^mO0vZk#YtedSjS_iGSV#K%;z4&hHFs!H%>m%0v)~BootT~%sZU@Nm-U@J#&S|V8`w-l6WqLM~ zheeWvJ#sCqk(*(Q+zw0R8?Zy}kw1-g++^vnJZ^akBhB-c!h6<-yPi*Jc1#bU`M&65^N=Sya(LK2SP&NuY;U?3cb1v&$LfkEii zU4fCnXkaWb9+-fBJ>A@?_LO2v9hP50T~=BbqrM{0ujM`~^m@b>^9}g6L%SUC9rca- zO#V{;V!y@T0T|6PaEeg_1sZ?4Zl}Q&!<*-;Sl3nsjOQl+=QHn^HOKaa>?OIHh zd6tE!DYK=*ve+V7oY2x?%W~A*YRei+JGH2@mTN8jmYXeGEVo;RFcR&w+yk5ELCap$ z?WpBx*gh{W}9XcgUJP^=N_q4itEE5(?26|C_M z;$~4eE(m?lHI=latbV88>ksOK%6A{$Pe%O*{0C`CANC*dAN7y>kNJ=L5203$`A+!W@|!#h zJ!XvQPEXj={?eV?5RH2AV!*9t`XNLtnP8wgv;bEb62{Zuw7c+eeMDGR`+)IF83by zK8!wN?xXJG?vw6A&_>6giKasfErJHJLi^N1^TeQaHbdiVgSHulrr8fIa~K-t1hh*j zG)uY7V)NQ+Z4uan35?VOwyn19undP`%O12Hr`Bvaw4@alV#FSUPTUH8xC?gTUW^0B zV82a=?k{tgEM=BTw6$7GD_U5eWf1LZmt_R4X$(4I!eWAEs1%*h2d!c!w7{S^guXu_ zj-tnpixZ*={h(5EqV=~*ozQ55(h&662rTU}X`rKe$`{!ThW zJ_}>%M`+kyyqS@3`{$xA6g3GCO_y z(XI~rj-YMf-Ho-BPS~ye&Mjysqj(EDhIfTBSlnh;Iat zpzW-2t#!rFf)cK@D~oot+12kFKx^6p+hrTt)OObnywC1(4ZC)`_Mm<3b?tNQM=Lwv fI_Nrtwssg+vS4A~Vp*m`layMJ^$(v9s098$C87cH literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.res b/Esergui -BDE utilizando API/EserguiBDE/ESERGUISA.res new file mode 100644 index 0000000000000000000000000000000000000000..21b593b154c9838b3c05ae2c2795ba8639633394 GIT binary patch literal 876 zcmb7@%}N6?6ot>U0|O%3g?ne|vTvYbAQ4et#YG{@xr;yp73Oiq~#FNZV zXRsii_9VIU-Fp)P0f3SYp);2=eJuvQWKNdYYISx#B;9aP(sy)*oFm1W(-MGxh;$Q2 zE@?sAwgmAIaSGkUu{&2l^-k4pM}1qdQhBO2PfgQ!zxVqICmp%@Xf)}_-OlM5H(JfO z*LrLD>-!s{blR^tr2U=m^NW4j-x#e!)X0@qR&DH&E4AG?j9f>~c&KOooU1u!{*1@| z+Dz(We;NBb$9jV!H%>WW+@Ie$uZSmHa$=+lt{o-0fQlDT8%lCv_zxblr}cf@-Jf&P z$07CizK;vbTlAhM>o{Po1>T0}k2!Xkc**rC7yN!nU(>gOMb-ZDGPF4Qlj{Sja0OsZ ghj4*s+~W~1^aEZw51PJ<_!=^lWu9I|d_@_40BQyg*#H0l literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/Elemento.dat b/Esergui -BDE utilizando API/EserguiBDE/Elemento.dat new file mode 100644 index 0000000..c5820b0 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Elemento.dat @@ -0,0 +1,71 @@ +1 99 SER 001 1 SERVER 001 002 A +2 99 SER 002 1 SERVER 001 002 A +2 12 PLC 001 1 PLCDRV 100 001 A +2 10 BBR PEN 1 BBRDRV 050 001 A +2 13 BAS ENT 1 BASEPE 010 001 A +2 10 BBR PSA 1 BBRDRV 050 004 A +2 14 BAS SAL 1 BASEPE 010 001 A +2 01 BBR AUT 1 BBRDRV 050 002 A +2 10 BBR SAL 1 BBRDRV 050 003 A +2 11 HEL 01I 1 HELDRV 020 001 A +2 24 HEL 02I 1 HELDRV 020 003 A +2 10 HEL 03I 1 HELDRV 020 005 A +2 17 HEL 04I 1 HELDRV 020 007 A +2 19 HEL 05I 1 HELDRV 020 009 A +2 11 VEG 011 1 VEGDRV 020 001 B +2 11 VEG 012 1 VEGDRV 020 002 B +2 11 VEG 013 1 VEGDRV 020 003 B +2 11 VEG 014 1 VEGDRV 020 004 B +2 24 VEG 021 1 VEGDRV 020 005 B +2 24 VEG 022 1 VEGDRV 020 006 B +2 24 VEG 023 1 VEGDRV 020 007 B +2 24 VEG 024 1 VEGDRV 020 008 B +2 10 VEG 031 1 VEGDRV 020 009 B +2 10 VEG 032 1 VEGDRV 020 010 B +2 10 VEG 033 1 VEGDRV 020 011 B +2 10 VEG 034 1 VEGDRV 020 012 B +2 17 VEG 041 1 VEGDRV 020 013 B +2 17 VEG 042 1 VEGDRV 020 014 B +2 17 VEG 043 1 VEGDRV 020 015 B +2 17 VEG 044 1 VEGDRV 020 016 B +2 19 VEG 051 1 VEGDRV 020 017 B +2 19 VEG 052 1 VEGDRV 020 018 B +2 19 VEG 053 1 VEGDRV 020 019 B +2 19 VEG 054 1 VEGDRV 020 020 B +2 19 VEG 055 1 VEGDRV 020 021 B +2 20 VAL 001 1 VALDRV 020 001 A +2 20 VAL 002 1 VALDRV 020 002 A +2 20 VAL 003 1 VALDRV 020 003 A +2 20 VAL 004 1 VALDRV 020 004 A +2 20 VAL 005 1 VALDRV 020 005 A +2 20 VAL 006 1 VALDRV 020 006 A +2 20 VAL 007 1 VALDRV 020 007 A +2 20 VAL 008 1 VALDRV 020 008 A +2 20 VAL 009 1 VALDRV 020 009 A +2 20 VAL 010 1 VALDRV 020 010 A +2 20 VAL 011 1 VALDRV 020 011 A +2 20 VAL 012 1 VALDRV 020 012 A +2 20 VAL 013 1 VALDRV 020 013 A +2 20 VAL 014 1 VALDRV 020 014 A +2 20 VAL 015 1 VALDRV 020 015 A +2 20 VAL 016 1 VALDRV 020 016 A +2 20 VAL 017 1 VALDRV 020 017 A +2 20 VAL 018 1 VALDRV 020 018 A +2 20 VAL 019 1 VALDRV 020 019 A +2 20 VAL 020 1 VALDRV 020 020 A +2 15 TAQ 011 1 TAQENT 020 011 A +2 15 TAQ 012 1 TAQENT 020 012 A +2 15 TAQ 013 1 TAQENT 020 013 A +2 15 TAQ 014 1 TAQENT 020 014 A +2 15 TAQ 015 1 TAQENT 020 015 A +2 15 TAQ 016 1 TAQENT 020 016 A +2 15 TAQ 017 1 TAQENT 020 017 A +2 15 TAQ 018 1 TAQENT 020 018 A +2 15 TAQ 021 1 TAQENT 020 021 A +2 15 TAQ 022 1 TAQENT 020 022 A +2 15 TAQ 023 1 TAQENT 020 023 A +2 15 TAQ 024 1 TAQENT 020 024 A +2 15 TAQ 025 1 TAQENT 020 025 A +2 15 TAQ 026 1 TAQENT 020 026 A +2 21 ACC PA1 1 ACCDRV 100 001 A +2 21 ACC PA2 1 ACCDRV 100 002 A diff --git a/Esergui -BDE utilizando API/EserguiBDE/Enraf.dat b/Esergui -BDE utilizando API/EserguiBDE/Enraf.dat new file mode 100644 index 0000000..34890a5 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Enraf.dat @@ -0,0 +1,31 @@ +TAQ 111 T-11 +TAQ 101 T-101 +TAQ 112 T-12 +TAQ 114 TK-114 +TAQ 373 T-13 +TAQ 360 TK-360 +TAQ 241 TK-241 +TAQ 372 TK-372 +TAQ 113 TK-113 +TAQ 101 TK-101 +TAQ 362 TK-362 +TAQ 363 TK-363 +TAQ 364 TK-364 +TAQ 365 TK-365 +TAQ 371 TK-371 +TAQ 005 TK-005 +TAQ 221 TK-221 +TAQ 231 TK-231 +TAQ 115 TK-115 +TAQ 351 TK-351 +TAQ 352 TK-352 +TAQ 353 TK-353 +TAQ 354 TK-354 +TAQ 355 TK-355 +TAQ 356 TK-356 +TAQ 357 TK-357 +TAQ 358 TK-358 +TAQ 001 TK-001 +TAQ 002 TK-002 +TAQ 003 TK-003 +TAQ 004 TK-004 diff --git a/Esergui -BDE utilizando API/EserguiBDE/Esergui.cpp b/Esergui -BDE utilizando API/EserguiBDE/Esergui.cpp new file mode 100644 index 0000000..7f1ae50 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Esergui.cpp @@ -0,0 +1,3283 @@ +//--------------------------------------------------------------------------- +#include +#include +#include "Esergui.h" +#include "stdlib.h" +#include "stdio.h" +#include +#pragma hdrstop +//--------------------------------------------------------------------------- +// class TAutorizacion +// { +// protected: +// private: // Declaraciones +// DatosAutorizacion sDatos; +// bool ComprobarCaducidad(dbiTabla Tabla,char *Campo); +// unsigned int IndRegORC; +// public: //Declaracion de funciones Locales +// TAutorizacion(void); +// void CapturarFechaGen(char *pszFechaActual); +// int ComprobarEstado(char *Estado,char *Valor,char *Campo,hDBIDb hBaseDatos); +// int ComprobarConductor(char *pszCodConductor,hDBIDb hBaseDatos); +// int ComprobarCisterna(char *pszCodCisterna,hDBIDb hBaseDatos); +// int ComprobarTractor(char *pszMatriculaTra,char *pszInternoTra,hDBIDb hBaseDatos); +// int ComprobarSuministrador(char *pszCodSum,hDBIDb hBaseDatos); +// int ComprobarPedidos(char *pszCodPed,hDBIDb hBaseDatos); +// int CalcularPesoVolCarga(hDBIDb hBaseDatos); +// int ComprobarPesoCarga(hDBIDb hBaseDatos); +// int ComprobarDistribucionCarga(void); +// bool Cabe_Cis (void); +// bool Capacidad_Ok(int n_Prod,int *psnCapacidad_Prod,int *psnCantidad_Prod); +// void ActualizaEstado(char *pszEstado,bool bActualizaOrden,hDBIDb hBaseDatos); +// void BuscarNumeroViaje(hDBIDb hBaseDatos); +// void RellenarSIMICCAR(dbiTabla TCAR); +// void ReservarMemoriaEstructura(hDBIDb hBaseDatos); +// void LiberarEstructura(void); +// void LeerEstructura(DatosAutorizacion *psDat); +// void InicializaEstructura(void); +// }; +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// Constructor de la clase Autorizacion +//--------------------------------------------------------------------------- +TAutorizacion::TAutorizacion(void) +{ +} + +//--------------------------------------------------------------------------- +// bool ComprobarCaducidad(dbiTabla Tabla,char *pszCampo); +// +// Entrada: +// Tabla: Tabla con la que se va a trabajar +// Campo: Campo de la tabla a comprobar +// +// Salida: +// true: No ha caducado +// false: Si ha caducado +// +// Descripcion: Comprueba si el carnet de conducir esta caducado +//--------------------------------------------------------------------------- +bool TAutorizacion::ComprobarCaducidad(dbiTabla Tabla,char *pszCampo) +{ + bool bCorrecto; + char szFecha[TAM_FECHA]; + char szFechaCampo[TAM_FECHA]; + //Obtenemos la fecha actual + CapturarFechaGen(szFecha); + //Leemos la fecha de caducidad del carnet + LeerCampoNBDE(&Tabla,pszCampo,szFechaCampo,NULL); + //Comprobamos si el carnet caduco + if((strcmp(szFechaCampo,szFecha))>0) + bCorrecto=true; + else + bCorrecto=false; + //Devolvemos el resultado + return bCorrecto; +} + +//--------------------------------------------------------------------------- +// int ComprobarConductor(char *pszCodConductor,hDBIDb hBaseDatos) +// +// Entrada: +// CodConductor: codigo NMT del conductor +// hBaseDatos: Base de Datos a emplear +// +// Salida: +// Error si lo hubo sino un cero +// +// Descripcion: Comprueba si esta borrada la Tabla SIMICCON, +// si caduco el carnet de conducir y +// si caduco el ADR +//--------------------------------------------------------------------------- +int TAutorizacion::ComprobarConductor(char *pszCodConductor,hDBIDb hBaseDatos) +{ + bool bCorrecto; + int nValorDevuelto; + dbiTabla TConductor; + + //Inicializamos variable de devolucion + nValorDevuelto=AUT_CON_CORRECTO; + + //Abrimos la la tabla de conductor + if(!AbrirTablaBDE(&TConductor,"SIMICCON","CONNTMCON",false,hBaseDatos)) + { + //Busca cadena de entrada + if(!BuscarValorExactoBDE(&TConductor,pszCodConductor,NULL)) + { + //Vemos si esta marcado como borrado + if(!EstaRegBorBDE (&TConductor,&bCorrecto)) + { + sDatos.bBorradoCon=bCorrecto; + if(!bCorrecto) + { + //Almacenamos variables + LeerCampoNBDE(&TConductor,"CONNTMCON",sDatos.pszCodigoCon,NULL); + LeerCampoNBDE(&TConductor,"CONCCACON",sDatos.pszCadCarnetCon,NULL); + LeerCampoNBDE(&TConductor,"CONCADCON",sDatos.pszCadADRCon,NULL); + LeerCampoNBDE(&TConductor,"CONNOMCON",sDatos.pszNombreCon,NULL); + LeerCampoNBDE(&TConductor,"CONNCACON",sDatos.pszCarnetCon,NULL); + LeerCampoNBDE(&TConductor,"CONINTCON",sDatos.pszInternoCon,NULL); + + //Comprobamos si el carnet esta caducado + bCorrecto=ComprobarCaducidad(TConductor,"CONCCACON"); + if(bCorrecto) + { + //Comprobamos si el ADR esta caducado + bCorrecto=ComprobarCaducidad(TConductor,"CONCADCON"); + if(!bCorrecto) + nValorDevuelto=AUT_CON_ADR_CADUCADO; + } + else + nValorDevuelto=AUT_CON_CARNET_CADUCADO; + } + else + nValorDevuelto=AUT_CON_BORRADO; + } + else + nValorDevuelto=ERROR_BDE; + } + else + nValorDevuelto=AUT_CON_VALOR_NO_ENCONTRADO; + } + else + nValorDevuelto=ERROR_BDE; + + if(CerrarTablaBDE(&TConductor) && nValorDevuelto==AUT_CON_CORRECTO) + nValorDevuelto=ERROR_BDE; + //Guardamos el valor del resultado + sDatos.nResultadoCon=nValorDevuelto; + //Devolvemos el resultado + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int ComprobarCisterna(char *pszCodCisterna,hDBIDb hBaseDatos) +// +// Entrada: +// CodCisterna: codigo NMT de la cisterna +// hBaseDatos: Base de Datos a emplear +// +// Salida: +// Error si lo hubo sino un cero +// +// Descripcion: Comprueba si esta borrada la Tabla SIMICCIS, +// Comprueba si la tarjeta de transporte esta caducada +// Comprueba si el ADR esta caducado +// Comprueba si la ITV esta caducada +// Comprueba si el Seguro esta caducado +//--------------------------------------------------------------------------- +int TAutorizacion::ComprobarCisterna(char *pszCodCisterna,hDBIDb hBaseDatos) +{ + bool bCorrecto; + int nValorDevuelto; + dbiTabla TCisterna,TTRP; + + //Inicializamos variable de devolucion + nValorDevuelto=AUT_CIS_CORRECTO; + + //Abrimos la la tabla de Cisterna + if(!AbrirTablaBDE(&TCisterna,"SIMICCIS","CISNTMCIS",false,hBaseDatos)) + { + //Busca cadena de entrada + if(!BuscarValorExactoBDE(&TCisterna,pszCodCisterna,NULL)) + { + //Vemos si esta marcado como borrado + if(!EstaRegBorBDE(&TCisterna,&bCorrecto)) + { + sDatos.bBorradoCis=bCorrecto; + if(!bCorrecto) + { + //Almacenamos variables + LeerCampoNBDE(&TCisterna,"CISNTMCIS",sDatos.pszCodigoCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCTRCIS",sDatos.pszCTRCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCODTRP",sDatos.pszCodTransCis,NULL); + LeerCampoNBDE(&TCisterna,"CISNOMTRP",sDatos.pszNombreTransCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCTTCIS",sDatos.pszCadTarjetaCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCADCIS",sDatos.pszCadADRCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCITCIS",sDatos.pszCadITVCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCASCIS",sDatos.pszCadSeguroCis,NULL); + LeerCampoNBDE(&TCisterna,"CISINTCIS",sDatos.pszInternoCis,NULL); + LeerCampoNBDE(&TCisterna,"CISTARCIS",sDatos.pszTaraCis,NULL); + LeerCampoNBDE(&TCisterna,"CISBRUCIS",sDatos.pszBrutoCis,NULL); + LeerCampoNBDE(&TCisterna,"CISCAMCIS",sDatos.pszCamionCis,NULL); + LeerCampoNBDE(&TCisterna,"CISMATCIS",sDatos.pszMatriculaCis,NULL); + LeerCampoNBDE(&TCisterna,"CISMATTRA",sDatos.pszMatriculaTraCis,NULL); + LeerCampoNBDE(&TCisterna,"CISEJECIS",sDatos.pszNumeroEjesCis,NULL); + LeerArrayCampoBDE(&TCisterna,"CISVOLCIS",sDatos.pszsVolumenCis,NUM_MAXIMO_COMPARTIMENTO); + + //Comprobamos si la Tarjeta Transporte esta caducada + bCorrecto=ComprobarCaducidad(TCisterna,"CISCTTCIS"); + if(bCorrecto) + { + //Comprobamos el ADR + bCorrecto=ComprobarCaducidad(TCisterna,"CISCADCIS"); + if(bCorrecto) + { + //Comprobamos la ITV + bCorrecto=ComprobarCaducidad(TCisterna,"CISCITCIS"); + if(bCorrecto) + { + //Comprobamos el Seguro + bCorrecto=ComprobarCaducidad(TCisterna,"CISCASCIS"); + if(!bCorrecto) + nValorDevuelto=AUT_CIS_SEGURO_CADUCADO; + else + { + //Abrimos la tabla de transportista + if(!AbrirTablaBDE(&TTRP,"SIMICTRP","TRPCODTRP",false,hBaseDatos)) + { + //Busca cadena de entrada + if(!BuscarValorExactoBDE(&TTRP,sDatos.pszCodTransCis,NULL)) + { + LeerCampoNBDE(&TTRP,"TRPCIFTRP",sDatos.pszCIFTRP,NULL); + } + else + nValorDevuelto=AUT_CIF_TRP_NO_ECONTRADO; + } + else + nValorDevuelto=ERROR_BDE; + + //Cerramos la tabla + if(CerrarTablaBDE(&TTRP) && nValorDevuelto==AUT_CIS_CORRECTO) + nValorDevuelto=ERROR_BDE; + } + } + else + nValorDevuelto=AUT_CIS_ITV_CADUCADO; + } + else + nValorDevuelto=AUT_CIS_ADR_CADUCADO; + } + else + nValorDevuelto=AUT_CIS_TARJETA_CADUCADA; + } + else + nValorDevuelto=AUT_CIS_BORRADO; + } + else + nValorDevuelto=ERROR_BDE; + } + else + nValorDevuelto=AUT_CIS_VALOR_NO_ENCONTRADO; + } + else + nValorDevuelto=ERROR_BDE; + + if(CerrarTablaBDE(&TCisterna) && nValorDevuelto==AUT_CIS_CORRECTO) + nValorDevuelto=ERROR_BDE; + //Guardamos el valor del resultado + sDatos.nResultadoCis=nValorDevuelto; + //Devolvemos el resultado + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int ComprobarTractor(char *pszMatriculaTra,char *pszInternoTra,hDBIDb hBaseDatos) +// +// Entrada: +// pszMatriculaTra: Matricula del Tractor +// pszInternoTra: Codigo interno del Tractor +// hBaseDatos: Base de Datos a emplear +// +// Salida: +// Error si lo hubo sino un cero +// +// Descripcion: Comprueba si esta borrada la Tabla SIMICCON, +// si caduco el carnet de conducir y +// si caduco el ADR +//--------------------------------------------------------------------------- +int TAutorizacion::ComprobarTractor(char *pszMatriculaTra,char *pszInternoTra,hDBIDb hBaseDatos) +{ + bool bCorrecto; + int nValorDevuelto; + dbiTabla TTractor; + char *pszIndiceDeBusqueda; + char sCampo[9]; + + //Inicializamos variable de devolucion + nValorDevuelto=AUT_TRA_CORRECTO; + + if(pszMatriculaTra==NULL) + { + strcpy(sCampo,"TRAINTTRA"); + pszIndiceDeBusqueda = (char *) malloc ( StrLen(pszInternoTra) ); + strcpy(pszIndiceDeBusqueda,pszInternoTra); + } + else + { + strcpy(sCampo,"TRAMATTRA"); + pszIndiceDeBusqueda = (char *) malloc ( StrLen(pszMatriculaTra) ); + strcpy(pszIndiceDeBusqueda,pszMatriculaTra); + } + + //Abrimos la la tabla de Tractor + if(!AbrirTablaBDE(&TTractor,"SIMICTRA",sCampo,false,hBaseDatos)) + { + //Busca cadena de entrada + if(!BuscarValorExactoBDE(&TTractor,pszIndiceDeBusqueda,NULL)) + { + //Vemos si esta marcador como borrado + if(!EstaRegBorBDE(&TTractor,&bCorrecto)) + { + sDatos.bBorradoTra=bCorrecto; + if(!bCorrecto) + { + //Almacenamos variables + LeerCampoNBDE(&TTractor,"TRAINTTRA",sDatos.pszInternoTra,NULL); + LeerCampoNBDE(&TTractor,"TRAMATTRA",sDatos.pszMatriculaTra,NULL); + LeerCampoNBDE(&TTractor,"TRACTTTRA",sDatos.pszCadTarjetaTra,NULL); + LeerCampoNBDE(&TTractor,"TRACADTRA",sDatos.pszCadADRTra,NULL); + LeerCampoNBDE(&TTractor,"TRACITTRA",sDatos.pszCadITVTra,NULL); + LeerCampoNBDE(&TTractor,"TRACASTRA",sDatos.pszCadSeguroTra,NULL); + LeerCampoNBDE(&TTractor,"TRATARTRA",sDatos.pszTaraTra,NULL); + LeerCampoNBDE(&TTractor,"TRABRUTRA",sDatos.pszBrutoTra,NULL); + LeerCampoNBDE(&TTractor,"TRAEJETRA",sDatos.pszNumeroEjesTra,NULL); + //Comprobamos si la Tarjeta Transporte esta caducada + bCorrecto=ComprobarCaducidad(TTractor,"TRACTTTRA"); + if(bCorrecto) + { + //Comprobamos el ADR + bCorrecto=ComprobarCaducidad(TTractor,"TRACADTRA"); + if(bCorrecto) + { + //Comprobamos la ITV + bCorrecto=ComprobarCaducidad(TTractor,"TRACITTRA"); + if(bCorrecto) + { + //Comprobamos el Seguro + bCorrecto=ComprobarCaducidad(TTractor,"TRACASTRA"); + if(!bCorrecto) + nValorDevuelto=AUT_TRA_SEGURO_CADUCADO; + } + else + nValorDevuelto=AUT_TRA_ITV_CADUCADO; + } + else + nValorDevuelto=AUT_TRA_ADR_CADUCADO; + } + else + nValorDevuelto=AUT_TRA_TARJETA_CADUCADA; + } + else + nValorDevuelto=AUT_TRA_BORRADO; + } + else + nValorDevuelto=ERROR_BDE; + } + else + nValorDevuelto=AUT_TRA_VALOR_NO_ENCONTRADO; + } + else + nValorDevuelto=ERROR_BDE; + + if(CerrarTablaBDE(&TTractor) && nValorDevuelto==AUT_TRA_CORRECTO) + nValorDevuelto=ERROR_BDE; + //Liberamos memoria + free(pszIndiceDeBusqueda); + //Guardamos el valor del resultado + sDatos.nResultadoTra=nValorDevuelto; + //Devolvemos el resultado + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int ComprobarSuministrador(char *pszCodSum,hDBIDb hBaseDatos) +// +// Entrada: +// CodSum: codigo del Suministrador +// hBaseDatos: Base de Datos a emplear +// +// Salida: +// Error si lo hubo sino un cero +// +// Descripcion: Comprueba si esta borrada la Tabla SIMICSUM, +// si esta marcada como borrado +//--------------------------------------------------------------------------- +int TAutorizacion::ComprobarSuministrador(char *pszCodSum,hDBIDb hBaseDatos) +{ + bool bCorrecto; + int nValorDevuelto; + dbiTabla TSuministrador; + + //Inicializamos variable de devolucion + nValorDevuelto=AUT_SUM_CORRECTO; + + //Abrimos la la tabla Suministrador + if(!AbrirTablaBDE(&TSuministrador,"SIMICSUM","SUMCODSUM",false,hBaseDatos)) + { + //Busca cadena de entrada + if(!BuscarValorExactoBDE(&TSuministrador,pszCodSum,NULL)) + { + //Vemos si esta marcador como borrado + if(!EstaRegBorBDE(&TSuministrador,&bCorrecto)) + { + sDatos.bBorradoSum=bCorrecto; + if(!bCorrecto) + { + //Asignamos valores + LeerCampoNBDE(&TSuministrador,"SUMCODSUM",sDatos.pszCodigoSum,NULL); + LeerCampoNBDE(&TSuministrador,"SUMNOMSUM",sDatos.pszNombreSum,NULL); + nValorDevuelto=AUT_SUM_CORRECTO; + } + else + nValorDevuelto=AUT_SUM_BORRADO; + } + else + nValorDevuelto=ERROR_BDE; + } + else + nValorDevuelto=AUT_SUM_VALOR_NO_ENCONTRADO; + } + else + nValorDevuelto=ERROR_BDE; + + if(CerrarTablaBDE(&TSuministrador) && nValorDevuelto==AUT_SUM_CORRECTO) + nValorDevuelto=ERROR_BDE; + + //Guardamos el valor del resultado + sDatos.nResultadoSum=nValorDevuelto; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int ComprobarEstado(char *pszEstado,char *pszValor,char *pszCampo,hDBIDb hBaseDatos) +// +// Entrada: +// Estado: Estado en el que se encuentra +// Valor: Valor a buscar +// Campo: Campo de busqueda +// hBaseDatos: Base de Datos a emplear +// +// Salida: +// Error si lo hubo sino un cero +// +// Descripcion: Comprueba el valor del estado +// +//--------------------------------------------------------------------------- +int TAutorizacion::ComprobarEstado(hDBIDb hBaseDatos) +{ + int nValorDevuelto; + dbiTabla TCAR; + DBIResult Error; + int nNumReg; + char *pszCARINTCIS; + char *pszCARINTCON; + char *pszCARINTTRA; + bool bEncontrado; + bool bBorrado; + + //Inicilizamos las variables + nValorDevuelto=AUT_EST_CORRECTO; + + //Abrimos la tabla SIMICCAR para saber el Estado del proceso + Error=AbrirTablaBDE(&TCAR,"SIMICCAR",NULL,true,hBaseDatos); + if(!Error) + { + //Pedimos memoria para la variable temporal + pszCARINTCIS=ReservarMemoria(&TCAR,"CARINTCIS"); + pszCARINTCON=ReservarMemoria(&TCAR,"CARINTCON"); + pszCARINTTRA=ReservarMemoria(&TCAR,"CARINTTRA"); + //Nos situamos al principio + ContarRegBDE(&TCAR,&nNumReg); + if(nNumReg) + { + //comprobamos hasta el final o encontrado + bEncontrado=false; + while(Error==BDE_SIN_ERROR && bEncontrado==false) + { + //Leemos los campos + LeerCampoNBDE(&TCAR,"CARINTCIS",pszCARINTCIS,NULL); + LeerCampoNBDE(&TCAR,"CARINTCON",pszCARINTCON,NULL); + LeerCampoNBDE(&TCAR,"CARINTTRA",pszCARINTTRA,NULL); + //Comprobamos los campos + if(strcmp(sDatos.pszInternoCis,pszCARINTCIS)) + { + if(strcmp(sDatos.pszInternoCon,pszCARINTCON)) + { + if(strcmp(sDatos.pszInternoTra,pszCARINTTRA)) + bEncontrado=false; + else + { + bEncontrado=true; + nValorDevuelto=AUT_EST_TRA_YA_DENTRO; + } + } + else + { + bEncontrado=true; + nValorDevuelto=AUT_EST_CON_YA_DENTRO; + } + } + else + { + bEncontrado=true; + nValorDevuelto=AUT_EST_CIS_YA_DENTRO; + } + + nValorDevuelto=5; + //Vamos al siguiente registro + Error=IrSiguienteRegBDE(&TCAR,&bBorrado); + } + + if(bEncontrado==false && Error==BDE_FIN_FICHERO)//fin de registro + nValorDevuelto=AUT_EST_CORRECTO; + } + + //Liberamos la memoria pedida + LiberarMemoria(pszCARINTCIS); + LiberarMemoria(pszCARINTCON); + LiberarMemoria(pszCARINTTRA); + } + else + nValorDevuelto=ERROR_BDE; + + //Si no ha habido Errores rellenamos la tabla simiccar + if(nValorDevuelto==AUT_EST_CORRECTO) + RellenarSIMICCAR(TCAR); + + //Cerramos la tabla SIMICCAR + if(CerrarTablaBDE(&TCAR)) + nValorDevuelto=ERROR_BDE; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// void ReservarMemoriaEstructura(hDBIDb hBaseDatos) +// +// Entrada: +// hDBIDb hBaseDatos: Cabecera de la Base de datos +// +// Descripcion: Reserva Memoria para la Estructura de Autorizacion +// +//--------------------------------------------------------------------------- +void TAutorizacion::ReservarMemoriaEstructura(hDBIDb hBaseDatos) +{ + BYTE byi,byj; + char *pszCadena; + dbiTabla TConductor; + dbiTabla TCisterna; + dbiTabla TTractor; + dbiTabla TSuministrador; + dbiTabla TOrden; + dbiTabla TLinea; + dbiTabla TTRP; + + //Reservamos memoria para el conductor + AbrirTablaBDE(&TConductor,"SIMICCON","CONNTMCON",false,hBaseDatos); + sDatos.pszCadCarnetCon=ReservarMemoria(&TConductor,"CONCCACON"); + sDatos.pszCadADRCon=ReservarMemoria(&TConductor,"CONCADCON"); + sDatos.pszNombreCon=ReservarMemoria(&TConductor,"CONNOMCON"); + sDatos.pszCarnetCon=ReservarMemoria(&TConductor,"CONNCACON"); + sDatos.pszInternoCon=ReservarMemoria(&TConductor,"CONINTCON"); + sDatos.pszCodigoCon=ReservarMemoria(&TConductor,"CONNTMCON"); + CerrarTablaBDE(&TConductor); + + //Reservamos memoria para la cisterna + AbrirTablaBDE(&TCisterna,"SIMICCIS","CISNTMCIS",false,hBaseDatos); + sDatos.pszCodTransCis=ReservarMemoria(&TCisterna,"CISCODTRP"); + sDatos.pszCTRCis=ReservarMemoria(&TCisterna,"CISCTRCIS"); + sDatos.pszNombreTransCis=ReservarMemoria(&TCisterna,"CISNOMTRP"); + sDatos.pszCadTarjetaCis=ReservarMemoria(&TCisterna,"CISCTTCIS"); + sDatos.pszCadADRCis=ReservarMemoria(&TCisterna,"CISCADCIS"); + sDatos.pszCadITVCis=ReservarMemoria(&TCisterna,"CISCITCIS"); + sDatos.pszCadSeguroCis=ReservarMemoria(&TCisterna,"CISCASCIS"); + sDatos.pszInternoCis=ReservarMemoria(&TCisterna,"CISINTCIS"); + sDatos.pszTaraCis=ReservarMemoria(&TCisterna,"CISTARCIS"); + sDatos.pszBrutoCis=ReservarMemoria(&TCisterna,"CISBRUCIS"); + sDatos.pszCamionCis=ReservarMemoria(&TCisterna,"CISCAMCIS"); + sDatos.pszMatriculaCis=ReservarMemoria(&TCisterna,"CISMATCIS"); + sDatos.pszMatriculaTraCis=ReservarMemoria(&TCisterna,"CISMATTRA"); + sDatos.pszCodigoCis=ReservarMemoria(&TCisterna,"CISNTMCIS"); + sDatos.pszNumeroEjesCis=ReservarMemoria(&TCisterna,"CISEJECIS"); + pszCadena=(char *)malloc(strlen("CISVOLCIS")+2); + for(byi=1;byi<(NUM_MAXIMO_COMPARTIMENTO+1);byi++) + { + strcpy(pszCadena,"CISVOLCIS"); + itoa(byi,pszCadena+strlen(pszCadena),10); + sDatos.pszsVolumenCis[byi-1]=ReservarMemoria(&TCisterna,pszCadena); + } + free(pszCadena); + + CerrarTablaBDE(&TCisterna); + + //Reservamos memoria para el Tractor + AbrirTablaBDE(&TTractor,"SIMICTRA","TRAMATTRA",false,hBaseDatos); + sDatos.pszCadTarjetaTra=ReservarMemoria(&TTractor,"TRACTTTRA"); + sDatos.pszCadADRTra=ReservarMemoria(&TTractor,"TRACADTRA"); + sDatos.pszCadITVTra=ReservarMemoria(&TTractor,"TRACITTRA"); + sDatos.pszCadSeguroTra=ReservarMemoria(&TTractor,"TRACASTRA"); + sDatos.pszInternoTra=ReservarMemoria(&TTractor,"TRAINTTRA"); + sDatos.pszTaraTra=ReservarMemoria(&TTractor,"TRATARTRA"); + sDatos.pszBrutoTra=ReservarMemoria(&TTractor,"TRABRUTRA"); + sDatos.pszMatriculaTra=ReservarMemoria(&TTractor,"TRAMATTRA"); + sDatos.pszNumeroEjesTra=ReservarMemoria(&TTractor,"TRAEJETRA"); + CerrarTablaBDE(&TTractor); + + //Reservamos memoria para el Suministrador + AbrirTablaBDE(&TSuministrador,"SIMICSUM","SUMCODSUM",false,hBaseDatos); + sDatos.pszCodigoSum=ReservarMemoria(&TSuministrador,"SUMCODSUM"); + sDatos.pszNombreSum=ReservarMemoria(&TSuministrador,"SUMNOMSUM"); + CerrarTablaBDE(&TSuministrador); + + //Reservamos memoria para el Tranportista + AbrirTablaBDE(&TTRP,"SIMICTRP","TRPCODTRP",false,hBaseDatos); + sDatos.pszCIFTRP=ReservarMemoria(&TTRP,"TRPCIFTRP"); + CerrarTablaBDE(&TTRP); + + //Reservamos memoria para el Pedido + AbrirTablaBDE(&TOrden,"SIMICORC","ORCMATCIS",false,hBaseDatos); + + //Reservamos memoria para el numero de ordenes + for(byi=0;byi=0) + { + //Asignamos valores + strcpy(sDatos.sOrden[byNumeroOrden].pszMatriculaCisOrd,sDatos.pszMatriculaCis); + strcpy(sDatos.sOrden[byNumeroOrden].pszCodigoSumOrd,sDatos.pszCodigoSum); + LeerCampoNBDE(&TOrden,"ORCPEDORC",sDatos.sOrden[byNumeroOrden].pszNumeroOrd,NULL); + LeerCampoNBDE(&TOrden,"ORCNOMDES",sDatos.sOrden[byNumeroOrden].pszNombreDesOrd,NULL); + LeerCampoNBDE(&TOrden,"ORCENTORC",sDatos.sOrden[byNumeroOrden].pszFechaEntOrd,NULL); + LeerCampoNBDE(&TOrden,"ORCFCAORC",sDatos.sOrden[byNumeroOrden].pszFechaCargaOrd,NULL); + LeerCampoNBDE(&TOrden,"ORCCODCLI",sDatos.sOrden[byNumeroOrden].pszCodigoCliOrd,NULL); + LeerCampoNBDE(&TOrden,"ORCCCLDES",sDatos.sOrden[byNumeroOrden].pszCodigoCliDesOrd,NULL); + LeerCampoNBDE(&TOrden,"ORCUNIPRO",sDatos.sOrden[byNumeroOrden].pszUnidadOrd,NULL); + nValorDevuelto=AUT_ORC_CORRECTO; + } + else + nValorDevuelto=AUT_ORC_FECHA_MENOR_QUE_HOY; + } + else + nValorDevuelto=AUT_ORC_OTRA_CISTERNA; + } + else + nValorDevuelto=AUT_ORC_OTRO_SUMINISTRADOR; + } + else + nValorDevuelto=AUT_ORC_ESTADO_ACABADO; + } + else + nValorDevuelto=AUT_ORC_BORRADO; + } + else + nValorDevuelto=ERROR_BDE; + } + else + nValorDevuelto=AUT_ORC_VALOR_NO_ENCONTRADO; + + //Liberamos variables Temporales + LiberarMemoria(pszCodSumTemp); + LiberarMemoria(pszCodCisTemp); + LiberarMemoria(pszEstadoTemp); + LiberarMemoria(pszFechaTemp); + } + else + nValorDevuelto=ERROR_BDE; + + //Cerramos la tabla SIMIORC + if(CerrarTablaBDE(&TOrden) && nValorDevuelto==AUT_ORC_CORRECTO) + nValorDevuelto=ERROR_BDE; + + //almacenamos el valor devuelto + sDatos.sOrden[byNumeroOrden].nResultadoOrd=nValorDevuelto; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int CalcularPesoVolCarga(hDBIDb hBaseDatos) +// +// Entrada: +// hDBIDb hBaseDatos: Cabecera de la Base de Datos +// +// Devuelve: +// int nValorDevuelto: Devuelve un codigo de Error si lo hubo +// +// Descripcion: Calcula el peso y el volumen de la carga y dice si es correcto +// +//--------------------------------------------------------------------------- +int TAutorizacion::CalcularPesoVolCarga(hDBIDb hBaseDatos) +{ + DBIResult FinFichero; + dbiTabla TLinea,TProducto; + BYTE byi,byj,byk; + int nValorDevuelto; + char *pszCodProTemp,*pszNumOrcTemp; + char *pszCodAdiTemp[NUM_MAXIMO_ADITIVO]; + bool bBorrado,bVacio,bSalir; + + bVacio=false; + //Inicializamos el Peso total del producto + for(byi=0;byi=5) + LeerCampoNBDE(&TLinea,"PRM5EJPRM",pszPesoPermitido,NULL); + + //Guardamos el peso maximo permitido + nPesoMaximoPermitido=atoi(pszPesoPermitido); + + //Calculamos la capacidad de arrastre del tractor + nCapacidadArrastreTra=atoi(sDatos.pszBrutoTra); + + //Cogemos la cantidad mas restrictiva + if(nPesoMaximoPermitido>nCapacidadArrastreTra) + nPesoMaximoPermitido=nCapacidadArrastreTra; + + //Añadimos al peso total de carga el peso del tractor + nPesoTotalDeCarga=nPesoTotalDeCarga+atoi(sDatos.pszTaraTra); + + //Comprobamos si el tractor puede con todo el peso + sDatos.nSobrePesoTra=nPesoTotalDeCarga-nCapacidadArrastreTra; + if( sDatos.nSobrePesoTra <= 0) + nValorDevuelto=AUT_VIA_CORRECTO; + else + nValorDevuelto=AUT_VIA_PESO_MAYOR_CAP_TRA; + } + else + nValorDevuelto=AUT_VIA_CORRECTO; + } + else + nValorDevuelto=AUT_VIA_PROD_MAYOR_CAP_CIS; + + //Liberamos la memoria pedida para el peso permitido + LiberarMemoria(pszPesoPermitido); + } + else + nValorDevuelto=ERROR_BDE; + + //Cerramos las tablas + if(CerrarTablaBDE(&TLinea) && nValorDevuelto==AUT_VIA_CORRECTO) + nValorDevuelto=ERROR_BDE; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int TAutorizacion::ComprobarDistribucionCarga(void) +// +// Devuelve: +// int nValorDevuelto: Devuelve un codigo de Error si lo hubo +// +// Descripcion: +// Comprobamos si se puede repartir la carga en los depositos +// +//--------------------------------------------------------------------------- +int TAutorizacion::ComprobarDistribucionCarga(void) +{ + int nValorDevuelto; + + nValorDevuelto=AUT_VIA_CORRECTO; + + if(Cabe_Cis()) + nValorDevuelto=AUT_VIA_CORRECTO; + else + nValorDevuelto=AUT_VIA_VOL_MAYOR_CAP_CIS; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// bool TAutorizacion::Capacidad_Ok(int n_Prod,int *psnCapacidad_Prod,int *psnCantidad_Prod) +// +// Devuelve: +// bool: Devuelve si cabe 1, sino 0 +// +// Descripcion: +// Comprobamos si la capacidad del deposito puede admitir la cantidad de producto +// +//--------------------------------------------------------------------------- +bool TAutorizacion::Capacidad_Ok(int n_Prod,int *psnCapacidad_Prod,int *psnCantidad_Prod) +{ + int nP; + + nP = n_Prod - 1 ; + while ((nP >= 0) && (*(psnCapacidad_Prod+nP) >= *(psnCantidad_Prod+nP))) + nP--; + return (nP < 0); +} + +//--------------------------------------------------------------------------- +// bool TAutorizacion::Cabe_Cis(void) +// +// Devuelve: +// bool: Devuelve si cabe 1, sino 0 +// +// Descripcion: +// Comprueba si los productos caben en la cisterna +// +//--------------------------------------------------------------------------- +bool TAutorizacion::Cabe_Cis(void) +{ + BYTE byNumeroLineas,byi,byj; + int nDep,nProd,nSalta; + int nNum_Prod,nNum_Dep; + int nCapacidad_Prod[NUM_MAXIMO_COMPARTIMENTO]; + int nCantidad_Prod[NUM_MAXIMO_COMPARTIMENTO]; + + //Inicializamos la variable + nNum_Prod=0; + byi=0; + byNumeroLineas=0; + for(byj=0;byj<9;byj++) + nCantidad_Prod[byj]=0; + + //Asignamos los volumenes disponibles al Array Capacidad Prod + byj=0; + while(sDatos.sOrden[byi].sLinea[byj].nVolumenPro && byNumeroLineas<9) + { + while(sDatos.sOrden[byi].sLinea[byj].nVolumenPro) + { + nCantidad_Prod[byNumeroLineas]=sDatos.sOrden[byi].sLinea[byj].nVolumenPro; + byNumeroLineas++; + byj++; + } + byj=0; + byi++; + } + + if(byNumeroLineas nNum_Dep) + return (false); + else + { + for(nProd=0;nProd= 0) && !Capacidad_Ok(nNum_Prod,nCapacidad_Prod,nCantidad_Prod)) + { + nDep=nNum_Dep-1; + do + { + nSalta=0; + nCapacidad_Prod[sDatos.nProducto_Dep[nDep]]-=atoi(sDatos.pszsVolumenCis[nDep]); + sDatos.nProducto_Dep[nDep]++; + if (sDatos.nProducto_Dep[nDep] < nNum_Prod) + nCapacidad_Prod[sDatos.nProducto_Dep[nDep]]+=atoi(sDatos.pszsVolumenCis[nDep]); + else + { + sDatos.nProducto_Dep[nDep]=0; + nCapacidad_Prod[0]+=atoi(sDatos.pszsVolumenCis[nDep]); + nDep--; + nSalta=1; + } + } + while ((nDep >= 0) && nSalta); + } + + return (nDep >= 0); + } + } + else + return (false); +} + +//--------------------------------------------------------------------------- +// void TAutorizacion::RellenarSIMICCAR(dbiTabla TCAR) +// +// Entrada: +// dbiTabla TCAR: Cabecera de la Tabla de SIMICCAR +// +// Descripcion: +// Rellenamos la tabla SIMICCAR con los datos de la estructura de Autorizacion +// +//--------------------------------------------------------------------------- +void TAutorizacion::RellenarSIMICCAR(dbiTabla TCAR) +{ + BYTE byi,byj; + char szFecha[TAM_FECHA]; + char szFechaActual[TAM_FECHA]; + char szHora[TAM_HORA]; + char szNumViajeOrd[2]; + char *pszNombreProTemp[NUM_MAXIMO_LINEAS]; + char *pszCodigoProTemp[NUM_MAXIMO_LINEAS]; + char *pszInternoProTemp[NUM_MAXIMO_LINEAS]; + char *pszImpuestoProTemp[NUM_MAXIMO_LINEAS]; + char *pszIndAdiProTemp[NUM_MAXIMO_ADITIVO]; + + //Obtenemos la fecha actual + CapturarFechaHora(szFechaActual,szHora); + CapturarFechaGen(szFecha); + + //Reservamos memoria para las variables temporales + for(byj=0;byjLeerEstructura(&sDatos); + //Abrimos la tabla + if(!AbrirTablaBDE(&TOrden,"SIMICORC","ORCEVCORC",false,hBaseDatos)) + { + //Pedimos memoria + pszFechaViaMat=(char *)malloc(strlen(sDatos.sOrden[0].pszFechaCargaOrd)+strlen(EspacioEnBlanco)+strlen(cNumViaTemp)+strlen(sDatos.pszMatriculaCis)); + //Inicializamos variables + byNumeroOrden=0; + bSalir=false; + while(!bSalir) + { + if(!(*sDatos.sOrden[byNumeroOrden].pszNumeroOrd)) + bSalir=true; + else + { + bSalir=false; + byNumeroViaje=1; + while(byNumeroViaje(nPesoTotalCis+nTolMaxEnt)) || (nPesoBascula<(nPesoTotalCis-nTolMinEnt))) + nValorDevuelto=PEE_PESO_FUERA_DE_TOLERANCIA; + + return nValorDevuelto; +} +//--------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// class TPesoSalida +// { +// protected: +// private: // User declarations +// DatosPesoEntrada sDatosEnt; +// public: +// TPesoSalida(void); +// BYTE PesoSalida(char *pszCodCisterna,char *pszCodTractor,char *pszCodConductor,hDBIDb hBaseDatos); +// BYTE ComprobarCisterna(char *pszNTMCis,hDBIDb hBaseDatos); +// BYTE ComprobarEstado(char *pszCodCisterna,dbiTabla TCAR); +// BYTE ComprobarPeso(char *pszTaraCis,char *pszTaraTra); +// void CambiarEstado(hDBIDb hBaseDatos); +// void ReservarMemoriaEstructura(hDBIDb hBaseDatos); +// void LiberarEstructura(void); +// }; +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// Constructor de la clase +//--------------------------------------------------------------------------- +TPesoSalida::TPesoSalida(void) +{ +} + +//--------------------------------------------------------------------------- +// int TPesoSalida::PesoSalida(char *pszCodCisterna,hDBIDb hBaseDatos) +// +// Entrada: +// char *pszCodCisterna: Codigo de la cisterna a comprobar +// hDBIDb hBaseDatos: Cabecera de la Base de Datos +// +// Devuelve: +// int nValorDevuelto: Devuelve un Error si lo hubo +// +// Descripcion: +// Rellena la Estuctura PEsoSalida leyendo de las tablas +// +//--------------------------------------------------------------------------- +int TPesoSalida::PesoSalida(char *pszCodCisterna,hDBIDb hBaseDatos) +{ + dbiTabla TPrm,TCar,TCis,TTra; + int nValorDevuelto; + + //Inicializamos las variables + nValorDevuelto=PES_CORRECTO; + + //Abrimos la tabla de Prm para la tolerancia + if(!AbrirTablaBDE(&TPrm,"SIMICPRM",NULL,false,hBaseDatos)) + { + //Leemos las tolerancias maxima y minima de la entrada y salida + LeerCampoNBDE(&TPrm,"PRMTSSPRM",sDatosSal.pszToleranciaMaxSalPES,NULL); + LeerCampoNBDE(&TPrm,"PRMTISPRM",sDatosSal.pszToleranciaMinSalPES,NULL); + } + //Cerramos la tabla de Prm + if(CerrarTablaBDE(&TPrm)) + nValorDevuelto=ERROR_BDE; + + //Abrimos la tabla TCAR en exclusiva + if(!AbrirTablaBDE(&TCar,"SIMICCAR",NULL,true,hBaseDatos)) + { + //Reservamos memoria y asignamos valor para el codigo de la cisterna + strcpy(sDatosSal.pszCodigoCisPES,pszCodCisterna); + + //Comprobamos el Estado y nos situamos en el registro en cuestion + nValorDevuelto=ComprobarEstado(pszCodCisterna,TCar); + + //Reservamos memoria y asignamos valor para el codigo del tractor + LeerCampoNBDE(&TCar,"CARMATTRA",sDatosSal.pszCodigoTraPES,NULL); + + if(nValorDevuelto==PES_CORRECTO) + { + //Abrimos la tabla de Cisterna + if(!AbrirTablaBDE(&TCis,"SIMICCIS","CISNTMCIS",false,hBaseDatos)) + { + //Buscamos el ntm de la cisterna + if(!BuscarValorExactoBDE(&TCis,pszCodCisterna,NULL)) + { + //Cogemos la Tara de Cisternas + LeerCampoNBDE(&TCis,"CISTARCIS",sDatosSal.pszTaraCisPES,NULL); + LeerCampoNBDE(&TCis,"CISCAMCIS",sDatosSal.pszCamionCisPES,NULL); + + //Comprobamos si es un camion + if( (*sDatosSal.pszCamionCisPES) != 'F' ) + { + //Abrimos la la tabla de Tractor + if(!AbrirTablaBDE(&TTra,"SIMICTRA","TRAMATTRA",false,hBaseDatos)) + { + //Busca cadena de entrada + if(!BuscarValorExactoBDE(&TTra,sDatosSal.pszCodigoTraPES,NULL)) + { + //Cogemos la Tara del Tractor + LeerCampoNBDE(&TTra,"TRATARTRA",sDatosSal.pszTaraTraPES,NULL); + //Comprobamos el Peso + nValorDevuelto=ComprobarPeso(sDatosSal.pszTaraTraPES); + } + else + nValorDevuelto=PES_TRACTOR_NO_ENCONTRADO; + } + else + nValorDevuelto=ERROR_BDE; + + //Cerramos la tabla de TCar + if(CerrarTablaBDE(&TTra)) + nValorDevuelto=ERROR_BDE; + } + else + nValorDevuelto=ComprobarPeso(sDatosSal.pszTaraCisPES); + } + else + nValorDevuelto=PES_CISTERNA_NO_ENCONTRADA; + } + else + nValorDevuelto=ERROR_BDE; + + //Cerramos la tabla de TCar + if(CerrarTablaBDE(&TCis)) + nValorDevuelto=ERROR_BDE; + } + } + else + nValorDevuelto=ERROR_BDE; + + //Cerramos la tabla de TCar + if(CerrarTablaBDE(&TCar)) + nValorDevuelto=ERROR_BDE; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// void LiberarEstructura(void) +// +// Descripcion: +// Libera la Estuctura de PEsoSalida +// +//--------------------------------------------------------------------------- +void TPesoSalida::LiberarEstructura(void) +{ + //Liberamos las Tolerancias + LiberarMemoria(sDatosSal.pszToleranciaMaxSalPES); + LiberarMemoria(sDatosSal.pszToleranciaMinSalPES); + + //Liberamos variables de la Cisterna + LiberarMemoria(sDatosSal.pszTaraCisPES); + LiberarMemoria(sDatosSal.pszCamionCisPES); + LiberarMemoria(sDatosSal.pszCodigoCisPES); + + //Liberamos variables del Tractor + LiberarMemoria(sDatosSal.pszCodigoTraPES); + LiberarMemoria(sDatosSal.pszTaraTraPES); + + //Liberamos variable del Conductor + LiberarMemoria(sDatosSal.pszCodigoConPES); + + //inicializamos la variable de Error + sDatosSal.nResultadoPesoSalida=0; +} + +//--------------------------------------------------------------------------- +// int ComprobarEstado(char *pszCodCisterna,dbiTabla TCAR) +// +// Entrada: +// char *pszCodCisterna: Codigo de la cisterna +// dbiTabla TCAR: cabecera de la tabla SIMICCAR +// +// Salida: +// int nValorDevuelto: Devuele un Error si lo hubo. +// +// Descripcion: Comprueba el estado de la tabla SIMICCAR +// +//--------------------------------------------------------------------------- +int TPesoSalida::ComprobarEstado(char *pszCodCisterna,dbiTabla TCAR) +{ + int nValorDevuelto; + DBIResult Error; + char *pszCodCisTemp,*pszEstadoTemp; + bool bBorrado; + + //Inicializamos variables + nValorDevuelto=PES_CISTERNA_SIN_ORDEN; + Error=0; + + //Pedimos memoria para la variable temporal + pszCodCisTemp=ReservarMemoria(&TCAR,"CARNTMCIS"); + pszEstadoTemp=ReservarMemoria(&TCAR,"CARESTCAR"); + + //mientras no lleguemos al final de la tabla + while(Error==0) + { + //Si la el codigo de la cisterna coincide vemos su estado + LeerCampoNBDE(&TCAR,"CARNTMCIS",pszCodCisTemp,NULL); + if(!strcmp(pszCodCisTemp,pszCodCisterna)) + { + //Miramos el estado + LeerCampoNBDE(&TCAR,"CARESTCAR",pszEstadoTemp,NULL); + if(!strstr(pszEstadoTemp,CARGADA)) + nValorDevuelto=PES_ESTADO_NO_CARGADO; + else + nValorDevuelto=PES_CORRECTO; + } + //Vamos al siguiente registro + Error=IrSiguienteRegBDE(&TCAR,&bBorrado); + } + + //Liberamos memoria + LiberarMemoria(pszCodCisTemp); + LiberarMemoria(pszEstadoTemp); + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// int ComprobarPeso(char *pszTaraCis) +// +// Entrada: +// char *pszTaraCis: Valor de la Tara de la cisterna +// +// Salida: +// int nValorDevuelto: Devuele un Error si lo hubo. +// +// Descripcion: Comprueba el Peso de la Cisterna +// +//--------------------------------------------------------------------------- +int TPesoSalida::ComprobarPeso(char *pszTaraCis) +{ + int nValorDevuelto; + int nPesoTotalCis,nTolMaxSal,nTolMinSal,nPesoBascula; + + //Inicializamos variable + nPesoBascula=8000; + nValorDevuelto=PES_CORRECTO; + nTolMaxSal=atoi(sDatosSal.pszToleranciaMaxSalPES); + nTolMinSal=atoi(sDatosSal.pszToleranciaMinSalPES); + + //Calculamos el Peso Total de la cisterna + nPesoTotalCis=atoi(pszTaraCis); + + //Comprobamos el peso de la cisterna con el de la bascula teniendo encuenta la tolerancia + if((nPesoBascula>(nPesoTotalCis+nTolMaxSal)) || (nPesoBascula<(nPesoTotalCis-nTolMinSal))) + nValorDevuelto=PES_PESO_FUERA_DE_TOLERANCIA; + + return nValorDevuelto; +} + +//--------------------------------------------------------------------------- +// void ReservarMemoriaEstructura(hDBIDb hBaseDatos) +// +// Entrada: +// hDBIDb hBaseDatos: Cabecera de la Base de datos +// +// Descripcion: Reserva Memoria para la Estructura de PesoSalida +// +//--------------------------------------------------------------------------- +void TPesoSalida::ReservarMemoriaEstructura(hDBIDb hBaseDatos) +{ + dbiTabla TPrm,TCis,TTra,TCon; + + //Reservamos memoria para la tolerancia + AbrirTablaBDE(&TPrm,"SIMICPRM",NULL,false,hBaseDatos); + sDatosSal.pszToleranciaMaxSalPES=ReservarMemoria(&TPrm,"PRMTSSPRM"); + sDatosSal.pszToleranciaMinSalPES=ReservarMemoria(&TPrm,"PRMTISPRM"); + CerrarTablaBDE(&TPrm); + + //Reservamos memoria para la tara de cisterna + AbrirTablaBDE(&TCis,"SIMICCIS","CISNTMCIS",false,hBaseDatos); + sDatosSal.pszTaraCisPES=ReservarMemoria(&TCis,"CISTARCIS"); + sDatosSal.pszCamionCisPES=ReservarMemoria(&TCis,"CISCAMCIS"); + sDatosSal.pszCodigoCisPES=ReservarMemoria(&TCis,"CISNTMCIS"); + CerrarTablaBDE(&TCis); + + //Reservamos memoria para la tara del Tractor + AbrirTablaBDE(&TTra,"SIMICTRA","TRAMATTRA",false,hBaseDatos); + sDatosSal.pszTaraTraPES=ReservarMemoria(&TTra,"TRATARTRA"); + sDatosSal.pszCodigoTraPES=ReservarMemoria(&TTra,"TRAMATTRA"); + CerrarTablaBDE(&TTra); + + //Reservamos memoria para el Conductor + AbrirTablaBDE(&TCon,"SIMICCON","CONNTMCON",false,hBaseDatos); + sDatosSal.pszCodigoConPES=ReservarMemoria(&TCon,"CONNTMCON"); + CerrarTablaBDE(&TCon); +} +//--------------------------------------------------------------------------- +// class TAlbaran +// { +// protected: +// private: +// +// public: +// TAlbaran(void); +// BYTE Albaran(hDBIDb hBaseDatos); +// BYTE ComprobarCisterna(char *pszNTMCis,hDBIDb hBaseDatos); +// BYTE ComprobarEstado(char *pszCodCisterna,dbiTabla TCAR); +// BYTE ComprobarPeso(char *pszTaraCis,char *pszTaraTra); +// void CambiarEstado(hDBIDb hBaseDatos); +// void ReservarMemoriaEstructura(hDBIDb hBaseDatos); +// void LiberarEstructura(void); +// }; +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// Constructor de la clase +//--------------------------------------------------------------------------- +TAlbaran::TAlbaran(void) +{ +} + +//--------------------------------------------------------------------------- +// void ReservarMemoriaEstructura(hDBIDb hBaseDatos) +// +// Entrada: +// hDBIDb hBaseDatos: Cabecera de la Base de datos +// +// Descripcion: Reserva Memoria para la Estructura de Albaran +// +//--------------------------------------------------------------------------- +void TAlbaran::ReservarMemoriaEstructura(hDBIDb hBaseDatos) +{ + dbiTabla TCis,TTra,TCon,TSum,TCli,TDes,TCar,TTrp; + BYTE i,j; + + //Pedimos memoria para la Cisterna + AbrirTablaBDE(&TCis,"SIMICCIS","CISNTMCIS",false,hBaseDatos); + for(i=0;iLeerEstructura(&sDatos); + //Abrimos la tabla de Cisterna y actualizamos + if(!AbrirTablaBDE(&TCisterna,"SIMICCIS","CISNTMCIS",false,hBaseDatos)) + { + //Busca cadena de entrada y Modificamos el campo + if(!BuscarValorExactoBDE(&TCisterna,Cis,NULL)) + ModificarCampoNBDE(&TCisterna,"CARESTCAR",pszEstado); + } + //Cerramos la tabla + if(CerrarTablaBDE(&TCisterna)) + ShowMessage("Hubo un error"); + + //Abrimos la tabla de Tractor si la cisterna no es un camion y actualizamos + if( (*sDatos.pszCamionCis) != 'F' ) + { + if(!AbrirTablaBDE(&TTractor,"SIMICTRA","TRAMATTRA",false,hBaseDatos)) + { + //Busca cadena de entrada y Modificamos el campo + if(!BuscarValorExactoBDE(&TTractor,Tra,NULL)) + ModificarCampoNBDE(&TTractor,"TRAESTTRA",pszEstado); + } + //Cerramos la tabla + if(CerrarTablaBDE(&TTractor)) + ShowMessage("Hubo un error"); + } + + //Abrimos la tabla de Conductor y actualizamos + if(!AbrirTablaBDE(&TConductor,"SIMICCON","CONNTMCON",false,hBaseDatos)) + { + //Busca cadena de entrada y Modificamos el campo + if(!BuscarValorExactoBDE(&TConductor,Con,NULL)) + ModificarCampoNBDE(&TConductor,"CONESTCON",pszEstado); + } + //Cerramos la tabla + if(CerrarTablaBDE(&TConductor)) + ShowMessage("Hubo un error"); +} + +//--------------------------------------------------------------------------- +// void CapturarFechaGen(char *pszFechaActual); +// +// Entrada: +// Fechaactual: Variable donde pondremos la fecha actual +// +// Descripcion: Captura la fecha actual con este formato YYYYMMDD +// Donde Y=año M=Mes D=Dia. +//--------------------------------------------------------------------------- +void CapturarFechaGen(char *pszFechaActual) +{ + char szFecha[TAM_FECHA]; + char szHora[TAM_HORA]; + + CapturarFechaHora(szFecha,szHora); + memcpy(pszFechaActual,szFecha+6,4); + memcpy(pszFechaActual+4,szFecha+3,2); + memcpy(pszFechaActual+6,szFecha,2); +} + +//--------------------------------------------------------------------------- +// class TTransfer +// { +// protected: +// private: // User declarations +// ELEDat sELEDat; +// DRVDat sDRVDat; +// TRAPERDat sTRAPERDat[NUM_MAX_PER]; +// TRAOCADat sTRAOCADat; +// public: +// TTransfer(void); +// int RellenarEstructuraTransfer(void); +// void LeerEstructura(TRAPERDat *pTRAPERDat,TRAOCADat *pTRAOCADat); +// void InicializarEstructuraTransfer(void); +// }; +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// Constructor de la clase +//--------------------------------------------------------------------------- + +TTransfer::TTransfer(void) +{ +} + +//--------------------------------------------------------------------------- +// int RellenarEstructuraTransfer(void) +// +// Devuelve: Codigo de Error +// +// Descripcion: Rellena la Estructura del fichero transfer +// +//--------------------------------------------------------------------------- + +int TTransfer::RellenarEstructuraTransfer(void) +{ + FILE *pElemento,*pDriver; + BYTE byNumPer,byi; + bool bEncontrado; + int nValorDevuelto; + + //Inicializamos las variables + for(byi=0;byic8*VB!f<Y09z_vV{DvtVjiPg0O+f*bxBZF>Zo=PDB$y$TtLR;njLYaO{QLn524c`` zAczynayhJMOt_fHp2N(i3<+MhDemP~L_otb{t0V$)Z}VR)m2Um8Y9F2Zuw48Mc?%>TnDt!K7y|6G zlU!1tP%)q%XNsG>Qk|qM2a*7OiRM52mT%!u2IA`Xg#<)jXV+@p^9;xov^J?K27aA_ zVw6B(WFqq%Tf-OdSsKHG_4l7bD2H33JvX{X~-ZYtZA zRoiUq#x>>L&NW-Nd6O7yWt^>H9vSxeRl(mX1&3`fg>787+|}jq#rFwcBj2ch`$8P_ GoJCJ<_7a=` literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/Lineas.dat b/Esergui -BDE utilizando API/EserguiBDE/Lineas.dat new file mode 100644 index 0000000..7895f83 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Lineas.dat @@ -0,0 +1,30 @@ +1 10 1 09600 8 1 P +1 11 1 09600 8 1 P +1 12 1 09600 8 1 P +1 13 1 09600 8 1 N +1 14 1 09600 8 1 N +1 15 1 09600 7 1 I +1 16 1 09600 7 1 P +1 17 1 09600 8 1 P +1 18 1 09600 7 1 P +1 19 1 09600 8 1 P +1 20 1 09600 8 1 I +1 21 1 09600 8 1 P +1 24 1 09600 8 1 P +1 99 1 09600 8 1 P +2 99 1 09600 8 1 P +2 10 1 09600 8 1 P +2 11 1 09600 8 1 P +2 12 1 09600 8 1 P +2 13 1 09600 8 1 N +2 14 1 09600 8 1 N +2 15 1 09600 7 1 I +2 16 1 09600 7 1 P +2 17 1 09600 8 1 P +2 18 1 09600 7 1 P +2 19 1 09600 8 1 P +2 20 1 09600 8 1 I +2 21 1 09600 8 1 P +2 24 1 09600 8 1 P +2 99 1 09600 8 1 P +2 01 1 09600 7 1 P diff --git a/Esergui -BDE utilizando API/EserguiBDE/Pcomm.dll b/Esergui -BDE utilizando API/EserguiBDE/Pcomm.dll new file mode 100644 index 0000000000000000000000000000000000000000..104788865d4acd0665c79360f0eee96af6d7b60a GIT binary patch literal 57856 zcmeFa4|r77wKsfb<|LVf2{XV1BL*CCY^ezt9hAgLFhEF9BTh&%LB${yFpLP?a0X}{ z!lWm`Oil)D_1@ZQd!^WF|J!@*ZSW5y1QM`V5vx-1R%op~aX_(XNI)|0Z|!}~{0Twv zzWu)U`<~~`^Gwb;`|Q2;+H0@9*4k^Yz0YlTJ}j67K@jnaMg^e*SNbbq|3Cj<5U)pH z{`_d+x%5}A=rB~gaz%ChinWe44Xf{KSn`15-X*J6t(F{LU*>4=uX3zd?FGGDv;2EDeU!sshT8AQAA6Qn$0V9EKLak1go$sTR&-pKLB zh2hWM1hqswP&z9_<){F=@{6Zi5dN5gWRFoOqSyBrg@ZiC_FIRT_l? zj{1n1r%B5;NO;ro6#fxj)K=<*gg*zcn%1y%iL^uzoauPciC+eOKf^EKuLRvSjb{_u zH=xpkcsU-w=MpmEwgeESt>76Cq#*%q7pQG7DRqkSanbAQclQL=7YpdYjcdY| zVA$TOh;MlQF4*LOsNd2N#b2GgN8Bw6;R>hd6DmE?EZYJjUK=D!$3XmbKOl-y%1&Z_ zx;INE`42|AGt!+%cLusMD?J*-MCb>S|Ej#Tt|N-%wAHvz1-{-i#1OnQEdE#6vN>Gz z3PbQF9l^U7*WI<-EGVlt$mgQcrO~Vnl}4L;uVhuqH@raj0A~zL8ycNm3fkR$Y-Md(F_WZ zk@uK)+XQ9v8oVzSF}$tqKP3>Ubi4J3xCQ*2mQHJPGu>A>9WDDC1L2)d61+uDOKnx9 zCtT{B?lXAmvmKWS3!+)Az@KP-b2O_Nx5a;h(2}yyuppjTKg8-qNgGNkTL`_{%4k*q zSz0=Q9(7kN8&I&s9y$gSUv->Ldcs4z81E-e9~ug}hyOwgqyOur0I+LD8Y)_4~eH})P)}Z@wtC2S+iQ&&i z{Z>X78a6USghh}8&K$wo{52H8twXSGnM9>`9;J5us-4&|n)Mi3RU6&>4xXY}kK%#& zwFbm+dO!(h<$|hc))Tzt*5(&M&cxO`VgRR^JJn$XoH*y-!4|RmQPeJff#v`6IK)5R1doC zq6MeqGkVoyW8;Do+@<52$W6NZ%x>u<@d^7<=cZ4nSGf4(VnP?6kQSK?)?$c@Y>e=x zog_U|NMg2ZrBYlvVmL#HSZX~!ae+_p3H8$#a#@8afrAL~kuLK>O)9agN7`qsb0=7mezuKSL`{ z@~pyXYuRsY|1ac~2d&nvzobIHTZDY!?^fe~f0sc@kw=RWll+yl{ar@MrlejK{U{pE z6dZyON{w9J|B!@y+KYGT1q@NVNNxH`^wnszze|+NO``>jT$VIMNoJM=3CEJoA&CKj z4WOjTN8gqA*#H1FzPdnph;RnsiPh$z{UgfM#dW$=Wp@XbyY^RM^jo~j?psUE9&S+V*zS zm;o$vmAB=PKgHEqcUQNoKX{`crIiJXt`q!&^EZrc6R#^;B&8MID4FJe;~#B{t}~Rm zIzd}YS?i_EMO*^HkMT zMys6#P*_*BoRGSey_zKG?m#c-Vj(g4vxMXra=4L?qxrQjWaGV#WQB7I5On}iCt;cQ zop8l31!bi(KP>J8ruL?@l-s{LhOK?Q7h`3d&j8dMo=TOb7(f}w-PU-S>rhLyF{`b@ zIj+ERos>4)eP&aCB*nUOk#iifPsh+0SGmAbgVq$abZ*?<5l7UV*cfxS(#_jwP9iXk z527(-1;|WR=~U7i;puNMU6S(#xL)u^-|#BMBxa*B6U1+YWl}P*RBd1Yhlhw=xj<1E zM?y$wYDI!njvG%HeoQDlaLGL@7Kipx}}rL!?@UWnbs5J(`Dm_QMY9$wI+7SsT8W}uJ_dTgKu z7cqLE&33N`4c3RCZa_>;Z11R!elQIQCXpIx9?5zz^Ve~X;`Q4#dnW?oYv#dG+;V}g zN%E2H9Xr$my2V0f%`ZR#GHVhn8G4QJ7jRCYF(ZQw$6^5G5nJ}cmI1!eNHL|fME&Dh zj%bDly~fWHnT+J|Ek~rW$ZVs`xY~i35D`NG;3_QZ$+;)^Z&0|iZkY-WNn6bjp$k~+_K~bnbVI#%JJCPaufXQ)x`v&x81-@H6Q6rT#PVGZ21{!q@V@jh|7+Z#lYD z#$@83LO&zn_X+Hak??Cez7%iB>gum?9g$yjHsjHxyyy(zD%ss<{kD#?U^E)xO?xPB zxAF_;23*6XzXYeZknNf0QS5B08iIun*`YH&pRXkpWvZtDtXzU$DP(6!sKQx+d(Q%J za>Y_K8;q2Lv7s z<#d^&r5Yp~b+Z+>D3b$K;oO)@s#oqZ$-O4`;Kqqy>Ks>R?pxtN zQMJ6=q`chKXFTD14LN}V-B6;5xAR1>f3+(CXyW2vQjR@0!2+rX*TX6IYD ziCji?0K?i!kNO{w?s#;{d(6v2rIuQggleKdcM8Z??E&GQ9Ee8IyLmF{a%=l3KuDyp z*8^rSA|H7HKwx=b$UmlBj;2_{gUH&EMKxNfWDYfSAj_ZTisB+YJ|c}0DAW8ttQc1m z*{Xd8kZqypsZqx!V?(Z%WNgYcbiNixXEeixEL4U~Io1BtFJ=L*+_mBQ#o4Kg6L{u} z3&f1Hi>@N3?Jv5-|29%w<1`&#LnDfL*|>14ftGX*lWUZxTX~KNKg=_gsU*S30|(z! zvTS>U6ndgiVnvx;Bbhc2zY2_-d5~+>xL-(et$Hc-HOBe{#7;8%%-cnN%MJu&W#J_yQF5n~-!UAh7M4vdTly*iovZ3=UeMPyw;fkU)9-wGA z#o98Dp=oWu784oMfExt^z3?`C9aDn*{)4TMsRb3zCDxW#0Ty@TtSx(S*K)$z@;zKp zqJ+lNnYC`QJ02x=%?EEWoSzErX z1iVM7|h2@2;&i0R|nlp%JtYLDubfANTNCxqNg)mG5TS)&E$-{{C zlffM0cw+5H7BS6v8dx3>tu1e3+7IOJVX}K^DlqhN3@@Tvh`AD|{KX}Pb<0H*(DeI7 zc6-OLv7#H|+7;Eu=bwDSW$|FPMYA|%G-eR{&{H(WM@ICr-+cPu6)^Q9VmkgK&7zDZ z+iMTyYTSScjdZ8nxKzM^Zd@t&XUL89g8y2%agE^5l^Z3&e^qbU1`N+A+UbC!0y6GJ z6vc&18CNIwuy*seW!l?VGG;#4p<^uYiFxa7R|_!0eDIofq9|X*fr{l0e6iaTLPZRC ztT;7UYwuKQ-;QU{S>HQ7NDdC=uls&kWxd6E{z9#xm z+>H%JApc1YtkWqZ`?D*n767j9Ihn;h3G%>Kq-kso%6|=LoWm?*JNfT(Dm5nw83f~E zx&3BHnrzlgILZY7rSM9TL#HOXHC}h$PGs;!m4}`HuBh}dG635gEw8+bd0HAT16p=p z3No}K1HmOveRM0mO@aq9 zR`gisg6|bo{pA>@&}r3d6h`+Xwu%@rx{d&qKcZ5vsvrk>^rUwpZvvluU_&n$Y9byk z)Dgj_iSp-&vhm(YSObVnZsTvY@d?8VOgImmZ3&Ct0jbR%nuS;vc+@SB%;@9<4(67f zwtl)yTPwKx^VSN!#QN#VdK#==^)1LydE_NjAg1}ZcY)5DuZZFjxUWb#&-tI|;ts%V z8VzicqlQi2R5mXHy@K!M2S0Pb4^C2>`;K8d3CMw^Iuf)xxid5;KD^7A5obfj1%JW_ z-t-fKL;h{@JO{Th{^!6KUln~<_ky$9;4&ufG+z>>J7O>Hr`AbK?URqgA4cmN4>EV;ZgwHjskbIfErn&S>D-E|OOVMxvc zH&@I6rjeJN&(#@X%VOl!qjFk<_ycPa+Jj|MDU-@(b)a_z_`TGB!!`Cmktq7Z0q_@V zSdCIlEpZ)riD(p>7OHc!);U9UQ$lrlp}PD~-SkjhQK+sYR970Rn-{8E8mg-g)vXNG ztqIjhp;a5AZ!rRdRs|YNp}IimhpniksfRRB(~xHd#(&*=4bRY6NR;je4v=GpEsn@H zMWs})y7E#K=%r$1O;IY>@c!bugd)7ZU{{k;v$lKDLaoPcB_YaIq{4Y*p$hU#yvGt3 zH*-J@fS69R-ccwZ4~(;JHR1-tu%P9T6~YyXXKu1?{WEUDKd1(;g~7(ksT~w>bLz*6 z*piPGi_jcV*)1P6$pfbK6QjQ+CI5q`$1_?RrM)@xV@|lA5F6gjtJq$Piw}F8hC&>4j&qXHm%o%4Oz~hVrc$|p< zj}zrv&BiLFh1%#*rqUu!luh1p!jKlqS%&Z3r+yrd6`;23ZgIL#5LP2S5+88c#fWyT zVEZ2LMd9Xi1t9;Phy7N z=)&^3s?=kk5i&r+Q-iQkoRKA-z^k`XbI(`LUo9S@qk%O<49C{^7dD|}J&|@IrPV5AzmVSQ* zid=9N0u#vLs}K&DzA+;wVMT+31+33sg#dHU^Y%15DMHJD>kp^{aHVj(s7HPIT_Utu zIoZ;`DQzdY+9Pf%5^i@sjt7t2W2!8RX1xc68Gdp4V@UF4^fXVWcS3EIdf7Kw?_p|w z6gf;Mn}*0mzj4y@bkPdrz6tszx%tD*3^-eY@wlSur+;Q^5)0v*het<7|N&dgI^KGPyxnJDemXd7%E)~_!!qTnICDfkAXnG zY&4!NUy&bsT(;{-f-72Ei3CVT%p>ivKJ-2y!-pO`gg`;{ac~->4RIaY+EpRg&hPv{{2@Cmuy;fkE<8eax^h~IsO zvn6v}l5fNGZqr%H7kCw3)7u39S8}Mx;R!z&m7}J>*tXK5ilS?z41^}7-j0-w zAC|j1-DfvuwpA2Wl($-JCGN9@nsRPoF*`{$&-|}i1mLiz|&Jybx8n#h`wfQa>A9pLgY;ZG5#)sDd2*zrsSYVXC(v}e% zbV!#62lE5j!NI~!k9hWPXtNdAmbD0HCfQP70OBFywiVn+o`x?BW@quu zBT_FRc!=S~NChu2J!pOu{V5@sJu#Mta>h6iorFLrU=F96`q81}U~i3nu)$_BvwY(W zGRZBiUB^uF4(=?_0)9ZGZy$uU4RV-66oY0_LVv_F955M#7!5gAE%gVF|9p}N$t_7X z#bd6Bi}8=$L;kV5IuHQ#g?_NCm>+CNW`3|&<4!Px<^A1!P2|hb!N0%c!5z>sgQ)#J1MZOUONr{@8TdwJNHAE4_ z5~#th2-(#1^gVdNz3?-UrhDP9!@cH(*S3>H5j0K_4Ok;yi6U_OW-ueO&q7&AuCe8B zPc8SCWUw&0KAPh*tGEbKG#kGhX!LAobSLhokVbbdMHbkFx;EDeQULGyi`y6+B*j5K zMfH!TT2UV>%5e#z6lib5>MSjEDUY(4Baf#NSv?Et9Y}*Du6u(k;KNvdoQyYlJ_^2@ z=P@k81{k2^02HATzHD;qM}D1H4H8LL$Y+QAqsdxAkPesm=}LDbB{s!q+C%ilq(d7) zO~*ZWrujvG;d4$RIlOES6TM$_Qgjq&@J&SCc9y^c+!P)#2k)n~`RknaWLCv#zkt&| zZ$#Q(kC%-0WJ%GwhGRJGnT|W3_MZVEo%Zp-r}Jo^mrVN}DrHnA@-Qb@O3~L*r=0{F zdjJ`+@&-bedRRvgfgfg_Y4HCGXlWDH`Ka%ZqXZpCWI?c|I)-(YML}l;T&7dVVW%9P z$|`U4Q5J7T0kqVMIyzb(v30D7YlJuGDhdZ0Ucl9v)PvMx`la@n}RI>#LM z)Yc2El@Pd=6XBnepI#apyiG7DM!)&t7T+A=9YbakTEb4~Y|X&He}v?)2kA<7;}EXCjQ0m9f+bngpz zwFuAo6oYO5cG$vJorb9qsQwT&i$d{J*zi+c3%;Kp9CG+g@;+n#UIRAL?GyX=8l_S4 zKC`axan%(X^(XYzEH0gIqz?SN^-J;)v5jhhG^W%WGnrR!1i)GaoL{v4gMMDiDqhRy z?H{D@-;;buoWFa}mau!!5!*dj65Bl({G8o`G5#g<=5zgL+IGDp{~2Q!7`>YRjO<^7 zb?dK)*%NJ^hmoM!JT#k$d1J|cmJM$#2?B9Jed(965UFYmRknxg!roX7LGT*IZU?@$ z7)w-S>mY$!H`)VVveF)i56K>+Y#Kk@z#n0?G-6BDe!p71T@ra_fzMgdxaRR(CGnKoji5Hu`>vEbD>l!oWASHbKv zR;hb?QAb&UQcOCI0#)Z%xQsK;vNQWZz??{EylCPck1FnGt}dcI)$5#OJ+@?TG+B^!W2pnxkDM2@4K10+2SE590aGV|l#TI`wo8&EI zVv>qndJg=Y;A{ts8FKmMlQEOGlqdvki-8;AzVA~F2x>#Enr>C5k}U&&f)=_L z^njue`D7eUNI)UMzNsM~q*R9m6st)A#lGzNC*j4YQr~!m3?1eY2wabH*hkpzd=wZ^ zkS>&KmHMBTfEIh~EJ_&D&>_FMOdhgtG`gZKQR#P)^eXi?S5OYo)sHpj8m$2}(7+YY z!0Mg}^b#zFmjyuChADy#%KKqf2WG)F*yU2CK7i#%%(Yl8V}{kT@#h5E+VVUo2MEj+ zhrV=r@Gq|tG@U|B!pVth(S%1?6Szr7lPN+Z_cAb`1YeN^pHYRgKp8+u-Qk*#x=FNB zj{wn|i4q>)s48{tc)|h+-+}Ja3U~mVaiI3BHoeT^J9EG{?%s`G)7t7$Lz5W)E<_WiV7w%_cWiwvn1ynA z%j{gDrL~>*rXVl?BbqpOI)9&wS36V)sN6%RKgKe6!xV50mN%@;FCZUernQ*{3f@?o z`*6cc5x@=yFjv~0)S%pEb_qXfc?Nkr3xMQFBzx39CLrH!ZU0RQ6DI{)F%Js-0tKi_ zG$Vfj8u6%8L}UXk?5{-T!bRBAMGj_rinZl-B*g0{?l$mxsk}UpVtr^T<#4vBUV-9} z7|Uq%@?|k1d(`Xp$I01k4d-E~$4Gj^M8^4j@52(;%ki=0QP1p4D)$MTXR&fa7?kLO zzF(nSxY@~QpnfBhv6&q&+}+kK-=TM<&iZgWe_yFi8BL{N<6E2kcv-N>S#NE*KcQ+J zbY=zl;Zo(w(VJWQ8nC*#*AoHQ;RP*CYItre9Pw0LL5s9NGlt&>Q^&(uX=h9uKbuRPqtO zw3p8A4c9954-pBOj{ZdMadtg%}+-#>rj~dBm6%~QHRm^4W6RWg<^!QR0 z;%_17f5sIdNeGWx1-VUFlQ)*S>?~eVgUr^Jlkt3-MD?g53=|AJ%=qGDw*dr-5)?E- z=!=3CVvW2qx!0cn%)S>0Fe&hrm|pqP!TdBhD%IbCARrcvY*3%*tx*Hir@p9E-$0BU zh_Cel6C_&yJi!E`)-k}Q5U{N+Q&Ce4l>sUo?~5_?E{Or3hIOWKz$cKdUycJZtSvOH zM7vgC=sHkQp1VuRsZ40!TbvoFeSMFh0-_iOXdJ`M$vnCmd1Bc6I3ZD(4WA<*vb@rn zZGuF|wr=?)(Ht(8D%73hfrcjPRpMa^IE3QbNF0(k1xeXj!%STUAc|jJTQg%VsI%;% zdPyw0-!D?%fDf{L(kQyzZ*5sYBOJYkh2OrLaZg+_%G&ZWfI}YTaLq?{7ul|;g80jq zg+;OHOwypSPO>9pC=k)3zOW}jd?YYaH-a!VW+DX_S%oTdYO1OLm;4&w6~?z9uhW-a zsWxj=0lJP0v&|2I%0;pb4Y*8nH#tIzltL2L7cMl%qjRWjT8jYmhs z6e*cJ$Z1Pb^TfaKO@(h3Uak~uH!l!uw^j?b&MLvS3->2*pP>J^Nvi@p!0*_kT|Aw)OuDpP<&P!I-Pa<=YvX*)2^HlWxNQa6(P9{-04;8D*Bzy1e6no_j~rF;T`XgzIzi9xh)xy^79b+3>h>;uIAP6<750H zlyxCF+s7~%AfdS0UO9r=cI+e_d2woc`q%h? z0>BHaZ3k1^FO$~PyYGo{$!hy5-~oYL4YfUiP#VSwx9vJ#ZQlV9nxsVuq3=_$M~nbu zYbFq&2X*)TjSzs`9j>+oqC8jI@%{t`BPnpQ5H3;@GX;JdDQUe|W>Dccd(zIXFhp&f zJ>N$LjVtVg?3Xd&s-eL9lehtGtwD8D3ejfCK`qy{4{4qZE;*Spe|jWkz5~3KfUTUU z%zwbit1I(YLHYz`{$1*ck(7Df7btTll=+m4Qsz~tf?7n%+=YAM9Vl~(4u(E+aAoco zL7C_4%AC!~G-dwbizAQrep`&iNSVjEBeDUNJ4RINQ;4{~)aawB^?1PxuoVTXT_jsE z1^-gAf}amOdy^D=9#`<>S0V*Jj3D7;ZTST{{((E-DaX&UNU*KHOR%lGQ?Nacd)=2t zS14Wt@F~AxbI2wqMpSMOj%JyO5XDP+*)v)w^fu9Z`lB;r4q=yGW?Rna*=4PZ#zfr* z1E=EeL##|ZDjjPlu0t-YuDkX#uPAo>+iF}Vlowcq|H&#m4aI6xP8Z@;qaV3)+HzdM zvse4axK02KqcX%i{jU9yyx`evedoW8L zy)i>yl@WndSiFC(M}2_J1;y6V+^BpmE${)j)#f$zhBi}G>g_-cXyKeK^}XLkqsw#W zq@YF1iw(lvh&(=hnD6%TrHxQ+vtDf)+-{nil{SW<0v5mtC)H!DOF9_FXI=Z@8ot7H zqRpNiJafB$s`Bu3U@$wxF7g>;U>-Zr&=X>%)Zb#G4KU*&YTcn{D0A>kwm(OCxPX_V zi+si$u*Et9*(h<=9QWX+$0EPwT$x1QDR|A>;yRJrOGCoFx3R1(XD0QnwRdwK-V+=2 zHQ}GUlRf(H=IKa5Qaj%<{R>3a8z_M_~-5yqkO2)DymS2%CBz`7JS2>CB-7j=Hj&I4bD? zB5Vs3i|YM6-l@B2MeNQOySqPjw^F~$d!Puh@uv@WAE2y-X=xqG6&Q|{g({yC8 z&~&caS?Z%b?&CA@?~)As%N~Oz>Bj#eHm^t!2%l5`tc3ajcM__vcBWMVmicP@OQ&ix zW-U-d=vAs0m3mOO+-aiK?{Vi<#TZ0BUP{sw#H+5Y;rtw8d=X-zh6@VLeIdrSAvQ|5 zB4f)y2-RK)d9;*<6HlhKBI`pBfkJ$+?I3>3-Dm2l^wg@4Gd%ctToR;3y@zKq^>}Kk zaEjF$tfnqUT=sKb!>>qms2KYBkzafi@jFZ9c?;5U0&Vi6R$>Ha~+&01gFhzD=|-``dIebU{K? zsac@(h=lm3w0}hY2#w4i4}!~e8mt>e1D!wW6Zzug`Tn${8I5t6R@>bUHL2*DzKo<;rUoQMK2=uUZo&(kRiO#9L}4B%I?9AVjIH4 z+mRnxO^4_BGJr>YSe(>TIw=abm}68WL=qhyvkZD6M%h1xfDQ2Zqv$RA=>p!u|CY!Vp<6Wunx6=AYqto2v?eV3|IHe0^w&F zXZcckj2Vh)L1>n!8nkBT5vfbzb~Ad=x(#xt*`wBA!Ua60FxdgJZ!lvCoF*3JXWZ~L zG|gaOm|6e5JJ?-Mm9;)$CVVMR37)Cb{{2^+u4FM%qBmGAg|&Q=i*S86{IUYPp%Q0Fx5d_FiCY z`tJ@0F1bD7is_}Ow%%jFoD(vC*E5(LsZ?jUbb4teUIjcgN(QaPG@}5m#ZZuR%ZbLN zrcZ&618SqxOFW)8JuOx=Xi8>l~B{hp9PX?M0#P5Y=}=p>q0u}+4efT&K43GDB9 znxB5cObClSa89blv|lnJU=6vfExBM$PRgy9!T!{TP<1zo*LzfjO?^fEL`FSX;>ih; zy1F~T5~|k4HtaoDCqLuTMp_MawfkVBBUqFV>wT6yNY*=S%h*u{uKgwM-GQSBqvgB2 zIB$#H!I@WUySVfeEMy;Q92G2@ku9Z^yUzqZMOdhW{lvy$`P^r;4P$yi`HZ+R8F*Xi z3`00?MtI(?;Gp5M{qnIvxofQZo!GpW+(;F)wOJ$MF(%xs}9 z>NUCcw}~@~VBiqU^64;IEVfzY@}L;_JBVx(0xLjPVqynMg$({XBc7t!{_5aHV}9G+ zCjYI$vo0wkc=iUG^c4Dw+UJ`?NmLQUS$?&9P zz0JBfht)>~ai+P=5)0oq;rgKAt_$CpJc zJ*nAc!GDyLm9%=JCAa(c6ZCE+T8#I@e+5VrgcP=|b@*P^VOv@MAA2;JQbbT%Y%>() z2P{Q}o6OdoowAxAnN&0j&t=;4jL7JsC4t+EmT$V1y|3*$Dz@Ehpg{c56o{XW_Vu%M6`3zq5$J_aF_cZ7+ zUu@~DtqH8!I#ebqVM3-d`Z{57 zsW;RpYCEu_ug4DR001s@^nfc3D&twg2V$>`<8ssI#c$DhB=LAYD+^fLWM*as1zvTI z7}Ur2Ph(`(V28;!_}0da|H8L5hVytB*G54<(Vbz2Sa%pPO_Pe^tm|@AVmK)knZ4vUY}q79g)dkBwEjf$>87KUuKZ~s%AJVOnT?8XMO3O(t zPvA9F$N(Ow!}xa&7+NACx!zz^OzvisPhb>sZ zth|ryy4g1cJtprf(EAP7htD<$HUl!I;g^XYwL?BW9YdrBN@5<4Fl%o`WliUJKu`ep zFjDes>feK;0oy!9pT~f)hP6H(2v@>F;7s*EuoIF<5AYwrF}4&IK)fRFnU1PsTXJ(= zp=O7tGnTGG0J~ZHl_@Zku|1g&iHYyb1rF}lifN8pA8{lP2>GyDWFUg&~}P$#Bp1%hc>r@j_~AO zZ1H$Ok~b)ruXXO>S{|T^xKsuc!KB!mFhW0*0jyX4EQe8eVHnD0F4ryq%ylHZnH>m# zsS|}y+AASRs;cS*$PsjNt45sMME!Xw7(WjONrbmh$x37kARC&J!nTKEAIDW>Q;Ysd zIFrC8qB8<^x+5{RDT6Gt5DTylvBP8##Ku0%5ZX!dxv7VQHW>UffUK=i_dgkp`b;%y z<*T}|O39idE6^IxIV*6(_y5>%r|lX8{6)3x1I+9t)3d}9DXC=Wl7>oUn+3F6FL5q zd4#fA@k!_9n2j9Y)^pIufYP+RGGXc+jl|3o*K%az@EuLWG5UU(rsE6IE)w}KK|Kjt)LrxRD)vRDz2UA zdq#TOzTmMPCAf}&XNLsun!FFFYy>4K9EwSZ?Eg4y%B`X z7MivaHZ5Pl4eHJ=Y<5bxwQkA6|DMw6Hxir@eaOeRcB5Byn?aTGaIREIf-5a|PTpH_Agc`oGnV z{~kRvd}(mov(wBnkd8Ur(}v#>9NK9EX|t8?-TNBH28#*|Qd)_-EAVL~g{@W5O4XR! z&_jf#`aYws7|G~mSl|f^Zm_m^!F9Z@T$T|_k=FKEBu9_5EjGvz2M$6ARLN)SHq8&O zHQ@_%%foqYSEqI7Rs+Dc%{98a{FhdR%MBj&uYhUYxepo_!+oy7y-%ulo#2EE{f;5A zgd@>cLhw)2_OcowQUpd_b+-2U3cSueEO(pw=roAfi4gE1b@Sz1x=Zlm;o}%{Ox&!% z0y4ZkrHROs7(YPI^w--&@98fge&E`~_yPTWh{1@*4_tQ$HJIVy{LjW~SFB++uT??zhzW z72xn~9ynZJ>NTVOO7;7Xp^w3I=$T4is>fHR)i@RaP~$KNcxi4rP9?$i;m7C(tE1MP z&oJ3^f|fI3NaKj%=RL;V?K$nAx}5Z^+Z#vF(1%@oZ|=P#LHN4omicWAD4f6zF! zt#mqMH{^71@Jjd&2RBJ6h~-{u=@BPfIh)c*bc+)Z6*08wRmh8{00SEB30yqB)CIm$ zty)M8zMf1}n~IE-L-~W@SsFs_p~f+7r53yLTJD>(+=H#9cKfD}a)G@Xd{(D{9RxM+SF3fxNe(~Pu_ zln%X1+A;clfsIEey1@B;o-gC7p-R|r`5&F%M+1=`w}$rXdq>$Ze&}WGXgF*m zX8j9)+b(pEP*`k#L$EcD@sSKp^{5{~x`G?QEr*m$^Xr1GZM>^--R2F#! zf__q&a#lV&6(1uzn~UHEN^qT!87M&#Z%EBw>97Mso zXrx!!D@UjL(@q~|45)EooIj{pm^xWo&H!J2x~g0(0ySZ~6S(_l7Mc8Geu{TNDZ^(} zGsjR1#Cmflc|IJN#iPy%^#UHjH#z({!)H+6gO39lRSPsVO>5yk#c7ymHbHHBL+R@3 zvt1Ph+)!3NQnu&eU)ND{h`l%M-aZA-Y7}NL3TLRPfWja|v$9dg_U3s;oBHu+R8dT~ z!uC(#L6UNT%U9J2$gA$fJGCSo|8B*sM)iVV9n>Syl#|E_R8$j~OZ^pWAqE$<6mFwe z2%gEECl@b5^}=>a@TaKtD6MXX-LC!t2&vydAqI?EM9q>1aBjR$Q0ZU^v{`@0h+M^< z$Ons4OODj|$I8V7Rq&^4&QlaWOCO#)YxLi!WVWI;__U>!oy%uK~ycRLjEhV9W z_{OPMErVzQ%41?M^bGWJ#ZPIK5K#S@FiX;LR-aeRq5?;#8k2uAWfD0A>L(>jy6Tk~Jx6VX;qd99J$8+B;(W%lw_FMN#UhB>-T=G4y^Y@Vmo78}B|Gy@wjvIv2T?E( z+s^dJXhuuiQd&CA8fbEhFY97dXM4bOyBO0!{ou$5xJf8b~v zwGaO-{&Z^7>0_A9R-Hbk9HzIYmty-6zdL4noz6N;1hFkhJ=Q51qX+A4IHsu94dLGz)D~-{u266rFpkpd=FUCfPS|5 zN5i+1hhcybHwBm86yjFmZgLsXdFR=!6Bi=Mf0JAspy44omEsM!kv|gMETv(blE#sa zC9OSCpF`N%3ESnYdUL&#QXG_0%~QZb>1qM)Nze4AFr4rNgq*-+xbi`he3|MX7X`eb zc)o+n5dQ2XRY)HKw77@XS(Q``s~*ukwEkn9M2znZqj)r{fQJ22G>Y~>V@bHK+b5yN zGubya+2MmyzIPjC09B?VGXP!gRc~Wxi_xrnB!zfXT5p+1BD=1epr{eBFDplj+G9|- z2swLG2omKQ);%m9vbV&O{U_{-D4|XrX0dqTD{00|LpiAAI} zw^q-jVLSoxRHzgKNW(a-x11px$?)0KHQ48aSDNdZ4g~8yAQv-Cz1C(j?LbE;d;eG+ zEUOz%1Zjm*<^)C3u^!K1@>N{ea`Mp9Jld z;tC?`W*ekC@W`kag5;Bf!&kYXX^3+8|B?tMcBVDrpD?6q>VqWyZ_lPtCeox20{k-7 z%IrQdyqVsHu3uA5oUjJSI6zx>&$=nD{m&x^P-vYm%015BvUi9>TD`|Y^WWP>nNz5o zyJ!8oWM-fNi-6;D49eMpwfSw7!)+;UU&SpXOQ|v?yimky2-*;qCJKR+m*}=|D%H5L zZkGgz9M7lOR&Y}9v%{?nw=|jK<=(e$vTJ|qJW=j+_LeYwdPuHk zQCOE8YT(zARE5Du^uvk9o0ZWx4_7K|Gd*LFT+f*Oqu@uY2GXd>i9nTC<)eR>k6qq1 zVCp(%R34@#Dyd=1e$&e#L)*C4O0j&7jFEaS@H@;WqRK?dVEVJ{j{0lac^fVLJ#)k+ zX>_<8-?=id?*h}Y^U5+qiBSZ0*yUU!-6MB)8rDK$LD zLI+KBJC#)4XWi@njZo>8;SUbX7HeoHPT4X-QL=InvCo``Zug9(7?5W-rLCT3SI9(lY#|; zl&V}$3E+ELzQb8?q{VQa7J!1&G1s+s9W|Qp)}y}7cUm!#nBg<4-{O=02WVa8{cXxX&YZgwnxAGJpdN*(OLd#QfqceS?~<)X+A_DI_du3 zHy`qw=0`jzSB1!peur?fSr=d~gd4zcFYFFj-Whd=NDt!T(X)cr^ER zXsZmu1O!NzW?=};K*lQ)$&}h^D?`)T#^YS(GH7eV3|Op(ozS2Sa+)Eaao1q83hl;!Oy5J2H%c zd5<)11H*ID4g4=vA4g8S`~;PVUxh%m zLv5+>b{}jQ6KrLyPy(01d^q3MekAvR^927NnKt8Z%_YTTG&g))6Jo7WHvuY;?xVBF zht*3qYS?~rxTps2Fr!Yx8uvl81Tdv*dHrBPbinwwKe^v-7~j^~fw$&1!eTa(>kRI< z*Phgnc(nwdM`(CnuaKz>)}cIulQ1jctM1B7!z3<%W>%`&U^4$m$ZKZlHhbg8PMMd-3w!*d{Q zDo3LpS!kz6uR*_4Df3DK)ovaURroLJ8iKf?}@Sk7&Sj|nz{ zOi-pi1!*V`j71RJ{g5OyD&OL&* ziK1x0FZO3N9jJA6vYyrXX**Gik!&%e9wQqk8EdHToZ83DKHhHb|Hk)ppl`1aq9KJ7 zp9AyyZ-~C>?#6*m7PJY^)cVL|gb^VJ=^H(rhFc^Su`70?6DT)d*1)JA8-0@tW_?tN z-OJ^h1m!d$BYTX?WpMCm{pQ2m(>|eV2oshvChalNB<*kyRf&jqX;zK;A=jr2gX`#Z z4F-2S8#Ect+8M-z9qi{iLaX3ZSo^TG*sUeRapCA1{SQKej*qv_pU@&D5_AjF=($Ya z4f4xBawBtV)FnU$i-5F=7!{8}WWXBK76;BIBBzvB=yRe!R$i%Ms*`7;0m0c1Td`uB zfJi?QzicOeiN=;m^W|y!eEF*S&p>$fa{NQ>+vXi6M+2KPk^oS_Yj+wgIr{T0d(&S8Nr))vYo7t>rF=fEtEJqZ3x4FzlS z%}8xJLwH!5n{Xd)c0Pv(rrWXpPD&l!_XbEae&@;Efc+wSzk{Ztr+&Qr$4`ZS!4mXz z2y!hbT^=l2_m$*ipNU1Que1c}j{{bXTFp4YvhyH8h78?-PG?|~>>aiycbXYMl!;>A zZ|4WU>#K9S4gf%ch4jTGlowtErIL%BR$gOB=xvBsQg3q@1oV9UQ>f?EQ&0&x9`!Vi zzra+TH~`11gLW76hRd1y=F{}4l)DBMIPl4JL^ATc zK-f+gR8m|#-tcB9hrR0Cn(B{91)Wsv>fQDPn&VNfr(hQdugrElRz~047NBHY7xAk; z5d~G1>uF|y&*|p8v=A>97}U~aIXXs~C`U7;Y&n{a$V|k7k4ACDcWct;zyYm3#lmXCbdCZuGmi;mPs%6t*=;r4M$mxJalyZ7q>3f-nWEFb9*CdHsKD+m|(G z6ATD)LUBS!R*eUAf@@9kvdlC$g@9zx(0D3Vc>Qze2)`Na+fH{Hm@AZ2Wxj}h!{(e+ z#Vdw9qLNAeFbrkZkMO#(9t4gg)3`mTFjCdXJBcdL??1x-muU4Q{6i}UpwE4F2`6t7 zg6@<4o9c-e93R%Zrd|y#VzV9-0zx~0lTwELK2b?@s~b(BRTi2mVS8}4WNG?{sB_z` z_=5bim=WQ_K|RVkQJNOqfX{nQd7czcc;1*`A#~#GSxskHCw$DWe)u5&&NAy6ZLPU{^>AwTo-ljJ4hQy>Vt?xp=P=7*=LICLX1UAE_&k)cgN9u0@9$n5x<#y; zve2dkDc4;o)JxrWhgf}67R|7Q8nNJd*9a+!*P@&W--4}1jImO7(52k{YNM@#1VlmU z46NGWdDExL2R;#$W-PAs=I-t~YKfB-x)I~h^ed{}z1Q0EOO#bsS(G=r{$erx8%zCY zV?Gl+;akjeLm5pl3DKO2>!a?ELf;a>Vm;p)!2f9LEL%?#W0b%f9Dl8&?J}4a91{o!QklQDP~)Sc>2}6xcg(sv23fn89CZ+6Pow?r-pAcFdr1M`qO63 zp%Q~|G+gUGhxpCD&_Xd{%RS|ObN!`CUnCW7h(DPk;T#>@pBi>ViZ$#LDp{MJ`*tXw z$|fP$S|jADU4H|LDTE?Pitcc|89Qp-XV;Z5sPxe{_n+3gIC7IOfZSw;QC1uy_qp|* z$+Y~RVM9Hzjr2Yw2voNUX2I}E7CGn^=mMA?>#!t_RSB#-q);3*MYGvDa7Do3(e>$G z^-5Nl%!YArPnY?=G` zx`uKRZ;tRcus2ea9w1PgtdnC4B^*4-Gi>y{{v81J&#o_lR)kGRx|^H|tLmpCK`Ewn zf0zc_DHjw-Z9QTdDWTqm>-M8arMK_lx{V%?MZ_vItxI7!oRS489g`xu!_*0GS`d)V ze6UgAGlCM3PQA@eluwYggdz#+TCA9V(_5wd38b~3?t$84)byvpO!KdfT+xo&j&Kxz$hK5wP7=x48Q>^NCAisi?KN4M2H{|3hAM zC0^X>KXX?d3YZsnhc3Y?%gxfSpN|d=H7cp5gYwC!Yqv5UYY9IU42CA@&v2~fHTO%C zPVa_iN{}pc#m=yv&?S-VroYf4HSR{^4#~K~4jcy4)p@f7|3)Z{;QI%Fu)jsek?j5B zwO++D+iX}vwJ1HNF86@-TU+87FHl~S|6*c(4eaIF_Y=YPu<*2C`wTb7@jHy) zawTQdF%As0G#`>(xtq7>M5)? z9Mx-Sp;}M|sT>;a&zU|p4QfPO%utd)6tMuUBX$pP`XPRg;n#}a8vK?kWya+pM0AxI zTFVWeX}}aj&G2+RrLD|_crX1)>70K%VR+T~_{krdxCDzA!VN4)DSfmao-~3W5$^byp|fq?-`UWdMAEA= zdXUK)$%YKi@CYx1zu^L1_%_(<-+_ z(&gJNbp9U9(sFYsP3h^Svje%N)kH13Af^GH0YZm2A;I5ECq|&1Kl_N0qHrS7*t(?! zx!GYk*&6X^U4I!P@nRg$QUUt}+{xcrrYN&4&&bkreA>f5rc!;Eo3GRXSImh_f-aiy zj8Ph2srJNP@a^D)w+^DRR=tk{mG_F}ZZ=*5a)gC_1HA`1dP+CykVFzxNjAN=b{7F7 zCD>nPDS=ADwKu>j0PS(U9OD6 zQf9cQv%j=ZG)Q-Q)%}=^5UQsB(gLL9d3OC`G5OXvOw=ddwHdD9-s&<#&^96HLd0A^}nSv8GoX*^?Vm6O>1CAFbzQ}kIiBoW&4GSa(5&w!25;0G)n-Nn@Cl!N- zih+&Y07s>}XJaT*h|JiG`KJh&vADy{|X_iov}a?|IPja{+sMo>6~pK>s4LU zWirBC8Vl+g+z#hD-F`M8mT}1Fp8$z7h-?fJWakNf?;emQdDWx*0V9xh z{9*)Zlvf7mFc`1u;O{XU$JDB8IX;YvFoH4E-@m-;eIsYr#Y!tvykdV{PpN?p1JD%= z(=YIoK&s|GW0tnEzWQ^{Td!5cz1+n=FWJ`JEmUC7+sH25Nt z8?u@PU&eKPCW|jbW~#MYMeGQb98VAW&}CQk);~c(bjBtrs+&E>!V<|C@YWV)k~mzq zOzG0ZVFwe3c)Fa%?etD1&D7Ih0ueJ?E{ICS`nuOwV3}LwK}3(rgGOm|WIWdX`Vq?} z_&$x$HZ81|SZFelwzyZ!C%wQz^6GJ;@%{t29nJzt_!E9^hTYo9zz)Gm$Fx2R+xO!< z2Z$NdZibmj0Ua{qpvSUX5QK{~jVu`0v|nXkt$gh7U4tgAfje05qnVc@yy-zRKEw() zJpUfH$euGTi zsBZr_bp|vbs6>NC6VD(En?NBBX8|gI4j_YLnOJTl|Q_&&JQ zAfDqPhe`BjVoP(n*GM?wWojAKefm!@2ndHEY}?3Dy71A8PnEZ|>puBx`Z^p;QX4VR zIVF?Ia46?HJ*mQc1W#C7N6*K^%01NZ4>rR`e_;O%VuIv>41Cb&(8e?pcLE0Reo}mu z9`6Em1EU4BGfXz10=YM;)6eISkg+a&FM~z$T5x?mG7FnA7IESb?AQ8UJM!8GuN@w> z-~Y+!Q_9KHOCk5^I3)Y&_f4-gjHZ)7*P9#Cuyf3^&M+Sl>^Kcu@%iN~E{r+VQtCp>FT{ms%%9VsngMXE@;(=w3Wep9h8ywgWjyTck zircHIcnUoVRX5KsPk0ncZ@+EU&GX|a3vS52t{^jGs>8o($=6pdb4aTlD^{(LRxDY$ z;+xAH^~;v5VPFKxH-qx6S}i%2ty=BBuimkC&60bUIhLdDm8;jUNGP~OTCsXnyxa{J zEVou#`Z?vUr*doj4a*$sRy0WdB`Y1v{j2UJ*p7RbtX#<|AiSnu5dPxTtCnq8AziaX zqKiYKCdTl(wvfuj+r4_tG5}t^YVB&!Vd=7UEACCmtI=rLhBeFXm6k1Kl!;SOAo^U( z=;KF?TAl~|E2R}ueZ#UPOF^M~?;oE3!gSFJEnOll0lJwPOTNBpb;AQ7z?z2D_cbhe zz#%PbcwohXT-cq8t(H`#|X+n|S%2i9i-TqbguUfr+)l4eQ|H_w16-(Aiv%m`L zmU&jM@vng^ewp@MyJFSS)$4`ZmaSd8sc$!}8kIH_+X|z3fv_ zLJ{uix1k#gl6wSUA<|Fg3&PQ>vC@IV;cc_cZPsJNgk!=@mzDT_-O+(1x3oxwp?*#wkDKmlbH0TFp$-Ch!wnKy6Vn?K&qRR6x5 zs&lJOojSGNu0um61BUT_Sv; zhyG;f>40KSzN?t+k(iMf%2JDWQ@&esfpc@7LRa4K%<|%!#3csUq1*$_nnSt#$&p=d<8tK83Yhs3&zN=nQ97Ib?&rMb>L zzrOBTdYGLV(vohlresfzJc!86_77QqG}{$Q1@xo)r&)|{dLdyWi(Gz{A2TNlCf)BM z9Kz*6u%XpUYT`j2rPzW9-5N@Or+^tiR}1zueCJV(uL9`*L73CPzn8^ekErU14732v zco^7#%oFhS8_gIACrZ*TG9f09nGm-){jWLSl}3#1GUd_v!&f}N{>|-M4xc&4HjNA` z<1*U6oAKv_OWxhN%CxBQkFOlGaP60KKDmD3n{RVFBnmO%mS)HE|K?ki^rU0h;vVmI zezL*z)5o@6eB-l8yD}wjrzS0!dV5CxTrj=gJ1K+TAN_i(nex*IFa7r2+&ydl_G$NH z1D+~;y&^8c85P#~e))^ffBfo&6K`MX{!G#AJC{DV>f)fCkG?;8#;_5s)9>Wfrm@%d zAK3Kq)mKi9dU?Qe+J~)|zvh0r@@U#;S?%%D-Z>59+r0JTi`RbGy!q?cH}6_oI4O1R z%rWnk>>Bb@uX}7z0iIKCnhw@cr3S{ z_vE{q7B89p%#$S-dmrn%>+a8v2%mI#wb|J40^cL~9UONg?SK83_h&!-!OZOM#$0Oq zH+|2Soz6>B>Q%SsUodiH^Aw?9+E>M&H@fohiH);QJoD_TKyLlqn13v(`B=!m z_Ngsl9I5$);bicye1hd;YT4)a8pR5QlNj}=`@aeJI_G+Dq?vL0@?01GR~E2@(SNc+ z2>qumIpao+YZs9A+ChJ0{$f8JJMYl1G!{3e%A`w>fBnLJ3uF9`Z~2R#6){6xfWG@L z=8q5Le-HV$E;zcNH95B6`vrslvHUUf%@Td?zNwQEvbb67BxaTD7IXJU*L)~hZZQ^$ak(Mk#tR51d7*1QU!|FP2vEJ0&N4@ z3iPLSB(gQ=8qj+|CxBw>CRv~rplP7=1zQIl4cZly8nZJfb?%4)1-T{QXQ6J(4`z(Q z1${71DRWbr+?=kR`9B;-x2(G>PzPR-*WqYm1{`BT@kxlAgAh+%s1<*)R(x`;_>@}l zskP$MYQ-^p@J@&C3IN)d)EATjQ8Q3`*M&L@)LG#7X@R==|NHFsx>na&AZUT$dEn5$ z@q&^Aw?!(4Qu-U4p%6M@ggAI_{O9jL^f^UcsI$QT)B<$qwE%)+h@N|CoSw7ky9v(U zre9D!Q2K5|&&1TRlAgCIr94XM8JRw#XZ7GSDwp~cQQ8=wa_R7G(i8F_2CNrDZY#{LBEw)tD)NASkVyUYb)m#Xt;D3ea~bFFILKzcqX)o&3%>w6ub`Q8Vpep>+gd=EgMN5Lr6KL1_N z(`hMxQ2T}vU!O4I27-lB|}bdXQ!N8oP(jsTZ|h|Dk&1;hdpkN^whB+ z8rT4A1C9V^0pbWFkw7%i70`hUU=UCWi~*hnW&lfo4}dMeao{}A2zo{XvA~-CVdM?y zGp=74$wAr+OaNv9uK}xpEx=LWJn$P3fxIn%4gd$l0U1CJPzp$pISX_V@D{Kd*a@5j z!tksOkOm9^N`XpXA}|YB0?^PM_0Ujfw|~!W%}Ju$<@C}UPV;&n-$;aImY3n?C*NUu zLXe&Gu0FBc>xGX&fJGWu!0SEI<#jttOI`UHt}?hzkXB*1T%$Mr0ZA8V$y({&B+2yB zNcALoN_<|Ao2;{>mwSi0XzgT&gqsWr)L&EX@M40BE5NqtR$+dqbP59q6h8`a0?4Q4_z=WFVYb zwy>Yei~DHUXigYz^t^6Y36|X%W<0NS6ynWldOE?ptR&wB^$MgHhcu&i&4G(+Tr?%Q z+%DfOoza+D#jiA}u%w2ZkZ$grhXU3xvqBGvmMbqc`~3A_je)-Ek(|*hIW6e>ksJ0{ zS*aH$FNnvF!X#$|`AdVP&^>8ICFp_X)BmA^+G5jM>vv2Rhiy zEAB3|wVA&B!0;pw_|s1KT$QGl6nNsv)tc7RQoZ1pgZ3{lTar$*kU2CSpNOqEf|l-` z+>^$q6RJRRjrUQe5B48g7EhL1dQ$JGgi$`1!_&Vg-<4SC^pZnV%B|UPF?oAA{qYZ$ zZd(Fde^FRatiuzki^TfdMzx@AM=Kt>k%N*$OQ{<9MJRz~&&=nqyBMXDP(BTmYU~B=Z?=Xv@7g=#L|h}UALPO9 zqm~>F8nBR;fK#BwY`4$MQv%)HwOW)OXe+Jn_BFx(3f@Wrh9L*^&g*N5>!?4J<|)Z95G~fCZzD))Q=P%_zlOM!h%$o0`Cp1rnS$jF$%C)Vtz8 z5HR7-LTof+FdsADFz1*Qwt$_%u3*=&e`k-eKe9u(DsC^=gfHf2@Qe9s{3zc(-YS#` zKH+g;oG?+CC%h%B5k3(<7xoM1gkJTZ#9H@nUzemzXaO7rkPI_@#JRY$?S` zPfClVcckso0qLX^Zf$7oWnE(3X5DT5&6+4@$$9d6IaTo}rHq2gb|G<7Ku$XK!+iPX|qP?e?OtzRi%$?&R`4~Q)@57hzYhv-H61pPUEivEheSg+RK)BmdP)c5O$ zbOX3N;8*{$qu*1|<_g`Ar!<$PQPSBajSz)j?y=gx4A_;&mg{2cxReiwg; zKg~x7k-}W`<6hw+da#k$S!Bd_#UI6bQYVR(?9xEVDSaUgu-+p_%T9TbyjI>XE6QNy zd*!n7v^rDWtsYnJ(3)%gwOnnnwo^N)UDY=0C-pmx2aHFIUB+4CLEBKG!m(WWu^KbF>h2}yV;aTA?!Wp5Z7%S>xp}0z1hq1O#JSm(h+gMx1SfZHKLwy~@7Ue%+3R#9R|oFp|od<;;U@FE*c@!?xsl^Hcf0;u>*_ z*i2d_eJ*`3{UDu{ev&RrzeO?K zUN-g^r;JG3OSU&{U!eDQ+VnV*^K zOanHGjb=Ntacl}ZoqdPh%${T~vVY*(avizZ+%oPG*9Nns1K*kN%V+VG{CunjAM&5_ zn|O;*U$|SiM~D_45V{FHgnmM{P#`oHW5g~PNsowq#ccGAM|?q?CC(R@iYvt(;sNm( zM%d3Hky=WeWJrB5%AS*^NVBDR(qicisgZS{b-HyeR)-_jALPq&p7IiA)<$)!TA)>H zGxR%*C?n2DGP)aSMmpO5sQs`|S6mf8U;S`RHvb+#0=qK`S`4_o~ z(phmR!<4DYY-K*y(G|*P$`-|cbpkVcg#FL<-{|~!m5?_;!kLcD1?D%VHEXbWY&mAc{aicY72!+afN)9p zO$Zkoi_I~DI*HvxUev@mF+JoW?6Hr`PM?K+q#vGWb0+CMQ$j! zmOIFboF+TuVRDr`PktXO>H~_PC`vZgr7C5L@|-$H{Xo5{Hq}mOS2RJl>9ep;bjQ9B zYfG_3*%|wL_I36vc2Z5xE%>*kjGLLlTxKHJ&TJp-;cv5-*l14ShH_=xd)!9samcjI ze->%TL@~c|5qv{_jrCLO7uKED1J<&yinM e7SZF(A^-QO@33dt%k=PB7wRlfXMz8h7WgleKSVzO literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/Principal.cpp b/Esergui -BDE utilizando API/EserguiBDE/Principal.cpp new file mode 100644 index 0000000..cf70bcf --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Principal.cpp @@ -0,0 +1,1289 @@ +//--------------------------------------------------------------------------- +#include +#pragma hdrstop + +//--------------------------------------------------------------------------- +#include "Principal.h" +#include "Dialogo.h" + +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TForm1 *Form1; +TAutorizacion *Autorizacion; +TPesoEntrada *PesoEntrada; +TPesoSalida *PesoSalida; +TAlbaran *Albaran; +TTransfer *Transfer; + +//--------------------------------------------------------------------------- +__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) +{ + //Pedimos memoria para la clase Autorizacion + Autorizacion = new TAutorizacion(); + //Pedimos memoria para la clase Peso Entrada + PesoEntrada = new TPesoEntrada(); + //Pedimos memoria para la clase Peso Salida + PesoSalida = new TPesoSalida(); + //Pedimos memoria para la clase de Albaran + Albaran = new TAlbaran(); + //Pedimos memoria para la clase de Transfer + Transfer = new TTransfer(); +} + +//--------------------------------------------------------------------------- +__fastcall TForm1::~TForm1() +{ + //liberamos las clases + delete Autorizacion; + delete PesoEntrada; + delete PesoSalida; + delete Albaran; + delete Transfer; +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Salir1Click(TObject *Sender) +{ + Close(); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::ConductorClick(TObject *Sender) +{ + int nError; + + //Mostramos el Label y Edit + Label1->Visible=true; + Edit1->Visible=true; + Edit1->MaxLength=4; + Edit1->SetFocus(); + + //Asignamos a la opcion la de conductor + byOpcion=OpConductor; + + if(strcmp(sDatoTecleado,"")) + { + //Comprobamos el Conductor + nError=Autorizacion->ComprobarConductor(sDatoTecleado,hBaseDatos);//"1151" + if(nError!=AUT_CON_CORRECTO) + MuestraError(nError); + else + { + MuestraLista("CONDUCTOR"); + ShowMessage("Fue todo correcto"); + } + } +} + +//--------------------------------------------------------------------------- +void TForm1::MuestraError(int Error) +{ + char scadena[100]; + + strcpy(scadena,"Se produjo un Error: "); + switch(Error) + { + case 1: + strcat(scadena,"AUT_CON_VALOR_NO_ENCONTRADO"); + break; + case 2: + strcat(scadena,"AUT_CON_BORRADO"); + break; + case 3: + strcat(scadena,"AUT_CON_CARNET_CADUCADO"); + break; + case 4: + strcat(scadena,"AUT_CON_ADR_CADUCADO"); + break; + case 5: + strcat(scadena,"AUT_CON_EN_PROCESO"); + break; + case 6: + strcat(scadena,"AUT_CIS_VALOR_NO_ENCONTRADO"); + break; + case 7: + strcat(scadena,"AUT_CIS_BORRADO"); + break; + case 8: + strcat(scadena,"AUT_CIS_TARJETA_CADUCADA"); + break; + case 9: + strcat(scadena,"AUT_CIS_ADR_CADUCADO"); + break; + case 10: + strcat(scadena,"AUT_CIS_ITV_CADUCADO"); + break; + case 11: + strcat(scadena,"AUT_CIS_SEGURO_CADUCADO"); + break; + case 12: + strcat(scadena,"AUT_TRA_VALOR_NO_ENCONTRADO"); + break; + case 13: + strcat(scadena,"AUT_TRA_BORRADO"); + break; + case 14: + strcat(scadena,"AUT_TRA_TARJETA_CADUCADA"); + break; + case 15: + strcat(scadena,"AUT_TRA_ADR_CADUCADO"); + break; + case 16: + strcat(scadena,"AUT_TRA_ITV_CADUCADO"); + break; + case 17: + strcat(scadena,"AUT_TRA_SEGURO_CADUCADO"); + break; + case 18: + strcat(scadena,"AUT_SUM_VALOR_NO_ENCONTRADO"); + break; + case 19: + strcat(scadena,"AUT_SUM_BORRADO"); + break; + case 20: + strcat(scadena,"AUT_ORC_VALOR_NO_ENCONTRADO"); + break; + case 21: + strcat(scadena,"AUT_ORC_BORRADO"); + break; + case 22: + strcat(scadena,"AUT_ORC_ESTADO_ACABADO"); + break; + case 23: + strcat(scadena,"AUT_ORC_SUM_OTRA_ORDEN"); + break; + case 24: + strcat(scadena,"AUT_ORC_CIS_OTRA_ORDEN"); + break; + case 25: + strcat(scadena,"AUT_ORC_FECHA_MENOR_QUE_HOY"); + break; + case 26: + strcat(scadena,"AUT_ORL_VALOR_NO_ENCONTRADO"); + break; + case 27: + strcat(scadena,"AUT_PRO_VALOR_NO_ENCONTRADO"); + break; + case 28: + strcat(scadena,"AUT_PRM_PROD_MAYOR_PERMITIDO"); + break; + case 29: + strcat(scadena,"AUT_PRM_PROD_MAYOR_CAP_CIS"); + break; + case 30: + strcat(scadena,"AUT_PRM_PESO_MAYOR_CAP_TRA"); + break; + + + case 250: + strcat(scadena,"ERROR_INTERNO"); + break; + + } + ShowMessage(scadena); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::FormCreate(TObject *Sender) +{ + ComprobarNomFichError("PruebaError.txt"); + //Generamos un Error de prueba en el fichero pruebaError.txt + GenerarError("Prueba de Error"); + //Inicializamos el BDE + InicializarBDE("IDAPI.CFG"); + //Conectamos al BDE + ConectarBDE("ESERGUI",&hBaseDatos); + //Pedimos memoria para sus variables + Autorizacion->ReservarMemoriaEstructura(hBaseDatos); + //Pedimos memoria para las variables de peso entrada + PesoEntrada->ReservarMemoriaEstructura(hBaseDatos); + //Pedimos memoria para las variables de peso entrada + PesoSalida->ReservarMemoriaEstructura(hBaseDatos); + //Pedimos memoria para las variables de Albaranes + Albaran->ReservarMemoriaEstructura(hBaseDatos); + //Inicializamos variable + Transfer->InicializarEstructuraTransfer(); + //Inicializamos el codigo de teclado + strcpy(sDatoTecleado,""); + byOpcion=0; + bTodos=false; + //Inicializamos los HANDLE de los Threads + HDAUT=NULL; + HDPSE=NULL; + HDPSS=NULL; + HDALB=NULL; + HDContadores=NULL; +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) +{ + //Finalizamos los Threads + TerminarThread(HDAUT); + TerminarThread(HDPSE); + TerminarThread(HDPSS); + TerminarThread(HDALB); + TerminarThread(HDContadores); + //Liberamos la memoria de las variables de la estructura + Autorizacion->LiberarEstructura(); + //Liberamos memoria de Peso de entrada + PesoEntrada->LiberarEstructura(); + //Liberamos memoria de Peso de salida + PesoSalida->LiberarEstructura(); + //Liberamos memoria del Albaran + Albaran->LiberarEstructura(); + //Desconectamoel el BDE + DesconectarBDE (hBaseDatos); + //Finalizamos el BDE + FinalizarBDE(); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::InformacionEstructura1Click(TObject *Sender) +{ + BYTE i; + int POSX,POSY; + char scadena[50]; + DatosAutorizacion sDatos; + + Autorizacion->LeerEstructura(&sDatos); + //Cargamos Paneles de campo + for(i=0;iParent=this; + Panel[i]->Top=0; + Panel[i]->Left=i*100; + Panel[i]->Width=100; + Panel[i]->Height=20; + Panel[i]->Enabled=true; + Panel[i]->Visible=true; + switch(i) + { + case 0: strcpy(scadena,"CONDUCTOR"); + break; + case 1: strcpy(scadena,"CISTERNA"); + break; + case 2: strcpy(scadena,"TRACTOR"); + break; + case 3: strcpy(scadena,"SUMINISTRADOR"); + break; + case 4: strcpy(scadena,"PEDIDOS"); + break; + } + Panel[i]->Caption=scadena; + } + //Cargamos clases + for(i=i;i<(N_TABLA+N_CAMPO);i++) + { + //Cargamos los paneles y le damos la posicion y el tamaño + Panel[i] = new TPanel(this); + Panel[i]->Parent=this; + if((i-N_TABLA)Left=POSX; + Panel[i]->Top=POSY; + + + Panel[i]->Width=100; + Panel[i]->Height=20; + Panel[i]->Enabled=true; + Panel[i]->Visible=true; + //Copiamos scadenas en los paneles segun corresponda + switch(i) + { + //Paneles del conductor + case N_TABLA: + strcpy(scadena,sDatos.pszCodigoCon); + break; + case (N_TABLA+1): + strcpy(scadena,sDatos.pszCadCarnetCon); + break; + case (N_TABLA+2): + strcpy(scadena,sDatos.pszCadADRCon); + break; + case (N_TABLA+3): + strcpy(scadena,sDatos.pszNombreCon); + break; + case (N_TABLA+4): + strcpy(scadena,sDatos.pszCarnetCon); + break; + case (N_TABLA+5): + strcpy(scadena,sDatos.pszInternoCon); + break; + case (N_TABLA+6): + BoolACadena(sDatos.bBorradoCon,scadena); + break; + case (N_TABLA+7): + itoa(sDatos.nResultadoCon,scadena,10); + break; + + //Paneles de la cisterna + case (N_TABLA+8): + strcpy(scadena,sDatos.pszCodigoCis); + break; + case (N_TABLA+9): + strcpy(scadena,sDatos.pszCadTarjetaCis); + break; + case (N_TABLA+10): + strcpy(scadena,sDatos.pszCadADRCis); + break; + case (N_TABLA+11): + strcpy(scadena,sDatos.pszCadITVCis); + break; + case (N_TABLA+12): + strcpy(scadena,sDatos.pszCadSeguroCis); + break; + case (N_TABLA+13): + strcpy(scadena,sDatos.pszInternoCis); + break; + case (N_TABLA+14): + strcpy(scadena,sDatos.pszTaraCis); + break; + case (N_TABLA+15): + strcpy(scadena,sDatos.pszBrutoCis); + break; + case (N_TABLA+16): + strcpy(scadena,sDatos.pszsVolumenCis[0]); + break; + case (N_TABLA+17): + strcpy(scadena,sDatos.pszsVolumenCis[1]); + break; + case (N_TABLA+18): + strcpy(scadena,sDatos.pszsVolumenCis[2]); + break; + case (N_TABLA+19): + strcpy(scadena,sDatos.pszsVolumenCis[3]); + break; + case (N_TABLA+20): + strcpy(scadena,sDatos.pszsVolumenCis[4]); + break; + case (N_TABLA+21): + strcpy(scadena,sDatos.pszsVolumenCis[5]); + break; + case (N_TABLA+22): + strcpy(scadena,sDatos.pszsVolumenCis[6]); + break; + case (N_TABLA+23): + strcpy(scadena,sDatos.pszsVolumenCis[7]); + break; + case (N_TABLA+24): + strcpy(scadena,sDatos.pszsVolumenCis[8]); + break; + case (N_TABLA+25): + strcpy(scadena,sDatos.pszCamionCis); + break; + case (N_TABLA+26): + BoolACadena(sDatos.bBorradoCon,scadena); + break; + case (N_TABLA+27): + itoa(sDatos.nResultadoCis,scadena,10); + break; + + //Paneles del tractor + case (N_TABLA+28): + strcpy(scadena,sDatos.pszMatriculaTra); + break; + case (N_TABLA+29): + strcpy(scadena,sDatos.pszCadTarjetaTra); + break; + case (N_TABLA+30): + strcpy(scadena,sDatos.pszCadADRTra); + break; + case (N_TABLA+31): + strcpy(scadena,sDatos.pszCadITVTra); + break; + case (N_TABLA+32): + strcpy(scadena,sDatos.pszCadSeguroTra); + break; + case (N_TABLA+33): + strcpy(scadena,sDatos.pszInternoTra); + break; + case (N_TABLA+34): + strcpy(scadena,sDatos.pszTaraTra); + break; + case (N_TABLA+35): + strcpy(scadena,sDatos.pszBrutoTra); + break; + case (N_TABLA+36): + BoolACadena(sDatos.bBorradoCon,scadena); + break; + case (N_TABLA+37): + itoa(sDatos.nResultadoTra,scadena,10); + break; + + //Paneles del Suministrador + case (N_TABLA+38): + strcpy(scadena,sDatos.pszCodigoSum); + break; + case (N_TABLA+39): + strcpy(scadena,sDatos.pszNombreSum); + break; + case (N_TABLA+40): + BoolACadena(sDatos.bBorradoSum,scadena); + break; + case (N_TABLA+41): + itoa(sDatos.nResultadoSum,scadena,10); + break; + + //Paneles de los Pedidos + case (N_TABLA+42): + strcpy(scadena,sDatos.sOrden[0].pszMatriculaCisOrd); + break; + case (N_TABLA+43): + strcpy(scadena,sDatos.sOrden[0].pszCodigoSumOrd); + break; + case (N_TABLA+44): + strcpy(scadena,sDatos.sOrden[0].pszNumeroOrd); + break; + case (N_TABLA+45): + strcpy(scadena,sDatos.sOrden[0].pszNombreDesOrd); + break; + case (N_TABLA+46): + itoa(sDatos.sOrden[0].nResultadoOrd,scadena,10); + break; + + } + Panel[i]->Caption=scadena; + } + //liberamos clases + ShowMessage("Estos son los resultados"); + for(i=0;i<(N_TABLA+N_CAMPO);i++) + delete Panel[i]; +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::CisternaClick(TObject *Sender) +{ + int nError; + + //Mostramos el Label y Edit + Label1->Visible=true; + Edit1->Visible=true; + Edit1->MaxLength=4; + Edit1->SetFocus(); + + //Asignamos a la opcion la de conductor + byOpcion=OpCisterna; + + if(strcmp(sDatoTecleado,"")) + { + nError=Autorizacion->ComprobarCisterna(sDatoTecleado,hBaseDatos);//"0602" + if(nError!=AUT_CIS_CORRECTO) + MuestraError(nError); + else + { + MuestraLista("CISTERNA"); + ShowMessage("Fue todo correcto"); + } + } +} + +//--------------------------------------------------------------------------- +void TForm1::BoolACadena(bool bVariable,char *pscadena) +{ + if(bVariable) + strcpy(pscadena,"true"); + else + strcpy(pscadena,"false"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::TractorClick(TObject *Sender) +{ + int nError; + + //Mostramos el Label y Edit + Label1->Visible=true; + Edit1->Visible=true; + Edit1->MaxLength=10; + Edit1->SetFocus(); + + //Asignamos a la opcion la de conductor + byOpcion=OpTractor; + + if(strcmp(sDatoTecleado,"")) + { + nError=Autorizacion->ComprobarTractor(sDatoTecleado,NULL,hBaseDatos);//"NA-0664-AL" + if(nError!=AUT_TRA_CORRECTO) + MuestraError(nError); + else + { + MuestraLista("TRACTOR"); + ShowMessage("Fue todo correcto"); + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::SuministradorClick(TObject *Sender) +{ + int nError; + + //Mostramos el Label y Edit + Label1->Visible=true; + Edit1->Visible=true; + Edit1->MaxLength=1; + Edit1->SetFocus(); + + //Asignamos a la opcion la de conductor + byOpcion=OpSuministrador; + + if(strcmp(sDatoTecleado,"")) + { + nError=Autorizacion->ComprobarSuministrador(sDatoTecleado,hBaseDatos);//"1" + if(nError!=AUT_SUM_CORRECTO) + MuestraError(nError); + else + { + MuestraLista("SUMINISTRADOR"); + ShowMessage("Fue todo correcto"); + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::PedidosClick(TObject *Sender) +{ + int nError; + + //Mostramos el Label y Edit + Label1->Visible=true; + Edit1->Visible=true; + Edit1->MaxLength=5; + Edit1->SetFocus(); + + //Asignamos a la opcion la de conductor + byOpcion=OpPedidos; + + if(strcmp(sDatoTecleado,"")) + { + nError=Autorizacion->ComprobarPedidos(sDatoTecleado,hBaseDatos);//"10000" + if(nError!=AUT_ORC_CORRECTO) + MuestraError(nError); + else + { + MuestraLista("PEDIDO"); + ShowMessage("Fue todo correcto"); + } + } +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::TodosClick(TObject *Sender) +{ + + bTodos=true; + + if(!byOpcion) + ConductorClick(Sender); + else if(byOpcion==OpConductor) + CisternaClick(Sender); + else if(byOpcion==OpCisterna) + TractorClick(Sender); + else if(byOpcion==OpTractor) + SuministradorClick(Sender); + else if(byOpcion==OpSuministrador) + { + PedidosClick(Sender); + bTodos=false; + } +} + +//--------------------------------------------------------------------------- +void TForm1::MuestraLista(char *cadena) +{ + int i,j; + char scadena[100]; + DatosAutorizacion sDatos; + + ListBox1->Clear(); + Autorizacion->LeerEstructura(&sDatos); + + if(!strcmp("CONDUCTOR",cadena)) + { + strcpy(scadena,"CONDUCTOR"); + ListBox1->Items->Add(scadena); + BoolACadena(sDatos.bBorradoCon,scadena); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadCarnetCon); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadADRCon); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszNombreCon); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCarnetCon); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszInternoCon); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCodigoCon); + ListBox1->Items->Add(scadena); + itoa(sDatos.nResultadoCon,scadena,10); + ListBox1->Items->Add(scadena); + } + + if(!strcmp("CISTERNA",cadena)) + { + strcpy(scadena,"CISTERNA"); + ListBox1->Items->Add(scadena); + BoolACadena(sDatos.bBorradoCon,scadena); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszNumeroEjesCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadTarjetaCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadADRCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadITVCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadSeguroCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszInternoCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszTaraCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszBrutoCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCamionCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszMatriculaCis); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCodigoCis); + ListBox1->Items->Add(scadena); + for(i=0;iItems->Add(scadena); + } + itoa(sDatos.nResultadoCis,scadena,10); + ListBox1->Items->Add(scadena); + } + + if(!strcmp("TRACTOR",cadena)) + { + strcpy(scadena,"TRACTOR"); + ListBox1->Items->Add(scadena); + BoolACadena(sDatos.bBorradoTra,scadena); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszNumeroEjesTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadTarjetaTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadADRTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadITVTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCadSeguroTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszInternoTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszTaraTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszBrutoTra); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszMatriculaTra); + ListBox1->Items->Add(scadena); + itoa(sDatos.nResultadoTra,scadena,10); + ListBox1->Items->Add(scadena); + } + + if(!strcmp("SUMINISTRADOR",cadena)) + { + strcpy(scadena,"SUMINISTRADOR"); + ListBox1->Items->Add(scadena); + BoolACadena(sDatos.bBorradoSum,scadena); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszCodigoSum); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.pszNombreSum); + ListBox1->Items->Add(scadena); + itoa(sDatos.nResultadoSum,scadena,10); + ListBox1->Items->Add(scadena); + + } + + if(!strcmp("PEDIDO",cadena)) + { + strcpy(scadena,"PEDIDO"); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[0].pszMatriculaCisOrd); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[0].pszCodigoSumOrd); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[0].pszNumeroOrd); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[0].pszNombreDesOrd); + ListBox1->Items->Add(scadena); + itoa(sDatos.sOrden[0].nResultadoOrd,scadena,10); + ListBox1->Items->Add(scadena); + } + + if(!strcmp("PESO",cadena)) + { + i=0; + j=0; + while(!sDatos.sOrden[i].sLinea[j].nResultadoPesoCarga) + { + strcpy(scadena,"PESO TOTAL DE CARGA"); + ListBox1->Items->Add(scadena); + itoa(sDatos.sOrden[i].nPesoOrd,scadena,10); + ListBox1->Items->Add(scadena); + for(j=0;jItems->Add(scadena); + strcpy(scadena,sDatos.sOrden[i].sLinea[j].pszDensidadPro); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[i].sLinea[j].pszNombrePro); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[i].sLinea[j].pszCodigoPro); + ListBox1->Items->Add(scadena); + strcpy(scadena,sDatos.sOrden[i].sLinea[j].pszCantidadPro); + ListBox1->Items->Add(scadena); + itoa(sDatos.sOrden[i].sLinea[j].nResultadoPesoCarga,scadena,10); + ListBox1->Items->Add(scadena); + } + + i++; + } + } + + if(!strcmp("DISTRIBUCION",cadena)) + { + strcpy(scadena,"DISTRIBUCION DE LA CARGA EN LOS COMPARTIMENTOS"); + ListBox1->Items->Add(scadena); + for(i=0;iItems->Add(scadena); + } + } + +} + +//Comprobamos si el peso de carga es superior al maximos permitido por el camion +void __fastcall TForm1::ComprobarPeso1Click(TObject *Sender) +{ + DatosAutorizacion sDatos; + int nError; + + nError=Autorizacion->CalcularPesoVolCarga(hBaseDatos); + Autorizacion->LeerEstructura(&sDatos); + if(nError) + MuestraError(nError); + else + { + MuestraLista("PESO"); + ShowMessage("Fue todo correcto"); + } + if(strcmp(sDatos.sOrden[0].sLinea[0].pszCodigoPro,"")) + MuestraLista("PESO"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::ComprobarPeso2Click(TObject *Sender) +{ + int nError; + + nError=Autorizacion->ComprobarPesoCarga(hBaseDatos); + + if(nError) + MuestraError(nError); + else + { + MuestraLista("PESO"); + ShowMessage("Fue todo correcto"); + } + +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::DistribuirCarga1Click(TObject *Sender) +{ + if(Autorizacion->ComprobarDistribucionCarga()==0) + { + MuestraLista("DISTRIBUCION"); + ShowMessage("Fue todo correcto"); + } + else + ShowMessage("No se pudo distribuir la Carga"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::ComprobarEstado1Click(TObject *Sender) +{ + DatosAutorizacion sDatos; + int nError; + + //Leemos la Estructura + Autorizacion->LeerEstructura(&sDatos); + + //Inicializamos + nError=0; + + //Comprobamos el estado del conductor + nError=Autorizacion->ComprobarEstado(hBaseDatos); + if(nError==AUT_EST_CON_YA_DENTRO) + ShowMessage("Conductor en otro estado"); + + //Comprobamos el estado del cisterna + if(nError==AUT_EST_CIS_YA_DENTRO) + ShowMessage("Cisterna en otro estado"); + + //Comprobamos el estado del Tractor + if(nError==AUT_EST_TRA_YA_DENTRO) + ShowMessage("Tractor en otro estado"); + + if(!nError) + ShowMessage("Fue todo correcto"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Button1Click(TObject *Sender) +{ + Autorizacion->BuscarNumeroViaje(hBaseDatos); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::ComprobarEstado2Click(TObject *Sender) +{ + dbiTabla TCar; + int nError; + + //Abrimos la tabla TCAR en exclusiva + if(!AbrirTablaBDE(&TCar,"SIMICCAR",NULL,true,hBaseDatos)) + { + nError=0; + nError=PesoEntrada->ComprobarEstado("0602",TCar); + if(nError) + ShowMessage("Estado inapropiado"); + else + ShowMessage("Todo Correcto"); + } + else + ShowMessage("Hubo un Error de TCAR"); + + //Cerramos la tabla de TCAR + CerrarTablaBDE(&TCar); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::PesoEntrada1Click(TObject *Sender) +{ + int nError; + nError=PesoEntrada->PesoEntrada("0602",hBaseDatos); + if(!nError) + ShowMessage("Fue todo correcto"); + else + ShowMessage("Algo fue mal"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::PesodeSalida2Click(TObject *Sender) +{ + int nError; + nError=PesoSalida->PesoSalida("0602",hBaseDatos); + if(!nError) + ShowMessage("Fue todo correcto"); + else + ShowMessage("Algo fue mal"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Albaran2Click(TObject *Sender) +{ + //El "00090" es el correspondiente al conductor asociado + if(Albaran->Albaran("0602",hBaseDatos)) + ShowMessage("Hubo un error"); + else + ShowMessage("Todo Correcto"); +} +//--------------------------------------------------------------------------- +/* +bool TForm1::LeerFichero(char *NombreFichero,char *NombreEstructura) +{ + bool bCorrecto; + FILE *fichero; + LINDat sLINDat; + ELEDat sELEDat; + DRVDat sDRVDat; + + bCorrecto=true; + ListBox1->Clear(); + //Abrimos le fichero en modo lectura + if( ( fichero = fopen(NombreFichero, "rb") ) == NULL) + bCorrecto=false; + else + { + if(!strcmp(NombreEstructura,"LINDat")) + { + while (!feof(fichero)) + { + //Leemos la estructura + fread(&sLINDat, sizeof(sLINDat), 1, fichero); + + //Ponemos el Fin de cadena + sLINDat.cNumeroLineaLIN[2]=0; + sLINDat.cVelocidadLineaLIN[5]=0; + + //Mostramos la Estructura + ListBox1->Items->Add("DATOS DE LA LINEA"); + ListBox1->Items->Add("================="); + ListBox1->Items->Add(sLINDat.cConcentradorLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cNumeroLineaLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cLineaActivaLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cVelocidadLineaLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cAnchuraDatosLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cParidadLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cBitsDeStopLIN); + ListBox1->Items->Add(" "); + } + } + if(!strcmp(NombreEstructura,"ELEDat")) + { + while (!feof(fichero)) + { + //Leemos la estructura + fread(&sELEDat, sizeof(sELEDat), 1, fichero); + + //Ponemos el Fin de cadena + sELEDat.cNumeroLineaELE[2]=0; + sELEDat.cTipoELE[3]=0; + sELEDat.cIdentificaELE[3]=0; + sELEDat.cNombreDriverELE[6]=0; + sELEDat.cTimeOutComunicaELE[3]=0; + sELEDat.cDireccionELE[3]=0; + + //Mostramos la Estructura + ListBox1->Items->Add("DATOS DE ELEMENTOS"); + ListBox1->Items->Add("=================="); + ListBox1->Items->Add(sELEDat.cConcentradorELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cNumeroLineaELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cTipoELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cIdentificaELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cElementoActivoELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cNombreDriverELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cTimeOutComunicaELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cDireccionELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cTipoPrioridadELE); + ListBox1->Items->Add(" "); + + } + } + if(!strcmp(NombreEstructura,"DRVDat")) + { + while (!feof(fichero)) + { + //Leemos la estructura + fread(&sDRVDat, sizeof(sDRVDat)+1, 1, fichero); + + //Ponemos el Fin de cadena + sDRVDat.cNombreDriverDRV[6]=0; + sDRVDat.cTamBufferTraDRV[4]=0; + sDRVDat.cTamBufferRecDRV[4]=0; + sDRVDat.cTamPeriodicaDRV[4]=0; + + //Mostramos la Estructura + ListBox1->Items->Add("DATOS DE DRIVERS"); + ListBox1->Items->Add("================"); + ListBox1->Items->Add(sDRVDat.cNombreDriverDRV); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sDRVDat.cTamBufferTraDRV); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sDRVDat.cTamBufferRecDRV); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sDRVDat.cTamPeriodicaDRV); + ListBox1->Items->Add(" "); + } + } +// if(!strcmp(NombreEstructura,"DatosTRADat")) + } + fclose(fichero); + + return bCorrecto; +} */ + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Transfer1Click(TObject *Sender) +{ + TRAPERDat sTRAPERIODICADat[NUM_MAXIMO_PERIODICA]; + TRAOCADat sTRAOCASIONALDat; + BYTE byi; + char sCadena[25]; + int nCorrecto; + + ListBox1->Clear(); + + //Leemos de los ficheros y rellenamos la estructura transfer + nCorrecto=Transfer->RellenarEstructuraTransfer(); + + if(nCorrecto==TRANSFER_CORRECTO) + { + ShowMessage("Lectura del fichero transfer.dat correcta"); + Transfer->LeerEstructura(sTRAPERIODICADat,&sTRAOCASIONALDat); + byi=0; + while(sTRAPERIODICADat[byi].lPosicionTRAPER!=-1 && byiItems->Add("DATOS DE TRANSFER"); + ListBox1->Items->Add("================="); + ListBox1->Items->Add(" "); + ListBox1->Items->Add("Posicion: "); + ltoa(sTRAPERIODICADat[byi].lPosicionTRAPER,sCadena,10); + ListBox1->Items->Add(sCadena); + ListBox1->Items->Add(" "); + ListBox1->Items->Add("Tipo: "); + ListBox1->Items->Add(sTRAPERIODICADat[byi].cTipoIDTRAPER); + ListBox1->Items->Add(" "); + ListBox1->Items->Add("Tamaño: "); + ListBox1->Items->Add(sTRAPERIODICADat[byi].lTamPeriodicaTRAPERDat); + ListBox1->Items->Add(" "); + byi++; + } + } + else + ShowMessage("Error en la lectura del fichero transfer.dat"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Elemento1Click(TObject *Sender) +{ + ELEDat sELEDat; + bool bCorrecto; + + bCorrecto=Transfer->LeerFichero("elemento.dat","ELEDat"); + + if(bCorrecto) + { + ShowMessage("Lectura del fichero elementos.dat correcta"); + ListBox1->Clear(); + while(sELEDat.cConcentradorELE!='0') + { + //Mostramos la Estructura + ListBox1->Items->Add("DATOS DE ELEMENTOS"); + ListBox1->Items->Add("=================="); + ListBox1->Items->Add(sELEDat.cConcentradorELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cNumeroLineaELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cTipoELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cIdentificaELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cElementoActivoELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cNombreDriverELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cTimeOutComunicaELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cDireccionELE); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sELEDat.cTipoPrioridadELE); + ListBox1->Items->Add(" "); + } + } + else + ShowMessage("Erro en la lectura del fichero elementos.dat"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Linea1Click(TObject *Sender) +{ + LINDat sLINDat; + bool bCorrecto; + + bCorrecto=Transfer->LeerFichero("lineas.dat","LINDat"); + + if(bCorrecto) + { + ShowMessage("Lectura del fichero lineas.dat correcta"); + ListBox1->Clear(); + while(sLINDat.cConcentradorLIN!='0') + { + //Mostramos la Estructura + ListBox1->Items->Add("DATOS DE LA LINEA"); + ListBox1->Items->Add("================="); + ListBox1->Items->Add(sLINDat.cConcentradorLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cNumeroLineaLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cLineaActivaLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cVelocidadLineaLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cAnchuraDatosLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cParidadLIN); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sLINDat.cBitsDeStopLIN); + ListBox1->Items->Add(" "); + } + } + else + ShowMessage("Error en la lectura del fichero lineas.dat"); + +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Driver1Click(TObject *Sender) +{ + DRVDat sDRVDat; + bool bCorrecto; + + bCorrecto=Transfer->LeerFichero("drivers.dat","DRVDat"); + + if(bCorrecto) + { + ShowMessage("Lectura del fichero drivers.dat correcta"); + ListBox1->Clear(); + while( !strcmp(sDRVDat.cNombreDriverDRV,"0") ) + { + //Mostramos la Estructura + ListBox1->Items->Add("DATOS DE DRIVERS"); + ListBox1->Items->Add("================"); + ListBox1->Items->Add(sDRVDat.cNombreDriverDRV); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sDRVDat.cTamBufferTraDRV); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sDRVDat.cTamBufferRecDRV); + ListBox1->Items->Add(" "); + ListBox1->Items->Add(sDRVDat.cTamPeriodicaDRV); + ListBox1->Items->Add(" "); + } + } + else + ShowMessage("Error en la lectura del fichero drivers.dat"); + +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::LeerOcasional1Click(TObject *Sender) +{ + BYTE byi; + char Texto[128]; + int nRespuesta; + + memset(Texto,0,sizeof(Texto)); + + ListBox1->Clear(); + for(byi=1;byi<17;byi++) + { + nRespuesta=Transfer->LeerOcasional(Texto,byi); + ListBox1->Items->Add(Texto); + } + + if(!nRespuesta) + ShowMessage("Todo fue correcto"); + else + ShowMessage("Hubo un error"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::EscribirOcasional1Click(TObject *Sender) +{ + int nResultado; + char sSentencia[TAM_MAXIMO_OCASIONAL]; + + Formatea(sSentencia,128,"%c%s%s%c%s%s",'2',"BBRPEN","*12",'A',"13","Teclee Codigo"); + nResultado=Transfer->EscribirOcasional(sSentencia,7); + + if(!nResultado) + ShowMessage("Todo fue correcto"); + else + ShowMessage("Hubo un Error"); +} + +//--------------------------------------------------------------------------- +void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) +{ + //Si le da al Return cogemos la instruccion + if(Key=='\r') + { + strcpy(sDatoTecleado,Edit1->Text.c_str()); + switch(byOpcion) + { + case OpConductor: ConductorClick(Sender); + break; + case OpCisterna: CisternaClick(Sender); + break; + case OpTractor: TractorClick(Sender); + break; + case OpSuministrador: SuministradorClick(Sender); + break; + case OpPedidos: PedidosClick(Sender); + break; + } + Edit1->Text=""; + Label1->Visible=false; + Edit1->Visible=false; + //Inicializamos el codigo de teclado + strcpy(sDatoTecleado,""); + if(bTodos) + TodosClick(Sender); + } +} + +//--------------------------------------------------------------------------- + +void __fastcall TForm1::CargarThreads1Click(TObject *Sender) +{ + BYTE byResultado; + + Transfer1Click(Sender); + byResultado=0; + byResultado=CargarThreads(); + + if(byResultado) + ShowMessage("Hubo un Error cargando los threads"); +} +//--------------------------------------------------------------------------- + +void __fastcall TForm1::FinalizarThreads1Click(TObject *Sender) +{ + TerminarThread(HDAUT); + TerminarThread(HDPSE); + TerminarThread(HDPSS); + TerminarThread(HDALB); + TerminarThread(HDContadores); +} +//--------------------------------------------------------------------------- + diff --git a/Esergui -BDE utilizando API/EserguiBDE/Principal.dfm b/Esergui -BDE utilizando API/EserguiBDE/Principal.dfm new file mode 100644 index 0000000000000000000000000000000000000000..477bbb02dcc6b00ced0651031a80b34d94d48960 GIT binary patch literal 3685 zcmb_f%W~sH6jkI{k{@zjGfXHpUiFe1Ct<-dQEVoKgI%%0EQgNNj=PXssaBiu%pXwj z0WA3hc5L|}s$jtyS}pZMRtTOdHnw$cpL1{Dmy*BRRydm6To0_5`?o#I3a6u&PB=>G za?li?yJIwGjbE)sm_9Uqw3@GR%odHV?Yu(xe!&`VcH96yFq{&{9nOX~U))|bgEUF0 z+lrD4Mn*6~-BC)|r@;c!3^8}_ayUA_9fxm%SLZjgVc0ILg42zX*O|>F-^-h_(AFMKU_OZ&GAEGEhs2`*;zEA&;bp5_nx}14-ktVU# zoc>~;g6ydXv*IxNusqk;I!hg!)uwna(p{48&FNAlZ z3vJ7?-0)(>SW4XDt59nEEF!YKqF3xpCii2N+-Klol|_*D8AVy2&kBxErj>U@ALHm- zw_6Ga34gMzW;l#7Yvv!7sDF}Cf3N!TIUk?(7?FFnu=ljItvaJUAzz|*QyxI(`a)4Y zR{T^uMmn-TmzVk%KaDNrtIf2v{O*?W)jr!=zPY7*wFS49cb<}Og>vud1(?Y6@P!_YI;1DuGr2BqaI1 zJXE8*A%zw9UI=qM=mGb0bByvaHr?+Dt=xTKF}zn8M#T#EoKi4U z0EearSujJ-J5Tu3L!wjaor3~;qq^r>^x6H6WT& literal 0 HcmV?d00001 diff --git a/Esergui -BDE utilizando API/EserguiBDE/Principal.h b/Esergui -BDE utilizando API/EserguiBDE/Principal.h new file mode 100644 index 0000000..9d30604 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Principal.h @@ -0,0 +1,130 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include "Esergui.h" +#include "string.h" +#include "stdlib.h" +#include "stdio.h" + +//--------------------------------------------------------------------------- +#ifndef PrincipalH +#define PrincipalH +#define N_TABLA 5 +#define N_SUM 4 +#define N_PED 5 +#define N_CON 8 +#define N_CIS 20 +#define N_TRA 10 +#define N_CAMPO N_CON+N_CIS+N_TRA+N_SUM+N_PED +#define NUM_MAX_TAM_BUFFER 10 +#define NUM_MAX_TECLAS 17 +#define OpConductor 1 +#define OpCisterna 2 +#define OpTractor 3 +#define OpSuministrador 4 +#define OpPedidos 5 +//--------------------------------------------------------------------------- +class TForm1 : public TForm +{ +__published: // IDE-managed Components + TMainMenu *MainMenu1; + TMenuItem *Informaciondeestructura1; + TMenuItem *InformacionEstructura1; + TMenuItem *Salir1; + TMenuItem *Autorizacion1; + TMenuItem *Conductor; + TMenuItem *Tractor; + TMenuItem *Comprobar1; + TMenuItem *Cisterna; + TMenuItem *Suministrador; + TMenuItem *Pedidos; + TMenuItem *Todos; + TListBox *ListBox1; + TMenuItem *ComprobarPeso1; + TMenuItem *ComprobarPeso2; + TMenuItem *DistribuirCarga1; + TMenuItem *ComprobarEstado1; + TButton *Button1; + TMenuItem *PesodeEntrada1; + TMenuItem *PesoEntrada1; + TMenuItem *PesodeSalida1; + TMenuItem *PesodeSalida2; + TMenuItem *Albaran1; + TMenuItem *Albaran2; + TMenuItem *Lecturafichero1; + TMenuItem *Transfer1; + TMenuItem *Elemento1; + TMenuItem *Linea1; + TMenuItem *Driver1; + TMenuItem *LeerOcasional1; + TMenuItem *EscribirOcasional1; + TLabel *Label1; + TEdit *Edit1; + TMenuItem *Dialogo1; + TMenuItem *Autorizacion2; + TMenuItem *PesodeEntrada2; + TMenuItem *PesodeSalida3; + TMenuItem *Albaran3; + TMenuItem *CargarThreads1; + TLabel *Label2; + TLabel *Label3; + TLabel *Label4; + TLabel *Label5; + TEdit *Edit2; + TEdit *Edit3; + TEdit *Edit4; + TEdit *Edit5; + void __fastcall Salir1Click(TObject *Sender); + void __fastcall ConductorClick(TObject *Sender); + void __fastcall FormCreate(TObject *Sender); + void __fastcall FormClose(TObject *Sender, TCloseAction &Action); + void __fastcall InformacionEstructura1Click(TObject *Sender); + void __fastcall CisternaClick(TObject *Sender); + void __fastcall TractorClick(TObject *Sender); + void __fastcall SuministradorClick(TObject *Sender); + void __fastcall PedidosClick(TObject *Sender); + void __fastcall TodosClick(TObject *Sender); + void __fastcall ComprobarPeso1Click(TObject *Sender); + void __fastcall ComprobarPeso2Click(TObject *Sender); + void __fastcall DistribuirCarga1Click(TObject *Sender); + void __fastcall ComprobarEstado1Click(TObject *Sender); + void __fastcall Button1Click(TObject *Sender); + void __fastcall ComprobarEstado2Click(TObject *Sender); + void __fastcall PesoEntrada1Click(TObject *Sender); + void __fastcall PesodeSalida2Click(TObject *Sender); + void __fastcall Albaran2Click(TObject *Sender); + void __fastcall Transfer1Click(TObject *Sender); + void __fastcall Elemento1Click(TObject *Sender); + void __fastcall Linea1Click(TObject *Sender); + void __fastcall Driver1Click(TObject *Sender); + void __fastcall LeerOcasional1Click(TObject *Sender); + void __fastcall EscribirOcasional1Click(TObject *Sender); + void __fastcall Edit1KeyPress(TObject *Sender, char &Key); + void __fastcall CargarThreads1Click(TObject *Sender); + void __fastcall FinalizarThreads1Click(TObject *Sender); + +private: // User declarations + char sDatoTecleado[NUM_MAX_TECLAS]; + BYTE byOpcion; + bool bTodos; + +public: // User declarations + TPanel *Panel[N_TABLA+N_CAMPO]; + HANDLE HDContadores,HDAUT,HDPSE,HDPSS,HDALB; + BYTE Error; + hDBIDb hBaseDatos; + void BoolACadena(bool bVariable,char *cadena); + void MuestraLista(char *cadena); + void MuestraError(int Error); + bool LeerFichero(char *NombreFichero,char *NombreEstructura); + __fastcall TForm1(TComponent* Owner); + __fastcall ~TForm1(); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TForm1 *Form1; +//--------------------------------------------------------------------------- +#endif diff --git a/Esergui -BDE utilizando API/EserguiBDE/PruebaError.txt b/Esergui -BDE utilizando API/EserguiBDE/PruebaError.txt new file mode 100644 index 0000000..6f38055 --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/PruebaError.txt @@ -0,0 +1,547 @@ +27/06/2001 13:33:52 Error Dbidif sin información +27/06/2001 13:33:52 Error Dbidif sin información +27/06/2001 13:33:52 Error Dbidif sin información +27/06/2001 13:33:52 Error Dbidif sin información +27/06/2001 13:37:34 Prueba de Error +27/06/2001 13:37:35 Error Dbidif sin información +27/06/2001 13:37:35 Error Dbidif sin información +27/06/2001 13:37:35 Error Dbidif sin información +27/06/2001 13:37:35 Error Dbidif sin información +27/06/2001 13:46:44 Prueba de Error +27/06/2001 13:46:46 Error Dbidif sin información +27/06/2001 13:46:46 Error Dbidif sin información +27/06/2001 13:46:46 Error Dbidif sin información +27/06/2001 13:46:46 Error Dbidif sin información +27/06/2001 13:49:21 Prueba de Error +27/06/2001 13:54:08 Prueba de Error +27/06/2001 13:57:25 Prueba de Error +27/06/2001 14:00:26 Prueba de Error +27/06/2001 14:05:12 Prueba de Error +27/06/2001 14:08:35 Prueba de Error +27/06/2001 16:21:58 Prueba de Error +27/06/2001 16:27:08 Prueba de Error +27/06/2001 16:30:32 Prueba de Error +27/06/2001 16:32:52 Prueba de Error +27/06/2001 16:35:33 Prueba de Error +27/06/2001 16:40:15 Prueba de Error +27/06/2001 16:42:28 Prueba de Error +27/06/2001 16:43:48 Prueba de Error +27/06/2001 16:44:36 Prueba de Error +27/06/2001 16:47:46 Prueba de Error +27/06/2001 16:49:01 Prueba de Error +27/06/2001 16:51:38 Prueba de Error +27/06/2001 16:53:35 Prueba de Error +27/06/2001 16:56:09 Prueba de Error +27/06/2001 17:01:58 Prueba de Error +27/06/2001 17:03:28 Prueba de Error +27/06/2001 17:06:46 Prueba de Error +27/06/2001 17:10:32 Prueba de Error +27/06/2001 17:22:35 Prueba de Error +27/06/2001 17:27:03 Prueba de Error +27/06/2001 17:44:07 Prueba de Error +27/06/2001 17:46:50 Prueba de Error +29/06/2001 10:38:53 Prueba de Error +29/06/2001 10:44:50 Prueba de Error +02/07/2001 09:59:05 Prueba de Error +02/07/2001 10:09:39 Prueba de Error +02/07/2001 10:14:35 Prueba de Error +02/07/2001 10:17:24 Prueba de Error +02/07/2001 10:26:05 Prueba de Error +02/07/2001 10:35:55 Prueba de Error +02/07/2001 10:37:38 Prueba de Error +02/07/2001 10:38:47 Prueba de Error +02/07/2001 10:41:38 Prueba de Error +02/07/2001 11:11:24 Prueba de Error +02/07/2001 11:14:15 Prueba de Error +02/07/2001 11:16:31 Prueba de Error +02/07/2001 11:19:23 Prueba de Error +02/07/2001 11:20:42 Prueba de Error +02/07/2001 11:29:55 Prueba de Error +02/07/2001 11:33:12 Prueba de Error +02/07/2001 11:35:55 Prueba de Error +02/07/2001 11:56:50 Prueba de Error +02/07/2001 12:06:40 Prueba de Error +02/07/2001 12:34:40 Prueba de Error +02/07/2001 12:42:31 Prueba de Error +02/07/2001 12:45:31 Prueba de Error +02/07/2001 12:46:34 Prueba de Error +02/07/2001 12:50:01 Prueba de Error +02/07/2001 12:52:36 Prueba de Error +02/07/2001 12:56:40 Prueba de Error +02/07/2001 12:57:41 Prueba de Error +02/07/2001 13:00:19 Prueba de Error +02/07/2001 13:01:02 Prueba de Error +02/07/2001 13:02:29 Prueba de Error +02/07/2001 13:10:20 Prueba de Error +02/07/2001 14:01:34 Prueba de Error +02/07/2001 14:07:33 Prueba de Error +04/07/2001 18:36:09 Prueba de Error +04/07/2001 18:37:07 Prueba de Error +04/07/2001 18:38:34 Prueba de Error +04/07/2001 18:39:10 Prueba de Error +04/07/2001 18:39:33 Prueba de Error +04/07/2001 19:05:16 Prueba de Error +04/07/2001 19:10:35 Prueba de Error +04/07/2001 19:12:52 Prueba de Error +05/07/2001 08:39:27 Prueba de Error +05/07/2001 08:40:21 Prueba de Error +05/07/2001 08:42:09 Prueba de Error +05/07/2001 08:50:28 Prueba de Error +05/07/2001 08:59:20 Prueba de Error +05/07/2001 09:00:36 Prueba de Error +05/07/2001 09:01:35 Prueba de Error +05/07/2001 09:02:23 Prueba de Error +05/07/2001 09:03:10 Prueba de Error +05/07/2001 09:05:15 Prueba de Error +05/07/2001 09:20:14 Prueba de Error +05/07/2001 09:33:52 Prueba de Error +05/07/2001 09:35:51 Prueba de Error +05/07/2001 10:08:19 Prueba de Error +05/07/2001 10:09:59 Prueba de Error +05/07/2001 10:10:22 Prueba de Error +05/07/2001 10:26:36 Prueba de Error +05/07/2001 10:28:15 Prueba de Error +05/07/2001 10:29:36 Prueba de Error +05/07/2001 10:41:01 Prueba de Error +05/07/2001 10:44:15 Prueba de Error +05/07/2001 10:49:21 Prueba de Error +05/07/2001 10:51:32 Prueba de Error +05/07/2001 10:53:40 Prueba de Error +05/07/2001 11:03:35 Prueba de Error +05/07/2001 11:05:23 Prueba de Error +05/07/2001 11:06:01 Prueba de Error +05/07/2001 11:08:29 Prueba de Error +05/07/2001 11:22:06 Prueba de Error +05/07/2001 11:24:22 Prueba de Error +05/07/2001 11:26:52 Prueba de Error +05/07/2001 11:27:44 Prueba de Error +05/07/2001 11:28:19 Prueba de Error +05/07/2001 11:29:17 Prueba de Error +05/07/2001 11:32:29 Prueba de Error +05/07/2001 11:39:29 Prueba de Error +05/07/2001 11:41:15 Prueba de Error +05/07/2001 11:44:12 Prueba de Error +05/07/2001 11:46:05 Prueba de Error +05/07/2001 11:50:00 Prueba de Error +05/07/2001 12:30:25 Prueba de Error +05/07/2001 12:43:10 Prueba de Error +05/07/2001 13:39:18 Prueba de Error +05/07/2001 13:59:15 Prueba de Error +05/07/2001 16:54:38 Prueba de Error +05/07/2001 16:56:39 Prueba de Error +05/07/2001 17:00:40 Prueba de Error +05/07/2001 17:19:08 Prueba de Error +05/07/2001 17:44:52 Prueba de Error +05/07/2001 17:48:10 Prueba de Error +05/07/2001 17:55:20 Prueba de Error +05/07/2001 17:58:02 Prueba de Error +05/07/2001 18:01:35 Prueba de Error +05/07/2001 18:03:30 Prueba de Error +05/07/2001 18:05:32 Prueba de Error +05/07/2001 18:07:58 Prueba de Error +05/07/2001 18:10:01 Prueba de Error +05/07/2001 18:12:35 Prueba de Error +05/07/2001 18:19:01 Prueba de Error +05/07/2001 18:32:53 Prueba de Error +05/07/2001 18:39:31 Prueba de Error +05/07/2001 18:45:37 Prueba de Error +05/07/2001 18:49:28 Prueba de Error +05/07/2001 18:51:07 Prueba de Error +05/07/2001 18:55:28 Prueba de Error +05/07/2001 18:58:06 Prueba de Error +05/07/2001 19:08:48 Prueba de Error +05/07/2001 19:11:01 Prueba de Error +05/07/2001 19:15:01 Prueba de Error +06/07/2001 13:27:27 Prueba de Error +06/07/2001 13:30:06 Prueba de Error +06/07/2001 13:35:20 Prueba de Error +06/07/2001 13:37:17 Prueba de Error +06/07/2001 13:38:44 Prueba de Error +09/07/2001 09:51:21 Prueba de Error +09/07/2001 09:57:58 Prueba de Error +09/07/2001 09:59:30 Prueba de Error +09/07/2001 10:00:36 Prueba de Error +09/07/2001 10:08:41 Prueba de Error +09/07/2001 10:12:35 Prueba de Error +09/07/2001 10:14:52 Prueba de Error +09/07/2001 10:18:42 Prueba de Error +09/07/2001 10:20:15 Prueba de Error +09/07/2001 10:26:07 Prueba de Error +09/07/2001 10:28:05 Prueba de Error +09/07/2001 10:33:11 Prueba de Error +09/07/2001 10:34:19 Prueba de Error +09/07/2001 10:35:30 Prueba de Error +09/07/2001 10:36:02 Prueba de Error +09/07/2001 10:47:04 Prueba de Error +09/07/2001 10:48:59 Prueba de Error +09/07/2001 10:50:24 Prueba de Error +09/07/2001 10:50:52 Prueba de Error +09/07/2001 10:53:22 Prueba de Error +09/07/2001 10:54:32 Prueba de Error +09/07/2001 10:56:51 Prueba de Error +09/07/2001 10:58:11 Prueba de Error +09/07/2001 10:59:27 Prueba de Error +09/07/2001 11:04:06 Prueba de Error +09/07/2001 11:08:26 Prueba de Error +09/07/2001 11:09:22 Prueba de Error +09/07/2001 11:10:17 Prueba de Error +09/07/2001 11:11:48 Prueba de Error +09/07/2001 11:25:00 Prueba de Error +09/07/2001 11:26:13 Prueba de Error +09/07/2001 11:26:53 Prueba de Error +09/07/2001 11:28:53 Prueba de Error +09/07/2001 11:29:23 Prueba de Error +09/07/2001 12:15:34 Prueba de Error +09/07/2001 12:16:55 Prueba de Error +09/07/2001 12:19:23 Prueba de Error +09/07/2001 12:21:27 Prueba de Error +09/07/2001 12:25:21 Prueba de Error +09/07/2001 12:28:34 Prueba de Error +09/07/2001 12:30:17 Prueba de Error +09/07/2001 12:33:20 Prueba de Error +09/07/2001 12:36:42 Prueba de Error +09/07/2001 12:47:11 Prueba de Error +09/07/2001 12:47:39 Prueba de Error +09/07/2001 12:48:24 Prueba de Error +09/07/2001 12:51:00 Prueba de Error +09/07/2001 12:52:31 Prueba de Error +09/07/2001 13:00:23 Prueba de Error +09/07/2001 13:03:13 Prueba de Error +09/07/2001 13:05:12 Prueba de Error +09/07/2001 13:06:32 Prueba de Error +09/07/2001 13:47:11 Prueba de Error +09/07/2001 13:49:42 Prueba de Error +09/07/2001 13:52:49 Prueba de Error +09/07/2001 13:54:44 Prueba de Error +09/07/2001 13:59:20 Prueba de Error +09/07/2001 14:01:26 Prueba de Error +09/07/2001 14:03:32 Prueba de Error +09/07/2001 14:05:58 Prueba de Error +09/07/2001 14:08:46 Prueba de Error +09/07/2001 16:26:07 Prueba de Error +09/07/2001 19:04:42 Prueba de Error +09/07/2001 19:05:31 Prueba de Error +09/07/2001 19:06:14 Prueba de Error +09/07/2001 19:07:30 Prueba de Error +09/07/2001 19:09:16 Prueba de Error +10/07/2001 09:47:49 Prueba de Error +10/07/2001 09:48:50 Prueba de Error +10/07/2001 11:06:00 Prueba de Error +10/07/2001 12:40:58 Prueba de Error +10/07/2001 13:05:35 Prueba de Error +10/07/2001 13:20:53 Prueba de Error +10/07/2001 13:42:22 Prueba de Error +10/07/2001 13:44:30 Prueba de Error +10/07/2001 13:46:07 Prueba de Error +10/07/2001 13:50:58 Prueba de Error +10/07/2001 13:52:44 Prueba de Error +10/07/2001 13:56:35 Prueba de Error +10/07/2001 16:47:38 Prueba de Error +10/07/2001 16:48:46 Prueba de Error +10/07/2001 16:52:12 Prueba de Error +10/07/2001 16:53:12 Prueba de Error +10/07/2001 16:56:54 Prueba de Error +10/07/2001 16:59:59 Prueba de Error +10/07/2001 17:03:16 Prueba de Error +10/07/2001 17:06:12 Prueba de Error +10/07/2001 17:08:34 Prueba de Error +10/07/2001 17:10:29 Prueba de Error +10/07/2001 17:15:28 Prueba de Error +10/07/2001 17:17:03 Prueba de Error +10/07/2001 17:17:48 Prueba de Error +10/07/2001 17:18:16 Prueba de Error +10/07/2001 17:22:03 Prueba de Error +10/07/2001 17:24:00 Prueba de Error +10/07/2001 17:29:19 Prueba de Error +10/07/2001 17:32:07 Prueba de Error +10/07/2001 17:35:06 Prueba de Error +10/07/2001 17:38:18 Prueba de Error +10/07/2001 17:39:45 Prueba de Error +10/07/2001 17:42:16 Prueba de Error +10/07/2001 17:44:07 Prueba de Error +10/07/2001 17:48:13 Prueba de Error +10/07/2001 17:51:05 Prueba de Error +10/07/2001 17:52:17 Prueba de Error +10/07/2001 17:53:03 Prueba de Error +10/07/2001 17:54:28 Prueba de Error +10/07/2001 17:55:36 Prueba de Error +10/07/2001 17:58:58 Prueba de Error +10/07/2001 17:59:30 Prueba de Error +10/07/2001 18:02:42 Prueba de Error +10/07/2001 18:05:21 Prueba de Error +10/07/2001 18:09:30 Prueba de Error +10/07/2001 18:13:56 Prueba de Error +10/07/2001 18:18:10 Prueba de Error +10/07/2001 18:19:32 Prueba de Error +10/07/2001 18:22:25 Prueba de Error +10/07/2001 18:24:33 Prueba de Error +10/07/2001 18:25:32 Prueba de Error +10/07/2001 18:26:24 Prueba de Error +10/07/2001 18:26:48 Prueba de Error +10/07/2001 18:27:08 Prueba de Error +10/07/2001 18:27:42 Prueba de Error +10/07/2001 18:29:43 Prueba de Error +10/07/2001 18:30:21 Prueba de Error +10/07/2001 18:31:01 Prueba de Error +10/07/2001 18:31:53 Prueba de Error +10/07/2001 18:33:13 Prueba de Error +10/07/2001 18:36:00 Prueba de Error +10/07/2001 18:36:50 Prueba de Error +10/07/2001 18:38:21 Prueba de Error +10/07/2001 18:39:04 Prueba de Error +10/07/2001 18:39:59 Prueba de Error +10/07/2001 18:40:18 Prueba de Error +10/07/2001 18:40:44 Prueba de Error +10/07/2001 18:41:40 Prueba de Error +10/07/2001 18:43:31 Prueba de Error +10/07/2001 18:45:22 Prueba de Error +10/07/2001 18:48:17 Prueba de Error +10/07/2001 18:53:30 Prueba de Error +10/07/2001 18:54:49 Prueba de Error +10/07/2001 18:55:50 Prueba de Error +10/07/2001 18:56:15 Prueba de Error +10/07/2001 18:56:33 Prueba de Error +10/07/2001 18:57:46 Prueba de Error +10/07/2001 18:59:22 Prueba de Error +10/07/2001 19:02:14 Prueba de Error +10/07/2001 19:03:50 Prueba de Error +10/07/2001 19:08:40 Prueba de Error +10/07/2001 19:09:21 Prueba de Error +10/07/2001 19:09:44 Prueba de Error +10/07/2001 19:10:08 Prueba de Error +10/07/2001 19:10:44 Prueba de Error +10/07/2001 19:11:21 Prueba de Error +10/07/2001 19:11:47 Prueba de Error +10/07/2001 19:13:43 Prueba de Error +10/07/2001 19:14:44 Prueba de Error +10/07/2001 19:15:15 Prueba de Error +10/07/2001 19:15:37 Prueba de Error +10/07/2001 19:21:29 Prueba de Error +10/07/2001 19:23:18 Prueba de Error +10/07/2001 19:23:47 Prueba de Error +10/07/2001 19:26:28 Prueba de Error +10/07/2001 19:29:37 Prueba de Error +10/07/2001 19:31:25 Prueba de Error +11/07/2001 09:53:43 Prueba de Error +11/07/2001 10:02:55 Prueba de Error +11/07/2001 10:07:55 Prueba de Error +11/07/2001 10:13:33 Prueba de Error +11/07/2001 10:14:39 Prueba de Error +11/07/2001 10:15:50 Prueba de Error +11/07/2001 10:20:36 Prueba de Error +11/07/2001 10:22:14 Prueba de Error +11/07/2001 10:23:04 Prueba de Error +11/07/2001 10:23:44 Prueba de Error +11/07/2001 10:25:17 Prueba de Error +11/07/2001 10:27:16 Prueba de Error +11/07/2001 10:28:22 Prueba de Error +11/07/2001 10:28:56 Prueba de Error +11/07/2001 10:31:20 Prueba de Error +11/07/2001 10:34:43 Prueba de Error +11/07/2001 10:43:43 Prueba de Error +11/07/2001 10:44:38 Prueba de Error +11/07/2001 10:45:52 Prueba de Error +11/07/2001 10:46:34 Prueba de Error +11/07/2001 10:46:47 Prueba de Error +11/07/2001 10:48:16 Prueba de Error +11/07/2001 10:54:49 Prueba de Error +11/07/2001 10:56:58 Prueba de Error +11/07/2001 10:58:42 Prueba de Error +11/07/2001 11:44:30 Prueba de Error +11/07/2001 12:08:35 Prueba de Error +11/07/2001 12:09:50 Prueba de Error +11/07/2001 12:12:42 Prueba de Error +11/07/2001 12:13:01 Prueba de Error +11/07/2001 12:14:04 Prueba de Error +11/07/2001 12:18:21 Prueba de Error +11/07/2001 12:18:48 Prueba de Error +11/07/2001 12:19:39 Prueba de Error +11/07/2001 12:19:55 Prueba de Error +11/07/2001 12:21:34 Prueba de Error +11/07/2001 12:23:14 Prueba de Error +11/07/2001 12:25:19 Prueba de Error +11/07/2001 12:25:58 Prueba de Error +11/07/2001 12:32:16 Prueba de Error +11/07/2001 12:34:54 Prueba de Error +11/07/2001 12:37:39 Prueba de Error +11/07/2001 12:40:48 Prueba de Error +11/07/2001 12:42:35 Prueba de Error +11/07/2001 12:42:55 Prueba de Error +11/07/2001 12:44:21 Prueba de Error +11/07/2001 12:49:28 Prueba de Error +11/07/2001 12:57:22 Prueba de Error +11/07/2001 12:59:49 Prueba de Error +11/07/2001 13:00:52 Prueba de Error +11/07/2001 13:19:22 Prueba de Error +11/07/2001 13:20:33 Prueba de Error +11/07/2001 13:29:07 Prueba de Error +11/07/2001 13:35:03 Prueba de Error +11/07/2001 13:37:12 Prueba de Error +11/07/2001 13:38:09 Prueba de Error +11/07/2001 13:39:35 Prueba de Error +11/07/2001 13:40:36 Prueba de Error +11/07/2001 13:42:51 Prueba de Error +11/07/2001 13:44:04 Prueba de Error +11/07/2001 13:46:05 Prueba de Error +11/07/2001 13:47:03 Prueba de Error +11/07/2001 13:49:14 Prueba de Error +11/07/2001 14:26:17 Prueba de Error +11/07/2001 14:35:49 Prueba de Error +11/07/2001 14:37:22 Prueba de Error +11/07/2001 16:26:46 Prueba de Error +11/07/2001 16:28:37 Prueba de Error +11/07/2001 16:31:16 Prueba de Error +11/07/2001 16:33:06 Prueba de Error +11/07/2001 17:12:21 Prueba de Error +11/07/2001 17:12:59 Prueba de Error +11/07/2001 17:13:56 Prueba de Error +11/07/2001 17:15:38 Prueba de Error +11/07/2001 17:26:35 Prueba de Error +11/07/2001 17:28:25 Error String Number is out of range. (9985,39:1) +11/07/2001 17:31:16 Prueba de Error +11/07/2001 17:31:48 Prueba de Error +11/07/2001 17:33:54 Prueba de Error +11/07/2001 17:34:50 Prueba de Error +11/07/2001 17:36:29 Prueba de Error +11/07/2001 17:38:50 Prueba de Error +11/07/2001 17:41:50 Prueba de Error +11/07/2001 17:42:06 Error Info Table is busy. (10243,40:3). 1) . 2) . 3) . 4) +11/07/2001 17:44:31 Prueba de Error +11/07/2001 17:45:30 Error String Number is out of range. (9985,39:1) +11/07/2001 17:49:28 Prueba de Error +11/07/2001 17:51:05 Prueba de Error +11/07/2001 17:51:32 Prueba de Error +11/07/2001 17:52:34 Prueba de Error +11/07/2001 17:53:30 Error String Number is out of range. (9985,39:1) +11/07/2001 17:58:06 Prueba de Error +11/07/2001 17:59:20 Prueba de Error +11/07/2001 18:08:21 Prueba de Error +11/07/2001 18:10:35 Prueba de Error +11/07/2001 18:14:18 Prueba de Error +11/07/2001 18:16:05 Prueba de Error +11/07/2001 18:17:23 Prueba de Error +11/07/2001 18:21:46 Prueba de Error +11/07/2001 18:25:51 Prueba de Error +11/07/2001 18:27:18 Prueba de Error +11/07/2001 18:31:27 Prueba de Error +11/07/2001 18:35:20 Prueba de Error +11/07/2001 19:00:04 Prueba de Error +11/07/2001 19:02:01 Prueba de Error +11/07/2001 19:02:21 Error Info Table is busy. (10243,40:3). 1) . 2) . 3) . 4) +11/07/2001 19:03:07 Prueba de Error +11/07/2001 19:07:07 Prueba de Error +12/07/2001 10:01:56 Prueba de Error +12/07/2001 10:02:56 Prueba de Error +12/07/2001 10:05:06 Prueba de Error +12/07/2001 11:21:23 Prueba de Error +12/07/2001 11:24:18 Prueba de Error +12/07/2001 11:25:10 Prueba de Error +12/07/2001 11:26:22 Prueba de Error +12/07/2001 11:28:38 Prueba de Error +12/07/2001 11:32:39 Prueba de Error +12/07/2001 11:35:55 Prueba de Error +12/07/2001 11:43:59 Prueba de Error +12/07/2001 11:47:54 Prueba de Error +12/07/2001 11:50:55 Prueba de Error +12/07/2001 11:53:41 Prueba de Error +12/07/2001 12:05:42 Prueba de Error +12/07/2001 12:41:04 Prueba de Error +12/07/2001 12:46:29 Prueba de Error +12/07/2001 12:54:59 Prueba de Error +12/07/2001 13:12:04 Prueba de Error +12/07/2001 13:14:03 Prueba de Error +12/07/2001 13:14:45 Prueba de Error +13/07/2001 08:56:12 Prueba de Error +13/07/2001 08:56:52 Prueba de Error +13/07/2001 08:57:19 Prueba de Error +13/07/2001 08:57:52 Prueba de Error +13/07/2001 08:59:05 Prueba de Error +13/07/2001 09:00:37 Prueba de Error +13/07/2001 09:01:32 Prueba de Error +13/07/2001 09:02:33 Prueba de Error +13/07/2001 09:04:42 Prueba de Error +13/07/2001 09:05:48 Prueba de Error +13/07/2001 09:08:29 Prueba de Error +13/07/2001 09:09:04 Prueba de Error +13/07/2001 09:10:19 Prueba de Error +13/07/2001 09:13:34 Prueba de Error +13/07/2001 09:14:40 Prueba de Error +13/07/2001 09:15:39 Prueba de Error +13/07/2001 09:17:21 Prueba de Error +13/07/2001 09:19:38 Prueba de Error +13/07/2001 09:22:19 Prueba de Error +13/07/2001 09:22:57 Prueba de Error +13/07/2001 09:24:14 Prueba de Error +13/07/2001 09:25:05 Prueba de Error +13/07/2001 09:28:08 Prueba de Error +13/07/2001 09:29:04 Prueba de Error +13/07/2001 09:30:26 Prueba de Error +13/07/2001 09:31:11 Prueba de Error +13/07/2001 09:31:37 Prueba de Error +13/07/2001 09:32:58 Prueba de Error +13/07/2001 09:33:39 Prueba de Error +13/07/2001 09:36:06 Prueba de Error +13/07/2001 09:37:43 Prueba de Error +13/07/2001 09:39:56 Prueba de Error +13/07/2001 09:41:37 Prueba de Error +13/07/2001 09:44:34 Prueba de Error +13/07/2001 09:48:00 Prueba de Error +13/07/2001 09:49:37 Prueba de Error +13/07/2001 09:52:15 Prueba de Error +13/07/2001 09:55:20 Prueba de Error +13/07/2001 09:56:00 Prueba de Error +13/07/2001 09:56:40 Prueba de Error +13/07/2001 09:57:30 Prueba de Error +13/07/2001 09:58:36 Prueba de Error +13/07/2001 09:59:39 Prueba de Error +13/07/2001 10:01:18 Prueba de Error +13/07/2001 10:03:45 Prueba de Error +13/07/2001 10:08:30 Prueba de Error +13/07/2001 10:09:20 Prueba de Error +13/07/2001 10:11:53 Prueba de Error +13/07/2001 10:14:02 Prueba de Error +13/07/2001 10:14:44 Prueba de Error +13/07/2001 10:16:55 Prueba de Error +13/07/2001 10:18:49 Prueba de Error +13/07/2001 10:19:42 Prueba de Error +13/07/2001 10:26:29 Prueba de Error +13/07/2001 11:28:31 Prueba de Error +13/07/2001 11:31:13 Prueba de Error +13/07/2001 11:41:30 Prueba de Error +13/07/2001 12:08:07 Prueba de Error +13/07/2001 12:11:48 Prueba de Error +13/07/2001 12:31:00 Prueba de Error +13/07/2001 12:37:56 Prueba de Error +13/07/2001 12:42:29 Prueba de Error +13/07/2001 12:45:21 Prueba de Error +13/07/2001 13:09:58 Prueba de Error +13/07/2001 13:15:49 Prueba de Error +13/07/2001 13:35:05 Prueba de Error +13/07/2001 14:06:09 Prueba de Error +13/07/2001 14:09:29 Prueba de Error +13/07/2001 14:18:41 Prueba de Error +13/07/2001 14:27:23 Prueba de Error +13/07/2001 14:30:29 Prueba de Error +13/07/2001 14:31:13 Prueba de Error +16/07/2001 09:45:39 Prueba de Error +16/07/2001 09:57:11 Prueba de Error +16/07/2001 10:04:12 Prueba de Error +16/07/2001 10:15:51 Prueba de Error +16/07/2001 10:18:11 Prueba de Error +16/07/2001 10:24:23 Prueba de Error +16/07/2001 10:26:27 Prueba de Error +16/07/2001 10:28:37 Prueba de Error +16/07/2001 10:31:07 Prueba de Error +16/07/2001 10:34:51 Prueba de Error +16/07/2001 10:37:29 Prueba de Error +16/07/2001 10:42:17 Prueba de Error +16/07/2001 10:44:54 Prueba de Error +16/07/2001 10:59:36 Prueba de Error +16/07/2001 11:35:50 Prueba de Error +16/07/2001 11:37:06 Prueba de Error +16/07/2001 11:41:03 Prueba de Error +16/07/2001 11:44:41 Prueba de Error +16/07/2001 11:48:07 Prueba de Error +16/07/2001 11:53:27 Prueba de Error +16/07/2001 11:54:59 Prueba de Error +16/07/2001 11:57:06 Prueba de Error diff --git a/Esergui -BDE utilizando API/EserguiBDE/Report.cpp b/Esergui -BDE utilizando API/EserguiBDE/Report.cpp new file mode 100644 index 0000000..b92e5af --- /dev/null +++ b/Esergui -BDE utilizando API/EserguiBDE/Report.cpp @@ -0,0 +1,14 @@ +//---------------------------------------------------------------------------- +#include +#pragma hdrstop + +#include "Report.h" +//---------------------------------------------------------------------------- +#pragma resource "*.dfm" +TQuickReport1 *QuickReport1; +//---------------------------------------------------------------------------- +__fastcall TQuickReport1::TQuickReport1(TComponent* Owner) + : TQuickRep(Owner) +{ +} +//---------------------------------------------------------------------------- diff --git a/Esergui -BDE utilizando API/EserguiBDE/Report.dfm b/Esergui -BDE utilizando API/EserguiBDE/Report.dfm new file mode 100644 index 0000000000000000000000000000000000000000..14853b5499dadc998ab995c062bf24db1822753b GIT binary patch literal 6028 zcmeHL%WvF7825U!YwshQ^io<5XyDNH(5{-KfW&DXueaH<4`*#R6&Ez|P7u3khi%-vhGZ&f#CpE_0SKoqPYID58a!yVz7?kHeIOBkGsnuA>lx+j7Qi9 z)VXoL$2L~WjW8fpeGB3k5oNA!G&HAWzp1ZiJg1ulf&g6@xcGc)O?Pa5vFYDcw)9ws= zC80LEX}1iiGG1EOY%P<|TxPd?{=B4gBfe*8uHoUBm~a!VAlOH^(t@Jf2t$IfRAy65 zZ^C< z4?ioWO=&z@yK~U!#0z|z(eYxx45ytEwet!RwPkOCw#B>WDzkpVGo# zCs7M3UKiqy<)3596lj~$K{Im#J)w-($0AEAg+vRkBVQ5_c)%ban?t$ZlTrknIwAxd zeqH)ft>seR&Zo^E9w;@bz_Bx+kx)?y)aeu9Qi><)_63!N2L_TtiMI$w z#NARA9rECtKV#frIZo4?-43vtZL`&EGLX)8S?gHM$EyJToQTb3UIBm(#5mmEQwTg(h*qfC zQnJYj#=%rmKDVD=Wba5vlxPo+YKqL<{#5w~syQSWLgaC(N)aZwc6Kha2V(b*k7)>8 zY4>T;nt<4KF6K|a90t=kt+kf5p4I_%1L)13?zA}Rc%&mAMK!B##7zQy&y^m_n~M{K zBemipkCWL;!ipD!AIs#}n1`_3*{>&<2Q7t!t0o^Dh7l{eM#&;GA!Cik(`>vYk>p~I zz}hed{d|11QByXJYnl+ zCEkH0-iSYxtz +#include +#include +#include +#include +#include +#include +#include +//---------------------------------------------------------------------------- +class TQuickReport1 : public TQuickRep +{ +__published: + TQRBand *ColumnHeaderBand1; + TQRBand *DetailBand1; + TQRBand *PageFooterBand1; + TQRBand *PageHeaderBand1; + TQRBand *SummaryBand1; + TQRBand *TitleBand1; + TQRLabel *QRLabel1; + TQRLabel *QRLabel2; + TQRLabel *QRLabel3; + TQRLabel *QRLabel4; + TQRLabel *QRLabel5; +private: +public: + __fastcall TQuickReport1::TQuickReport1(TComponent* Owner); +}; +//---------------------------------------------------------------------------- +extern TQuickReport1 *QuickReport1; +//---------------------------------------------------------------------------- +#endif \ No newline at end of file diff --git a/Esergui -BDE utilizando API/EserguiBDE/Transfer.dat b/Esergui -BDE utilizando API/EserguiBDE/Transfer.dat new file mode 100644 index 0000000000000000000000000000000000000000..a3b7a86deb31b7f0031b14f6b54c4ece57877bc2 GIT binary patch literal 9453 zcmb;rk!Eb+W?=C1XBY+43jtm(Q=p|j0IARYuHc)85jC3SR&UyD(v>?pZ3u*ujV{T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=3082 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/InterBase.cpp b/InterBase.cpp new file mode 100644 index 0000000..0654d09 --- /dev/null +++ b/InterBase.cpp @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("InterBase.res"); +USEFORM("..\Unit1.cpp", Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/InterBase.exe b/InterBase.exe new file mode 100644 index 0000000000000000000000000000000000000000..dcbddb52ed5572c21a6d15b53f28e378ea78e530 GIT binary patch literal 29184 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 +#pragma hdrstop + +#include "MySQL_ADO.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "mySQLDbTables" +#pragma resource "*.dfm" +TForm1 *Form1; +//--------------------------------------------------------------------------- +__fastcall TForm1::TForm1(TComponent* Owner) + : TForm(Owner) +{ +} +//--------------------------------------------------------------------------- + + +void __fastcall TForm1::ADOTable1RecordChangeComplete( + TCustomADODataSet *DataSet, const TEventReason Reason, + const int RecordCount, const Error *Error, TEventStatus &EventStatus) +{ +/* + if ( Reason == erAddNew ) + ADOTable1->Refresh(); +*/ +} +//--------------------------------------------------------------------------- + +void __fastcall TForm1::Button1Click(TObject *Sender) +{ + ADOTable1->Refresh(); +/* +ADOTable1->Insert(); +ADOTable1->FieldByName("name")->AsString = "JODERING"; +ADOTable1->Post(); +*/ + +} +//--------------------------------------------------------------------------- + + +void __fastcall TForm1::Button2Click(TObject *Sender) +{ +// Query1->Refresh(); +} +//--------------------------------------------------------------------------- + + + diff --git a/MySQL_ADO.dfm b/MySQL_ADO.dfm new file mode 100644 index 0000000..91b6684 --- /dev/null +++ b/MySQL_ADO.dfm @@ -0,0 +1,317 @@ +object Form1: TForm1 + Left = 191 + Top = 117 + Width = 783 + Height = 540 + Caption = 'Form1' + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Splitter1: TSplitter + Left = 0 + Top = 265 + Width = 775 + Height = 3 + Cursor = crVSplit + Align = alTop + end + object DBGrid1: TDBGrid + Left = 0 + Top = 0 + Width = 775 + Height = 265 + Align = alTop + DataSource = DataSource1 + TabOrder = 0 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object Button1: TButton + Left = 656 + Top = 280 + Width = 75 + Height = 25 + Caption = 'Button1' + TabOrder = 1 + OnClick = Button1Click + end + object DBGrid2: TDBGrid + Left = 8 + Top = 272 + Width = 641 + Height = 225 + DataSource = DataSource2 + TabOrder = 2 + TitleFont.Charset = DEFAULT_CHARSET + TitleFont.Color = clWindowText + TitleFont.Height = -11 + TitleFont.Name = 'MS Sans Serif' + TitleFont.Style = [] + end + object Button2: TButton + Left = 656 + Top = 312 + Width = 75 + Height = 25 + Caption = 'Button2' + TabOrder = 3 + OnClick = Button2Click + end + object ADOConnection1: TADOConnection + Connected = True + ConnectionString = + 'Provider=MSDASQL.1;Password=nuevo;Persist Security Info=True;Use' + + 'r ID=jd;Data Source=sample-MySQL;Mode=Read|Write;Connect Timeout' + + '=15;Extended Properties="DSN=sample-MySQL;DATABASE=test;SERVER=i' + + 'nfdj.com;UID=jd;PWD=nuevo;PORT=3306;OPTION=0;STMT=;";Locale Iden' + + 'tifier=3082' + LoginPrompt = False + Mode = cmReadWrite + Left = 520 + Top = 16 + end + object DataSource1: TDataSource + AutoEdit = False + DataSet = ADOTable1 + Left = 520 + Top = 48 + end + object ADOTable1: TADOTable + Connection = ADOConnection1 + CursorType = ctStatic + OnRecordChangeComplete = ADOTable1RecordChangeComplete + TableName = 'pet' + Left = 552 + Top = 80 + object ADOTable1name: TStringField + FieldName = 'name' + Size = 18 + end + object ADOTable1owner: TStringField + FieldName = 'owner' + Size = 16 + end + object ADOTable1species: TStringField + FieldName = 'species' + Size = 12 + end + object ADOTable1sex: TStringField + FieldName = 'sex' + FixedChar = True + Size = 1 + end + object ADOTable1birth: TDateField + FieldName = 'birth' + end + object ADOTable1death: TDateField + FieldName = 'death' + end + object ADOTable1id: TAutoIncField + AutoGenerateValue = arAutoInc + FieldName = 'id' + end + end + object DataSource2: TDataSource + DataSet = mySQLTable1 + Left = 112 + Top = 440 + end + object Table1: TTable + AutoRefresh = True + DatabaseName = 'SINPASWORD' + TableName = 'pet' + Left = 144 + Top = 416 + end + object Database1: TDatabase + AliasName = 'sample-MySQL' + DatabaseName = 'SINPASWORD' + LoginPrompt = False + Params.Strings = ( + 'DATABASE NAME=' + 'USER NAME=jd' + 'ODBC DSN=sample-MySQL' + 'OPEN MODE=READ/WRITE' + 'BATCH COUNT=200' + 'LANGDRIVER=' + 'MAX ROWS=-1' + 'SCHEMA CACHE DIR=' + 'SCHEMA CACHE SIZE=8' + 'SCHEMA CACHE TIME=-1' + 'SQLPASSTHRU MODE=SHARED AUTOCOMMIT' + 'SQLQRYMODE=' + 'ENABLE SCHEMA CACHE=FALSE' + 'ENABLE BCD=FALSE' + 'ROWSET SIZE=20' + 'BLOBS TO CACHE=64' + 'BLOB SIZE=32' + 'PASSWORD=nuevo') + SessionName = 'Default' + Left = 296 + Top = 440 + end + object Query1: TQuery + AutoRefresh = True + DatabaseName = 'SINPASWORD' + RequestLive = True + SQL.Strings = ( + 'select * from pet' + 'order by name') + UpdateObject = UpdateSQL1 + Left = 664 + Top = 384 + object Query1name: TStringField + FieldName = 'name' + Origin = 'SINPASWORD.pet.name' + end + object Query1owner: TStringField + FieldName = 'owner' + Origin = 'SINPASWORD.pet.owner' + end + object Query1species: TStringField + FieldName = 'species' + Origin = 'SINPASWORD.pet.species' + end + object Query1sex: TStringField + FieldName = 'sex' + Origin = 'SINPASWORD.pet.sex' + FixedChar = True + Size = 1 + end + object Query1birth: TDateField + FieldName = 'birth' + Origin = 'SINPASWORD.pet.birth' + end + object Query1death: TDateField + FieldName = 'death' + Origin = 'SINPASWORD.pet.death' + end + object Query1id: TIntegerField + AutoGenerateValue = arAutoInc + FieldName = 'id' + Origin = 'SINPASWORD.pet.id' + end + end + object UpdateSQL1: TUpdateSQL + ModifySQL.Strings = ( + 'update pet' + 'set' + ' name = :name,' + ' owner = :owner,' + ' species = :species,' + ' sex = :sex,' + ' birth = :birth,' + ' death = :death,' + ' id = :id' + 'where' + ' id = :OLD_id') + InsertSQL.Strings = ( + 'insert into pet' + ' (name, owner, species, sex, birth, death, id)' + 'values' + ' (:name, :owner, :species, :sex, :birth, :death, :id)') + DeleteSQL.Strings = ( + 'delete from pet' + 'where' + ' id = :OLD_id') + Left = 696 + Top = 384 + end + object ADOQuery1: TADOQuery + Active = True + Connection = ADOConnection1 + CursorType = ctStatic + Parameters = <> + SQL.Strings = ( + 'select * from pet') + Left = 584 + Top = 80 + object ADOQuery1id: TAutoIncField + AutoGenerateValue = arAutoInc + FieldName = 'id' + end + object ADOQuery1name: TStringField + FieldName = 'name' + Size = 18 + end + object ADOQuery1owner: TStringField + FieldName = 'owner' + Size = 16 + end + object ADOQuery1species: TStringField + FieldName = 'species' + Size = 12 + end + object ADOQuery1sex: TStringField + FieldName = 'sex' + FixedChar = True + Size = 1 + end + object ADOQuery1birth: TDateField + FieldName = 'birth' + end + object ADOQuery1death: TDateField + FieldName = 'death' + end + end + object mySQLDatabase1: TmySQLDatabase + Connected = True + DatabaseName = 'test' + UserName = 'jd' + UserPassword = 'nuevo' + Host = 'infdj.com' + ConnectOptions = [] + Params.Strings = ( + 'Port=3306' + 'DatabaseName=test' + 'UID=jd' + 'PWD=nuevo' + 'Host=infdj.com') + Left = 688 + Top = 456 + end + object mySQLTable1: TmySQLTable + AutoRefresh = True + Database = mySQLDatabase1 + Active = True + TableName = 'pet' + Left = 688 + Top = 424 + object mySQLTable1name: TStringField + FieldName = 'name' + Size = 21 + end + object mySQLTable1owner: TStringField + FieldName = 'owner' + Size = 21 + end + object mySQLTable1species: TStringField + FieldName = 'species' + Size = 21 + end + object mySQLTable1sex: TStringField + FieldName = 'sex' + Size = 2 + end + object mySQLTable1birth: TDateField + FieldName = 'birth' + end + object mySQLTable1death: TDateField + FieldName = 'death' + end + object mySQLTable1id: TLargeintField + AutoGenerateValue = arAutoInc + FieldName = 'id' + Required = True + end + end +end diff --git a/MySQL_ADO.h b/MySQL_ADO.h new file mode 100644 index 0000000..66c3411 --- /dev/null +++ b/MySQL_ADO.h @@ -0,0 +1,78 @@ +//--------------------------------------------------------------------------- + +#ifndef MySQL_ADOH +#define MySQL_ADOH +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mySQLDbTables.hpp" +//--------------------------------------------------------------------------- +class TForm1 : public TForm +{ +__published: // IDE-managed Components + TADOConnection *ADOConnection1; + TDataSource *DataSource1; + TDBGrid *DBGrid1; + TADOTable *ADOTable1; + TSplitter *Splitter1; + TButton *Button1; + TDBGrid *DBGrid2; + TDataSource *DataSource2; + TTable *Table1; + TButton *Button2; + TDatabase *Database1; + TQuery *Query1; + TUpdateSQL *UpdateSQL1; + TADOQuery *ADOQuery1; + TStringField *Query1name; + TStringField *Query1owner; + TStringField *Query1species; + TStringField *Query1sex; + TDateField *Query1birth; + TDateField *Query1death; + TIntegerField *Query1id; + TAutoIncField *ADOQuery1id; + TStringField *ADOQuery1name; + TStringField *ADOQuery1owner; + TStringField *ADOQuery1species; + TStringField *ADOQuery1sex; + TDateField *ADOQuery1birth; + TDateField *ADOQuery1death; + TStringField *ADOTable1name; + TStringField *ADOTable1owner; + TStringField *ADOTable1species; + TStringField *ADOTable1sex; + TDateField *ADOTable1birth; + TDateField *ADOTable1death; + TAutoIncField *ADOTable1id; + TmySQLDatabase *mySQLDatabase1; + TmySQLTable *mySQLTable1; + TStringField *mySQLTable1name; + TStringField *mySQLTable1owner; + TStringField *mySQLTable1species; + TStringField *mySQLTable1sex; + TDateField *mySQLTable1birth; + TDateField *mySQLTable1death; + TLargeintField *mySQLTable1id; + void __fastcall ADOTable1RecordChangeComplete( + TCustomADODataSet *DataSet, const TEventReason Reason, + const int RecordCount, const Error *Error, + TEventStatus &EventStatus); + void __fastcall Button1Click(TObject *Sender); + void __fastcall Button2Click(TObject *Sender); +private: // User declarations +public: // User declarations + __fastcall TForm1(TComponent* Owner); +}; +//--------------------------------------------------------------------------- +extern PACKAGE TForm1 *Form1; +//--------------------------------------------------------------------------- +#endif diff --git a/MySQL_wADO.bpr b/MySQL_wADO.bpr new file mode 100644 index 0000000..2b977ea --- /dev/null +++ b/MySQL_wADO.bpr @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=3082 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=$(BCB)\include;$(BCB)\include\vcl;C:\Mis documentos\Fuentes de Programacion\C++ Builder\VCLs\MySQL_dac\CB5 +Item1=$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=2 +Item0=..\VCLs\MySQL_dac\CB5;..\VCLs\lib;$(BCB)\lib\obj;$(BCB)\lib;C:\Mis documentos\Fuentes de Programacion\C++ Builder\VCLs\MySQL_dac\CB5 +Item1=..\VCLs\MySQL_dac\CB5;..\VCLs\lib;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=1 +Item0=_DEBUG + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +HostApplication= +RemoteHost= +RemotePath= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + +[Language] +ActiveLang= +ProjectLang= +RootDir= + + \ No newline at end of file diff --git a/MySQL_wADO.cpp b/MySQL_wADO.cpp new file mode 100644 index 0000000..32a6fe2 --- /dev/null +++ b/MySQL_wADO.cpp @@ -0,0 +1,22 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +USERES("MySQL_wADO.res"); +USEFORM("MySQL_ADO.cpp", Form1); +//--------------------------------------------------------------------------- +WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +{ + try + { + Application->Initialize(); + Application->CreateForm(__classid(TForm1), &Form1); + Application->Run(); + } + catch (Exception &exception) + { + Application->ShowException(&exception); + } + return 0; +} +//--------------------------------------------------------------------------- diff --git a/MySQL_wADO.exe b/MySQL_wADO.exe new file mode 100644 index 0000000000000000000000000000000000000000..00a155511012659ae116d9980c68ae1addc8fcb3 GIT binary patch literal 34816 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 BqbL9X literal 0 HcmV?d00001 diff --git a/MySQL_wADO.res b/MySQL_wADO.res new file mode 100644 index 0000000000000000000000000000000000000000..1392cb0d412875fb3d8725cb07da556aadfb0925 GIT binary patch literal 876 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 oIND}-9!!d>1A|ll_y8