In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Clase TListados y problema con Column - Data

Foro público de Xailer en español
Responder
Karl Svensson
Mensajes: 81
Registrado: Mar Oct 18, 2005 7:20 pm

Clase TListados y problema con Column - Data

Mensaje 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
correo
Mensajes: 109
Registrado: Mar Nov 22, 2005 7:15 pm

Clase TListados y problema con Column - Data

Mensaje 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
>
Karl Svensson
Mensajes: 81
Registrado: Mar Oct 18, 2005 7:20 pm

Clase TListados y problema con Column - Data

Mensaje 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
>
Karl Svensson
Mensajes: 81
Registrado: Mar Oct 18, 2005 7:20 pm

Clase TListados y problema con Column - Data

Mensaje 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
>
notengo
Mensajes: 417
Registrado: Vie Oct 12, 2007 1:29 pm

Clase TListados y problema con Column - Data

Mensaje 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
Karl Svensson
Mensajes: 81
Registrado: Mar Oct 18, 2005 7:20 pm

Clase TListados y problema con Column - Data

Mensaje 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
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9461
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Clase TListados y problema con Column - Data

Mensaje 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
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Karl Svensson
Mensajes: 81
Registrado: Mar Oct 18, 2005 7:20 pm

Clase TListados y problema con Column - Data

Mensaje 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
>>
>
>
notengo
Mensajes: 417
Registrado: Vie Oct 12, 2007 1:29 pm

Clase TListados y problema con Column - Data

Mensaje 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
zeasoftware
Mensajes: 1831
Registrado: Mar Oct 11, 2005 9:53 am

Clase TListados y problema con Column - Data

Mensaje 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
>>
>
>
--
Responder