473,397 Members | 1,950 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,397 software developers and data experts.

Updating query on sub form

I have a form with some date fields and listboxes. It has a subform that is tied to a query. The query pulls data from an external database (Progress) via ODBC. I am trying to use the reults of the entries in the date fields and listboxes to build a filter statement to further filter the associated starting query. As I walked through the code via the debugger and monitored the values, all seemed well. But when I try to update the query, the subform displays an empty view (no records). The value in the debugger says there are ~1500 records. If I try to run the query a second time, it doesn't even try to do it. Can I have the query as record source on the subform or should it be unbound?
What am I missing? (Beyond brain cells that is)
Apr 18 '07 #1
4 1997
MMcCarthy
14,534 Expert Mod 8TB
I'll need to see the code you are using to apply the filter.
Apr 18 '07 #2
Part 1 of 2 of reply


This is the code for the fromDispatchBoard form:
Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2.  
  3. Option Explicit
  4. Private Const WS_CAPTION = &HC00000
  5.  
  6. Private Sub cmdExit_Click()
  7.   CloseActiveForm
  8. End Sub
  9.  
  10. Private Sub cmdMapit_Click()
  11.   MapSelectedOrders
  12. End Sub
  13.  
  14. Private Sub cmdUpdate_Click()
  15.   SelectOrders
  16. End Sub
  17.  
  18. Private Sub Form_Unload(Cancel As Integer)
  19.   If Not DB_Exit Then
  20.     DoEvents
  21.     Cancel = True
  22.   Else
  23.     Application.Quit
  24.   End If
  25. End Sub
  26. Private Sub cmdReset_Click()
  27.   'Clear the criteria
  28.   Me!txtStartDate = vbNullString
  29.   Me!txtEndDate = vbNullString
  30.   'Reset the selected properties
  31.   ExecuteSQL "SELECT qryDispatchBoard.* FROM qryDispatchBoard ORDER BY qryDispatchBoard.[s-date];"
  32.   'Clear the properties filter
  33.   Me![subFrmSubDispatchBoard].Form.FilterOn = False
  34.   Me![subFrmSubDispatchBoard].Form.Refresh
  35.   Me!lstBoard = Nothing
  36.   Me!lstTechnician = Nothing
  37.   Me!lstCity = Nothing
  38.   Me!lstZipcode = Nothing
  39.   Me!lstMapCoord = Nothing
  40. End Sub
  41. Sub SelectOrders()
  42.   'Displays Orders that match the criteria
  43.   On Error GoTo SelectOrders_Err
  44.   Dim strFilter As String
  45.   Dim strSQL As String
  46.   strSQL = vbNullString
  47.   strFilter = vbNullString
  48.   'Get the WHERE clause that defines the filter
  49.   strFilter = OrderFilter()
  50.   If strFilter <> vbNullString Then
  51.     'Apply the filter
  52.     strSQL = "SELECT qryDispatchBoard.* FROM qryDispatchBoard WHERE " & strFilter & ";"
  53.     If NumRecords(strSQL) > 0 Then
  54.       Me![subFrmSubDispatchBoard].Form.Filter = strFilter
  55.       Me![subFrmSubDispatchBoard].Form.FilterOn = True
  56.       ExecuteSQL strSQL
  57.     Else
  58.       MsgBox "No records match input criteria.", vbOKOnly, APP_NAME
  59.     End If
  60.   Else
  61.     Me![subFrmSubDispatchBoard].Form.FilterOn = False
  62.   End If
  63. SelectOrders_Err_Exit:
  64.   Exit Sub
  65. SelectOrders_Err:
  66.   Resume SelectOrders_Err_Exit
  67. End Sub
  68. Private Function OrderFilter() As String
  69.   'Create the WHERE clause that will be used as a filter
  70.   Dim intNoCriteria As Integer
  71.   Dim substrSQL As String
  72.   Dim BoardList As String
  73.   Dim lstBoard As ListBox
  74.   Dim lstTechnician As ListBox
  75.   Dim lstCity As ListBox
  76.   Dim lstZip As ListBox
  77.   Dim lstMapCoord As ListBox
  78.   Dim TechnicianList As String
  79.   Dim CityList As String
  80.   Dim ZipList As String
  81.   Dim MapCoordList As String
  82.   BoardList = vbNullString
  83.   TechnicianList = vbNullString
  84.   CityList = vbNullString
  85.   ZipList = vbNullString
  86.   MapCoordList = vbNullString
  87.   substrSQL = vbNullString
  88.   OrderFilter = vbNullString
  89.   intNoCriteria = False
  90.   intNoCriteria = IsNothing(Me!txtStartDate)
  91.   intNoCriteria = intNoCriteria And IsNothing(Me!txtEndDate)
  92.   If Not intNoCriteria Then
  93.     If Not IsNothing(Me!txtStartDate) And Not IsNothing(Me!txtEndDate) Then
  94.       substrSQL = "qryDispatchBoard.[s-date] between #" & Me!txtStartDate & "# AND #" & Me!txtEndDate & "#"
  95.     End If
  96.   End If
  97.   If Me!lstBoard.ItemsSelected.Count > 0 Then
  98.     If Left(substrSQL, 1) <> "(" Then
  99.       substrSQL = "(" & substrSQL & ")"
  100.     End If
  101.     BoardList = ListBoxContents(Me!lstBoard)
  102.     If numFound = 1 Then
  103.         substrSQL = substrSQL & "AND qryDispatchBoard.[s-type-call] = " & BoardList
  104.     Else
  105.         substrSQL = substrSQL & "AND (qryDispatchBoard.[s-type-call] = " & BoardList & ")"
  106.     End If
  107.   End If
  108.   If Me!lstTechnician.ItemsSelected.Count > 0 Then
  109.     If Left(substrSQL, 1) <> "(" Then
  110.       substrSQL = "(" & substrSQL & ")"
  111.     End If
  112.     TechnicianList = ListBoxContents(Me!lstTechnician)
  113.     If numFound = 1 Then
  114.         substrSQL = substrSQL & " AND qryDispatchBoard.[emp-id] = " & TechnicianList
  115.     Else
  116.         substrSQL = substrSQL & " AND (qryDispatchBoard.[emp-id] = " & TechnicianList & ")"
  117.     End If
  118.   End If
  119.   If Me!lstCity.ItemsSelected.Count > 0 Then
  120.     If Left(substrSQL, 1) <> "(" Then
  121.       substrSQL = "(" & substrSQL & ")"
  122.     End If
  123.     CityList = ListBoxContents(Me!lstCity)
  124.     If numFound = 1 Then
  125.         substrSQL = substrSQL & " AND qryDispatchBoard.city = " & CityList
  126.     Else
  127.         substrSQL = substrSQL & " AND (qryDispatchBoard.city = " & CityList & ")"
  128.     End If
  129.   End If
  130.   If Me!lstZip.ItemsSelected.Count > 0 Then
  131.     If Left(substrSQL, 1) <> "(" Then
  132.       substrSQL = "(" & substrSQL & ")"
  133.     End If
  134.     ZipList = ListBoxContents(Me!lstZip)
  135.     If numFound = 1 Then
  136.         substrSQL = substrSQL & " AND qryDispatchBoard.zip = " & ZipList
  137.     Else
  138.         substrSQL = substrSQL & " AND (qryDispatchBoard.zip = " & ZipList & ")"
  139.     End If
  140.   End If
  141.   If Me!lstMapCoord.ItemsSelected.Count > 0 Then
  142.     If Left(substrSQL, 1) <> "(" Then
  143.       substrSQL = "(" & substrSQL & ")"
  144.     End If
  145.     MapCoordList = ListBoxContents(Me!lstMapCoord)
  146.     If numFound = 1 Then
  147.         substrSQL = substrSQL & " AND qryDispatchBoard.[map-coor] = " & MapCoordList
  148.     Else
  149.         substrSQL = substrSQL & " AND (qryDispatchBoard.[map-coor] = " & MapCoordList & ")"
  150.     End If
  151.   End If
  152.   OrderFilter = Trim(substrSQL)
  153. End Function
  154. Sub MapSelectedOrders()
  155.   'Map the selected properties
  156.   On Error GoTo MapSelectedProperties_Err_Exit
  157.   Dim db As Database
  158.   Dim rstProps As Recordset
  159.  
  160.   Dim objLoc As MapPoint.Location
  161.   Dim objMap As MapPoint.Map
  162.   Dim objPushpin As MapPoint.Pushpin
  163.  
  164.   Dim strMsg As String
  165.   Dim i As Integer
  166.   i = 0
  167.   Set db = CurrentDb()
  168.  
  169.   'Load the selected properties into a recordset
  170.   Set rstProps = db.OpenRecordset("SELECT * FROM tblProperties WHERE ysnSelected = Yes;")
  171.   'Make sure at least one property was selected
  172.   If rstProps.RecordCount > 0 Then
  173.     'Load Map
  174.     If LoadMap() Then
  175.       'Open the form containing the map
  176.       FormOpen "frmMap"
  177.       Set objMap = gappMP.ActiveMap
  178.       'Place a pushpin on the map for each selected property
  179.       While Not rstProps.EOF
  180.         i = i + 1
  181.         Set objLoc = objMap.FindAddressResults(rstProps!strStreet, rstProps!strCity, rstProps!strState, rstProps!strPostalCode)(1)
  182.         Set objPushpin = objMap.AddPushpin(objLoc, rstProps!strStreet)
  183.         objPushpin.name = CStr(i)
  184.         objPushpin.Note = "$" & rstProps!curListPrice
  185.         objPushpin.BalloonState = geoDisplayBalloon
  186.         objPushpin.Symbol = 77
  187.         objPushpin.Highlight = True
  188.         rstProps.MoveNext
  189.       Wend
  190.       'Show all pushpins on the map display
  191.       objMap.DataSets.ZoomTo
  192.     Else
  193.       strMsg = "Unable to load map."
  194.       MsgBox strMsg, vbOKOnly + vbExclamation, APP_NAME
  195.     End If
  196.   Else
  197.     strMsg = "No properties selected."
  198.     MsgBox strMsg, vbOKOnly + vbExclamation, APP_NAME
  199.   End If
  200. MapSelectedProperties_Err_Exit:
  201.   On Error Resume Next
  202.   Set objPushpin = Nothing
  203.   Set objLoc = Nothing
  204.   Set objMap = Nothing
  205.   rstProps.Close
  206.   db.Close
  207.   Exit Sub
  208. MapSelectedProperties_Err:
  209.   Resume MapSelectedProperties_Err_Exit
  210. End Sub
  211. Function LoadMap() As Boolean
  212.   'Create an instance of MapPoint
  213.   On Error GoTo LoadMap_Err
  214.   Set gappMP = CreateObject("MapPoint.Application")
  215.   gappMP.Visible = False
  216.   gappMP.PaneState = geoPaneNone
  217.   'Get the handle of the MapPoint Window
  218.   ghwndMP = FindWindow(vbNullString, "Map - Microsoft MapPoint North America")
  219.   'Remove MapPoint Title Bar
  220.   FlipBit ghwndMP, WS_CAPTION, False
  221.   LoadMap = True
  222. LoadMap_Err_Exit:
  223.   Exit Function
  224. LoadMap_Err:
  225.   LoadMap = False
  226.   GoTo LoadMap_Err_Exit
  227. End Function
Apr 18 '07 #3
Part 2 of 2 of reply

This is the module for all the public functions and subs:


Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2.  
  3. Option Explicit
  4.  
  5. Global Const APP_NAME = "Dispatch Board Mapper"
  6.  
  7. 'Reference to MapPoint
  8. Public gappMP As MapPoint.Application
  9.  
  10. 'Handle to MapPoint Window
  11. Public ghwndMP As Long
  12.  
  13. 'Used to get window style bits.
  14. Public Const GWL_EXSTYLE = -20
  15. Public Const GWL_STYLE = -16
  16.  
  17. 'Force total redraw that shows new styles.
  18. Public Const SWP_FRAMECHANGED = &H20
  19. Public Const SWP_NOMOVE = &H2
  20. Public Const SWP_NOZORDER = &H4
  21. Public Const SWP_NOSIZE = &H1
  22.  
  23. Public numFound As Integer
  24.  
  25. '********************************************************
  26. '* Window's API Function Prototypes
  27. '********************************************************
  28. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  29.        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  30.  
  31. Public Declare Function SetParent Lib "user32" _
  32.        (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
  33.  
  34. Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
  35.        (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  36.  
  37. Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  38.        (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  39.  
  40. Public Declare Function SetWindowPos Lib "user32" _
  41.        (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
  42.  
  43. Public Declare Function GetWindowThreadProcessId Lib "user32.dll" _
  44.        (ByVal hwnd As Long, lpdwProcessId As Long) As Long
  45. Public Function DB_Startup()
  46.   On Error Resume Next
  47.   FormOpen "frmDispatchBoard"
  48. End Function
  49. Public Function DB_Exit() As Boolean
  50.   On Error Resume Next
  51.   Dim strMsg As String
  52.   DB_Exit = False
  53.   strMsg = "Exit " & APP_NAME & "?"
  54.   If MsgBox(strMsg, vbExclamation + vbYesNo + vbDefaultButton1, APP_NAME & " Exit") = vbYes Then
  55.     If IsFormOpen("frmDispatchMap") Then
  56.       gappMP.ActiveMap.Saved = True
  57.       gappMP.Quit
  58.       CloseForm "frmDispatchMap"
  59.     End If
  60.     DB_Exit = True
  61.     CloseForm "frmDispatchBoard"
  62.   End If
  63. End Function
  64. Public Sub FlipBit(hwnd As Long, ByVal lngStyleBit As Long, ByVal bValue As Boolean)
  65.   'Windows Style Manipulation Function
  66.   Dim lngStyle As Long
  67.   'Retrieve current style bits
  68.   lngStyle = GetWindowLong(hwnd, GWL_STYLE)
  69.   'Set requested bit On or Off
  70.   If bValue Then
  71.     lngStyle = lngStyle Or lngStyleBit
  72.   Else
  73.     lngStyle = lngStyle And Not lngStyleBit
  74.   End If
  75.   SetWindowLong hwnd, GWL_STYLE, lngStyle
  76.   'Redraw the window
  77.   Redraw hwnd
  78. End Sub
  79. Public Sub Redraw(hwnd As Long)
  80.   'Redraw window with new style
  81.   Const swpFlags As Long = SWP_FRAMECHANGED Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_NOSIZE
  82.   SetWindowPos hwnd, 0, 0, 0, 0, 0, swpFlags
  83. End Sub
  84. Public Sub CloseForm(strForm As String)
  85.   On Error Resume Next
  86.   DoCmd.Close A_FORM, strForm
  87. End Sub
  88. Public Function IsNothing(v As Variant) As Integer
  89.   'Returns TRUE if the value passed in is Empty, Null, or a zero
  90.   'length string, or if a string is blank.
  91.   IsNothing = False
  92.   Select Case VarType(v)
  93.     Case V_EMPTY
  94.       IsNothing = True
  95.     Case V_NULL
  96.       IsNothing = True
  97.     Case V_STRING
  98.       If Len(v) = 0 Or v = " " Then
  99.         IsNothing = True
  100.       End If
  101.     Case Else
  102.       IsNothing = False
  103.     End Select
  104. End Function
  105. Public Function ListBoxContents(LB As ListBox) As String
  106.     'Returns extended SQL code if selected entries are found
  107.     'Null if none are selected
  108.     Dim intCurrentRow As Integer
  109.     ListBoxContents = vbNullString
  110.     numFound = 0
  111.     For intCurrentRow = 0 To LB.ColumnCount - 1
  112.         If LB(intCurrentRow) Then
  113.             numFound = numFound + 1
  114.             If numFound > 1 Then
  115.                 ListBoxContents = ListBoxContents & " OR " & LB.Column(intCurrentRow)
  116.             Else
  117.                 ListBoxContents = LB.Column(intCurrentRow)
  118.             End If
  119.         End If
  120.     Next intCurrentRow
  121. End Function
  122. Public Sub CloseActiveForm()
  123.   On Error Resume Next
  124.   DoCmd.Close A_FORM, Screen.ActiveForm.FormName
  125. End Sub
  126. Public Function NumRecords(strSQL As String) As Long
  127.   On Error Resume Next
  128.   Dim db As Database
  129.   Dim rstTmp As Recordset
  130.   Set db = CurrentDb()
  131.   Set rstTmp = db.OpenRecordset(strSQL)
  132.   rstTmp.MoveLast
  133.   NumRecords = rstTmp.RecordCount
  134.   rstTmp.Close
  135.   db.Close
  136. End Function
  137. Public Sub ExecuteSQL(strSQL As String)
  138.   On Error Resume Next
  139.   Dim db As Database
  140.   Set db = CurrentDb()
  141.   db.Execute strSQL, dbSeeChanges
  142.   db.Close
  143. End Sub
  144. Public Sub FormOpen(strFormName As String)
  145.   On Error Resume Next
  146.   DoCmd.OpenForm strFormName, A_NORMAL
  147. End Sub
  148. Public Function IsFormOpen(strFormName As String)
  149.   On Error Resume Next
  150.   IsFormOpen = (SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> 0)
  151. End Function
  152. Public Function GetAppPath() As String
  153.   'Returns the path and name of the currently executing library database
  154.   Dim db As Database
  155.   Set db = CodeDb()
  156.   GetAppPath = db.name
  157.   db.Close
  158. End Function
  159. Public Function GetAppDir() As String
  160.   'Returns the directory of the local DB
  161.   GetAppDir = GetDirPart(GetAppPath())
  162. End Function
  163. Public Function GetDirPart(strIn As String) As String
  164.   'Returns the directory fully qualified file name
  165.   Dim intCounter As Integer
  166.   Dim strTmp As String
  167.   For intCounter = Len(strIn) To 1 Step -1
  168.     If Mid$(strIn, intCounter, 1) <> "\" Then
  169.       strTmp = Mid$(strIn, intCounter, 1) & strTmp
  170.     Else
  171.       Exit For
  172.     End If
  173.   Next intCounter
  174.   GetDirPart = Mid(strIn, 1, Len(strIn) - Len(strTmp))
  175. End Function
  176. Function CopyFile(strSource As String, strDest As String) As Boolean
  177.   'Copy a the source file to the destination
  178.   On Error GoTo CopyFile_Err
  179.   Dim fs As Object
  180.   Set fs = CreateObject("Scripting.FileSystemObject")
  181.   fs.CopyFile strSource, strDest
  182.   Set fs = Nothing
  183.   CopyFile = True
  184. CopyFile_Err_Exit:
  185.   Exit Function
  186. CopyFile_Err:
  187.   CopyFile = False
  188.   Resume CopyFile_Err_Exit
  189. End Function
Apr 18 '07 #4
MMcCarthy
14,534 Expert Mod 8TB
Expand|Select|Wrap|Line Numbers
  1. Sub SelectOrders()
  2.   'Displays Orders that match the criteria
  3.   On Error GoTo SelectOrders_Err
  4.   Dim strFilter As String
  5.   Dim strSQL As String
  6.   strSQL = vbNullString
  7.   strFilter = vbNullString
  8.   'Get the WHERE clause that defines the filter
  9.   strFilter = OrderFilter()
  10.   If strFilter <> vbNullString Then
  11.     'Apply the filter
  12.     strSQL = "SELECT qryDispatchBoard.* FROM qryDispatchBoard WHERE " & strFilter & ";"
  13.     If NumRecords(strSQL) > 0 Then
  14.       Me![subFrmSubDispatchBoard].Form.Filter = strFilter
  15.       Me![subFrmSubDispatchBoard].Form.FilterOn = True
  16.       ExecuteSQL strSQL
  17.     Else
  18.       MsgBox "No records match input criteria.", vbOKOnly, APP_NAME
  19.     End If
  20.   Else
  21.     Me![subFrmSubDispatchBoard].Form.FilterOn = False
  22.   End If
  23.     Me![subFrmSubDispatchBoard].Form.Requery
  24. SelectOrders_Err_Exit:
  25.   Exit Sub
  26. SelectOrders_Err:
  27.   Resume SelectOrders_Err_Exit
  28. End Sub
  29.  
Try requerying the subform as above
Apr 24 '07 #5

Sign in to post your reply or Sign up for a free account.

Similar topics

3
by: | last post by:
Hello, Sorry to ask what is probably a simple answer, but I am having problems updating a table/database from a PHP/ PHTML file. I can Read From the Table, I can Insert into Table/Database, But...
11
by: Jason | last post by:
Let's say I have an html form with 20 or 30 fields in it. The form submits the fields via POST to a php page which updates a table in a database with the $_POST vars. Which makes more sense? ...
1
by: Derek Davlut | last post by:
I have a Table that contains data that I use in a query to manipulte the data through expressions. I have a form that uses the query for manipulating the data. How do I write the changed values...
4
by: Laura | last post by:
Here's the situation: I'm trying to use an update query to copy data from one row to another. Here is the situation: I have 5 companies that are linked to each other. I need to show all 5...
2
by: Ray Holtz | last post by:
I have a form that shows a single record based on a query criteria. When I click a button it is set to use an append query to copy that record to a separate table, then deletes the record from the...
3
by: MLH | last post by:
I have a form, bound to a query. Its RecordSource property is a query named frmEnterLienAmounts. The form has a few bound controls and some unbound controls. The unbound controls are calculated...
2
by: barret bonden | last post by:
(closest newsgroup I could find) Error Type: ADODB.Recordset (0x800A0CB3) Current Recordset does not support updating. This may be a limitation of the provider, or of the selected locktype....
1
by: cover | last post by:
I'm trying to put together a system that upgrades records in a database and apparently have run into a bit of a glitch. I think the problem is with the $HTTP_POST_VARS portion of the code. Is...
15
by: sara | last post by:
I have a Memo field in a table to hold notes from a conversation a social worker has had with a client (this is for a non-profit). If the user needs to update the memo field, I need to find the...
3
by: Spoogledrummer | last post by:
Hi it's me again, still working on the sam 5 minute problem so feeling kind of thick now. I've dumped the idea of using a textarea for now and am using a textbox instead but am struggling when it...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.