Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   gbGrid: ¿como lleno columnas directamente que no vengan de un campo del SQL? (https://www.clubdelphi.com/foros/showthread.php?t=35410)

gesDelf 09-09-2006 12:22:38

gbGrid: ¿como lleno columnas directamente que no vengan de un campo del SQL?
 
Hola!

Buenas, por trabajo estoy aprendiendo Delphi (que no había tocado antes) a marchas forzadas. Más o menos me estoy saliendo airoso, pero ahora tengo un problema que no sé como resolver.

Tengo un dbGrid, en el que meto una sentencia SELECT como la siguiente:

SELECT nombreJugador JUGADOR_NOMBRE, apellidosJugador JUGADOR_APELLIDOS, funcion_identificador (:codigo) IDENTIFICADOR
FROM TABLA_JUGADOR
WHERE ID_JUGADOR = :dni_jugador;

(es un ejemplo, la que tengo que hacer es extremadamente larga y he querido simplicarla para ilustrar mi problema).

Bien, tengo esta función en mi base de datos: funcion_identicador (no la he hecho yo, me viene impuesta, por lo que no tengo que tocarla y tengo que usar ese SELECT anterior),
que como habeis visto está en la sentencia SQL, y que devuelve esta cadena:
ttt-nnnn-aaaa
(son realmente 3 valores dentro de un VARCHAR que retorna la funcion: por ejemplo se devolvería algo así "111-2323-3444", por ejemplo VALOR_T, VALOR_N y VALOR_A)

Ok, yo ya tengo un dbGrid que tiene las columnas con JUGADOR_NOMBRE, JUGADOR_APELLIDOS e IDENTIFICADOR. Que me sale perfecto así, porque es ejecutar el Query y actualizarse la tabla.

Hasta ahí perfecto, pero ahora me piden que en lugar de salirme 1 columna "IDENTIFICADOR", me salgan 3 columnas: VALOR_T, VALOR_N y VALOR_A. Y aquí no sé como hacerlo, porque los campos se llenaban solos simplemente diciendo a cada columna del dbGrid que campo devuelto por el SELECT se corresponde, ahora tengo que crear 3 columnas que no pertenecen a 1 campo devuelto del SELECT cada una, sino que tengo que coger 1 de esos campos, dividirlo y meter el valor en esa columna.

No sé como hacer para dejar 3 columnas en blanco y recorrer la tabla dbGrid poniendo los valores a cada una después de obtener cada una de las columnas (es decir de haber cogido la cadena y separar los 3 valores).
No sé si me he explicado. Me urge saberlo. Gracias!!!

(uso la versión 5.0; no puedo usar otra es la que tenemos en el trabajo. La BD es Oracle).

P.D.: Soy nuevo en este foro. Espero poder participar activamente, ayudando con la experiencia que vaya adquiriendo (ya que me esperan muchas horas delante del Delphi jajaja) e intercambiando ideas. Saludos.

luisgutierrezb 09-09-2006 15:49:05

bueno, aqui veo 2 opciones tal vez haya mas...
1.- en la sentencia select puedes usar:
Select ... ( substring(1,3 funcion_identificador (:codigo)) ) VALOR_T,
( substring(5,4 funcion_identificador (:codigo)) ) VALOR_N,
( substring(10,4 funcion_identificador (:codigo)) ) VALOR_A
From ....
solo busca en tu motor de bases de datos el substring o la funcion equivalente a veces se llama diferente.
2.- usa campos calculados, click derecho sobre el query en delphi luego en fields, despues boton derecho sobre la ventanita y ponle en add all fields, despues otra vez boton derecho en new, y creas el campo, de tipo string y que se llame Valor_T, Valor_N y Valor_A por ejemplo, despues en el evento OnCalcFields le pones:
Dataset['Valor_T'] := Copy(1,3,Dataset['Identificador']
Dataset['Valor_N'] := Copy(5,4,Dataset['Identificador']
Dataset['Valor_A'] := Copy(10,4,Dataset['Identificador']

Ruben_Cu 09-09-2006 16:07:21

Campos autocalculados
 
Hola gesDelf, trataré de guiarte un poco en cuanto a la forma en que puedes lograr los que quieres, mas o menos esta es la secuencia que debes seguir:
1.- Necesitas crear tres campos autocalculados, para ello seleccionas la componente TDataSet(Tquery si usas BDE) asociada la DBGrid y con el botón derecho abres el editor de campos el cual debe tener las columnas con los campos que vas a mostrar DBGrid, si esto lo tienes en blanco adiciona entonces los campos de la tabla que quieres mostrar, p.e. JUGADOR_NOMBRE, JUGADOR_APELLIDOS, etc.
2.- Ahora debes crear tres nuevos campos. Sobre el mismo 'field editor' seleccionas 'New Field' en el formulario le das un nombre p.e. 'VALOR_T'.
3.- Repites la operación para los otros dos que necesitas y ya tienes creados tus tres campos 'Autocalculados'.
4.- Ahora debemos preparar el evento que se encargará de realizar el proceso de cálculo para cada registro, entonces en el inspector de objetos en la pestaña de eventos haz doble clic sobre 'OnCalcFields'.
5.- Dentro del procedimiento debes colocar algo como esto:
Código Delphi [-]
procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
      with Query1 do begin
        FieldByName('VALOR_T').AsString:= Copy(FieldByName('ID_JUGADOR').AsString,0,3);
        .
        .
        end;
end;
6.- Claro que debes completar las dos declaraciones que faltan para los otros dos campos, solo es repetir lo mismo cambiando nombre del campo calculado y aplicando correctamente la función Copy.
Esto siempre funciona, si no me expliqué bien me preguntas y si tienes algún problema con esto no dudes en preguntar que siempre alguién aquí te ayudará, porque al fin y al cabo todos empezamos un día
Saludos

Ruben_Cu 09-09-2006 16:25:35

Bueno ya me imaginaba que otro compañero estaba escribiendo una respuesta cuando empecé a escribir la mía;) . Si no me expliqué bien tienes otra explicación con dos variantes, buscando utilidad a mi respuesta tambien puedes ver dos formas diferente de acceder a los campos de una TDataSet la primera usando FieldValues, muy útil ya que es utilizable para cualquier tipo de campo lo que le da mayor flexibilidad en el uso y el FieldByName que requiere definir el tipo de campo, en este caso sabemos que es un 'string' al ser el campo VARCHAR.
Pues nada seguimos lo importante es participar ojala siempre una pregunta cuente con varias respuestas al mismo tiempo eso es sinergia y ayuda a que todos aprendamos mas:D
Saludos

gesDelf 09-09-2006 21:12:13

Muchisimas gracias por esta inestimable ayuda :-) Me habeis sido de gran ayuda.

Espero ser tambien util en futuros posts para los foreros :-)


La franja horaria es GMT +2. Ahora son las 21:35:26.

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