PBDR.COM

About   -   Contact   -   Purchase   -   Search   -   What's New

 
 
Drop Down Datawindow Tricks
This tip was submitted by Qing Vincent Yin.

Remember the feature of dddw where all the lookup values (in the child datawindow) are retrieved at the time the parent record is retrieved? Problem: why should the program retrieve a bunch of stand-by records (for dropdown purposes) while some users just want to view the "real, native" record itself, and never intended to click some of the dropdown arrows?

To suppress dddw.retrieve() at runtime is easy: just put a blank record in the datawindow painter at design time. The trick is to get the dddw to do the appropriate retrieve() at the moment when the user actually drops down the dddw (i.e., when he clicks the little dropdown arrow).

Someone once proposed a solution of doing the dddw.retrieve() in the `clicked!' event of the parent datawindow. That's a correct idea, but the problem is that `clicked!' event is fired whether the user clicks exactly on the dropdown arrow or the text edit box portion of that column. If the clicked spot is the latter (i.e., not the little arrow beside it), then the program should not do dddw.retrieve(). But it turns out that there's no way (to the best of my knowledge) to distinguish the clicked spot between those two. That is, GetObjectAtPointer() and GetClickedColumn() don't tell you whether the arrow itself was clicked. 

After some hacking, I gathered that the correct event is pbm_dwndropdown.

So the solution:

Create a user event ue_dddw_dropdown (mapped to pbm_dwndropdown) in the datawindow with the following script:

1) DataWindowChild dwc

        dwGetChild(GetColumnName(), dwc)
        dwc.SetTransObject(SQLCA)
        dwc.retrieve()

That's the basic implementation. Several improvements are:

2) dwGetChild(GetColumnName(), dwc) 

        // Now, if dwc.rowcount()>1, then the
        // dddw has once been dropped-down 
        // before. So don't bother to retrieve() again.
        // Remember that the dddw
        // initially has a single (blank) row.

        if dwc.rowcount() > 1 then return

        dwc.SetTransObject(SQLCA) 
        dwc.retrieve() 

     3) ...     // same as that in (1).
        dwc.retrieve(GetText())

        where the dddw's SQL is:
         select country_name from contry_lookup
         where country_name like :retrieve_argument + "%"

That is, if the user types in "ca" and click the dropdown arrow, the the list of country names dropped down will look like:

                cambodia
                cameroon
                canada
                ...   /* all countries starting with ca */

But countries like "france" and "russia" are not retrieved because they don't satisfy the LIKE clause in the SQL. Needless to say, that saves lots of runtime resources.

4) Suppose the dddw is "employee_name", and a previous field is "department". There are lots of employees in the company. But after you typed in "Information Services" for the department, tab to employee_name field and click the dropdown arrow, you only want to see a list of I.S. employees. So:

        ...   // same as that in (1)
        dwc.retrieve(GetItemString(GetRow(), "department"))

        where the dddw's SQL is:
          select employee_name from employee_table
          where department = :retrieve_argument 

Alright! Have fun and remember that pbm_dwndropdown is an undocumented event (and probably unsupported by Sybase.)

 

Top of Page

Legal Notice

Ken Howe 2011