Consulta Ado con Fw vs VB - Solucionado

Consulta Ado con Fw vs VB - Solucionado

Postby LuchoMontero » Sat Jun 20, 2015 9:47 pm

Hola Gente:
Buenas tardes.
Para solicitarles su ayuda en este tema.
Estoy accesando a una Bd Progress y hago una consulta para traer en un Recordset.
El tema es que haciendo la misma consulta con Fw y comparando con VB6.
- Tiempo con FW = 03:00 minutos.
- Tiempo con VB6= 00:10 sgdos.

Algo estaré haciendo incorrectamente ?
Pego aquí el código que estoy utilizando:

Code: Select all  Expand view


FUNCTION fConecSrvAdo(xcCnxStr,xnCursor)
     LOCAL xoCnxSrv:=NIL, oError
     MsgWait( "Estableciendo conexión con el Servidor ...")
     xnCursor :=IF(xnCursor==NIL,adUseServer,xnCursor)  // adUseClient   
     TRY
       xoCnxSrv := TOleAuto():New( "ADODB.Connection" )    
     CATCH oErr
       MsgStop("No se puede establecer conexion con el Servidor de Base Datos ...!")
       ShowErrorCnx( oErr )      
       RETURN NIL
     END  
     xoCnxSrv:ConnecTionString:=xcCnxStr
     xoCnxSrv:CursorLocation  :=xnCursor
     TRY
       xoCnxSrv:Open()
     CATCH oErr
       MsgStop("No se puede establecer conexion con el Servidor de Base Datos ...!")
       ShowErrorCnx( oErr )
       RETURN NIL
     END  
     RETURN xoCnxSrv
*
/*** Función para Crear RecordSet ***/
*  xoCnxSrv  : Servidor Conectado
*  xcCmdSql  : Consulta Sql
*  xnCursor  : Que lado estará el cursor del Server o Cliente.
*  xnLockType: Bloqueo del cursor.
*  xnCurType : Tipo de cursor
*   
FUNCTION fCreaRecSet(xoCnxSrv, xcCmdSql, xnCursor, xnLockType, xnCurType)
     LOCAL oRsLocal, oError  
     TRY
       oRsLocal := TOleAuto():New( "ADODB.RecordSet" )      
     CATCH oError
       MsgStop('No se puede establecer conexion con Recordset ...!')
       ShowErrorCnx( oError )      
       RETURN NIL
     END  
     xnCursor  :=IF(xnCursor=NIL,adUseServer,xnCursor)  // adUseClient
     xnLockType:=IF(xnLockType=NIL,adLockOptimistic,xnLockType)
     xnCurType :=IF(xnCurType=NIL,adOpenKeyset,xnCurType)
     oRsLocal:CursorLocation:=xnCursor
     oRsLocal:LockType      :=xnLockType
     oRsLocal:CursorType    :=xnCurType    
     oRsLocal:Source        :=xcCmdSql
     oRsLocal:ActiveConnection:=xoCnxSrv  
     TRY
       oRsLocal:Open()
     CATCH oError
       MsgStop('No se puede establecer conexion con Recordset ...!')
       ShowErrorCnx( oError )      
       RETURN NIL
     END
     IF !oRsLocal:EOF()
       oRsLocal:MoveFirst()
     ENDIF   
     RETURN oRsLocal
*   
/*** Manejador error para Conexion Server ***/
FUNCTION ShowErrorCnx( oError )
     LOCAL cError := ""
     cError += " Descripción  : " + oError:Description
     cError += " SubSystem    : " + oError:SubSystem
     cError += " Error Number : " + Str( oError:SubCode )
     cError += " Severity     : " + Str( oError:Severity )  
     RETURN NIL
 


y este es con VB6
Code: Select all  Expand view
 
/ ***  Conectando con el Servidor. ***/
Set cCnx = New ADODB.Connection
   cCnx = "DSN=Chessgps;HOST=chess;PORT=2500;DB=distrib;UID=SYSPROGRESS;PWD=ch1573"
   With cCnx
     ' Cursor en Cliente para poder usar un DataGrid
     .CursorLocation = adUseClient
     '
Abro la conexión con la base de datos usando un DSN
     .Open cCnx
   End With

/***  Conectando al Recordset.***/

     Dim rs As New ADODB.Recordset
     rs.CursorLocation = adUseClient
     rs.Open SQL, cCnx, adOpenStatic
     Set rs.ActiveConnection = Nothing


 


Atte.
Lucho Montero.
Lima - Perú.

-----------------------------------------------------------------------
FW 12.04 + xHarbour 123 + Borland 582
Last edited by LuchoMontero on Sat Aug 20, 2016 12:28 am, edited 1 time in total.
LuchoMontero
 
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú

Re: Consulta Ado con Fw vs VB

Postby Antonio Linares » Sun Jun 21, 2015 10:11 pm

Lucho,

Puedes publicar el resto del código en VB6 para compararlos ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41390
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Consulta Ado con Fw vs VB

Postby LuchoMontero » Mon Jun 22, 2015 3:42 pm

Estimado Antonio:
Muchas gracias por responder.
Antes de analizar el resto del código de VB, por favor analicemos estas líneas en donde se ejecuta la consulta tanto en FW como VB6; y es aquí en donde hago la medición de tiempos:

Con Fw:
Code: Select all  Expand view


  Llama la función que ejecuta la Consulta y genera el Recordset:

  oRsAprvt:=''
  oRsAprvt:=fCreaRecSet(oCnxSrv, cCmdSql, adUseClient, adLockOptimistic, adOpenStatic)

Esta es la función que ejecuta la consulta y crea el Recordset:

FUNCTION fCreaRecSet(xoCnxSrv, xcCmdSql, xnCursor, xnLockType, xnCurType)
     LOCAL oRsLocal, oError  
     TRY
       oRsLocal := TOleAuto():New( "ADODB.RecordSet" )      
     CATCH oError
       MsgStop('No se puede establecer conexion con Recordset ...!')
       ShowErrorCnx( oError )      
       RETURN NIL
     END  
     xnCursor  :=IF(xnCursor=NIL,adUseServer,xnCursor)  // adUseClient
     xnLockType:=IF(xnLockType=NIL,adLockOptimistic,xnLockType)
     xnCurType :=IF(xnCurType=NIL,adOpenKeyset,xnCurType)
     oRsLocal:CursorLocation:=xnCursor
     oRsLocal:LockType      :=xnLockType
     oRsLocal:CursorType    :=xnCurType    
     oRsLocal:Source        :=xcCmdSql
     oRsLocal:ActiveConnection:=xoCnxSrv  
     TRY
       oRsLocal:Open()                     =====> Aquí es donde se ejecuta la consulta .... tiempo: 03:00 Minutos.
     CATCH oError
       MsgStop('No se puede establecer conexion con Recordset ...!')
       ShowErrorCnx( oError )      
       RETURN NIL
     END
     IF !oRsLocal:EOF()
       oRsLocal:MoveFirst()
     ENDIF   
     RETURN oRsLocal

 


Este el código VB que ejecuta la Consulta y crea el Recordset:
Code: Select all  Expand view
    Dim rs As New ADODB.Recordset
     rs.CursorLocation = adUseClient
     rs.Open SQL, cCnx, adOpenStatic          ====> Aquí es donde se Ejecuta la Consulta ... tiempo: 00:10 sgdos.
     Set rs.ActiveConnection = Nothing
 



Este es el código de VB que hace lo mismo con FW. Ambos hacen exactamente la misma consulta y la muestran en una grilla.
Code: Select all  Expand view


Option Explicit

'Database fields names from SQL query
Const DB_CSUP = "c_super"
Const DB_CVEN = "c_perso"
Const DB_TVEN = "d_perso"
Const DB_CRUT = "ruta"
Const DB_TDESRUT = "d_ruta"
Const DB_CCLI = "idcliente"
Const DB_TNOMREP = "nomcli"
'
DB_FECENTRE  := "fecentre"
Const DB_CTIP = "iddocument"
Const DB_NFAC = "nroped"
Const DB_CARTAG = "c_artag"
Const DB_DARTAG = "d_artag"
Const DB_CSUBAG1 = "c_subag1"
Const DB_DSUBAG1 = "d_subag1"
Const DB_CCODART = "codart"
Const DB_TDESART = "descrip"
Const DB_QCANPED = "nqbultos"
Const DB_QUMVTA = "umedstd"
Const DB_QIMPORTE = "qimporte"

'Cube fields names, arbitrary
'
Definir Descripcion Campos de la Tabla Contenedora del Cubo.
     
Const CUBEFLD_CSUP = "Cod Supervisor"
Const CUBEFLD_CVEN = "Cod Prevendedor"
Const CUBEFLD_TVEN = "Nombre Prevendedor"
Const CUBEFLD_CRUT = "Cod Ruta"
Const CUBEFLD_TDESRUT = "Descripcion Ruta"
Const CUBEFLD_CCLI = "Cod Cliente"
Const CUBEFLD_TNOMREP = "Nombre del Cliente"
' CUBEFLD_FECENTRE  := "Fecha Entrega"
Const CUBEFLD_CTIP = "Tipo Documento"
Const CUBEFLD_NFAC = "Numero Pedido"
Const CUBEFLD_CARTAG = "Agrup Articulo"
Const CUBEFLD_DARTAG = "Descripcion Agrupa Articulo"
Const CUBEFLD_CSUBAG1 = "Sub Agrup Articulo"
Const CUBEFLD_DSUBAG1 = "Descripcion Sub Agrup Articulo"
Const CUBEFLD_CCODART = "Cod Articulo"
Const CUBEFLD_TDESART = "Descripcion Articulo"
Const CUBEFLD_QCANPED = "Cantidad Bultos"
Const CUBEFLD_QUMVTA = "Cantida Umed"
Const CUBEFLD_QIMPORTE = "Importe Soles"


'
Const CUBEFLD_C_SUPER = "Supervisor"
'Const CUBEFLD_C_PERSO = "Cod Vend"
'
Const CUBEFLD_D_PERSO = "Nombre Vendedor"
'Const CUBEFLD_FECENTRE = "Fecha Entrega"
'
Const CUBEFLD_CODART = "Cod Articulo"
'Const CUBEFLD_DESCRIP = "Nombre Articulo"
'
Const CUBEFLD_QCANPED = DB_QCANPED
'Const CUBEFLD_CANT = DB_CANT

'
Const CUBEFLD_CATEGORY = DB_CATEGORY
'Const CUBEFLD_PRODUCT = DB_PRODUCT
'
Const CUBEFLD_DATE = "Date"
'Const CUBEFLD_YEAR = "Year"
'
Const CUBEFLD_QUARTER = "Quarter"
'Const CUBEFLD_MONTH = "Month"
'
Const CUBEFLD_QUANTITY = DB_QUANTITY
'Const CUBEFLD_AMOUNT = DB_AMOUNT


Const xCmdSql1 = "SELECT PUB.perscom.c_super AS c_super, PUB.carga.c_perso AS c_perso, PUB.perscom.d_perso AS d_perso, " & vbCrLf & _
         "PUB.carga.ruta AS ruta, PUB.rutasv.d_ruta AS d_ruta, PUB.carga.idcliente AS idcliente, " & vbCrLf & _
         "PUB.clientes.nomcli AS nomcli, "
Const xCmdSql2 = "PUB.carga.iddocumento AS iddocument, PUB.carga.fecentre AS fecentre, PUB.carga.nroped AS nroped, " & vbCrLf & _
         "PUB.artagru.c_artag AS c_artag, PUB.foragru.d_artag AS d_artag, PUB.artagru.c_subag1 AS c_subag1, " & vbCrLf & _
         "PUB.subagru1.d_subag1 AS d_subag1, PUB.lincarga.codart AS codart, PUB.articulos.descrip AS descrip, " & vbCrLf & _
         "(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto AS nqbultos, "
Const xCmdSql3 = "(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto * PUB.articulos.valor AS umedstd, " & vbCrLf & _
         "PUB.lincarga.cant * PUB.lincarga.precio + PUB.lincarga.resto * (PUB.lincarga.precio / PUB.articulos.resto) + PUB.lincarga.iva1 + PUB.lincarga.per212 AS qimporte "
Const xCmdSql4 = "FROM  PUB.artagru, PUB.foragru, PUB.subagru1, PUB.lincarga, PUB.carga, PUB.articulos, PUB.perscom, PUB.rutasv, PUB.clientes " & vbCrLf & _
         "WHERE PUB.artagru.c_artag = PUB.foragru.c_artag AND PUB.artagru.c_artag = PUB.subagru1.c_artag AND PUB.artagru.c_subag1 = PUB.subagru1.c_subag1 AND " & vbCrLf & _
         "PUB.artagru.codart = PUB.articulos.codart AND PUB.lincarga.nroped = PUB.carga.nroped AND PUB.lincarga.codart = PUB.articulos.codart AND "
Const xCmdSql5 = "PUB.carga.idSucur = PUB.perscom.idSucur AND PUB.carga.c_perso = PUB.perscom.c_perso AND PUB.carga.idSucur = PUB.rutasv.idSucur AND " & vbCrLf & _
         "PUB.carga.ruta = PUB.rutasv.ruta AND PUB.carga.idSucur = PUB.clientes.idSucur AND PUB.carga.idcliente = PUB.clientes.idcliente AND " & vbCrLf & _
         "(PUB.artagru.c_artag = 21) AND (PUB.carga.idSucur = 1)"
Const SQL = xCmdSql1 + xCmdSql2 + xCmdSql3 + xCmdSql4 + xCmdSql5
Dim cCnx As ADODB.Connection
Private CONS As String


Private Sub ContourCubeX1_BeforeMoveDimension(ByVal ViewDim As CCubeX4.IViewDim, ByVal NewAxis As CCubeX4.TxDimAxis, ByVal NewPos As Long, ByVal Cancel As CCubeX4.IBoolean)
  Select Case ViewDim.Name
    Case CUBEFLD_CCODART
      If NewAxis <> xda_outside Then
            If NewAxis <> ContourCubeX1.Cube.Dims(CUBEFLD_CCODART).Axis Then
              Cancel.Value = True
            Else
              If NewPos <= ContourCubeX1.Cube.Dims(CUBEFLD_TDESART).Pos Then Cancel.Value = True
            End If
      End If
    Case CUBEFLD_CVEN
      If NewAxis <> xda_outside Then
         If NewAxis <> ContourCubeX1.Cube.Dims(CUBEFLD_CVEN).Axis Then
           Cancel.Value = True
         Else
           If NewPos >= ContourCubeX1.Cube.Dims(CUBEFLD_TVEN).Pos Then Cancel.Value = True
         End If
      End If
  End Select
End Sub

Private Sub Form_Load()
   On Error GoTo handler
   '
Instancio la conexión y me conecto con la base de datos
   ' ----------------------------------------------------------
   Set cCnx = New ADODB.Connection
   cCnx = "DSN=Chessgps;HOST=chess;PORT=2500;DB=distrib;UID=SYSPROGRESS;PWD=ch1573"
   With cCnx
     '
Cursor en Cliente para poder usar un DataGrid
     .CursorLocation = adUseClient
     ' Abro la conexión con la base de datos usando un DSN
     .Open cCnx
   End With
   ContourCubeX1.BorderStyle = xcbsSingle
   ContourCubeX1.NULLValueString = ""
   ContourCubeX1.InactiveDimAreaBkColor = 2
     
   
   With ContourCubeX1.Cube
     '
Create Dimensions and Facts in cube
     ' Dimensions initially appeared on verical axis
     
     .Dims.Add CUBEFLD_CSUP, DB_CSUP, 5, 2
     .Dims.Add CUBEFLD_CVEN, DB_CVEN, 5, 2
     .Dims.Add CUBEFLD_TVEN, DB_TVEN, 1, 2
     .Dims.Add CUBEFLD_CRUT, DB_CRUT, 5, 2
     .Dims.Add CUBEFLD_TDESRUT, DB_TDESRUT, 1, 2
     .Dims.Add CUBEFLD_CCLI, DB_CCLI, 5, 2
     .Dims.Add CUBEFLD_TNOMREP, DB_TNOMREP, 1, 2
     '
:Dims:Add(CUBEFLD_FECENTRE, DB_FECENTRE, 9, 2)
     .Dims.Add CUBEFLD_CTIP, DB_CTIP, 1, 2
     .Dims.Add CUBEFLD_NFAC, DB_NFAC, 5, 2
     
     ' Mostrar Fijos Verticales al presentar el Cubo.
     .Dims.Add CUBEFLD_CARTAG, DB_CARTAG, 5, 0
     .Dims.Add CUBEFLD_DARTAG, DB_DARTAG, 1, 0
     .Dims.Add CUBEFLD_CSUBAG1, DB_CSUBAG1, 5, 0
     .Dims.Add CUBEFLD_DSUBAG1, DB_DSUBAG1, 1, 0
     .Dims.Add CUBEFLD_CCODART, DB_CCODART, 5, 0
     .Dims.Add CUBEFLD_TDESART, DB_TDESART, 1, 0
     
     '
Cube facts
     .BaseFacts.Add DB_QCANPED, DB_QCANPED
     .BaseFacts.Add DB_QUMVTA, DB_QUMVTA
     .BaseFacts.Add DB_QIMPORTE, DB_QIMPORTE
       
     'Add cube facts to the grid
     .Facts.Add(CUBEFLD_QCANPED, DB_QCANPED, 1).Caption = "Bultos"
     .Facts.Add(CUBEFLD_QUMVTA, DB_QUMVTA, 1).Caption = " Cantidad Venta UM "
     .Facts.Add(CUBEFLD_QIMPORTE, DB_QIMPORTE, 1).Caption = "Importe Bruto"

     '
Populate recordset

     Dim rs As New ADODB.Recordset
     rs.CursorLocation = adUseClient
     rs.Open SQL, cCnx, adOpenStatic
     Set rs.ActiveConnection = Nothing

     'Activate grid

     '
.Open rs
   End With
   ContourCubeX1.Facts(CUBEFLD_QCANPED).Visible = True
   ContourCubeX1.Facts(CUBEFLD_QCANPED).Appearance.Format = "###,###,##0.00"
   ContourCubeX1.Facts(CUBEFLD_QUMVTA).Visible = True
   ContourCubeX1.Facts(CUBEFLD_QUMVTA).Appearance.Format = "###,###,##0.0000"
   ContourCubeX1.Facts(CUBEFLD_QIMPORTE).Visible = True
   ContourCubeX1.Facts(CUBEFLD_QIMPORTE).Appearance.Format = "###,###,##0.00"
   'ContourCubeX1.FlatStyle = xfs_Flat
   ContourCubeX1.Cube.Open rs
 
   
   infoBox.Text = info
 Exit Sub
   
handler:
  MsgBox ("Error: " & Err.Description)
  End
End Sub

Private Sub Form_Resize()
    ContourCubeX1.Move 0, Image1.Height, Me.ScaleWidth, Me.ScaleHeight - Image1.Height - infoBox.Height
    With Image2
        .Left = Image1.Width
        .Width = IIf((Me.Width - Image1.Width) > 0, Me.Width - Image1.Width, 0)
    End With
    With infoBox
        .Top = Image1.Height + ContourCubeX1.Height
        .Width = ContourCubeX1.Width
        .Left = 0
    End With
End Sub


Saludos.
Atte.
Lucho Montero.
Lima - Perú.
------------------------------------------------------------------------
FW 12.04 + xHarbour 1.2.3 + Borland 5.8.2
LuchoMontero
 
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú

Re: Consulta Ado con Fw vs VB

Postby Antonio Linares » Mon Jun 22, 2015 4:43 pm

Lucho,

Le pasas exactamente los mismos parámetros al código de FWH que al de VB6 ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41390
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Consulta Ado con Fw vs VB

Postby LuchoMontero » Mon Jun 22, 2015 5:27 pm

Hola Antonio:
Así es ... es exactamente la misma consulta, incluso primero la "armé" para FW y después la copié igual a VB6 la única diferencia que en FW una porción del Where es contra una variable:

Code: Select all  Expand view
"(PUB.artagru.c_artag = "+ALLTRIM(STR(nIdAgrart,4))+") AND (PUB.carga.idSucur = "+ALLTRIM(STR(nIdSucur,4))+")


Y en VB6 una parte del Where es contra un valor escrito directamente en la consulta; pero no tendría mayor relevancia:

Code: Select all  Expand view

"(PUB.artagru.c_artag = 21) AND (PUB.carga.idSucur = 1)"
 


Esta es la cadena de la consulta para FW:
Code: Select all  Expand view

     cCmdSql:=''
     xCmdSql1:=xCmdSql2:=xCmdSql3:=xCmdSql4:=xCmdSql5:=''
     xCmdSql1:="SELECT PUB.perscom.c_super AS c_super, PUB.carga.c_perso AS c_perso, PUB.perscom.d_perso AS d_perso, "+;
                  "PUB.carga.ruta AS ruta, PUB.rutasv.d_ruta AS d_ruta, PUB.carga.idcliente AS idcliente, "+;
                  "PUB.clientes.nomcli AS nomcli, "
     xCmdSql2:="PUB.carga.iddocumento AS iddocument, PUB.carga.fecentre AS fecentre, PUB.carga.nroped AS nroped, "+;
               "PUB.artagru.c_artag AS c_artag, PUB.foragru.d_artag AS d_artag, PUB.artagru.c_subag1 AS c_subag1, "+;
               "PUB.subagru1.d_subag1 AS d_subag1, PUB.lincarga.codart AS codart, PUB.articulos.descrip AS descrip, "+;
               "(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto AS nqbultos, "
     xCmdSql3:="(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto * PUB.articulos.valor AS umedstd, "+;
               "PUB.lincarga.cant * PUB.lincarga.precio + PUB.lincarga.resto * (PUB.lincarga.precio / PUB.articulos.resto) + PUB.lincarga.iva1 + PUB.lincarga.per212 AS qimporte "
     xCmdSql4:="FROM  PUB.artagru, PUB.foragru, PUB.subagru1, PUB.lincarga, PUB.carga, PUB.articulos, PUB.perscom, PUB.rutasv, PUB.clientes "+;
               "WHERE PUB.artagru.c_artag = PUB.foragru.c_artag AND PUB.artagru.c_artag = PUB.subagru1.c_artag AND PUB.artagru.c_subag1 = PUB.subagru1.c_subag1 AND "+;
                  "PUB.artagru.codart = PUB.articulos.codart AND PUB.lincarga.nroped = PUB.carga.nroped AND PUB.lincarga.codart = PUB.articulos.codart AND "
     xCmdSql5:="PUB.carga.idSucur = PUB.perscom.idSucur AND PUB.carga.c_perso = PUB.perscom.c_perso AND PUB.carga.idSucur = PUB.rutasv.idSucur AND "+;
               "PUB.carga.ruta = PUB.rutasv.ruta AND PUB.carga.idSucur = PUB.clientes.idSucur AND PUB.carga.idcliente = PUB.clientes.idcliente AND "+;
               "(PUB.artagru.c_artag = "+ALLTRIM(STR(nIdAgrart,4))+") AND (PUB.carga.idSucur = "+ALLTRIM(STR(nIdSucur,4))+") AND (PUB.carga.iddocumento = 'FCVTA' OR PUB.carga.iddocumento = 'BLVTA')"
     cCmdSql:=xCmdSql1+xCmdSql2+xCmdSql3+xCmdSql4+xCmdSql5

 


Y esta es la cadena de la Consulta para VB6:
Code: Select all  Expand view

Const xCmdSql1 = "SELECT PUB.perscom.c_super AS c_super, PUB.carga.c_perso AS c_perso, PUB.perscom.d_perso AS d_perso, " & vbCrLf & _
         "PUB.carga.ruta AS ruta, PUB.rutasv.d_ruta AS d_ruta, PUB.carga.idcliente AS idcliente, " & vbCrLf & _
         "PUB.clientes.nomcli AS nomcli, "
Const xCmdSql2 = "PUB.carga.iddocumento AS iddocument, PUB.carga.fecentre AS fecentre, PUB.carga.nroped AS nroped, " & vbCrLf & _
         "PUB.artagru.c_artag AS c_artag, PUB.foragru.d_artag AS d_artag, PUB.artagru.c_subag1 AS c_subag1, " & vbCrLf & _
         "PUB.subagru1.d_subag1 AS d_subag1, PUB.lincarga.codart AS codart, PUB.articulos.descrip AS descrip, " & vbCrLf & _
         "(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto AS nqbultos, "
Const xCmdSql3 = "(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto * PUB.articulos.valor AS umedstd, " & vbCrLf & _
         "PUB.lincarga.cant * PUB.lincarga.precio + PUB.lincarga.resto * (PUB.lincarga.precio / PUB.articulos.resto) + PUB.lincarga.iva1 + PUB.lincarga.per212 AS qimporte "
Const xCmdSql4 = "FROM  PUB.artagru, PUB.foragru, PUB.subagru1, PUB.lincarga, PUB.carga, PUB.articulos, PUB.perscom, PUB.rutasv, PUB.clientes " & vbCrLf & _
         "WHERE PUB.artagru.c_artag = PUB.foragru.c_artag AND PUB.artagru.c_artag = PUB.subagru1.c_artag AND PUB.artagru.c_subag1 = PUB.subagru1.c_subag1 AND " & vbCrLf & _
         "PUB.artagru.codart = PUB.articulos.codart AND PUB.lincarga.nroped = PUB.carga.nroped AND PUB.lincarga.codart = PUB.articulos.codart AND "
Const xCmdSql5 = "PUB.carga.idSucur = PUB.perscom.idSucur AND PUB.carga.c_perso = PUB.perscom.c_perso AND PUB.carga.idSucur = PUB.rutasv.idSucur AND " & vbCrLf & _
         "PUB.carga.ruta = PUB.rutasv.ruta AND PUB.carga.idSucur = PUB.clientes.idSucur AND PUB.carga.idcliente = PUB.clientes.idcliente AND " & vbCrLf & _
         "(PUB.artagru.c_artag = 21) AND (PUB.carga.idSucur = 1)"
Const SQL = xCmdSql1 + xCmdSql2 + xCmdSql3 + xCmdSql4 + xCmdSql5
 


Y como decía la diferencia de tiempos es en el Open:
- FW:
Code: Select all  Expand view


     ...
    ...
     oRsLocal:Source        :=xcCmdSql
     ....
       oRsLocal:Open()
    ...
   .....
 


- VB6:
Code: Select all  Expand view

rs.Open SQL, cCnx, adOpenStatic
 
LuchoMontero
 
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú

Re: Consulta Ado con Fw vs VB

Postby Antonio Linares » Mon Jun 22, 2015 6:33 pm

Si haces el WHERE exactamente igual que en VB6, usando un valor fijo

la diferencia de tiempos se mantiene ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41390
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Consulta Ado con Fw vs VB

Postby LuchoMontero » Mon Jun 22, 2015 7:51 pm

Hola Antonio:
Haciendo la modificación de la consulta con valores fijos se mantiene igual.
Inserté un Time() antes de entrar al Open: 14:34:30 y al salir del Open: 14:38:04
- FW tiempo : 03':34'' minu

VB6: antes del Open: 14:49:25, saliendo del Open: 14:49:35
- VB6 tiempo : 00':10'' sgdos.

Esta es la consulta y es igual a VB6:
Code: Select all  Expand view

 xCmdSql1:="SELECT PUB.perscom.c_super AS c_super, PUB.carga.c_perso AS c_perso, PUB.perscom.d_perso AS d_perso, "+;
                  "PUB.carga.ruta AS ruta, PUB.rutasv.d_ruta AS d_ruta, PUB.carga.idcliente AS idcliente, "+;
                  "PUB.clientes.nomcli AS nomcli, "
     xCmdSql2:="PUB.carga.iddocumento AS iddocument, PUB.carga.fecentre AS fecentre, PUB.carga.nroped AS nroped, "+;
               "PUB.artagru.c_artag AS c_artag, PUB.foragru.d_artag AS d_artag, PUB.artagru.c_subag1 AS c_subag1, "+;
               "PUB.subagru1.d_subag1 AS d_subag1, PUB.lincarga.codart AS codart, PUB.articulos.descrip AS descrip, "+;
               "(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto AS nqbultos, "
     xCmdSql3:="(PUB.lincarga.cant * PUB.articulos.resto + PUB.lincarga.resto) / PUB.articulos.resto * PUB.articulos.valor AS umedstd, "+;
               "PUB.lincarga.cant * PUB.lincarga.precio + PUB.lincarga.resto * (PUB.lincarga.precio / PUB.articulos.resto) + PUB.lincarga.iva1 + PUB.lincarga.per212 AS qimporte "
     xCmdSql4:="FROM  PUB.artagru, PUB.foragru, PUB.subagru1, PUB.lincarga, PUB.carga, PUB.articulos, PUB.perscom, PUB.rutasv, PUB.clientes "+;
               "WHERE PUB.artagru.c_artag = PUB.foragru.c_artag AND PUB.artagru.c_artag = PUB.subagru1.c_artag AND PUB.artagru.c_subag1 = PUB.subagru1.c_subag1 AND "+;
                  "PUB.artagru.codart = PUB.articulos.codart AND PUB.lincarga.nroped = PUB.carga.nroped AND PUB.lincarga.codart = PUB.articulos.codart AND "
     xCmdSql5:="PUB.carga.idSucur = PUB.perscom.idSucur AND PUB.carga.c_perso = PUB.perscom.c_perso AND PUB.carga.idSucur = PUB.rutasv.idSucur AND "+;
               "PUB.carga.ruta = PUB.rutasv.ruta AND PUB.carga.idSucur = PUB.clientes.idSucur AND PUB.carga.idcliente = PUB.clientes.idcliente AND "+;
               "(PUB.artagru.c_artag = 21) AND (PUB.carga.idSucur = 1) AND (PUB.carga.iddocumento = 'FCVTA' OR PUB.carga.iddocumento = 'BLVTA')"
               
     cCmdSql:=xCmdSql1+xCmdSql2+xCmdSql3+xCmdSql4+xCmdSql5
 
LuchoMontero
 
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú

Re: Consulta Ado con Fw vs VB

Postby Antonio Linares » Mon Jun 22, 2015 9:56 pm

Lucho,

No es algo de FWH sino de la implementación de OLE de Harbour

lo único que se me ocurre es que falte algo en la configuración que sea lo que causa la diferencia de tiempos.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41390
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Consulta Ado con Fw vs VB

Postby lucasdebeltran » Tue Jun 23, 2015 6:17 am

Hola,

¿Has mirado que estés usando en Fivewin el mismo cursor?.

Tendrás que modificar adofuncs.prg para adaptarlo.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: Consulta Ado con Fw vs VB

Postby Adolfo » Tue Jun 23, 2015 12:19 pm

Solo para meter mi cuchara...

No creo que el error sea de HARBOUR sino especificamente de ADORDD.

Para cotejar.. se podria comparar esa consulta contra TDOLPHIN, y ver los tiempos. No contra VB6, que aunque para efectos de desarrollo es lo que se pretende igualar, sino para ver si es la capa de ADO la que ralentiza la consulta.

Luchomontero.. podrias hacer esa prueba. Yo he estado pensando passarme a ADORDD, pero, si las veloidades de las consultas se ralentizan.. definitivamnete NO

Desde Chile
Adolfo
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 1 TB NVME M.2, 1 TB SSD, GTX 1650
User avatar
Adolfo
 
Posts: 846
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile

Re: Consulta Ado con Fw vs VB

Postby Antonio Linares » Tue Jun 23, 2015 12:20 pm

Adolfo,

Parece que no está usando AdoRdd...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41390
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Consulta Ado con Fw vs VB

Postby lucasdebeltran » Tue Jun 23, 2015 2:15 pm

Adolfo,

No está usando ADORDD, ni tampoco las funciones de Fivewin que ha creado Nages, sino una función propia.

Yo, con ADORDD, no tengo ni de lejos esos tiempos de respuesta, y lo tengo ahora puesto a un cliente en una WAN a través de Internet y de momento va todo fenómeno.
Muchas gracias. Many thanks.

Un saludo, Best regards,

Harbour 3.2.0dev, Borland C++ 5.82 y FWH 13.06 [producción]

Implementando MSVC 2010, FWH64 y ADO.

Abandonando uso xHarbour y SQLRDD.
User avatar
lucasdebeltran
 
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am

Re: Consulta Ado con Fw vs VB

Postby leandro » Tue Jun 23, 2015 3:54 pm

Buenos días...

A mi me sucedió algo similar en una base de datos en postgres... Al realizar la consulta con operaciones de lado servidor se demoraba 01:30 un minuto y treinta segundos. Cualquier operación tardaba un montón.
Code: Select all  Expand view

oVar:="SELECT sum(ss_tothdo),sum(ss_totase),sum(ss_totgrl),sum(ss_cancel),sum(ss_notasd) FROM lyma_cobro_serv WHERE ss_manzan="+vMan+" AND ss_lotesp="+vLot+" AND ss_period<>'"+vPer+"' AND ss_contro='"+vTip+"'"
oRrsDeu := FW_OPENRECORDSET(oLamcla:oCon,oVar,adLockOptimistic,adOpenKeyset)
nRegistros := oRrsDeu:RecordCount()
 

Asi que para solucionar el problema únicamente realizo la consulta y hago las operaciones de lado del cliente.
Code: Select all  Expand view

oVar:="SELECT ss_tothdo,ss_totase,ss_totgrl,ss_cancel,ss_notasd FROM lyma_cobro_serv WHERE ss_manzan="+vMan+" AND ss_lotesp="+vLot+" AND ss_period<>'"+vPer+"' AND ss_contro='"+vTip+"'"
oRrsDeu := FW_OPENRECORDSET(oLamcla:oCon,oVar,adLockOptimistic,adOpenKeyset)
nRegistros := oRrsDeu:RecordCount()
oRrsDeu:MoveFirst()
Do While !oRrsDeu:Eof()
  h2o:=h2o+oLamcla:cNoNulo(oRrsDeu:Fields( "ss_tothdo" ):Value,"N")
  ase:=ase+oLamcla:cNoNulo(oRrsDeu:Fields( "ss_totase" ):Value,"N")
  tot:=tot+oLamcla:cNoNulo(oRrsDeu:Fields( "ss_totgrl" ):Value,"N")
  can:=can+oLamcla:cNoNulo(oRrsDeu:Fields( "ss_cancel" ):Value,"N")
  nta:=nta+oLamcla:cNoNulo(oRrsDeu:Fields( "ss_notasd" ):Value,"N")
  oRrsDeu:MoveNext()
EndDo
oRrsDeu:close()
 


No se si sea de ayuda... pero así solucione mi problema... Ahora tarda 3 segundos en realizar la misma operación.
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: 1485
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Consulta Ado con Fw vs VB

Postby AHF » Tue Jun 23, 2015 6:59 pm

google translator:

Si la consulta es usar muchas veces este es un trabajo DBA
Prueba MySql Query Analyser.
Regards
Antonio H Ferreira
AHF
 
Posts: 838
Joined: Fri Feb 10, 2006 12:14 pm

Re: Consulta Ado con Fw vs VB

Postby LuchoMontero » Tue Jul 14, 2015 7:27 am

Estimado Antonio :
Gracias por contestar.

Efectivamente, el problema no viene de FW, sino en el :Open() de ToleAuto de xHarbour que al momento de "traer" la consulta se demora... hice una prueba reemplazando :Open() por :Execute() y mejoró algo; de 3 minutos a 2 minutos, aunque todavía es lento comparado con Vb 00:10 segundos.
Gracias a los demás colegas que contestaron.
Estoy utilizando Ado para conectarme a la BD Progress y la consulta y el recordset es por el lado del Cliente y trabajo con el recordset desconectado.
No utilizo TDOLPHIN porque creo que está desarrollado para trabajar con MySql.
Adjunto el código que utilizo y en donde se observa que se reemplazó :Open() por :Execute().

Code: Select all  Expand view
FUNCTION fCreaRecSet(xcCmdSql, xoCnxSrv, xnCurType, xnLockType, xnCursor )
     LOCAL oRsLocal, oError  
     TRY
       oRsLocal := TOleAuto():New( "ADODB.RecordSet" )
     CATCH oError
       MsgStop('No se puede establecer conexion con Recordset ...!')
       ShowErrorCnx( oError )      
       RETURN NIL
     END  
     oRsLocal:Source        :=xcCmdSql
     oRsLocal:ActiveConnection:=xoCnxSrv
     oRsLocal:CursorType    :=xnCurType
     oRsLocal:LockType      :=xnLockType
     oRsLocal:CursorLocation:=xnCursor
     TRY
       *oRsLocal:Open(xcCmdSql, xoCnxSrv, xnCurType, xnLockType)
       oRsLocal:=xoCnxSrv:Execute(xcCmdSql)
       *oRsLocal:Open()
     CATCH oError
       MsgStop('No se puede establecer conexion con Recordset ...!')
       ShowErrorCnx( oError )      
       RETURN NIL
     END
     IF !oRsLocal:EOF()
       oRsLocal:MoveFirst()
     ENDIF   
     RETURN oRsLocal


Alguna sugerencia será bien recibida.

Saludos.
Atte.
Lucho Montero.
Lima - Perú.

------------------------------------------------------------
FW 12.04 + xHarbour 1.2.3 + Borland 5.8.2
LuchoMontero
 
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: groiss and 52 guests