6
votes

Existe-t-il un moyen de terminer correctement une session avec QuickBooks / QBW32.exe afin qu'il ne reste pas en marche en arrière-plan?

I Effectuer un support technique et un développement sur un certain nombre de programmes utilisant le SDK QuickBooks pour effectuer une variété de fonctions. Dernièrement, j'ai remarqué que lorsque l'utilisateur effectue les éléments suivants:

Pré-requis: - QuickBooks n'est pas ouvert sur le bureau et n'est pas en cours d'exécution. - Mon programme de bureau n'est pas configuré dans la liste d'applications intégrée QuickBooks pour vous connecter automatiquement. p>

1) ouvre l'un de mes programmes. P>

2) effectue une action qui commence une connexion et une session avec QuickBooks. P>

3) L'interface QuickBooks Retourne Une erreur disant que vous devez avoir des QuickBooks ouverts et signés dans le fichier de la société pour effectuer cette action. p>

4) Mon programme ferme la session et la connexion, puis présente l'utilisateur avec une boîte de dialogue qui leur donne des conseils de dépannage.

résultat: p>

QuickBooks elle-même continue de fonctionner en arrière-plan après que qbw32.exe, même si la session et la connexion étaient à la fois fermées. p>

Si l'utilisateur Essaie ensuite d'ouvrir le programme QuickBooks Desktop, ils obtiennent une erreur en leur disant que QuickBooks est déjà en cours d'exécution. Ils doivent ensuite ouvrir le gestionnaire de tâches sous Windows et fermer le QBW32.exe en cours d'exécution avant de pouvoir ouvrir avec succès QuickBooks. P>

J'en ai reproduit cela en utilisant un programme C # très basique que j'ai écrit ci-dessous. P>

Dans l'application de test, j'utilise les étapes / scénarios suivants: p>

Prérequis: 1) L'application de test n'est pas définie pour se connecter automatiquement sur QuickBooks. Il est défini sur la connexion uniquement lorsque l'utilisateur dispose d'un programme QuickBooks Desktop Open et il dispose d'un fichier d'entreprise ouvert. P>

2) S'assurer que les QuickBooks ne sont pas ouverts avant le test ci-dessous. P>

Étapes: P>

1) Ouvrez le test C # Application P>

2) Appuyez sur le bouton "Open Connection". Une connexion doit être ouverte avec l'interface QuickBooks via le QBXML Interop. P>

3) Appuyez sur le bouton "Démarrer la session". Une session doit être démarrée avec QuickBooks. P>

4) En supposant que les pré-requises des tests soient remplies ci-dessus, vous devez recevoir un message d'erreur renvoyé à partir de QuickBooks vous indiquant que l'application n'est pas configurée pour vous connecter automatiquement et Vous devrez ouvrir des QuickBooks avant de pouvoir tenter une session. p>

5) Le QBW32.exe devrait maintenant fonctionner en arrière-plan. P>

6) Appuyez sur le bouton indiquant la fin. session. Cela devrait mettre fin à la session à l'aide de l'interface QuickBooks. La session doit déjà être terminée via le bouton Try-Catch dans l'étape 3, peu importe. P>

7) Appuyez sur la touche "Connexion proche". Cela devrait fermer toutes les connexions avec QuickBooks. P>

8) Le QBW32.exe est toujours en cours d'exécution, même si la session et la connexion ont été terminées et fermées. P>

9) Fermez l'application de test à l'aide du bouton EXIT. P>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using Interop.QBXMLRP2;

namespace Open_Connection
{

    public partial class Form1 : Form
    {

        bool sessionBegun = false;
        bool connectionOpen = false;
        RequestProcessor2 rp = null;
        string ticket;


        public Form1()
        {
            InitializeComponent();
        }

        private void End_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }

        private void OpenConn_Click(object sender, EventArgs e)
        {
            try
            {  //Start a new connection with QuickBooks
                rp = new RequestProcessor2();
                rp.OpenConnection2("", "Open Connection", QBXMLRPConnectionType.localQBD);
                connectionOpen = true;
            }

            catch (Exception connectionException)
                { //If the connection fails, close the connection to avoid the program from getting stuck in an interop error loop.
                        MessageBox.Show(connectionException.Message, "Error");
                        if (connectionOpen)
                        {
                            rp.CloseConnection();
                        }
                }
        }

        private void StartSess_Click(object sender, EventArgs e)
        {
            try
            {  //Start a new session with QuickBooks using the company file specified below.
                string ticket = rp.BeginSession(@"C:\Users\username\Documents\Quickbooks Company Files\example.QBW", QBFileMode.qbFileOpenDoNotCare);
                sessionBegun = true;
            }
            catch (Exception sessException)
            {
                //If the session fails (I.E. QuickBooks is not open with a user logged into the company file and the program is not given permission to
                //automatically log in, imeedietly end the session and close the connection.
                MessageBox.Show(sessException.Message, "Error");
                if (sessionBegun)
                {
                    rp.EndSession(ticket);
                }

                if (connectionOpen)
                {
                    rp.CloseConnection();
                }
            }
        }

        private void EndSess_Click(object sender, EventArgs e)
        {
            try
            { //End the session 
                rp.EndSession(ticket);
                sessionBegun = false;
            }

            catch (Exception ex)
            { //If a session was not started already, set the session begun flag to false to avoid getting stuck in a loop. 
                sessionBegun = false;
            }

        }

        private void CloseConn_Click(object sender, EventArgs e)
        {
            try
            { //Close the connection to QuickBooks 
                rp.CloseConnection();
                connectionOpen = false;
            }

            catch (Exception ex)
            { //If the connection was not open, set the connection open flag ot false to avoid getting stuck in a loop.
                connectionOpen = false;
            }

        }
    }
}


0 commentaires

4 Réponses :


0
votes

Si vos QuickBooks sont en cours d'exécution en arrière-plan, effectuez des étapes ci-dessous:

Éteignez le " Gardez QuickBooks en cours d'exécution pour des startups rapides " préférence sur QuickBooks 2011 ou ultérieure.

  1. Ouvrez QuickBooks et ouvrez votre fichier de société.
  2. Choisissez Edition> Préférences.
  3. Choisissez l'icône générale dans la liste de gauche.
  4. Choisissez l'onglet Mes Préférences en haut.
  5. Cliquez pour effacer les quickbooks Garder pour la case à cocher Startups rapide.
  6. Cliquez sur OK.

    Après avoir fermé QuickBooks ou redémarrez votre ordinateur, QuickBooks ne fonctionnera pas en arrière-plan.


3 commentaires

J'ai déjà désactivé ce paramètre dans l'onglet Préférences générales de QuickBooks. Je vois que ce problème se produit avec QB 2013 à travers 2015.


Faites-vous une comptabilité avec une plage de date modifiée dans la demande?


William - Si vous regardez dans le code d'application simple que j'ai posté ci-dessus, je n'utilise aucune requête XML. Je suis simplement en train d'ouvrir une connexion et de commencer une session.



0
votes

J'ai essayé ce qui suit: Ouvrez SQL Server Management Studio, exécutez un package d'intégration requis sur lesquels QuickBooks (QuickBooks démarrera automatiquement en arrière-plan), puis fermez complètement SQL MS. Je peux confirmer que qbw32.exe est toujours en cours d'exécution et le service utilisé QB n'est plus en cours d'exécution.

L'application d'appel doit toujours fermer la connexion. Termination de l'application d'appel tue la demande et non la connexion. Lorsque vous utilisez MS SQL Server, vous devez relier et dissimuler QODBC.

Par exemple:

EXEC SP_ADDDLINKEDSERVER @SERVER = N'QODBC ', @ SRVPRODUCT = N'QODBC', @ fournisseur = N'MSDASQL ', @ j'Quickbooks Data', @Provstr = 'ODBC; DSN = Data QuickBooks; DFQ = C: \ PROGRAMME PROGRAMME \ Pilote QODBC pour QuickBooks \ Sample04.qbw; Server = QODBC; USEDCOM = Y; Optimizerdbfolder = c: \ Program Files \ pilote QODBC pour QuickBooks \ Optimizer; Optimiorallowdirtyreads = y '

EXEC SP_DRESSERVER @SERVER = N'QODBC '

J'espère que cela vous aide.


2 commentaires

L'exemple que vous utilisez semble utiliser un scénario où QODBC est déjà défini pour vous connecter automatiquement. Le programme de test C # que j'ai partagé ci-dessus n'est pas défini pour vous connecter automatiquement.


Je suis allé de l'avant et élaboré sur les étapes de test que j'utilise avec le programme de test que j'ai partagé le code pour UP ci-dessus. À ce stade, j'essaie simplement de réduire ce qui peut être fait pour fermer le QBW32.exe via l'application de test via le SDK (sans émettre des commandes via Windows pour tuer le QBW32.exe). Je pense qu'à ce stade, il peut y avoir un problème avec le SDK lorsque votre application n'est pas définie pour vous connecter automatiquement et que vous essayez de démarrer / mettre fin à une session et à la connexion. En raison de la politique de ma société, nous ne sommes pas définis nos applications pour vous connecter automatiquement en raison de la nature problématique de la connexion automatique.



3
votes

Après avoir fait des tests supplémentaires en utilisant le scénario que Geetanjali présentée, je suis arrivé à cette conclusion:

  • Le QBW32.exe se ferme uniquement si votre programme est configuré sur la liste d'applications intégrée à QB pour vous connecter automatiquement.

  • Si votre programme n'est pas configuré pour vous connecter automatiquement, le QBW32.exe s'ouvrira au moment où vous démarrez une session lorsque vous passez un nom de fichier de la société et restera ouverte même si vous terminez la session. et mettre fin à la connexion.

  • Le qbw32.exe ne démarre pas s'il n'y a pas de fichier d'entreprise qui est passé lors du démarrage de la session.

    J'ai quelque peu confirmé avec William sur les forums Intuits que cela semble fonctionner comme prévu.

    Travailler autour de cela, je l'ai fait dans mon test de test:

    J'ai ajouté un bloc supplémentaire si le bloc de la session commence à envoyer un test de connexion via un appel de session ouvert sans fichier d'entreprise spécifié. Cela oblige l'interface à renvoyer une erreur me dise que je ne peux pas démarrer une session car aucun fichier d'entreprise n'est spécifié et QuickBooks n'est pas ouvert. Cela force ensuite mon application de test pour afficher un message me disant à ouvrir le fichier de la société avant de réessayer.

    J'imagine que je puisse en outre construire sur ceci en ajoutant un paramètre à "Utiliser un journal automatique en mode" et "mode régulier" afin que la connexion de test puisse être ignorée lorsque je souhaite réellement utiliser la connexion automatique.

    Quoi qu'il en soit, cela semble être le seul moyen de contourner ce scénario, au-delà de l'ajout d'un bloc de code qui tue le processus QBW32.exe. Ce n'est pas exactement souhaitable, mais c'est aussi une option.

    Quoi qu'il en soit, j'espère que cela aide toute personne qui passe dans cet obstacle dans un proche avenir.

    Mise à jour au 9/12/17:

    Il semble que commencer avec QuickBooks 2016, ce comportement n'est plus un problème. Peu importe si vous transmettez ou non un fichier d'entreprise avec ou sans connexion automatique, lorsque vous démarrez une session, le QBW32.exe s'ouvrira ensuite lorsque l'utilisateur tente d'exécuter l'exécutable directement ou via le raccourci de menu de bureau / démarrage ( s). Ce qui est intéressant, c'est que le processus QBW32.exe peut déjà être exécuté en arrière-plan à partir de vous avoir passé dans un fichier d'entreprise sans connexion automatique. Néanmoins, peu importe, l'utilisateur peut ouvrir des QuickBooks et ne recevra pas le message indiquant que QuickBooks est déjà en cours d'exécution.

    J'ai testé cela avec QuickBooks Enterprise 2016 et Enterprise 2017. Tous nos utilisateurs qui ont au moins QuickBooks 2016 (différentes éditions, PRO, PREMIER, etc.) ne se sont pas plaints du problème susmentionné non plus. Je vais sortir sur un membre ici et deviner que l'Intuut a décidé de résoudre le problème intentionnellement ou involontairement.

    Ainsi, je ne recommande donc l'approche ci-dessus que si vous ou un utilisateur de votre application intégrée utilise toujours une version de QuickBooks sous QuickBooks 2016.


3 commentaires

À partir de 2019-12-5, il semble que cela soit peut-être un problème. J'ai une question d'appui ouvert sur le forum de QB SDK. Entre-temps, le processus Kill Solutions fonctionne, mais c'est terriblement inégétique.


@BOBMC a accepté, c'est une solution très inélégante. Malheureusement, le SDK QuickBooks n'est pas (ou du moins à ma connaissance), vous fournit une autre alternative. Je n'ai pas travaillé avec QB pendant environ 3 ans maintenant. Je parierais que l'intui peut avoir commis une erreur si ce problème est de retour. Quelle version voyez-vous cela en 2019? Il peut être intéressant de faire référence à ce post comme preuve que ce problème a été fixé à un moment donné et il est maintenant soudainement retourné.


C'est la fabrication et la vente en gros de QB Desktop Enterprise 2020. Bien que je puisse admettre que je suis à peine un expert sur le QB SDK, je crois que je vais tout faire comme prescrit. Ce fil est l'un des rares articles que j'ai vus avec des questions et des informations pertinentes concernant ce problème particulier. Merci pour votre excellente réponse.



4
votes

Je peux vous dire des années d'expérience de l'utilisation du SDK de bureau de C # que vous n'êtes pas seul. Intuit en est conscient, et cela n'a rien à voir avec l'option "Garder la course". J'ai bavardé avec le personnel de soutien intuitif; Certains croient que c'est un bug et certains croient que c'est par conception.

J'ai une application WinForms qui est en production depuis QuickBooks 2006 et à partir de 2011 (Entreprise 11), ce problème du processus suspendu au démarrage. À partir de 2013, même l'application testeuse du SDK ("SDK Test Plus 3") ferait le même comportement que votre application de testeur.

Mon application est exécutée sur de nombreux PC chez mon client, mais la partie qui communique avec QB appellerait à l'instance de QB sur son serveur (pas un QB installé sur leur PC), et j'ai choisi d'utiliser le "Kill QBW32 si Il ne fermera pas "idée. En 2014, je l'ai changé pour communiquer avec qb sur leur bureau (puisqu'il a du QB sur leur PC) et n'utilise pas la technique de tuer (car ils peuvent être en cours d'exécution à la fois). À cause de ce changement, je n'ai pas eu à s'inquiéter de QBW32 toujours en cours d'exécution et je n'ai eu aucun problème (mon client est le type pour me faire savoir).


1 commentaires

WlLuam Lorfing avec Intuit a ouvert un ticket de support à ce sujet après avoir interrogé si ce comportement était par conception. Pendant que j'aimerais penser que quelque chose peut en arriver, je suis sous l'impression que l'intui a des priorités plus élevées. Personnellement, je pense qu'ils envisagent de prendre leur retraite ou de supprimer la version de bureau de QB. Ils mettent certainement davantage l'accent sur QB Online. Quelle est la plus longue que la version de bureau sera prise en charge est quelque chose que nous devons attendre et voir.