DATASESSION en formularios

213 views
Skip to first unread message

Edwin Duran

unread,
Jun 17, 2020, 2:58:39 PM6/17/20
to Comunidad de Visual Foxpro en Español
Buenas tardes

Tengo la siguiente inquietud, mis formularios los tengo con datasession = 2, si cierros mis formulario las datas se cierran, hasta ahí todo bien, pero dentro del formulario llamó una clase que abre otras tabla dbf, pero cuando cierro el formulario esas tablas no se cierran se queda con otra  datasession.

Como puedo controlar que se quede en a misma datasession del formulario.

Gracias

Francisco Lorente

unread,
Jun 18, 2020, 7:13:44 AM6/18/20
to Comunidad de Visual Foxpro en Español
Hola Edwin.

¿De que clase deriva la clase que tienes en el formulario?

Saludos.
Francisco Lorente.
Murcia. España.

mapner

unread,
Jun 18, 2020, 8:22:57 AM6/18/20
to Comunidad de Visual Foxpro en Español
Hola,

hay que ver la Datasession de la clase llamada desde tus formularios, y como destruyes esa clase luego que el formulario se cierra, posible no se está destruyendo adecuadamente.

Saludos 

Edwin Duran

unread,
Jun 18, 2020, 11:00:12 AM6/18/20
to Comunidad de Visual Foxpro en Español
Buenas Con Zarlu hicimos pruebas, hicimo un ejemplo en limpio y no funciono, copiamos el ejemplo de Zarlu en mi maquina y ese trabajo, pero tendré que revisar mi entorno de trabajo y mirar que tengo

Pablo Flores

unread,
Jun 18, 2020, 11:43:25 AM6/18/20
to publice...@googlegroups.com
Hola.. se me ocurre esto:
En tu formulario tener una propiedad en el cual se graba el numero de datasession de la clase y en el método unload del formulario hacer un set datasession de la clase y cerrar las tablas que consideres.
Saludos
Pablo Flores 

Enviado desde Outlook Mobile


From: publice...@googlegroups.com <publice...@googlegroups.com> on behalf of Edwin Duran <edwinn...@gmail.com>
Sent: Thursday, June 18, 2020 12:00:11 PM
To: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Subject: [vfp] Re: DATASESSION en formularios
 
--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/7a84dbe8-5e2f-4b0c-90dd-847adb953d74o%40googlegroups.com.

Edwin Duran

unread,
Jun 18, 2020, 1:03:22 PM6/18/20
to Comunidad de Visual Foxpro en Español
GRacias ya eso lo hice y nada

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publice...@googlegroups.com.

Antonio Meza

unread,
Jun 18, 2020, 1:56:18 PM6/18/20
to Comunidad de Visual Foxpro en Español
* Las tablas dbf que abres desde tu clase es solo consulta o haces modificaciones en ellas?

* Desde que parte del formulario con sesión privada estas llamando a tu clase?

* Esa clase a demás abre las tablas al momento de ser llamada o lo hace desde antes?

saludos
Antonio Meza

Edwin Duran

unread,
Jun 18, 2020, 2:03:09 PM6/18/20
to Comunidad de Visual Foxpro en Español
Contesto e cada pregunta


El jueves, 18 de junio de 2020, 13:56:18 (UTC-4), Antonio Meza escribió:
* Las tablas dbf que abres desde tu clase es solo consulta o haces modificaciones en ellas?
Es solo consultas
* Desde que parte del formulario con sesión privada estas llamando a tu clase?
 session = 2
* Esa clase a demás abre las tablas al momento de ser llamada o lo hace desde antes?
Una Parte desde el formulario pero las mayorías desde la clase.

Antonio Meza

unread,
Jun 18, 2020, 2:51:15 PM6/18/20
to Comunidad de Visual Foxpro en Español
* Las tablas dbf que abres desde tu clase es solo consulta o haces modificaciones en ellas?
Es solo consultas
Si solo vas a consultar es mejor usar cursores o vistas locales de consulta, de esta forma la tabla no esta expuesta a un apagón.

* Desde que parte del formulario con sesión privada estas llamando a tu clase?
 session = 2
De que parte, load, init y como la llamas, ejemplo de código Set Procedure, CreateObject, NewObject ?

* Esa clase a demás abre las tablas al momento de ser llamada o lo hace desde antes?
Una Parte desde el formulario pero las mayorías desde la clase.
Puedes mostrar parte del código de la clase donde abres las tablas y el formulario como ejecuta la clase para abrirlas?

Lo mas fácil es que dentro de tu propia clase crees un evento Destroy que se va a ejecutar cuando destruyas el objeto y ahí cierras las tablas que hayas abierto.

Pregunta adicional, porque sigues usando DBFs ?

saludos
Antonio Meza

Jorge Kiernan

unread,
Jun 18, 2020, 3:36:39 PM6/18/20
to publicesvfoxpro
Probaste en la clase invocada, cambiar el estado de la sesion de datos a 1, predeterminada ?
No lo he probado a nivel de una clase, pero  cuando en un formulario "principal" con datasession = 2, llamo a un 2do formulario dependiente que tiene asignado datasession = 1 , las tablas abiertas por ese 2do formulario, se cierran al cerrar el formulario del cual fue invocado.
Quizas esto te sea util. Suerte.


--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/3a5ee8e2-a3b4-48ca-97f5-5d786a3b0776o%40googlegroups.com.

Edwin Duran

unread,
Jun 18, 2020, 9:18:45 PM6/18/20
to Comunidad de Visual Foxpro en Español


El jueves, 18 de junio de 2020, 14:51:15 (UTC-4), Antonio Meza escribió:
* Las tablas dbf que abres desde tu clase es solo consulta o haces modificaciones en ellas?
Es solo consultas
Si solo vas a consultar es mejor usar cursores o vistas locales de consulta, de esta forma la tabla no esta expuesta a un apagón.
Las manejo como cursores 

* Desde que parte del formulario con sesión privada estas llamando a tu clase?
 session = 2
De que parte, load, init y como la llamas, ejemplo de código Set Procedure, CreateObject, NewObject ?
he probado con ambas CreateObject, NewObject 
 
* Esa clase a demás abre las tablas al momento de ser llamada o lo hace desde antes?
Una Parte desde el formulario pero las mayorías desde la clase.
Puedes mostrar parte del código de la clase donde abres las tablas y el formulario como ejecuta la clase para abrirlas?
 

Lo mas fácil es que dentro de tu propia clase crees un evento Destroy que se va a ejecutar cuando destruyas el objeto y ahí cierras las tablas que hayas abierto.

Pregunta adicional, porque sigues usando DBFs ?
     Es una aplicación que la estoy migrando poco a poco a sqlserver y todavía está híbrida 

Antonio Meza

unread,
Jun 19, 2020, 10:38:58 AM6/19/20
to Comunidad de Visual Foxpro en Español
Con esas respuestas a regañadientes no te puedo ayudar jajajajajajajajajaj

saludos
Antonio Meza

Edwin Duran

unread,
Jun 19, 2020, 12:53:29 PM6/19/20
to Comunidad de Visual Foxpro en Español
jejej Antonio Perdón

 es que estoy medio automático con cosas que peha han pedido para hoy y lo querían hecho la semana pasada, anexo parte del código dentro de la clase

parameter Lcobtipo_alma,Lfecha, txtcod_alma_desde, txtcod_alma_hasta,tabla_existencia,Lperiodo,Lcod_labor_ini,Lcod_labor_fin,LCMercado

*Set DataSession To this.dataSession
*SET STEP ON
Local ldocumento,lturno, ltipo_mov, lalmacen, lmercado, Llabor, lretorno,LImprimir_costo
LImprimir_costo = .F.
junto = .F.
lretorno = .F.
rtipo_listado = ""
Fecha_inicial_proceso = Datetime()

If Empty(Lfecha)
_Messagebox("Fecha no validad",16,"A v i s o")
Return .F.
Endif
If Year(Lfecha) <> Lperiodo
_Messagebox("El año que tiene el periodo no es igual a la de la fecha",16,"A v i s o")
Return .F.
Endif

Ldfecha= "Spmovalma.fec_mov <=Lfecha "

otxtcod_alma_desde = txtcod_alma_desde
otxtcod_alma_hasta = txtcod_alma_hasta



If otxtcod_alma_hasta < otxtcod_alma_desde
_Messagebox("El almacen Hasta no puede ser menor que el almancen Desde",16,"A v i s o")
Return .F.
Endif

Do Case
Case Empty(LCMercado)
lmercado     ='(NOT (Spdetalle_mov.cod_merc == ( ".." )))'
lhit_mercado ='(NOT (Sphistorico.cod_merc   == ( ".." )))'
Otherwise
lmercado     = " Spdetalle_mov.cod_merc = '"+Allt(LCMercado)+"' "
lhit_mercado = " Sphistorico.cod_merc   = '"+Allt(LCMercado)+"' "
Endcase


If Empty(Lcod_labor_ini) And Empty(Lcod_labor_fin)
Llabor = '(NOT (Spdetalle_mov.cod_labor == ( "" )))'
Else
If Lcod_labor_fin < Lcod_labor_ini
_Messagebox("La Labor Hasta no puede ser menor que el Labor Desde",16,"A v i s o")
*Thisform.txtcod_labor_fin.SetFocus
Return .F.
Endif
Llabor = "Spdetalle_mov.cod_labor >= lcod_labor_ini and Spdetalle_mov.cod_labor<=lcod_labor_fin"
Endif



WaitWindow("Procesando Movimiento("+tabla_existencia+"), Espere un momento...", "NOWAIT", 0)

*Set Step On
****con este SQL traigo los movimientos por fecha
Select Spdetalle_mov.periodo, Spdetalle_mov.tipo_alma,;
Spdetalle_mov.documento, Spdetalle_mov.cod_labor, Splabor.nom_labor,Splabor.costo,Splabor.STOCK,;
Spdetalle_mov.cod_merc, Spmercado.nom_merc, Sum(Spdetalle_mov.cantidad) As cantidad,;
Spmovalma.cod_turno, Spmovalma.fec_mov, Spmovalma.semana,;
Spmovalma.tipo_mov, Spmovalma.cod_alma_desde, Spmovalma.cod_alma_hasta;
FROM ;
bdproducc!Spdetalle_mov ;
INNER Join bdproducc!Spmercado ;
ON  Spdetalle_mov.cod_merc   == Spmercado.cod_merc ;
INNER Join bdproducc!Spmovalma ;
ON  Spdetalle_mov.documento  == Spmovalma.documento   And  Spdetalle_mov.tipo_alma == Spmovalma.tipo_alma ;
INNER Join bdproducc!Splabor ;
ON  Spdetalle_mov.cod_labor  == Splabor.cod_labor  And  Spdetalle_mov.tipo_alma == Splabor.tipo_alma;
WHERE  Spdetalle_mov.periodo == Lperiodo;
AND Spmovalma.periodo == Lperiodo;
AND Spdetalle_mov.tipo_alma  == Lcobtipo_alma;
AND &Ldfecha;
AND &lmercado;
AND &Llabor;
group By Spdetalle_mov.tipo_alma, Spdetalle_mov.cod_labor,Spmercado.cod_merc,Spmovalma.tipo_mov,Spmovalma.cod_alma_desde, Spmovalma.cod_alma_hasta,Spmovalma.fec_mov;
order By Spmovalma.fec_mov Into Cursor Tmp_repmovialma Readwrite

Select Tmp_repmovialma
*brows
If Reccount() = 0
lretorno = .T.
_Messagebox("No se encontraron datos en esta busqueda","A v i s o")
Return .F.
Endif

****************************
**existencias iniciales
*!* If Empty(Thisform.cobcod_merc.Value)
*!* lhit_mercado='(NOT (Sphistorico.cod_merc == ( ".." )))'
*!* Endif

If Empty(Lcod_labor_ini) And Empty(Lcod_labor_fin)
lhit_labor = '(NOT (Sphistorico.cod_labor == ( "" )))'
Else
If Lcod_labor_fin < Lcod_labor_ini
_Messagebox("La Labor Hasta no puede ser menor que el Labor Desde",16,"A v i s o")

Return .F.
Endif
lhit_labor = "Sphistorico.cod_labor >= Lcod_labor_ini and Sphistorico.cod_labor<=Lcod_labor_fin"
Endif

If Empty(otxtcod_alma_desde) And Empty(otxtcod_alma_hasta)
lhit_almacen = "Sphistorico.cod_alma>0"
Else
lhit_almacen = "Sphistorico.cod_alma>=otxtcod_alma_desde and  Sphistorico.cod_alma<=otxtcod_alma_hasta"
Endif


Lhit_grupo = "Group By Sphistorico.tipo_alma, Sphistorico.cod_merc, Sphistorico.cod_labor;
          ORDER By Sphistorico.tipo_alma, Sphistorico.cod_merc, Sphistorico.cod_labor"

Select Tmp_repmovialma


If !Used("Sphistorico")
Use Sphistorico  In 0
Select Sphistorico
Endif
WaitWindow("Agregando incentario Inicial("+tabla_existencia+"), Espere un momento...", "NOWAIT", 0)

Select Tmp_repmovialma

Insert Into Tmp_repmovialma;
Select Sphistorico.periodo, Sphistorico.tipo_alma, 1 As documento, Sphistorico.cod_labor, Splabor.nom_labor,Splabor.costo,Splabor.STOCK,Sphistorico.cod_merc,;
Spmercado.nom_merc, Sum(inv_inicial) As cantidad, 1 As cod_turno, Date(2011,01,01) As fec_mov,1 As semana, "I" As tipo_mov,;
Sphistorico.cod_alma As cod_alma_desde, 0 As cod_alma_hasta;
FROM ;
bdproducc!Sphistorico ;
INNER Join bdproducc!Splabor On  Sphistorico.tipo_alma == Splabor.tipo_alma And  Sphistorico.cod_labor == Splabor.cod_labor ;
INNER Join bdproducc!Spmercado On  Sphistorico.cod_merc  == Spmercado.cod_merc ;
INNER Join bdproducc!Almacen On  Sphistorico.tipo_alma == Almacen.tipo_alma And  Sphistorico.cod_alma == Almacen.cod_alma;
WHERE  Sphistorico.periodo == Lperiodo;
AND Sphistorico.tipo_alma==Lcobtipo_alma;
AND &lhit_almacen;
AND &lhit_mercado;
AND &lhit_labor;
&Lhit_grupo

*Select Tmp_exi_inicial

Select Tmp_repmovialma
*brows
If Reccount() = 0
_Messagebox("No se encontraron datos en esta busqueda","A v i s o")
Return .F.
Endif

*Brows

*!* ***************************


Select Tmp_repmovialma
cDate=" / /    "
LFEC_INI = Ctod(cDate)
LFEC_FIN = Ctod(cDate)

LPeriodo_mes = 0

If Used("temphistorico")
Select temphistorico && nota esta tabla se crea en la funcion =existencia_aldia()
Zap
Endif

Select Tmp_repmovialma

Go Top
*Set Step On
*brow
WaitWindow("Procesando existencias("+tabla_existencia+"), Espere un momento...", "NOWAIT", 0)
Store 0 To lcantida2, lcantida1
Scan &&en esta funcion guarda acumulado las informaciones segun el tipo de movimiento
ltipo_mov = Tmp_repmovialma.tipo_mov
lcantidad = Tmp_repmovialma.cantidad
llfecha = Tmp_repmovialma.fec_mov
ll= 1

If ll = 1 Or ll = 2  && entradas y salidas
=existencia_aldia(Lperiodo, Lcobtipo_alma, cod_alma_desde, cod_labor ,cod_merc ,ltipo_mov, lcantidad, cod_alma_hasta,"")
Else
If ll = 3 &&Traspaso de un almacen a otro

=existencia_aldia(Lperiodo, Lcobtipo_alma, cod_alma_desde, cod_labor ,cod_merc ,ltipo_mov, lcantidad2, cod_alma_hasta,"")
Select Tmp_repmovialma && esta talbla temporal se crea en el programa funciones.prg
=existencia_aldia(Lperiodo, Lcobtipo_alma, cod_alma_hasta, cod_labor ,cod_merc ,ltipo_mov, lcantidad , cod_alma_hasta,"")
Endif
Endif
Endscan


If  !Used("temphistorico")
_Messagebox("No se encontraron datos en (temphistorico) para relizar esta operación","A v i s o")
Return .F.
Endif
Select temphistorico
*Brows
*************************************************************



Lgrupo = "Group By  temphistorico.tipo_alma,temphistorico.cod_merc, temphistorico.cod_labor ;
          ORDER By temphistorico.tipo_alma, temphistorico.cod_merc, temphistorico.cod_labor"

lcod_alma= 1
*ralmacen1 ="TODOS"
Lbackorder = 0

*****Mercado***************
Do Case
Case Empty(LCMercado)
lmercado='(NOT (temphistorico.cod_merc == ( ".." )))'
Otherwise
* lmercado="temphistorico.cod_merc==ALLTRIM(Lccod_merc)"
lmercado="temphistorico.cod_merc== '"+Allt(LCMercado)+"' "

Endcase

If Empty(Lcod_labor_ini) And Empty(Lcod_labor_fin)
Llabor = '(NOT (temphistorico.cod_labor == ( "" )))'

Else
If Lcod_labor_fin < Lcod_labor_ini
_Messagebox("La Labor Hasta no puede ser menor que el Labor Desde",16,"A v i s o")

Return .F.
Endif
Llabor = "temphistorico.cod_labor >= Lcod_labor_ini and temphistorico.cod_labor<=Lcod_labor_fin"

Endif

If Empty(otxtcod_alma_desde) And Empty(otxtcod_alma_hasta)
lalmacen = "temphistorico.cod_alma>0"
Else
lalmacen = "temphistorico.cod_alma>=otxtcod_alma_desde and  temphistorico.cod_alma<=otxtcod_alma_hasta"
Endif

*SET STEP ON
WaitWindow("Acumulando los movimiento("+tabla_existencia+"), Espere un momento...", "NOWAIT", 0)

Select temphistorico.periodo, temphistorico.tipo_alma,;
1 As cod_alma, Almacen.nom_alma, temphistorico.cod_labor, Splabor.nom_labor, Splabor.costo, Splabor.STOCK, Splabor.cant_paquete, Splabor.gru_labor,;
temphistorico.cod_merc, Spmercado.nom_merc,;
SUM(temphistorico.inv_inicial) As inicial,;
SUM(entrada_mes) As produccion,;
SUM(salida_mes) As salida,;
SUM(otra_entrada) As otra_entrada,;
SUM(trasp_ent_mes) As traspaso_entrada,;
SUM(trasp_sal_mes) As traspaso_salida,;
SUM(descatalog_mes) As descatalogado,;
SUM(vental_mes) As vental,;
SUM(ventag_mes) As ventag,;
CAST(0 As Integer) As backorder,;
CAST(0 As Integer) As cant_mixta,;
((Sum(temphistorico.inv_inicial)+Sum(temphistorico.entrada_mes)+Sum(temphistorico.otra_entrada)+Sum(temphistorico.trasp_ent_mes))-(Sum(temphistorico.salida_mes)+Sum(temphistorico.trasp_sal_mes)+Sum(temphistorico.descatalog_mes)+Sum(temphistorico.vental_mes)+Sum(temphistorico.ventag_mes))) As existencia,;
CAST(0 As Integer) As Cant_backorder, Cast(0 As Integer) As Cant_terminada, Cast(0 As Integer) As Bal_backorder_labor,;
SPLABOR.Stock_minimo_producc;
FROM temphistorico ;
INNER Join bdproducc!Splabor On  temphistorico.tipo_alma == Splabor.tipo_alma And  temphistorico.cod_labor == Splabor.cod_labor;
INNER Join bdproducc!Spmercado On  temphistorico.cod_merc  == Spmercado.cod_merc;
INNER Join bdproducc!Almacen On  temphistorico.tipo_alma == Almacen.tipo_alma And  temphistorico.cod_alma  == Almacen.cod_alma;
WHERE  temphistorico.periodo == Lperiodo;
AND temphistorico.tipo_alma  == Lcobtipo_alma;
AND &lalmacen;
AND &Llabor;
AND &lmercado;
&Lgrupo;
HAVING ((Sum(temphistorico.inv_inicial)+Sum(temphistorico.entrada_mes)+Sum(temphistorico.otra_entrada)+Sum(temphistorico.trasp_ent_mes))-(Sum(temphistorico.salida_mes)+Sum(temphistorico.trasp_sal_mes)+Sum(temphistorico.descatalog_mes)+Sum(temphistorico.vental_mes)+Sum(temphistorico.ventag_mes))) <> 0;
INTO Cursor &tabla_existencia Readwrite

*INTO Cursor Tmp_repexialma Readwrite

Select &tabla_existencia &&Tmp_repexialma
Index On Alltrim(tipo_alma)+ Alltrim(cod_merc)  + Alltrim(cod_labor) Tag buscar
Index On tipo_alma+ cod_labor + cod_merc  Tag buscar1
Index On Alltrim(gru_labor)  + Alltrim(cod_labor)    Tag buscar2
Index On Alltrim(cod_labor)    Tag cod_labor
*brows
* Messagebox( datetime()-Fecha_inicial_proceso)
*Endproc
********************************
*Fin buscar existencias
********************************




Reply all
Reply to author
Forward
0 new messages