Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-09-2006
gesDelf gesDelf is offline
Miembro
 
Registrado: sep 2006
Posts: 18
Poder: 0
gesDelf Va por buen camino
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.

Última edición por gesDelf fecha: 09-09-2006 a las 12:27:48.
Responder Con Cita
  #2  
Antiguo 09-09-2006
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
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']
Responder Con Cita
  #3  
Antiguo 09-09-2006
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Wink 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
Responder Con Cita
  #4  
Antiguo 09-09-2006
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Smile

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
Saludos
Responder Con Cita
  #5  
Antiguo 09-09-2006
gesDelf gesDelf is offline
Miembro
 
Registrado: sep 2006
Posts: 18
Poder: 0
gesDelf Va por buen camino
Muchisimas gracias por esta inestimable ayuda :-) Me habeis sido de gran ayuda.

Espero ser tambien util en futuros posts para los foreros :-)
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
Como se puede programar directamente??? Antuan Varios 10 04-08-2005 08:04:38
Como Imprimir directamente en el Puerto de la Impresora en Red???? AGAG4 Varios 0 08-03-2005 00:19:23
Como lleno una ttable con dos tablas de paradox kokoyweb Tablas planas 1 27-08-2004 09:38:54
¿Como se actualiza un campo de una tabla a partir de las columnas de otra? salvica SQL 12 09-07-2004 01:56:10


La franja horaria es GMT +2. Ahora son las 21:05:57.


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