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: 54
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: 8028
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 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: 54
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 3107
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: 54
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