Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-05-2007
socger socger is offline
Miembro
 
Registrado: jun 2004
Posts: 89
Poder: 23
socger Va por buen camino
Chicos tengo otro fallo

Os paso dos ficheros para probarme este error de interpretación (Lector tacógrafos.rar y Fichero_Tarjeta_Digital_Conductor.rar)

Bien me ocurre este problema, existe un tipo de datos según el BOE que conseguí gracias a vosotros que son del tipo time real de hecho esto es lo que dice el BOE:
--------------------------------------------------------------------------------------------------
2.110. TimeReal
Código para un campo combinado de fecha y hora, donde ambos parámetros se expresan como los segundos transcurridos desde las 00h.00m.00s. del 1 de enero de 1970, tiempo medio de Greenwich.

TimeReal{INTEGER:TimeRealRange} ::= INTEGER(0..TimeRealRange)

Asignación de valor . Alineación de octeto: número de segundos transcurridos a partir de la medianoche del día 1 de enero de 1970, tiempo medio de Greenwich.

La fecha/hora máxima posible es en el año 2106.

Definición de valores variables empleados en las definiciones del apartado 2.
TimeRealRange ::= 232-1
--------------------------------------------------------------------------------------------------

Para calcular la fecha que devuelve una variable del tipo he creado primero la clase tTime_Real:
--------------------------------------------------------------------------------------------------
TTime_Real = packed record // 4 byte ver apdo. 2.110. TimeReal
Time_Real: Integer; // [INTEGER:TimeRealRange] ::= INTEGER(0..TimeRealRange) ... TimeRealRange ::= 2^32-1
end;
--------------------------------------------------------------------------------------------------

Y segundo la función Devolver_Fecha:
--------------------------------------------------------------------------------------------------
function TForm1.Devolver_Fecha(Fecha_Integer: Integer): String;
var Cantidad_Dias_Transcurridos: Extended;
Cantidad_Resto_Horas: Extended;
Cantidad_Resto_Minutos: Extended;
Cantidad_Resto_Segundos: Extended;
Resto_Que_Queda_de_Segundos: Extended;
Dia_A_Devolver: tDate;
Mensaje: String;
begin
// Un día = 60 segundos * 60 minutos * 24 horas = 86400 segundos
// Una hora = 60 segundos * 60 minutos = 3600 segundos
// Una minuto = 60 segundos = 60 segundos

Resto_Que_Queda_de_Segundos := Fecha_Integer;
Mensaje := 'Total segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Dias_Transcurridos := Abs(Int(Resto_Que_Queda_de_Segundos / 86400));
Resto_Que_Queda_de_Segundos := Resto_Que_Queda_de_Segundos - (Cantidad_Dias_Transcurridos * 86400);
Mensaje := Trim(Mensaje) + 'Total días transcurridos: ' + FloatToStr(Cantidad_Dias_Transcurridos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Resto_Horas := Abs(Int(Resto_Que_Queda_de_Segundos / 3600));
Resto_Que_Queda_de_Segundos := Resto_Que_Queda_de_Segundos - (Cantidad_Resto_Horas * 3600);
Mensaje := Trim(Mensaje) + 'Resto de horas transcurridas: ' + FloatToStr(Cantidad_Resto_Horas) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Resto_Minutos := Abs(Int(Resto_Que_Queda_de_Segundos / 60));
Resto_Que_Queda_de_Segundos := Resto_Que_Queda_de_Segundos - (Cantidad_Resto_Minutos * 60);
Mensaje := Trim(Mensaje) + 'Resto de minutos transcurridas: ' + FloatToStr(Cantidad_Resto_Minutos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Cantidad_Resto_Segundos := Resto_Que_Queda_de_Segundos;
Mensaje := Trim(Mensaje) + 'Resto de segundos transcurridas: ' + FloatToStr(Cantidad_Resto_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + 'Resto de segundos: ' + FloatToStr(Resto_Que_Queda_de_Segundos) + chr(10) + chr(13);
Mensaje := Trim(Mensaje) + ' ' + chr(10) + chr(13);

Dia_A_Devolver := StrToDate('01/01/1970') + Cantidad_Dias_Transcurridos;
Mensaje := Trim(Mensaje) + 'Dia a devolver: ' + DateToStr(Dia_A_Devolver) + chr(10) + chr(13);

MessageDlg( Mensaje, mtInformation, [mbOk], 0 );

Result := Trim( DateToStr(Dia_A_Devolver) + ' ' +
Trim(FloatToStr(Cantidad_Resto_Horas)) + ':' +
Trim(FloatToStr(Cantidad_Resto_Minutos)) + ':' +
Trim(FloatToStr(Cantidad_Resto_Segundos)) );
end;
--------------------------------------------------------------------------------------------------

El ejemplo que os paso me debería de haber devuelto sobre el tipo de
FID = 0520 ... EF Identification (CardIdentification + DriverCardHolderIdentification)
En Fecha primer día de validez de la tarjeta: 09-09-2006
y en Fecha en la que termina la validez de la tarjeta: 09-09-2011

Estos datos los cargo en la clase TCard_Identification sobre card_Validity_Begin y card_Expiry_Date respectívamente
--------------------------------------------------------------------------------------------------
TCard_Identification = packed record // 65 byte ... ver apdo. BOE 2.20. CardIdentification
card_Issuing_Member_State: Byte; // NationNumeric, ... 1 byte INTEGER(0..255) por defecto (00) ver apdo 2.72. NationNumeric
card_Number: TCard_Number_Conductor; // CardNumber ... 16 byte por defecto (20..20) ver apdo. 2.21 CardNumber
card_Issuing_Authority_Name: TName; // Name, ... 36 byte por defecto (20..20) ver apdo. 2.70 Name
card_Issue_Date: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
card_Validity_Begin: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
card_Expiry_Date: TTime_Real; // TimeReal ... 4 byte por defecto (00..00) ver apd. 2.110 TimeReal
end;
--------------------------------------------------------------------------------------------------

Pero como comprobareis con el ejemplo no me devuelve bien los valores de fecha, creo que puede ser o que no he entendido bien que tipo de datos son los TimeReal o que se me escapa algo en la función.

Por si os hacen falta os envío en el fichero Otros_Ficheros_Conductores.rar más capturas de conductores.

Os agradecería me guiaseis ante esta duda. Como veréis en el código que subo voy bastante avanzado gracias a vuestra ayuda.

De antemano, os doy las gracias por vuestra colaboración.
Archivos Adjuntos
Tipo de Archivo: zip Otros_Ficheros_Conductores.zip (7,6 KB, 80 visitas)
Tipo de Archivo: zip Lector tacógrafos_2.zip (16,1 KB, 134 visitas)
Tipo de Archivo: zip Lector tacógrafos_1.zip (16,2 KB, 119 visitas)
Tipo de Archivo: zip Fichero_Tarjeta_Digital_Conductor.zip (2,7 KB, 90 visitas)
Responder Con Cita
  #2  
Antiguo 31-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Un paréntesis.

El programa ¿es para tí? ¿lo vas a vender? ¿lo haces por curiosidad?

Lo digo porque leer los archivos (que es lo que haces ahora) es lo de menos, después tienes que:
- organizar los datos (de cada conductor en una carpeta separada).
- interpretar los datos cuando es tarjeta de Empresa.
- Sacar las estadísticas, que es en realidad lo interesante del tema (saber cuando un conductor se pasó del límite de velocidad o bien cuando sobrepasó el límite de tiempo al volante), el día, la hora, el periodo de incidencia, etc.
-Cruzar los datos de la tarjeta empresa con los datos de conductores, esto si puede ser más que tedioso y propenso a errores.
- Revisar todas las modificaciones del BOE al efecto, para actualizar tu programa y que cumpla las nuevas reformas.
- Revisar todos los nuevos fabricantes de VU que vayan saliendo, (para que tu programa lo reconozca). Yo no he encontrado una lista de fabricantes por ningún sitio.
- Sobre todo, realizar gráficas de líneas basadas en todos los datos anteriores, porque realmente es lo que va a mirar el empresario. De nada me sirve ver un grid con los datos de 3 meses anteriores, de nueve camiones y 12 conductores y aparte los datos de Empresa.

Es muy típico que un conductor introduzca la tarjeta en el coche por la mañana y la saque por la noche, sin establecer los modos de pausa, aparcamiento, conducción al entrar en barcos, etc. Todos esos trucos debes conocerlos y actuar como diga la ley, por ejemplo, alertar cuando el tiempo de conducción no supere los 2 minutos... (caso típico de mover el camión en el lugar de carga) para que el empresario tome cuenta y le eche la bulla al conductor.

Lo que digo, es que por 1.000 € tienes el DATACOGRAF Professional que realiza todo el trabajo. Dudo que una persona sola, pueda realizar el mismo software por el mismo coste.

Existen programas más baratos, pero, por ejemplo, no cruzan los datos de Empresa - conductores.

No quiero desalentarte, solo quiero que veas donde te metes y valores otras opciones antes de continuar.

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 31-05-2007 a las 15:32:03.
Responder Con Cita
  #3  
Antiguo 31-05-2007
socger socger is offline
Miembro
 
Registrado: jun 2004
Posts: 89
Poder: 23
socger Va por buen camino
lepe ... Es para mi jefe

Pertenezco a una empresa que se dedica al servicio de viajes discrecionales (viajes por bus).

Estoy desarrollando esta aplicación para integrarla en nuestro ERP, no con vistas a su comercialización posterior.

La mayoría del software que hay en EL MERCADO no da integración de sus datos con un ERP ajeno a no ser por importación/exportación de datos por lo que no es trasparente para el usuario de la empresa para la que trabajo.

Por eso en este hilo comenté de ir subiendo el código progresívamente para que otros pudieran aprovecharse de él.

De momento me he topado con este último problema (2 comentarios anteriores), por eso pido ayuda. Héchale un vistazo por favor y a ver que me puedes decir.

Gracias, de antemano.
Responder Con Cita
  #4  
Antiguo 31-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Se lo he echado, pero no me queda nada claro, por eso no comento nada desde hace mucho .

Dice que TimeReal va de cero a 2^32-1 ... vale, eso cabe en un tipo de datos Integer.

Después Fecha_integer da resultados negativos ¿no quedamos en que era un valor positivo? .... ¿está en complemento a 2 ese número? ¿no está leyendo bien los datos?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 05-06-2007
socger socger is offline
Miembro
 
Registrado: jun 2004
Posts: 89
Poder: 23
socger Va por buen camino
perdona lepe lo vi tarde

En cuanto a tu cita:
----
Después Fecha_integer da resultados negativos ¿no quedamos en que era un valor positivo? .... ¿está en complemento a 2 ese número? ¿no está leyendo bien los datos?
---

Si está recogiendo bien los datos pero no se a que te refieres (¿está en complemento a 2 ese número?)

Gracias, por vuestra ayuda. Pero sigo pillado en este asunto antes puesto.
Responder Con Cita
  #6  
Antiguo 06-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 24
sitrico Va por buen camino
Me voy a meter a consciencia de que no tengo ni idea de esto

Pero...

Cita:
Time_Real: Integer; // [INTEGER:TimeRealRange] ::= INTEGER(0..TimeRealRange) ... TimeRealRange ::= 2^32-1
end;
dice que el INTEGER va de 0..2^32-1

Me pasó algo parecido en otro caso y la solucion tenía que ver con:

Cita:
Generic integer types for 32-bit implementations of Delphi
Type Range Format
Integer -2147483648..2147483647 signed 32-bit
Cardinal 0..4294967295 unsigned 32-bit
Fundamental integer types include Shortint, Smallint, Longint, Int64, Byte, Word, and Longword.

Fundamental integer types
Type Range Format
Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit
Longint -2147483648..2147483647 signed 32-bit
Int64 -2^63..2^63-1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
El tipo integer va de -2147483648..2147483647 mientras que el Cardinal 0..4294967295 (sin signo) por lo que creo que debes definir tu variable como cardinal (ó longword) en lugar de integer.

Espero te sirva.
__________________
Sitrico
Responder Con Cita
  #7  
Antiguo 07-06-2007
socger socger is offline
Miembro
 
Registrado: jun 2004
Posts: 89
Poder: 23
socger Va por buen camino
Gracias sitrico

Gracias, pero cambiando en el programa el tipo de variable a cardinal o longword me sigue ocurriendo lo mismo

Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Huellas Digitales Viky Varios 6 17-01-2007 18:38:18
Atacar el ToolBarWindows32 mangi API de Windows 0 28-04-2006 13:07:58
Atacar cartografías tipo Map Point o NafTec socger Varios 3 23-12-2005 10:04:09
¿Con .Net que bases de datos puedo atacar y como??? burasu .NET 4 17-09-2005 12:16:05
Atacar tablas Paradox con ADO. Chojj Conexión con bases de datos 2 02-07-2003 20:50:12


La franja horaria es GMT +2. Ahora son las 02:50:19.


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