Página 1 de 1

OT: tReport y macros

Publicado: Lun Oct 02, 2006 12:24 pm
por jose.luis
Hola,
Estoy atascado en un tema de macros. Pretendo hacer un listado automatizado
de un dbbrowse. Es decir, hacer un report de las columnas y filas visibles
de un dbbrowse.
El bucle donde defino las columnas del report es este:
FOR EACH oCol IN ::odbBrowse1:aCols
IF !oCol:lVisible
LOOP
ENDIF
aData := {}
cMacro := "{ || oMemDataSet1:"+oCol:oDataField:cName+" }"
cMacro := &cMacro.
AADD(aData , cMacro)
WITH OBJECT oReport:AddColumn()
:aData := aData
:aTitle := { &("{ || ["+oCol:cHeader +"] }") }
:Create()
END
NEXT
Y en ejecución me da error de que no existe oMemDataSet1 justo en la linea
donde creo la macro. Todo debe venir por el tema de 'detached locals'. Debo
andar espeso hoy (o más bien, hoy estoy más espeso que otros días)... no
consigo dar con el 'punto exacto'. Si alguien puede darme luz sobre esto...
quedo agradecido. Os dejo el proyecto.
Saludos,
Jósé Luis Capel


Attached files pruebas6.zip (12.3 KB)Â

OT: tReport y macros

Publicado: Lun Oct 02, 2006 3:39 pm
por zeasoftware
oMemDataSet1 es parametro?
por que no veo los "::", osea, ::oMemDataSet1?
otro problema es que oSelf esta definida local y he notado que en las macros
no se pueden usar,
yo lo resolvi:
MemVar oSSelf := oSelf
cMacro := "{ || oSSelf:oMemDataSet1:"+oCol:oDataField:cName+" }"
Saludos.
--
Ramón Zea
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com
http://www.paginasprodigy.com/zeasoft/

OT: tReport y macros

Publicado: Lun Oct 02, 2006 3:41 pm
por zeasoftware
al parecer estas haciendoun report estandar para los browse, cualquier cosa,
yo ya lo tengo hecho, en lo que pueda ayudar.
Saludos.
--
Ramón Zea
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com
http://www.paginasprodigy.com/zeasoft/

OT: tReport y macros

Publicado: Lun Oct 02, 2006 4:03 pm
por jose.luis
Ramón,
> al parecer estas haciendoun report estandar para los browse, cualquier
> cosa, yo ya lo tengo hecho, en lo que pueda ayudar.
Gracias por tu ofrecimiento. Estoy haciendo precisamente un report del
browse. Mi interés es crear una función que genere el report de forma
automática según las columnas y filas del dataset mostrado en el tdbrowse.
En este caso concreto es un tMemDataset. Si tienes algo 'para mirar' te
quedo agradecido.
Saludos,
José Luis Capel

OT: tReport y macros

Publicado: Lun Oct 02, 2006 5:09 pm
por zeasoftware
pues a mi parecer la unica diferencia seria el (tMem) DataSet.
este es el codigo que ocupo para hacer mi reporte:
METHOD BtnBmp2Click( oSender ) CLASS ZBrowse2Printer
Local oReport
Local nCol
Local oCol
Local nCurrCol
Local nRecNo
Local nNumDatas, nData, aDatas
Local oPicCopyR
MemVar oSelf
MemVar aCols
oSender:lEnabled := .f.
oSelf := SELF
aCols := {}

::oDataSet:SaveState( .t. )
::oDataSet:GoTop()
WITH OBJECT oReport := TReport():New( self )
:oTitle := TRptLine():Create( oReport, ;
{ {|| alltrim(AppData:EMPRESA_Nombre) }, ;
{|| alltrim(::oEdit1:value) } }, ;
taCENTER, "t" )
:oHeader := TRptLine():Create( oReport, ;
{ {|| DtoStr( Date(), "dd-mmm-yyyy" ) + " " + Time() } }, ;
, "h" )
:oFooter := TRptLine():Create( oReport, ;
{ {|| "Pag.: " + lTrim( Str( oReport:nPage ) ) } }, ;
taCENTER, "f" )
:aFonts := { ::oFont1, ::oFont2 }
:lPreview := ::oPreliminar:lChecked
//:oDevice := <oPrinter>
:cJobName := ::oDataSet:Alias()
:Create()
END
For nCol := 1 To Len(::oDBBrowse1:aCols)
oCol := ::oDBBrowse1:aCols[nCol]
If ( !oCol:lVisible )
Loop
End
aAdd(aCols, {Nil, oCol})
nCurrCol := Len(aCols)
WITH OBJECT aCols[nCurrCol][1] := oReport:AddColumn()
:aTitle := { &("{|| '" + oCol:cHeader + "' }") }
:aData := { &("{|| oSelf:oDataSet:" + oCol:oDataField:cName + " }") }
:nAlignment := oCol:nAlignment
Do Case
//este tipo yo lo defino en runtime
Case oCol:oDataField:cType == "G"
nNumDatas := NumToken( &("oSelf:oDataSet:" + ;
oCol:oDataField:cName), ;
Chr(13) + Chr(10) )
:aData := {}
For nData := 1 To nNumDatas
aAdd(:aData, &( "{|| Token(oSelf:oDataSet:" + ;
oCol:oDataField:cName + ;
", Chr(13) + Chr(10), " + ;
nToc(nData) + ") }" ) )
Next
:nCharSize := Len( Eval(:aData[1]) )
Case oCol:oDataField:cType == "C"
:nCharSize := Len( Eval(:aData[1]) )
Case oCol:oDataField:cType == "N"
:nCharSize := Len(oCol:cPicture)
:nAlignment := taRIGHT
Case oCol:oDataField:cType == "D"
:nCharSize := 16
Case oCol:oDataField:cType == "L"
:nCharSize := 2
End Case
:nCharSize := Max(:nCharSize, Len(oCol:cHeader))
If ( !Empty(oCol:cPicture) )
:aPicture := { oCol:cPicture }
:cTotalPict := :aPicture[ 1 ]
End
:nDataFont := 2
:nTitleFont := 1
:nTotalFont := 1
If ( :lTotal := !Empty(oCol:cFooter) )
oReport:OnEndPage := &("{|oRep| aCols[" + NtoC(nCurrCol) + ;
"][1]:nTotal := zVal(aCols[" + NtoC(nCurrCol) + ;
"][2]:cFooter) }")
End
:Create()
END WITH
Next
WITH OBJECT oReport
:bWhile := {|oSender| !::oDataSet:EoF()}
:Run()
END
::oDataSet:RestoreState( .t. )
Return ( Nil )
creo que estamos para ayudarnos todos, espero te sirva.
Saludos.
--
Ramón Zea
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com

http://www.paginasprodigy.com/zeasoft/
"José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje news:[email=45211c07@news.xailer.com...]45211c07@news.xailer.com...[/email]
> Ramón,
>
>
>> al parecer estas haciendoun report estandar para los browse, cualquier
>> cosa, yo ya lo tengo hecho, en lo que pueda ayudar.
>
> Gracias por tu ofrecimiento. Estoy haciendo precisamente un report del
> browse. Mi interés es crear una función que genere el report de forma
> automática según las columnas y filas del dataset mostrado en el tdbrowse.
> En este caso concreto es un tMemDataset. Si tienes algo 'para mirar' te
> quedo agradecido.
>
> Saludos,
> José Luis Capel
>
>
--