Página 1 de 1

Clase TListados y problema con Column - Data

Publicado: Mar Ago 21, 2007 11:31 am
por Karl Svensson
Bueno, poquito a poco me voy atreviendo con las tripas de la Clase TReport.
Mi idea es generar en una linea la instrucción de impresión para poderla
escribir en el propio control button.
TListado():New("Titulo de
Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
Casi, casi, como desperezándose en esta mañana de agosto, se va despertando
la clase al igual que mi entusiasmo xaileriano.
No obstante, me he encallado en un tema que no consigo resolver. En un bucle
FOR..NEXT donde creo las sentencias COLUMN
for x=1 to len(aCabeceras)
COLUMN OF ::oReport TITLE aCabeceras[x] ;
DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
CHARSIZE 40 ;
FONT 2
next x
Por lo visto, al generar el codeblock en el método FieldGetByName incluye el
parámetro "x" en vez de su valor, pues me peta la instrucción si no pongo el
literal 1,2,...
Gracias por vuestra ayuda
Karl
CLASS TListado
DATA oFont1, oFont2, oReport, oDataset, Titulo
METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
ENDCLASS
METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
LOCAL x
if cTitulo<>NIL
::Titulo:=cTitulo
endif
if oDataSet<>NIL
::oDataSet:=oDataSet
endif
With Object ::oFont1 := TFont():New()
:cName := "Arial"
:nSize := 12
:lBold := .T.
END WITH
With Object ::oFont2 := TFont():New()
:cName := "Arial"
:nSize := 10
:lBold := .f.
END WITH
REPORT ::oReport ;
TITLE ::Titulo ;
FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
padr(Time(),5)+" Hoja " + ;
lTrim( Str( ::oReport:nPage ) ) ;
PREVIEW FONT ::oFont1, ::oFont2
::oReport:oFooter:aFonts[1]:=2
::oDataSet:Gotop()
::oReport:bWhile := {|| !::oDataSet:Eof() }
::oReport:bSkip := {|| ::oDataSet:Skip() }
for x=1 to len(aCabeceras)
COLUMN OF ::oReport TITLE aCabeceras[x] ;
DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
CHARSIZE 40 ;
FONT 2
next x
RUN REPORT ::oReport
::oFont1:Destroy()
::oFont2:Destroy()
RETU Self

Clase TListados y problema con Column - Data

Publicado: Mié Ago 22, 2007 11:45 am
por correo
Create una variable local de la forma
cField := aCampos[x] ...
...
DATA ::oDataSet:FieldGetByName(cField) ;
...
"Karl Svensson" <karl@bcnartis.com> escribió en el mensaje
news:46caafeb$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Bueno, poquito a poco me voy atreviendo con las tripas de la Clase
> TReport.
>
> Mi idea es generar en una linea la instrucción de impresión para poderla
> escribir en el propio control button.
>
> TListado():New("Titulo de
> Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
>
> Casi, casi, como desperezándose en esta mañana de agosto, se va
> despertando la clase al igual que mi entusiasmo xaileriano.
>
> No obstante, me he encallado en un tema que no consigo resolver. En un
> bucle FOR..NEXT donde creo las sentencias COLUMN
>
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
>
> Por lo visto, al generar el codeblock en el método FieldGetByName incluye
> el parámetro "x" en vez de su valor, pues me peta la instrucción si no
> pongo el literal 1,2,...
>
> Gracias por vuestra ayuda
> Karl
>
>
> CLASS TListado
> DATA oFont1, oFont2, oReport, oDataset, Titulo
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
> ENDCLASS
>
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
> LOCAL x
> if cTitulo<>NIL
> ::Titulo:=cTitulo
> endif
> if oDataSet<>NIL
> ::oDataSet:=oDataSet
> endif
> With Object ::oFont1 := TFont():New()
> :cName := "Arial"
> :nSize := 12
> :lBold := .T.
> END WITH
> With Object ::oFont2 := TFont():New()
> :cName := "Arial"
> :nSize := 10
> :lBold := .f.
> END WITH
> REPORT ::oReport ;
> TITLE ::Titulo ;
> FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
> padr(Time(),5)+" Hoja " + ;
> lTrim( Str( ::oReport:nPage ) ) ;
> PREVIEW FONT ::oFont1, ::oFont2
> ::oReport:oFooter:aFonts[1]:=2
> ::oDataSet:Gotop()
> ::oReport:bWhile := {|| !::oDataSet:Eof() }
> ::oReport:bSkip := {|| ::oDataSet:Skip() }
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
> RUN REPORT ::oReport
> ::oFont1:Destroy()
> ::oFont2:Destroy()
> RETU Self
>

Clase TListados y problema con Column - Data

Publicado: Mié Ago 22, 2007 12:43 pm
por Karl Svensson
Bueno, ya lo he conseguido:
for x=1 to len(aCampos)
cTitle:=aCabeceras[x]
oField:=::oDataSet:oFieldByName(aCampos[x])
COLUMN OF ::oReport TITLE cTitle ;
DATA oField:Value ;
CHARSIZE oField:nLen ;
FONT 2
next x
Así que no basta que pasar el valor sino según parece la referencia al
objeto, y sin utilizar las matrices en la línea del Comando COLUMN.
Saludos
Karl
"Karl Svensson" <karl@bcnartis.com> escribió en el mensaje
news:46caafeb$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Bueno, poquito a poco me voy atreviendo con las tripas de la Clase
> TReport.
>
> Mi idea es generar en una linea la instrucción de impresión para poderla
> escribir en el propio control button.
>
> TListado():New("Titulo de
> Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
>
> Casi, casi, como desperezándose en esta mañana de agosto, se va
> despertando la clase al igual que mi entusiasmo xaileriano.
>
> No obstante, me he encallado en un tema que no consigo resolver. En un
> bucle FOR..NEXT donde creo las sentencias COLUMN
>
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
>
> Por lo visto, al generar el codeblock en el método FieldGetByName incluye
> el parámetro "x" en vez de su valor, pues me peta la instrucción si no
> pongo el literal 1,2,...
>
> Gracias por vuestra ayuda
> Karl
>
>
> CLASS TListado
> DATA oFont1, oFont2, oReport, oDataset, Titulo
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
> ENDCLASS
>
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
> LOCAL x
> if cTitulo<>NIL
> ::Titulo:=cTitulo
> endif
> if oDataSet<>NIL
> ::oDataSet:=oDataSet
> endif
> With Object ::oFont1 := TFont():New()
> :cName := "Arial"
> :nSize := 12
> :lBold := .T.
> END WITH
> With Object ::oFont2 := TFont():New()
> :cName := "Arial"
> :nSize := 10
> :lBold := .f.
> END WITH
> REPORT ::oReport ;
> TITLE ::Titulo ;
> FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
> padr(Time(),5)+" Hoja " + ;
> lTrim( Str( ::oReport:nPage ) ) ;
> PREVIEW FONT ::oFont1, ::oFont2
> ::oReport:oFooter:aFonts[1]:=2
> ::oDataSet:Gotop()
> ::oReport:bWhile := {|| !::oDataSet:Eof() }
> ::oReport:bSkip := {|| ::oDataSet:Skip() }
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
> RUN REPORT ::oReport
> ::oFont1:Destroy()
> ::oFont2:Destroy()
> RETU Self
>

Clase TListados y problema con Column - Data

Publicado: Mié Ago 22, 2007 1:01 pm
por Karl Svensson
Por lo visto AGOSTO NO ES UN BUEN MES PARA TRABAJAR.
Aunque ya no me da error desde la última modificación, imprime siempre los
mismo=el contenido del último campo. urggggggggggggg
"Karl Svensson" <karl@bcnartis.com> escribió en el mensaje
news:46caafeb$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Bueno, poquito a poco me voy atreviendo con las tripas de la Clase
> TReport.
>
> Mi idea es generar en una linea la instrucción de impresión para poderla
> escribir en el propio control button.
>
> TListado():New("Titulo de
> Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
>
> Casi, casi, como desperezándose en esta mañana de agosto, se va
> despertando la clase al igual que mi entusiasmo xaileriano.
>
> No obstante, me he encallado en un tema que no consigo resolver. En un
> bucle FOR..NEXT donde creo las sentencias COLUMN
>
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
>
> Por lo visto, al generar el codeblock en el método FieldGetByName incluye
> el parámetro "x" en vez de su valor, pues me peta la instrucción si no
> pongo el literal 1,2,...
>
> Gracias por vuestra ayuda
> Karl
>
>
> CLASS TListado
> DATA oFont1, oFont2, oReport, oDataset, Titulo
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
> ENDCLASS
>
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
> LOCAL x
> if cTitulo<>NIL
> ::Titulo:=cTitulo
> endif
> if oDataSet<>NIL
> ::oDataSet:=oDataSet
> endif
> With Object ::oFont1 := TFont():New()
> :cName := "Arial"
> :nSize := 12
> :lBold := .T.
> END WITH
> With Object ::oFont2 := TFont():New()
> :cName := "Arial"
> :nSize := 10
> :lBold := .f.
> END WITH
> REPORT ::oReport ;
> TITLE ::Titulo ;
> FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
> padr(Time(),5)+" Hoja " + ;
> lTrim( Str( ::oReport:nPage ) ) ;
> PREVIEW FONT ::oFont1, ::oFont2
> ::oReport:oFooter:aFonts[1]:=2
> ::oDataSet:Gotop()
> ::oReport:bWhile := {|| !::oDataSet:Eof() }
> ::oReport:bSkip := {|| ::oDataSet:Skip() }
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
> RUN REPORT ::oReport
> ::oFont1:Destroy()
> ::oFont2:Destroy()
> RETU Self
>

Clase TListados y problema con Column - Data

Publicado: Mié Ago 22, 2007 3:36 pm
por notengo
Karl,
necesitas echar mano de las "detached local".
Prueba así­:
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
DATA ::oDataSet:FieldGetByName( GetColumnFieldName( aCampos[ x ] ) )
STATIC FUNCTION GetColumnFieldName( cField )
LOCAL cName := cField
RETURN cName
Saludos,
José Lalí­n

Clase TListados y problema con Column - Data

Publicado: Vie Ago 24, 2007 9:27 am
por Karl Svensson
Hola Jose
Pues no, que no hay manera. Da un bound error access array. He intentado
hacerlo en el evento OnInit y ocurre lo mismo.
Quizás la clase no permite el late binding...
He tomado una drástica - salomónica solución con una lista limitada a 30
posibles columnas literalizando cada una con aCampos[1] aCampos[2]... pues
aCampos[x] no hay manera.
Gracias
Karl
"José Lalín" <notengo@correo.com> escribió en el mensaje
news:46cc3c38$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
>
> Karl,
>
> necesitas echar mano de las "detached local".
>
> Prueba así:
>
>> COLUMN OF ::oReport TITLE aCabeceras[x] ;
>> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
>
> DATA ::oDataSet:FieldGetByName( GetColumnFieldName( aCampos[ x ] ) )
>
> STATIC FUNCTION GetColumnFieldName( cField )
> LOCAL cName := cField
> RETURN cName
>
> Saludos,
> José Lalín

Clase TListados y problema con Column - Data

Publicado: Vie Ago 24, 2007 10:57 am
por ignacio
Karl,
Los valores incluidos en la cláusula DATA son bloquificados y por lo tanto
las variables que utilice se quedan como referencia a la misma y no al valor
que en ese momento tengan, es decir, 'x' siempre la vale 'Len(Cabeceras)+1'.
Para evitar este problema deberá utilizar lo que se denomina 'dettached
locals' que consiste en forzar a que el codeblock utilice una nueva variable
en cado caso. Sería algo así:
for x=1 to len(aCabeceras)
WITH OBJECT TRptColumn():New( ::oReport )
:aTitle := { aCabeceras[x] }
:aData := { RptField( ::oDataset, aCampos, x ) }
:nCharSize := 40
:nDataFont := 2
END WITH
next x
static function RptField(oDataset, aData, n)
RETURN {|| oDataset:FiedgGetByName( aData[n] ) }
Lo he escrito al vuelo y no está probado. En cualqueir caso creo que la idea
queda clara.
Un saludo,
--
Ignacio Ortiz de Zúñiga
[Soporte Xailer]
"Karl Svensson" <karl@bcnartis.com> escribió en el mensaje
news:46caafeb$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Bueno, poquito a poco me voy atreviendo con las tripas de la Clase
> TReport.
>
> Mi idea es generar en una linea la instrucción de impresión para poderla
> escribir en el propio control button.
>
> TListado():New("Titulo de
> Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
>
> Casi, casi, como desperezándose en esta mañana de agosto, se va
> despertando la clase al igual que mi entusiasmo xaileriano.
>
> No obstante, me he encallado en un tema que no consigo resolver. En un
> bucle FOR..NEXT donde creo las sentencias COLUMN
>
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
>
> Por lo visto, al generar el codeblock en el método FieldGetByName incluye
> el parámetro "x" en vez de su valor, pues me peta la instrucción si no
> pongo el literal 1,2,...
>
> Gracias por vuestra ayuda
> Karl
>
>
> CLASS TListado
> DATA oFont1, oFont2, oReport, oDataset, Titulo
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
> ENDCLASS
>
> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
> LOCAL x
> if cTitulo<>NIL
> ::Titulo:=cTitulo
> endif
> if oDataSet<>NIL
> ::oDataSet:=oDataSet
> endif
> With Object ::oFont1 := TFont():New()
> :cName := "Arial"
> :nSize := 12
> :lBold := .T.
> END WITH
> With Object ::oFont2 := TFont():New()
> :cName := "Arial"
> :nSize := 10
> :lBold := .f.
> END WITH
> REPORT ::oReport ;
> TITLE ::Titulo ;
> FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
> padr(Time(),5)+" Hoja " + ;
> lTrim( Str( ::oReport:nPage ) ) ;
> PREVIEW FONT ::oFont1, ::oFont2
> ::oReport:oFooter:aFonts[1]:=2
> ::oDataSet:Gotop()
> ::oReport:bWhile := {|| !::oDataSet:Eof() }
> ::oReport:bSkip := {|| ::oDataSet:Skip() }
> for x=1 to len(aCabeceras)
> COLUMN OF ::oReport TITLE aCabeceras[x] ;
> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
> CHARSIZE 40 ;
> FONT 2
> next x
> RUN REPORT ::oReport
> ::oFont1:Destroy()
> ::oFont2:Destroy()
> RETU Self
>

Clase TListados y problema con Column - Data

Publicado: Vie Ago 24, 2007 11:31 am
por Karl Svensson
Gracias Ignacio. He probado este cambio pero sigue sin funcionarme. Aunque
no da error, no sale ningún listado.
Karl
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje
news:[email=46ce9d85@ozsrv2.ozlan.local...]46ce9d85@ozsrv2.ozlan.local...[/email]
> Karl,
>
> Los valores incluidos en la cláusula DATA son bloquificados y por lo tanto
> las variables que utilice se quedan como referencia a la misma y no al
> valor que en ese momento tengan, es decir, 'x' siempre la vale
> 'Len(Cabeceras)+1'. Para evitar este problema deberá utilizar lo que se
> denomina 'dettached locals' que consiste en forzar a que el codeblock
> utilice una nueva variable en cado caso. Sería algo así:
>
> for x=1 to len(aCabeceras)
> WITH OBJECT TRptColumn():New( ::oReport )
> :aTitle := { aCabeceras[x] }
> :aData := { RptField( ::oDataset, aCampos, x ) }
> :nCharSize := 40
> :nDataFont := 2
> END WITH
> next x
>
> static function RptField(oDataset, aData, n)
> RETURN {|| oDataset:FiedgGetByName( aData[n] ) }
>
> Lo he escrito al vuelo y no está probado. En cualqueir caso creo que la
> idea queda clara.
>
> Un saludo,
>
>
> --
> Ignacio Ortiz de Zúñiga
> [Soporte Xailer]
>
>
> "Karl Svensson" <karl@bcnartis.com> escribió en el mensaje
> news:46caafeb$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
>> Bueno, poquito a poco me voy atreviendo con las tripas de la Clase
>> TReport.
>>
>> Mi idea es generar en una linea la instrucción de impresión para poderla
>> escribir en el propio control button.
>>
>> TListado():New("Titulo de
>> Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
>>
>> Casi, casi, como desperezándose en esta mañana de agosto, se va
>> despertando la clase al igual que mi entusiasmo xaileriano.
>>
>> No obstante, me he encallado en un tema que no consigo resolver. En un
>> bucle FOR..NEXT donde creo las sentencias COLUMN
>>
>> for x=1 to len(aCabeceras)
>> COLUMN OF ::oReport TITLE aCabeceras[x] ;
>> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
>> CHARSIZE 40 ;
>> FONT 2
>> next x
>>
>> Por lo visto, al generar el codeblock en el método FieldGetByName incluye
>> el parámetro "x" en vez de su valor, pues me peta la instrucción si no
>> pongo el literal 1,2,...
>>
>> Gracias por vuestra ayuda
>> Karl
>>
>>
>> CLASS TListado
>> DATA oFont1, oFont2, oReport, oDataset, Titulo
>> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
>> ENDCLASS
>>
>> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
>> LOCAL x
>> if cTitulo<>NIL
>> ::Titulo:=cTitulo
>> endif
>> if oDataSet<>NIL
>> ::oDataSet:=oDataSet
>> endif
>> With Object ::oFont1 := TFont():New()
>> :cName := "Arial"
>> :nSize := 12
>> :lBold := .T.
>> END WITH
>> With Object ::oFont2 := TFont():New()
>> :cName := "Arial"
>> :nSize := 10
>> :lBold := .f.
>> END WITH
>> REPORT ::oReport ;
>> TITLE ::Titulo ;
>> FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
>> padr(Time(),5)+" Hoja " + ;
>> lTrim( Str( ::oReport:nPage ) ) ;
>> PREVIEW FONT ::oFont1, ::oFont2
>> ::oReport:oFooter:aFonts[1]:=2
>> ::oDataSet:Gotop()
>> ::oReport:bWhile := {|| !::oDataSet:Eof() }
>> ::oReport:bSkip := {|| ::oDataSet:Skip() }
>> for x=1 to len(aCabeceras)
>> COLUMN OF ::oReport TITLE aCabeceras[x] ;
>> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
>> CHARSIZE 40 ;
>> FONT 2
>> next x
>> RUN REPORT ::oReport
>> ::oFont1:Destroy()
>> ::oFont2:Destroy()
>> RETU Self
>>
>
>

Clase TListados y problema con Column - Data

Publicado: Vie Ago 24, 2007 6:17 pm
por notengo
Karl,
> Pues no, que no hay manera. Da un bound error access array. He intentado
> hacerlo en el evento OnInit y ocurre lo mismo.
>
> Quizás la clase no permite el late binding...
En el mensaje anterior, con las prisas, no revisé el código y tal como dice
Ignacio hay que convertir el valor a codeblock.
Intenta hacerlo como te explica y ten en cuenta que debes hacerlo no sólo
para la cláusula DATA del mandato COLUMN, sino también con la cláusula
TITLE, ya que también la estás cargando desde un array.
Saludos,
José Lalí­n

Clase TListados y problema con Column - Data

Publicado: Vie Ago 24, 2007 9:04 pm
por zeasoftware
> for x=1 to len(aCabeceras)
> WITH OBJECT TRptColumn():New( ::oReport )
> :aTitle := &("{ || '" + aCabeceras[x] + "'}") //quedaria { || 'Header1' }
> :aData := &("{ || ::oDataset:" + aCampos[x] + "'}") //quedaria { || ::oDataSet:Campo1 }
> :nCharSize := 40
> :nDataFont := 2
> END WITH
> next x
Yo lo aplico con For Each y se puede dar un mejor control. sobre todo si haces estructuras para poder apuntar a los campos de tu dbf.
Saludos.
--
Ramón Zea
01.993.194.14.27
http://www.paginasprodigy.com/zeasoftware/
zeasoftware@prodigy.net.mx
zeasoftware@hotmail.com
ramonzea@yahoo.com
zeasoft.movil@hotmail.com
"Ignacio Ortiz de Zúñiga" <NoName@xailer.com> escribió en el mensaje news:[email=46ce9d85@ozsrv2.ozlan.local...]46ce9d85@ozsrv2.ozlan.local...[/email]
> Karl,
>
> Los valores incluidos en la cláusula DATA son bloquificados y por lo tanto
> las variables que utilice se quedan como referencia a la misma y no al valor
> que en ese momento tengan, es decir, 'x' siempre la vale 'Len(Cabeceras)+1'.
> Para evitar este problema deberá utilizar lo que se denomina 'dettached
> locals' que consiste en forzar a que el codeblock utilice una nueva variable
> en cado caso. Serí­a algo así­:
>
> for x=1 to len(aCabeceras)
> WITH OBJECT TRptColumn():New( ::oReport )
> :aTitle := { aCabeceras[x] }
> :aData := { RptField( ::oDataset, aCampos, x ) }
> :nCharSize := 40
> :nDataFont := 2
> END WITH
> next x
>
> static function RptField(oDataset, aData, n)
> RETURN {|| oDataset:FiedgGetByName( aData[n] ) }
>
> Lo he escrito al vuelo y no está probado. En cualqueir caso creo que la idea
> queda clara.
>
> Un saludo,
>
>
> --
> Ignacio Ortiz de Zúñiga
> [Soporte Xailer]
>
>
> "Karl Svensson" <karl@bcnartis.com> escribió en el mensaje
> news:46caafeb$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
>> Bueno, poquito a poco me voy atreviendo con las tripas de la Clase
>> TReport.
>>
>> Mi idea es generar en una linea la instrucción de impresión para poderla
>> escribir en el propio control button.
>>
>> TListado():New("Titulo de
>> Listado",::oDataSet,{"Header1","Header2"},{"Campo1","Campo2 ")
>>
>> Casi, casi, como desperezándose en esta mañana de agosto, se va
>> despertando la clase al igual que mi entusiasmo xaileriano.
>>
>> No obstante, me he encallado en un tema que no consigo resolver. En un
>> bucle FOR..NEXT donde creo las sentencias COLUMN
>>
>> for x=1 to len(aCabeceras)
>> COLUMN OF ::oReport TITLE aCabeceras[x] ;
>> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
>> CHARSIZE 40 ;
>> FONT 2
>> next x
>>
>> Por lo visto, al generar el codeblock en el método FieldGetByName incluye
>> el parámetro "x" en vez de su valor, pues me peta la instrucción si no
>> pongo el literal 1,2,...
>>
>> Gracias por vuestra ayuda
>> Karl
>>
>>
>> CLASS TListado
>> DATA oFont1, oFont2, oReport, oDataset, Titulo
>> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CONSTRUCTOR
>> ENDCLASS
>>
>> METHOD New( cTitulo, oDataSet, aCabeceras, aCampos ) CLASS TListado
>> LOCAL x
>> if cTitulo<>NIL
>> ::Titulo:=cTitulo
>> endif
>> if oDataSet<>NIL
>> ::oDataSet:=oDataSet
>> endif
>> With Object ::oFont1 := TFont():New()
>> :cName := "Arial"
>> :nSize := 12
>> :lBold := .T.
>> END WITH
>> With Object ::oFont2 := TFont():New()
>> :cName := "Arial"
>> :nSize := 10
>> :lBold := .f.
>> END WITH
>> REPORT ::oReport ;
>> TITLE ::Titulo ;
>> FOOTER "EMPRESA - "+DtoC( Date() ) + " " + ;
>> padr(Time(),5)+" Hoja " + ;
>> lTrim( Str( ::oReport:nPage ) ) ;
>> PREVIEW FONT ::oFont1, ::oFont2
>> ::oReport:oFooter:aFonts[1]:=2
>> ::oDataSet:Gotop()
>> ::oReport:bWhile := {|| !::oDataSet:Eof() }
>> ::oReport:bSkip := {|| ::oDataSet:Skip() }
>> for x=1 to len(aCabeceras)
>> COLUMN OF ::oReport TITLE aCabeceras[x] ;
>> DATA ::oDataSet:FieldGetByName(aCampos[x]) ;
>> CHARSIZE 40 ;
>> FONT 2
>> next x
>> RUN REPORT ::oReport
>> ::oFont1:Destroy()
>> ::oFont2:Destroy()
>> RETU Self
>>
>
>
--