Page 1 of 1

Tabla Pivot

PostPosted: Mon Sep 05, 2022 2:30 pm
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 view
*
#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)

Re: Tabla Pivot

PostPosted: Mon Sep 05, 2022 11:52 pm
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...

Re: Tabla Pivot

PostPosted: Tue Sep 06, 2022 10:32 am
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.

Re: Tabla Pivot

PostPosted: Tue Sep 06, 2022 11:58 am
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.

Re: Tabla Pivot

PostPosted: Sun Sep 18, 2022 3:14 am
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 view

// 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
 

Re: Tabla Pivot

PostPosted: Sun Sep 18, 2022 3:17 am
by nageswaragunupudi
Full source code of ADO pivot array is available in adofuncs.prg.
You can consider converting the code into Dolphin.

Re: Tabla Pivot

PostPosted: Sun Sep 18, 2022 1:07 pm
by cmsoft
Muchas gracias Mr. Rao!