Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2015
Lenny Lenny is offline
Miembro
 
Registrado: jun 2007
Posts: 161
Poder: 17
Lenny Va por buen camino
Exclamation StringGrid Concatenar Celdas

Estimados, tengo una pequeño problema en un proyecto en el cual debo crear un frontend para escritorio de una sistema web en el cual uno de los principales requisitos es no modificar la estructura de la BD.
Hasta el momento todo ok pero me tope con el siguiente problema:

Las BD tienen los nombres de los usuarios/clientes, apellido paterno y materno guardados en distintos campos y en la aplicación web cuando se muestran los usuarios aparecen en la columna "nombres" (que solo tiene el o los nombres en la BD) con nombre y apellidos concatenados, necesitan que se vea igual en la versión de escritorio.

Generalmente utilizo este código en el evento StringGrid1DrawColumnCell para hacer algo similar en el mismo sistema (funciona perfecto):

Código Delphi [-]
begin
  if (Sender as TStringGrid).Cells[3, Row] = '0' then
  begin
    (Sender as TStringGrid).Cells[3, Row] := 'No';
    end
    else
  if (Sender as TStringGrid).Cells[3, Row] = '1' then
  begin
    (Sender as TStringGrid).Cells[3, Row] := 'Si';
end;

He tratado de cambiar el código para que me permita poder cambiar la celda nombre por la concatenación de Nombre, apellido Paterno y Materno y no logro hacerlo, de antemano agradezco cualquier ayuda, quedo atento a sus comentarios, saludos.

Utilizo XE7, MySQL, Firemonkey, Query y StringGrid.

Última edición por Lenny fecha: 07-04-2015 a las 18:18:20.
Responder Con Cita
  #2  
Antiguo 07-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Lenny.

La verdad es que no sé si terminé de comprender claramente la situación... De lo que entendí, no veo que relación pueda tener el evento OnDrawColumnCell con lo que buscas hacer.
Si deseas mostrar la unión de nombre-apellido en una columna, podes hacerlo al momento de cargar el TStringGrid desde la tabla de tu bd.

Un ejemplo de lo que te digo con la tabla CLIENTS que trae Delphi de facto:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  SG: TStringGrid;
begin
  SG := StringGrid1;
  SG.FixedRows := 1;
  SG.RowCount  := 2;
  SG.ColCount  := 3;
  SG.ColWidths[2] := 200;
  SG.Rows[0].CommaText := 'FirstName,LastName,FullName';
  with Query1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FIRST_NAME, LAST_NAME,');
    SQL.Add('FIRST_NAME+'' ''+LAST_NAME AS FULL_NAME FROM CLIENTS');
    Open;
    while not Eof do
    begin
      SG.Cells[0,SG.RowCount-1] := FieldByName('FIRST_NAME').AsString;
      SG.Cells[1,SG.RowCount-1] := FieldByName('LAST_NAME').AsString;
      SG.Cells[2,SG.RowCount-1] := FieldByName('FULL_NAME').AsString;
      SG.RowCount:= SG.RowCount + 1;
      Next;
    end;
  end;
end;
Si deseas realizar la concatenación desde Delphi, reemplaza estas líneas:
Código Delphi [-]
...
    SQL.Text := 'SELECT FIRST_NAME, LAST_NAME FROM CLIENTS';
...

    SG.Cells[2,SG.RowCount-1] := FieldByName('FIRST_NAME').AsString + ' ' +
                                 FieldByName('LAST_NAME').AsString;
...

Resultado del ejemplo:



Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 07-04-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
O si usas algun componente Query para acceder a los datos, podes traerte el nombre completo de la BD

Ejemplo que yo uso en Firebird:

Código SQL [-]
SELECT P.*, (P.Apellido || '', '' || P.Nombre) AS NombreCompleto FROM Persons P

Por supuesto despues debes usar el "nuevo campo" 'NombreCompleto'

Código Delphi [-]
  ShowMessage(Query.FieldByName('NombreCompleto').AsString);

Deberias buscar como concatenar strings en MySQL, cada motor podria tener distinta sintaxis

Saludos
Responder Con Cita
  #4  
Antiguo 08-04-2015
Lenny Lenny is offline
Miembro
 
Registrado: jun 2007
Posts: 161
Poder: 17
Lenny Va por buen camino
Exclamation

Estimados, ninguno de los 2 ejemplos me sirvió, el de ecfisa con error y es por que estoy trabajando con Firemonkey, el de AgutinOrtu en teoría debería funcionar, lo edite según mis necesidades pero me lanza error preguntando por el primer registro "Field 'IDUSUARIO' not found" siendo que en ningún lado hago referencia a el.

Me explico mejor, necesito de una tabla llamada "usuario" concatenar las columnas "nombres", apellido "paterno" y "materno", todo esto en un StrinGrid, por que? por que el cliente tiene una sistema web (JAVA) y quiere un frontend para escritorio y quiere que al menos las ventanas que mas usan (en este caso usuarios) se vean como en la web, donde la columna "nombres" muestra el nombre completo del usuario.
El problema principal es que uno de los requisitos mas importantes es trabajar con la base de datos como esta, sin agregar, cambiar menos quitar algo de la BD lo cual dificulta un poco el proyecto.
¿Por que en el evento OnDrawColumnCell? En algún momento (como ahora) me toco cambiar los colores de ciertas celdas que cumplan X condición, con el tiempo necesite hacer lo mismo pero en ves de cambiar el color cambiar los textos si cumplían cierta condición (True / False), por ejemplo un checkbox que en ves de aparecer 0 / 1 aparezca Activado / Desactivado en el StrinGrid. Como modifique el mismo código que estaba en OnDrawColumnCell y me funciono lo seguí usando de esa manera (hasta ahora) y nunca he tenido problemas.
¿Por que StrinGrid y la petición? El cliente quiere ver todos los usuarios como en la web (en una lista) y Firemonkey solo tiene Grid y StringGrid.

Espero haber aclarado un poco mas mi problema, si necesitan mas detalles o explicar algo mas estaré pendiente, de antemano muchas gracias.

Última edición por Lenny fecha: 08-04-2015 a las 09:49:15.
Responder Con Cita
  #5  
Antiguo 08-04-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
El codigo de ecfisa te genera un error? Cual es?

Si te sale en algun lado que no encuentra un campo es porque "no se lo estas dando"

Estas usando LiveBindings?
Responder Con Cita
  #6  
Antiguo 08-04-2015
Lenny Lenny is offline
Miembro
 
Registrado: jun 2007
Posts: 161
Poder: 17
Lenny Va por buen camino
Exclamation

Como comente antes utilizo Firemonkey, en VCL funciona perfecto por eso el error, me a pasado con varios códigos que tuve que rehacer pero en este caso simplemente el componente StringGrid no soporta ciertas características que vienen en el código, saludos y gracias.

PD: si, estoy usando LiveBindings (Firemonkey).
Responder Con Cita
  #7  
Antiguo 08-04-2015
Lenny Lenny is offline
Miembro
 
Registrado: jun 2007
Posts: 161
Poder: 17
Lenny Va por buen camino
Talking Solucionado

estimados, muchísimas gracias por la ayuda, a pura prueba y error y con lo dicho ya lo solucione:

Código Delphi [-]
procedure TUsuarios.StringGrid1DrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
  const Row: Integer; const Value: TValue; const State: TGridDrawStates);
begin
      if (Sender as TStringGrid).Cells[3, Row] = 'Fals' then
  begin
    (Sender as TStringGrid).Cells[3, Row] := 'No';
    end
    else
  if (Sender as TStringGrid).Cells[3, Row] = 'True' then
  begin
    (Sender as TStringGrid).Cells[3, Row] := 'Si';
  end;
(Sender as TStringGrid).Cells[2, Row] := (Sender as TStringGrid).Cells[1, Row] + ' ' + (Sender as TStringGrid).Cells[6, Row];
end;

los primeros 2 IF cambian en el StringGrid los valores True / Fals por Si / NO (puede ser cualquier otro valor, Activado / Desactivado, etc.) y la ultima linea hace lo que necesito, cargar en el StrinGrid en la columna "Nombres" la concatenación del nombres y apellido del usuario cumpliendo con los requisitos de no tocar la estructura de la base de datos.

Solo me queda saber si existe una forma mas elegante y no tan artesanal de hacer esto, y donde mas aparte de DrawColumnCell puedo colocar el código, ya que no me sirve en el Form.Create por si se actualizan los datos.

Gracias por la ayuda y quedo atento a sus comentarios!.
Responder Con Cita
  #8  
Antiguo 08-04-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Creo que podes asignar dinámicamente a tu fuente de datos, en el campo Nombre, un manejador en el evento OnGetText

Por ejemplo defino esto en la sección private del form

Código Delphi [-]
procedure Grid_Turnos_Dia_DuracionOnGetText(Sender: TField; var Text: string; DisplayText: boolean);

La asignación dinámica

Código Delphi [-]
Dataset.FieldByName('Duracion').OnGetText := Grid_Turnos_Dia_DuracionOnGetText;

Y la implementación

Código Delphi [-]
procedure TTFMain.Grid_Turnos_Dia_DuracionOnGetText(Sender: TField; var Text: string; DisplayText: boolean);
begin
    if not(Sender.IsNull) then
    begin
        Sender.Alignment := taRightJustify;
        Text := FormatDateTime('HH:MM', Sender.Value);
    end;
end;

Luego con LiveBindigs te recomiendo revisar aca


El evento que usaste, OnDrawCell yo lo dejaría para manejar el aspecto visual del grid en si, es decir, fuente, color de fondo, etc

Última edición por AgustinOrtu fecha: 08-04-2015 a las 11:05:46.
Responder Con Cita
  #9  
Antiguo 08-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Lenny.

Debo reconocer que no leí (o se me pasó) "Firemonkey" al leer el mensaje
Cita:
Empezado por Lenny Ver Mensaje
...
Utilizo XE7, MySQL, Firemonkey, Query y StringGrid.
Muevo el tema a dicho foro.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Multiplicar 2 celdas de un stringgrid Elite237 OOP 3 11-11-2008 03:02:59
Pintar celdas StringGrid cacu OOP 4 24-10-2007 18:22:21
StringGrid + celdas Makiley Varios 4 01-02-2006 14:01:15
Combinar Celdas Stringgrid MITOPE Varios 0 21-04-2004 08:03:27
bloquear celdas en un stringgrid ciscu Gráficos 1 18-12-2003 19:34:50


La franja horaria es GMT +2. Ahora son las 11:05:10.


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