Consulta Ado con Fw vs VB - Solucionado

LuchoMontero
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú
Contact:

Consulta Ado con Fw vs VB - Solucionado

Post 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 | Expand

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

   / ***  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.
User avatar
Antonio Linares
Site Admin
Posts: 42584
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 38 times
Been thanked: 86 times
Contact:

Re: Consulta Ado con Fw vs VB

Post by Antonio Linares »

Lucho,

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

Antonio Linares
www.fivetechsoft.com
LuchoMontero
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú
Contact:

Re: Consulta Ado con Fw vs VB

Post 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 | Expand

  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

     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

Option Explicit'Database fields names from SQL queryConst 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_AMOUNTConst 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 + xCmdSql5Dim cCnx As ADODB.ConnectionPrivate CONS As StringPrivate 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 SelectEnd SubPrivate 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)  EndEnd SubPrivate 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 WithEnd Sub


Saludos.
Atte.
Lucho Montero.
Lima - Perú.
------------------------------------------------------------------------
FW 12.04 + xHarbour 1.2.3 + Borland 5.8.2
User avatar
Antonio Linares
Site Admin
Posts: 42584
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 38 times
Been thanked: 86 times
Contact:

Re: Consulta Ado con Fw vs VB

Post by Antonio Linares »

Lucho,

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

Antonio Linares
www.fivetechsoft.com
LuchoMontero
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú
Contact:

Re: Consulta Ado con Fw vs VB

Post 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 | Expand

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

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


Esta es la cadena de la consulta para FW:

Code: Select all | Expand

     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

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

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


- VB6:

Code: Select all | Expand

rs.Open SQL, cCnx, adOpenStatic 
User avatar
Antonio Linares
Site Admin
Posts: 42584
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 38 times
Been thanked: 86 times
Contact:

Re: Consulta Ado con Fw vs VB

Post by Antonio Linares »

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
LuchoMontero
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú
Contact:

Re: Consulta Ado con Fw vs VB

Post 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 | Expand

 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 
User avatar
Antonio Linares
Site Admin
Posts: 42584
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 38 times
Been thanked: 86 times
Contact:

Re: Consulta Ado con Fw vs VB

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

Re: Consulta Ado con Fw vs VB

Post by lucasdebeltran »

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
Adolfo
Posts: 861
Joined: Tue Oct 11, 2005 11:57 am
Location: Chile
Contact:

Re: Consulta Ado con Fw vs VB

Post 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
;-) Ji,ji,ji... buena la cosa... "all you need is code"

http://www.xdata.cl - Desarrollo Inteligente
----------
Asus TUF F15, 32GB Ram, 2 * 1 TB NVME M.2, GTX 1650
User avatar
Antonio Linares
Site Admin
Posts: 42584
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 38 times
Been thanked: 86 times
Contact:

Re: Consulta Ado con Fw vs VB

Post by Antonio Linares »

Adolfo,

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

Antonio Linares
www.fivetechsoft.com
User avatar
lucasdebeltran
Posts: 1303
Joined: Tue Jul 21, 2009 8:12 am
Contact:

Re: Consulta Ado con Fw vs VB

Post 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.
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
leandro
Posts: 1770
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 49 times
Been thanked: 12 times
Contact:

Re: Consulta Ado con Fw vs VB

Post 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 | Expand

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

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()EndDooRrsDeu: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

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
AHF
Posts: 838
Joined: Fri Feb 10, 2006 12:14 pm

Re: Consulta Ado con Fw vs VB

Post by AHF »

google translator:

Si la consulta es usar muchas veces este es un trabajo DBA
Prueba MySql Query Analyser.
Regards
Antonio H Ferreira
LuchoMontero
Posts: 13
Joined: Mon Jul 16, 2012 10:31 am
Location: Lima, Perú
Contact:

Re: Consulta Ado con Fw vs VB

Post 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 | Expand

 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
Post Reply