Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.
Keywords: Microsoft Hierarchical Grid Control mshflxgd mshflxgd.ocx OCX Dialog Control COMCONTROL
Using the Microsoft Hierarchical Grid Control (mshflxgd.ocx)
Stan Littlefield, January 28, 2006
UPDATED: Deana Falk, April 30, 2008
This tutorial is based on the Winbatch COMCONTROL object. In the dialog editor the object is inserted as.
FLEXFormat=`WWWDLGED,6.1` FLEXCaption=`MSHFlexgrid - Basics [displaying an XML Recordset)` FLEXX=-01 FLEXY=-01 FLEXWidth=362 FLEXHeight=213 FLEXNumControls=004 FLEXProcedure=`dlgproc` FLEXFont=`DEFAULT` FLEXTextColor=`DEFAULT` FLEXBackground=`DEFAULT,DEFAULT` FLEXConfig=0 FLEX001=`317,191,036,012,PUSHBUTTON,DEFAULT,"E&xit",99,2,32,DEFAULT,DEFAULT,DEFAULT` FLEX002=`003,003,352,182,COMCONTROL,'[myLicense]',"MSHierarchicalFlexGridLib.MSHFlexGrid.6",DEFAULT,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX003=`005,191,058,012,PUSHBUTTON,DEFAULT,"Sort by Supplier",1,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX004=`071,191,050,012,PUSHBUTTON,DEFAULT,"Sort by Product",2,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("FLEX")
The ‘grid’ will load an XML recordset (which is included at the end of this article and can be cut / pasted in notepad and saved as Inventory.xml). The dialog include includes a callback UDS, dlgproc() – the end result is
One important note: In the dialog code the reference to “[myLicense]” may need to be replaced with the license key of the .ocx – even though the grid control may be freely used and distributed. If you have a copy of Visual Studio, you can use a free download product from Microsoft, licreqst.exe– which when run will collect all controls on your PC and display a license key if it exists. For more details about licensing please read: COMCONTROL Licenses Explained
Step 1: Determine the Datasource – in this case a persisted xml file
path = DirScript() DirChange(path) cXML = StrCat(path,"Inventory.xml") If !FileExist(cXML) Pause('Error','Unable to locate XML file. make sure Inventory.xml exists in the same directory as the script' ) Exit EndIf oRS = ObjectCreate('ADODB.Recordset') oRS.Open(cXML,"Provider=MSPersist;",,,256) nS=1 ;used later for sorting nP=1 ;used later for sorting
Step 2: create the grid dialog (code shown earlier)
The important point here is that the callback procedure assigns the grid control to a variable, initializes the data and handles any events or other dialog functions such as ButtonsPressed. For simplicity sake dlgproc() is bare-bones with major tasks assigned to separate UDS.
#DefineSubRoutine dlgproc(handle,msg,id,p4,p5) Switch msg Case 0 ;Dialog Initialization oGrid = DialogObject(handle,2,3) ;creates our variable initgrid() ;loads the data and formats the grid ObjectEventAdd(oGrid, "Click", "Click") ;capture a grid event for special processing DialogProcOptions(handle, 2,1) Break Case 2 Switch id Case 001 ;exit Return(1) Case 003 ;sort by supplier gSort(9,nS) nS=nS+1 If nS>2 Then nS=1 Return(-2) Case 004 ;sort by product gSort(3,nP) nP=nP+1 If nP>2 Then nP=1 Return(-2) EndSwitch Break EndSwitch Return -2 #EndSubRoutine FLEXFormat=`WWWDLGED,6.1` FLEXCaption=`MSHFlexgrid - Basics [displaying an XML Recordset)` FLEXX=-01 FLEXY=-01 FLEXWidth=362 FLEXHeight=213 FLEXNumControls=004 FLEXProcedure=`dlgproc` FLEXFont=`DEFAULT` FLEXTextColor=`DEFAULT` FLEXBackground=`DEFAULT,DEFAULT` FLEXConfig=0 FLEX001=`317,191,036,012,PUSHBUTTON,DEFAULT,"E&xit",99,2,32,DEFAULT,DEFAULT,DEFAULT` FLEX002=`003,003,352,182,COMCONTROL,'[myLicense]',"MSHierarchicalFlexGridLib.MSHFlexGrid.6",DEFAULT,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX003=`005,191,058,012,PUSHBUTTON,DEFAULT,"Sort by Supplier",1,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX004=`071,191,050,012,PUSHBUTTON,DEFAULT,"Sort by Product",2,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("FLEX")
Step 3: Nuts and Bolts – creating, formatting and addressing the grid
This is merely a start and touches a small percentage of the properties and methods. However, all grids must be able to refer to a datasource (oRS in this case) and rows/columns which are addressed by an array index. This is accomplished in initgrid():
#DefineSubRoutine initgrid() oGrid.Recordset = oRS oGrid.ColWidth(0)=100 oGrid.AllowUserResizing = 3 ;both columns and rows oGrid.Wordwrap =1 ;this next for..next sets alternate row colors For x = 1 To oGrid.Rows - 1 oGrid.Row =x If x mod 2 == 0 oGrid.RowSel = x For i = 1 To oGrid.Cols - 1 oGrid.Col =i oGrid.ColSel = oGrid.Cols-1 oGrid.CellBackColor = 14349263 ;rgb value as long Next EndIf oGrid.TextMatrix(x, 0) = x Next sizecols() oGrid.ExpandAll() Return(1) #EndSubRoutine
The control displays an initial column(0) which acts like a row number. It needs to be visible if users are permitted to resize rows but we only make it 100 pixels wide. One further UDS, sizecols() is just a best guess on the width of each column.
#DefineSubRoutine sizecols() For z = 1 To oGrid.Cols - 1 sLen = "" nLen = 0 For y = 0 To oGrid.Rows - 1 cText = oGrid.TextMatrix(y, z) If StrLen(cText) > nLen Then nLen = StrLen(cText) Next ; this needs some work If nLen<10 oGrid.ColWidth(z) = nLen*100 Else oGrid.ColWidth(z) = nLen*50 EndIf Next Return(1) #EndSubRoutine
Two of the buttons in the dialog are assigned to sort specific columns in the grid. Two numeric memvars keep track of the last sort order so that the next time the button is clicked the order is reversed (ascending/descending).
<#DefineSubRoutine gSort(nCol,nOrder) oGrid.Col=nCol oGrid.Sort =nOrder Return(1) #EndSubRoutine
The script also handles the click event. This could also be handled by adding the ComEvent (14) to the dialog procedure.
#DefineSubRoutine Click() nCol = oGrid.MouseCol nRow = oGrid.MouseRow oGrid.TextMatrix(nRow,nCol) = StrUpper( oGrid.TextMatrix(nRow,nCol) ) oGrid.CellFontBold=1 oGrid.CellTextStyle=2 oGrid.FillStyle=1 Message("Column Data",oGrid.TextMatrix(nRow,nCol)) Return(1) #EndSubRoutine
This captures and displays the current cell data, taking case to also, capitalize and highlight the cell.
With 3-4 more lines of code, you could also handle editing cell values (if allowed by the underlying dataset).
Hopefully the code snippets and snapshots provide a useful framework for developing sophisticated Winbatch applications utilizing grids.
GoSub UDFS path = DirScript() DirChange(path) cXML = StrCat(path,"Inventory.xml") If !FileExist(cXML) Pause('Error','Unable to locate XML file. make sure Inventory.xml exists in the same directory as the script' ) Exit EndIf oRS = ObjectCreate('ADODB.Recordset') oRS.Open(cXML,"Provider=MSPersist;",,,256) nS=1 ;used later for sorting nP=1 ;used later for sorting FLEXFormat=`WWWDLGED,6.1` FLEXCaption=`MSHFlexgrid - Basics [displaying an XML Recordset)` FLEXX=-01 FLEXY=-01 FLEXWidth=362 FLEXHeight=213 FLEXNumControls=004 FLEXProcedure=`dlgproc` FLEXFont=`DEFAULT` FLEXTextColor=`DEFAULT` FLEXBackground=`DEFAULT,DEFAULT` FLEXConfig=0 FLEX001=`317,191,036,012,PUSHBUTTON,DEFAULT,"E&xit",99,2,32,DEFAULT,DEFAULT,DEFAULT` ;FLEX002=`003,003,352,182,COMCONTROL,'[myLicense]',"MSHierarchicalFlexGridLib.MSHFlexGrid.6",DEFAULT,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX002=`003,003,352,182,COMCONTROL,DEFAULT,"MSHierarchicalFlexGridLib.MSHFlexGrid.6",DEFAULT,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX003=`005,191,058,012,PUSHBUTTON,DEFAULT,"Sort by Supplier",1,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` FLEX004=`071,191,050,012,PUSHBUTTON,DEFAULT,"Sort by Product",2,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("FLEX") Exit :UDFS #DefineSubRoutine dlgproc(handle,msg,id,p4,p5) Switch msg Case 0 ;Dialog Initialization oGrid = DialogObject(handle,2,3) ;creates our variable initgrid() ;loads the data and formats the grid ObjectEventAdd(oGrid, "Click", "Click") ;capture a grid event for special processing DialogProcOptions(handle, 2,1) Break Case 2 Switch id Case 001 ;exit Return(1) Case 003 ;sort by supplier gSort(9,nS) nS=nS+1 If nS>2 Then nS=1 Return(-2) Case 004 ;sort by product gSort(3,nP) nP=nP+1 If nP>2 Then nP=1 Return(-2) EndSwitch Break EndSwitch Return -2 #EndSubRoutine #DefineSubRoutine initgrid() oGrid.Recordset = oRS oGrid.ColWidth(0)=100 oGrid.AllowUserResizing = 3 ;both columns and rows oGrid.Wordwrap =1 ;this next for..next sets alternate row colors For x = 1 To oGrid.Rows - 1 oGrid.Row =x If x mod 2 == 0 oGrid.RowSel = x For i = 1 To oGrid.Cols - 1 oGrid.Col =i oGrid.ColSel = oGrid.Cols-1 oGrid.CellBackColor = 14349263 ;rgb value as long Next EndIf oGrid.TextMatrix(x, 0) = x Next sizecols() oGrid.ExpandAll() Return(1) #EndSubRoutine #DefineSubRoutine sizecols() For z = 1 To oGrid.Cols - 1 sLen = "" nLen = 0 For y = 0 To oGrid.Rows - 1 cText = oGrid.TextMatrix(y, z) If StrLen(cText) > nLen Then nLen = StrLen(cText) Next ; this needs some work If nLen<10 oGrid.ColWidth(z) = nLen*100 Else oGrid.ColWidth(z) = nLen*50 EndIf Next Return(1) #EndSubRoutine #DefineSubRoutine gSort(nCol,nOrder) oGrid.Col=nCol oGrid.Sort =nOrder Return(1) #EndSubRoutine #DefineSubRoutine Click() nCol = oGrid.MouseCol nRow = oGrid.MouseRow oGrid.TextMatrix(nRow,nCol) = StrUpper( oGrid.TextMatrix(nRow,nCol) ) oGrid.CellFontBold=1 oGrid.CellTextStyle=2 oGrid.FillStyle=1 Message("Column Data",oGrid.TextMatrix(nRow,nCol)) Return(1) #EndSubRoutine Return
The XML file – cut and paste everything below this line:
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly' rs:updatable='true'>
<s:AttributeType name='Product_Line' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Product_Line'>
<s:datatype dt:type='string' dt:maxLength='3'/>
</s:AttributeType>
<s:AttributeType name='Product_Number' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Product_Number'>
<s:datatype dt:type='string' dt:maxLength='5'/>
</s:AttributeType>
<s:AttributeType name='Product_Description' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Product_Description'>
<s:datatype dt:type='string' dt:maxLength='75'/>
</s:AttributeType>
<s:AttributeType name='Item_Price' rs:number='4' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Item_Price'>
<s:datatype dt:type='number' rs:dbtype='currency' dt:maxLength='8' rs:precision='19' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='Number_On_Hand' rs:number='5' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Number_On_Hand'>
<s:datatype dt:type='string' dt:maxLength='3'/>
</s:AttributeType>
<s:AttributeType name='On_Sale' rs:number='6' rs:maydefer='true' rs:writeunknown='true' rs:basetable='Inventory'
rs:basecolumn='On_Sale'>
<s:datatype dt:type='boolean' dt:maxLength='2' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='Reorder_Level' rs:number='7' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Reorder_Level'>
<s:datatype dt:type='string' dt:maxLength='2'/>
</s:AttributeType>
<s:AttributeType name='Reorder_Quantity' rs:number='8' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Reorder_Quantity'>
<s:datatype dt:type='string' dt:maxLength='3'/>
</s:AttributeType>
<s:AttributeType name='Supplier_Name' rs:number='9' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Supplier_Name'>
<s:datatype dt:type='string' dt:maxLength='35'/>
</s:AttributeType>
<s:AttributeType name='Supplier_Country' rs:number='10' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Supplier_Country'>
<s:datatype dt:type='string' dt:maxLength='11'/>
</s:AttributeType>
<s:AttributeType name='Order_Price' rs:number='11' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Order_Price'>
<s:datatype dt:type='number' rs:dbtype='currency' dt:maxLength='8' rs:precision='19' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='Delivery_Days' rs:number='12' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'
rs:basetable='Inventory' rs:basecolumn='Delivery_Days'>
<s:datatype dt:type='string' dt:maxLength='2'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row Product_Line='050' Product_Number='10010' Product_Description='Stand, small (1 shelf, 3 legs)' Item_Price='25'
Number_On_Hand='2' On_Sale='True' Reorder_Level='5' Reorder_Quantity='15' Supplier_Name='Bob's Home Furniture'
Supplier_Country='USA' Order_Price='15' Delivery_Days='10'/>
<z:row Product_Line='020' Product_Number='10023' Product_Description='Bookcase (2 shelves)' Item_Price='85'
Number_On_Hand='12' On_Sale='True' Reorder_Level='5' Reorder_Quantity='20' Supplier_Name='Carlson's Furniture Ltd.'
Supplier_Country='GERMANY' Order_Price='60' Delivery_Days='15'/>
<z:row Product_Line='250' Product_Number='20010' Product_Description='Chair, rocking' Item_Price='150' Number_On_Hand='4'
On_Sale='False' Reorder_Level='5' Reorder_Quantity='20' Supplier_Name='Bob's Home Furniture' Supplier_Country='USA'
Order_Price='110' Delivery_Days='16'/>
<z:row Product_Line='400' Product_Number='20020' Product_Description='Chair, dining (with arms)' Item_Price='60'
Number_On_Hand='20' On_Sale='True' Reorder_Level='10' Reorder_Quantity='100' Supplier_Name='Bob's Home Furniture'
Supplier_Country='USA' Order_Price='35' Delivery_Days='12'/>
<z:row Product_Line='200' Product_Number='20021' Product_Description='Chair, dining (no arms)' Item_Price='45'
Number_On_Hand='50' On_Sale='True' Reorder_Level='12' Reorder_Quantity='100' Supplier_Name='Bob's Home Furniture'
Supplier_Country='USA' Order_Price='25' Delivery_Days='12'/>
<z:row Product_Line='200' Product_Number='20025' Product_Description='Chair, dining (no arms)' Item_Price='50'
Number_On_Hand='40' On_Sale='False' Reorder_Level='12' Reorder_Quantity='100' Supplier_Name='Bob's Home Furniture'
Supplier_Country='USA' Order_Price='35' Delivery_Days='12'/>
<z:row Product_Line='250' Product_Number='35000' Product_Description='Couch table (48 inches)' Item_Price='150'
Number_On_Hand='0' On_Sale='True' Reorder_Level='5' Reorder_Quantity='10' Supplier_Name='Neverland Furniture'
Supplier_Country='NETHERLANDS' Order_Price='100' Delivery_Days='20'/>
<z:row Product_Line='250' Product_Number='35010' Product_Description='Couch table (60 inches)' Item_Price='175'
Number_On_Hand='6' On_Sale='False' Reorder_Level='10' Reorder_Quantity='10' Supplier_Name='Neverland Furniture'
Supplier_Country='NETHERLANDS' Order_Price='120' Delivery_Days='20'/>
<z:row Product_Line='200' Product_Number='35030' Product_Description='Table, dining round (48 inches)' Item_Price='1200'
Number_On_Hand='1' On_Sale='False' Reorder_Level='10' Reorder_Quantity='10' Supplier_Name='Wooden Furniture Worldwide'
Supplier_Country='GERMANY' Order_Price='800' Delivery_Days='20'/>
<z:row Product_Line='200' Product_Number='35040' Product_Description='Table, dining oval (96 inches)' Item_Price='2500'
Number_On_Hand='7' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Wooden Furniture Worldwide'
Supplier_Country='GERMANY' Order_Price='1200' Delivery_Days='20'/>
<z:row Product_Line='200' Product_Number='35050' Product_Description='Table, dining oval (102 inches)' Item_Price='4500'
Number_On_Hand='8' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Wooden Furniture Worldwide'
Supplier_Country='GERMANY' Order_Price='3500' Delivery_Days='20'/>
<z:row Product_Line='250' Product_Number='35250' Product_Description='Coffee Table (48" octagon)' Item_Price='95'
Number_On_Hand='15' On_Sale='False' Reorder_Level='10' Reorder_Quantity='15' Supplier_Name='Neverland Furniture'
Supplier_Country='NETHERLANDS' Order_Price='65' Delivery_Days='8'/>
<z:row Product_Line='250' Product_Number='35255' Product_Description='Coffee Table (36x60 rectangle)' Item_Price='110'
Number_On_Hand='10' On_Sale='False' Reorder_Level='10' Reorder_Quantity='20' Supplier_Name='Neverland Furniture'
Supplier_Country='NETHERLANDS' Order_Price='75' Delivery_Days='8'/>
<z:row Product_Line='250' Product_Number='35260' Product_Description='Coffee Table (48" round)' Item_Price='95'
Number_On_Hand='9' On_Sale='False' Reorder_Level='10' Reorder_Quantity='15' Supplier_Name='Neverland Furniture'
Supplier_Country='NETHERLANDS' Order_Price='65' Delivery_Days='8'/>
<z:row Product_Line='400' Product_Number='47000' Product_Description='Entertainment center (3 piece)' Item_Price='2500'
Number_On_Hand='5' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='2000' Delivery_Days='30'/>
<z:row Product_Line='400' Product_Number='47001' Product_Description='Entertainment center (middle hutch)' Item_Price='1500'
Number_On_Hand='4' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='1000' Delivery_Days='30'/>
<z:row Product_Line='400' Product_Number='47002' Product_Description='Entertainment center (right side)' Item_Price='750'
Number_On_Hand='4' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='650' Delivery_Days='30'/>
<z:row Product_Line='400' Product_Number='47003' Product_Description='Entertainment center (left side)' Item_Price='750'
Number_On_Hand='4' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='650' Delivery_Days='30'/>
<z:row Product_Line='400' Product_Number='47004' Product_Description='Entertainment center (right side w/ glass door)'
Item_Price='1000' Number_On_Hand='8' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='800' Delivery_Days='30'/>
<z:row Product_Line='400' Product_Number='47005' Product_Description='Entertainment center (left side w/glass door)'
Item_Price='1000' Number_On_Hand='8' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='800' Delivery_Days='30'/>
<z:row Product_Line='400' Product_Number='47010' Product_Description='Entertainment center (proj. TV center shelf - 35")'
Item_Price='150' Number_On_Hand='9' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='100' Delivery_Days='15'/>
<z:row Product_Line='400' Product_Number='47011' Product_Description='Entertainment center (proj. TV center shelf - 40")'
Item_Price='250' Number_On_Hand='5' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='175' Delivery_Days='15'/>
<z:row Product_Line='400' Product_Number='47012' Product_Description='Entertainment center (proj. TV center shelf - 35" w/ glass door)'
Item_Price='300' Number_On_Hand='4' On_Sale='False' Reorder_Level='5' Reorder_Quantity='10' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='250' Delivery_Days='15'/>
<z:row Product_Line='400' Product_Number='47013' Product_Description='Entertainment center (proj. TV center shelf - 40" w/glass doors)'
Item_Price='400' Number_On_Hand='4' On_Sale='False' Reorder_Level='5' Reorder_Quantity='40' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='325' Delivery_Days='15'/>
<z:row Product_Line='400' Product_Number='47100' Product_Description='TV stand (32 inch max)' Item_Price='85'
Number_On_Hand='10' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='60' Delivery_Days='10'/>
<z:row Product_Line='400' Product_Number='47150' Product_Description='TV stand (40 inch max)' Item_Price='150'
Number_On_Hand='10' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture'
Supplier_Country='JAPAN' Order_Price='120' Delivery_Days='10'/>
<z:row Product_Line='400' Product_Number='47200' Product_Description='Stereo stand' Item_Price='150' Number_On_Hand='15'
On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Ernie's Entertainment Furniture' Supplier_Country='JAPAN'
Order_Price='120' Delivery_Days='10'/>
<z:row Product_Line='250' Product_Number='50250' Product_Description='Desk, office (72 inches, 6 drawer)' Item_Price='8500'
Number_On_Hand='0' On_Sale='False' Reorder_Level='3' Reorder_Quantity='3' Supplier_Name='Carlson's Furniture Ltd.'
Supplier_Country='GERMANY' Order_Price='7000' Delivery_Days='15'/>
<z:row Product_Line='250' Product_Number='50252' Product_Description='Credenza (48 inches)' Item_Price='350'
Number_On_Hand='6' On_Sale='True' Reorder_Level='3' Reorder_Quantity='3' Supplier_Name='Worldwide Office Furniture'
Supplier_Country='GERMANY' Order_Price='85' Delivery_Days='15'/>
<z:row Product_Line='200' Product_Number='50254' Product_Description='Printer stand' Item_Price='225' Number_On_Hand='0'
On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Worldwide Office Furniture' Supplier_Country='GERMANY'
Order_Price='275' Delivery_Days='15'/>
<z:row Product_Line='050' Product_Number='50260' Product_Description='Desk, chair w/ arms and rollers' Item_Price='400'
Number_On_Hand='10' On_Sale='False' Reorder_Level='6' Reorder_Quantity='6' Supplier_Name='Worldwide Office Furniture'
Supplier_Country='GERMANY' Order_Price='325' Delivery_Days='12'/>
<z:row Product_Line='250' Product_Number='50265' Product_Description='Desk, chair no arms w/ rollers' Item_Price='375'
Number_On_Hand='10' On_Sale='False' Reorder_Level='6' Reorder_Quantity='6' Supplier_Name='Worldwide Office Furniture'
Supplier_Country='GERMANY' Order_Price='300' Delivery_Days='12'/>
<z:row Product_Line='050' Product_Number='50270' Product_Description='Desk, chair no arms or rollers' Item_Price='350'
Number_On_Hand='10' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Worldwide Office Furniture'
Supplier_Country='GERMANY' Order_Price='275' Delivery_Days='12'/>
<z:row Product_Line='200' Product_Number='50275' Product_Description='Desk, chair w/ arms no rollers' Item_Price='365'
Number_On_Hand='10' On_Sale='False' Reorder_Level='5' Reorder_Quantity='5' Supplier_Name='Worldwide Office Furniture'
Supplier_Country='GERMANY' Order_Price='290' Delivery_Days='12'/>
<z:row Product_Line='300' Product_Number='65000' Product_Description='Bar stool - 36"' Item_Price='50'
Number_On_Hand='25' On_Sale='False' Reorder_Level='50' Reorder_Quantity='300' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='35' Delivery_Days='10'/>
<z:row Product_Line='300' Product_Number='65001' Product_Description='Bar stool - 40"' Item_Price='65'
Number_On_Hand='15' On_Sale='False' Reorder_Level='50' Reorder_Quantity='150' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='40' Delivery_Days='10'/>
<z:row Product_Line='300' Product_Number='65002' Product_Description='Bar stool - 48"' Item_Price='85'
Number_On_Hand='10' On_Sale='False' Reorder_Level='20' Reorder_Quantity='100' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='55' Delivery_Days='10'/>
<z:row Product_Line='300' Product_Number='65100' Product_Description='Bar table (normal height) - 36x36 (square)'
Item_Price='100' Number_On_Hand='30' On_Sale='False' Reorder_Level='20' Reorder_Quantity='50' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='65' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65110' Product_Description='Bar table (normal height) - 48x60 (rectangle)'
Item_Price='175' Number_On_Hand='30' On_Sale='False' Reorder_Level='20' Reorder_Quantity='50' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='140' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65120' Product_Description='Bar table (normal height) - 36 (round)'
Item_Price='120' Number_On_Hand='25' On_Sale='False' Reorder_Level='20' Reorder_Quantity='50' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='85' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65130' Product_Description='Bar table (normal height) - 48 (round)'
Item_Price='180' Number_On_Hand='20' On_Sale='False' Reorder_Level='20' Reorder_Quantity='50' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='145' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65140' Product_Description='Bar table (40") - 36x36 (square)'
Item_Price='150' Number_On_Hand='20' On_Sale='False' Reorder_Level='15' Reorder_Quantity='30' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='115' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65150' Product_Description='Bar table (40") - 36 (round)' Item_Price='170'
Number_On_Hand='20' On_Sale='False' Reorder_Level='15' Reorder_Quantity='40' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='135' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65160' Product_Description='Bar table (48") - 36x36 (square)'
Item_Price='200' Number_On_Hand='20' On_Sale='False' Reorder_Level='10' Reorder_Quantity='30' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='165' Delivery_Days='15'/>
<z:row Product_Line='300' Product_Number='65170' Product_Description='Bar table (48") - 36 (round)' Item_Price='220'
Number_On_Hand='20' On_Sale='False' Reorder_Level='10' Reorder_Quantity='30' Supplier_Name='Bob's Bar Stuff'
Supplier_Country='CANADA' Order_Price='185' Delivery_Days='15'/>
</rs:data>
</xml>
Article ID: W16926
File Created: 2019:08:14:09:07:42
Last Updated: 2019:08:14:09:07:42