Page 1 of 2

Consulta Ado con Fw vs VB - Solucionado

Posted: Sat Jun 20, 2015 9:47 pm
by LuchoMontero
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


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

   
/ ***  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

Re: Consulta Ado con Fw vs VB

Posted: Sun Jun 21, 2015 10:11 pm
by Antonio Linares
Lucho,

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

Re: Consulta Ado con Fw vs VB

Posted: Mon Jun 22, 2015 3:42 pm
by LuchoMontero
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


  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

     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


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

Re: Consulta Ado con Fw vs VB

Posted: Mon Jun 22, 2015 4:43 pm
by Antonio Linares
Lucho,

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

Re: Consulta Ado con Fw vs VB

Posted: Mon Jun 22, 2015 5:27 pm
by LuchoMontero
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

"(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

"(PUB.artagru.c_artag = 21) AND (PUB.carga.idSucur = 1)"
 
Esta es la cadena de la consulta para FW:

Code: Select all

     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

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


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

Code: Select all

rs.Open SQL, cCnx, adOpenStatic
 

Re: Consulta Ado con Fw vs VB

Posted: Mon Jun 22, 2015 6:33 pm
by Antonio Linares
Si haces el WHERE exactamente igual que en VB6, usando un valor fijo

la diferencia de tiempos se mantiene ?

Re: Consulta Ado con Fw vs VB

Posted: Mon Jun 22, 2015 7:51 pm
by LuchoMontero
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

 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
 

Re: Consulta Ado con Fw vs VB

Posted: Mon Jun 22, 2015 9:56 pm
by Antonio Linares
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.

Re: Consulta Ado con Fw vs VB

Posted: Tue Jun 23, 2015 6:17 am
by lucasdebeltran
Hola,

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

Tendrás que modificar adofuncs.prg para adaptarlo.

Re: Consulta Ado con Fw vs VB

Posted: Tue Jun 23, 2015 12:19 pm
by Adolfo
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

Re: Consulta Ado con Fw vs VB

Posted: Tue Jun 23, 2015 12:20 pm
by Antonio Linares
Adolfo,

Parece que no está usando AdoRdd...

Re: Consulta Ado con Fw vs VB

Posted: Tue Jun 23, 2015 2:15 pm
by lucasdebeltran
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.

Re: Consulta Ado con Fw vs VB

Posted: Tue Jun 23, 2015 3:54 pm
by leandro
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

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

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.

Re: Consulta Ado con Fw vs VB

Posted: Tue Jun 23, 2015 6:59 pm
by AHF
google translator:

Si la consulta es usar muchas veces este es un trabajo DBA
Prueba MySql Query Analyser.

Re: Consulta Ado con Fw vs VB

Posted: Tue Jul 14, 2015 7:27 am
by LuchoMontero
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

 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