Administer quotas from the people view of the NAB

This tip describes a procedure that allows you to view and set the mailfile quota for any user.

We added an action button to one of our People views in the NAB that allows us to view and set the mailfile quota for any user. I found a piece of code on that uses API calls to set the quota and warning. Then modified this code to so that we could use it as an action button in the People view of the NAB.


Option Declare
Option Compare Nocase

 WarningThreshold As Long
 SizeLimit As Long
 CurrentDbSize As Long
 MaxDbSize As Long
End Type
Declare Function NSFDbOpen Lib "nnotes.dll" Alias "NSFDbOpen" ( Byval dbName As String, hDb As Long) As Integer
Declare Function NSFDbClose Lib "nnotes.dll" Alias "NSFDbClose" ( Byval hDb As Long) As Integer
Declare Function NSFDbQuotaGet Lib "nnotes.dll" (Byval Filename As String, retQuotaInfo As dbQuotaInfo) As Integer
Declare Function NSFDbQuotaSet Lib "nnotes.dll" (Byval Filename As String, Flags As Integer, QuotaSet As DBQUOTAINFO) As Integer
Declare Function OSPathNetConstruct Lib"nnotes.dll" (Byval sPortName As String, Byval sServerName As String, Byval sFileName As String, Byval sPathName As String) As Integer

Const fld_mailfile = "mailfile"
Const fld_mailserver = "mailserver"
Const fld_fullname = "fullname"

Const warning_delta = 15000
Const mb75 = 76800
Const mb150 = 153600
Const mb250 = 256000
Const mb400 = 409600
Const mb600 = 614400
Const mb800 = 819200
Const mb1000 = 1024000
Const quota_bump = 25600

Sub Click(Source As Button)
 Dim s As New notessession
 Dim dc As notesdocumentcollection
 Dim db As notesdatabase
 Dim doc As notesdocument
 Dim ms As String, mf As String
 Dim nname As notesname
 Set db = s.currentdatabase
 Set dc = db.unprocesseddocuments
 Set doc = dc.getfirstdocument
 While Not doc Is Nothing
  mf = doc.getitemvalue( fld_mailfile )(0)
  ms = doc.getitemvalue( fld_mailserver )(0)
  If ms <> "" And mf <> "" Then 
   Set nname = New notesname( doc.getitemvalue( fld_fullname )(0) )
   setquota ms, mf, nname.common
  End If
  Set doc = dc.getnextdocument( doc )
End Sub

Function OpenDatabaseHandle(ServerName As String, Filename As String, ServerConstructPath As String, hDb As Long)
 Dim sServerName As String * 256
 Dim sFileName As String * 256
 Dim sPathName As String * 256
 Dim sPortName As String * 64
 OpenDatabaseHandle = False
'Store server and database file name 
 sServerName = ServerName & Chr(0)
 sFileName = Filename & Chr(0)
'Construct path
 Call OSPathNetConstruct (sPortName, sServerName, sFileName, sPathName)
 ServerConstructPath = sPathName
'Open database 
 Call NSFDBOpen(sPathName, hDb)
End Function
Function CloseDatabaseHandle(hDb)
 Call NSFDbClose(hDb)
End Function
Sub setquota( server As String, database As String, title As String )
 Const fm = "#,##0"
 Dim w As New notesuiworkspace
 Dim hDb As Long
 Dim ServerConstructPath As String
 Dim retQuotaInfo As DBQUOTAINFO
 Dim rv As Integer
 Dim Msg As String
 Dim warning As Long
 Dim quota As Long
 Dim dlg_title As String
 Dim dlg_accept As Integer
 Dim dlg_finished As Integer
 Dim qstring As String
 dlg_finished = False
 dlg_accept = False
 Call OpenDatabaseHandle(Server, Database, ServerConstructPath, hDb)
 If hDb = 0 Then
  Msgbox "Unable to get database hande....Exiting",,"Database Audit"
  Exit Sub
 End If
'Get the current quota settings and display them
 rv = NSFDbQuotaGet(ServerConstructPath, retQuotaInfo)
 Msg = "Warning Threshold:" & Chr$(9) & Format( retQuotaInfo.WarningThreshold/1024, fm ) & " mb" & Chr$(13)
 Msg = Msg & "Quota Size Limit:" & Chr$(9) & Chr$(9) & Format( retQuotaInfo.SizeLimit/1024, fm ) & " mb" & Chr$(13)
 Msg = Msg & "Current Database Size:" & Chr$(9) & Format( retQuotaInfo.CurrentDbSize/1024, fm ) & " mb" & Chr$(13) & Chr$(13)
 msg = msg & "Enter quota size in MB:"
 Select Case retQuotaInfo.CurrentDbSize/1024 + quota_bump
 Case Is <75 : quota = mb75
 Case Is < 150 : quota = mb150
 Case Is < 250 : quota = mb250
 Case Is < 400 : quota = mb400
 Case Is < 600 : quota = mb600
 Case Is < 800 : quota = mb800
 Case Is < 1000 : quota = mb1000
 Case Else :  quota = retQuotaInfo.CurrentDbSize + quota_bump
 End Select
 If title = "" Then
  dlg_title = "Quota Settings for " & Database & " (" & Server & ")"
  dlg_title = "Quota Settings for " & title & ", " & Database & " (" & Server & ")"
 End If
 While Not dlg_finished
  qstring = w.prompt( PROMPT_OKCANCELEDIT, dlg_title, msg, Format( quota/1024, fm) )
  If qstring = "" Then
   dlg_finished = True
   If Isnumeric( qstring ) Then
    quota = Clng( qstring ) * 1024
    dlg_accept = True
    dlg_finished = True
    Msgbox "The quota needs to be a number.",, "Invalid Entry"
   End If
  End If
 If dlg_accept Then
  'Set the new quota and warning
  If quota < warning_delta Then 
   warning = quota / 2
   warning = quota - warning_delta
  End If
  retQuotaInfo.WarningThreshold = warning
  retQuotaInfo.SizeLimit = quota
  rv = NSFDbQuotaSet(ServerConstructPath, 0, retQuotaInfo)
  If rv <> 0 Then
   Msgbox "Error" + Str( rv ) + ", setting the quota.  ",48, "Error setting quota."
   Print dlg_title + " set to " + Format( retQuotaInfo.SizeLimit/1024, fm )
  End If
 End If
 Call CloseDatabaseHandle(hDb)
End Sub
This was first published in July 2002

Dig deeper on LotusScript



Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:




  • iSeries tutorials's tutorials provide in-depth information on the iSeries. Our iSeries tutorials address areas you need to know about...

  • V6R1 upgrade planning checklist

    When upgrading to V6R1, make sure your software will be supported, your programs will function and the correct PTFs have been ...

  • Connecting multiple iSeries systems through DDM

    Working with databases over multiple iSeries systems can be simple when remotely connecting logical partitions with distributed ...