473,915 Members | 5,000 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Mid() function crippled?

Hi everyone,

Is there a reason why the Mid() function only works in one direction in
VBScript? This code works in VB6 but not in VBScript? Is there a way
around it? I am trying to create an ASP page which produces a fixed width
text file for import into a third party legacy application which I don't
have control over.

--code sample--
Dim strSomeString

strSomeString = Space(100)

Mid(strSomeStri ng, 1, 4) = "test"
Mid(strSomeStri ng, 10, 20) = "Something else"
--end sample--

Thanks,

Ken.
Jul 19 '05 #1
10 5975
Ken VdB wrote on 02 apr 2004 in microsoft.publi c.inetserver.as p.general:
Mid(strSomeStri ng, 1, 4) = "test"
Mid(strSomeStri ng, 10, 20) = "Something else"


Not in VBScript. Please read the specs.

the script languages vbscript and jscript only handle complete strings.

However you can make a function like that:

function toMid(insert,in serted,start)
toMid = left(inserted,s tart) &_
insert & mid(inserted,st art+len(insert) )
end function

--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)
Jul 19 '05 #2
Hi,

"Ken VdB" <pu************ ****@nospam.flo ridus.com> wrote in message
news:uD******** ******@TK2MSFTN GP10.phx.gbl...
Hi everyone,

Is there a reason why the Mid() function only works in one direction in
VBScript? This code works in VB6 but not in VBScript? Is there a way
around it? I am trying to create an ASP page which produces a fixed width
text file for import into a third party legacy application which I don't
have control over.

--code sample--
Dim strSomeString

strSomeString = Space(100)

Mid(strSomeStri ng, 1, 4) = "test"
Mid(strSomeStri ng, 10, 20) = "Something else"
--end sample--


To add a bit to Evertjan's reply, using the same terminology as the MS
documentation:

The Mid "function" (i.e., x= mid(...) ) works in VBS exactly as it does in
VB (or, for that matter, QB). The Mid "statement" (i.e., mid(...)= ... ),
however, is not available in VBS.

Joe Earnest
Jul 19 '05 #3
Joe Earnest wrote on 03 apr 2004 in
microsoft.publi c.inetserver.as p.general:
To add a bit to Evertjan's reply, using the same terminology as the MS
documentation:

The Mid "function" (i.e., x= mid(...) ) works in VBS exactly as it
does in VB (or, for that matter, QB). The Mid "statement" (i.e.,
mid(...)= ... ), however, is not available in VBS.


The problem is Microsoft in its Basics systematically tries to obscure
the difference between a statement and a function.

Making the "Let" (1980?) statement and the "Call" (1995?) statement both
be default is part off this.

Newbees, those that started programming after those days that is, will
never get a deep understanding of the exact meanings, if they are not
historically inclined.

=============

The mid() statement is specially usefull if the stringvariable can be
internally manipulated, thereby improving speed [= processortime
consumption] and space [= memory consumption]. In interpreted [= script]
language kernels this is not as useful as in assembling language [pre]
processing.

A nice inbetween is the Forth language [kernel dependent, of cource]
where a string variable can only be manipulated "in place", if the result
gets a shorter, or keeps the same length.

The mid() function, on the other hand, is not crippled at all.

--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)
Jul 19 '05 #4
Hi,

"Evertjan." <ex************ **@interxnl.net > wrote in message
news:Xn******** ************@19 4.109.133.29...
Joe Earnest wrote on 03 apr 2004 in
microsoft.publi c.inetserver.as p.general:
To add a bit to Evertjan's reply, using the same terminology as the MS
documentation:

The Mid "function" (i.e., x= mid(...) ) works in VBS exactly as it
does in VB (or, for that matter, QB). The Mid "statement" (i.e.,
mid(...)= ... ), however, is not available in VBS.


The problem is Microsoft in its Basics systematically tries to obscure
the difference between a statement and a function.

Making the "Let" (1980?) statement and the "Call" (1995?) statement both
be default is part off this.

Newbees, those that started programming after those days that is, will
never get a deep understanding of the exact meanings, if they are not
historically inclined.

=============

The mid() statement is specially usefull if the stringvariable can be
internally manipulated, thereby improving speed [= processortime
consumption] and space [= memory consumption]. In interpreted [= script]
language kernels this is not as useful as in assembling language [pre]
processing.

A nice inbetween is the Forth language [kernel dependent, of cource]
where a string variable can only be manipulated "in place", if the result
gets a shorter, or keeps the same length.

The mid() function, on the other hand, is not crippled at all.


Good points. From past experience, I tend to think of what the compiler is
looking at when it's parsing, and tend to forget that many scripters don't
think that way. The Mid function and statement are obviously two entirely
separate underlying code routines, "masked" (if you will) by the use of the
same inherent name (or keyword in some versions of BASIC), but recognized by
placement relative to the equals sign.

Omitting Let and Call never bothered me, since the parsing syntax still
seems obvious to scan (left-versus-right side of the equals sign, or no
equals sign). I think the Call omission must have occurred prior to 1995 --
as best I can recall, you could omit it in all minor versions of QuickBASIC
4, *if* you declared the procedure at the outset. (ca. 1990-92 ??)

I've never used Forth. The result sounds curiously like an old DOS compiled
QuickBASIC trick, which was to access the data heap directly, by getting the
data heap offset and getting the relative variable offset from the variable
list, and then poking changes into a variable definition. You couldn't
change type or increase string length, but you could modify it in any other
way. Shortening a string required poking a change in string length into the
variable list data, leaving the remainder of the original string length as
inaccessible "dead area" data, until the next data heap recompilation.
Particularly useful for tweaking ASM call strings on-the-fly, changing
literal assignments and accessing variable data in other local heaps, but it
also avoided a time- and memory-consuming data heap recompilation, even when
used in lieu of a simple redefinition of a global variable. But then time
and memory were at more of premium in DOS days.

Regards,
Joe Earnest
Jul 19 '05 #5
Joe Earnest wrote on 03 apr 2004 in
microsoft.publi c.inetserver.as p.general:
Omitting Let and Call never bothered me, since the parsing syntax
still seems obvious to scan (left-versus-right side of the equals
sign, or no equals sign).
The difference between
Let a = 3
and
If a = 3 Then

would have been much clearer to many a newbee

=============== ===

the asp-vbs statement:

response.write "hello"

is written by many with a function syntax as

response.write( "hello")

Only accidentally being parsed correctly,
because there is only 1 argument in this case

I think the Call omission must have
occurred prior to 1995 -- as best I can recall, you could omit it in
all minor versions of QuickBASIC 4, *if* you declared the procedure at
the outset. (ca. 1990-92 ??)
Could be, I was just guessing from memory
I've never used Forth. The result sounds curiously like an old DOS
compiled QuickBASIC trick, which was to access the data heap directly,
by getting the data heap offset and getting the relative variable
offset from the variable list, and then poking changes into a variable
definition.


Forth was, is, much more versatile, since you define your own string on
the fly and interpret/compile (no real difference in Forth) it in general
continuous memory space (for instance, in Forth there are many ways to
Rome) by:

[nextunitpointer][namelength] name [stringlength] stringcontent
--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)
Jul 19 '05 #6
Hi,

"Evertjan." <ex************ **@interxnl.net > wrote in message
news:Xn******** ************@19 4.109.133.29...
The difference between
Let a = 3
and
If a = 3 Then

would have been much clearer to many a newbee
True. As a substitute in the case of your conditional "If" statement, as
part of my systematic casing, simplified HN and syntax, I routinely use
parentheses around conditionals (If, While, Until, ...), even if simple or
following default order. It scans better and helps to avoid logical errors
when using bitwise logical operators with conditions. The parentheses do
not seem to slow parsing. (I suspect that they may even speed it up to some
very slight degree, since the interpreter does not have to test for literal
grouping, then fall back on default modes of parsing.) They also flag for
me, in quick visual scanning, the fact that I've got a conditional
statement. For the same reason, I routinely all-cap only bitwise logical
operators, to remind me what I've got. The obscure untrapped errors
generated by improper interaction between zero/non-zero conditionals and
bitwise logical operators, as well as VBS's annoying problem of not
comparing true numerics and string numerics, seems to be a real problem for
newbees who've never masked, and remains one that needs to caught for
everyone on visual scanning. E.g., ...

if (n=3) then ...
if NOT (n=3) then ...
if ((n1=3) AND (NOT cbool(n2))) then ...
if (n=(sN +0)) then ...
=============== ===

the asp-vbs statement:

response.write "hello"

is written by many with a function syntax as

response.write( "hello")

Only accidentally being parsed correctly,
because there is only 1 argument in this case


That gets me into a digression ...

For me, a useful overview metaphor (but *not* one that bears up to strict
scutiny or literal use), is to think of BASIC as a living language, that is
absorbing other dialects, while retaining its own identity and shortening
its syntax over time. Many people find the ambiguous structure of BASIC
difficult, for the same general sort of reason that a "mongrel" and
ambiguous language like modern American English seems difficult.
Object-orientation, in the past, and mark-up language syntax (which has
strong C and Java ties), in the present, as well as general influence from
other languages, have pushed the syntax somewhat and added to the
syntactical ambiguity. I like it, as a general utility language, but then I
have a history with it. To me, the reality-check for understanding its
ambiguities lies in trying to directly visualize its operation as parsed
machine language, not in comparing it to an intermediate language.

Back more on point, BASIC's syntactical ambiguities and multiple ways to
accomplish tasks have always led to masking some misunderstood or "sloppy"
coding. Although its dialects vary in application, I think that it's best
intended as a utility language, more for temporary or local fixes, than for
long-term general distribution. Even in DOS QB days, anything seriously
programmatic usually involved cross-compiling QB and MASM.
I've never used Forth. The result sounds curiously like an old DOS
compiled QuickBASIC trick, which was to access the data heap directly,
by getting the data heap offset and getting the relative variable
offset from the variable list, and then poking changes into a variable
definition.


Forth was, is, much more versatile, since you define your own string on
the fly and interpret/compile (no real difference in Forth) it in general
continuous memory space (for instance, in Forth there are many ways to
Rome) by:

[nextunitpointer][namelength] name [stringlength] stringcontent


I'll have a look at it. Sounds like its structurally optimized for text
manipulation. And the continuuous memory space sounds intriguing, Thanks.

Regards,
Joe Earnest
Jul 19 '05 #7
Let's say, for instance, I wanted a routine that would determine whether the
second letter of a given string was "a". Should I write:

Function IsSecondLetterA (InString)
IsSecondLetterA = (Mid$(InString, 2, 1) = "a")
End Function
??
That function doesn't work in VBScript, but it does in VB6. Confusing, isn't
it?
If I put
Mid$(InString, 2, 1) = "a"
then it changes the second letter to a whatever, but when I assign it with a
second equals as above, it doesn't. This wouldn't be the case in C++ though
would it. So I guess it's not "it's position relative to THE equals sign",
but "whether it has AN equals sign to the left of it".

"Joe Earnest" <jo**********@S PAMqwest.netPLE ASE> wrote in message
news:u1******** ******@TK2MSFTN GP09.phx.gbl...
Hi,

"Evertjan." <ex************ **@interxnl.net > wrote in message
news:Xn******** ************@19 4.109.133.29...
Joe Earnest wrote on 03 apr 2004 in
microsoft.publi c.inetserver.as p.general:
To add a bit to Evertjan's reply, using the same terminology as the MS
documentation:

The Mid "function" (i.e., x= mid(...) ) works in VBS exactly as it
does in VB (or, for that matter, QB). The Mid "statement" (i.e.,
mid(...)= ... ), however, is not available in VBS.
The problem is Microsoft in its Basics systematically tries to obscure
the difference between a statement and a function.

Making the "Let" (1980?) statement and the "Call" (1995?) statement both
be default is part off this.

Newbees, those that started programming after those days that is, will
never get a deep understanding of the exact meanings, if they are not
historically inclined.

=============

The mid() statement is specially usefull if the stringvariable can be
internally manipulated, thereby improving speed [= processortime
consumption] and space [= memory consumption]. In interpreted [= script]
language kernels this is not as useful as in assembling language [pre]
processing.

A nice inbetween is the Forth language [kernel dependent, of cource]
where a string variable can only be manipulated "in place", if the result gets a shorter, or keeps the same length.

The mid() function, on the other hand, is not crippled at all.


Good points. From past experience, I tend to think of what the compiler

is looking at when it's parsing, and tend to forget that many scripters don't
think that way. The Mid function and statement are obviously two entirely
separate underlying code routines, "masked" (if you will) by the use of the same inherent name (or keyword in some versions of BASIC), but recognized by placement relative to the equals sign.

Omitting Let and Call never bothered me, since the parsing syntax still
seems obvious to scan (left-versus-right side of the equals sign, or no
equals sign). I think the Call omission must have occurred prior to 1995 -- as best I can recall, you could omit it in all minor versions of QuickBASIC 4, *if* you declared the procedure at the outset. (ca. 1990-92 ??)

I've never used Forth. The result sounds curiously like an old DOS compiled QuickBASIC trick, which was to access the data heap directly, by getting the data heap offset and getting the relative variable offset from the variable list, and then poking changes into a variable definition. You couldn't
change type or increase string length, but you could modify it in any other way. Shortening a string required poking a change in string length into the variable list data, leaving the remainder of the original string length as
inaccessible "dead area" data, until the next data heap recompilation.
Particularly useful for tweaking ASM call strings on-the-fly, changing
literal assignments and accessing variable data in other local heaps, but it also avoided a time- and memory-consuming data heap recompilation, even when used in lieu of a simple redefinition of a global variable. But then time
and memory were at more of premium in DOS days.

Regards,
Joe Earnest

Jul 19 '05 #8
Bonj wrote on 04 apr 2004 in microsoft.publi c.inetserver.as p.general:
> The mid() statement is specially usefull if the stringvariable can
> be internally manipulated, thereby improving speed [= processortime
> consumption] and space [= memory consumption]. In interpreted [=
> script] language kernels this is not as useful as in assembling
> language [pre] processing.

Let's say, for instance, I wanted a routine that would determine
whether the second letter of a given string was "a". Should I write:

Function IsSecondLetterA (InString)
IsSecondLetterA = (Mid$(InString, 2, 1) = "a")
End Function
??
That function doesn't work in VBScript, but it does in VB6. Confusing,
isn't it?
If I put
Mid$(InString, 2, 1) = "a"
then it changes the second letter to a whatever, but when I assign it
with a second equals as above, it doesn't. This wouldn't be the case
in C++ though would it. So I guess it's not "it's position relative to
THE equals sign", but "whether it has AN equals sign to the left of
it".


It should not be all that confusing.

[confusing is that you change to topposting in the middle of a thread,
corrected]

confusing to you is that you do not see the difference between a
statement and a function.

Let mid(..) = "123"
'' "let" statement is not available anymore so leave it out

Here the mid() statement is used, not available in vbscript.

If mid(..) = "123" Then

This is using the mid(..) function available in vbscript
in a boolean resulting comparison.

=============== =============== ====

btw:

IsSecondLetterA = ( Mid(InString, 2, 1) = "a" )

[leave out the $ of mid$ in vbscript,
since you are most probably not referring to a byte string]

and easier

IsSecondLetterA = ( instr(InString, "a") = 2 )

are the same

--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)
Jul 19 '05 #9
Bonj wrote:
Let's say, for instance, I wanted a routine that would determine
whether the second letter of a given string was "a". Should I write:

Function IsSecondLetterA (InString)
IsSecondLetterA = (Mid$(InString, 2, 1) = "a")
End Function
??
That function doesn't work in VBScript, but it does in VB6.
Confusing, isn't it?
Yes this assertion is confusing, considering that this statement works fine
on my machine:

IsSecondLetterA = (Mid(InString, 2, 1) = "a")

Oh! I see the problem: you're attempting to use the "$" version of the
function. Given that all variables are variant in vbscript, the Mid$, Left$,
etc. functions are not supported. It's not explicitly mentioned on this
page:
http://msdn.microsoft.com/library/en...onfeatures.asp
but it is implied in the Data Types row.
If I put
Mid$(InString, 2, 1) = "a"
then it changes the second letter to a whatever


You're talking about doing this in VB/VBA, right? The above statement does
not work in vbscript, because:
1. the Mid statement is not supported.
2. the "$" version of string functions is not supported

If you look up Mid in the VB/VBA documentation, you will see that it is
listed twice: once as the Mid function, and once as the Mid statement. If
you look it up in the vbscript documentation, you will only see it listed as
a function.

Just to reiterate, in this statement

x = Mid(InString, 2, 1)

Mid is a function (functions return values, statements and subs do not).

In this statement:

Mid(InString, 2, 1) = "a"

Mid is being used as a statement.

I think the other reason you are being confused by your example:

IsSecondLetterA = (Mid$(InString, 2, 1) = "a")

is because you have used the shorthand method of writing this routine. You
are actually using the Mid$ as a function, but it's hard to recognize this
because you've taken the shortcut of not assigning the value returned by
Mid$() to a variable. If you had written it out completely:

x = Mid$(InString, 2, 1)
If x = "a" then
IsSecondLetterA = True
else
IsSecondLetterA = True
end if

It would have been obvious that you were using Mid as a function. What you
need to realize is that in the background, when vb/vba/vbscript executes
this statement:

IsSecondLetterA = (Mid(InString, 2, 1) = "a")

the first thing it does is assign the value returned by the Mid function to
an implicit variable, which is used in the boolean expression, which returns
the appropriate boolean value which gets assigned to the IsSecondLetterA
variable. The implicit variable is then discarded.

Another example of this type of confusion is when people use the MsgBox
function:

if msgbox("Continu e?",,"title") = vbYes then

vs

msgbox "Message",,"tit le"

But this situation is a little different: MsgBox is only a function and
cannot be called as a statement. Notice that when it is used to simply
display a message that no parentheses are used. If you attempt to use
parentheses in that statement you will get an error. With the Mid statement,
however, you have to use the parentheses. Try this in the VB debug window to
see:

x="abc":Mid x,2,1 = "d":?x

To me this is very confusing, since the Mid statement appears to be the only
statement that requires parentheses around its arguments. It is the only
violation of the rules I use to determine when to use parentheses:

1. If the method returns a value which is either evaluated by the calling
statement or assigned to a variable, parentheses are required.
2. Otherwise, do not use parentheses

If I wrote a subroutine which did what the Mid statement does:

Sub MyMid(ByRef pStringIn, ByVal pStartPos, _
ByVal pLength, ByVal pReplace)
pStringIn = Left(pStringIn, pStartPos -1) & _
pReplace & Mid(pStringIn, pStartPos + pLength)
End Sub

I would have to call it without parentheses:

x="abcdef":MyMi d x,2,2,"hi":?x

Using parentheses would raise an error, which my rules would lead me to
expect.

Many people suggest using the Call statement to avoid this decision:

x="abcdef":Ca ll MyMid(x,2,2,"hi "):?x

but to me, this still requires you to know when to use Call. You cannot use
Call when calling a function whose return value you wish to use, can you? I
prefer my simple rules, which have yet to let me down (except with the Mid
statment of course)

HTH,
Bob Barrows

--
Microsoft MVP - ASP/ASP.NET
Please reply to the newsgroup. This email account is my spam trap so I
don't check it very often. If you must reply off-line, then remove the
"NO SPAM"
Jul 19 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
27671
by: Nawab | last post by:
Hey can anyone explain to me the difference between Mid and Mid$ ....i notice sometimes when i a running the update query with Mid$ it tells me that for example 3 records will be updated ( which in theory is the right amount based on the example) however sometimes only two records are updated! Also in the Mid function i am not specifying the last argument because I need the remainder of the string example Mid(, 4) i am doing this...
4
1876
by: Mark Reed | last post by:
HI all, I have an Access XP database which on the whole, uses information pasted into 1 table from a text file. I then have another query which uses the 'Mid' function to break it down. One of the fields from within the text file is "name" which is in Surname,Forename format. Is there a way that I can break that field into 2 using the comma as a prompt to break it down instead of specifying the characters as in Name:mid(.,89,119)? Many...
3
6517
by: martlaco1 | last post by:
Trying to fix a query that (I thought) had worked once upon a time, and I keep getting a Data Type Mismatch error whenever I enter any criteria for an expression using a Mid function. Without the criteria, the Mid function returns the values when I run the query. So if one of the values is a "t" (no quotes), can I not ask to isolate that record by putting "t" as a criteria? Nope - error, error. If I put it within the expression itself...
4
6049
by: Andy_Khosravi | last post by:
Hello, I'm having a problem with the MID function within Access 97. I have been trying to build a function to check to make sure that a field on a form does not have any spaces or dashes. This should be easy enough to do using the MID function in a For...Next statement. However, I've had more than a few problems. My first problem was that I had a data type mismatch. Access simply refused to evaluate anything I put in there no matter...
10
2403
by: jt | last post by:
I'm needing to take a binary string start at a certain position and return a pointer from that postion to the end of the binary stirng. something like this: char bstr; char *pos; pos=mid(bstr,35); / *return a pointer of the rest of the binary string starting at element 35 */
6
5733
by: Eduardo78 | last post by:
Ok, I have a Field that has a combination of letter C and a Number that increments by one. example: C1 C2 C3 C4 C5 C6
0
2776
by: Phil C. | last post by:
Hi, I'm using Access 2000. I have a Select Query that uses the MID function to separate the actual text of articles from the title of the articles. The articles are enterd into the underlying table (in a memo field) in html format, as one big block of text. The memo field is called (I named it before I realized that I needed to separate title from text).
14
2123
by: Alan | last post by:
Good afternoon, I'm having difficulties loading a dll in Microsoft Visual Studio 2003, that was supplied to me by another company. They have supplied me with test code, which causes my program to crash, see below: #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include <windows.h>
1
3086
by: ApexData | last post by:
Access2k I WAS getting the following error when using the MID function: Run Time Error '13' Type Mismatch I have a new single form, unbound with 1-button on it that uses the following code: Private Sub Command0_Click() MsgBox MID("ABCDEFG", 1, 1)
0
10039
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, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9881
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 effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10923
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 tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
10542
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 protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
7256
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
6148
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4778
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
4344
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3368
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.