Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
Wbarrantes Va por buen camino
Edicion de un DBGRID

Buenas Tardes,
Al grano, estoy elaborando una aplicacion que ejecuta consultas SQL, y las exporta en un TXT,XML, CSV o lo que sea... en DELPHI 2010

los parametros de la conexion y las consultas varian siempre en tiempo de ejecucion, por lo que no tengo columnas fijas, en los resultados del DBGRID.

en algunas consultas que presento en el dbgrid, existen valores que deben ser encryptados(el nombre del valor a encryptar me es dado en un archivo de configuracion, que ya leo, llamemosle CAMPOX)

un ejemplo, del DBGRID
Nombre|Apellido1|Apellido2|CampoX|etc

a la columna campo X, debo aplicarle la encryptacion (campo por campo de esa columna)

Encryptar(CampoX:string);

entiendo que esta modificacion podria hacerse
Data:=DBGRID1.DataSource.DataSet;
Data.First;
while not(Data.eof) do
begin
// mi codigo
end

Pero en realidad, no encuentro como asignarle al campo que busco, el resultado de mi procedimiento de encryptacion...


Ayuda por favor...
Espero haber sido lo suficientemente claro


_______________________________________________________________
la verdad e buscado ya bastante rao enla pagina y no encuentro algo que me pueda ayudar, en algun tema relacionado, si existe algo parecido y no lo he encontrado ofresco mis disculpas...


gracias
correo: wesbarrantes en Gmail... por cualquier consulta del codigo
Responder Con Cita
  #2  
Antiguo 02-10-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Código Delphi [-]
while not(Data.eof) do
begin
  Data.FieldByName('CampoX').AsString := Encryptar(Data.FieldByName('CampoX').AsString);
  Data.Next;
end

// Saludos
Responder Con Cita
  #3  
Antiguo 02-10-2010
tcrews tcrews is offline
Registrado
 
Registrado: jun 2010
Posts: 4
Poder: 0
tcrews Va por buen camino
problemas

que propiedades deben habilitarse para poder hacer esto, pues a mi me da problemas al tratar de editar... problemas en el dataset
Responder Con Cita
  #4  
Antiguo 04-10-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En el código que puse, faltaría colocar un

Código Delphi [-]
Data.Edit;

antes de las otras dos sentencias. Pero si no es eso, deberás especificar más qué tipo de problemas tienes.

// Saludos
Responder Con Cita
  #5  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
Wbarrantes Va por buen camino
problemas al editar DBGRID,Field Value Required

Buenas...
tengo el siguiente codigo

Código Delphi [-]
 
procedure TForm1.Button2Click(Sender: TObject);
var
 i : integer;
  archivo : TStringList;
  Data : TDataSet;
 separator, linea:String;
begin
 // ENCRIPTAR(edit1.Text)  ;
   separator:=';';
  Archivo:=TStringList.Create;
  Data:=DBGRID1.DataSource.DataSet;
  Data.First;
    while not(Data.eof) do
     begin
        linea:='';
       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:= EncryptParameter(Data.FieldByName(DBGrid1.Columns[i].FieldName).asString);

             linea:=linea+EncryptParameter(Data.FieldByName(DBGrid1.Columns[i].FieldName).asString)+separator;
             END
             ELSE
             BEGIN
             linea:=linea+(Data.FieldByName(DBGrid1.Columns[i].FieldName).asString+separator);
             END;
        end;
        archivo.Add(linea);
        data.Next;
      end;
           archivo.SaveToFile('C:\pruebawes.txt') ;
end;

el codigo anterior encripta una columna por medio de un metodo llamado EncryptParameter, y gurada el resultado en un archivo de texto 'C:\pruebawes.txt' , pero tengo un gran problema a la hora de encryptar el valor en el dataset, ya lo he probado con diferentes tablas, y me funciona a la perfeccion con tablas que yo creo, aun cuando la base de datos no haya sido creada por mi... crei que podi tratarse de problemas de acceso de seguridad a la base de datos, pero dentro de una misma base de datos y con la misma conexion, me funciona sobre algunastablas,pero sobre otras no...

el mensaje que envia es:
Project XXX.exe raised exception class EDBClient with message 'Field Value Required'

me resulta bastante extra;o pues funciona con algunas tablas y con otras NO, dentro de una misma Base de Datos, con iguales tipos de datos...

si alguien pudiese darme una pista de lo que ocurre... le agradesco...
Responder Con Cita
  #6  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
Wbarrantes Va por buen camino
problemas

el mensaje que envia es:
Project XXX.exe raised exception class EDBClient with message 'Field Value Required'


pero solo genera este error dependiendo de la tabla a la que me conecto...

dentro de una misma base de datos no me da problemas con unas tablas, pero con otras si... el detalle es que los tipos de campo de las tablas es identico... y se supone tengo full acceso a toda la base de datos...
Responder Con Cita
  #7  
Antiguo 04-10-2010
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Y ese error ¿exáctamente sobre que línea se produce?

¿Estás seguro que las tablas siempre tienen valores en sus campos?



Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #8  
Antiguo 04-10-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Wbarrantes, he pegado los dos hilos que abriste para lo mismo. Porfavor, no abras más de un tema para lo mismo.

En cuanto a tu pregunta, el problema no parece estar en los campos encriptados sino en algún otro campo de tu tabla que necesita ser asignado un valor y no le estás dando ninguno.

// Saludos
Responder Con Cita
  #9  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
Wbarrantes Va por buen camino
disculpa

ok, Disculpa por haber abierto el otro hilo... te agradesco la correccion...


Cita:
Y ese error ¿exáctamente sobre que línea se produce?
el error se produce exatamente al ejecutar el DATA.NEXT;



Cita:
En cuanto a tu pregunta, el problema no parece estar en los campos encriptados sino en algún otro campo de tu tabla que necesita ser asignado un valor y no le estás dando ninguno.
en realidad no te entendi muy bien... elnombre de la columna ya viene dado y verifico que sea un valor existente, en todo caso con otras tablas no me pasa lo mismo, es como si fuese un problema privilegios del usuario, pero tampoco, por que ya intente con diferentes tablas dentro de la misma base de datos, con igual tipo de valores... y pos a veces si, y aveces no


existe alguna otra forma de editar el datasource?

digo algo asi como :

1.cargar la consulta de la base de datos,
2.desligarme por completo de la base de datos, pues no voy a actualizar ni modificar ningun campo de la misma, solo quiero modificar la informacion para su presentacion al usuario, no modificar la tabla... (de echo si pudiese convertir todo el data set a valor string o varchars,,, perfecto, pues debo encriptar cualquier valor, sin importar su tipo)
3. ejecuto mis procedimientos para recorrer el dataset y guardar lo que deseo...
Responder Con Cita
  #10  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
Wbarrantes Va por buen camino
Una Luz

Cita:
¿Estás seguro que las tablas siempre tienen valores en sus campos?
Le diste al clavo... la diferencia entre las tablas que sirven, y las que no sirven, es que unas estan completamente llenas

me explico...
si lo aplico sobre la tabla persona:
Nombre|Apellido1|Apellido2
wes123|ASDFEER|WESDSD
WAGNE|ASDAS|ADSDAd

funciona correctamente

pero si modifico el contenido de la tabla a:
Nombre|Apellido1|Apellido2
wes123| |WESDSD
WAGNE|ASDAS|ADSDAd

(dejo en blanco el apellido1 de wes123)
Ya no sirve


alguna sugerencia para resolver?
Responder Con Cita
  #11  
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: 17
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
  #12  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
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
  #13  
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: 17
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
  #14  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
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
  #15  
Antiguo 04-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
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
  #16  
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: 17
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
  #17  
Antiguo 05-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
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
  #18  
Antiguo 05-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
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
  #19  
Antiguo 06-10-2010
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 14
Wbarrantes Va por buen camino
muy pronto

creo que cante victoria demasiado pronto...

ahora tengo el siguiente problema...
cuando quiero actualizar una sola columna, no existe inconveniente, si encrypto 2 columnas tampoco, PERO SI QUIERO ENCRIPTAR UNA COLUMNA y a otra columna solo quiero cortarle un substring.. realiza parejo la funcion de cortar el substring para todas las columnas a las que ligue el
Código Delphi [-]
DBGrid1.DataSource.DataSet.Fields[1].OnGetText:=Cambiar_Vista_de_Columna;

ya no se que hacer mas... por 2vias distintas estoy con 2 pegas diferentes

la que me queda la duda es la del field value required cuando una columna de la tabla esta vacia....

pero cualquiera de las 2 alternativas, que aroje un poco de luz... perfecto
Responder Con Cita
  #20  
Antiguo 06-10-2010
Avatar de JoseAntonio
JoseAntonio JoseAntonio is offline
Miembro
 
Registrado: abr 2006
Ubicación: Lima - Ciudad de los Reyes.
Posts: 87
Poder: 19
JoseAntonio Va por buen camino
por que no usas sql

dependiendo de los componentes que estas usando para datos, deberias usar algo asi como un tquery

y generar tu update a mano ejemplo

SQLStr := 'UPDATE MITABLA SET CAMPOAACTUALIZAR = ' + MiMetodoEncriptador(parametro) + ' where clave = ' + .... etc
EjecutarSQL(SQLStr); // debes implementar esa funcion en tu aplicacion;

modificas los datos y luego refrescas tus componentes de datos para que se refresquen tus cambios, asi te evitas tantas complicaciones con datasources datasets eventos y otras yerbas, suerte :-)
__________________
nuestro carácter está reflejado en cada línea de código que escribimos.
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 05:31:53.


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