I want to insert multiple rows at same doctype

Hi,
I have created Tax Deposit Doctype.
I want to insert multiple rows at Tax Deposit.

My code is given below

salary_slips = frappe.db.sql(“SELECT * FROM tabSalary Slip WHERE DATE_FORMAT(posting_date, ‘%Y-%m’)='”+datetime_object+“'”, as_dict=True)
for ss in salary_slips:
> td_entry = frappe.new_doc(“Tax Deposit”)

    td_entry.name = 'Tax Deposit/' + self.deposit_date + '/'+ss.name
    td_entry.deposit_date = self.deposit_date
    td_entry.salary_slip = ss.name
    td_entry.docstatus = 1
    td_entry.save()
    td_entry.submit()

But it is not working

1 Like

@arif,

To insert the child table entry you can use the following syntax

doc = frappe.get_doc("Parent DocType", "Parent Docname")
row = doc.append("child_table_fieldname", {})

# assign values to child table row
row.field_1 = "Test"
row.field_2 = "Test"
doc.save()

Thanks,
Makarand

6 Likes

Hi @makarand_b,

I know about child table insert command.
I need only master table entry multiple rows.

@arif,

is there any error, please share the error log

Thanks, Makarand

@makarand_b,

long error. I have posted last few lines.

File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 231, in save
return self._save(*args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 254, in _save
self.insert()
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 220, in insert
self.run_post_save_methods()
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 793, in run_post_save_methods
self.run_method(“on_submit”)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 667, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 890, in composer
return composed(self, method, *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 873, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 661, in
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/hr/doctype/tax_deposit/tax_deposit.py”, line 21, in on_submit
salary_slips = frappe.db.sql(“SELECT * FROM tabSalary Slip WHERE DATE_FORMAT(posting_date, ‘%Y-%m’)='”+datetime_object+“'”, as_dict=True)
File “/home/frappe/frappe-bench/apps/frappe/frappe/database.py”, line 149, in sql
self._cursor.execute(query)
File “/home/frappe/frappe-bench/env/local/lib/python2.7/site-packages/MySQLdb/cursors.py”, line 205, in execute
self.errorhandler(self, exc, value)
File “/home/frappe/frappe-bench/env/local/lib/python2.7/site-packages/MySQLdb/connections.py”, line 36, in defaulterrorhandler
raise errorclass, errorvalue
RuntimeError: maximum recursion depth exceeded

@makarand_b,

code is

def on_submit(self):
datetime_object = datetime.strptime(self.deposit_date, ‘%Y-%m-%d’)
datetime_object = datetime_object.strftime(‘%Y-%m’)
salary_slips = frappe.db.sql(“SELECT * FROM tabSalary Slip WHERE DATE_FORMAT(posting_date, ‘%Y-%m’)='”+datetime_object+“'”, as_dict=True)
for ss in salary_slips:
#import pdb;pdb.set_trace()
td_entry = frappe.new_doc(“Tax Deposit”)
td_entry.name = ‘Tax Deposit/’ + self.deposit_date + ‘/’+ss.name
td_entry.deposit_date = self.deposit_date
td_entry.salary_slip = ss.name
td_entry.docstatus = 1
#td_entry.save()
td_entry.submit()

@arif,

You are trying to submit the Tax Deposit in on_submit event which causing the recursion error.

before creating new Tax Deposit document add validation to check if the Tax Deposit is already created or not

Thanks, Makarand

2 Likes

@makarand_b,

I wrote this code

def on_submit(self):
datetime_object = datetime.strptime(self.deposit_date, ‘%Y-%m-%d’)
datetime_object = datetime_object.strftime(‘%Y-%m’)
salary_slips = frappe.db.sql(“SELECT * FROM tabSalary Slip WHERE DATE_FORMAT(posting_date, ‘%Y-%m’)='”+datetime_object+“'”, as_dict=True)
for ss in salary_slips:
tax_deposit = frappe.db.sql(“SELECT * FROM tabTax Deposit WHERE deposit_date='”+self.deposit_date+“’ AND salary_slip = '”+ss.name+“'”, as_dict=True)
if tax_deposit:
pass
else:
td_entry = frappe.new_doc(“Tax Deposit”)
td_entry.name = ‘Tax Deposit/’ + self.deposit_date + ‘/’+ss.name
td_entry.deposit_date = self.deposit_date
td_entry.salary_slip = ss.name
td_entry.docstatus = 1
td_entry.save()
td_entry.submit()

Now it is working.

2 Likes

Okay. Can u please explain me the difference between parent doctype and parent docname?
Also will this code work for making entries to child table in web forms?

For a child table, parent doctype is the Document Type of the parent, and docname is the name of the parent that is used to identify it

So for the child table Sales Invoice Item (List of items in a sales invoice), parent doctype will be Sales Invoice and parent docname will the name of the invoice for example SINV-0001

You can check out the documentation here