xbase + SQLRDD con harbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Paredes01
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 20 Mai 2012 11:22
Localização: Mérida, Yucatán, México

xbase + SQLRDD con harbour

Mensagem 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
Editado pela última vez por Itamar M. Lins Jr. em 09 Mar 2025 12:56, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

xbase + SQLRDD con harbour

Mensagem por Itamar M. Lins Jr. »

Olá!
Use a tag [url] para colocar links.
Seu link está quebrado.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Paredes01
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 20 Mai 2012 11:22
Localização: Mérida, Yucatán, México

xbase + SQLRDD con harbour

Mensagem por Paredes01 »

Gracias Itamar

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

Saludos!!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

xbase + SQLRDD con harbour

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

xbase + SQLRDD con harbour

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

xbase + SQLRDD con harbour

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Paredes01
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 20 Mai 2012 11:22
Localização: Mérida, Yucatán, México

xbase + SQLRDD con harbour

Mensagem por Paredes01 »

Enterado, gracias por los consejos

Saludos!!
Responder