Bonjour à tous. J'ai développé un service Windows qui se boucle toutes les 60 minutes. Cet EXE doit s'exécuter tout au long de démarrage de Windows. Le rôle de ce service est de se connecter à la base de données C/S HFSQL pour lancer automatiquement l'impression. J'installe donc ce service dans le poste serveur. Le problème est que le service ne tourne plus (l'impression ne démarre plus) Cependant, ce dernier se trouve dans le gestionnaire de tâches. Je vérifie dans les services d'application Windows : Type de démarrage = "Automatique" Etat = "En cours d'exécution" et parfois "Arrêté" n'est pas stable Si je lance ce service, en cliquant sur "Service déboguer", depuis la poste de développement cela fonctionne parfaitement. Que dois-je faire ? Merci d'avance
salut regarde si t'as des infos dans l'observateur d' événements de windows. si tu n'en as pas, tu peux en créer dans ton service, pour avoir plus d'infos j'ai fait un gestionnaire d'impression qui fait la même chose, il fonctionne sans problème des mois entiers.
Merci commun j'ai déjà crée un fichier trace.txt, mais le problème mon service ne se lance pas (automatique) je cherche le fichier dans mon pc mais introuvable
met des "ServiceEcritEvénementJournal" dans ton service, tu pourras suivre ton service dans l'observateur, ainsi, tu pourras peut être déterminer ce qui ne se fait pas et comment te connectes tu a la base de données ?
Dans l'évènement Exécution du service (appelé en boucle), j'ai mis le code suivant [windev] TraceDébut(trFichier, "C:\Temp\Fiche.txt") Rep is boolean =ServiceDémarre("ServicePrint") Res is int = ServiceAttendEtat("ServicePrint", serviceEtatDémarré, 10) SI Res = -1 ALORS Erreur(ErreurInfo()) SINON Info("Etat en fin de timeout : " + Res) FIN SI Rep=Faux ALORS Trace("Erreur "+ErreurInfo()) iConfigure(IniMyParam.ImprimanteReseau) iImprimeEtat("EtatBC", REQ_ImpressionAuto.IDFDocs, 0) ServiceTemporise(6000) CAS EXCEPTION: // En cas d'exception, ajoute une erreur dans le journal des événements ServiceEcritEvénementJournal(ExceptionInfo, ejErreur) // Arrête le service FinService(fsDéfaillance) [/windev] Je lance un test mais rien ne passe (Aucune impression) Je lis mon fichier "Fiche.txt" dans lequel j'ai le message ci dessous Le service ServicePrint n'existe pas ou vous ne disposez pas de droits suffisants pour effectuer l'opération. Détail de l'erreur système : Accès refusé.
Maintenant j'ai résolu le problème en évitant l'affichage d'une fenêtre (Un service ne doit pas afficher de fenêtre) Mais toujours pas d'impression (pas d'execution) Après une recherche dans le service windows je trouve que le service est en état Arrêt, je le redémarre J'ai le message Windows n'a pas pu démarrer le service ServicePrint sur Ordinateur local. Erreur 1067 : Le processus s'est arrêté inopinément.
tu demarres ton servce dans la boucle? le service doit etre demarré a l'init du service pas dans la boucle, peut etre que ton probleme vient de la, de plus, tu ne devrais pas mettre la config de ton imprimante dans la boucle mais dans une fonction appelée quand besoin. mais je pense que ton erreur de base, vient du fait que tu lances et relances le service. en fait en relisant ton code, je te vois demarrer ton service, puis tester son etat, puis configurer l'imprimante, puis imprimer l'etat sur la requete que tu n'as pas executé ce que je ferais je lancerais l'etat dans l'init dans la boucle: je lancerais la requete si la requete a des elements, je lancerais une procedure qui imprime l'etat basé sur la requete puis hannule la requete et retour a la boucle fin de la boucle ( hors tests et tempo). je dis ca, j'ai fait un seul service selon mes besoins, et c'est a peu près le principe que j'ai mis en place. il imprime dans une boite de 30 personnes et teste 3 fois par seconde une table si elle a des enregistrements et agit s'il y en a. mais ne fait rien d'autre sinon. et ca fonctionne sans problème. voici ma boucle [windev]// Exécution du service impr() ServiceTemporise(300 ms) CAS EXCEPTION: // En cas d'exception, ajoute une erreur dans le journal des événements ServiceEcritEvénementJournal(ExceptionInfo, ejErreur) // Arrête le service FinService(fsDéfaillance)[/windev] la fonction impr, verifie si des enregistrements existent, [windev]SI HNbEnr(impressions)>0 ALORS[/windev] si oui, lance une impression par ligne et supprime la ligne sinon, revient.
Merci pour ton retour Tout est fonctionne bien : Le service est toujours en cours d'exécution la procédure d'impression est bien s'exécute Sauf que l'impression ne se lance pas J'ai démarre mon service dans l'initialisation J'ai exécuté la fonction iConfigure("Nom de l'imprimante") dans l'initialisation Dans Exécution du service (appelé en boucle) Impression() ServiceTemporise(3000) CAS EXCEPTION: ServiceEcritEvénementJournal(ExceptionInfo, ejErreur) FinService(fsDéfaillance) Ma procédure Impression() POUR TOUT MonFichier SI MonFichier.Imprime=0 alors iImprimeEtat("EtatBC", MonFichier.ID) MonFichier.Imprime=1 SI PAS HModifie() ALORS Trace(" Pas de modification "+HErreurInfo(hErrComplet)) FIN FIN Fin La rubrique "Imprime" prend la valeur 1 mais l'impression ne passe pas !!!! je ne sais pas exactement quel est le problème ? A noter L'imprimante est en réseau local ou distant J'installe, uniquement mon service dans le serveur l'imprimante est installé dans un pc dans le réseau
si l'imprimante est reseau installe la sur le serveur ca sera mieux. j'utiliserais iconfigure juste avant l'impression a ta place. pas dans l'init, surtout si l'imprimante est pas parametree sur le serveur Moi, j'utilise plusieurs imprimantes et je change d'imprimante à la volée juste avant l'impression, ca me permet d'imprimer sur l'imprimante utile en temps reel selon le poste qui lance l'impression. j'imprime principalement des tickets de caisse sur 4 imprimantes différentes a partir d'une dizaine de caisses, chaque caisse est configurée avec une imprimante et envoie le nom de l'imprimante voulue en même temps que la demande d'impression, facile a gerer. par contre, je pige pas un truc, combien d'enregistrements contient "monfichier"?
C'est bon Lors j'installe l'imprimante directement dans le serveur ca marche Mais je veux que l'imprimante soit en réseau, déjà elle a une adresse IP et elle est sous réseau >> Tu dis : pas dans l'init, surtout si l'imprimante est pas parametree sur le serveur Mais est ce que tu met iconfig() dans la boucle de service dans ta procedure imp()
mais l'imprimante est en réseau, elle doit etre installée (configurée) sur le serveur ( pas physiquement) pour pouvoir l'utiliser facilement. si tu n'as qu'une imprimante configurée sur ton serveur, aucun besoin de la configurer a chaque impression, donc tu n'as pas besoin de iconfigure, tu n'en as besoin que pour changer d'imprimante selon ton besoin ( comme mon cas). tu n'as pas répondu a la question "combien d'enregistrement..."
ha tu veut dire qu'a chaque tour tu scannes tout tes enregistrements? enorme perte de temps et ressources fait une requete et imprime a partir de ta requete peu de changements a faire et bien plus efficace
Bien sur j'utilise une requête paramétrée sur la rubrique "EstImprime=0" ma requête trouve une seule ligne ayant EstImprime=0 Donc la taille ne pose plus de souci Mon problème est l'impression sous une imprimante de type réseau installé dans un autre pc Par contre l'imprimante en local (USB) installé directement dans un serveur ca marche
ok, d'apres le code que tu as donné, j'ai cru que tu passais tout les enregistrements de ton fichier a chaque fois.
si ton imprimante reseau est parametree sur ton serveur, si elle est par defaut, rien a faire. si elle est pas par defaut, il faut utiliser iconfigure pour imprimer, c'est tout simple
"si ton imprimante reseau est parametree sur ton serveur," Comment configurer l'imprimante sur le serveur ???? J'ai déjà utilisé la fonction iconfigure() J'explique Premièrement, je ne peux pas connecter l'imprimante directement au serveur (car le serveur est dans une zone protégée, ...) L'imprimante est installée sur un ordinateur de bureau, et ce dernier est déjà en réseau avec le serveur. L'imprimante est de type réseau et possède une adresse IP de marque Canon "KMBT5E9FB3" . Structure de l'entreprise: Au siège (Direction) il y a un serveur, 5 ordinateurs de bureau, L'imprimante canon et d'autres imprimantes.Il y a 5 agences de point de vente à distance (Site). Chaque site génère une fiche de production afin de l'imprimer automatiquement dans l'imprimante Canon. Le rôle de service imprime les fiches qui n'ont pas encore été imprimés [windev] REQ.ParamEstImprime=0 REQ.ExécuteRequête(hRequêteDéfaut) POUR TOUT REQ iImprimeEtat("EtatBC", REQ.IDFDocs) SI HLitRecherchePremier(FDocs,IDFDocs, REQ.IDFDocs, hIdentique)=Vrai ALORS FDocs.EstImprime=Vrai SI PAS HModifie() ALORS Trace(" Pas de modification "+HErreurInfo(hErrComplet)) FIN FIN FIN HLibère(REQ) [/windev] Donc si l'impression ne réussit pas, la rubrique "EstImprime" ne prendra pas la valeur 1 Mon service Il est bien démarré Il s'exécute automatiquement Mon problème peut être le chemin de l'imprimante Je suis bloqué merci de me donner encore des pistes
si l'imprimante est connectée au serveur ( en usb) ça fonctionne, si juste sur le réseau ça ne fonctionne pas? ---Comment configurer l'imprimante sur le serveur ???? il faut que tu installes sur ton serveur une nouvelle imprimante réseau avec le chemin réseau de ta canon et la mettre comme imprimante par defaut, sur ce même serveur, si tu peux, sinon utiliser iconfigure pour la changer en temps réel pour ta partie mise a jour pourquoi ne pas faire une requête? [windev] update fdocs set EstImprime=1 where IDFDocs=REQ.IDFDocs [/windev] Ca t’évite de relire ton fichier
Oui l'imprimante fonctionne en USB L'imprimante est déjà configurée et elle est par défaut Quel est la relation entre ce code windev et le non fonctionnement de l'imprimante ?
si tu imprimes un truc a partir du serveur, l'impression se fait ? tu as regardé dans l'observateur d'evenements si tu as un message d'erreur?