5 Replies Latest reply: Nov 9, 2016 1:21 AM by Marcus Sommer RSS

    how to make a button unpressable when macro was running

    何 風

      hi, I have a problem.

       

      I have a qvw with a button ,and a macro in it.

      The macro is for execute a vbs on the local Disk.

       

      My problem is when the button was  pressed and the vbs is running at the background(for example 30 seconds),

      the button is pressable and if I press it again,the vbs also executed once again.

       

      Is there any solution to make the button unpressable when macro was running?

       

      (I'm running the qvw on the AccessPoint)

       

      thank you

        • Re: how to make a button unpressable when macro was running
          Marcus Sommer

          One way might be to put a condition into the button-availability (tab general) which counts the seconds against another value - but it would need to run permanent now() against the system (and it's not easy to implement a stable logic).

           

          Another very easy method would be to set a sleep-statement after calling the vbs like:

           

          ActiveDocument.GetApplication.Sleep 30000

           

          If this isn't suitable because the application would be unusable in this time I would store the execution-time from the macro into a variable and check them at first within the routine and only if now() - ExecutionTimeVariable > 30 seconds I would execute the vbs and otherwise do nothing (or maybe give the user a msgbox with an info).

           

          - Marcus

            • Re: how to make a button unpressable when macro was running
              何 風

              thank you for your answer.

              infact , i've tried [ActiveDocument.GetApplication.Sleep 30000] and the result is , it works well on the LocalClient but not on the AccessPoint.

               

              by the way ,how to show a msgbox on the AccessPoint?

              I tried vbs's [msgbox] and it shows nothing ( but in the LocalClient ,it works)

                • Re: how to make a button unpressable when macro was running
                  Marcus Sommer

                  The normal answers is that macros won't work within the AJAX client (only desktop client + IE plugin - there are some qmc-settings necessary) but I had read that nevertheless some basic routine will work.

                   

                  An alternative for a msgbox could be to use two textboxes which content and visibility is controlled by variables and to change the variable-values with the macro-routine (the second textbox is used to close/hide the first one and itself).

                   

                  - Marcus

              • Re: how to make a button unpressable when macro was running
                Peter Cammaert

                I wouldn't make the button "unpressable" because that would force the creation of a too complex solution in your QlikView document that would never be entirely satisfactory. The QV environment isn't particularly well suited for communicating with the outside world.

                 

                I would solve this in a different way: make the vbs script non-restartable. The first thing the vbs script would do is check for the existence of a temporary file with a specific name (e.g. _InUse.!!! - indeed, stolen from the Distribution Service ) If this zero-length file exists, the vbs script leaves immediately without doing anything. If not, the actual script starts by creating this file and doing whathever it needs to do. At the end of the script run, the special file is removed before exiting.

                 

                This special file is used as a sort of semaphore lock that restricts execution to a single instance at all times.

                 

                Best,

                 

                Peter

                • Re: how to make a button unpressable when macro was running
                  m w

                  I suggest adding a line at the beginning of your macro that hides the button and a line at the end that unhides it.