https://foro.gambas-es.org/viewtopic.php?f=1&t=7052&p=42567#p42567
-----------------------------------
shordi
Martes, 24 Julio 2018, 11:55

Re: Despligue Empresarial
-----------------------------------
Otro detalle, no basta con que el software se actualice en las máquinas de los usuarios, porque hay usuarios que no actualizan nunca y te arriesgas a que unos usen una versión y otros otra. 
Para prevenir eso yo lo que hago es mantener una tabla "Versiones" en una de mis bases de datos y en ella guardo la versión del programa, si es obligatorio su uso y si requiere un reinicio de configuración (dbsettings) en su primera ejecución. Lo primero que hacen mis programas es contactar con esa base y cotejar la versión instalada con la versión que figura en la tabla.
Si no es la misma versión ta avisa para que actualices el sistema. Si, además, la última es una versión obligatoria, no te deja seguir y si requiere reconfiguración en la primera ejecución ejecuta tal procedimiento.

Como ejemplo te pongo el códido del evento Open del formulario FMain de uno de mis programas llamado Shinigami.

Este es el formato de la tabla "versiones"
[code linenumbers=false syntax=sql]
CREATE TABLE `versiones` (
 `programa` varchar(50) NOT NULL,
 `actual` varchar(20) NOT NULL,
 `obligatoria` tinyint(1) NOT NULL,
 `reconfigurar` tinyint(1) NOT NULL,
 PRIMARY KEY (`programa`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
[/code]

[code linenumbers=false syntax=gambas]
Public Sub Form_Open()
   
    Dim f As Object
    Dim r As Result
    Dim pathEntorno As String
    
    pathEntorno = User.Home &/ ".config" &/ Application.Name
    If Not Exist(pathEntorno) Then
        f = New Entorno(True)   ''Entorno es el formulario de configuración
        Me.visible = False
        f.showmodal
        Me.close
        Return
    Else
        Settings.Read(Me)
        mComun.usuario = New Usuario
        Me.title = Application.Name
        lienzo.Visible = False
        Inc Application.Busy
        mComun.cargaentorno()
        If mComun.entorno.Count = 0 Then ''Este es el caso en que se hubiese eliminado el entorno anterior por cambio de versión
            f = New Entorno(True)
            Me.Visible = False
            f.Showmodal
            Me.close
            Return
        Endif
        If Not mComun.abreConexiones() Then ''hay algún problema con la red y no se pudieron abrir las bases de datos
            Me.Close()
            Return
        Endif
        Dec Application.Busy
        r = Connections["nombre_de_la_conexion"].Exec("select * from versiones where programa=&1", Application.Name)
        If r!actual <> Application.Version Then
            If r!obligatoria Then  
                Message.Warning("Existe una nueva versión de shinigami que contiene cambios sin los que no es posible continuar. Actualice su sistema.")
                Me.close()
                Return
            Else
                Message("Existe una nueva versión de shinigami. Actualice su sistema cuanto antes.") ''No está actualizado, pero la última no es obligatoria. Sólo un aviso y se continúa.
            Endif
        Endif 
        If r!reconfigurar = True And mComun.entorno["version"] <> Application.Version Then
            bienvenida.Text = "Ejecutando acciones post-actualización"
            Message("La actualización instalada requiere reiniciar el entorno de trabajo. \n A continuación se generará el entorno por defecto.\n Puede afinar su configuración en la opción de Configurar Entorno del menú Administración.")
            f = New Entorno(True)
            Me.Visible = False
            f.Showmodal
            Me.close
            Return
        Endif
        bienvenida.Text = "Versión: " & Application.Version
    Endif
    menuconsultas()
    mConectar_Click() 

Catch

    mEMail.sendmail(mComun.entorno["mailprograma"], [mComun.entorno["mailerrores"]], "Error en Shinigami", "Usuario: " & mComun.usuario.nick & "\nFecha: " & Format(Now(), "dd-mm-yyyy hh:mm:ss") & "\n" & Error.Text & " - " & Error.where, mcomun.servidores["mailserver"])
 
    Message("Error: " & Error.Text & "\nEn: " & Error.where)

End
[/code]


