IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Faire un Reader style 'RSS' mais prenant des infos sur Access


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 57
    Points
    57
    Par défaut Faire un Reader style 'RSS' mais prenant des infos sur Access
    Bonjour a tous,

    J'ai une question à vous poser.

    Dans mon équipe ,chaque personne (6 en tout) ,utilise Excel pour saisir des données.
    Ces données sont rapatriées ensuite sur Access (centralisées).

    Ma question ,la voila:

    Je souhaiterais créer un client (qui resterait en barre des taches) et qui stockerait tous les évènements Access (nouvel enregistrement, supprime enregistrement, modification table...)

    Existe-t-il un projet deja fait la dessus qui pourrait me guider?
    En fait ,l'idée précise etait de le présenter comme un RSS Reader ,ou les 'news' seraient les évenements et tous les utilisateurs ayant le client verrait en temps réél ces news s'afficher..

    Je compte sur vos talents pour m'aider.

    Merci à tous pour cette (trop) longue lecture!

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Je n'ai pas de réponse à la question mais elle lève ma curiosité : pourquoi ce compliquer la vie à saisir sous excel avec export sous access puisqu'apparemment tu souhaites que les différentes personnes soient informés des modifications en temps réel ? La solution ne serait-elle pas de développer directement un interface de saisie en vb.net qui pointe sur la base et génère dans une table "évènement" une ligne pour chaque modification apportée par l'un des membres de l'équipes. Avec un petit process qui scrute toutes les n minutes cette tables ça devrait le faire non ?

    Je ne connais pas tous les tenants donc excuse si je suis à côté de la plaque.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Salut olsimare !

    En fait ,les utilisateurs utilisent excel pour saisir les données (car plus souple qu'access).Je recupere ainsi les données lorsqu'ils ferment le classeur (before close).
    De plus ,certaines personnes de mon service prefere aussi regarder sur excel les données saisies et ensuite faire des TCD,ou des simples copier coller .

    La base Access ,on s'en sert plus pour avoir une vision globale des chiffres, et faire des controles (ratios,tendance...)

    Pour le coté Reader RSS, je pensais effectivement mettre en ADO un minuteur qui s'occuperait de checker toutes les minutes si une nouvelle ligne a été rajoutée ,supprimée ou modifiée.
    Après ce que je sais pas faire,c'est lorsqu'on le réduit, il apparaisse seulement en barre des taches, et dès qu'un evenement est true (ajout de ligne), une ligne apparaisse en donnant la news(un peu comme à la reception d'un mail outlook , ou d'une nouvelle news via un lecteur RSS).

    Une idée ou quelque chose sur quoi m'orienter?

    Merci!

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Yop.

    Désolé pour le temps de réponse...

    Bon j'ai un peu creusé et il me semble qu'un service windows pourrait résoudre ton probléme.

    Je pense à un service qui tournerait sur chaque poste et qui controlerait a intervalle régulier l'insertion de nouveaux enregistrements en table avec notification soit par msgbox soit par un notifyicon qui va vient.

    Un exemple ci-dessous
    nota : merci à Crazyht !

    Normalement il faut un projet de type service windows !!! Comme j'ai la version express de VS, j'ai testé avec un projet type application windows et ça marche aussi.

    Il te faut une class pour le service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    Option Explicit On
    Option Strict On
    Imports System.ServiceProcess
    Imports System.IO
     
    Public Class cService
        Inherits System.ServiceProcess.ServiceBase
     
    #Region "DECLARATION"
        Private niIcon As New System.Windows.Forms.NotifyIcon()
        Private WithEvents tTimer As New System.Timers.Timer
        Private cCurrentConnection As New System.Data.OleDb.OleDbConnection
        Private intCurrentCount As Integer
    #End Region
     
    #Region " Code généré par le Concepteur de composants "
     
        Public Sub New()
            MyBase.New()
     
            ' Cet appel est requis par le Concepteur de composants.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent()
            ' Initialisation des FileSystemWatcher
            initService()
            ' Autorise a mettre en pause le service 
            Me.CanPauseAndContinue = True
            ' Demande a se que l'event log soit renseigné au demarrage et arret du service
            Me.AutoLog = True
        End Sub
     
        'La méthode substituée Dispose du UserService pour nettoyer la liste des composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        ' Le point d'entrée principal pour le processus
        <MTAThread()> _
        Shared Sub Main()
            Dim ServicesToRun() As System.ServiceProcess.ServiceBase
     
            ' Plusieurs services NT s'exécutent dans le même processus. Pour ajouter
            ' un autre service à ce processus, modifiez la ligne suivante
            ' pour créer un second objet service. Par exemple,
            '
            '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
            '
            ServicesToRun = New System.ServiceProcess.ServiceBase() {New cService()}
     
            System.ServiceProcess.ServiceBase.Run(ServicesToRun)
        End Sub
     
        'Requis par le Concepteur de composants
        Private components As System.ComponentModel.IContainer
     
        ' REMARQUE*: la procédure suivante est requise par le Concepteur de composants
        ' Elle peut être modifiée à l'aide du Concepteur de composants.  
        ' Ne la modifiez pas en utilisant l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            components = New System.ComponentModel.Container()
            Me.ServiceName = "NDService"
        End Sub
     
    #End Region
     
    #Region "Surcharge Methode gestion evenement Service"
        ' Executer lors du lancement du service
        Protected Overrides Sub OnStart(ByVal args() As String)
     
            MsgBox("Je démarre c'est cool")
            niIcon.Icon = My.Resources.Appd
            niIcon.Visible = True
            niIcon.ShowBalloonTip(2000, "Démarrage", "Le service de control est démarré", Windows.Forms.ToolTipIcon.Info)
     
            Try
                If cCurrentConnection.State = ConnectionState.Closed Then
                    cCurrentConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\MonCHemin\MaBase.mdb"""
                    cCurrentConnection.Open()
                End If
            Catch ex As Exception
                System.Windows.Forms.MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
                Me.Dispose()
            End Try
     
     
            intCurrentCount = GetCurrentCount()
     
            ' 10 sec ! C'est peu --> mieux vaut mettre 5 a 10 min je pense
            tTimer.Interval = 10000
            tTimer.Start()
     
        End Sub
     
        ' Executer lors de sa mise en pause
        Protected Overrides Sub OnPause()
            tTimer.Stop()
        End Sub
     
        ' Executer qd on sort de la pause
        Protected Overrides Sub OnContinue()
            tTimer.Start()
        End Sub
     
        ' Executer qd on arrete le service
        Protected Overrides Sub OnStop()
            ' Ajoutez ici le code pour effectuer les destructions 
            '  nécessaires à l'arrêt de votre service.
            MsgBox("Je m'arrête")
            niIcon.Visible = False
        End Sub
    #End Region
     
    #Region "PROCEDURES PRIVEES"
     
        Private Sub initService()
            ' rien qui ne vaille le coup a faire
        End Sub
     
        Private Function GetCurrentCount() As Integer
     
            Try
                Dim strSqlQuery As String = "SELECT COUNT(*) FROM Table1"
                Dim cmd As New OleDb.OleDbCommand(strSqlQuery, cCurrentConnection)
                Return CInt(cmd.ExecuteScalar())
            Catch ex As Exception
                System.Windows.Forms.MessageBox.Show("Erreur sur comptage : " & ex.Message)
                Me.Dispose()
            End Try
     
        End Function
     
    #End Region
     
        Private Sub tTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tTimer.Elapsed
            Dim intNewCount As Integer
            intNewCount = GetCurrentCount()
            If intNewCount <> intCurrentCount Then
                intCurrentCount = intNewCount
                niIcon.ShowBalloonTip(2000, "Insertion en base", "Nouvelles données disponibles", Windows.Forms.ToolTipIcon.Info)
            End If
        End Sub
    End Class
    NOTA : Attention à l'objet TIMER ! le system.windows.forms.timer ne marche pas avec un service donc utilisons le system.timers.timer.
    Attention aussi à l'intervalle --> je l'ai mis à 10 sec mais c'est un coup à charger le réseau pour rien je pense donc faudrait mieux mettre de l'ordre de 5 min ou plus.

    et une classe pour l'installation du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    Imports System.ComponentModel
    Imports System.Configuration.Install
     
    <RunInstaller(True)> Public Class ProjectInstaller
        Inherits System.Configuration.Install.Installer
     
    #Region " Code généré par le Concepteur de composants "
     
        Public Sub New()
            MyBase.New()
     
            'Cet appel est requis par le Concepteur de composants.
            InitializeComponent()
     
            'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
     
        End Sub
     
        'La méthode substituée Dispose du programme d'installation pour nettoyer la liste des composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Requis par le Concepteur de composants
        Private components As System.ComponentModel.IContainer
     
        'REMARQUE*: la procédure suivante est requise par le Concepteur de composants
        'Elle peut être modifiée à l'aide du Concepteur de composants.  
        'Ne la modifiez pas en utilisant l'éditeur de code.
        Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller
        Friend WithEvents ServiceInstaller1 As System.ServiceProcess.ServiceInstaller
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller()
            Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller()
            '
            'ServiceProcessInstaller1
            '
            Me.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem
            Me.ServiceProcessInstaller1.Password = Nothing
            Me.ServiceProcessInstaller1.Username = Nothing
            '
            'ServiceInstaller1
            '
            Me.ServiceInstaller1.DisplayName = "NewData Service"
            Me.ServiceInstaller1.ServiceName = "NDService"
            '
            'ProjectInstaller
            '
            Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1})
     
        End Sub
     
    #End Region
     
    End Class
    NOTA : faut ajouter quelque références à system.data, et autre ...

    Une faut le projet généré, tu as un exe dans le répertoire /bin du projet.

    Il faut alors installer le service. Pour ce faire, j'ai fait 2 .bat qui vont bien :

    Pour l'installation :
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\INSTALLUTIL C:\LaOuEstLExe\NDService.exe
    pause

    Pour la désinstallation :
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\INSTALLUTIL /U C:\LaOuEstLExe\NDService.exe
    pause

    Le chemin vers INSTALLUTIL dépend de la version du framework --> un coup de scan sur le disk et c'est tout bon.

    A noter qu'avec les autres versions de VS (non express) il existe de mémoire un truc pour que ça s'intalle plus convivialement --> à creuser si tu as plus que VS Express.

    Si tu t'arrêtes là le service se plante au démarrage ! C'EST NORMAL !!!
    Il faut que dans le gestionnaire de services de windows tu précises que le service à le droit d'interagir avec le bureau (j'ai pas creusé la façon de l'installer comme ça d'office mais je m'y mets aprés).

    Là évidemment c'est du code à la RAD, je te laisse le soin de mettre tout ça au propre pour que ça soit un peu plus pro...

    Bon voilà, je sais pas si ça t'aide mais ça m'a permis d'apprendre des trucs !

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  5. #5
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Yop !!!!

    Aprés 3h de recherche je crois que je tiens la solution pour que le service s'intalle directement avec le droit d'interagir avec le bureau !
    La solution était là :
    http://www.codeproject.com/cs/system...18#xx1420018xx

    Donc j'ai ajouter la class :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Imports System.Management
     
    Public Class ServiceOptions
        Public Shared Function InteractWithDesktop(ByVal serviceController As _
              System.ServiceProcess.ServiceController, ByVal startService As Boolean) As String
            Dim returnValue As String = ""
            Try
                Dim coOptions As ConnectionOptions = New ConnectionOptions
                coOptions.Impersonation = ImpersonationLevel.Impersonate
                Dim mgmtScope As ManagementScope = New ManagementScope("root\CIMV2", coOptions)
                mgmtScope.Connect()
                Dim wmiService As ManagementObject = Nothing
                wmiService = New ManagementObject( _
                             "Win32_Service.Name='" & serviceController.ServiceName & "'")
                Dim InParam As ManagementBaseObject = wmiService.GetMethodParameters("Change")
                InParam("DesktopInteract") = CObj(True)
                Dim OutParam As ManagementBaseObject = _
                      wmiService.InvokeMethod("Change", InParam, Nothing)
     
                If (startService = True) Then
                    serviceController.Start()
                End If
            Catch ex As Exception
                returnValue = ex.ToString
            End Try
            Return returnValue
        End Function
    End Class
    Et dans la classe ProjectInstaller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       Private Sub ProjectInstaller_Committing(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles Me.Committing
     
            Dim sc As New ServiceProcess.ServiceController
     
            sc.ServiceName = Me.ServiceInstaller1.ServiceName
     
            ServiceOptions.InteractWithDesktop(sc, False)
     
        End Sub
    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Oula ,merci pour la réponse !
    J'avais pas vu que t'avais répondu !!
    Je lis tout ca et je brb !

    Apres lecture, faut avouer que t'es génial !

    Je vais essayer de monter tout ca et je laisserais mon code ici ,si ca peut servir aux autres par la suite!
    Bravo et encore merci!

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Alors apres quelques test ,je laisse ici mes commentaires:

    Je dois toujours lancer le service manuellement ,même avec ton second post sur la classe ServiceOption et l'addon sur l'installer.

    Avec ca ,ca démarre (msgbox), le fichier .Ldb se créé donc no problemo ca doit se connecter.
    Par contre, en rajoutant des enregistrements sur ma table1 ,je n'arrive pas a voir de messages m'indiquant la mise a jour.
    Autre chose, le fichier log rapporte uniquement les news dûes a l'installation du service ou aussi sur les news (Mise a jour de la table )

    Merci de me tenir au courant ,et encore merci Olsimare!

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    J'ai réussi a le faire marcher . Le truc c'est que ca le met en service ,et je cherche quelque chose qui affiche un historique des dernieres news passées , et tant qu'a faire l'avoir en application et non pas en service.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/10/2014, 18h08
  2. Réponses: 4
    Dernier message: 02/03/2014, 16h29
  3. [Débutant] Créer plusieurs fois la meme fenêtre mais avec des infos différentes ?
    Par H3xor dans le forum C++Builder
    Réponses: 7
    Dernier message: 04/02/2011, 17h47
  4. [OpenOffice] [Présentation] Afficher des infos sur l'écran mais pas sur la projection
    Par Michaël dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 30/05/2007, 17h32
  5. Réponses: 1
    Dernier message: 08/03/2007, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo