Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-10-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Thumbs up

Bueno ,viendo el problema de Wbarrantes veo que la cosa se ha complicado demasiado de lo que parece. Si lo que se desea es encriptar el contenido de una columna en un DBGrid, pues yo veo dos alternativas:
1ra.- Hacerlo directamente en el SERVER
Tener una funcion o hacer uso de una funcion encriptadora directamente en la consulta SQL en el server es decir mi consulta SQL podría ser así:
Código SQL [-]
Select Nombre,Apellido1,Apellido2,Encryptar(CampoX) from MiTabla;
Con eso me evito la tarea de hacerlo desde Delphi.
2da.- Haciendolo desde Delphi
Desde Delphi lo que se podría hacer es utilizar el evento OnGetText que todo Campo Persistente tiene y poner un código sencillo como éste:
Código Delphi [-]
procedure TForm1.ZTable1CampoXGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  Text:=Encryptar(Text);{ Nótese como éste evento posee como parámetro 
la variable Text que nos permite cambiar el texto que aparecerá en el campo o columna  }
end;
Desde luego para hacer uso del evento OnGetText lo primero que tendriamos que hacer es agregar nuestro campo en cuestion(CampoX) como campo persistente en el Dataset(Query o Table) que trae los datos de la base de dato..
Ésta solucion evitará estar modificando los datos en la base de datos, ya que como te han mencionado anteriormente si pones al Dataset en estado de Edicion (Data.Edit; ) se corre el riesgo de modificar los datos en la base de dato, y lo que yo veo es que solo se necesita mostrar los datos encriptado , pero que en la base de datos queden intactos , es decir que no se modifiquen..
Espero que te sea de ayuda.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 04-10-2010 a las 22:07:16.
Responder Con Cita
  #2  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
Cita:
Desde luego para hacer uso del evento OnGetText lo primero que tendriamos que hacer es agregar nuestro campo en cuestion(CampoX) como campo persistente en el Dataset(Query o Table) que trae los datos de la base de dato.
elproblema con esto es que la entrada del programa es un archivo en xml, el cual tiene 3 campos basicos
1.el script a ejecutar
1.1 con el nombre de la conexion que utilizara
1.2 con el nombre del path donde se guardara
1.3 el campo que se desea encryptar
2. Laconexion a utilizar
3. el tipo de archivo en que se guardara la informacion del scrip (elformato,el separador,etc)

osea se ejecutan varios scripts en tiempo de ejecucion, cada cual se conecta con el usuario,pass,y la tabla que se desea, y guarda el resultado segun el propio XML lo establesca para cada caso


por lo tanto no existe un campo persistente al caul pueda asignarle el evento OnGetText...

el metodo de encriptar, me es dado por un provedor, por lo que solo puedo hacer referencia al mismo enviando un string, y reciviendo el string encriptado....No puedo encriptar a nivel de base de Datos...

que puedo hacer?
Gracias a todos por sus comentarios...
Responder Con Cita
  #3  
Antiguo 04-10-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Question Pregunto

Cita:
Empezado por Wbarrantes Ver Mensaje
...No puedo encriptar a nivel de base de Datos...

que puedo hacer?
Gracias a todos por sus comentarios...
Pero de qué manera entonces asignas los datos al DBGrid?
Cómo lees y guardas los datos del archivo XML al DBGrid?
Supongo que éstas utilizando algun DataSet para hacerlo... es así o no?
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #4  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
ok despues de cargada la conexion (el user ,pass,database,etc...) ejecuto el script que leo del archivo XML:

Código Delphi [-]
 
  try
          begin
            DataModule1.ClientDataSet1.Active := false;
            DataModule1.SQLQueryEvertec1.DBExecute(Script);
            DataModule1.ClientDataSet1.Active := true;
          end;


posteriormente conecto el data source, con lo que la informacion me queda ligada al DBgrid
Código Delphi [-]
 
DBGrid1.DataSource := DataModule1.DataSource1;

con esto en marcha, procedo a recorrer el dataset, para encriptar el campo que deseo(que es un valor que me viene dado en el XML de configuracion de la aplicacion)...


Código Delphi [-]
 

procedure TForm1.Button2Click(Sender: TObject);
var
 i : integer;
  archivo : TStringList;
  Data : TDataSet;
begin
  Archivo:=TStringList.Create;
  Data:=DBGRID1.DataSource.DataSet;
  Data.First;
    while not(Data.eof) do
     begin
       for i := 0 to dbgrid1.Columns.Count-1 do
        begin
             if DBGrid1.Columns[i].FieldName=edit1.Text then
             BEGIN
              DATA.Edit;
              Data.FieldByName(DBGrid1.Columns[i].FieldName).asString:= Encrypt(Data.FieldByName(DBGrid1.Columns[i].FieldName).asString);
             END
       end;

        data.Next;
      end;

end;

Nota: el edit1.Text contiene elnombre de la columna que deseo encriptar, esto para efectos de pruebas de funcionamiento, de momento...
Responder Con Cita
  #5  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
Ayuda!!!!

este ultimo codigo
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);

funciona a la perfeccion pero solo cuando el resultado del script no tiene espacios vacios...
de ser asi, cuando aplica la sentencia
Data.next;
me envia el mensaje de error descrito anteriormente...

alguna idea al respecto? como podria validar este problema, o es acaso que recorro mal el data source?
Responder Con Cita
  #6  
Antiguo 04-10-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Arrow

Pues entonces estás haciendo uso de un dataset, ya decía yo y parece ser que no me entendiste sobre el uso del evento OnGetText,
Todo sabemos que en Delphi se puede asignar un evento tanto en tiempo de diseño como en tiempo de Ejecucion, en éste caso podrías asignar el evento OnGetText en tiempo de Ejecucion de la siguiente manera:
Primeramente debo implementar un Procedimiento o funcion, segun sea el caso,con cualquier nombre, pero que tenga los mismo parámetros que tiene nuestro evento que queremos asignarle: Por ejemplo el evento OnGetText tiene como declaracion y parametro en mi caso:
Código Delphi [-]
procedure ZTable1CampoXGetText(Sender: TField; var Text: String;DisplayText: Boolean);
Entonces como todo evento en delphi es un Puntero a un Procedimiento o funcion,segun sea el caso; lo que se puede hacer es declarar nuestro propio Manejador de evento en este caso puedo creame un Procedimiento de ésta forma:
Código Delphi [-]
 Procedure Cambiar_Vista_de_Columna(Objeto: TField; var Texto: String; MostrarTexto: Boolean);
Si observamos la declaracion del procedimeinto "Cambiar_Vista_de_Columna" tiene la misma cantidad de parámetros y los mismos parametros que el evento OnGetText y tiene que ser así:
Ahora vamos a su implementacion:
Código Delphi [-]
procedure TForm1.Cambiar_Vista_de_Columna(Objeto: TField; var Texto: String; MostrarTexto: Boolean);
begin
   Texto:=Encryptar(Texto);//Aquí cambio el valor de mi varible texto por el valor cifrado 
end;
Ahora para asignarlo en tiempo de ejecucion sencillamente podemos hacerlo de la siguiente manera:

Código Delphi [-]
DBGrid1.DataSource.DataSet.Fields[3].OnGetText:=Cambiar_Vista_de_Columna;
Lo que estamos haciendo en la anterior linea de código es hacer que el puntero del evento OnGetText del cuarto campo de nuestro DataSet, apunte a la primer direccion de memoria del nuestro procedure "Cambiar_Vista_de_Columna", de esa manera tiene una direccion de memoria válida con lo cual Delphi ejecutará las lineas de código de nuestro procedimiento; es lo que comunmente se llama "Asignacion dinámica de Eventos", ésta linea la puedes poner justo antes de ejecutar el Script o sentencia SQL o simplemnete usar el evento OnCreate del formulario; por supuesto que tambien puedo anular la ejecucion del evento(en éste caso OnGetText) en el momento que yo quiera,con tan solo hacer:
Código Delphi [-]
DBGrid1.DataSource.DataSet.Fields[3].OnGetText:=Nil;// 
No sé si me he dejado entender, pero creo que con solo hacer eso puedes solucionar tu problema, sin estar recorriendo tu dataset, así como lo haces, cosa que lo veo no muy práctica ni óptima en éste caso.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 04-10-2010 a las 23:57:13.
Responder Con Cita
  #7  
Antiguo 05-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
Genial

solo una ultima modificacion a tu codigo, por aquello que alguien tenga algun problema parecido a futuro....


Código Delphi [-]
 
  procedure TForm1.Cambiar_Vista_de_Columna(Objeto: TField; var Texto: String; MostrarTexto: Boolean);
begin
   Texto:= Objeto.AsString;
   Texto:=Encryptar(Texto);//Aquí cambio el valor de mi varible texto por el valor cifrado
end;


y pues el resultado es mejor de esta manera, pues no tengo que recorrerlo, por lo que si me parece mas eficiente...


y por ultimo un refresh para que el cambio sea visible imediato...

Código Delphi [-]
 
DBGrid1.DataSource.DataSet.Fields[1].OnGetText:=Cambiar_Vista_de_Columna;
DBGrid1.Refresh;
Responder Con Cita
  #8  
Antiguo 05-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
Muchas Gracias

Y pos de verdad muchisimas gracias a todos los que sacaron su ratito, para ayudarme... de verdad muy agradecido y si pasan por CR, pues los invito a una imperial... jejejeje
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
Error de Edicion con DBGrid chipcrazy Varios 1 06-11-2008 12:40:51
Edición de un DBGRID luxus Conexión con bases de datos 1 13-02-2007 11:34:26
DBGrid. Contenido de celda en edicion ManelC Varios 2 06-07-2006 23:01:18
Edicion DBGrid Caro Conexión con bases de datos 2 09-06-2006 18:02:26
DBGRID detectar fin de edicion de campo andrestsas Tablas planas 2 12-08-2003 17:11:02


La franja horaria es GMT +2. Ahora son las 03:34:44.


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