Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   problema al insertar un caracter especial en tablas dbf (https://www.clubdelphi.com/foros/showthread.php?t=87314)

alvarodelphi201 11-12-2014 21:57:33

problema al insertar un caracter especial en tablas dbf
 
Hola gente:

Debido a un requerimiento de un cliente actualmente me vi en la necesidad de crear un programa interfaz entre archivos xls y tablas DBF (visualfox 9) . Este cliente me pide que meta los datos de varios archivos xls a las tablas que tiene en foxpro (sistema antiiiguo, que no tienen planificado modernizar), con el iguiente plus... algunos campos estan encriptados.

Analizando el còdigo de su programador (me llevo semanas), encontre la fòrmula que uso este programador (que ya entrego el bote), que tiene horrible caracterìstica de poner como primer caracter del valor el caracter #0 (enter), bueno al principio no le di mucha importancia arme el programa y en el momento de las pruebas chas todo el trabajo arruinado, debido a que no puedo insertar ese bendito caracter (que fox raramente desde el còdigo propio si lo inserta) ya llevo varios dìas martillando el problema y no encuentro soluciòn ya que por ejemplo al querer meter el valor #0+'----' en las tablas dbf queda vacio completamente!!!!

Por favor denme unas luces sobre el tema, les adelanto que el cliente no quiere cambiar de sistema, asì que la soluciòn no va por ese lado (quisiera hacerle un sistema nuevo).

las caracterìsticas:
delphi 7 enterprise
conexion con ADO
el campo en la tabla dbf es un char(2), no puedo modificarlo porque es parte de otros mòdulos intocables (contabilidad).

les adjunto parte del còdigo que uso para insertar:

Código Delphi [-]
  with table2 do //tabla conectada a la tabla foxpro planilla
  begin
   // el n2topak es el que encripta

   vl_per := n2topak(StrToInt(mes+anio));

   Active := True;
   Insert;
   FieldByName('pl_anios').AsString:= GridContab.Cells[13,reg];
   FieldByName('pl_meses').AsString:= GridContab.Cells[14,reg];
   FieldByName('pl_antig').AsString:= GridContab.Cells[15,reg];
   FieldByName('pl_des1').AsString:= GridContab.Cells[18,reg];
   FieldByName('pl_des2').AsString:= GridContab.Cells[19,reg];
   FieldByName('pl_des3').AsString:= GridContab.Cells[20,reg];
   FieldByName('pl_des4').AsString:= GridContab.Cells[21,reg];
   FieldByName('pl_diast').AsString:= GridContab.Cells[22,reg];
   FieldByName('pl_f87').AsString:= vl_f87;

   // Este es el meollo del asunto el vl_per[0] tiene el còdigo #0 y el vl_per[1] otro caracter ascii que podrìa ser tambien #0

   FieldByName('pl_per').AsVariant:= vl_per[0]+vl_per[1];
   FieldByName('pl_sec').AsString:= vl_sec;
   Post;
   Active := False;

  end;
En sìntesis la estructura del dbf es intocable, ya que no quieren cambios.

Ayuda por favor!!!!

alvarodelphi201 17-12-2014 23:15:58

Actualizando el problema:
 
Despues de machacar encontré, que el procedimiento de encriptación en fox de este programador retorna el caracter nulo en el primer caracter del string, despues de una serie de pruebas verifiqué que ese caracter (#0) es el problema, ya que los restantes caracteres si los inserta.

Por tanto el procedimiento retorna en un string de 2 dìgitos en el primer caracter #0 y continua con otro tipo de caracter.

Alguien tiene idea de como meter este caracter nulo en un ¿campo?

mamcx 17-12-2014 23:35:51

Un NULL es *infeccioso*. NULL con lo que sea da NULL (que es lo que creo que pasa en vl_per[0]+vl_per[1]).

Pero el *caracter* null es un *encoding*. Al igual que "enter" y "tab" (que se identifican por un #). Por lo tanto, debes es guardar el # o el *char* que representa el null, no el valor null (null <> char o # que representa null).

alvarodelphi201 18-12-2014 17:33:35

Gracias por responder.

Cita:

Empezado por mamcx (Mensaje 486774)
Un NULL es *infeccioso*. NULL con lo que sea da NULL (que es lo que creo que pasa en vl_per[0]+vl_per[1]).

Pero el *caracter* null es un *encoding*. Al igual que "enter" y "tab" (que se identifican por un #). Por lo tanto, debes es guardar el # o el *char* que representa el null, no el valor null (null <> char o # que representa null).

ya intente (creo) hacerlo, tengo el procedimiento

Código Delphi [-]
function TForm1.codificar(n2 :Integer): string; 
var  L,H :Integer; 
begin  
  L:= n2 mod 256;  
  H:= (n2-L) div 256;   
  result:=CHR(H)+CHR(L);  
end;

Que es la copia del procedimiento del programador fox (traducida claro)
Como se puede ver la salida es un string el cual por ejemplo me devuelve en el debug #0'-'
si intento hacer un

Código Delphi [-]
FieldByName('pl_per').AsVariant:= vl_per;

no me inserta en ese campo nada (aparentemente) pero creo que me inserta el null (#0) y el resto de la cadena no lo cual lògicamente al hacer el desencriptado me devuelve valores incorrectos.

En el ejemplo #0'-' deberia devolverme al desencriptar 175 y me devuelve 8565.
probe con otros valores y solo tengo ese problema cuando el encriptador me retorna el #0 primero.

La verdad no se como hacer lo que indicas, si es que me puedes dar un ejemplo por favor te lo agradeceria.


La franja horaria es GMT +2. Ahora son las 12:30:12.

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