Tabla Pivot

Post Reply
User avatar
cmsoft
Posts: 1294
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 1 time

Tabla Pivot

Post by cmsoft »

Estimados:
Existe alguna función para tablas pivot para TDolphin o Mysql nativa?
Hice una adaptación de las funciones de ADO pero no quiero reinventar la rueda.
Agradezco comentarios
Dejo aquí el ejemplo

Code: Select all | Expand

*
#include "FiveWin.Ch"
#include "ord.ch"
#include "xbrowse.ch"
#include "tdolphin.ch"
//----------------------------------------------------------------------------//
function Main()
   local oQry, oCn
   local cServer := 'localhost', cUser := 'root', cPassword := 'secret', cDBName := 'test', nPort := "3306"
   FWCONNECT oCn HOST cServer USER cUser PASSWORD cPassword DB cDBName PORT VAL(nPort)
   oQry := PivotDolphin( oCn, 'PVTDATA', 'REGION', 'PRODUCT', 'SALES', 'COUNT')  
   xbrowse(oQry)
return nil

//----------------------------------------------------------------------------//

function PivotDolphin(oCn, cTable, cRowFld, cColFld, cValFld, cAggrFunc )

   local cSql,  n, oQry
   
   oQry     := oCn:Query("SELECT DISTINCT " + cColFld + " as col FROM " + cTable + " DST")
   if ( n := At( " AS ", cRowFld ) ) > 0
      cRowFld     := Left( cRowFld, n + 3 ) + ;
                     FW_QuotedColSQL( AllTrim( SubStr( cRowFld, n + 4 ) ) )
   else
      cRowFld     := FW_QuotedColSQL( cRowFld )
   endif

   if ( n := At( " AS ", cColFld ) ) > 0
      cColFld  := Trim( Left( cColFld, n - 1 ) )
   endif

   cSql  := "SELECT " + cRowFld
   do while !oQry:Eof()
      cSql  += ", " + cAggrFunc + "( CASE WHEN " + cColFld + " = " + ClipValue2Sql( oQry:col ) + " THEN " + cValFld + " ELSE 0 END ) AS " + ;
            If( ValType( oQry:col ) == 'C', FW_QuotedColSQL( oQry:col ), CharRem( "-/.", "COL_" + cValToChar( oQry:col ) ) )
      oQry:Skip()
   enddo

   cSql += " FROM " + cTable + " PVTTBL GROUP BY " + ;
      If( ( n := At( " AS ", Upper( cRowFld ) ) ) > 0, Left( cRowFld, n - 1 ), cRowFld )

return oCn:Query(cSql)
User avatar
cmsoft
Posts: 1294
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 1 time

Re: Tabla Pivot

Post by cmsoft »

En la clase nativa ya la encontre, es oRs:PivotArray(cTable, cRowFld, cColFld, cValFld, cAggrFunc )

En Dolphin, lo que hice está incompleto, ya que muestra la tabla con los resultados agrupados pero no pivotea...
User avatar
leandro
Posts: 1719
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 11 times
Been thanked: 3 times
Contact:

Re: Tabla Pivot

Post by leandro »

Cesar buenos días, estuve tratando de leer en internet para que se utilizar el pivote, pero no logro comprender. Podrías con tus palabras explicar para que sirve o en que casos se utiliza.

De antemano gracias.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
cmsoft
Posts: 1294
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 1 time

Re: Tabla Pivot

Post by cmsoft »

Leandro, gracias por tu interes, la tabla pivot (con mis palabras) sería similar a las tablas dinámicas de Excel
Si tenemos un colección de datos, por ejemplo las ventas de productos de un comercio, y entre los datos tenemos el código de producto y el código de vendedor, poder obtener una tabla cuyas columnas sean variables según los vendedores que hayan vendido algún producto, y las filas sean la cantidad de unidades de cada artículo vendido, o el importe, según el campo que elijamos. Y a su vez, si queremos pivotearla, veríamos como columnas cada articulo vendido, y como filas cada vendedor.
En Ado, Mr. Rao hizo las unas funciones excelentes y son realmente muy útiles para obtener informes de este tipo.
Puedes ver el ejemplo de Mr. Rao en samples\PivotDBF.PRG que muestra la funcionalidad con el xbrowse.
User avatar
nageswaragunupudi
Posts: 10701
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 3 times
Contact:

Re: Tabla Pivot

Post by nageswaragunupudi »

In the native class I already found it, it's oRs:PivotArray(cTable, cRowFld, cColFld, cValFld, cAggrFunc )

No. PivotArray(..) is a method of Connection class, not Rowset class.

You can use TDolphin mainly for the entire application. At the same time you can use FWH native lib for some special purposes.

Example

Code: Select all | Expand


// oServer is Dolphin server object
function MyPivotArray( oServer, cTable, cRowFld, cColFld, cValFld, cAggrFunc )
   local oCn := maria_connect( oServer )
   local aPivot := oCn:PivotArray( cTable, cRowFld, cColFld, cValFld, cAggrFunc )
   oCn:Close()
return aPivot
 
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10701
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 3 times
Contact:

Re: Tabla Pivot

Post by nageswaragunupudi »

Full source code of ADO pivot array is available in adofuncs.prg.
You can consider converting the code into Dolphin.
Regards

G. N. Rao.
Hyderabad, India
User avatar
cmsoft
Posts: 1294
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 1 time

Re: Tabla Pivot

Post by cmsoft »

Muchas gracias Mr. Rao!
Enrrique Vertiz
Posts: 549
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Contact:

Re: Tabla Pivot

Post by Enrrique Vertiz »

Saludos Mr. Rao y compañeros

Estoy tratando de usar pivotarray() con sentencias SQL pero me arroja error, alguien ha probado con sentencias SQL en vez de Filas y Columnas, aqui el ejemplo que da error:

cTabCon:="Diario"
aFil:=oCn:Execute("select cdo_cuenta from "+cTabCon+" where substring(cdo_cuenta,1,2) = '70'")
aCol:=oCn:Execute("select cdo_auxil2 from "+cTabCon+" where cdo_auxil2 != ''")
XBROWSER oCn:PivotArray( cTabCon, aFil, aCol, "monto_habe" ) TITLE "FWMARIADB: PIVOT TABLE"

Gracias
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
Posts: 549
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Contact:

Re: Tabla Pivot

Post by Enrrique Vertiz »

Saludos, alguna idea ?
Gracias
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
Posts: 549
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Contact:

Re: Tabla Pivot

Post by Enrrique Vertiz »

Me explico mejor, en la parte de la fila y la columna, van obviamente campos, pero que pasa si lo que quiero es que NO vayan todos _, por ejemplo en fila dice "REGION" y quisiera solo las "REGION" que empiezan con "70" y en columna dice "PRODUCTO" y quisiera que en vez de utilizar todo el campo utilice solo el substring de 1,4.
Por ultimo en "SALES" que es un campo numerico, quisiera que aparezca la diferencia entre 2 campos, por ejemplo SALES-COST
Gracias por su atencion
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Enrrique Vertiz
Posts: 549
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru
Contact:

Re: Tabla Pivot

Post by Enrrique Vertiz »

Buen dia

Ya encontre la solucion, en vez del nombre de la tabla se coloca el nombre del Query SQL donde previamente hiciste los filtros y agrupaciones que necesitabas ...
Gracias
Enrrique Vertiz Pitta
Lima-Peru
xHb 1.23.1026X, Fwh 24.09, BCC74, MySQL 8.0.X, SQLLIB 1.9m
Post Reply