====== Indicating progress ====== When doing a heavy job with VBA in Lime CRM, for example creating/updating many records at the same time, it could be a good idea to show the progress to the user. In the examples we create 1000 companies in smaller batches and shows the progress. Here's a few examples of how: * [[progress#status-bar|Using the status bar in Lime CRM]] * [[progress#work-dialog|Using Work dialog]] ( This solution also makes it possible for the user to cancel the job ) ===== Status bar ===== {{:customization:vba:image_of_a_statusbar.png|}} ==== Example ==== Dim i As Integer Dim j As Integer Dim oRecord As LDE.Record Dim oBatch As New LDE.Batch Set oBatch.Database = Application.Database ' Do 10 batches For j = 0 To 10 'Batches of 100 at the time For i = 0 To 100 Set oRecord = New LDE.Record Call oRecord.Open(Application.Database.Classes.Lookup("company", lkLookupClassByName)) oRecord.value("name") = "Company nummero - " & (j * 100 + i) Call oRecord.Update(oBatch) Next i Call oBatch.Execute ' Update text and progress Application.StatusBar.Text = "Creating " & (j * 100) & " / 1000 companies" ' Progressbar is not visible if progress 0, so set a minimum of 1. If j = 0 Then Application.StatusBar.Progress = 1 Else Application.StatusBar.Progress = 100 * ((j * 100) / 1000) End If Next j ' Remove Progressbar Application.StatusBar.Progress = 0 Application.StatusBar.Text = "" ===== Work dialog ===== ==== What is a work dialog ==== A work dialog is a small popup window that shows a progress bar with som text and can also have a cancel button. {{:customization:vba:image_of_a_workdialog.png|}} ==== Properties ==== ^ Name ^ Required ^ Type ^ Description ^ | Cancel | False | Boolean | Indicates if the user has pressed Cancel button | | CancelText | False | String | Text on Cancel button | | Caption | False | String | Title of the WorkDialog window | | Delay | False | Long | Will look into it | | Icon | False | IPictureDisp | What icon to show in the WorkDialog window | | Progress | False | Long | A number between 1 and 100 that indicates the progress of the bar | | Style | True | WorkDialogStyle (Enumeration) | Indicates what should be visible and not in the workDialog (If you want to use multiple styles just add them to eachother e.g. .Style = lcoShowCancelButton + lcoShowText) | | ::: | ::: | ::: | **lcoShowCancelButton** - Show cancel button (Also set **CancelText**) | | ::: | ::: | ::: | **lcoShowIcon** - Show icon in in workDialog (Also set **Icon**) | | ::: | ::: | ::: | **lcoShowProgressBar** - Show progress bar (Also set **Progress**) | | ::: | ::: | ::: | **lcoShowText** - Show text in workDialog (Also set **Text**) | | ::: | ::: | ::: | **lcoShowTopMost** - Makes the window topmost | | Text | False | String | The text that is shown inside the WorkDialog | ==== Steps ==== - Declare a LCO.WorkDialog With events and add listeners for them. - Create an instance of the workDialog and set initial values like caption and style. Then show it. - How to use the events. ==== Example ==== === 1) Declare WorkDialog === Private WithEvents m_WorkDialog As LCO.WorkDialog === 2) Create instance === Dim oIcon As IPictureDisp Set m_WorkDialog = New LCO.WorkDialog Set oIcon = LoadPicture(WebFolder & "/resources/MyIcons/progress_bar.ico", , , color) ' Of course the icon must exist at the given path. Set m_WorkDialog.Icon = oIcon m_WorkDialog.Caption = "Create companies!" m_WorkDialog.CancelText = "Cancel" m_WorkDialog.Text = "Preparing..." m_WorkDialog.Progress = 1 m_WorkDialog.Style = lcoShowCancelButton + lcoShowProgressBar + lcoShowText + lcoShowIcon Call m_WorkDialog.show === 3) Event listeners === 'Event for Cancel-button Private Sub m_WorkDialog_Cancel() On Error GoTo ErrorHandler m_WorkDialog.Cancel = True Call Lime.MessageBox("Cancelled") Exit Sub ErrorHandler: Call UI.ShowError("ControlsHandlerCompany.m_WorkDialog_Cancel") End Sub 'Event for doing the heavy job. (Creating companies in this case) Private Sub m_WorkDialog_Work() On Error GoTo ErrorHandler Dim i As Integer Dim j As Integer Dim oRecord As LDE.record Dim oBatch As New LDE.Batch Set oBatch.Database = Application.Database ' Do 10 batches For j = 0 To 10 'Is it cancelled? If m_WorkDialog.Cancel Then Exit For Else 'Batches of 100 at the time For i = 0 To 100 'Is it cancelled? If m_WorkDialog.Cancel Then Exit For Else Set oRecord = New LDE.record Call oRecord.Open(Application.Database.Classes.Lookup("company", lkLookupClassByName)) oRecord.Value("name") = "Company nummero - " & (j * 100 + i) Call oRecord.Update(oBatch) End If Next i 'Is it not cancelled? If Not m_WorkDialog.Cancel Then Call oBatch.Execute End If ' Update text and progress m_WorkDialog.Text = "Creating: " & (j * 100) & " / 1000" ' Progressbar is not visible if progress 0, so set a minimum of 1. If j = 0 Then m_WorkDialog.progress = 1 Else m_WorkDialog.progress = 100 * ((j * 100) / 1000) End If End If Next j Exit Sub ErrorHandler: Call UI.ShowError("ControlsHandlerCompany.m_WorkDialog_Work") End Sub