patch fix
diff --git a/erpnext/patches/v4_2/set_item_batch.py b/erpnext/patches/v4_2/set_item_batch.py
index 990be69..3e84a59 100644
--- a/erpnext/patches/v4_2/set_item_batch.py
+++ b/erpnext/patches/v4_2/set_item_batch.py
@@ -5,16 +5,61 @@
 import frappe
 
 def execute():
-	item_list = frappe.db.sql("""select name from tabItem""", as_dict=1)
-	for d in item_list:
-		count_stock_entries = frappe.db.sql("""select count(name) from `tabStock Entry Detail` where item_code= %s""",d.get("name"))[0][0]
+	frappe.db.sql("update tabItem set has_batch_no = 'No' where ifnull(has_batch_no, '') = ''")
+	frappe.db.sql("update tabItem set has_serial_no = 'No' where ifnull(has_serial_no, '') = ''")
+	
+	item_list = frappe.db.sql("""select name, has_batch_no, has_serial_no from tabItem 
+		where ifnull(is_stock_item, 'No') = 'Yes'""", as_dict=1)
 		
-		count_batch_entries = frappe.db.sql("""select count(name) from `tabStock Entry Detail` where \
-			item_code= %s and batch_no = '' """,d.get("name"))[0][0]
+	sle_count = get_sle_count()
+	sle_with_batch = get_sle_with_batch()
+	sle_with_serial = get_sle_with_serial()
+	
+	batch_items = get_items_with_batch()
+	serialized_items = get_items_with_serial()
 		
-		if count_stock_entries > 0:
-			if count_stock_entries == count_batch_entries:
-				frappe.db.sql("""update `tabItem` set has_batch_no = 'Yes' where name = %s""",d.get("name"))
+	for d in item_list:	
+		if d.has_batch_no == 'Yes':
+			if d.name not in batch_items and sle_count.get(d.name) and sle_count.get(d.name) != sle_with_batch.get(d.name):
+					frappe.db.set_value("Item", d.name, "has_batch_no", "No")
+		else:
+			if d.name in batch_items or (sle_count.get(d.name) and sle_count.get(d.name) == sle_with_batch.get(d.name)):
+				frappe.db.set_value("Item", d.name, "has_batch_no", "Yes")
+		
+		if d.has_serial_no == 'Yes':
+			if d.name not in serialized_items and sle_count.get(d.name) and sle_count.get(d.name) != sle_with_serial.get(d.name):
+				frappe.db.set_value("Item", d.name, "has_serial_no", "No")
+		else:
+			if d.name in serialized_items or (sle_count.get(d.name) and sle_count.get(d.name) == sle_with_serial.get(d.name)):
+				frappe.db.set_value("Item", d.name, "has_serial_no", "Yes")
+		
 				
-			if count_batch_entries == 0:
-				frappe.db.sql("""update `tabItem` set has_batch_no = 'No' where name = %s""",d.get("name"))
+def get_sle_count():
+	sle_count = {}
+	for d in frappe.db.sql("""select item_code, count(name) as cnt from `tabStock Ledger Entry` group by item_code""", as_dict=1):
+		sle_count.setdefault(d.item_code, d.cnt)
+		
+	return sle_count
+	
+def get_sle_with_batch():
+	sle_with_batch = {}
+	for d in frappe.db.sql("""select item_code, count(name) as cnt from `tabStock Ledger Entry` 
+		where batch_no != '' group by item_code""", as_dict=1):
+			sle_with_batch.setdefault(d.item_code, d.cnt)
+		
+	return sle_with_batch
+	
+
+def get_sle_with_serial():
+	sle_with_serial = {}
+	for d in frappe.db.sql("""select item_code, count(name) as cnt from `tabStock Ledger Entry` 
+		where serial_no != '' group by item_code""", as_dict=1):
+			sle_with_serial.setdefault(d.item_code, d.cnt)
+	
+	return sle_with_serial
+	
+def get_items_with_batch():
+	return frappe.db.sql_list("select item from tabBatch")
+	
+def get_items_with_serial():
+	return frappe.db.sql_list("select item_code from `tabSerial No`")
\ No newline at end of file