Y la idea era en un browse visualizar diferentes albranes de ventas, y fusionar las filas número, fecha y total si correspondian aun mismo albarán, y visualizar el detalle de lineas de artículos.
Busque y encontre un ejemplo de Mr.Rao, crei entender como funcionaba, y lo probe.
http://forums.fivetechsupport.com/viewtopic.php?f=3&t=28543&p=159813&hilit=lmergevert#p159813
A primera vista funcionaba perfecto, pero cuando dos albaranes correlativos eran de la misma fecha, o del mismo importe, tambien me fusionaba las filas.
Despues de volver a revisar el ejemplo, me doy cuenta que la columna total no se fusiona , y se comporta como yo desearia.
Tras mirar nuevamente el código, veo donde esta el truco.
Se define el xBrowse usando dos veces el campo "INVOICE", y en el segundo le pone el titulo "TOTAL"
- Code: Select all Expand view RUN
- @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg DATASOURCE "TEST" ;
COLUMNS "INVOICE", "INVOICE", "DATEPAY", "PAYMENT" ;
HEADERS "INVOICE", "TOTAL", "DATEPAY", "PAYMENT" ;
CELL LINES NOBORDER
A continuación se modifica el codeblcok bStrData de la segunda columna para que visualice el total.
- Code: Select all Expand view RUN
- WITH OBJECT :Total
:lMergeVert := .t.
:bStrData := { || TRANSFORM( TEST->TOTAL, NumPict( 10, 2 ) ) }
:nDataStrAlign := AL_RIGHT
:nHeadStrAlign := AL_RIGHT
:cSortOrder := ""
END
De esta forma entiendo que la segunda columna (total) tiene un codeblock que devuelve invoice (se usa para el merge) y otro que devuelve el total que es el que se visualiza.
Si bien esto funciona, creo que es algo enrevesado.
Revisando el código fuente de la clase propongo el siguiente cambio (que mantiene compatiblidad con versiones anteriores):
-Añadir un CodeBlock a la clase TXBrwColumn, bMerge. Que contendrá el codeblock a evaluar para merge.
-Modificar el método WorkMergeData(), si bMerge no está definido funcionará como ahora, y si esta definido lo evaluzara para determnar las filas a fusionar.
Línea 13910 xBrowse.prg
- Code: Select all Expand view RUN
IF ::bMerge==NIL
uVal := ::Value()
ELSE
uVal := Eval( ::bMerge )
ENDIF
Con esta modificación el código que uso en mi programa es:
- Code: Select all Expand view RUN
...
WITH OBJECT oBrw
:SetDolphin( oDet, .F., .F.)
:SetColFromMySql("SerNum","Serie"+CRLF+"Nº.Albarán", .T.)
WITH OBJECT ATail(:aCols)
:lMergeVert :=.T. //Merge para SerNum
END
:SetColFromMySql("Fecha","Fecha", .T.)
WITH OBJECT ATail(:aCols)
:lMergeVert :=.T.
:bMerge := {||oDet:SerNum } //Merge Fecha, tomando como referencia SerNum
END
:SetColFromMySql("ArtCod","Cod", .T.)
:SetColFromMySql("ArtDes","Artículo",.T.)
:SetColFromMySql("kgs","Kilos", .T.)
:SetColFromMySql("Pvp","Precio", .T.)
:SetColFromMySql("Importe","Importe",.t.)
:SetColFromMySql("Lote","Lote",.t.)
:SetColFromMySql("Total","Total",.T.)
WITH OBJECT ATail(:aCols)
:lMergeVert :=.T.
:bMerge := {|| oDet:SerNum } //Merge Total, tomando como referencia SerNum
END
...
Que creo que para futuras modificaciones es más claro y legible que el ir asignando columnas que no son la que queremos visualizar, para después variar el bStrData y así obtener el resultado deseado.
Perdon ha quedado un post un poco tocho, esto de viva voz se explica mucho más rápido, pero espero que se haya entendido, y que se pueda añadir si Antonio lo considera oportuno en venideras versiones.