Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Mostrar datos guardados en dos tablas en un TstringGrid

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Mostrar datos guardados en dos tablas en un TstringGrid Responder citando

Pues tengo el siguiente problema, tengo varios presupuestos guardados cada uno de ellos en dos tablas (PARADOX7), en la primera guarda el presupuesto con su código y en la segunda guardo el detalle del mismo. El problema viene a la hora de mostrarlo en un formulario para modificarlo, el detalle del presupuesto debe mostrarse en un TStringGrid previamente definido, no sé como hacerlo.
Código:

TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);
editar_presupuesto->Caption = "Modificar presupuesto";
Tdetallepresupuestos->First();
for (int i=0;i<=Tdetallepresupuestos->RecordCount;i++){
  if (TdetallepresupuestosCodigopresupuesto->Value == TpresupuestosCodigo->Value){
  editar_presupuesto->griddetalle->Cells[1][i+1] =
}
}
editar_presupuesto->ShowModal();
delete editar_presupuesto;

Se que me falta algo pero ahora mismo no caigo.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

lo que te falta llanamente es BRINCAR AL SIGUIENTE REGISTRO, ya que siempre "te quedas" en el primer registro

Código:

TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);
editar_presupuesto->Caption = "Modificar presupuesto";
Tdetallepresupuestos->First();
for (int i=0;i<Tdetallepresupuestos>RecordCount;i++)
 {
  if (TdetallepresupuestosCodigopresupuesto->Value == TpresupuestosCodigo->Value){
  editar_presupuesto->griddetalle->Cells[1][i+1] =TpresupuestosCodigo->Value;
}
 //--------------Aqui!
Tdetallepresupuestos->Next() // Pasa al siguiente registro..esto de falta

}
editar_presupuesto->ShowModal();
delete editar_presupuesto;


Un poquito mejorado
Código:


// asumiendo que el enlace master-detail lo definas en las
/ propiedades de TTables

TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);

editar_presupuesto->Caption = "Modificar presupuesto";

Tdetallepresupuestos->First();
while (!Tdetallepresupuestos->Eof) // Mientras no sea fin de archivo
  { 
  editar_presupuesto->griddetalle->Cells[1][i+1]=TpresupuestosCodigo->Value;
  Tdetallepresupuestos->Next(); 
  }

editar_presupuesto->ShowModal();
delete editar_presupuesto;


la mejor opcion usando Query y un dbgrid


Código:


TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);
editar_presupuesto->Caption = "Modificar presupuesto";

editar_presupuesto->qryDetalle->Close();
editar_presupuesto->qryDetalle->SQL->Add("SELECT * FROM master WHERE id="+IntToStr(TmasterPresupuesto->FieldName("codigopresupuesto")->AsInteger));
//asumiendo que es integer
editar_presupuesto->qryDetalle->Open(); // Hacer consulta

//gridDetalle,  conectado a un DataSource apuntando al query
editar_presupuesto->ShowModal();

delete editar_presupuesto;

_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Gracias Touchsoftwares por tu interés, pero el mejor código que me sirve es el primero y lo he intentado añadiendo el Next que me dices pero sólo me añade un registro cuando hay varios:
Código:

TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);
editar_presupuesto->Caption = "Modificar presupuesto";
Tdetallepresupuestos->First();
for (int i=0;i<Tdetallepresupuestos->RecordCount;i++){
  if (TdetallepresupuestosCodigopresupuesto->Value == TpresupuestosCodigo->Value){
  editar_presupuesto->griddetalle->Cells[1][i+1] = TdetallepresupuestosTrabajorealizado->Text;
  editar_presupuesto->griddetalle->Cells[2][i+1] = TdetallepresupuestosCuantoporhora->Text;
  editar_presupuesto->griddetalle->Cells[3][i+1] = Tdetallepresupuestoshorasrealizadas->Text;
  editar_presupuesto->griddetalle->Cells[4][i+1] = TdetallepresupuestosTotal->Text;
}
Tdetallepresupuestos->Next();
}
editar_presupuesto->ShowModal();
delete editar_presupuesto;

¿Alguna otra sugerencia?
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Por lo que te leo, tienes dos tablas. ¿Has probado algo así? Necesitaría un TQuery y supongo que el código es de tipo string. Como no sé como has llamado a las tablas supongo que Table1 es donde guardas el resumen del presupuesto con su código y Table2 la que guarda los detalles.
Código:
int nRow;
Table1->First();
StringGrid1->RowCount = Table2->RecordCount;
Query->Close();
Query->SQL->Text = "SELECT * FROM 'Table2.db' WHERE Codigo = :Codigo";

nRow = 0;
while (!Table1->Eof)
{
     Query->Close();
     Query->ParamByName("Codigo")->AsString = Table->FieldByName("Codigo")->AsString;
     Query->Open();
     StringGrid->Cells[0][nRow] = Table1->FieldByName("Codigo")->AsString;
     while (!Query->Eof)
     {
          StringGrid1->Cells[1][nRow] = Query->FieldByName("Detalle")->Value;
          nRow ++;
          Query->Next();
     }
     Table1->Next();
}

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Muchas gracias Angel por tu interés pero tiene que haber alguna forma de hacerlo sin querys y mucho mejor sin parámetros.
Cita:
Query->SQL->Text = "SELECT * FROM 'Table2.db' WHERE Codigo = :Codigo";

Las tablas que uso son Tpresupuestos y Tdetallepresupuestos, en la primera es donde está el resúmen del presupuesto y en la segunda donde guardo el detalle. Sé que tiene que haber alguna forma de hacerlo porque lo he hecho antes pero hace tanto tiempo que no me acuerdo Embarassed .
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Tugui, si usas una relación master-detalles no es necesario el query solo tendrías que mover de tupla master para tener acotado el conjunto detalle, de todas formas necesitarías un Table master y un Table detalle para poder acceder al contenido.
saludos Tor
_________________
Un experto es aquel que ya ha cometido todos los errores posibles en una materia muy concreta.
(Niels Bohr)
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Gracias Tor pero te repito que con un TQuery se puede establecer la relación sin configurar nada de maestro y detalle.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: El error esta en el indice Responder citando

BUeno , si quieres seguir manejando como si fuera xbase, ok el error esta en el indice,es decir..si son 100 registros y los campos que cumplen la condicion estan enla posicion 50,60 y 70 en esas filas del grid se guardan, usa showmessages para qeu ver que pasa y luego los eliminas
Código:

TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);
editar_presupuesto->Caption = "Modificar presupuesto";
Tdetallepresupuestos->First();
int iIndice=0;
for (int i=0;i<Tdetallepresupuestos>RecordCount;i++)
{
   if (TdetallepresupuestosCodigopresupuesto->Value ==  TpresupuestosCodigo->Value){
 
  editar_presupuesto->griddetalle->Cells[1][iIndice+1] = TdetallepresupuestosTrabajorealizado->Text;
  editar_presupuesto->griddetalle->Cells[2][iIndice+1] = TdetallepresupuestosCuantoporhora->Text;
  editar_presupuesto->griddetalle->Cells[3][iIndice+1] = Tdetallepresupuestoshorasrealizadas->Text;
  editar_presupuesto->griddetalle->Cells[4][iIndice+1] = TdetallepresupuestosTotal->Text;
 Indice=iIndice+1; // Indice++ si prefieres
}
Tdetallepresupuestos->Next();
}
editar_presupuesto->ShowModal();
delete editar_presupuesto;


Pero sigo insistiendo no es la manera eficiente de hacerlo,cunado la tablad etalle tenga 2000 tegistros va a tardar varios segundos en cargar los datos

o una opcion intermedia

Código:


TfrmPresupuestos *editar_presupuesto = new TfrmPresupuestos(this);
editar_presupuesto->Caption = "Modificar presupuesto";
// Usa un filtro y ya no tienes problemas con el indice
Tdetallepresupuestos->Filter="Codigopresupuesto="+IntToStr(TpresupuestosCodigo->Value);
Tdetallepresupuestos->Filtered=true;
Tdetallepresupuestos->First();
for (int i=0;i<Tdetallepresupuestos>RecordCount;i++){
  editar_presupuesto->griddetalle->Cells[1][i+1] = TdetallepresupuestosTrabajorealizado->Text;
  editar_presupuesto->griddetalle->Cells[2][i+1] = TdetallepresupuestosCuantoporhora->Text;
  editar_presupuesto->griddetalle->Cells[3][i+1] = Tdetallepresupuestoshorasrealizadas->Text;
  editar_presupuesto->griddetalle->Cells[4][i+1] = TdetallepresupuestosTotal->Text;

Tdetallepresupuestos->Next();
}
editar_presupuesto->ShowModal();
delete editar_presupuesto;

_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Gracias otra vez Touchsoftwares, pero en el grid me sigue saliendo un solo registro. Seguiré tu consejo y empezaré con los ShowMessage() a ver si doy con la solución.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

A ver si te vales este query:
Código:
SELECT A.Codigo, B.Detalle
FROM Tpresupuestos A, Tdetallepresupuestos B
WHERE A.Codigo = B.Codigo
ORDER BY Codigo

Lo he probado con dos tabasl que uso yo en casa, una guarda los datos de los discos de música (título, discográfica,etc.) y otra las pistas del disco y con un query parecido (SELECT A.Album, B.Cancion FROM Discos A, Pistas B WHERE A.Registro = B.Disco) me saca algo así (a la izquierda el título del álbum y a la derecha el de la pista):
    A Chorus Line  |  At the Ballet
    A Chorus Line  |  Dance: Ten
    A Chorus Line  |  I Can Do That
    A Chorus Line  |  Montage Part 1: Hello Twelve, Hello Thirteen, Hello Love
    A Chorus Line  |  Montage Part 2: Mother
    A Chorus Line  |  Montage Part 3: Gimme the Ball
    A Chorus Line  |  Nothing
    A Chorus Line  |  One
    A Chorus Line  |  One (reprise) - Finale
    A Chorus Line  |  Opening: I Hope I Get It
    A Chorus Line  |  Sing!
    A Chorus Line  |  The Music and the Mirror
    A Chorus Line  |  What I Did for Love
    A Knights Tale  |  Crazy on you
    A Knights Tale  |  Eye conqueror
    A Knights Tale  |  Further on up the road
    A Knights Tale  |  Get ready
    A Knights Tale  |  Golden years
    A Knights Tale  |  I want to take you higher
    A Knights Tale  |  Low ryder
    A Knights Tale  |  One of your own
    A Knights Tale  |  Piedes
    A Knights Tale  |  Ramble on
    A Knights Tale  |  Takin' care of business
    A Knights Tale  |  The boys are back in town
    A Knights Tale  |  We are the champions
    A Knights Tale  |  We will rock you

Y para llenar el StringGrid, si quieres que quede bonito, puedes hacerlo así:
Código:
AnsiString cPresupuesto = "";
int nRow = 0;
Query->Open();
StringGrid1->RowCount = Query-.>RecordCount;
while (!Query->Eof)
{
     if (Query->FieldByName("Codigo")->AsString != cPresupuesto)
     {
          StringGrid1->Cells[0][nRow] = Query->FieldByName("Codigo")->AsString;
          cPresupuesto = Query->FieldByName("Codigo")->AsString;
     }
     StringGris1->Cells[1][nRow] = Query->FieldByName("Detalle")->Value;
     nRow ++;
     Query->Next();
}

Con ese código debería presentarte el código del detalle en el primer registro de cada presupuesto y en el resto tendría que dejar la columna en blanco.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Ya lo he arreglado, era el RowCount del StringGrid como está creado sin filas hay que ponérselas también con el código:
Código:

editar_presupuesto->griddetalle->RowCount = Query_detallepresupuestos->RecordCount+1;

Problema arreglado. Gracias a todos por vuestro interés.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.