In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Xailer y MariaDB, algo raro help

Foro público de Xailer en español
Responder
Hugo Navarro
Mensajes: 159
Registrado: Mié Jul 23, 2008 2:53 am

Xailer y MariaDB, algo raro help

Mensaje por Hugo Navarro »

Hola
Buena Noche..
Gracias por su amable atención.

Tengo Xailer 4.0.2 con MariaDB
Windows 8.1

Me pasa lo siguiente.

Tengo un proceso que me ReCalcula las existencias del mes y las entradas y salidas.
Lo ejecuto por primera ves y todo mal.
Lo ejecuto por segunda ves y todo bien.

Tengo que Ejecturar este proceso en dos ocasiones para que realice su función correctamente.

Ya me lo pille en otros procesos también.

Que requiero para que esto funcione correctamente.

Saludos y Gracias..
Hugo Navarro.
Hugo Navarro
Mensajes: 159
Registrado: Mié Jul 23, 2008 2:53 am

Re: Xailer y MariaDB, Resuelto

Mensaje por Hugo Navarro »

Hola...

No se les ocurra ni de chiste..
Cargar tablas grandes.

Se vuelve loca la base de datos.

Saludos y Gracias..
Hugo Navarro
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Xailer y MariaDB, algo raro help

Mensaje por jfgimenez »

Hugo,

quizás al comenzar el proceso estás abriendo una transacción y al final no la estás cerrando, y al ejecutarlo una segunda vez cierras la transacción antes de empezar. Aparte de eso, no se me ocurre nada. Intenta explicar mejor qué estás haciendo y cómo para intentar ayudarte.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Hugo Navarro
Mensajes: 159
Registrado: Mié Jul 23, 2008 2:53 am

Re: Xailer y MariaDB, José F. Giménez

Mensaje por Hugo Navarro »

Hola Buena Noche..
José F. Giménez

Reportandome.


El Bien, Funciona OK
El Mal, Ya no funciona correctamente, hace locuras.

bien..........................................................................
METHOD BtnAceptar( oSender ) CLASS TInv_Recalculo

Local cKpro, dFent, dFsal
Local dFec1, dFec2
Local n1Uent, n1Usal
Local n1Cent, n1Csal
Local n2Uent, n2Usal
Local nCosu, nCosp, dFecu
Local aXalma, n, i, cKalm
Local cKper := Left( DToS( Inv_Cfg_Fecp ), 6 )

::oButton1:lEnabled := .F.
::oButton2:lEnabled := .F.

WITH OBJECT ::oSQLQ_CPROC
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT KPRO FROM Inv_Productos"
:aSQLParams := {}
:lOpen := .T.
END WITH

dFec1 := Inv_Cfg_Fec1
dFec2 := Inv_Cfg_Fec2

AppData:oMDB_DS1:RollBackTrans()
AppData:oMDB_DS1:BeginTrans()

AppData:oMDB_DS1:Execute( [UPDATE Inv_Productos ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII] )

AppData:oMDB_DS1:Execute( [UPDATE Inv_KarPer ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII ] +;
[WHERE KPER=] + cKper )

LOK := AppData:oMDB_DS1:CommitTrans()
IF !LOK
AppData:oMDB_DS1:RollBackTrans()
MsgStop( "No se Inicializaron los Archivos" )
Return Nil
ENDIF

::oProgressBar1:nMin := 0
::oProgressBar1:nStep := 1

AppData:oMDB_DS1:BeginTrans()

WITH OBJECT ::oSQLQ_CPROC
::oProgressBar1:nMax := :RecCount()

:GoTop()
DO WHILE !:Eof()
cKpro := :KPRO
dFent := ""
dFsal := ""
::oLblKPRO:cText := cKpro
::oLblENT:cText := ""
::oLblSAL:cText := ""
::oProgressBar1:nValue ++

n1Uent := 0
n1Cent := 0
n2Uent := 0
dFecu := CToD("//")
nCosu := 0

n1Usal := 0
n1Csal := 0
n2Usal := 0

WITH OBJECT ::oSQLQ_CPROK
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_Productos WHERE KPRO=?"
:aSQLParams := { cKpro }
:lOpen := .T.

IF :Edit()

:C1_ENTM := 0
:C1_SALM := 0
:C1_AJUS := 0
:C1_EXIF := 0
:C1_COEM := 0
:C1_COSM := 0
:C2_ENTM := 0
:C2_SALM := 0
:C2_AJUS := 0
:C2_EXIF := 0

*-> Calcula Las E/S Del Mes En Proceso

WITH OBJECT ::oSQLQ_MovPar
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_MovPar WHERE KPRO=? AND FECHA >=? AND FECHA <=? ORDER BY KALM,KPRO,TMOV,FECHA"
:aSQLParams := { cKpro, dFec1, dFec2 }
:lOpen := .T.
aXalma := {}

:GoTop()
Do While !:Eof()

*1 Kalm+Kpro
*2 n1Uent 0
*3 n1Usal 0
*4 n1Cent 0
*5 n1Csal 0
*6 nCosu 0
*7 dFecu date, ""
*8 n2Uent 0
*9 n2Usal 0

::oLblENT:cText := DToC( :FECHA )

n := aiseek( @aXalma, 1, :KALM+:KPRO, { :KALM+:KPRO, 0, 0, 0, 0, 0, CToD("//"), 0, 0 } )

IF :TMOV < "50"
IF :TMOV == "02"
n1Uent -= :CANT1
n1Cent -= :IMPO
n2Uent -= :CANT2

aXalma[n,2] -= :CANT1
aXalma[n,4] -= :IMPO
aXalma[n,8] -= :CANT2

ELSE
n1Uent += :CANT1
n1Cent += :IMPO
dFecu := :FECHA
nCosu := :COSTO
n2Uent += :CANT2

aXalma[n,2] += :CANT1
aXalma[n,4] += :IMPO
aXalma[n,8] += :CANT2

aXalma[n,6] := :COSTO
aXalma[n,7] := :FECHA

ENDIF
ELSE
IF :TMOV == "52"
n1Usal -= :CANT1
n2Usal -= :CANT2

aXalma[n,3] -= :CANT1
aXalma[n,9] -= :CANT2
ELSE
n1Usal += :CANT1
n2Usal += :CANT2

aXalma[n,3] += :CANT1
aXalma[n,9] += :CANT2
ENDIF
ENDIF
:Skip()
Enddo

END WITH

*-> Actualiza Productos (Entradas y Salidas)
:FECULT := dFecu
:ULTCOS := nCosu
:C1_ENTM := n1Uent
:C1_COEM := n1Cent
:C1_SALM := n1Usal
:COSPRO := div( (:C1_EXII * :C1_COIM) + :C1_COEM, :C1_EXII + :C1_ENTM )

nCosp := :COSPRO

:C2_ENTM := n2Uent
:C2_SALM := n2Usal

*-> Costea las Salidas

WITH OBJECT ::oSQLQ_MovPar
IF :lOpen
:GoTop()

n1Csal := 0

Do While !:Eof()

::oLblSAL:cText := DToC( :FECHA )

n := aiseek( @aXalma, 1, :KALM+:KPRO, { :KALM+:KPRO, 0, 0, 0, 0, 0, "", 0, 0 } )

IF :TMOV > "50"
IF :Edit()
:FLEXI := "0"
:FLFEC := "0"
:COSTO := nCosp
:IMPO := :CANT1 * nCosp
:Update()
:Commit()
IF :TMOV == "52"
n1Csal -= :IMPO

aXalma[n,5] -= :IMPO
ELSE
n1Csal += :IMPO

aXalma[n,5] += :IMPO
ENDIF
ENDIF
ELSE
IF :FLEXI == "1" .OR. :FLFEC == "1"
IF :Edit()
:FLEXI := "0"
:FLFEC := "0"
:Update()
ENDIF
ENDIF
ENDIF

:Skip()
Enddo

ENDIF

:lOpen := .F.
END WITH

*-> Actualiza Costo de las salidas y existencia.

:C1_COSM := n1Csal
:C1_EXIF := :C1_EXII + :C1_ENTM - :C1_SALM
:C2_EXIF := :C2_EXII + :C2_ENTM - :C2_SALM

*-> Afecta Kardex por Peridodo, almacen y Producto

FOR i := 1 to Len( aXalma )
cKalm := Left( aXalma[i,1], 2 )
cKpro := right( aXalma[i,1], 10 )

WITH OBJECT ::oSQLQ_KarPer
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM INV_KarPer where CONCAT(KPER,KALM,KPRO)=?"
:aSQLParams := { cKper+cKalm+cKpro }
:lOpen := .T.

IF :Eof()
:AddNew()
:KPER := cKper
:KALM := Left(aXalma[i,1],2)
:KPRO := cKpro
:C1_COIA := nCosu
:C1_COIM := nCosu
ELSE
:Edit()
ENDIF

:C1_ENTM := 0
:C1_SALM := 0
:C1_AJUS := 0
:C1_EXIF := 0
:C1_COEM := 0
:C1_COSM := 0

:C2_ENTM := 0
:C2_SALM := 0
:C2_AJUS := 0
:C2_EXIF := 0

IF !Empty( aXalma[n,7] )
:FECULT := Max( :FECULT, aXalma[i,7] )
ENDIF

:ULTCOS := aXalma[i,6]
:COSPRO := nCosp

:C1_ENTM := aXalma[i,2]
:C1_SALM := aXalma[i,3]
:C1_EXIF := :C1_EXII + :C1_ENTM - :C1_SALM

:C1_COEM := aXalma[i,4]
:C1_COSM := aXalma[i,5]

:C2_ENTM := aXalma[i,8]
:C2_SALM := aXalma[i,9]
:C2_EXIF := :C2_EXII + :C2_ENTM - :C2_SALM

:Update()
:Commit()

:lOpen := .F.
END WITH
NEXT

:Update()
:Commit()
ENDIF

:lOpen := .F.
END WITH

:Skip()
ENDDO

END WITH

LOK := AppData:oMDB_DS1:CommitTrans()

::oButton2:lEnabled := .T.
::Close()

IF LOK
MsgInfo( "Proceso Efectuado con Exito", "Recalculo" )
ENDIF

RETURN Nil
....................................................................................................

Mal..............................................................................................
METHOD BtnAceptar( oSender ) CLASS TInv_Recalculo

Local cKpro, dFent, dFsal
Local dFec1, dFec2
Local n1Uent, n1Usal
Local n1Cent, n1Csal
Local n2Uent, n2Usal
Local nCosu, nCosp, dFecu
Local aXalma, n, i, cKalm
Local cKper := Left( DToS( Inv_Cfg_Fecp ), 6 )

::oButton1:lEnabled := .F.
::oButton2:lEnabled := .F.

WITH OBJECT ::oSQLQ_CPROC
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT KPRO FROM Inv_Productos"
:aSQLParams := {}
:lOpen := .T.
END WITH

dFec1 := Inv_Cfg_Fec1
dFec2 := Inv_Cfg_Fec2

AppData:oMDB_DS1:RollBackTrans()
AppData:oMDB_DS1:BeginTrans()

AppData:oMDB_DS1:Execute( [UPDATE Inv_Productos ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII] )

AppData:oMDB_DS1:Execute( [UPDATE Inv_KarPer ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII ] +;
[WHERE KPER=] + cKper )

LOK := AppData:oMDB_DS1:CommitTrans()
IF !LOK
AppData:oMDB_DS1:RollBackTrans()
MsgStop( "No se Inicializaron los Archivos" )
Return Nil
ENDIF

::oProgressBar1:nMin := 0
::oProgressBar1:nStep := 1

AppData:oMDB_DS1:BeginTrans()

WITH OBJECT ::oSQLQ_CPROC
::oProgressBar1:nMax := :RecCount()

:GoTop()
DO WHILE !:Eof()
cKpro := :KPRO
dFent := ""
dFsal := ""
::oLblKPRO:cText := cKpro
::oLblENT:cText := ""
::oLblSAL:cText := ""
::oProgressBar1:nValue ++

n1Uent := 0
n1Cent := 0
n2Uent := 0
dFecu := CToD("//")
nCosu := 0

n1Usal := 0
n1Csal := 0
n2Usal := 0

WITH OBJECT ::oSQLQ_CPROK
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_Productos WHERE KPRO=?"
:aSQLParams := { cKpro }
:lOpen := .T.

IF :Edit()

:C1_ENTM := 0
:C1_SALM := 0
:C1_AJUS := 0
:C1_EXIF := 0
:C1_COEM := 0
:C1_COSM := 0
:C2_ENTM := 0
:C2_SALM := 0
:C2_AJUS := 0
:C2_EXIF := 0

*-> Calcula Las E/S Del Mes En Proceso

WITH OBJECT ::oSQLQ_MovPar
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_MovPar WHERE KPRO=? AND FECHA >=? AND FECHA <=? ORDER BY KALM,KPRO,TMOV,FECHA"
:aSQLParams := { cKpro, dFec1, dFec2 }
:lOpen := .T.
aXalma := {}

:GoTop()
Do While !:Eof()

*1 Kalm+Kpro
*2 n1Uent 0
*3 n1Usal 0
*4 n1Cent 0
*5 n1Csal 0
*6 nCosu 0
*7 dFecu date, ""
*8 n2Uent 0
*9 n2Usal 0

::oLblENT:cText := DToC( :FECHA )

n := aiseek( @aXalma, 1, :KALM+:KPRO, { :KALM+:KPRO, 0, 0, 0, 0, 0, CToD("//"), 0, 0 } )

IF :TMOV < "50"
IF :TMOV == "02"
n1Uent -= :CANT1
n1Cent -= :IMPO
n2Uent -= :CANT2

aXalma[n,2] -= :CANT1
aXalma[n,4] -= :IMPO
aXalma[n,8] -= :CANT2

ELSE
n1Uent += :CANT1
n1Cent += :IMPO
dFecu := :FECHA
nCosu := :COSTO
n2Uent += :CANT2

aXalma[n,2] += :CANT1
aXalma[n,4] += :IMPO
aXalma[n,8] += :CANT2

aXalma[n,6] := :COSTO
aXalma[n,7] := :FECHA

ENDIF
ELSE
IF :TMOV == "52"
n1Usal -= :CANT1
n2Usal -= :CANT2

aXalma[n,3] -= :CANT1
aXalma[n,9] -= :CANT2
ELSE
n1Usal += :CANT1
n2Usal += :CANT2

aXalma[n,3] += :CANT1
aXalma[n,9] += :CANT2
ENDIF
ENDIF
:Skip()
Enddo

END WITH

*-> Actualiza Productos (Entradas y Salidas)
:FECULT := dFecu
:ULTCOS := nCosu
:C1_ENTM := n1Uent
:C1_COEM := n1Cent
:C1_SALM := n1Usal
:COSPRO := div( (:C1_EXII * :C1_COIM) + :C1_COEM, :C1_EXII + :C1_ENTM )

nCosp := :COSPRO

:C2_ENTM := n2Uent
:C2_SALM := n2Usal

*-> Costea las Salidas

WITH OBJECT ::oSQLQ_MovPar
IF :lOpen
:GoTop()

n1Csal := 0

Do While !:Eof()

::oLblSAL:cText := DToC( :FECHA )

n := aiseek( @aXalma, 1, :KALM+:KPRO, { :KALM+:KPRO, 0, 0, 0, 0, 0, "", 0, 0 } )

IF :TMOV > "50"
IF :Edit()
:FLEXI := "0"
:FLFEC := "0"
:COSTO := nCosp
:IMPO := :CANT1 * nCosp
:Update()
:Commit()
IF :TMOV == "52"
n1Csal -= :IMPO

aXalma[n,5] -= :IMPO
ELSE
n1Csal += :IMPO

aXalma[n,5] += :IMPO
ENDIF
ENDIF
ELSE
IF :FLEXI == "1" .OR. :FLFEC == "1"
IF :Edit()
:FLEXI := "0"
:FLFEC := "0"
:Update()
ENDIF
ENDIF
ENDIF

:Skip()
Enddo

ENDIF

:lOpen := .F.
END WITH

*-> Actualiza Costo de las salidas y existencia.

:C1_COSM := n1Csal
:C1_EXIF := :C1_EXII + :C1_ENTM - :C1_SALM
:C2_EXIF := :C2_EXII + :C2_ENTM - :C2_SALM

*-> Afecta Kardex por Peridodo, almacen y Producto

FOR i := 1 to Len( aXalma )
cKalm := Left( aXalma[i,1], 2 )
cKpro := right( aXalma[i,1], 10 )

WITH OBJECT ::oSQLQ_KarPer
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM INV_KarPer where CONCAT(KPER,KALM,KPRO)=?"
:aSQLParams := { cKper+cKalm+cKpro }
:lOpen := .T.

IF :Eof()
:AddNew()
:KPER := cKper
:KALM := Left(aXalma[i,1],2)
:KPRO := cKpro
:C1_COIA := nCosu
:C1_COIM := nCosu
ELSE
:Edit()
ENDIF

:C1_ENTM := 0
:C1_SALM := 0
:C1_AJUS := 0
:C1_EXIF := 0
:C1_COEM := 0
:C1_COSM := 0

:C2_ENTM := 0
:C2_SALM := 0
:C2_AJUS := 0
:C2_EXIF := 0

IF !Empty( aXalma[n,7] )
:FECULT := Max( :FECULT, aXalma[i,7] )
ENDIF

:ULTCOS := aXalma[i,6]
:COSPRO := nCosp

:C1_ENTM := aXalma[i,2]
:C1_SALM := aXalma[i,3]
:C1_EXIF := :C1_EXII + :C1_ENTM - :C1_SALM

:C1_COEM := aXalma[i,4]
:C1_COSM := aXalma[i,5]

:C2_ENTM := aXalma[i,8]
:C2_SALM := aXalma[i,9]
:C2_EXIF := :C2_EXII + :C2_ENTM - :C2_SALM

:Update()
:Commit()

:lOpen := .F.
END WITH
NEXT

:Update()
:Commit()
ENDIF

:lOpen := .F.
END WITH

:Skip()
ENDDO

END WITH

LOK := AppData:oMDB_DS1:CommitTrans()

::oButton2:lEnabled := .T.
::Close()

IF LOK
MsgInfo( "Proceso Efectuado con Exito", "Recalculo" )
ENDIF

RETURN Nil

............................................................................................................
Ya realice pruebas de todo tipo.
En otro equipo.
De Todo.

Saludos y Gracias...
Hugo Navarro
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Xailer y MariaDB, algo raro help

Mensaje por ignacio »

Buenos días,

Es imposible seguir su código, lo siento. En cualquier caso tengo la impresión de que no está utilizando toda la potencia que le ofrece SQL. Le aconsejo que utilice las funciones de agregación de SQL, como Count(), Max(), Min() y las cláusulas GROUP BY .. HAVING.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Hugo Navarro
Mensajes: 159
Registrado: Mié Jul 23, 2008 2:53 am

Re: Xailer y MariaDB, simplifico

Mensaje por Hugo Navarro »

Hola
José F.

Te mando el código simplificado.
Explico.

En este proceso Afecto 2 tablas;
Inv_KarPer, esta se afecta bien todo el tiempo.
Inv_Productos, se afecta "Mal" y "Bien".

En las 2 formas en que realizo el proceso, lo que varia
es que en "Mal" abro toda la tabla Inv_Productos.
En el "Bien" realizo búsqueda del Producto, proceso, grabo y Cierro Query.

Codigo de "Mal"

METHOD BtnAceptar( oSender ) CLASS TInv_Recalculo
Local cKpro, dFent, dFsal
Local dFec1, dFec2
Local n1Uent, n1Usal
Local n1Cent, n1Csal
Local n2Uent, n2Usal
Local nCosu, nCosp, dFecu
Local aXalma, n, i, cKalm
Local cKper := Left( DToS( Inv_Cfg_Fecp ), 6 )

WITH OBJECT ::oSQLQ_CPRO
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_Productos"
:aSQLParams := {}
:lOpen := .T.
END WITH

AppData:oMDB_DS1:BeginTrans()

AppData:oMDB_DS1:Execute( [UPDATE Inv_Productos ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII] )

AppData:oMDB_DS1:Execute( [UPDATE Inv_KarPer ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII ] +;
[WHERE KPER=] + cKper )


AppData:oMDB_DS1:BeginTrans()

WITH OBJECT ::oSQLQ_CPRO
::oProgressBar1:nMax := :RecCount()

:GoTop()
DO WHILE !:Eof()
cKpro := :KPRO

IF :Edit()
*...............

*-> Calcula Las E/S Del Mes En Proceso

WITH OBJECT ::oSQLQ_MovPar
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_MovPar WHERE KPRO=? AND FECHA >=? AND FECHA <=? ORDER BY KALM,KPRO,TMOV,FECHA"
:aSQLParams := { cKpro, dFec1, dFec2 }
:lOpen := .T.
aXalma := {}

:GoTop()
Do While !:Eof()

*....................

:Skip()
Enddo

END WITH

*-> Actualiza Productos (Entradas y Salidas)
*................................................


*-> Costea las Salidas

*-> Actualiza Costo de las salidas y existencia.

*-> Afecta Kardex por Peridodo, almacen y Producto

FOR i := 1 to Len( aXalma )
cKalm := Left( aXalma[i,1], 2 )
cKpro := right( aXalma[i,1], 10 )

WITH OBJECT ::oSQLQ_KarPer
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM INV_KarPer where CONCAT(KPER,KALM,KPRO)=?"
:aSQLParams := { cKper+cKalm+cKpro }
:lOpen := .T.

IF :Eof()
:AddNew()
*......................
ELSE
:Edit()
ENDIF

*...................................
:Update()
:Commit()

:lOpen := .F.
END WITH
NEXT

:Update()
:Commit()
ENDIF

:Skip()
ENDDO

END WITH

LOK := AppData:oMDB_DS1:CommitTrans()

IF LOK
MsgInfo( "Proceso Efectuado con Exito", "Recalculo" )
ENDIF

RETURN Nil

*-----------------------------------------------------------------------------------------------------------------------------

Codigo "Bien"

METHOD BtnAceptar( oSender ) CLASS TInv_Recalculo

Local cKpro, dFent, dFsal
Local dFec1, dFec2
Local n1Uent, n1Usal
Local n1Cent, n1Csal
Local n2Uent, n2Usal
Local nCosu, nCosp, dFecu
Local aXalma, n, i, cKalm
Local cKper := Left( DToS( Inv_Cfg_Fecp ), 6 )

WITH OBJECT ::oSQLQ_CPROC
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT KPRO FROM Inv_Productos"
:aSQLParams := {}
:lOpen := .T.
END WITH

AppData:oMDB_DS1:BeginTrans()

AppData:oMDB_DS1:Execute( [UPDATE Inv_Productos ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII] )

AppData:oMDB_DS1:Execute( [UPDATE Inv_KarPer ] +;
[SET C1_ENTM=0,] +;
[C1_SALM=0,] +;
[C1_COEM=0,] +;
[C1_COSM=0,] +;
[C1_EXIF=C1_EXII,] +;
[C2_ENTM=0,] +;
[C2_SALM=0,] +;
[C2_EXIF=C2_EXII ] +;
[WHERE KPER=] + cKper )

WITH OBJECT ::oSQLQ_CPROC

:GoTop()
DO WHILE !:Eof()
cKpro := :KPRO

WITH OBJECT ::oSQLQ_CPROK
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_Productos WHERE KPRO=?"
:aSQLParams := { cKpro }
:lOpen := .T.

IF :Edit()

*...........................................

*-> Calcula Las E/S Del Mes En Proceso

WITH OBJECT ::oSQLQ_MovPar
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM Inv_MovPar WHERE KPRO=? AND FECHA >=? AND FECHA <=? ORDER BY KALM,KPRO,TMOV,FECHA"
:aSQLParams := { cKpro, dFec1, dFec2 }
:lOpen := .T.
*.............................

END WITH

*-> Actualiza Productos (Entradas y Salidas)

*-> Costea las Salidas

WITH OBJECT ::oSQLQ_MovPar
IF :lOpen
:GoTop()

Do While !:Eof()

n := aiseek( @aXalma, 1, :KALM+:KPRO, { :KALM+:KPRO, 0, 0, 0, 0, 0, "", 0, 0 } )

:Skip()
Enddo

ENDIF

:lOpen := .F.
END WITH

*-> Actualiza Costo de las salidas y existencia.

*-> Afecta Kardex por Peridodo, almacen y Producto

FOR i := 1 to Len( aXalma )
cKalm := Left( aXalma[i,1], 2 )
cKpro := right( aXalma[i,1], 10 )

WITH OBJECT ::oSQLQ_KarPer
:oDataSource := AppData:oMDB_DS1
:cSelect := "SELECT * FROM INV_KarPer where CONCAT(KPER,KALM,KPRO)=?"
:aSQLParams := { cKper+cKalm+cKpro }
:lOpen := .T.

IF :Eof()
:AddNew()
*........................
ELSE
:Edit()
ENDIF

IF !Empty( aXalma[n,7] )
:FECULT := Max( :FECULT, aXalma[i,7] )
ENDIF
*................................

:Update()
:Commit()

:lOpen := .F.
END WITH
NEXT

:Update()
:Commit()
ENDIF

:lOpen := .F.
END WITH

:Skip()
ENDDO

END WITH

LOK := AppData:oMDB_DS1:CommitTrans()

IF LOK
MsgInfo( "Proceso Efectuado con Exito", "Recalculo" )
ENDIF

RETURN Nil


Saludos y Gracias..
Hugo Navarro
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Xailer y MariaDB, algo raro help

Mensaje por jfgimenez »

Hugo,

me temo que no podemos revisar ese código. Lo primero es que se trata de muchas líneas, que tendríamos que estudiar durante un buen rato para tratar de comprenderlas. Y segundo que está muy ligado al resto de tu programa, con llamadas a funciones que no están ahí y siguiendo una lógica de funcionamiento que no conocemos.

Si quieres, prepáranos un pequeñísimo ejemplo y que sea autocontenido. Lo mejor es crear un proyecto nuevo, y si compila bien es que no falta nada.

En cualquier caso, con SQL en general, y con MySQL en particular, impera una regla muy básica... haz la menor cantidad de llamadas posibles al servidor. Es preferible ejecutar un comando que modifique 10.000 líneas, antes que 100 comandos que modifiquen una línea cada uno (fíjate en la proporción 100 a 1). Así que, aunque no nos guste, o nos dé pereza, o incluso que no sepamos cómo abordarlo de primeras, es preferible pararse a pensar cómo se puede hacer una determinada tarea en SQL. A mí mismo me paso hace unos meses... tenía un proceso que se ejecutaba con bucles donde se ejecutaban sentencias. El proceso demoraba unos 20 minutos en total, con una base de datos media (unas 100.000 líneas de atículos). Al final, me senté y me puse a revisarlo completamente. Me costó unas cuantas horas, pero ahora ese mismo proceso, y con la misma BD tarda unos 12 segundos ;-)
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Hugo Navarro
Mensajes: 159
Registrado: Mié Jul 23, 2008 2:53 am

Re: Xailer y MariaDB, algo raro help

Mensaje por Hugo Navarro »

Hola...

Me parece bien.

Deja preparo algo y con gusto.

Agradezco tus recomendaciones, son verdaderas, nos gusten o no,
es mejor ser bien tacaños con los recursos y llamadas al servidor,
de echo ya estoy programando de esa manera.

Sobre todo cuando estos sistemas operan en interntet.

Saludos y Gracias..
Hugo Navarro
Responder