Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   TADOQuery, ClientDataSet y edición de campo NO persistente (https://www.clubdelphi.com/foros/showthread.php?t=78084)

Walterio 19-03-2012 14:56:23

TADOQuery, ClientDataSet y edición de campo NO persistente
 
Hola amigos...
Uso Delphi 6, un TAdoQuery, un TDataSetProvider y un TClientDataSet.
Esta es mi consulta SQL :

Código SQL [-]
sQuery := 'SELECT ' +
               QuotedStr('.') + ' as TAG,' +
               'st384.id384,' +                
               'st384.CCY384,'+
               'st384.NCY384,'+
               'st384.RES384,'+
               'st384.UFA384 '+
               'FROM st384';

Esto pasa a un ClientDataSet por medio de su provider y se muestra en un DbGrid sin problema.
Lo que me está pasando es que, estando en la grilla y apretando en la tecla espaciadora, el campo TAG debe cambiar de '.' a '' o viceversa.
El problema está que al intentar hacerlo, me sale un mensaje diciendo que el campo TAG no es editable.
Esto mismo lo tengo implementado en otro sistema, con la diferencia que en vez de ADOQuery utilizo tablas DBF (sin Provider), donde previamente copio la estructura de la tabla DBF en en ClientDataSet, alli le creo el campo TAG y después recorro la tabla DBF pasandole los datos al ClientDataSet.

Ya probé de cambiarle los valores de Providerflag al campo TAG, cosa de no tener alcance en el update de la query, pero tampoco funcionó (de este último "truco" no estoy muy convencido, pero quería probarlo).

Desde ya, agradezco toda ayuda, pista, truco o brujería que me pueda ayudas.

Saludos.

Casimiro Notevi 19-03-2012 15:07:54

No entiendo la sentencia, ¿ese sql de qué BD es?, nunca había visto el 'select .' (punto) en una sql de esa forma.

Walterio 19-03-2012 16:24:15

TADOQuery, ClientDataSet y edición de campo NO persistente
 
Hola Casimiro....
La BD es MySQL y el campo '.' As Tag es un campo que creo en la consulta (no es un campo persistente de la tabla de la BD) que me muestra en la grilla una columna con el dato '.'
Lo que necesito es que al presionar la barra espaciadora, el valor '.' pase a '' (vacio) o viceversa.Este dato lo necesito para mostrar como un registro "seleccionado" por el usuario, dependiendo del valor que tenga almacenado este campo('.'=Seleccionado, ''=NoSeleccionado).Como comenté antes, éste método lo utilizo con dbf y clientdataset sin provider y me funciona a la perfección.
De todas formas, estoy abierto a todas sugerencias de cómo hacer que desde la grilla de datos, el usuario "seleccione" un/unos registros para su posterior tratamiento, que es ese el propósito del tan mencionado campo.

Nuevamente, muchas gracias.

Casimiro Notevi 19-03-2012 17:31:23

Yo suelo usar 1 y 0 (cero), y saco un checkbox en el grid: 1 es marcado y 0 es desmarcado.
También puedes usar la opción múltiple selección de los grids para hacer eso.

Walterio 20-03-2012 13:25:08

TADOQuery, ClientDataSet y edición de campo NO persistente
 
Hola Casimiro...
Es justamente lo que necesito hacer, el tema es donde almacenar esos valores de 1 y 0 (tambien muestro un checkbox en el grid).Si al apretar la barra espaciadora, anteriormente cambiaba el valor del campo con "." o " " (mostrando el checkbox según corresponda), ahora obtengo el mensaje de que dicha columna no se puede editar.
Como te contaba anteriormente, ese valor (1 o 0) lo almacenaba en un campo creado en tiempo de ejecución del clientdataset cuando usaba tablas dbf, pero como ahora uso un TADOQuery mediante un DataSetProvider conectado al clientdataset, creo el campo desde la query con el famoso '.' (que seria un cero, "0").Lo del multiselect no lo probé, pero una vez me pasó con otro desarrollo que seleccionaba los registros usando multiselect, pero en cuanto movía la grilla hacia abajo o hacia arriba, se perdía esa selección (cosa muy rara).

Gracias nuevamente y saludos.

Casimiro Notevi 20-03-2012 13:43:03

Conozco poco los componentes ADO y me parece que nunca he usado un datasetprovider, así que por ahí no puede ayudar mucho.

Al González 21-03-2012 01:04:35

Hola Walterio.

En un caso como el tuyo, se acostumbra crear el campo adicional necesario sólo en la memoria del TClientDataSet. Eso lo consigues dando doble clic sobre el componente y eligiendo la opción "New field...", de la misma manera en que se crea un campo calculado común y corriente, pero con la diferencia de que en lugar de marcar la opción Calculated marques la opción InternalCalc.

Los campos InternalCalc se parecen a los campos calculados en que sólo existen en la memoria del conjunto de datos, sólo que, al igual que un campo de datos normal, el usuario puede editarlos. Vaya, podemos decir que son "campos de memoria capturables", como lo que precisamente buscabas inicialmente.

Espero te sirva.

Al González. :)

Walterio 20-04-2012 22:00:03

Hola Al González...
Muchas gracias por tu respuesta y mis disculpas por la tardanza en la mía, estaba trabajando con otra cosa y no quería responderte sin antes haber probado tu sugerencia.
Estuve haciendo unas pruebas muy grotescas y a grandes razgos, tu sugerencia sería la solución, pero ahora tengo otro problema.
Sé que en el foro encontré una vez la respuesta a lo que voy a preguntar ahora, pero sinceramente, no la puedo hubicar.
Antes aclaro lo que estoy usando :
Delphi 6, MySQL, ADOQuery, DataSetProvider y ClientDataset, conectados entre si.
El tema ahora es el siguiente:
Al agregar las columnas del tipo InternalCalc, desaparecen las columnas que habia creado anteriormente con el Query :

Código Delphi [-]sQuery := 'SELECT '+ 'id385, '+ 'CMC385,'+ 'DES385,'+ 'RES385,'+ 'UFA385 '+ 'FROM cc385'; TDBO.buscoReg(sQuery, qryMaster); with cdsMaster do begin Open; for i := 0 to Fields.Count - 1 do SetField(Fields[i], 'CC534'); // <-- aqui les doy formato a los campos de la query... First; End;


Y en el BeforeOpen del ClientDataSet agrego los campos InternalCalc :

Código Delphi [-]procedure TFrmGenericGrid.cdsMasterBeforeOpen(DataSet: TDataSet); var xSelected: TStringField; begin xSelected := TStringField.Create(Self); xSelected.Name := 'MasterTag'; xSelected.FieldKind := fkInternalCalc; xSelected.FieldName := 'Tag'; xSelected.Size := 2 ; xSelected.DataSet := cdsMaster; End;


Y cuando ejecuto el programa, sólo me aparece el campo TAG creado ultimamente.
Vuelvo a repetir, he visto por ahi que habia un pequeño truco para "revivir" los campos que agrega la Query y que aparezcan junto a mi campo calculado, pero no encuentro la forma.

Desde ya, agradezco infinitamente las ayudas, sugerencias y consejos recibidos.

Saludos.

Walterio 20-04-2012 22:01:21

Copio aqui nuevamente el mensaje anterior porque veo que salió mal formateado :
Hola Al González...
Muchas gracias por tu respuesta y mis disculpas por la tardanza en la mía, estaba trabajando con otra cosa y no quería responderte sin antes haber probado tu sugerencia.
Estuve haciendo unas pruebas muy grotescas y a grandes razgos, tu sugerencia sería la solución, pero ahora tengo otro problema.
Sé que en el foro encontré una vez la respuesta a lo que voy a preguntar ahora, pero sinceramente, no la puedo hubicar.
Antes aclaro lo que estoy usando :
Delphi 6, MySQL, ADOQuery, DataSetProvider y ClientDataset, conectados entre si.
El tema ahora es el siguiente:
Al agregar las columnas del tipo InternalCalc, desaparecen las columnas que habia creado anteriormente con el Query :

Código Delphi [-]
sQuery := 'SELECT '+                 
                'id385, '+                 
                'CMC385,'+                 
                'DES385,'+                 
                'RES385,'+                 
                'UFA385 '+               
              'FROM cc385';      
TDBO.buscoReg(sQuery, qryMaster);      
with cdsMaster do     
begin        
  Open;       
  for i := 0 to Fields.Count - 1 do SetField(Fields[i], 'CC534'); //  <-- aqui les doy formato a los campos de la query...         
  First;
End;

Y en el BeforeOpen del ClientDataSet agrego los campos InternalCalc :

Código Delphi [-]
procedure TFrmGenericGrid.cdsMasterBeforeOpen(DataSet: TDataSet); 
var xSelected: TStringField; 
begin   
  xSelected := TStringField.Create(Self);    
  xSelected.Name      := 'MasterTag';   
  xSelected.FieldKind := fkInternalCalc;   
  xSelected.FieldName := 'Tag';   
  xSelected.Size      := 2 ;   
  xSelected.DataSet   := cdsMaster; 
End;

Y cuando ejecuto el programa, sólo me aparece el campo TAG creado ultimamente.
Vuelvo a repetir, he visto por ahi que habia un pequeño truco para "revivir" los campos que agrega la Query y que aparezcan junto a mi campo calculado, pero no encuentro la forma.

Desde ya, agradezco infinitamente las ayudas, sugerencias y consejos recibidos.

Saludos.


La franja horaria es GMT +2. Ahora son las 16:46:27.

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