Las dbf como las debo abrir en dialogo no modales

Las dbf como las debo abrir en dialogo no modales

Postby artu01 » Fri Oct 21, 2016 10:24 pm

Amigos esa es mi pregunta, las debo de abrir todas de una vez y cerrarlas cuando salga del menu principal,
ya que tengo muchos problemas para saber si esta abierto o cerrado las tablas cuando quiero entrar a la misma opcion mas de una vez
Otra pregunta es para capturar un dato de un browse en no modal pareceria que no lee esta parte de mi codigo: Return ( aValRet )
A continuacion mi codigo

Code: Select all  Expand view


FUNCTION Brwartic( nTipo, labre)
   LOCAL aRect, oBtn
   
   AbreDbf("ARTICULO", .T., .F. , , cPathDBFE, {"articulo"  }, "Articulos" ) )
   
   REDEFINE LISTBOX oBrw                                           ;
      FIELDS ARTICULO->Cod                                         ;
            ,ARTICULO->DesG                                        ;
            ,Transform(ARTICULO->Pv, "999.9999")                   ;
            ," "                                                   ;
      FIELDSIZES 70, 250,120, 90, 10                               ;
      HEADERS OemToAnsi("C¢digo")                                  ;
            ,OemToAnsi("Descripci¢n")                              ;
            ,"Precio S/."                                          ;
            ," "                                                   ;
      COLOR 0, RGB(192,210,192)                                    ;
      ID 5000 OF oDlg                                              ;
      UPDATE                                                       ;
      ACTION ChTag("ARTICULO", 1, oBrw)                            ;
            ,ChTag("ARTICULO", 2, oBrw)

   oBrw:aJustify  := { .F., .F.,.F., .T., .F. }

    oBrw:bKeyDown   := { |nKey| ProcMtn(nKey, nTipo) }
    oBrw:bLDblClick := { || ProcMtn( 13, nTipo )     }

   REDEFINE BUTTON oBtn ID ID_CANCEL OF oDlg ;
      ACTION (  oDlg:End()  ) CANCEL   // ==> boton salir, cierra el browse Ok
      oBtn:cTooltip := "Sale de la ventana"

   REDEFINE BUTTON oBtn ID ID_NEW OF oDlg    ;
      ACTION ( ProcMtn(VK_INSERT) )
      oBtn:cTooltip := "Ingresa un nuevo registro"

   REDEFINE BUTTON oBtn ID ID_CHANGE OF oDlg ;
      ACTION ( ProcMtn(VK_RETURN) )
      oBtn:cTooltip := "Modifica el registro"

   REDEFINE BUTTON oBtn ID ID_DEL OF oDlg    ;
      ACTION ( ProcMtn(VK_DELETE) )
      oBtn:cTooltip := "Borra el registro"

   IF nTipo <> 1
      REDEFINE BUTTON oBtn ID ID_ENTER OF oDlg  ;
         ACTION ( aValRet:={oDbfArt:Cod, oDbfArt:DESG, oDbfArt:uM}; //Boton enter para que el usuario seleccione la fila que desea seleccinar
                 ,oDlg:End() ) CANCEL
         oBtn:cTooltip := "Selecciona un registro"    
   ENDIF

   ACTIVATE DIALOG oDlg CENTERED NOWAIT Valid(Cierra(( nOrd)))

RETURN ( aValRet ) // parece que en no modal ya no ejecuta esta sentencia, entonces como haria para regresar los valores de la fila seleccionada x el usuario?

Static Function Cierra(nOrd)
      CLOSE ARTICULO     //SI PRESIONO LOS BOTONES SALIR O ENTER NO HAY PROBLEMA, PERO SI DOY ESC EL PROGRAMA SE CUELGA AQUI
Return .t.


 
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Las dbf como las debo abrir en dialogo no modales

Postby sysctrl2 » Fri Oct 21, 2016 11:27 pm

no uso DBF
pero puede servir así

Code: Select all  Expand view
TRY
        use (cShared+"\clientes.dbf") new SHARED
      CATCH
        dbselectarea( "clientes" )
      END
      cClientes := alias()


saludos cesar.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1020
Joined: Mon Feb 05, 2007 7:15 pm

Re: Las dbf como las debo abrir en dialogo no modales

Postby armando.lagunas » Sat Oct 22, 2016 1:37 pm

Estimado:

hay que abrir todas las tablas DBF al iniciar el sistema y cerrarlas cuando salgas del mismo, en otras palabras mantenerlas "vivas" o abiertas con SHARED sin hacer ningún CLOSE ALL o CLOSE DATABASE ... durante la ejecución de tu sistema, con esto te funcionan los dialogos no modales.

Saludos
SkyPe: armando.lagunas@hotmail.com
Mail: armando.lagunas@gmail.com
User avatar
armando.lagunas
 
Posts: 346
Joined: Mon Oct 05, 2009 3:35 pm
Location: Curico-Chile

Re: Las dbf como las debo abrir en dialogo no modales

Postby admsoporte » Sat Oct 22, 2016 8:57 pm

1.- Abrir la tabla dbf en modo shared y con un alias diferente cada vez, para esto podrias usar la funcion:
Local caliasg:= GetNewAlias("TABL")
dbUseArea(.t.,,"tabladbfl",caliasg,.t.,)
Code: Select all  Expand view

function GetNewAlias( cDbfName )
static n := 0
return cDbfName + Right('000'+AllTrim(Str(++n)),3)
 

2.- aprovecha las facilidades del objeto database para referirte a las columnas o campos en un xbrowse o en los campos del formulario en lugar de referirte al alias fijo que manejas.
3.- debes cerrar las dbf cuando salgas del proceso

Lo anterior me permite hacer dialogos no modales y trabajar agil, y cada proceso que abres va a manejar sus propias variables de instancia y metodos propios de la instancia que se esta ejecutando.

Saludos desde la sierra norte de Puebla, Mexico
Saludos

Atentamente

Jose F Dominguez Serafin

email admsoporte@gmail.com
admsoporte
 
Posts: 103
Joined: Sun Oct 09, 2005 3:09 pm
Location: Mexico

Re: Las dbf como las debo abrir en dialogo no modales

Postby sysctrl2 » Sun Oct 23, 2016 12:48 am

las dbf son lentísimas cuando tu sistema trabaja en red,

cambia a SQL.

Saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 1020
Joined: Mon Feb 05, 2007 7:15 pm

Re: Las dbf como las debo abrir en dialogo no modales

Postby artu01 » Sun Oct 23, 2016 4:44 pm

Gracias muchachos por su ayuda

Esto fue lo que me aconsejo Paquito anteriormente sobre el tema de las ventanas no modales
Cuando vd. pone NOWAIT le indica al sistema que no "pare" el hilo de ejecucion mostrando la ventana, sino que siga el hilo de ejecucion, aunque muestre la ventana.


En base a eso tengo otra duda como hacen Uds si tengo Una funcion que abre una ventana no modal con un browse con las opciones de mantenimiento Alta, Baja, Modificar, Seleccionar, Salir

Mi pregunta es cuando yo llamo a esta funcion desde otro dialogo y selecciono un registro del mantenimiento, como hago para traer los datos
de la fila seleccionada x el usuario y mostrarlo en la ventana que invoco a mi mantenimento ?
En dialog modal no tenia problema por que capturaba la tecla enter y con un return devolvia lo que el usuario habia seleccionado, pero en no modal
no consigo hacer eso porque como dice paquito el hilo de ejecucion no para hasta salir del browse asi la ventana se este mostrando

Espero haberme dejado entender
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Las dbf como las debo abrir en dialogo no modales

Postby admsoporte » Sat Sep 16, 2017 5:47 pm

artu01 wrote:Gracias muchachos por su ayuda

Esto fue lo que me aconsejo Paquito anteriormente sobre el tema de las ventanas no modales
Cuando vd. pone NOWAIT le indica al sistema que no "pare" el hilo de ejecucion mostrando la ventana, sino que siga el hilo de ejecucion, aunque muestre la ventana.


En base a eso tengo otra duda como hacen Uds si tengo Una funcion que abre una ventana no modal con un browse con las opciones de mantenimiento Alta, Baja, Modificar, Seleccionar, Salir

Mi pregunta es cuando yo llamo a esta funcion desde otro dialogo y selecciono un registro del mantenimiento, como hago para traer los datos
de la fila seleccionada x el usuario y mostrarlo en la ventana que invoco a mi mantenimento ?
En dialog modal no tenia problema por que capturaba la tecla enter y con un return devolvia lo que el usuario habia seleccionado, pero en no modal
no consigo hacer eso porque como dice paquito el hilo de ejecucion no para hasta salir del browse asi la ventana se este mostrando

Espero haberme dejado entender
Debes abrir las dbf con un alias temporal
Ya que cada ventana nowait debe ser propietaria de un alias unico

Enviado desde mi LG-K530 mediante Tapatalk
Saludos

Atentamente

Jose F Dominguez Serafin

email admsoporte@gmail.com
admsoporte
 
Posts: 103
Joined: Sun Oct 09, 2005 3:09 pm
Location: Mexico

Re: Las dbf como las debo abrir en dialogo no modales

Postby Carlos Mora » Mon Sep 18, 2017 12:25 pm

Los veteranos como yo estamos acostumbrados a 'mezquinar' archivos abiertos, despues de tanto padecer con los infames "DOS ERROR 4" :)
Hoy en día ya no sufrimos de esas limitaciones, por lo que tener abierta una tabla por cada uso independiente es algo muy sano. Y no hace falta usar NO MODALES, basta con que un dialogo tape una ventana con un browse por debajo y trates de moverla. al repintar el browse de la ventana de abajo accede a las tablas y si no se programa con cuidado te la puede liar.
Ultimamente he estado tratando de modularizar el código de las aplicaciones separándolas en microservicios, que solo se hacen cargo de una parte muy pequeña de la aplicación, pero son el único punto donde se aplica. Por ejemplo

Code: Select all  Expand view

#include 'hbclass.ch'

//------------------------------------------------------------------------------
FUNCTION Stock()

   STATIC oStock

   IF oStock == NIL
      PushArea()
      oStock:= TStock():New()
      PopArea()
   ENDIF

RETURN oStock


CLASS TStock

   DATA cDbfMovStock

   METHOD New() CONSTRUCTOR
   METHOD Entrada()
   METHOD AcumulaEntrada( cCodArt, nSalida, dFecha )
   METHOD Salida()
   METHOD AcumulaSalida( cCodArt, nSalida, dFecha )
   METHOD VerificaEntrada( nMov, cCodArt, dFecha, cTComp, cNComp, nEntrada )
   METHOD VerificaSalida( nMov, cCodArt, dFecha, cTComp, cNComp, nSalida )
   METHOD AnulaMov( nMov )

ENDCLASS

//------------------------------------------------------------------------------
METHOD New()

   USE Articulo INDEX Articulo     SHARED NEW ALIAS 'STK_ARTIC'
   USE MovStock INDEX MovStock SHARED NEW ALIAS 'STK_MOVSTK'

RETURN Self
....
 



Toda entrada o salida de stock va por este servicio, que tiene abiertas las tablas que usa en sus propios aliases, y sus métodos no alteran ninguna workarea que no sea las propias, con lo que no me afecta el resto del programa.
Lo mismo se podría hacer para tus diálogos no modales, y más si tienes varios dialogos iguales simultaneos que afecten a distintos objetos o registros. Crear una clase para gestionar el diálogo, y abrir las tablas con aliases únicos y cerrarlos al cerrar el diálogo modal creo que te va a ayudar a programar con menos preocupaciones.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: jair and 32 guests