Tabla Pivot

Tabla Pivot

Postby cmsoft » Mon Sep 05, 2022 2:30 pm

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  RUN
*
#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: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Tabla Pivot

Postby cmsoft » Mon Sep 05, 2022 11:52 pm

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
cmsoft
 
Posts: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Tabla Pivot

Postby leandro » Tue Sep 06, 2022 10:32 am

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Tabla Pivot

Postby cmsoft » Tue Sep 06, 2022 11:58 am

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
cmsoft
 
Posts: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Tabla Pivot

Postby nageswaragunupudi » Sun Sep 18, 2022 3:14 am

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  RUN

// 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: 10646
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Tabla Pivot

Postby nageswaragunupudi » Sun Sep 18, 2022 3:17 am

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
nageswaragunupudi
 
Posts: 10646
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Tabla Pivot

Postby cmsoft » Sun Sep 18, 2022 1:07 pm

Muchas gracias Mr. Rao!
User avatar
cmsoft
 
Posts: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Tabla Pivot

Postby Enrrique Vertiz » Sat Sep 14, 2024 11:19 pm

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: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Tabla Pivot

Postby Enrrique Vertiz » Thu Oct 03, 2024 8:18 am

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: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Tabla Pivot

Postby Enrrique Vertiz » Thu Oct 03, 2024 9:07 am

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 los campos, 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: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru

Re: Tabla Pivot

Postby Enrrique Vertiz » Thu Oct 03, 2024 12:22 pm

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
Enrrique Vertiz
 
Posts: 541
Joined: Fri Oct 07, 2005 2:17 pm
Location: Lima - Peru


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 50 guests