473,404 Members | 2,137 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,404 software developers and data experts.

If and End If

I have recently had to do a module with quite a number of if conditions and
several labels that are reached via a Goto label statement. My question is
a general one. If, as a result of an if... then... else... statement, the
code jumps to another label, do you terminate the original if condition in
that new label, or should it be terminated after the command that sent it to
the label?

dixie
Nov 12 '05 #1
5 6936
"dixie" <di****@dogmail.com> wrote in
news:U3*****************@nnrp1.ozemail.com.au:
I have recently had to do a module with quite a number of if
conditions and several labels that are reached via a Goto
label statement. My question is a general one. If, as a
result of an if... then... else... statement, the code jumps
to another label, do you terminate the original if condition
in that new label, or should it be terminated after the
command that sent it to the label?

dixie
Before answering your question, I'll ask this one: if, instead of
using a goto label statement, you called a subprocedure or
function, where would you put your termination?

The answer would state quite clearly after the command that called
the subprocedure.

With jumps (goto label statements) the answer isn't clear. It
depends on where you jump to, and where you come back from. Without
having seen the code, It's impossible to tell. Besides if you jump
to a label from different places, you may need end ifs after the
label or not.

Essentially, the better (safer) way to program is to create
subprocedures from your labeled sections. Goto statements are a
nightmare to debug and to maintain.

Bob Q


Nov 12 '05 #2
dixie wrote:
I have recently had to do a module with quite a number of if conditions and
several labels that are reached via a Goto label statement. My question is
a general one. If, as a result of an if... then... else... statement, the
code jumps to another label, do you terminate the original if condition in
that new label, or should it be terminated after the command that sent it to
the label?


Oh boy! I hate to be negative, but you can write just about
any procedure without using GoTo. In general using GoTo is
a poor practice as it makes your procedure's logic difficult
to follow. There are several alternative constructs that
can be used to dramatically reduce or even eliminate the
need for GoTo (Select Case, ElseIf, nested If-Then-Else,
calling other procedures, etc).

To answer your question, the End If must be placed at the
end of the code that executes under control of the If
condition. Its placement has little if anything to do with
where the GoTo is located or where it jumps to.

It may seem like a daunting task, but try to recode your
procedure to remove every GoTo (except the On Error GoTo
types). If you think you've reached a point where you just
can not see a way to get rid of the last one, post back and
someone will probably be able to straighten it out for you.

--
Marsh
Nov 12 '05 #3
Marshall & Bob,

I remember being told by a trained programmmer back in 1991 when I was
getting back into programming after a long break from it that any GoTo
was generally poor programming practice, for precisely the reasons both
you fellows described (I was doing applications in dBaseIV at the
time). Of course, in Access VBA we use On Error GoTo Err_Proc, but here
is a instance where I often use GoTo that is not an error message and I
think breaking it out into a separate sub is a bit of a PITA.

The following could be part of any sub, say after pressing a button or
an afterUpdate event and it deals with the value entered for an input
box for a string, strValue:

Enter_Data:

strValue = InputBox ("Enter a number blah, blah")

If strValue blah blah Then 'check strValue

'If incorrect value

If msgbox("You entered an incorrect value, enter a value that blah", _
vbExclamation, vbOkCancel) = vbCancel then

GoTo Exit_Proc 'Exit point of sub

Else

Goto Enter_Data 'go back and start over

End If

End If

Hmmmm, I hate it when I answer my own question while I'm asking it. The
above can be done with a Do WHile strValue = blah Or strValue = Blah
Blah, can't it?

--
Tim - http://www.ucs.mun.ca/~tmarshal/
^o<
/#) "Burp-beep, burp-beep, burp-beep?" - Quaker Jake
/^^ "Want some?" - Ditto
Nov 12 '05 #4
Tim Marshall wrote:
Marshall & Bob,

I remember being told by a trained programmmer back in 1991 when I was
getting back into programming after a long break from it that any GoTo
was generally poor programming practice, for precisely the reasons both
you fellows described (I was doing applications in dBaseIV at the
time). Of course, in Access VBA we use On Error GoTo Err_Proc, but here
is a instance where I often use GoTo that is not an error message and I
think breaking it out into a separate sub is a bit of a PITA.

The following could be part of any sub, say after pressing a button or
an afterUpdate event and it deals with the value entered for an input
box for a string, strValue:

Enter_Data:

strValue = InputBox ("Enter a number blah, blah")

If strValue blah blah Then 'check strValue

'If incorrect value

If msgbox("You entered an incorrect value, enter a value that blah", _
vbExclamation, vbOkCancel) = vbCancel then

GoTo Exit_Proc 'Exit point of sub

Else

Goto Enter_Data 'go back and start over

End If

End If

Hmmmm, I hate it when I answer my own question while I'm asking it. The
above can be done with a Do WHile strValue = blah Or strValue = Blah
Blah, can't it?


In that specific case, I guess you could use a loop. But
you do raise a good point Tim. I've never come up a
satisfying approach to this kind of situation:

If blah Then
blah
Else
blah
If condition Then
GoTo CarryOn
ElseIf condition Then
blahA
Else
blahB
End If
blahC
End If
blahD
CarryOn:

Most of the time, things are not that complicated and you
can enclose the code after the If inside the Else part, but
that can place a large chunk of code an extra level deep in
the code flow and it wouldn't work in the above situation
anyway. Of course, in many other cases, there's Exit Sub,
but that violates the good practice of having only a single
exit point.

On the rare occasion, I've even used this kind of logic:
Do
If blah Then
blah
Else
blah
If condition Then
Exit Do 'Just a sneaky GoTo
ElseIf condition Then
blahA
Else
blahB
End If
blahC
End If
blahD
Loop While False
carry on

but that is just distorting the issue and at least the
earlier GoTo version is traditional enough to be clear.

I suppose its also feasible to Raise an error and pick up
the flow using Resume, but this often makes the flow even
more convoluted than a GoTo would.

All in all, I think this situation is a blot on the
GoTo-less code picture.

Maybe someone smarter than me can enlighten both of us.

--
Marsh
Nov 12 '05 #5

Tim & Marshall

Marshall Barton <ma*********@wowway.com> wrote in
news:ke********************************@4ax.com:
Tim Marshall wrote:
Marshall & Bob,

I remember being told by a trained programmmer back in 1991
when I was getting back into programming after a long break
from it that any GoTo was generally poor programming practice,
for precisely the reasons both you fellows described (I was
doing applications in dBaseIV at the time). Of course, in
Access VBA we use On Error GoTo Err_Proc, but here is a
instance where I often use GoTo that is not an error message
and I think breaking it out into a separate sub is a bit of a
PITA.

The following could be part of any sub, say after pressing a
button or an afterUpdate event and it deals with the value
entered for an input box for a string, strValue:

Enter_Data:

strValue = InputBox ("Enter a number blah, blah")

If strValue blah blah Then 'check strValue

'If incorrect value

If msgbox("You entered an incorrect value, enter a value
that blah", _
vbExclamation, vbOkCancel) = vbCancel then

GoTo Exit_Proc 'Exit point of sub

Else

Goto Enter_Data 'go back and start over

End If

End If

Hmmmm, I hate it when I answer my own question while I'm
asking it. The above can be done with a Do WHile strValue =
blah Or strValue = Blah Blah, can't it?


In that specific case, I guess you could use a loop. But
you do raise a good point Tim. I've never come up a
satisfying approach to this kind of situation:

If blah Then
blah
Else
blah
If condition Then
GoTo CarryOn
ElseIf condition Then
blahA
Else
blahB
End If
blahC
End If
blahD
CarryOn:

Most of the time, things are not that complicated and you
can enclose the code after the If inside the Else part, but
that can place a large chunk of code an extra level deep in
the code flow and it wouldn't work in the above situation
anyway. Of course, in many other cases, there's Exit Sub,
but that violates the good practice of having only a single
exit point.

On the rare occasion, I've even used this kind of logic:
Do
If blah Then
blah
Else
blah
If condition Then
Exit Do 'Just a sneaky GoTo
ElseIf condition Then
blahA
Else
blahB
End If
blahC
End If
blahD
Loop While False
carry on

but that is just distorting the issue and at least the
earlier GoTo version is traditional enough to be clear.

I suppose its also feasible to Raise an error and pick up
the flow using Resume, but this often makes the flow even
more convoluted than a GoTo would.

All in all, I think this situation is a blot on the
GoTo-less code picture.

Maybe someone smarter than me can enlighten both of us.

--
Marsh


Goto in dBase was impossible. it was used to move to a different
record. What I resorted to then was to create a local variable
"Cancel" and set that true if the user bailed in that condition.

I've also found that sometimes creating a few sub procedures in a
form module and calling those is an easier way of handling the
construct.

Marshall's code could look like this

If blah Then
blah
call carry on
Else
blah
If condition Then
' Do nothing.
ElseIf condition Then
blah
call blahC
call blahD
call carry on
Else
blahB
Call blahC
call blahD
call carry on
End If
End If
End sub
sub blahB

Advantages: Code re-use, easier editing ( I hate where you can't
see the If from it's End If or because of the quantity of nested
statements, the left side of the page.)

But I will sheepishly admit that I do use labels sometimes.

Bob Q
Nov 12 '05 #6

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

Similar topics

3
by: William C. White | last post by:
Does anyone know of a way to use PHP /w Authorize.net AIM without using cURL? Our website is hosted on a shared drive and the webhost company doesn't installed additional software (such as cURL)...
2
by: Albert Ahtenberg | last post by:
Hello, I don't know if it is only me but I was sure that header("Location:url") redirects the browser instantly to URL, or at least stops the execution of the code. But appearantely it continues...
3
by: James | last post by:
Hi, I have a form with 2 fields. 'A' 'B' The user completes one of the fields and the form is submitted. On the results page I want to run a query, but this will change subject to which...
0
by: Ollivier Robert | last post by:
Hello, I'm trying to link PHP with Oracle 9.2.0/OCI8 with gcc 3.2.3 on a Solaris9 system. The link succeeds but everytime I try to run php, I get a SEGV from inside the libcnltsh.so library. ...
1
by: Richard Galli | last post by:
I want viewers to compare state laws on a single subject. Imagine a three-column table with a drop-down box on the top. A viewer selects a state from the list, and that state's text fills the...
4
by: Albert Ahtenberg | last post by:
Hello, I have two questions. 1. When the user presses the back button and returns to a form he filled the form is reseted. How do I leave there the values he inserted? 2. When the...
1
by: inderjit S Gabrie | last post by:
Hi all Here is the scenerio ...is it possibly to do this... i am getting valid course dates output on to a web which i have designed ....all is okay so far , look at the following web url ...
2
by: Jack | last post by:
Hi All, What is the PHP equivilent of Oracle bind variables in a SQL statement, e.g. select x from y where z=:parameter Which in asp/jsp would be followed by some statements to bind a value...
3
by: Sandwick | last post by:
I am trying to change the size of a drawing so they are all 3x3. the script below is what i was trying to use to cut it in half ... I get errors. I can display the normal picture but not the...
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
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
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
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.