# Problem in Field Calculator

2747
2
07-13-2015 03:09 AM New Contributor

Dear Sir!

I tried to customize a field value in polygon featureclass. For that I wrote a python function. Then using Field Calculator, I copy this function to Pre_Logic Script Code: and call the function. it gives me error.

Then I tried the same using Calculate Field tool in ArcToolbox. It works correctly.

Pl explain why I cannot run the above function using Field Calculator.

My function is given below:

def lblcal(a):

Dic1 = {'11':'PP', '13':'TOPOPP', '14':'FTP', '15':'VP', '16':'FVP', '17':'CP', '18':'FCP', '19':'FSP', '20':'FSPP', '21':'ISPP', '22':'FUP'}

if a[2:4] in Dic1.keys():

m = Dic1.get(a[2:4])

if (a == 's') is True:

str1 = 'SUP' + str(int(a[10:15]))

else:

str1 = 'Inset' + str(int(a[10:15]))

if (a == 's') is True:

str2 = 'Sheet' + str(int(a[16:20]))

str3 = m + ' ' + str(int(a[4:9])) + str1 + str2

return (str3)

I am working in ArcGIS 9.3

Thanks

Tags (1)
2 Replies by MVP Esteemed Contributor

you have to supply it with a field name as a substitute for 'a'

the function should go in the code block section then the call to the is made in the expression box like

lblcal([yourfield]) if using VB or  lblcal(!yourfield!) if using the Python parser by Esri Esteemed Contributor

In addition to what Dan mentions, you should try and post the post using the instructions found here: Posting Code blocks in the new GeoNet

I copied the code and pasted it in an Python IDE and there were issues with the indentation. Apart from that you might be running into an error like "UnboundLocalError: local variable 'str3' referenced before assignment", since str3 only gets assigned in case a is 's'.

```def lblcal(a):
Dic1 = {'11':'PP', '13':'TOPOPP', '14':'FTP', '15':'VP', '16':'FVP', '17':'CP', '18':'FCP', '19':'FSP', '20':'FSPP', '21':'ISPP', '22':'FUP'}
if a[2:4] in Dic1:
m = Dic1[a[2:4]]
if a == 's':
str1 = 'SUP' + str(int(a[10:15]))
else:
str1 = 'Inset' + str(int(a[10:15]))
if a == 's':
str2 = 'Sheet' + str(int(a[16:20]))
str3 = m + ' ' + str(int(a[4:9])) + str1 + str2
return (str3)```

This code will probably still generate the error you encounter. What is the error you receive? Does it calculate for some records the values and breaks? Is it possible to provide some values of 'a' to check if it works?

BTW:

• Dic1.keys() can be replace by Dic1
• Dic1.get(a[2:4]) can be replaced by Dic1[a[2:4]]
• if (a == 's'): is True can be replaced by if a == 's':
• if (a == 's') is True: can be replaced by if a == 's':
• Include at line before line 3 something like: str3 = "Error with: {0}".format(a) to avoid the code to break
• There is no error checking (include try expect to catch errors) 