[AccessD] [ACCESS-L] Is there a way to dynamically hide fields if needed

David McAfee davidmcafee at gmail.com
Tue Oct 12 17:45:05 CDT 2010


Found it!

I simply had to move the subform requery before calling the function
on the subform.



On Thu, Oct 7, 2010 at 1:03 PM, David McAfee <davidmcafee at gmail.com> wrote:
> A.D., thanks for the code.
>
> I had to modify to work with my ADP.
>
>
> Right now I have an issue where I have to hit the OK button twice to
> make the filter work.
>
> If I put an option stop in the code and step through the function, it
> will work on the first click.
>
> This tells me it is a refresh/repaint issue.
>
> I've tried putting DoEvents all over the function as well as before
> and after the call, and it still doesn't do it on the first click:
>
> Does anyone have an idea why I would have to press the cmdbutton twice
> to get it to work?
>
> This is what I changed your function to:
> '***************************
> Public Sub P_HideEmptyColumnsNumeric()
> On Error Resume Next
>   Dim ct As Access.Control, fd As DAO.Field
>   Dim CtSource As String
>   Dim subtotal As Double
>   DoEvents
>   With Me.RecordsetClone
>       For Each ct In Me.Detail.Controls
>           DoEvents
>           Err.Clear
>           CtSource = ct.ControlSource
>             If ct.Tag = "Hideable" Then
>                DoEvents
>                ct.ColumnHidden = False
>                Set fd = .Fields(CtSource)
> '                Select Case CtSource
> '                    Case "invoice_no", "bill_to_cust", "IncDetID"
> '                        'Always hide these fields
> '                        ct.ColumnHidden = True
> '                    Case "item_no", "description", "quantity",
> "DlrPrice", "IncentiveAmt", "Unit Price", "TotalIncentive"
> '                        'Do nothing, leaving these fields visible
> '                    Case Else
>                        DoEvents
>                       .MoveLast
>                       subtotal = 0
>                       If Not .BOF Then
>                            Do Until .BOF
>                                If CtSource Like "=cdbl(*" Then
>                                    subtotal = subtotal +
> .Fields(Mid(CtSource, 8, Len(CtSource) - 9))
>                                Else
>                                    subtotal = subtotal +
> Nz(.Fields(CtSource), 0)
>                                End If
>                                .MovePrevious
>                            Loop
>                        Else
>                            subtotal = 0
>                        End If
>                        DoEvents
>                        If subtotal <= 0 Then
>                            DoEvents
>                            ct.ColumnHidden = True
>                        End If
> '                End Select
>           End If
>       Next
>   End With
>   Set ct = Nothing
>   Set fd = Nothing
>   On Error GoTo 0
> '***************************
>
> This is the call from the parent form:
> '************************************************************
> Private Sub cmdInvNoEnter_Click()
>
> ClearHeaderFields
> ShowHeaderFields (False)
>
> If Nz(Me.txtinvno, "") <> "" Then
>    Dim rs As ADODB.Recordset
>    Set rs = New ADODB.Recordset
>    'Call the stored procedure, passing it the parameter, returning recordset rs
>    CurrentProject.Connection.stpSalesHeaderByInvoiceNo Me.txtinvno, rs
>    'Fill in the fields from the returned recordset
>    If Not rs.BOF And Not rs.EOF Then
>        Me.txtInvDate = rs![TranDate]
>        Me.txtCustNo = rs![CustNo]
>        Me.txtCustName = rs![CustName]
>        Me.txtAMno = rs![AMno]
>        Me.txtAMname = rs![AMname]
>        Me.txtSSRno = rs![SSRno]
>        Me.txtSSRname = rs![SSRname]
>        ShowHeaderFields (True)
>        DoEvents
>        Call Me.sbfrmSalesDetailByInvoiceNo.Form.P_HideEmptyColumnsNumeric
>  'If I dont call it here, it doesnt work
>        DoEvents
>        Me.lstDet.RowSource = "EXEC stpSalesDetailByInvoiceNo '" &
> Me.txtinvno & "'" 'This is to test the list box vs datasheet subform
>        Call FormatLB
>    Else
>        Me.txtInvDate = ""
>        Me.txtCustNo = ""
>        Me.txtCustName = "Invoice number was not found"
>        Me.txtAMno = ""
>        Me.txtAMname = ""
>        Me.txtSSRno = ""
>        Me.txtSSRname = ""
>        Me.txtCustName.Visible = True
>        Me.lstDet.RowSource = ""
>    End If
>    rs.Close
>    Set rs = Nothing
>
>    'Me.sbfrmSalesDetailByInvoiceNo.Requery
>    Me.sbfrmSalesDetailByInvoiceNo.Form.Requery
>
> Else
>    ShowHeaderFields (False)
>    Me.sbfrmSalesDetailByInvoiceNo.Visible = False
>    Me.lstDet.RowSource = ""
> End If
> End Sub
> '*********************************************************
>
>
> On Sat, Oct 2, 2010 at 9:25 PM, A.D. Tejpal <adtp at airtelmail.in> wrote:
>> David,
>>
>>    You wish to effect dynamic hiding of empty columns (having no significant value beyond Nulls or zeros). Datasheet form happens to be well suited for this purpose.
>>
>>    Sample code in VBA module of the form, as given below, should get you the desired results. It is a generic routine, free of specific names for source query and its fields.
>>
>> Best wishes,
>> A.D. Tejpal
>> ------------
>>
>> ' Code in VBA module of datasheet form
>> ' (For hiding numeric columns having no
>> ' significant value beyond Nulls or zeros)
>> '==============================
>> Private Sub Form_Load()
>>    P_HideEmptyColumnsNumeric
>> End Sub
>> '----------------------------------------------
>>
>> Private Sub P_HideEmptyColumnsNumeric()
>> On Error Resume Next
>>    Dim ct As Access.Control, fd As DAO.Field
>>    Dim CtSource As String
>>
>>    With Me.RecordsetClone
>>        For Each ct In Me.Detail.Controls
>>            Err.Clear
>>            CtSource = ct.ControlSource
>>            If Err.Number = 0 And _
>>                        Not CtSource Like "=*" Then
>>                ' It is a bound control
>>                ct.ColumnHidden = False
>>                Set fd = .Fields(CtSource)
>>                Select Case fd.Type
>>                    ' Hide numeric columns - if blank
>>                    Case dbText, dbMemo, dbGUID
>>                    Case Else
>>                        .Filter = "Nz(" & CtSource & ", 0) > 0"
>>                        If .OpenRecordset.EOF Then
>>                            ' This column is blank - Hide it
>>                            ct.ColumnHidden = True
>>                        End If
>>                End Select
>>            End If
>>        Next
>>    End With
>>
>>    Set ct = Nothing
>>    Set fd = Nothing
>>    On Error GoTo 0
>> End Sub
>> '====================================
>>
>>  ----- Original Message -----
>>  From: David McAfee
>>  To: ACCESS-L at PEACH.EASE.LSOFT.COM
>>  Sent: Friday, October 01, 2010 22:52
>>  Subject: Is there a way to dynamically hide fields if needed
>>
>>
>>  (Crossposted on AccessD)
>>
>>
>>  I'm working in an ADP.
>>
>>  I have the pseudo pivot table since I am working in SQL2000 (PIVOT
>>  wasn't available until SQL2005)
>>
>>  SELECT
>>  SplitID, IncDetID, SplitTypeID, SplitAmt
>>  FROM tblSplit
>>  WHERE IncDetID = 5199
>>
>>  returns
>>
>>  SplitID IncDetID SplitTypeID SplitAmt
>>  36 5199 1 15.00
>>  37 5199 7 5.00
>>
>>
>>  My pseudo pivot table:
>>  SELECT IncDetID,
>>  SUM(CASE SplitTypeID WHEN 1 THEN SplitAmt ELSE 0 END) AS DlrPay,
>>  SUM(CASE SplitTypeID WHEN 2 THEN SplitAmt ELSE 0 END) AS SvcMgr,
>>  SUM(CASE SplitTypeID WHEN 3 THEN SplitAmt ELSE 0 END)
>>  AS PartsDept,
>>  SUM(CASE SplitTypeID WHEN 4 THEN SplitAmt ELSE 0 END) AS SvcAdv,
>>  SUM(CASE SplitTypeID WHEN 5 THEN SplitAmt ELSE 0 END) AS SvcDept,
>>  SUM(CASE SplitTypeID WHEN 6 THEN SplitAmt ELSE 0 END) AS SvcTech,
>>  SUM(CASE SplitTypeID WHEN 7 THEN SplitAmt ELSE 0 END) AS Contest
>>  FROM tblSPlit
>>  GROUP BY IncDetID
>>
>>  returns:
>>
>>  IncDetID DlrPay SvcMgr PartsDept SvcAdv SvcDept SvcTech Contest
>>  5199 15.00 0.00 0.00 0.00 0.00  0.00 5.00
>>
>>
>>  In the actual final display, there are many tables joined to this, so
>>  the resultset really looks like:
>>
>>  CustNo InvNo ItemNo Qty UnitPrice IncentiveAmt TotalIncentive
>>  DlrPay SvcMgr PartsDept SvcAdv SvcDept SvcTech Contest
>>  07235 5452 02951 6 54.95 20.00 120.00 15.00 0.00 0.00 0.00
>>  0.00 0.00 5.00
>>  07235 5452 03111 12 40.95 17.00 204.00 15.00 0.00 0.00 0.00
>>  0.00 0.00 2.00
>>  07235 5452 01121 24 30.95 20.00 480.00 15.00 0.00 0.00 0.00
>>  0.00 0.00 5.00
>>  07235 5452 01161 12 36.95 25.00 300.00 15.00 0.00 0.00 0.00
>>  0.00 0.00 10.00
>>  07235 5452 06011 12 47.95 22.00 264.00 15.00 0.00 0.00 0.00
>>  0.00 0.00   7.00
>>  07235 5452 10521 12 41.95 19.00 228.00 15.00 0.00 0.00 0.00
>>  0.00 0.00   4.00
>>
>>  I'd really like it to look like this:
>>  CustNo InvNo ItemNo Qty UnitPrice IncentiveAmt TotalIncentive DlrPay Contest
>>  07235 5452  02951 6 54.95 20.00 120.00 15.00 5.00
>>  07235 5452  03111 12 40.95 17.00 204.00 15.00 2.00
>>  07235 5452  01121 24 30.95 20.00 480.00 15.00 5.00
>>  07235 5452  01161 12 36.95 25.00 300.00 15.00 10.00
>>  07235 5452  06011 12 47.95 22.00 264.00 15.00 7.00
>>  07235 5452  10521 12 41.95 19.00 228.00 15.00 4.00
>>
>>  I'm still debating on displaying this as a listbox or subform on the main form.
>>
>>  I'm thinking if it is in a listbox, simply loop through the last 7
>>  colums. If the entire column is 0 then make that column a 0" width in
>>  the list box.
>>  If I go with a datasheet subform, run a recordset clone and if all
>>  values for a given field are 0 then make that field hidden.
>>
>>  any ideas?
>>
>>  I have to do this on a form and on a report (print out of the form) so
>>  I'm trying to think of a good way to do this that will apply to both.
>>
>>  Thanks,
>>  David
>




More information about the AccessD mailing list