fix: stock ledger report not showing data if the UOM filter has selected (#19179)

diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py
index d386230..5bdbca2 100644
--- a/erpnext/stock/report/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/report/stock_ledger/stock_ledger.py
@@ -107,7 +107,7 @@
 	if include_uom:
 		cf_field = ", ucd.conversion_factor"
 		cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom='%s'" \
-			% frappe.db.escape(include_uom)
+			% (include_uom)
 
 	res = frappe.db.sql("""
 		select
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index 4c663e3..2ac0bae 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -253,31 +253,40 @@
 		return
 
 	convertible_cols = {}
-	for col_idx in reversed(range(0, len(columns))):
-		col = columns[col_idx]
-		if isinstance(col, dict) and col.get("convertible") in ['rate', 'qty']:
-			convertible_cols[col_idx] = col['convertible']
-			columns.insert(col_idx+1, col.copy())
-			columns[col_idx+1]['fieldname'] += "_alt"
-			if convertible_cols[col_idx] == 'rate':
-				columns[col_idx+1]['label'] += " (per {})".format(include_uom)
-			else:
-				columns[col_idx+1]['label'] += " ({})".format(include_uom)
+
+	is_dict_obj = False
+	if isinstance(result[0], dict):
+		is_dict_obj = True
+
+	convertible_columns = {}
+	for idx, d in enumerate(columns):
+		key = d.get("fieldname") if is_dict_obj else idx
+		if d.get("convertible"):
+			convertible_columns.setdefault(key, d.get("convertible"))
+
+			# Add new column to show qty/rate as per the selected UOM
+			columns.insert(idx+1, {
+				'label': "{0} (per {1})".format(d.get("label"), include_uom),
+				'fieldname': "{0}_{1}".format(d.get("fieldname"), frappe.scrub(include_uom)),
+				'fieldtype': 'Currency' if d.get("convertible") == 'rate' else 'Float'
+			})
 
 	for row_idx, row in enumerate(result):
-		new_row = []
-		for col_idx, d in enumerate(row):
-			new_row.append(d)
-			if col_idx in convertible_cols:
-				if conversion_factors[row_idx]:
-					if convertible_cols[col_idx] == 'rate':
-						new_row.append(flt(d) * conversion_factors[row_idx])
-					else:
-						new_row.append(flt(d) / conversion_factors[row_idx])
-				else:
-					new_row.append(None)
+		data = row.items() if is_dict_obj else enumerate(row)
+		for key, value in data:
+			if not key in convertible_columns or not conversion_factors[row_idx]:
+				continue
 
-		result[row_idx] = new_row
+			if convertible_columns.get(key) == 'rate':
+				new_value = flt(value) * conversion_factors[row_idx]
+			else:
+				new_value = flt(value) / conversion_factors[row_idx]
+
+			if not is_dict_obj:
+				row.insert(key+1, new_value)
+			else:
+				new_key = "{0}_{1}".format(key, frappe.scrub(include_uom))
+				row[new_key] = new_value
 
 def get_available_serial_nos(item_code, warehouse):
 	return frappe.get_all("Serial No", filters = {'item_code': item_code,