Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Desempaquetar campos numéricos comprimidos de archivo

Hola a tod@s.

Necesito leer un fichero creado con btrieve para pasarlo a mi aplicación. Con la instrucción BUTIL saco los registros a un fichero de texto pero me encuentro con que los campos numéricos están empaquetados. Para los que conozcan el BASIC quiero recordar que se empaquetaban/desempaquetaban con la instrucción cvi/cvs mki/mks.

¿Hay alguna manera desde Delphi de poder leer y desempaquetar estos campos o me tendré que preparar un programita en BASIC (horror porque no me acuerdo de nada)?

Dejo aquí un archivo de muestra por si a alguien le hace chiste y le echa un vistazo.

Gracias y un saludo
__________________
Be water my friend.

Última edición por newtron fecha: 18-01-2017 a las 19:32:30.
Responder Con Cita
  #2  
Antiguo 23-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En torrys hay algunos componentes para acceder desde delphi a bases de datos btrieve/pervasive, a ver si te sirve.
También he encontrado esto, es libre.
Responder Con Cita
  #3  
Antiguo 24-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Gracias, le echaré un vistazo y te cuento.
__________________
Be water my friend.
Responder Con Cita
  #4  
Antiguo 24-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Parece que estos programas lo que hacen es algo similar al BUTIL que viene con las BTRIEVE que es generar un fichero de texto a partir del fichero original pero no me resuelve el problema de los números empaquetados.

Seguiremos buscando la forma.
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 24-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
"Números empaquetados", ¿te refieres a big endian y little endian?

Código:
unsigned long blockLength  = *blockLengthPtr++ << 24;
blockLength |= *blockLengthPtr++ << 16;
blockLength |= *blockLengthPtr++ << 8;
blockLength |= *blockLengthPtr;

unsigned long dataLength  = *dataLengthPtr++ << 24;
dataLength |= *dataLengthPtr++ << 16;
dataLength |= *dataLengthPtr++ << 8;
dataLength |= *dataLengthPtr;

Última edición por Casimiro Notevi fecha: 25-05-2012 a las 12:04:52.
Responder Con Cita
  #6  
Antiguo 24-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Mira esta página, creo que ahí tienes la solución

Y aquí un ejemplo sencillo, que en teoría funciona;

Código Delphi [-]
function SwapEndian(Value: integer): integer; register; overload;
asm
  bswap eax
end;

function SwapEndian(Value: smallint): smallint; register; overload;
asm
  xchg  al, ah
end;
Responder Con Cita
  #7  
Antiguo 24-05-2012
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Hola newtron

Hasta donde recuerdo (usé btrieve y butil en los 90's) y el butil te generaba un archivo csv de la info, voy a escarbar en mis respaldos a ver si conservo aún la linea de comandos que usaba para eso, aunque era para DOS, no se si cambiaron algo en esos programas.

Saludos
Responder Con Cita
  #8  
Antiguo 24-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Veamos, creo que esto:

Código Delphi [-]
var
  before, after : Word;
 begin
  // Set up out starting number
  before := $3C;      // Hex 3C = 003C in the Word

  // Shift left by 12 will lose the top 12 bits of the Word
  after := before Shl 12;

  ShowMessageFmt('Before : %x',[before]);
  ShowMessageFmt('After shift left  : %x',[after]);

  // Shifting right by 12 will not recover the lost data
  after := after Shr 12;

  ShowMessageFmt('After shift right : %x',[after]);
 end;

Mira los ejemplos de shr y shl en http://www.delphibasics.co.uk


Responder Con Cita
  #9  
Antiguo 25-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Gracias egostar, el archivo ya lo tengo extraido con BUTIL. El problema que tengo es que dentro del registro hay campos numéricos empaquetados que no sé cómo extraerlos desde delphi. Esto en basic se hacían con unas instrucciones que no sé si tienen equivalencia en delphi.

En la imagen se ve un ejemplo del archivo en el que los muñecos de ciertos campos son los campos numéricos que os comento.

Casimiro, no sé si esto que me indicas sirve para lo que estoy buscando, lo estudiaré un poco porque por encima no me entero de qué va.

Gracias y un saludo.

__________________
Be water my friend.
Responder Con Cita
  #10  
Antiguo 25-05-2012
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Entiendo,

La otra opción es utilizar el manejador de bases de datos Btrieve, se llama Xtrieve, aunque lo que yo usé era para DOS, desconozco si tienes esa herramienta y desconozco si aún existe o se pueda descarga libremente.

Por cierto, hasta donde recuerdo, los tipos decimales son BCD, y me parece que BUTIL exporta los valores numéricos (decimal, entero) como binarios.

Saludos
Responder Con Cita
  #11  
Antiguo 25-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Será mucho pedir preguntar si tienes el código fuente de esas funciones cvi/cvs mki/mks
Para saber qué hacen exactamente y así crear unas similares para delphi.
O por lo menos, si supiésemos cómo empaqueta esos números.
Responder Con Cita
  #12  
Antiguo 25-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Será mucho pedir preguntar si tienes el código fuente de esas funciones cvi/cvs mki/mks
Para saber qué hacen exactamente y así crear unas similares para delphi.
O por lo menos, si supiésemos cómo empaqueta esos números.
Ni de coña, eso son funciones internas del basic. La idea era que como bien sabes en aquellos tiempos había problemas de espacio en disco un número grande se podía almacenar en un campo de 4 dígitos empaquetándolo con la instrucción MKS$ y luego lo que se hacía era que cogías la parte de 4 dígitos del registro correspondiente a ese número y lo desempaquetabas con la instrucción CVD.

A ver si algún amable (y senior) forero que haya programado con versiones antiguas de basic le suena esto y me puede dar norte, si no, tendré que preparar un programita en basic que lea ese fichero, desempaquete los datos y me vaya generando otro con los números en modo carácter.

Gracias y un saludo
__________________
Be water my friend.
Responder Con Cita
  #13  
Antiguo 25-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Entonces son 4 dígitos y lo que hay almacenado es un número con decimales?.
Responder Con Cita
  #14  
Antiguo 25-05-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Entonces son 4 dígitos y lo que hay almacenado es un número con decimales?.
Ahimaspillao, recuerdo que se almacenaban dos tipos de números, uno en 4 dígitos y otro en 8, no recuerdo las características de cada uno.
__________________
Be water my friend.
Responder Con Cita
Respuesta



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

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Campos numericos Alexandro Tablas planas 6 21-10-2008 17:21:09
Problemas al actualizar campos numéricos con ClientDataSet e IBX PINO72 Conexión con bases de datos 0 17-03-2007 01:37:44
campos numericos en access naker Tablas planas 1 08-10-2004 02:59:48
Máscaras para campos numéricos jadelphi Varios 2 01-09-2004 08:53:06
Campos Numericos en DBEDITS jfloro OOP 2 04-06-2003 11:40:22


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


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