Cuando se actualiza el xBrowse con nuevos datos :bFooter no se refresca.
En el ejemplo que se adjunta, en el xbrowse HIJO el total del campo edad se queda congelado y no se refresca.
Este es enlace al prg y ejecutable del ejemplo: http://creafile.com/download/6d0b86bf28 ... 08a1b.html
Nota: Ejecutar primero la opción de Listbox y luego xBrowse, sino dará error.
Pego aquí el prg:
- Code: Select all Expand view RUN
#include "FiveWin.ch"
#include "Ord.ch"
#include "xbrowse.ch"
static oWnd
STATIC aSelePro
//----------------------------------------------------------------------------//
function Main()
CreaFicheros()
IndexaFicheros()
AbreFicheros()
DEFINE WINDOW oWnd FROM 1, 5 TO 20, 70 ;
MENU BuildMenu()
//
ACTIVATE WINDOW oWnd
return nil
//----------------------------------------------------------------------------//
function BuildMenu()
local oMenu
local oFirst, oSecond
MENU oMenu
MENUITEM "Prueba browse"
MENU
MENUITEM oFirst PROMPT "ListBox" ;
ACTION PruebaBrowse("L")
MENUITEM oSecond PROMPT "XBrowse";
ACTION PruebaBrowse("X")
ENDMENU
ENDMENU
return oMenu
//----------------------------------------------------------------------------//
******************************
static function CreaFicheros()
******************************
Local aDbf
IF !FILE("PADRE.DBF")
//
aDbf := {}
AADD(aDbf,{"Clave","C",1,0})
AADD(aDbf,{"Nombre","C",40,0})
DBCREATE("PADRE",aDbf)
USE PADRE
//
PADRE->(DbAppend())
REPLACE PADRE->Clave WITH "1"
REPLACE PADRE->Nombre WITH "PADRE 1"
//
PADRE->(DbAppend())
REPLACE PADRE->Clave WITH "2"
REPLACE PADRE->Nombre WITH "PADRE 2"
//
PADRE->(DbAppend())
REPLACE PADRE->Clave WITH "3"
REPLACE PADRE->Nombre WITH "PADRE 3"
//
PADRE->(DbAppend())
REPLACE PADRE->Clave WITH "4"
REPLACE PADRE->Nombre WITH "PADRE 4"
//
USE
//
ENDIF
//
IF !FILE("HIJO.DBF")
//
aDbf := {}
AADD(aDbf,{"ClaveP","C",1,0})
AADD(aDbf,{"Clave","C",1,0})
AADD(aDbf,{"Nombre","C",40,0})
AADD(aDbf,{"Edad","N",2,0})
DBCREATE("HIJO",aDbf)
USE HIJO
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "1"
REPLACE HIJO->Clave WITH "1"
REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 1"
REPLACE HIJO->Edad WITH 20
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "1"
REPLACE HIJO->Clave WITH "2"
REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 1"
REPLACE HIJO->Edad WITH 30
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "1"
REPLACE HIJO->Clave WITH "3"
REPLACE HIJO->Nombre WITH "HIJO 3 DE PADRE 1"
REPLACE HIJO->Edad WITH 22
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "2"
REPLACE HIJO->Clave WITH "1"
REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 2"
REPLACE HIJO->Edad WITH 32
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "2"
REPLACE HIJO->Clave WITH "2"
REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 2"
REPLACE HIJO->Edad WITH 16
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "3"
REPLACE HIJO->Clave WITH "1"
REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 3"
REPLACE HIJO->Edad WITH 12
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "3"
REPLACE HIJO->Clave WITH "2"
REPLACE HIJO->Nombre WITH "HIJO 2 DE PADRE 3"
REPLACE HIJO->Edad WITH 18
//
HIJO->(DbAppend())
REPLACE HIJO->ClaveP WITH "4"
REPLACE HIJO->Clave WITH "1"
REPLACE HIJO->Nombre WITH "HIJO 1 DE PADRE 4"
REPLACE HIJO->Edad WITH 45
//
USE
//
ENDIF
//
IF !FILE("NIETO.DBF")
//
aDbf := {}
AADD(aDbf,{"ClaveP","C",1,0})
AADD(aDbf,{"ClaveH","C",1,0})
AADD(aDbf,{"Clave","C",1,0})
AADD(aDbf,{"Nombre","C",40,0})
DBCREATE("NIETO",aDbf)
USE NIETO
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "1"
REPLACE NIETO->ClaveH WITH "1"
REPLACE NIETO->Clave WITH "1"
REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 1 DE PADRE 1"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "1"
REPLACE NIETO->ClaveH WITH "1"
REPLACE NIETO->Clave WITH "2"
REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 1 DE PADRE 1"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "1"
REPLACE NIETO->ClaveH WITH "1"
REPLACE NIETO->Clave WITH "3"
REPLACE NIETO->Nombre WITH "NIETO 3 DE HIJO 1 DE PADRE 1"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "2"
REPLACE NIETO->ClaveH WITH "2"
REPLACE NIETO->Clave WITH "1"
REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 2 DE PADRE 2"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "2"
REPLACE NIETO->ClaveH WITH "2"
REPLACE NIETO->Clave WITH "2"
REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 2 DE PADRE 2"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "1"
REPLACE NIETO->ClaveH WITH "2"
REPLACE NIETO->Clave WITH "1"
REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 2 DE PADRE 1"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "1"
REPLACE NIETO->ClaveH WITH "2"
REPLACE NIETO->Clave WITH "2"
REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 2 DE PADRE 1"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "2"
REPLACE NIETO->ClaveH WITH "1"
REPLACE NIETO->Clave WITH "1"
REPLACE NIETO->Nombre WITH "NIETO 1 DE HIJO 1 DE PADRE 2"
//
NIETO->(DbAppend())
REPLACE NIETO->ClaveP WITH "2"
REPLACE NIETO->ClaveH WITH "1"
REPLACE NIETO->Clave WITH "2"
REPLACE NIETO->Nombre WITH "NIETO 2 DE HIJO 1 DE PADRE 2"
//
USE
//
ENDIF
//
return nil
*********************************
static function IndexaFicheros()
********************************
IF !FILE("HIJO.CDX")
USE HIJO
INDEX ON HIJO->ClaveP+HIJO->Clave TO HIJO
USE
ENDIF
//
IF !FILE("NIETO.CDX")
USE NIETO
INDEX ON NIETO->ClaveP+NIETO->ClaveH+NIETO->Clave TO NIETO
USE
ENDIF
//
return nil
*********************************
static function AbreFicheros()
********************************
USE HIJO INDEX HIJO NEW
USE NIETO INDEX NIETO NEW
USE PADRE NEW
return nil
//
*********************************************
static function PruebaBrowse(cTipo)
*********************************************
Local oDlg
Local oBrwPadre
Local oBrwHijo
Local oBrwNieto
local oCol
//
DEFINE DIALOG oDlg RESOURCE "GENERAL"
//
////////////////////////////////////////////////////
/////////////////// BROWSE DE PADRE //////////
////////////////////////////////////////////////////
//
IF cTipo = "L"
REDEFINE LISTBOX oBrwPadre ;
FIELDS IIF(ASCAN(aSelePro,PADRE->Clave+"-"+Padre->Nombre)=0," ",aLevel[ 2 ] ),;
PADRE->Clave+" ",;
+PADRE->Nombre;
FIELDSIZES 32,276;
HEADERS "Clave"," Nombre ";
ID 100;
OF oDlg
ELSE
REDEFINE xBrowse oBrwPadre ID 100 OF oDlg ;
COLUMNS "Clave","Nombre" ;
ALIAS "Padre" CELL LINES FOOTERS
Estilo(oBrwPadre)
ENDIF
oBrwPadre:bChange:= {|| (Actualiza1(oBrwHijo),Actualiza2(oBrwNieto))}
////////////////////////////////////////////
/////////////////// BROWSE DE HIJO ////////
////////////////////////////////////////////
//
DbSelectArea("HIJO")
//
IF cTipo = "L"
REDEFINE LISTBOX oBrwHijo ;
FIELDS Hijo->Clave+" ",;
+Hijo->Nombre;
FIELDSIZES 32,276,16;
HEADERS "Clave"," Nombre ";
ID 200;
OF oDlg
ELSE
REDEFINE xBrowse oBrwHijo ID 200 OF oDlg ;
COLUMNS "Clave","Nombre","Edad" ;
ALIAS "Hijo" CELL LINES FOOTERS
Estilo(oBrwHijo)
oBrwHijo:lFooter := .t.
oBrwHijo:aCols[1]:bFooter :={|| Str(HIJO->( OrdKeyCount() ),2,0) }
oBrwHijo:aCols[3]:nFooterType:=AGGR_TOTAL
oBrwHijo:MakeTotals()
ENDIF
oBrwHijo:bChange:= {|| Actualiza2(oBrwNieto)}
//
////////////////////////////////////////////////
/////////////////// BROWSE DE NIETO/////////////
////////////////////////////////////////////////
//
DbSelectArea("NIETO")
//
IF cTipo = "L"
REDEFINE LISTBOX oBrwNieto ;
FIELDS Nieto->Clave+" ",;
+Nieto->Nombre;
FIELDSIZES 32,276,16;
HEADERS "Clave"," Nombre ";
ID 300;
OF oDlg
ELSE
REDEFINE xBrowse oBrwNieto ID 300 OF oDlg ;
COLUMNS "Clave","Nombre" ;
ALIAS "Nieto" CELL LINES FOOTERS
Estilo(oBrwNieto)
ENDIF
DbSelectArea("PADRE")
ACTIVATE DIALOG oDlg CENTER // ON INIT ( Actualiza1(oBrwHijo), Actualiza2(oBrwNieto) )
return nil
************************************
STATIC FUNCTION Actualiza1(oBrwHijo)
************************************
//
HIJO->(ordscope(TOPSCOPE, PADRE->Clave))
HIJO->(ordscope(BOTTOMSCOPE, PADRE->Clave))
HIJO->(DbGoTop())
oBrwHijo:refresh()
return nil
*************************************
STATIC FUNCTION Actualiza2(oBrwNieto)
*************************************
//
NIETO->(ordscope(TOPSCOPE, PADRE->Clave+HIJO->Clave))
NIETO->(ordscope(BOTTOMSCOPE, PADRE->Clave+HIJO->Clave))
NIETO->(DbGoTop())
oBrwNieto:refresh()
return nil
//-------------------------
STATIC Function Estilo(oBrw)
WITH OBJECT oBrw
:nMarqueeStyle := MARQSTYLE_HIGHLROW
:nColDividerStyle := LINESTYLE_BLACK
:bClrSel := {|| { nRGB( 0, 0,255), nRGB(255,248,220) } }
:lColDividerComplete := .t.
:nHeaderLines := 1
:nDataLines := 1
END
Return nil
Y aquí el .RC
- Code: Select all Expand view RUN
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 5.00".
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
LANGUAGE LANG_SPANISH,SUBLANG_SPANISH_MODERN
GENERAL DIALOGEX FIXED IMPURE 6, 18, 244, 252
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE
FONT 10, "MS Sans Serif", 0, 0, 1
{
CONTROL "", 100, "TWBrowse", WS_TABSTOP|0x00b00000, 12, 10, 220, 72
CONTROL "", 200, "TWBrowse", WS_TABSTOP|0x00b00000, 12, 86, 220, 72
CONTROL "", 300, "TWBrowse", WS_TABSTOP|0x00b00000, 12, 164, 220, 72
}