Predmet:Re: Baza za evidenciju korisnika
Evo citava procedura koja radi u jednoj drugoj bazi
ption Compare Database 'Use database order for string comparisons
Option Explicit
Const QUOTE = """"
Private Function BuildSQLString(strFieldName As String, varFieldValue As Variant, intFieldType As Integer)
' Build string that can be used as part of an
' SQL WHERE clause. This function looks at
' the field type for the specified table field,
' and constructs the expression accordingly.
Dim strTemp As String
strTemp = "[" & strFieldName & "]"
' If the first part of the value indicates that it's
' to be left as is, leave it alone. Otherwise,
' munge the value as necessary.
If isOperator(varFieldValue) Then
strTemp = strTemp & " " & varFieldValue
Else
Select Case intFieldType
Case dbBoolean
' Convert to TRUE/FALSE
strTemp = strTemp & " = " & CInt(varFieldValue)
Case dbText, dbMemo
' Assume we're looking for anything that STARTS with the text we got.
' This is probably a LOT slower. If you want direct matches
' instead, use the commented-out line.
' strTemp = strTemp & " = " & QUOTE & varFieldValue & QUOTE
strTemp = strTemp & " LIKE " & QUOTE & varFieldValue & "*" & QUOTE
Case dbByte, dbInteger, dbLong, dbCurrency, dbSingle, dbDouble
' Convert to straight numeric representation.
strTemp = strTemp & " = " & varFieldValue
Case dbDate
' Convert to #date# format.
strTemp = strTemp & " = " & "#" & varFieldValue & "#"
Case Else
' This function really can't handle any of the other data types (DB_BINARY?)
strTemp = ""
End Select
End If
BuildSQLString = strTemp
End Function
Private Function BuildWHEREClause(frm As Form) As String
' Build the full WHERE clause based on fields
' on the passed-in form. This function attempts
' to look at all controls that have the correct
' settings in the Tag properties.
Dim intI As Integer
Dim strLocalSQL As String
Dim strTemp As String
Dim varDataType As Integer
Dim varControlSource As Variant
Dim ctl As Control
For intI = 0 To frm.Count - 1
Set ctl = frm(intI)
' Get the original control source.
varControlSource = adhCtlTagGetItem(ctl, "qbfField")
If Not IsNull(varControlSource) Then
' If the value of the control isn't null...
If Not IsNull(ctl) Then
' then get the value.
varDataType = adhCtlTagGetItem(ctl, "qbfType")
If Not IsNull(varDataType) Then
strTemp = "(" & BuildSQLString(CStr(varControlSource), ctl, CInt(varDataType)) & ")"
strLocalSQL = strLocalSQL & IIf(Len(strLocalSQL) = 0, strTemp, " AND " & strTemp)
End If
End If
On Error GoTo 0
End If
Next intI
If Len(strLocalSQL) > 0 Then strLocalSQL = "(" & strLocalSQL & ")"
BuildWHEREClause = strLocalSQL
End Function
Function glrDoQBF(strFormName As String, fCloseIt As Integer)
' Load the specified form as a QBF form. If
' the form is still loaded when control returns
' to this function, then it will attempt to
' build an SQL WHERE clause describing the
' values in the fields. DoQBF() will return
' either that SQL string or a null string,
' depending on what the user chose to do and
' whether or not any fields were filled in.
' In:
' strFormName: Name of the form to load
' fCloseIt: Close the form, if the user didn't?
' Out:
' Return Value: The calculated SQL string.
Dim strSQL As String
DoCmd.OpenForm strFormName, WindowMode:=acDialog
' You won't get here until user hides or closes the form.
' If the user closed the form, there's nothing
' to be done. Otherwise, build up the SQL WHERE
' clause. Once you're done, if the caller requested
' the QBF form to be closed, close it now.
If isFormLoaded(strFormName) Then
strSQL = BuildWHEREClause(Forms(strFormName))
If fCloseIt Then
DoCmd.Close acForm, strFormName
End If
End If
glrDoQBF = strSQL
End Function
Function glrQBF_DoClose()
' Close the current form.
DoCmd.Close
End Function
Function glrQBF_DoHide(frm As Form)
Dim varSQL As Variant
Dim strParentForm As String
'Get the name of the Parent form
strParentForm = Left(CStr(frm.Name), Len(CStr(frm.Name)) - 4)
'Create the approprite Where clause based on the fields with data in them
varSQL = glrDoQBF(CStr(frm.Name), False)
'Open the Parent form filtered with the Where clause genereated above
DoCmd.OpenForm strParentForm, acNormal, , varSQL
'Make this *_QBF form invisible
frm.Visible = False
End Function
Private Function isFormLoaded(strName As String)
' Return a logical value indicating whether a
' given formname is loaded or not.
On Error Resume Next
isFormLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0)
If Err.Number <> 0 Then
isFormLoaded = False
End If
End Function
Private Function isOperator(varValue As Variant)
' Return a logical value indicating whether a
' value passed in is an operator or not.
' This is NOT infallible, and may need correcting.
Dim varTemp As Variant
varTemp = Trim(UCase(varValue))
isOperator = False
' Check first character for <,>, or =
If InStr("<>=", Left(varTemp, 1)) > 0 Then
isOperator = True
' Check for IN (x,y,z)
ElseIf ((Left(varTemp, 4) = "IN (") And (Right(varTemp, 1) = ")")) Then
isOperator = True
' Check for BETWEEN ... AND ...
ElseIf ((Left(varTemp,
= "BETWEEN ") And (InStr(varTemp, " AND ") > 0)) Then
isOperator = True
' Check for NOT xxx
ElseIf (Left(varTemp, 4) = "NOT ") Then
isOperator = True
' Check for LIKE xxx
ElseIf (Left(varTemp, 5) = "LIKE ") Then
isOperator = True
End If
End Function
Pozdrav!