Se demora mucho es te procedimiento en MySQL 5.7

582 views
Skip to first unread message

Carlos MauricioTorres Suárez

unread,
Dec 17, 2015, 8:31:44 AM12/17/15
to Comunidad de Visual Foxpro en Español
*****************
PROCEDURE Aumente
*****************
 SELECT SCMAE000
 nCodigo="'"+_Codigo+"'"
 mSaldo=mDebe-mHaber
 Instruccion="UPDATE SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaD=&ColumnaD+"+TRANSFORM(mDebe)
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
 Instruccion="UPDATE SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaH=&ColumnaH+"+TRANSFORM(mHaber)
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
 Instruccion="UPDATE SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaS=&ColumnaS+"+TRANSFORM(mDebe-mHaber)
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
RETURN

Gracias sus comentarios.

Saludos

Irwin Rodriguez

unread,
Dec 17, 2015, 8:35:40 AM12/17/15
to publice...@googlegroups.com
Carlos, justo antes del SQLEXEC coloca esto:

_CLIPTEXT = Instruccion
cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")

y pega aqui la consulta para leerla mejor.

Saludos!
--
DISTRIBUIDORA IRSESU, C.A
J-29947174-7
Irwin Rodríguez
- Director
Analista Programador - Freelance
+584125210679

Barquisimeto - Venezuela
Desarrollos online dentro y fuera del país

Carlos MauricioTorres Suárez

unread,
Dec 17, 2015, 4:42:55 PM12/17/15
to Comunidad de Visual Foxpro en Español
Ya le aumentamos la instruccion que nos dió pero sigue lentisimo.

Gracias

Víctor Hugo Espínola Domínguez

unread,
Dec 17, 2015, 5:24:02 PM12/17/15
to publice...@googlegroups.com
No entendiste la idea de Irwin, hazlo así:

_CLIPTEXT = Instruccion
QUIT
cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")

No te asustes, VFP se cerrará y entonces entra a tu editor de e-mail, contesta tu mensaje anterior y dale [Ctrl+V] o botón derecho/Pegar y envíanos.


Saludos,
Víctor.
Lambaré - Paraguay.

Antonio.xt

unread,
Dec 17, 2015, 5:44:03 PM12/17/15
to Comunidad de Visual Foxpro en Español
Creo que la intencion de los colegas es que copie y muestre el detalle de la sentencia SQL, ya que no se sabe que significan las variables:

ColumnaD
ColumnaH
ColumnaS
mDebe


Carlos Mauricio Torres Suárez

unread,
Dec 19, 2015, 10:59:57 AM12/19/15
to publice...@googlegroups.com
Las Columnas de la Tabla son

ColumnaD
ColumnaH
ColumnaS

Y el valor a actualizar es

mDebe

mpulla

unread,
Dec 19, 2015, 2:47:56 PM12/19/15
to Comunidad de Visual Foxpro en Español
Hola Carlos
El codigo que publicas no es claro, asi no se puede ayudar mucho

Haces 3 update en lugar de 1 y concatenas, es mejor parametrizar.

Intenta hacer
Private mDebe, mHaber, mSaldo
mDebe = 30
mHaber = 40
mSaldo = 60

Slq = [Update mitabla set debe = debe + ?mDebe, haber = haber + ?mHaber, saldo = saldo + ?mSaldo Where id = ?mId]

Sqlexec(miHandle, sql)

Saludos
Mauricio

Daniel Sánchez

unread,
Dec 19, 2015, 4:28:16 PM12/19/15
to Comunidad de Visual Foxpro en Español
Como comentan no esta claro, lo que yo no entiendo que valor o dato tiene &columnaD, &columnaH y &columnaS, ahora el otro tema no estas usando un where es decir estas aplicando modificaciones a todos los registros de tu tabla, y el segundo punto como te comenta Mauricio Pulla, podrías hacer en un solo update la actualización de los 3 campos columnad, columnah y columnas, con eso podría reducir en 2 veces el tiempo de proceso o actualización, y todo dependiendo de la cantidad de registros a actualizar, no es lo mismo actualizar 100 registro a 1 millón y peor si lo repites 3 veces.

Saludos
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Carlos MauricioTorres Suárez

unread,
Dec 19, 2015, 6:22:19 PM12/19/15
to Comunidad de Visual Foxpro en Español
Son tres campos los que tienen que actualizarse en el código nCodigo con los valores mDebe,mHaber y mDebe-mHaber pero se demora mucho tiempo, con las tablas en VFP es instantáneo.  Ya le corregimos la instrucción y le pusimos:

Instruccion="UPDATE SAI"+TRANSFORM(CONTROL.Ano)+".
SCMAE000 SET &ColumnaD=&ColumnaD+"+TRANSFORM(mDebe)+;
" WHERE Codcuenta ="+nCodigo
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")

Para que se actualice en el código nCodigo

Gracias.

Daniel Sánchez

unread,
Dec 20, 2015, 10:41:39 AM12/20/15
to Comunidad de Visual Foxpro en Español
Y sobre que motor de bd estas trabajando, seria interesante que nos muestres el resultado de tu concatenación, para ver como queda finalmente el valor de la variable instruccion.

Saludos

mpulla

unread,
Dec 21, 2015, 12:22:25 AM12/21/15
to Comunidad de Visual Foxpro en Español

Hola Carlos.

Déjate ayudar y pon la sentencia que envías al servidor, no es clara la forma en que concatenas.

Te recomiendo que:

1.- Parametrizar tu update
2.- Mientras se pueda envíes unas sola sentencia al servidor
3.- Revises si tienes un indice por el campo codcuenta

No entiendo porque es lento, una tabla con varios miles decenas de registros y sin indice, debería ser rápido.

Que tal servidor tienes?
La tabla tiene Triggers?


Saludos.
Mauricio

Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 7:19:29 AM12/21/15
to Comunidad de Visual Foxpro en Español
La Base de Datos es MySQL 5.7, sigue muy lento y eso que ya nos pasamos de Windows 10 a Windows 8.

Gracias

Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 7:26:11 AM12/21/15
to Comunidad de Visual Foxpro en Español
Las instrucciones sin macros serían la siguientes para que sea más fácil la ayuda:
 
  *****************
PROCEDURE Aumente
*****************
 nCodigo="'"+_Codigo+"'"
 mSaldo=mDebe-mHaber
 Instruccion="UPDATE SCMAE000 SET Debito_00=Debito_00+"+TRANSFORM(mDebe)
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
 Instruccion="UPDATE SCMAE000 SET Credit_00=Credit_00+"+TRANSFORM(mHaber)
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
 Instruccion="UPDATE SCMAE000 SET Saldo_00=Saldo_00+"+TRANSFORM(mSaldo)

Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 7:27:36 AM12/21/15
to Comunidad de Visual Foxpro en Español
No hay índice, no hay Triggers ni nada

Saludos

Irwin Rodriguez

unread,
Dec 21, 2015, 9:28:51 AM12/21/15
to publice...@googlegroups.com
Carlos,

1. Porque no ejecutas una sola instrucción en lugar de 3? veo que estas actualizando la misma tabla 3 veces, eso podría ahorrarte camino.

2. La actualización es para toda la tabla? porque puedes utilizar la instruccion LIMIT para condicionar el limite de registros afectados.

3. Cuántos registros tiene tu tabla SCMAE000???

Saludos!

Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 10:16:38 AM12/21/15
to Comunidad de Visual Foxpro en Español
La tabla SCMAE000 tiene 739 registros y la actualización es solamente para un registro, aquel que el código es (ncodigo).  En VFP el proceso es instantáneo pero en MySQL demora una barbaridad.

Gracias

Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 10:20:09 AM12/21/15
to Comunidad de Visual Foxpro en Español
Completando las instrucciones
*****************
PROCEDURE Aumente
*****************
 nCodigo="'"+_Codigo+"'"
 mSaldo=mDebe-mHaber
 Instruccion="UPDATE SCMAE000 SET Debito_00=Debito_00+"+TRANSFORM(mDebe)+" WHERE Codigo="+nCodigo
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
 Instruccion="UPDATE SCMAE000 SET Credit_00=Credit_00+"+TRANSFORM(mHaber)+" WHERE Codigo="+nCodigo
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
 Instruccion="UPDATE SCMAE000 SET Saldo_00=Saldo_00+"+TRANSFORM(mSaldo)+" WHERE Codigo="+nCodigo

Irwin Rodriguez

unread,
Dec 21, 2015, 10:37:10 AM12/21/15
to publice...@googlegroups.com
Entonces tienes que utilizar la clausula LIMIT nRows que te indica el numero de filas a actualizar.

Permiteme modificar tu instruccion:

nCodigo="'"+_Codigo+"'"
 mSaldo=mDebe-mHaber

 Instruccion = "UPDATE"
 Instruccion =  Instruccion + " SCMAE000"
 Instruccion =  Instruccion + " SET"
 Instruccion =  Instruccion + " Debito_00 = Debito_00 " + ALLTRIM(STR(mDebe))
 Instruccion =  Instruccion + ",Credito_00 = Credito_00 " + ALLTRIM(STR(mHaber))
 Instruccion =  Instruccion + ",Saldo_00 = Saldo_00 " + ALLTRIM(STR(mSaldo))
 Instruccion =  Instruccion + " WHERE"
 Instruccion =  Instruccion + " Codigo = " + nCodigo
 Instruccion =  Instruccion + " LIMIT 1"

 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")

Las 3 actualizaciones están dentro de un mismo UPDATE, ejecuta esa instruccion y comentas como te va.


Saludos!

Arnaldo Toledano

unread,
Dec 21, 2015, 10:52:12 AM12/21/15
to publice...@googlegroups.com
La verdad que no he seguido el hilo de tu problema.
Pero te comento lo que me paso.
Instale Mariadb versión 10, por las dudas te aclaro que MariaDb10 es igual a MySQL 5.6 o posterior.
Tenia el mismo problema que vos.
me comunique con MariaDb y me indicaron donde residía el problema.
He buscado denodadamente esos mail, pero no los encuentro.
Me aconsejaron que volviera a la versión 5.x, puesto que la versión 10 no tenia sentido que la
utilizara de acuerdo a mis necesidades.
Creo que tenes que buscar las "variaciones" del MySQL 5.7 con respecto a la versión  5.5.

Discúlpame que no pueda ayudarte mas.


Arnaldo Toledano

Víctor Hugo Espínola Domínguez

unread,
Dec 21, 2015, 11:40:24 AM12/21/15
to publice...@googlegroups.com
Procedure Aumente

mSaldo = mDebe - mHaber
Text To m.lcUpdate Textmerge Noshow Pretext 15

  Update SCMAE000 
  Set Debito_00 = Debito_00 + ?mDebe
          , Credit_00 = Credit_00 + ?mHaber
          , Saldo_00  = Saldo_00  + ?mSaldo
  Where Codigo = ?_Codigo
  Limit 1

Endtext
cmd = SQLExec(lnHandle, lcUpdate, "SCMAE000")


Saludos,
Víctor.
Lambaré - Paraguay.


Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 11:51:03 AM12/21/15
to Comunidad de Visual Foxpro en Español
Con el LIMIT 1 bajo de 3 minutos a 55 segundos actualizar 210 registros.  Si a de haber algo más rápido para VFP 9.0 SP2 y MySQL.

Gracias

Víctor Hugo Espínola Domínguez

unread,
Dec 21, 2015, 12:04:21 PM12/21/15
to publice...@googlegroups.com
Parece que estás llamando 210 veces al procedure Aumente, cómo tienes la lista de códigos a actualizar, a todos les aumentas los mismos valore?


Saludos,
Víctor.
Lambaré - Paraguay.


Irwin Rodriguez

unread,
Dec 21, 2015, 12:17:54 PM12/21/15
to publice...@googlegroups.com
No creo que sea un tema de mayor velocidad entre las herramientas, me parece que se están llamando mas de una vez a la rutina de actualizacion.

Si pudieras compartir tu rutina o metodo completo tal vez pudieramos detectar algun ciclo que se esté repitiendo.

Saludos!

El 21 de diciembre de 2015, 12:51, Carlos MauricioTorres Suárez <cama...@ctsoft.com.ec> escribió:
Con el LIMIT 1 bajo de 3 minutos a 55 segundos actualizar 210 registros.  Si a de haber algo más rápido para VFP 9.0 SP2 y MySQL.

Gracias



Carlos MauricioTorres Suárez

unread,
Dec 21, 2015, 6:10:59 PM12/21/15
to Comunidad de Visual Foxpro en Español
Les mando todo el procedimiento que llama al PROCEDURE AUMENTE.

SET CURSOR OFF
 THISFORM.Label6.Caption=TIME()
* PROCESO DE MAYORIZACION
 columnaD=Columna1
 columnaH=Columna2
 columnaS=ColSaldo
 MI_WAIT("Espere...... Encerando Saldos para re-mayorizar")
 Instruccion="UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaD=0"
 cmd=SQLEXEC(lnHandle,Instruccion)
 Instruccion="UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaH=0"
 cmd=SQLEXEC(lnHandle,Instruccion)
 Instruccion="UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaS=0"
 cmd=SQLEXEC(lnHandle,Instruccion)
 GO TOP
 WAIT CLEAR
 IF THISFORM.El_Mes.Value=13
  Instruccion="SELECT * FROM SAI"+TRANSFORM(CONTROL.Ano)+".SCMOVIM WHERE Diario='AD00000000' ORDER BY Diario"
  cmd=SQLEXEC(lnHandle,Instruccion,"SCMOVIM1")
 ELSE
  mMes=TRANSFORM(THISFORM.El_Mes.Value)
  Instruccion="SELECT * FROM SAI"+TRANSFORM(CONTROL.Ano)+".SCMOVIM WHERE MONTH(Fecha)="+mMes+" AND Diario<>'AD00000000'"+" ORDER BY Diario"
  cmd=SQLEXEC(lnHandle,Instruccion,"SCMOVIM1")
 ENDIF
 SELECT SCMOVIM1
 COUNT TO Paso
 Tamano=0.500*(100/Paso)
 i=1
 GO TOP
 tDebe=0
 tHaber=0
 mNo=0
 DO WHILE .NOT. EOF()
  mNo=mNo+1
  THISFORM.Label12.Caption=Diario
  THISFORM.Label10.Caption=TRANSFORM(mNo/Paso*100,"999.99")+"%"
  THISFORM.Label7.Caption=TIME()
  mDiario      =Diario
  mCodigo      =ALLTRIM(Codigo)
  _Codigo="'"+mCodigo+"'"
  mNombre      =Nombre
  mDebe        =Debe
  mHaber       =Haber
  tDebe=tDebe+Debe
  tHaber=tHaber+Haber
  * Proceso de Mayorización
  Instruccion="SELECT * FROM SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 WHERE Codcuenta="+_Codigo
  cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
  SELECT SCMAE000
  mCodcuenta=Codcuenta
  mNivel=Nivel
  _Codigo=mCodcuenta
  THISFORM.Codigo1.Caption=SCMAE000.Codigo
  THISFORM.Cuenta1.Caption=SCMAE000.Nombre
  DO Aumente
  DO CASE
   CASE mNivel=2
    _Codigo=SUBSTR(mCodCuenta,1,1)+"000000000000"
    DO Aumente
   CASE mNivel=3
    _Codigo=SUBSTR(mCodCuenta,1,1)+"000000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,2)+"00000000000"
    DO Aumente
   CASE mNivel=4
    _Codigo=SUBSTR(mCodCuenta,1,1)+"000000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,2)+"00000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,3)+"0000000000"
    DO Aumente
   CASE mNivel=5
    _Codigo=SUBSTR(mCodCuenta,1,1)+"000000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,2)+"00000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,3)+"0000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,5)+"00000000"
    DO Aumente
   CASE mNivel=6
    _Codigo=SUBSTR(mCodCuenta,1,1)+"000000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,2)+"00000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,3)+"0000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,5)+"00000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,7)+"000000"
    DO Aumente
   CASE mNivel=7
    _Codigo=SUBSTR(mCodCuenta,1,1)+"000000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,2)+"00000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,3)+"0000000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,5)+"00000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,7)+"000000"
    DO Aumente
    _Codigo=SUBSTR(mCodCuenta,1,11)+"00"
    DO Aumente
  ENDCASE
  THISFORM.Cuantos.Value=THISFORM.Cuantos.Value-1
  * Aquí el efecto Termómetro
  @ 12.500,42.000+i/2-1 TO 13.500,42.000+Tamano+i/2-1 ;
    PATTERN 1 ;
    PEN 1, 8 ;
    COLOR RGB(255,0,0,255,0,0)
  i=i+100/Paso
  * Hasta aquí el efecto Termómetro
  SELECT SCMOVIM1
  SKIP
  IF Diario<>mDiario
   IF tDebe<>tHaber
    MESSAGEBOX("Asiento de Diario: "+mDiario+" Descuadrado"+CHR(13)+;
    "Debe: "+TRANSFORM(tDebe)+CHR(13)+;
    "Haber: "+TRANSFORM(tHaber),0+48,mSistema)
    tDebe=0
    tHaber=0
   ENDIF
  ENDIF
 ENDDO
 =MESSAGEBOX("Listo, pulse cualquier tecla..."+CHR(13)+;
            "Puede observar Balances y Mayores"+CHR(13)+;
            "Auxiliares de Cada Cuenta",0+48,mSistema)
  @ 12.500,41.500 CLEAR TO 13.500,93.000
 SET CURSOR ON
 SELECT SCMAE000
 GO TOP
 kMes=0
 THISFORM.Commandgroup1.Command1.Enabled=.F.
 THISFORM.Refresh

Saludos

Carlos Miguel FARIAS

unread,
Dec 22, 2015, 6:30:40 AM12/22/15
to Grupo Fox
Estimado, acá revise tu código, hice pequeños cambios.

SET CURSOR OFF
RT = CHR(13)
WITH THISFORM
.Label6.CAPTION = TIME()
   * PROCESO DE MAYORIZACION
   columnaD = Columna1
   columnaH = Columna2
   columnaS = ColSaldo
   MI_WAIT("Espere...... Encerando Saldos para re-mayorizar")
   *!*   Instruccion = "UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaD = 0"
   *!*   cmd = SQLEXEC(lnHandle, Instruccion)
   *!*   Instruccion = "UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaH = 0"
   *!*   cmd = SQLEXEC(lnHandle, Instruccion)
   *!*   Instruccion = "UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaS = 0"
   *!*   cmd = SQLEXEC(lnHandle, Instruccion)
   Instruccion = "UPDATE SAI" + TRANSFORM(CONTROL.Ano)+".SCMAE000 SET &ColumnaD = 0, &ColumnaH = 0, &ColumnaS = 0"
   cmd = SQLEXEC(lnHandle, Instruccion)
   *!*   GO TOP && como estás con tablas en un SGBD este comando aqui no produce efecto
   WAIT CLEAR
   IF .El_Mes.VALUE = 13
      Instruccion = "SELECT * FROM SAI"+TRANSFORM(CONTROL.Ano)+".SCMOVIM WHERE Diario = 'AD00000000' ORDER BY Diario"
      cmd = SQLEXEC(lnHandle, Instruccion, "SCMOVIM1")
   ELSE
      mMes = TRANSFORM(.El_Mes.VALUE)
      Instruccion = "SELECT * FROM SAI"+TRANSFORM(CONTROL.Ano)+".SCMOVIM WHERE MONTH(Fecha) = "+mMes+" AND Diario<>'AD00000000'"+" ORDER BY Diario"
      cmd = SQLEXEC(lnHandle, Instruccion, "SCMOVIM1")
   ENDIF
   SELECT SCMOVIM1
   COUNT TO Paso
   *!*   Tamano = 0.500*(100/Paso)
    Tamano = 50 / Paso
   i = 1
   *!*   GO TOP && con Scan es más rápido
   STORE 0 TO tDebe, tHaber, mNo 
   *!*   tDebe = 0
   *!*   tHaber = 0
   *!*   mNo = 0
   SCAN
      *!*   DO WHILE .NOT. EOF()
      mNo = mNo + 1
      .Label12.CAPTION = Diario
      .Label10.CAPTION = TRANSFORM(mNo/Paso*100, "999.99")+"%"
      .Label7.CAPTION = TIME()
      mDiario = Diario
      mCodigo = ALLTRIM(Codigo)
      _Codigo = "'" + mCodigo + "'"
      mNombre = Nombre
      mDebe = Debe
      mHaber = Haber
      tDebe = tDebe + Debe
      tHaber = tHaber + Haber
      * Proceso de Mayorización
      Instruccion = "SELECT * FROM SAI" + TRANSFORM(CONTROL.Ano) + ".SCMAE000 WHERE Codcuenta = " + _Codigo
      cmd = SQLEXEC(lnHandle, Instruccion, "SCMAE000")
      SELECT SCMAE000
      mCodcuenta = Codcuenta
      mNivel = Nivel
      _Codigo = mCodcuenta
      .Codigo1.CAPTION = SCMAE000.Codigo
      .Cuenta1.CAPTION = SCMAE000.Nombre
      DO Aumente
      DO CASE
         CASE mNivel = 2
            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
            DO Aumente
         CASE mNivel = 3
            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
            DO Aumente
         CASE mNivel = 4
            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
            DO Aumente
         CASE mNivel = 5
            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 5) + "00000000"
            DO Aumente
         CASE mNivel = 6
            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 5) + "00000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 7) + "000000"
            DO Aumente
         CASE mNivel = 7
            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 5) + "00000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 7) + "000000"
            DO Aumente
            _Codigo = SUBSTR(mCodcuenta, 1, 11) + "00"
            DO Aumente
      ENDCASE
      .Cuantos.VALUE = .Cuantos.VALUE-1
      * Aquí el efecto Termómetro
      @ 12.500, 42.000 + i/2-1 TO 13.500, 42.000 + Tamano + i/2-1;
         PATTERN 1;
         PEN 1, 8;
         COLOR RGB(255, 0, 0, 255, 0, 0)
      i = i + 100/Paso
      * Hasta aquí el efecto Termómetro
      SELECT SCMOVIM1
      *!*      SKIP
      IF Diario<>mDiario
         IF tDebe<>tHaber
            MESSAGEBOX("Asiento de Diario: " + mDiario + " Descuadrado" + RT +;
               "Debe: " + TRANSFORM(tDebe) + RT +;
               "Haber: " + TRANSFORM(tHaber), 0 + 48, mSistema)
            tDebe = 0
            tHaber = 0
         ENDIF
      ENDIF
      *!*   ENDDO
   ENDSCAN
    = MESSAGEBOX("Listo, pulse cualquier tecla..." + RT +;
      "Puede observar Balances y Mayores" + RT +;
      "Auxiliares de Cada Cuenta", 0 + 48, mSistema)
   @ 12.500, 41.500 CLEAR TO 13.500, 93.000
   SET CURSOR ON
   SELECT SCMAE000
   GO TOP
   kMes = 0
   .Commandgroup1.Command1.ENABLED = .F.
   .REFRESH
ENDWITH

En realidad la parte mysql que podría ser lenta es la puesta a cero, que con el cambio que hago (que ya te lo indicaron antes) reemplazo las tres llamadas al SGBD por una sola (no va con WHERE allí?)
Luego tienes un bucle sobre un cursor (donde haces el termómetro), deberías chequear cuanto te demora allí, hice algunos cambios pero no creo que mejore el desempeño.
Dentro del bucle haces actualización de la interfaz de usuario, que puede estar absorbiendo gran parte del tiempo.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe

Víctor Hugo Espínola Domínguez

unread,
Dec 22, 2015, 3:13:45 PM12/22/15
to publice...@googlegroups.com
Otra causa es que por cada código se está llamando al procedure Aumente dos o más veces y por cada vez se ejecuta un Update en el servidor, mi propuesta es que por cada código se genere una lista de códigos a actualizar y de esa manera se llame a Aumente una sola vez por cada código:

*!* DO Aumente
*!*      DO CASE
*!*         CASE mNivel = 2
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
*!*            DO Aumente
*!*         CASE mNivel = 3
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
*!*            DO Aumente
*!*         CASE mNivel = 4
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
*!*            DO Aumente
*!*         CASE mNivel = 5
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 5) + "00000000"
*!*            DO Aumente
*!*         CASE mNivel = 6
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 5) + "00000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 7) + "000000"
*!*            DO Aumente
*!*         CASE mNivel = 7
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 1) + "000000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 2) + "00000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 3) + "0000000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 5) + "00000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 7) + "000000"
*!*            DO Aumente
*!*            _Codigo = SUBSTR(mCodcuenta, 1, 11) + "00"
*!*            DO Aumente
*!*      ENDCASE

lcListaCodigos = ListaCodigos(_Codigo, mNivel)
Do Aumente WITH m.lcListaCodigos, m.mNivel
......
.....

Procedure ListaCodigos
Lparameters tcCodigo As String, tnNivel As Number

Local lcListaCodigos As String, lnNivel As Number

lcListaCodigos = ['']
For lnNivel = 2 To 7
lcListaCodigos = ['] + Padr(Substr(m.tcCodigo, 1, 1), 13, [0]) + [']
If m.tnNivel = 2
Exit
Endif
lcListaCodigos = m.lcListaCodigos + [, '] + Padr(Substr(m.tcCodigo, 1, 2), 13, [0]) + [']
If m.tnNivel = 3
Exit
Endif
lcListaCodigos = m.lcListaCodigos + [, '] + Padr(Substr(m.tcCodigo, 1, 3), 13, [0]) + [']
If m.tnNivel = 4
Exit
Endif
lcListaCodigos = m.lcListaCodigos + [, '] + Padr(Substr(m.tcCodigo, 1, 5), 13, [0]) + [']
If m.tnNivel = 5
Exit
Endif
lcListaCodigos = m.lcListaCodigos + [, '] + Padr(Substr(m.tcCodigo, 1, 7), 13, [0]) + [']
If m.tnNivel = 6
Exit
Endif
lcListaCodigos = m.lcListaCodigos + [, '] + Padr(Substr(m.tcCodigo, 1, 11), 13, [0]) + [']

Endfor
lcListaCodigos = lcListaCodigos + [, '] + m.tcCodigo + [']

Return m.lcListaCodigos

Procedure Aumente
Lparameters tcListaCodigos As String, tnNivel As Number

mSaldo = mDebe - mHaber
Text To m.lcUpdate Textmerge Noshow Pretext 15

Update SCMAE000 
Set Debito_00 = Debito_00 + ?mDebe
  , Credit_00 = Credit_00 + ?mHaber
  , Saldo_00  = Saldo_00  + ?mSaldo
Where Codigo In (<<m.tcListaCodigos>>)
Limit <<m.tnNivel>>

Endtext
cmd = SQLExec(lnHandle, m.lcUpdate)



Saludos,
Víctor.
Lambaré - Paraguay.


Carlos MauricioTorres Suárez

unread,
Dec 24, 2015, 12:03:44 PM12/24/15
to Comunidad de Visual Foxpro en Español
El último proceso que nos han enviado, solamente sirve para actualizar una sola cuenta, el plan de cuentas tiene siete niveles por lo que el proceso debería servir para actualizar más  cuentas que solo una, por eso se tiene el campo nivel para ello se utiliza en el sistema.

Gracias

Irwin Rodriguez

unread,
Dec 24, 2015, 12:29:46 PM12/24/15
to publice...@googlegroups.com
Carlos, podrías compartir el código del procedure AUMENTE?? Estoy simplificando tu código pero necesito ver aguas adentro para ver que proceso tienes que pueda estas relentizando las consultas.

Saludos!

El 24 de diciembre de 2015, 12:33, Carlos MauricioTorres Suárez <cama...@ctsoft.com.ec> escribió:
El último proceso que nos han enviado, solamente sirve para actualizar una sola cuenta, el plan de cuentas tiene siete niveles por lo que el proceso debería servir para actualizar más  cuentas que solo una, por eso se tiene el campo nivel para ello se utiliza en el sistema.

Gracias



Mauricio Pulla

unread,
Dec 24, 2015, 6:09:07 PM12/24/15
to publice...@googlegroups.com

Hola Carlos
Los foxeros debemos cambiar la mentalidad de traernos toda la data para luego procesados registro por registro, imagina cuantas llamadas al Server estas haciendo, el tráfico en la red, además que es lento, en lo personal este tipo de procesos los hago en un sp con una cte recursiva, los sgdb son muy potentes, que no es necesario acumular en campos sino basta con consultas, lamentable MySQL no soporta cte recursivas por lo que tocaría buscar la forma de optimizar, aprender MySQL y estudiar tu db y eso ya tendría que facturarte jaja.

Que tengas una buena fiestas

Saludos
Mauricio

Víctor Hugo Espínola Domínguez

unread,
Dec 24, 2015, 6:30:40 PM12/24/15
to publice...@googlegroups.com
Hola Carlos

Envíanos el código para revisarlo.


Saludos,
Víctor.
Lambaré - Paraguay.


Carlos Mauricio Torres Suárez

unread,
Dec 25, 2015, 7:56:31 AM12/25/15
to publice...@googlegroups.com
Lo demás del código ya les mande, les mando el PROCEDURE Aumente
*****************
PROCEDURE Aumente
****************
 nCodigo="'"+_Codigo+"'"
 mSaldo=mDebe-mHaber
 Instruccion="UPDATE SAI"+TRANSFORM(CONTROL.Ano)+;
             ".SCMAE000 SET &ColumnaD=&ColumnaD+"+TRANSFORM(mDebe)+;
             ",&ColumnaH=&ColumnaH+"+TRANSFORM(mHaber)+;
             ",&ColumnaS=&ColumnaS+"+TRANSFORM(mSaldo)+;
             " WHERE Codcuenta ="+nCodigo+" LIMIT 1"
 cmd=SQLEXEC(lnHandle,Instruccion,"SCMAE000")
RETURN

Gracias

Carlos Miguel FARIAS

unread,
Dec 25, 2015, 9:22:59 AM12/25/15
to Grupo Fox
Acá la madre del borrego. Dentro del bucle principal, se llama en cada vuelta del bucle al menos 3 veces (SEuO) a este procedimiento, que implica llamar al SGBD.
Creo que todo el proceso amerita, repensar que es lo que se quiere hacer, porque veo muchas operaciones con cadena, que no me permiten entender que se hace, creo quedaría más claro, y posiblemente más rápido con un TEXT ENDTEXT.

Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe.
FELIZ NAVIDAD!!!

Víctor Hugo Espínola Domínguez

unread,
Dec 25, 2015, 11:56:07 AM12/25/15
to publice...@googlegroups.com
Ese código debe ser cambiado a: 


Saludos,
Víctor.
Lambaré - Paraguay.


Víctor Hugo Espínola Domínguez

unread,
Dec 25, 2015, 11:59:23 AM12/25/15
to publice...@googlegroups.com
Otro detalle:

Padr(Substr(m.tcCodigo, 1, 2), 13, [0])

es mejor cambiar a:

Padr(Left(m.tcCodigo, 2), 13, [0])

de la misma manera los demás Substr.

Saludos,
Víctor.
Lambaré - Paraguay.


Daniel Sánchez

unread,
Dec 26, 2015, 1:07:42 PM12/26/15
to Comunidad de Visual Foxpro en Español
Según mi trabajo con plan de cuentas contables, el que tenga muchos niveles no significa que todas las cuentas permitan acumular valores en sus cuentas es decir debe haber cuentas que sirvan para registrar y otras para acumular ejemplo

10 Caja y Bancos (No admitir Movimientos-NAM)
101 Cajas (NAM)
10101 Caja Principal
10102 Caja Sucursal 01
10103 Caja Sucursal 02
...
104 Bancos (NAM)
10401 Banco BCP (NAM)
1040101 Cta. Cte. Soles
1040102 Cta. Cte. Dolares
10402 Banco Interbank (NAM)
1040201 Cta. Cte. Soles
1040202 Cta. Cte. Soles
...

En este caso me parece y es más rápido hacer lo siguiente (yo lo aplico a mis consultas para obtener lo que deseas), una consulta donde hago la sumatoria de los registros agrupados por cuenta así

select codigocuenta, sum(debe) as tdebe, sum(haber) as thaber 
      from tablamovimientosomayor
       where periodo=2015 mesperiodo<=?almesconsultar
       group by codigocuenta

ahora para esto ya tengo mi tabla de plan de cuentas en local obtenida de una consulta previa, igual que la consulta anterior ya tengo 2 tablas una con el plan de cuentas y otra con la sumatoria de las cuentas utilizadas, así que ya no necesitas ir y volver al servidor a realizar las mismas sumatorias muchas veces, ya todo esta en local, ahora si es necesario acumular por cada cuenta recorres tu tabla de plan de cuentas y le vas asignando sus valores que están en la tabla que has realizado la sumatoria.

Con este método aplico para generar mi hoja de trabajo y mi Balance de comprobación y con movimientos de miles de registros lo hace en menos de 15 segundos para realizar una consulta de todo un año o periodo contable.

Saludos


El 24 de diciembre de 2015, 12:03, Carlos MauricioTorres Suárez <cama...@ctsoft.com.ec> escribió:
El último proceso que nos han enviado, solamente sirve para actualizar una sola cuenta, el plan de cuentas tiene siete niveles por lo que el proceso debería servir para actualizar más  cuentas que solo una, por eso se tiene el campo nivel para ello se utiliza en el sistema.

Gracias



Daniel Sánchez

unread,
Dec 26, 2015, 1:31:44 PM12/26/15
to Comunidad de Visual Foxpro en Español
Otro tema que estoy viendo es que creas una tabla por año

UPDATE "+"SAI"+TRANSFORM(CONTROL.Ano)+....

me parece que estas aplicando el criterio cuando se trabajaba con tablas dbf y que era conveniente trabajar con tablas por periodos para que no se demore las consultas y poder acceder más rápido a los datos.

En el caso de un gestor de bd como sqlserver, mysql y otro similar, eso ya no es necesario ya que están preparados para manejar tablas con miles y millones de registros y de acuerdo a los indices y otros criterios obtener o extraer datos de ellos de la manera más rápido posible así que trabajar con tablas por periodos es poco recomendable o mejor dicho innecesario, ahí estas complicando tu programación, yo manejo tablas que tienen información de 10 años y el tamaño de la bd no bajan de 5gb y el rendimiento del mismo no ha perdido su velocidad, trabajando en local con 20 pc´s así como con sucursales conectados por internet, lo que si hay que tener bien puesto los indices apropiadamente para optimizar las consultas, una buena cantidad de memoria tanto ram como en disco duro.

Saludos

Carlos MauricioTorres Suárez

unread,
Dec 26, 2015, 5:27:25 PM12/26/15
to Comunidad de Visual Foxpro en Español
Nuestro problema no estar en hacer consultas sino en actualizar los valores de cada una de las cuentas de la tabla SCMAE000, primero se actualiza el de la cuenta _Codigo y luego debe subir de nivel y actualizar el cuenta de mayor y así hasta las del nivel1.

1110 Caja
111   Caja-Bancos
11     Activos Corrientes
1      Activos

Gracias

Víctor Hugo Espínola Domínguez

unread,
Dec 26, 2015, 7:16:12 PM12/26/15
to publice...@googlegroups.com
Hola Carlos

El procedimiento ListaCodigos devuelve la lista en la forma '1000000000000', '1100000000000', '1110000000000', '1110100000000', y esta lista va al servidor con la sentencia:
UPDATE ....  WHERE ?tnCodigo IN ('1000000000000', '1100000000000', '1110000000000', '1110100000000') 

Avisa si no lo puedes implementar, y te envío el método completo.


Saludos,
Víctor.
Lambaré - Paraguay.


Daniel Sánchez

unread,
Dec 26, 2015, 9:46:22 PM12/26/15
to Comunidad de Visual Foxpro en Español
Lo que te planteo es que obtengas los valores acumuladas de las cuentas y luego vas actualizando cada cuenta, lo que haces tu según parece es que lees la cuenta y buscas su acumulado y vas a la siguiente y vuelves a leer su acumulado, lo que te propongo es el método inverso, obtengo los acumulados y luego actualizo mi tabla del plan de cuentas, es decir sumo una vez y actualizo las veces necesarias, es decir desde el cursor con los datos acumulado ya obtenidos. Según tu criterio si tengo 7 niveles sumo 7 veces los acumulados por cada cuenta y así sucesivamente si tengo un plan de cuentas de 1500 cuentas (aunque parezca mucho es posible) realizas 1500 veces la suma de cada cuenta en el servidor para ir actualizando cada cuenta contable con su valor. En mi caso seria así:

tabla acumulados
codigocuenta, tdebe, thaber
...
1040101, 10000, 5000
1040102, 12000, 9500
1040103, 8700, 3600
1040201, 3500, 2600
1040202, 6900, 5300
...

segun el plan de cuentas que te indique anteriormente tu tendrías que poner la suma de cada cuenta de acuerdo a su nivel, suponiendo que vamos solo a ver las cuentas que tengo en mi tabla acumulados mi plan de cuentas seria como este

tabla plandecuentas
...
104 Bancos (NAM)
10401 Banco BCP (NAM)
1040101 Cta. Cte. Soles
1040102 Cta. Cte. Dolares
10402 Banco Interbank (NAM)
1040201 Cta. Cte. Soles
1040202 Cta. Cte. Soles
...

sele plandecuentas
scan 
     store 0 to ndebe, nhaber
     nsaldo=obtenersaldos(alltrim(codigocuenta))
     sele plandecuentas
     replace debe, with ndebe, haber with nhaber, saldo with nsaldo
endscan 

*/
function obtenersaldos(ccodigo)
nlen=len(ccodigo)
sele acumulados
sum tdebe, thaber to ndebe, nhaber for left(codigocuenta,nlen)=ccodigo
nsaldos=ndebe-nhaber
return 

Ahora si tu tabla plandecuentas es un cursor actualizable automáticamente se actualizaría los datos en su fuente de origen, sus valores serian así

codigocuena, debe, haber, saldo
104, 41100, 26000, 15100
10401, 30700, 18100, 12600
1040101 ,10000, 5000, 5000
1040102 ,12000, 9500, 2500
10402,10400, 7900, 2500
1040201,3500, 2600, 900
1040202,6900, 5300, 1600


Saludos

Carlos MauricioTorres Suárez

unread,
Dec 28, 2015, 9:20:43 AM12/28/15
to Comunidad de Visual Foxpro en Español
Les agradezco muchisimo toda la ayuda de ustedes compañeros del Foro, pero para mi el problema es del MySQL porque me cambié a SQL SERVER y lo que el Sistema en MySQL se demora 20 minutos en SQL SERVER se demora 1 minuto lo cual es mejor, nos quedamos con SQL SERVER que creemos que es mejor.  El programa hace lo mismo.

Gracias, Saludos

Irwin Rodriguez

unread,
Dec 28, 2015, 9:38:22 AM12/28/15
to publice...@googlegroups.com
Eso que afirmas es debatible Carlos pero en hora buena que lograstes drasticamente resolver tu problema, espero que más adelante no te vayas a cambiar a algun otro SGBD cuando SQLSERVER se demore, mi consejo es que te documentes un poco más acerca de la metodología "Cliente/Servidor" en este paradigma son cruciales las funciones y procedimientos almacenados.

Suerte!!!

El 28 de diciembre de 2015, 10:20, Carlos MauricioTorres Suárez <cama...@ctsoft.com.ec> escribió:
Les agradezco muchisimo toda la ayuda de ustedes compañeros del Foro, pero para mi el problema es del MySQL porque me cambié a SQL SERVER y lo que el Sistema en MySQL se demora 20 minutos en SQL SERVER se demora 1 minuto lo cual es mejor, nos quedamos con SQL SERVER que creemos que es mejor.  El programa hace lo mismo.

Gracias, Saludos



Víctor Hugo Espínola Domínguez

unread,
Dec 28, 2015, 10:26:08 AM12/28/15
to publice...@googlegroups.com
Si ya decidiste abandonar MySql, debes tener en cuenta que SqlServer es de pago (MySql también); considero que mejores opciones son PostgreSql y MariaDb.

Si envías el código que estás usando podemos mejorarlo.


Saludos,
Víctor.
Lambaré - Paraguay.


Arnaldo Toledano

unread,
Dec 28, 2015, 12:38:29 PM12/28/15
to publice...@googlegroups.com
Te reitero mi mail anterior.

La verdad que no he seguido el hilo de tu problema.
Pero te comento lo que me paso.
Instale Mariadb versión 10, por las dudas te aclaro que MariaDb10 es igual a MySQL 5.6 o posterior.
Tenia el mismo problema que vos.
me comunique con MariaDb y me indicaron donde residía el problema.
He buscado denodadamente esos mail, pero no los encuentro.
Me aconsejaron que volviera a la versión 5.x, puesto que la versión 10 no tenia sentido que la
utilizara de acuerdo a mis necesidades.
Creo que tenes que buscar las "variaciones" del MySQL 5.7 con respecto a la versión  5.5.

Discúlpame que no pueda ayudarte mas.

Reinstala la version anterior a la 5.6 y tu problema desaparecera.


Arnaldo Toledano

mpulla

unread,
Dec 28, 2015, 6:40:02 PM12/28/15
to Comunidad de Visual Foxpro en Español
Hola Carlos.

Estoy de acuerdo con lo que dice Irwin, debes documentarte bien en la metodología "Cliente/Servidor", la forma en que procesas consume muchos recursos, tiene que entender que los SGDB están hechos para trabajar con conjuntos de datos y lo que dices que en Sql Server demora un minuto es demasiado para lo que pretendes, Sql Server tiene otras herramientas que te simplifican las cosas ademas de optimizarlas.

En lo personal me gusta Sql Server, pero si tendría que irme por otra SGDB sería Postgresql gratis, muy potente y con iguales o mejores prestaciones que Sql Server.

Lo que te comenta Arnaldo puede darte una solución, puede ser que la versión que usas no tenga algún bug.

Un SGDB tiene un perform de acuerdo a la buenas o malas practicas.

Saludos.
Mauricio


Carlos Miguel FARIAS

unread,
Dec 29, 2015, 5:43:54 AM12/29/15
to Grupo Fox
Coincido con los colegas.
Si cada vez que tienes un problema de desempeño vas a cambiar de SGBD, estás en serios problemas. Que en tu caso, el cambio de tiempos puede ser circunstancial, pero no por optimización, si no por casualidad.
Por ejemplo, una pauta de que enfocastes mal el problema es que no mostraste hasta último momento (y por pedido del foro) la rutina aumente, que es a mi entender parte del cuello de botella (genera más I-O al SGBD que el resto del código).
Y se ve dentro del código, mucha reconstrucción de cosas que podrían estar fuera del bucle central y no componerlas dentro del bucle central.
En fin, a veces, hay que revisar que hace el código, de nuevo, hacer refactoring o reingenieria antes de corregir lo que fue evolucionando y se fue de madre.
Para los creyentes (y anticipando el viernes), estaban los dinosaurios, se fueron de madre, meteorito, destrucción de casi todo, y a rehacer, el ser humano, haciendo cosas "sucias", diluvio universal y a repoblar. Y si seguimos jodiendo, calentamiento global y la m...
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe con el refactoring

Saúl Piña

unread,
Dec 29, 2015, 10:27:30 AM12/29/15
to Comunidad de Visual Foxpro en Español
Si, estoy de acuerdo, "Refactoring" ja,ja,ja

Manuel Vaez

unread,
Mar 2, 2016, 6:48:40 AM3/2/16
to Comunidad de Visual Foxpro en Español
Estimado has probado con crear índices en tu base de datos??
Reply all
Reply to author
Forward
0 new messages