Página 1 de 1

xbase + SQLRDD con harbour

Enviado: 09 Mar 2025 12:45
por Paredes01
Buen día
Anexo un ejemplo de comandos xbase y consultas sql con SQLRDD (Marcos Gambeta)
con Harbour

Podría utilizar PIVOT como hacen en (sql server 2021)
Pero me pregunte:
¿ cómo lo hago con ambas tecnologías ?

¡ surgió la magia !
con buena velocidad y resultado

link de resultado en Excel:
https://mega.nz/file/ArYDjCiL#186gYzy27 ... CFp3BhURm8

Sigamos adelante!!

saludos!!

Código:

Código: Selecionar todos

#include "sqlrdd.ch"

Procedure RepCompMovxMes()

   Local cSql, oSql , nPos, oExcel, oLibro, oHoja, X, xFile
   Local nTask, nIdle, nError

   Use Provee Index Prove01,;
                    Prove02 Shared New

   BXX(11,10,16,35,,3,8,cCAJA1)
   @ 11,14 SAY "Reporte de Movimientos por Mes" COLOR COLOR4

   Do While .T.

      @ 13,12 Say "DESDE   :             "
      @ 14,12 Say "HASTA   :             "
      @ 15,12 Say "PROVEE. :             "

      dFECINI    := Date()
      dFECFIN    := Date()
      cID_PROV   := Space(5)
      cID_PROVANT:= Space(5)

      @ 13, 22 Get dFECINI Picture "@D" Valid DToC(dFECINI) != "  /  /  "
      Read
      If LastKey() = 27
         Exit
      Endif

      @ 14, 22 Get dFECFIN Picture "@D" Valid dFECFIN >= dFECINI
      Read
      If LastKey() = 27
         Loop
      Endif

      If Year(dFecini) <> Year(dFecfin)
         Plswait(.T., "El rango de fechas no pertenece al mismo año...")
         Inkey(3)
         Plswait(.f.)
         Loop
      Endif

      @ 15, 22 Get cID_PROV Picture "@!S5" Valid SECTOR(@cID_PROV)
      Read
      If LastKey() = 27
         Loop
      Endif

      If Empty(cID_PROV)
         Loop
      Endif

      cSql:= "select                                 "
      cSql+= "ec.id_prov                           , "
      cSql+= "pv.NOM                               , "
      cSql+= "ec.folio                             , "
      cSql+= "ec.fec_ord                           , "
      cSql+= "ec.fec_cap                           , "
      cSql+= "ec.factura                           , "
      cSql+= "dc.id_prod                           , "
      cSql+= "dc.ean                               , "
      cSql+= "ar.descrip1                          , "
      cSql+= "isnull(dc.cant  ,    0) as [cantidad], "
      cSql+= "isnull(dc.precio, 0.00) as [preciox] , "
      cSql+= "dc.lote                              , "
      cSql+= "dc.FECHACAD                          , "
      cSql+= "ec.usuario                           , "
      cSql+= "dc.siva as tiva                      , "
      cSql+= "dc.iva as tasa                       , "
      cSql+= "ec.sta                               , "
      cSql+= "Year(ec.fec_cap)  as [mysiglo]       , "
      cSql+= "Month(ec.fec_cap) as [mymes]         , "
      cSql+= "Day(ec.fec_cap)   as [mydia]         , "
      cSql+= "isnull(ex.invfin_c, 0) as [fisico]   , "
      cSql+= "ar.descrip2                          , "
      cSql+= "isnull(ex.disp_c, 0) as [disp]       , "
      cSql+= "isnull(ex.ult_costo, 0) as [costoU]  , "
      cSql+= "isnull(ex.ponderado, 0) as [costoP]  , "
      cSql+= "ma.nomcorto                            "
      cSql+= "from enccomp as ec                     "
      cSql+= "inner join detcomp  as dc on ec.folio    = dc.folio  "
      cSql+= "left  join articulo as ar on dc.id_prod  = ar.idcve  "
      cSql+= "left  join marca    as ma on ar.id_marca = ma.cve    "
      cSql+= "left  join provee   as pv on ec.id_prov  = pv.cve    "
      cSql+= "left  join existenc as ex on dc.id_prod  = ex.llave  "
      cSql+= "where ( ec.fec_cap >= " + SR_cDBValue(dFecini) + " and ec.fec_cap <= " + SR_cDBValue(dFecfin) + " ) "  
      cSql+= "and (ec.sta = '4') and (dc.sr_deleted <> 'T') and (ec.id_prov = " + "'" + cID_PROV + "'" + ") "
      cSql+= "order by ec.fec_cap, ec.folio "

      aRet  :={}
      aDatos:={}
      
      oSql := SR_GetConnection()
      oSql:exec(cSql,,.t.,@aRet)

      If Len(aRet) > 0

         cdat:= ""
         For Each cdat in aRet
            X:= hB_Enumindex()
            
            cdc_id_prod := aRet[X, 7]
            ncant       := aRet[X,10]
            nmes        := aRet[X,19]
            
            nPos:= 0
            nPos:= AScan(aDatos, {|X| X[7] == cdc_id_prod })

            If nPos = 0
               
               AAdd(aDatos,{  aRet[X, 1] ,;        
                              aRet[X, 2] ,;        
                              aRet[X, 3] ,;        
                              aRet[X, 4] ,;        
                              aRet[X, 5] ,;        
                              aRet[X, 6] ,;        
                              aRet[X, 7] ,;         
                              aRet[X, 8] ,;  
                              aRet[X, 9] ,;  
                              aRet[X,10] ,;  
                              aRet[X,11] ,;  
                              aRet[X,12] ,;  
                              aRet[X,13] ,;  
                              aRet[X,14] ,;  
                              aRet[X,15] ,;  
                              aRet[X,16] ,;  
                              aRet[X,17] ,;  
                              aRet[X,18] ,;  
                              aRet[X,19] ,;  
                              aRet[X,20] ,;  
                              aRet[X,21] ,; 
                              aRet[X,22] ,;  
                              aRet[X,23] ,;  
                              aRet[X,24] ,;  
                              aRet[X,25] ,;  
                              aRet[X,26] ,;  
                              0          ,;  // 27 ENE
                              0          ,;  // 28 FEB
                              0          ,;  // 29 MAR
                              0          ,;  // 30 ABR
                              0          ,;  // 31 MAY
                              0          ,;  // 32 JUN
                              0          ,;  // 33 JUL
                              0          ,;  // 34 AGO
                              0          ,;  // 25 SEP
                              0          ,;  // 36 OCT
                              0          ,;  // 37 NOV
                              0          })  // 38 DIC

               nPos:= Len(aDatos)

               Do Case
                  Case nmes = 1
                     aDatos[nPos, 27] := ncant
                  Case nmes = 2
                     aDatos[nPos, 28] := ncant
                  Case nmes = 3
                     aDatos[nPos, 29] := ncant
                  Case nmes = 4
                     aDatos[nPos, 30] := ncant
                  Case nmes = 5
                     aDatos[nPos, 31] := ncant
                  Case nmes = 6
                     aDatos[nPos, 32] := ncant
                  Case nmes = 7
                     aDatos[nPos, 33] := ncant
                  Case nmes = 8
                     aDatos[nPos, 34] := ncant
                  Case nmes = 9
                     aDatos[nPos, 35] := ncant
                  Case nmes = 10
                     aDatos[nPos, 36] := ncant
                  Case nmes = 11
                     aDatos[nPos, 37] := ncant
                  Case nmes = 12
                     aDatos[nPos, 38] := ncant
               EndCase
            Else

               aDatos[nPos, 10] += ncant

               Do Case
                  Case nmes = 1
                     aDatos[nPos, 27] += ncant
                  Case nmes = 2
                     aDatos[nPos, 28] += ncant
                  Case nmes = 3
                     aDatos[nPos, 29] += ncant
                  Case nmes = 4
                     aDatos[nPos, 30] += ncant
                  Case nmes = 5
                     aDatos[nPos, 31] += nCant
                  Case nmes = 6
                     aDatos[nPos, 32] += ncant
                  Case nmes = 7
                     aDatos[nPos, 33] += ncant
                  Case nmes = 8
                     aDatos[nPos, 34] += ncant
                  Case nmes = 9
                     aDatos[nPos, 35] += ncant
                  Case nmes = 10
                     aDatos[nPos, 36] += ncant
                  Case nmes = 11
                     aDatos[nPos, 37] += ncant
                  Case nmes = 12
                     aDATOS[nPos, 38] += ncant
               Endcase
            Endif
         Next
         
         If Len(aDatos) > 0            
            ** Ordenamos la suma de cantidad de mayor a menor
            ASort(aDatos,,,{|X, Y| X[10] > Y[10] })
            
            PlsWait(.T.,"Creando Reporte, espere ...")         
            GeneraRepcompxMes()            
            PlsWait(.f.)
         Endif
      Else
         PlsWait(.T.,"No existen movimientos a esta fecha ...")
         Inkey(2)
         PlsWait(.F.)
      Endif
   Enddo

   Provee->(DBCloseArea())
Return

xbase + SQLRDD con harbour

Enviado: 09 Mar 2025 12:57
por Itamar M. Lins Jr.
Olá!
Use a tag [url] para colocar links.
Seu link está quebrado.

Saudações,
Itamar M. Lins Jr.

xbase + SQLRDD con harbour

Enviado: 10 Mar 2025 13:40
por Paredes01
Gracias Itamar

Anexo link nuevo:
https://mega.nz/file/ArYDjCiL#186gYzy27 ... CFp3BhURm8

Saludos!!

xbase + SQLRDD con harbour

Enviado: 10 Mar 2025 16:57
por JoséQuintas
Não sei se entendi bem o que a rotina faz.

Código: Selecionar todos

SELECT
...
SUM( DC.CANT ) AS QTD,
SUM( IF( MONTH( EC.FECCAP ) = 1, COALESC( EC.CANT, 0 ), 0 ) AS QTD_ENE, 
SUM( IF( MONTH( EC.FECCAP ) = 2, COALESC( EC.CANT, 0 ), 0 ) AS QTD_FEB, 
...
SUM( IF( MONTH( EC.FECAP = 12, COALESCE( EC.CANT, 0 ) AS QTD_DIC
..
GROUP BY DC.ID_PROD
ORDER BY QTD

xbase + SQLRDD con harbour

Enviado: 10 Mar 2025 17:05
por JoséQuintas
Paredes01 escreveu:¡ surgió la magia !
con buena velocidad y resultado
Quem faz o trabalho é o servidor.
Tanto faz SQLRDD, SQLMIX, ADO, a velocidade será a mesma.

xbase + SQLRDD con harbour

Enviado: 10 Mar 2025 18:31
por alxsts
Olá!

Puedes reducir tu codigo agregando apenas una variable:

Código: Selecionar todos

LOCAL nOffSet := 26
//...
            If nPos = 0
111	                
112	               AAdd(aDatos,{  aRet[X, 1] ,;       
113	                              aRet[X, 2] ,;       
114	                              aRet[X, 3] ,;       
115	                              aRet[X, 4] ,;       
116	                              aRet[X, 5] ,;       
117	                              aRet[X, 6] ,;       
118	                              aRet[X, 7] ,;         
119	                              aRet[X, 8] ,; 
120	                              aRet[X, 9] ,; 
121	                              aRet[X,10] ,; 
122	                              aRet[X,11] ,; 
123	                              aRet[X,12] ,; 
124	                              aRet[X,13] ,; 
125	                              aRet[X,14] ,; 
126	                              aRet[X,15] ,; 
127	                              aRet[X,16] ,; 
128	                              aRet[X,17] ,; 
129	                              aRet[X,18] ,; 
130	                              aRet[X,19] ,; 
131	                              aRet[X,20] ,; 
132	                              aRet[X,21] ,;
133	                              aRet[X,22] ,; 
134	                              aRet[X,23] ,; 
135	                              aRet[X,24] ,; 
136	                              aRet[X,25] ,; 
137	                              aRet[X,26] ,; 
138	                              0          ,;  // 27 ENE
139	                              0          ,;  // 28 FEB
140	                              0          ,;  // 29 MAR
141	                              0          ,;  // 30 ABR
142	                              0          ,;  // 31 MAY
143	                              0          ,;  // 32 JUN
144	                              0          ,;  // 33 JUL
145	                              0          ,;  // 34 AGO
146	                              0          ,;  // 25 SEP
147	                              0          ,;  // 36 OCT
148	                              0          ,;  // 37 NOV
149	                              0          })  // 38 DIC
150	 
151	               nPos:= Len(aDatos)
152	 

153	               aDatos[nPos, nOffSet + nMes] := nCant
154	               
179	            Else
180	 
181	               aDatos[nPos, 10] += ncant
182	 
183	               aDatos[nPos, nOffSet + nMes] += nCant
154	              
209	            Endif
210	         Next
211	          
212	         If Len(aDatos) > 0           
213	            ** Ordenamos la suma de cantidad de mayor a menor
214	            ASort(aDatos,,,{|X, Y| X[10] > Y[10] })
215	             
216	            PlsWait(.T.,"Creando Reporte, espere ...")         
217	            GeneraRepcompxMes()           
218	            PlsWait(.f.)
219	         Endif
220	      Else
221	         PlsWait(.T.,"No existen movimientos a esta fecha ...")
222	         Inkey(2)
223	         PlsWait(.F.)
224	      Endif

xbase + SQLRDD con harbour

Enviado: 11 Mar 2025 09:41
por Paredes01
Enterado, gracias por los consejos

Saludos!!