Page 1 of 1

Las dbf como las debo abrir en dialogo no modales

Posted: Fri Oct 21, 2016 10:24 pm
by artu01
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


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.


 

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

Posted: Fri Oct 21, 2016 11:27 pm
by sysctrl2
no uso DBF
pero puede servir así

Code: Select all

TRY
        use (cShared+"\clientes.dbf") new SHARED
      CATCH
        dbselectarea( "clientes" )
      END
      cClientes := alias()
saludos cesar.

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

Posted: Sat Oct 22, 2016 1:37 pm
by armando.lagunas
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

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

Posted: Sat Oct 22, 2016 8:57 pm
by admsoporte
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

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 _ 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

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

Posted: Sun Oct 23, 2016 12:48 am
by sysctrl2
las dbf son lentísimas cuando tu sistema trabaja en red,

cambia a SQL.

Saludos..

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

Posted: Sun Oct 23, 2016 4:44 pm
by artu01
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

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

Posted: Sat Sep 16, 2017 5:47 pm
by admsoporte
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

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

Posted: Mon Sep 18, 2017 12:25 pm
by Carlos Mora
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

#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.