473,396 Members | 1,722 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,396 software developers and data experts.

Retrieve Records from Stored Procedure

157 100+
Hello my good people!

It have come to my mind that stored procedures can help us speed up the retrival of records from our SQL server.

I have now made a stored procedure at our server which is called "StoreProcedure1"

normally i would use this code to populate listboxes with information. I would prefer to use a stored procedure cause of the speed advantage i think it has.

Expand|Select|Wrap|Line Numbers
  1. Sub Populer_Liste_avansert(SQL As String, Skjema As String, Liste As String)
  2. Dim r As DAO.Recordset
  3. Dim Coll As New Collection
  4. Dim Tmpstr As String
  5. Dim Fieldstr As Long
  6.  
  7. '--------------------------
  8. 'Åpne recordset
  9. '--------------------------
  10.  
  11. Set r = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot, dbSeeChanges)
  12.  
  13. '--------------------------
  14. 'Finn overskrifter
  15. '--------------------------
  16. For x = 1 To r.Fields.Count
  17.     Coll.ADD (r.Fields(x - 1).Name)
  18. Next x
  19.  
  20. '--------------------------
  21. 'Lag en string med overskriftene
  22. '--------------------------
  23. For x = 1 To Coll.Count
  24.     If Not Tmpstr = "" Then
  25.         Tmpstr = Tmpstr & ";" & Coll(x)
  26.     Else
  27.         Tmpstr = Coll(x)
  28.     End If
  29. Next x
  30.  
  31. '--------------------------
  32. 'Endre kildetype på listen
  33. '--------------------------
  34. Forms(Skjema).Controls(Liste).RowSourceType = "Verdiliste"
  35.  
  36. '--------------------------
  37. 'Sett inn overskriftene i listen
  38. '--------------------------
  39. Forms(Skjema).Controls(Liste).RowSource = ""
  40. Forms(Skjema).Controls(Liste).AddItem Tmpstr
  41.  
  42. '--------------------------
  43. 'Hent og sett inn verdiene
  44. '--------------------------
  45.  
  46. '--------------------------
  47. 'Gå gjennom alle postene
  48. '--------------------------
  49. Do Until r.EOF
  50.     I = I + 1
  51.     '--------------------------
  52.     'Tøm Coll
  53.     '--------------------------
  54.     For x = 1 To Coll.Count
  55.         Coll.Remove (1)
  56.     Next x
  57.  
  58.     '--------------------------
  59.     'Hent verdier
  60.     '--------------------------
  61.     For x = 1 To r.Fields.Count
  62.         Coll.ADD (r.Fields(x - 1).Value)
  63.     Next x
  64.  
  65.     '--------------------------
  66.     'Lag string
  67.     '--------------------------
  68.     Tmpstr = ""
  69.     For x = 1 To Coll.Count
  70.         If Not Tmpstr = "" Then
  71.             Tmpstr = Tmpstr & ";" & Coll(x)
  72.         Else
  73.             Tmpstr = Coll(x)
  74.         End If
  75.     Next x
  76.  
  77.     '------------------------------------
  78.     'Sjekk om max listeinnhold er oppnådd
  79.     '------------------------------------
  80.     Fieldstr = Fieldstr + Len(Tmpstr)
  81.     If Fieldstr > 32736 Then
  82.         imax = 200
  83.         GoTo slutt
  84.     End If
  85.  
  86.     '--------------------------
  87.     'Sett inn post i listen
  88.     '--------------------------
  89.     Forms(Skjema).Controls(Liste).AddItem Tmpstr
  90.  
  91.     r.MoveNext
  92. Loop
  93.  
  94. slutt:
  95. r.Close
  96.  
  97.  
  98. Set rs = Nothing
  99. Set Coll = Nothing
  100.  
  101.  
  102. End Sub
  103.  
  104.  
  105.  
  106.  

Can anyone help me on how to open a stored procedure and running trough all the records and retriving the data. The collection and all that you need not to think of, just how to open the procedure and retrive all the rows from it
Jul 14 '10 #1
7 2425
Jim Doherty
897 Expert 512MB
@MrDeej
In your mdb file Create a passthrough query you can either do that hardwired into your database as a saved query where the connection string is stored with the query ( my guess is you will not want this given the clutter it involves by having small queries taking up the database window) or you can create it in code and either save it(in code) so it becomes part of your database or run it as a 'temporary' query (ie a created querydef with no name "") in memory for the period of your code flow then destroy. You can then open your recordset in the usual way based on that persisted or temporary querydef.

Given your workflow is seemingly code based look at CreateQueryDef and manipulate the .SQL property and .ReturnsRecords property of the query object as you create it.

So.... in essence the only command that exists in the SQL Window of the passthrough would be StoredProcedure1 (if you are passing parameters as part of that process then you merely append to that string the relevant parameter 'values' (each value delimited by a comma and each value wrapped with a quote mark) via your code so that the server can execute it.

DAO and ADO have obvious differences in approach to this but given your post mentions DAO I will leave it at that for the moment.
Jul 14 '10 #2
NeoPa
32,556 Expert Mod 16PB
I expect your earlier code worked with Access objects, so DAO would be fine. Working with objects in SQL Server you probably want to switch over to ADODB I would suggest.
Jul 14 '10 #3
MrDeej
157 100+
@Jim Doherty
Thank you Jim Doherty. Pass-trough query did the job, it is considerably faster when i open my left joined table with 1 million posts :=)

Thanks a million.

Here is a good link for finding the walktrough by m$
http://support.microsoft.com/kb/303968

And NeoPa: Could you ellaborate? We also use ADO to populate listboxes, but by experience there are some functions that doesnt work with ADO that works with DAO and vice versa, the code i posted farther up is just 1 of 5 elements in on user-function
Jul 14 '10 #4
Jim Doherty
897 Expert 512MB
@MrDeej
Hi, Glad you sorted,

The MS walkthrough highlights the steps you can take inserting SQL in the passthrough SQL Window. What it does not outline unfortunately which would in my opinion be of benefit for the uninitiated, is that you can simply place the 'name' of the stored procedure in the passthrough SQL window.

Given the SQL for a stored procedure is actually resident on the server and not the client it would NOT necessarily be glaringly obvious to the newbie reader that simply entering the stored procedure name in the Access passthrough window in the manner suggested would work, which of course it does.

I add this because typing in a whole load of SQL on the client machine is unnecessary if you place it in a centralised procedure on the server (where it becomes part of a pre-compiled optimised server execution plan and thus more efficient) and simply reference the procedure name itself!

In addition to this and if speed is part of the issue, have a look at server optimisation hints noteably WITH (NOLOCK). This hint tells the server not to place a lock on the tempDB during data retrieval. I won't elaborate for fear of overkill here at this juncture, but you will notice a marked improvement because it provides data without reference to the state of 'current edits' of the source data. Some websites amongst others could benefit from this in my view, where mainly 'read only' is sent to a page. But do research please on the 'ups and downs' of how and where to use it and benchmark at your leisure of course.

Jim :)
Jul 14 '10 #5
NeoPa
32,556 Expert Mod 16PB
DAO = Data Access Objects
ADODB = ActiveX Data Objects for DataBases

DAO was designed specifically with Jet/Access in mind, therefore it works well within Access and supports the settings that you need for working with Access (and Jet. Jet is basically the database SQL engine for Access).

When you are dealing with database objects outside of Access, the more portable, more standard, ADODB, is probably better.

If you have a SQL Server or Oracle back-end database for instance, ADODB is a more appropriate tool. If the back-end is in Access however, ADO is probably a better fit.
Jul 14 '10 #6
MrDeej
157 100+
A lot of work done now, but it works as hell.

For special interested people i post my code


First the user interface:





To make wherestring based on textboxes above listbox:
Expand|Select|Wrap|Line Numbers
  1. Function Opprett_Where_utrykk_SP(Where As String, Skjema As String, tbxnavn As String, Verdi As String, Liste As String, Optional Avansert As String) As String
  2.  
  3. Dim Indikator As String
  4. Dim VerdiUtenIndikator As String
  5. Dim VerdiTall As Long
  6. Dim Felt As String
  7. Dim WildCardTegn As String
  8. Dim IndiKatorLeft As String
  9. Dim IndiKatorRight As String
  10.  
  11. 'navnet til feltet i tabell som skal filtereres baser på overskrit i listen
  12. If IsNumeric(Right(tbxnavn, 2)) Then
  13.     Felt = "[" & Forms(Skjema).Controls(Liste).Column(Right(tbxnavn, 2), 0) & "]"
  14. Else
  15.     Felt = "[" & Forms(Skjema).Controls(Liste).Column(Right(tbxnavn, 1), 0) & "]"
  16. End If
  17.  
  18. '''''''''''''''''''''''''''''''''''''
  19. 'Fastsetting av tabell som felt hører til på spørringer som har flere felt med samme navn
  20. '''''''''''''''''''''''''''''''''''''
  21. If Skjema = "INFO Lokasjonstransaksjoner" Then
  22.     If tbxnavn = "tbx 1" Then
  23.     Felt = "ACD_user.[Lok Loksummer - flytthistorikk].varenr"
  24.     End If
  25. End If
  26.  
  27. '''''''''''''''''''''''''''''''''''''
  28. 'Sjekker om det allerede er laget et where, isåfall så brukes AND mellom dem
  29. '''''''''''''''''''''''''''''''''''''
  30.  
  31. If Where = "" Then
  32.     Opprett_Where_utrykk_SP = " Where "
  33. Else
  34.     Opprett_Where_utrykk_SP = Where & " AND "
  35. End If
  36.  
  37.  
  38. WildCardTegn = "%"
  39. '''''''''''''''''''''''''''''''''''''
  40. 'Indikator er om det er noen spesielle fortegn på filter feltet. F. eks = eller > (større enn)
  41. '''''''''''''''''''''''''''''''''''''
  42.  
  43.  
  44. '''''''''''''''''''''''''''''''''''''
  45. 'Indikator er om det er noen spesielle fortegn på filter feltet. F. eks = eller > (større enn)
  46. '''''''''''''''''''''''''''''''''''''
  47. Indikator = Left(Verdi, 1)
  48. VerdiUtenIndikator = Mid(Verdi, 2)
  49.  
  50. If Left(Verdi, 2) = "<>" Then
  51.     Indikator = Left(Verdi, 2)
  52.     VerdiUtenIndikator = Mid(Verdi, 3)
  53. End If
  54.  
  55. If Indikator = "=" Or Indikator = "<" Or Indikator = ">" Then
  56.     If IsDate(VerdiUtenIndikator) Then
  57.         Opprett_Where_utrykk_SP = Opprett_Where_utrykk_SP & Felt & Indikator & "CONVERT(DATETIME,'" & VerdiUtenIndikator & "',104)"
  58.         Else
  59.         Opprett_Where_utrykk_SP = Opprett_Where_utrykk_SP & Felt & Indikator & VerdiUtenIndikator
  60.     End If
  61.  
  62.     ElseIf Indikator = "<>" Then
  63.     Opprett_Where_utrykk_SP = Opprett_Where_utrykk_SP & Felt & Indikator & "'" & VerdiUtenIndikator & "'"
  64.  
  65.     Else 'Datofelt og nummer krever anderledes utrykk
  66.     If Verdi = "Is null" Or Verdi = "Is not null" Then
  67.         Opprett_Where_utrykk_SP = Opprett_Where_utrykk_SP & Felt & " " & Verdi
  68.  
  69.         ElseIf IsNumeric(Verdi) Or Not IsDate(Verdi) Then
  70.         Opprett_Where_utrykk_SP = Opprett_Where_utrykk_SP & Felt & " like N'" & WildCardTegn & Verdi & WildCardTegn & "'"
  71.  
  72.         Else
  73.         Opprett_Where_utrykk_SP = Opprett_Where_utrykk_SP & Felt & " like N'" & WildCardTegn & Verdi & WildCardTegn & "'"
  74.     End If
  75. End If
To adjust textboxes to listbox:
Expand|Select|Wrap|Line Numbers
  1. Function Still_inn_tekstbokser_Over_Liste(Skjema As String, Liste As String)
  2. On Error Resume Next
  3. Dim s As String
  4. Dim words() As String
  5. Dim Length As Long
  6. Dim tbx As String
  7. Dim TbxNr As Long
  8.  
  9. s = Forms(Skjema).Controls(Liste).ColumnWidths
  10. s = Replace(s, ";", " ")
  11.  
  12.  
  13. 'Fjern alle tabstopp
  14. words() = Split(s)
  15.  
  16. For TbxNr = 0 To 19
  17.     Forms(Skjema).Controls("tbx " & TbxNr).TabStop = False
  18.     Forms(Skjema).Controls("tbx " & TbxNr).TabIndex = TbxNr
  19.     Forms(Skjema).Controls("tbx " & TbxNr).Width = 0
  20. Next
  21.  
  22. 'Still inn bredden til hver tekstboks utifra kollonnebredden på listen
  23. Dim tempstr As String
  24. For i = 0 To UBound(words)
  25.     Forms(Skjema).Controls("tbx " & i).Width = words(i)
  26.     Forms(Skjema).Controls("tbx " & i).TabStop = True
  27. Next
  28.  
  29.  
  30. 'still inn plassering vertikalt i forhold til listen
  31. Forms(Skjema).Controls("tbx 0").Left = Forms(Skjema).Controls(Liste).Left
  32.  
  33. For i = 0 To 19
  34.     Forms(Skjema).Controls("tbx " & i).Top = Forms(Skjema).Controls(Liste).Top - Forms(Skjema).Controls("tbx " & i).Height
  35.     Forms(Skjema).Controls("tbx " & i + 1).Left = Forms(Skjema).Controls("tbx " & i).Left + Forms(Skjema).Controls("tbx " & i).Width
  36. Next
  37.  
  38. End Function
To populate listbox:
Expand|Select|Wrap|Line Numbers
  1. Function Populer_liste_SP(SQL As String, Skjema As String, Liste As String)
  2.  
  3. Dim Conn1 As New ADODB.Connection
  4. Dim rst As New ADODB.Recordset
  5. Dim cmd As New ADODB.Command
  6. Dim sCreate As String
  7. Dim sDrop As String
  8.  
  9.  
  10.  
  11. Dim OverSkrift As String
  12. Dim InnHold As String
  13. Dim Coll As Collection
  14. Dim Tmpstr As String
  15. Dim i As Long
  16. Dim imax As Long
  17. Dim FieldString As String
  18. Dim Fieldstr As Long
  19. 'On Error Resume Next
  20. 'Max antall poster den skal hente
  21.  
  22. 'Fjern gammelt listeinnhold
  23. Forms(Skjema).Controls(Liste).RowSource = ""
  24.  
  25.  
  26. 'Koble til og lag stored procedure
  27.  
  28.  
  29. sConnect = "driver={sql server};server=ServerName;Database=DBname;UID=username;PWD=password;"
  30.  
  31. sDrop = "if exists (select * from sysobjects where id = object_id('dbo.Sp_LokSumFlyttHistorikk') And sysstat=4 ) drop procedure dbo.Sp_LokSumFlyttHistorikk"
  32.  
  33. ' Establish connection.
  34. Set Conn1 = New ADODB.Connection
  35. Conn1.ConnectionString = sConnect
  36. Conn1.Open
  37.  
  38. cmd.ActiveConnection = Conn1
  39.  
  40. cmd.CommandType = adCmdText
  41. cmd.CommandText = sDrop
  42. cmd.Execute
  43.  
  44.  
  45. sCreate = "create procedure sp_LokSumFlyttHistorikk " & _
  46. "AS " & _
  47.     SQL & _
  48.     " Return"
  49. cmd.CommandText = sCreate
  50. cmd.Execute
  51.  
  52. cmd.CommandType = adCmdStoredProc
  53. cmd.CommandText = "sp_LokSumFlyttHistorikk"
  54.  
  55. Set rst = cmd.Execute
  56.  
  57.     'Finn kolonneoverskrift
  58.     For x = 1 To rst.Fields.Count
  59.         If OverSkrift = "" Then
  60.             OverSkrift = (rst.Fields(x - 1).Name)
  61.             Else
  62.             OverSkrift = OverSkrift & "; " & (rst.Fields(x - 1).Name)
  63.         End If
  64.     Next x
  65.     'legg til kolonneoverskrift
  66.         Forms(Skjema).Controls(Liste).AddItem OverSkrift
  67.     'start å legg til innhold
  68.     Do Until rst.EOF
  69.     i = i + 1
  70.  
  71.     'imax antall rader i listen
  72.         Tmpstr = ""
  73.         For x = 1 To rst.Fields.Count
  74.             If Not IsNull(rst.Fields(x - 1).Value) Then
  75.                 FieldString = rst.Fields(x - 1).Value
  76.                 Else
  77.                 FieldString = ""
  78.             End If
  79.             Do While InStr(1, FieldString, ";") <> 0
  80.                 FieldString = Left(FieldString, InStr(1, FieldString, ";") - 1) & " " & Mid(FieldString, InStr(1, FieldString, ";") + 1)
  81.             Loop
  82.  
  83.  
  84.             If Tmpstr = "" Then
  85.                 Tmpstr = FieldString
  86.  
  87.             Else
  88.                 Tmpstr = Tmpstr & "; " & FieldString
  89.             End If
  90.  
  91.         Next x
  92.  
  93.         Fieldstr = Fieldstr + Len(Tmpstr)
  94.         If Fieldstr > 32736 Then
  95.             imax = 200
  96.             GoTo exither
  97.         End If
  98.         Forms(Skjema).Controls(Liste).AddItem Tmpstr
  99.     rst.MoveNext
  100.     Loop
  101.  
  102. exither:
  103.  
  104. rst.Close
  105. Set rst = Nothing
  106.  
  107. slutt:
  108. 'etikett overskrift
  109. If imax = 200 Then
  110.     Forms(Skjema).Controls("etk " & Liste).Caption = i & " (max) linjer i listen"
  111. Else
  112.     Forms(Skjema).Controls("etk " & Liste).Caption = i & " linjer i listen"
  113. End If
  114.  
  115.  
  116. On Error GoTo 0
  117.  
  118.  
  119. End Function
All textboxes call this function to start all this:
Expand|Select|Wrap|Line Numbers
  1. Call Filtrer_Liste_SP("INFO Lokasjonstransaksjoner", "tbx 1", "liste over transaksjoner")
Which Calls this:
Expand|Select|Wrap|Line Numbers
  1. Sub Filtrer_Liste_SP(Skjema As String, tbxnavn As String, Listenavn As String, Optional HarTbx As String)
  2.  
  3. DoCmd.Hourglass True
  4.  
  5. Dim SqlString As String
  6. Dim Wherestring As String
  7. Dim i As Long
  8. Dim SqlTilWhere As String
  9. Dim SqlEtterWhere As String
  10.  
  11. If Not HarTbx = "nei" Then
  12.     'bygg wherestring
  13.     Do Until i = 20
  14.         If Not IsNull(Forms(Skjema).Controls("tbx " & i)) Then
  15.             Wherestring = Opprett_Where_utrykk_SP(Wherestring, Skjema, "tbx " & i, Forms(Skjema).Controls("tbx " & i), Listenavn)
  16.         End If
  17.         i = i + 1
  18.     Loop
  19. End If
  20.  
  21. '''''''''''''''''''''''''''''''''''''
  22. 'Velg hvilken populasjons-funksjon som skal kjøres
  23. '''''''''''''''''''''''''''''''''''''
  24.  
  25.  
  26. If Skjema = "INFO Lokasjonstransaksjoner" Then
  27.     SqlTilWhere = "SELECT TOP 300 autonr, acd_user.[lok loksummer - flytthistorikk].Varenr, Varenavn, [behandlingstype], [boksid], [batch], [hendelse], [Antall tabletter], [Fra lokasjon], [Til lokasjon], [flyttet av], [flyttet tid] FROM acd_user.[lok loksummer - flytthistorikk] LEFT JOIN acd_user.[VARER Vareinformasjon] ON acd_user.[lok loksummer - flytthistorikk].Varenr=acd_user.[VARER Vareinformasjon].Varenr "
  28.     SqlEtterWhere = " ORDER BY [autonr] desc;"
  29.     Call Populer_liste_SP(SqlTilWhere & " " & Wherestring & " " & SqlEtterWhere, Skjema, Listenavn)
  30. End If
  31.  
  32.  
  33.  
  34. DoCmd.Hourglass False
  35.  
  36. End Sub



I am not expecting anyone to understand this code, but it works real well for the users :=) Normally you just make a bound listboxes to the tables, but we have experienced that locking issues and server load is a challende when doing this. Therefore we made this and after that we have had none ODBC-timeouts when other users try to access or edit the same tables as show in listboxes.



Also: I didnt understand the "have a look at server optimisation hints noteably WITH (NOLOCK). " Maybe it is because my bad english ??


edit:removed the password and username from the code :P
Jul 20 '10 #7
NeoPa
32,556 Expert Mod 16PB
MrDeej: edit:removed the password and username from the code :P
Always a good plan when posting publicly :D

Thanks for posting your solution. That's always good news :)
Jul 20 '10 #8

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

Similar topics

4
by: deprins | last post by:
Hello, I have wrote a stored procedure but its real slow. Its activated by a button on web page but its takes to long to process and the web server gives a timeout message after 5 minutes. Is...
1
by: Brad H McCollum | last post by:
I've designed a very basic SQL Server Stored Procedure that I'm using via a Visual Basic 6.0 front-end file in retrieving records into a data entry form. I can't for the life of me get the...
1
by: Dan Caron | last post by:
I have to create a stored procedure to purge "x" # of records from a table. I have two tables (script below): Schedule ScheduleHistory I need to purge records out of ScheduleHistory. The...
0
by: Nashat Wanly | last post by:
HOW TO: Call a Parameterized Stored Procedure by Using ADO.NET and Visual C# .NET View products that this article applies to. This article was previously published under Q310070 For a Microsoft...
5
by: Timppa | last post by:
Hi, Could anyone help me with my problem ? Environment: Access 2000 and Sql Server 2000. I have a stored procedure as follows: DROP table1 SELECT alias1.field1,alias2.field2,table2.field6...
6
by: Wojciech Wendrychowicz | last post by:
Hello to All, I'm trying to retrieve records from AS/400 in an VBA application. So, I've made an RPG program, then a stored procedure wchich calls that RPG program, and finally some VBA code to...
0
by: franjorge | last post by:
Hi, I have created two stored procedures via VB using this code: sql = "CREATE PROC " & nombre_proc & " AS SELECT *" & _ " From MBM_PUNTOS_SCE_SIN_COINCIDIR_SIEGE_FALTA_PM_NE_" & mes & _ "...
9
by: vikram.mankar | last post by:
I have a stored procedure thats transferring/processing data from one table to two different tables. The destination tables have a unique value constraint as the source tables at times has...
0
by: gregoryday | last post by:
I am having a problem with creating a stored procedure. The premise underwhich we are operating is the following: We are working with two tables. The first table simply stores an integer value...
1
by: ozchadl | last post by:
I have a table called 'Animals' in a mysql database. The columns / fields are: 'name' 'animal' 'year born' I am having problems creating a stored procedure called 'animalscount_sp'. The...
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: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
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
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
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
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,...

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.