Python Forum
Produce One file Per PurchaseOrder - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Produce One file Per PurchaseOrder (/thread-41499.html)



Produce One file Per PurchaseOrder - jland47 - Jan-25-2024

I used a previous 3rd party python code and edited it to fit my new task, trying to understand each part of it and wanted to attempt to edit it on my own before going back to the contractor. Function of the code in basic terms, pull data from a SQL DB for a certain vendor of ours with a few filters and export it into a txt file. Once that file is outputted update a table in the SQL to mark po's as sent ('DONE'). My dilemma is on the output file it sometimes contains more than one ponumber, how can I only include one po number per file. We can do this manually by running the script after a po is created each time, but I would like to automate it a little more. Very new to all this and trying to learn what each part of the code is doing, left off output and beginning of code.
Python 3.11.4 IDLE
#Query POs
cursor.execute("""
SELECT
'Ariat' as Vendor,
header.PurchaseOrderNo,
header.ShipVia,
CI_Item.UDF_UPC,
detail.QuantityOrdered,
header.ShipToName,
u.UDF_USERNAME,
header.ShipToAddress1,
header.ShipToAddress2,
header.ShipToCity,
header.ShipToState,
header.ShipToZipCode,
u.UDF_USEREMAIL as ConfirmationEmail
FROM PO_PurchaseOrderHeader as header
LEFT JOIN PO_PurchaseOrderDetail as detail ON header.PurchaseOrderNo = detail.PurchaseOrderNo
LEFT JOIN CI_Item ON CI_Item.ItemCode = detail.ItemCode
LEFT JOIN SY_UDT_USERID as u ON u.UDF_USERKEY = header.UserCreatedKey
LEFT JOIN Action.dbo.po_status as status ON status.vendor = 'Ariat' AND status.po_number = header.PurchaseOrderNo
WHERE header.VendorNo = '0000085'
AND header.OnHold = 'N'
AND (status.id IS NULL OR status.status <> 'DONE' OR header.UDF_METHODSENT like '%error%')
""")

processed_pos = []
dataFetched = False

#Write file
rows = cursor.fetchall()
dataFetched = len(rows) > 0
fileData = ""
for row in rows:
    processed_pos.append(str(row[1]))
    for data in row:
        fileData += str(data) + ","
    fileData = fileData[0:-1] + "\n"

file_path = outputPath + "/" + "ariat-" + datetime.datetime.now().strftime("%m-%d-%Y-%H%M%S") + ".csv"
if dataFetched:
    file = open(file_path, "w")
    file.write(fileData)
    file.close()
else:
    exit(0)

#Update status table
for po in processed_pos:
    cursor.execute(f"""
DECLARE @count AS INT = (SELECT COUNT(0) FROM Action.dbo.po_status WHERE po_number = '{po}' AND vendor = 'Ariat')
IF @count <> 0
	UPDATE Action.dbo.po_status SET status = 'DONE' WHERE po_number = '{po}' AND vendor = 'Ariat'
ELSE
	INSERT INTO Action.dbo.po_status(vendor, po_number, status) VALUES ('Ariat', '{po}', 'DONE')
""")
    cursor.execute(f"UPDATE PO_PurchaseOrderHeader SET UDF_METHODSENT = 'FTP' WHERE PurchaseOrderNo = '{po}' AND UDF_METHODSENT like '%error%'")
    cursor.commit()



RE: Produce One file Per PurchaseOrder - Larz60+ - Jan-26-2024

this can be done quite easily with pandas.
see:
pandas.read_sql
pandas.DataFrame.to_csv
Working with text data

Note CSV is comma separated text file.