| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Dom 10 Ago, 2008 10:22 am Asunto: Mostrar datos guardados en dos tablas en un TstringGrid |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Lun 11 Ago, 2008 1:06 am Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Lun 11 Ago, 2008 9:35 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 11 Ago, 2008 1:34 pm Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Lun 11 Ago, 2008 2:45 pm Asunto: |
|
|
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 . _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Lun 11 Ago, 2008 3:57 pm Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Lun 11 Ago, 2008 4:01 pm Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Lun 11 Ago, 2008 5:43 pm Asunto: El error esta en el indice |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Lun 11 Ago, 2008 7:37 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 12 Ago, 2008 7:30 am Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Mar 12 Ago, 2008 11:44 am Asunto: |
|
|
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 |
|
 |
|