Jump to content


Photo

Problema al meter una cadena de texto que empieza por #0


  • Please log in to reply
9 replies to this topic

#1 alvarod2014

alvarod2014

    Newbie

  • Miembros
  • Pip
  • 6 posts

Posted 18 December 2014 - 04:27 PM

Buenas:

Tengo un gran problema con la inserción de una cadena encriptada que como primer caracter tiene el #0 ( char(0) ),  y ese problema es que no la inserta!  :cry:

Estoy trabajando con delphi 7, ADO, y tablas dbf de visual foxpro.

básicamente lo que hago es simular, un código de encriptación echo en foxpro que genera estos caracteres en base a un número en este caso 175 que lo retorna como ascii en este caso 175 lo convierte en #0'-' y debo insertarlo en la tabla pero no lo hace, ya verifique que el string esta bien creado, pero no entiendo la razón por la cual no lo inserta, verifique la tabla fox y tiene varios valores de este tipo insertadas.

Por favor ayúdenme.
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 18 December 2014 - 04:58 PM

Hola amigo alvarod2014, bienvenido seas a DelphiAccess...  (y)

Dos preguntas:

1. Te manda algún tipo de error ?
2. Con otra cadena si hace el guardado de información ?

Porqué no colocas aquí el código donde haces el guardado para que podamos darle una miradita ?  ;)

Saludox ! :)
  • 0

#3 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 18 December 2014 - 05:58 PM

fundamental conocer el error, dado que pueden ser muchas cosas.

gracias por ayudar a ayudarte.
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 19 December 2014 - 03:06 AM

-Usas pChar (mala idea) o string (buena idea)?

-Si esta encriptado no es buena idea usar cadenas de texto a no ser que antes le hagas una pasada a Base64 con lo que todo se convierete a ASCII visible y "normalito" para un string (al recogerlo le deshaces el Base64 y listo).
  • 0

#5 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 posts
  • LocationCali, Colombia

Posted 19 December 2014 - 06:02 AM

Efectivamente, el problema es el que menciona Sergio, no es posible utilizar Strings cuando sabes que te podría retornar un #0 en cualquier posición.

Soluciones : Utiliza un Base64 o Utiliza un campo binario y guardas un array of byte.

Saludos.
  • 0

#6 alvarod2014

alvarod2014

    Newbie

  • Miembros
  • Pip
  • 6 posts

Posted 19 December 2014 - 07:15 AM

Bueno les respondo a todos, de nuevo gracias por sus respuestas

les comento que a la tabla en la cual debo insertar este valor es una tabla foxpro dbf, la cual no la puedo tocar el campo de esta tabla es un caracter de 2, al parecer el programador original creó este código de encriptación como medida de seguridad.



delphi
  1. function TForm1.n2topak(n2 :Integer): string;
  2. var
  3. L,H :Integer;
  4. begin
  5. L:= n2 mod 256;
  6. H:= (n2-L) div 256;
  7. //result[0]:= CHR(H);
  8. //result[1]:=CHR(L);
  9. result:=CHR(H)+CHR(L);
  10. //result:= CHR(L);
  11. end;
  12.  
  13. function TForm1.pertopak(vl_mes,vl_anio :String): string;
  14. var
  15.   m,a : integer;
  16. begin
  17. m:= 0;
  18. a := 0;
  19.  
  20. m:= StrToInt(vl_mes);
  21. if m < 0 then m:=1;
  22. a:= StrToInt(vl_anio)-2000;
  23. if a < 0 then a := 0;
  24. result := n2topak(a*12+m);
  25. end;



este lógicamente lo traduci a delphi, la salida la puse como string debido a que el campo era un string en foxpro.
el código de inserción el el siguiente:


delphi
  1. var
  2.   vl_per :String;
  3. .....
  4. ...
  5. ...
  6. begin
  7. vl_per := '';
  8. with table2 do //tabla conectada a la tabla foxpro
  9.   begin
  10.  
  11.   vl_per := pertopak(mes,anio);
  12.  
  13.   Active := True;
  14.   Insert;
  15.   FieldByName('pl_ints').AsString:= '0';
  16.   FieldByName('pl_intsb').AsString:= '0';
  17.   FieldByName('pl_jj').AsString:= GridContab.Cells[29,reg];
  18.  
  19.   if GridContab.Cells[30,reg] = 'NULL' then
  20.     FieldByName('pl_por').AsFloat:= 0
  21.   else
  22.     FieldByName('pl_por').AsString:= GridContab.Cells[30,reg];
  23.  
  24.   FieldByName('pl_cargo').AsString:= vl_cargo2;
  25.   FieldByName('pl_num').AsString:= n2topak(vl_num);
  26.   FieldByName('pl_per').AsVariant:= vl_per;
  27.  
  28.   FieldByName('pl_sec').AsString:= vl_sec;
  29.   Post;
  30.   Active := False;
  31.  
  32.   end;
  33. end;



Como veis los datos del registro los extraigo de una grilla, en la cual recupero un archivo excel comun.
ya intente convirtiendo en pchar el resultado como dicen (mala idea), string retorna el valor correcto (lo comprobe con el algoritmo de desencriptación).

el problema es cuando lo inserto en la tabla, no inserta nada, verifique la tabla y tiene registros de este tipo (insertados desde foxpro desde luego).

La gente me tiene limitado porque no quieren un nuevo sistema, y solo quieren esta interfaz de archivos.

Básicamente lo que hago es subo un archivo excel y tengo que bajar en la tabla(s) foxpro, con la codificacion de determinados campos.

Base64 me encantaria, pero como les menciono no puedo cambiar la codificación porque no lo quieren asi (se los sugeri al principio).

Si alguien me puede dar luces al respecto les agradeceria  :cheesy:
  • 0

#7 alvarod2014

alvarod2014

    Newbie

  • Miembros
  • Pip
  • 6 posts

Posted 19 December 2014 - 07:23 AM

Ufa me olvide decirles que no me manda ningún error, todo bien, al comprobar los datos insertados es que compruebo que no insertó nada.
  • 0

#8 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 19 December 2014 - 01:35 PM

Quizas es cosa de como conectas con foxpro, es AsString podria pasar por un char en alguna fase y el 0 hace que no siga leyendo... igual te toca añadir ese texto de otra forma, AsVariant apuntando a un array of char o que se yo, hasta puede que sin cambiar el como se conecta sea imposible.
  • 0

#9 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 posts
  • LocationMisiones, Argentina

Posted 19 December 2014 - 09:47 PM

Como es DBF (es viejo). Podrías pasar de Excel con cuidado a .CSV (separando con comas). Luego con una utilidad como DataPump de Delphi 7 podrías pasarlo a la tabla DBF siguiendo unos pasos sencillos. Siempre haciendo copia de los archivos DBF originales, por las dudas.

Saludos.

  • 0

#10 alvarod2014

alvarod2014

    Newbie

  • Miembros
  • Pip
  • 6 posts

Posted 06 February 2015 - 07:32 AM

Bunas, perdon por haberme perdido.
Al final no pude encontrar la forma en la cual insertar el caracter mediante un TAdotable o un AdoQuery, pero logre generar un procedimiento en un ADoConnection en donde escribí el código del procedimiento encriptador. algo asi



delphi
  1. AdoConnection1.Execute(' UPDATE PLANILLA  '+
  2.                       ' SET pl_per = (CHR( ('+IntToStr(vac_total)+'-('+IntToStr(vac_total)+'%256))/256)+ '+
  3.                       'CHR(('+IntToStr(vac_total)+')%256) ),'+
  4.                       ' pl_num = CHR(((VAL(pl_num)-(VAL(pl_num)%256))/256))-CHR(VAL(pl_num)%256) '+
  5.                       ' WHERE pl_per = ''4p''');



Gracias a este update logré que el mismo fox hiciera el trabajo de encriptación, lógicamente si el procedimiento de encriptamiento hubiera sido más complejo supongo que no hubiera podido hacer algo asi.

Gracias a todos por su ayuda
  • 0




IP.Board spam blocked by CleanTalk.