#!usr/bin/python import win32com.client #from win32com.client import constants import xml.etree.ElementTree as ET def QBStock(client_socket=None, filename='', searchitems = {}): # Connect to Quickbooks sessionManager = win32com.client.Dispatch("QBXMLRP2.RequestProcessor") sessionManager.OpenConnection('', 'DASA') #ticket = sessionManager.BeginSession("C:\Quickbooks Bogor\qb test\distrindo bakti wutama.qbw", 0) #ticket = sessionManager.BeginSession("", 0) #print("constant:",constants.qbFileOpenDoNotCare) #print("constant:",constants.qmDontCare) ticket = sessionManager.BeginSession("", 2 ) # Send query and receive response qbxml_query = """ Contains TS-I502 QuantityOnHand """ qbxml_query = """ TSHT:TS WOODGRAIN:TS-I502 TSHT:TS WOODGRAIN:TS-I500 QuantityOnHand QuantityOnOrder QuantityOnSalesOrder FullName Name """ qbxml_query = """ InventoryStockStatusByItem """ qbxml_query1 = """ QuantityOnHand QuantityOnOrder QuantityOnSalesOrder FullName Name """ def createSubElement(ET, parentNode, thisNode, text="", whiteSpace = 0, attrib ={}): ele = ET.SubElement(parentNode, thisNode) for x in attrib: ele.set(x, attrib[x]) ele.text = text tail = "\n" for x in range(whiteSpace): tail = tail + " " ele.tail = tail return ele root = ET.Element("QBXML") root.tail = "\n" root.text = "\n " QBXMLMsgsRq = ET.SubElement(root, "QBXMLMsgsRq") QBXMLMsgsRq.set("onError", "continueOnError") #QBXMLMsgsRq.tail = "\n" #QBXMLMsgsRq.text = "\n " GeneralSummaryReportQueryRq = createSubElement(ET, QBXMLMsgsRq, "GeneralSummaryReportQueryRq","\n " ) GeneralSummaryReportType = createSubElement(ET, GeneralSummaryReportQueryRq, "GeneralSummaryReportType", "InventoryStockStatusByItem") ReportItemFilter = createSubElement(ET, GeneralSummaryReportQueryRq, "ReportItemFilter","\n ") #FullName = createSubElement(ET, ReportItemFilter, "FullName", "TSHT:TS WOODGRAIN:TS-Z188") #FullName = createSubElement(ET, ReportItemFilter, "FullName", "TACO:G_D:TH-002G") #FullName = createSubElement(ET, ReportItemFilter, "FullName", "TACO:AA_B_H:TH-107AA") #ReportTxnTypeFilter = createSubElement(ET, GeneralSummaryReportQueryRq, "ReportTxnTypeFilter","\n ") #TxnTypeFilter = createSubElement(ET, ReportTxnTypeFilter, "TxnTypeFilter","All") # if you have searchitems then loop here if searchitems: #print(searchitems) for searchitem in searchitems: FullName = createSubElement(ET, ReportItemFilter, "FullName", searchitem,6) # # if you have searchitems then loop here # if searchitems: # NameFilter = createSubElement(ET, ItemInventoryQueryRq, "NameFilter", "\n ",6) # MatchCriterion = createSubElement(ET, NameFilter, "MatchCriterion", "Contains", 8) # for searchitem in searchitems: # Name = createSubElement(ET, NameFilter, "Name", searchitem, 8) #ItemInventoryQueryRq = ET.SubElement(QBXMLMsgsRq, "ItemInventoryQueryRq") #ItemInventoryQueryRq.set("metaData", "MetaDataAndResponseData") #ItemInventoryQueryRq.set("metaData", "NoMetaData") #ItemInventoryQueryRq.tail = "\n " #ItemInventoryQueryRq.text = "\n " # IncludeRetElement = createSubElement(ET, ItemInventoryQueryRq, "IncludeRetElement", "QuantityOnHand",6) # IncludeRetElement = createSubElement(ET, ItemInventoryQueryRq, "IncludeRetElement", "FullName",6) # IncludeRetElement = createSubElement(ET, ItemInventoryQueryRq, "IncludeRetElement", "Name",6) # IncludeRetElement = createSubElement(ET, ItemInventoryQueryRq, "IncludeRetElement", "Count",6) #IncludeRetElement = createSubElement(ET, ItemInventoryQueryRq, "IncludeRetElement", "QuantityOnOrder",6) #IncludeRetElement = createSubElement(ET, ItemInventoryQueryRq, "IncludeRetElement", "QuantityOnSalesOrder",4) #mydata = ET.tostring(root, encoding = "unicode", method = "xml") mydata = ET.tostring(root, encoding = "unicode") #mydata = ET.tostring(root).decode() #print (mydata,type(mydata)) #qbxml_query1 = """\n""" qbxml_query1 = """\n""" qbxml_query1 = qbxml_query1 + """""" qbxml_query1 = qbxml_query1 + "\n" + mydata # print (qbxml_query, type(qbxml_query)) # print("") # print(qbxml_query1, type(qbxml_query1)) #print("") response_string = sessionManager.ProcessRequest(ticket, qbxml_query1) # Disconnect from Quickbooks sessionManager.EndSession(ticket) # Close the company file sessionManager.CloseConnection() # Close the connection # print (response_string) # Parse the response into an Element Tree and peel away the layers of response #QBXML = xml.etree.ElementTree.fromstring(response_string) itemInvDict={} QBXML = ET.fromstring(response_string) print("") #print(QBXML) QBXMLMsgsRs = QBXML.find('QBXMLMsgsRs') #print(QBXMLMsgsRs.tag, QBXMLMsgsRs) #InventoryAdjustmentQueryRs = QBXMLMsgsRs.getiterator("InventoryAdjustmentRet") #ItemInventoryQueryRs = QBXMLMsgsRs.iter("ItemInventoryRet") GeneralSummaryReportQueryRs = QBXML.findall('GeneralSummaryReportQueryRs') for child in QBXMLMsgsRs: print(child.tag, child.attrib['statusMessage']) itemInvDict[child.attrib['statusSeverity']] = [child.attrib['statusMessage'], child.attrib['statusCode']] #print(GeneralSummaryReportQueryRs) Cannot use this. Result : None print("") DataRow = QBXML.iter("DataRow") for ItemInvRet in DataRow: try: Rowdata = ItemInvRet.find("RowData") fullName = Rowdata.attrib["value"] ColDatas = ItemInvRet.iter("ColData") for ColData in ColDatas: if ColData.attrib["colID"] == "5": QOH = ColData.attrib["value"] elif ColData.attrib["colID"] =="6": QOSO = ColData.attrib["value"] elif ColData.attrib["colID"] =="8": QA = ColData.attrib["value"] print(fullName, QOH, QOSO, QA, getShortName(fullName)) itemInvDict[fullName] = [getShortName(fullName), int(QOH) - int(QOSO)] #print(ItemInvRet.attrib, ItemInvRet.tag, ItemInvRet.text) # QOH = ItemInvRet.find('QuantityOnHand').text # QOSO = ItemInvRet.find('QuantityOnSalesOrder').text # #txnid = ItemInvRet.find('ListID').text # name = ItemInvRet.find('Name').text # fullName = ItemInvRet.find('FullName').text # itemInvDict[fullName] = [name, int(QOH) - int(QOSO)] # #print(itemInvDict[name], name, QOH, QOSO) except AttributeError: pass print(" Attribute err") except: print("err") print("") return itemInvDict def getShortName(FullName): #print(FullName) return FullName.split(":")[-1] if __name__=="__main1__": itemInvDict=QBStock() if __name__=="__main__": itemInvDict=QBStock(searchitems={"ECO:0:ECO-002","ECO:0:ECO-001",}) print("SEcond") #itemInvDict=QBStock(searchitems={"ECO:0:ECO-002","ECO:0:ECO-001","TS-Z2223"}) name = "TS-Z222" for x in itemInvDict: print (x, itemInvDict[x]) if name in itemInvDict: print(itemInvDict[name]) print(itemInvDict["TS-Z222"])