首页 > 解决方案 > 我的函数没有返回变量,我不知道为什么

问题描述

我正在尝试创建函数然后调用它,但是其中一个函数不起作用。它不返回变量。我的代码分为 2 个文件,名为 libar2 的库和程序。函数 sort 不返回任何内容。错误是:NameError:未定义名称“to_write”。应该是字典。

这是程序:

list1 = []
list2 = []
list3 = []
#List indexu
indexus = ["Č.refer.dokladu", "Číslo dokladu", "Řádka ref.dok.","Účetní řádka"]
#List všech sloupců
listus = ["TypRefDokl","Č.refer.dokladu","Číslo dokladu","Řádka ref.dok.", "Účetní řádka","ÚčOkOdesíl", "Obchodní proces", "Logický systém", "Prodejní organizace", "Ledger", "Nositel nákladů", "Klíč měny účet.okruhu", "Prodej.doklad", "Druh pohybu MM", "Fiskální rok", "Druh faktury", "V měně profit centra", "Ref.org.jednotka", "Typ ukazatele", "Skupina původu", "Označení nemovitosti", "Podčíslo", "Druh dokladu", "Množství", "Refer.fiskální rok", "Druh výkonu", "ÚčOk příjemce", "Obor", "Cesta odbytu", "Čas pořízení dat", "Datum dokl.", "Elimin.profit center", "Partner.PrCtr", "Referenční operace", "Objekt původu", "Provoz.ekon.operace", "Zakázka odběratele", "Klíč firemní měny PrCtr", "Pol.zakázky odběr.", "Č.postupu k operacím", "Klíč měny trans.", "Verze", "Investiční majetek", "Odbytový doklad", "Dokl.byl stornován", "Text", "TypDokl", "Závod", "Třída objektu", "Datum účtování", "Nákladový okruh", "Polož.nák.dokladu", "Okruh ocenění", "Číslo reprezentativ.materiálu", "Pol.odbyt.dokladu", "Druh pohybu", "Verze rozlišení", "Druh ocenění", "Pol.prod.dokladu", "Datum pořízení", "Oblast hosp.výsl.", "V měně transakce", "Druh záznamu", "Prodejní kancelář", "Dodavatel", "Statist.ukazatel", "Odpisová oblast", "Partner.společnost", "Číslo účtu", "Klíč nemovitostí", "Zakázka", "Odběratel", "Znak Má dáti/Dal", "Dokl.je stornov.dokl.", "Nákupní doklad", "Skupina prodeje", "Druh dokl.", "Nákl.středisko", "Automatický znak", "Funkční obl.partnera", "Účetní období", "Funkční oblast", "Prvek SPP", "Materiál", "Datum valuty", "Dr.pohybu na IM", "Pracovní úsek", "Oper.ref.dokl.", "Profit centrum", "V měně účetního okruhu", "Dr.objektu příjemce", "Text účtů", "Jméno uživatele", "Zákl.měrná jednotka"]
columnnames = []
from Libar2 import (premade_table, sort, write, find_unknown)
import openpyxl
from json import load
import sqlite3
with open("cfg.json","r") as cfgfile:
    cfg = load(cfgfile)
dodavatele = cfg["DODAVATELE"]
con = sqlite3.connect("rozpocet.db")
cur = con.cursor()
wb = openpyxl.load_workbook(cfg["XLSX_FILE"])
sheet = wb.active

premade_table(cur)

loaded_sql = cur.execute("SELECT * FROM {0}".format(cfg["DB_NAME"]))

sort(indexus,loaded_sql,sheet)

write(cur,to_write,listus)

cur.execute('''
    CREATE TABLE IF NOT EXISTS {}(
    cislo INTEGER PRIMARY KEY,
    JmenoDodavatele TEXT)'''.format(cfg["TAB_SUPLY"]))

find_unknown(dodavatele,cfg["DB_NAME"],cur) 
        
cur.execute(
        """CREATE VIEW IF NOT EXISTS v1 AS 
        SELECT {1}.JmenoDodavatele,{0}.text,{0}.[Číslo účtu],{0}.[Text účtů],{0}.[Účetní období],{0}.[V měně profit centra] FROM {0} 
        LEFT JOIN {1} ON {0}.dodavatel = {1}.cislo;""".format(cfg["DB_NAME"], cfg["TAB_SUPLY"]))

        
con.commit()

这是图书馆:

def premade_table(cur):
    cur.execute("""CREATE TABLE IF NOT EXISTS {0}(
    {1} INTEGER NOT NULL,
    {2} INTEGER NOT NULL,
    {3} INTEGER NOT NULL,     
    {4} INTEGER NOT NULL,
    PRIMARY KEY ({1},{2},{3},{4})
    )""".format("db1", "[Č.refer.dokladu]", "[Číslo dokladu]",
                "[Řádka ref.dok.]","[Účetní řádka]"))
    listus = listus = ["TypRefDokl","Č.refer.dokladu","Číslo dokladu","Řádka ref.dok.", "Účetní řádka","ÚčOkOdesíl", "Obchodní proces", "Logický systém", "Prodejní organizace", "Ledger", "Nositel nákladů", "Klíč měny účet.okruhu", "Prodej.doklad", "Druh pohybu MM", "Fiskální rok", "Druh faktury", "V měně profit centra", "Ref.org.jednotka", "Typ ukazatele", "Skupina původu", "Označení nemovitosti", "Podčíslo", "Druh dokladu", "Množství", "Refer.fiskální rok", "Druh výkonu", "ÚčOk příjemce", "Obor", "Cesta odbytu", "Čas pořízení dat", "Datum dokl.", "Elimin.profit center", "Partner.PrCtr", "Referenční operace", "Objekt původu", "Provoz.ekon.operace", "Zakázka odběratele", "Klíč firemní měny PrCtr", "Pol.zakázky odběr.", "Č.postupu k operacím", "Klíč měny trans.", "Verze", "Investiční majetek", "Odbytový doklad", "Dokl.byl stornován", "Text", "TypDokl", "Závod", "Třída objektu", "Datum účtování", "Nákladový okruh", "Polož.nák.dokladu", "Okruh ocenění", "Číslo reprezentativ.materiálu", "Pol.odbyt.dokladu", "Druh pohybu", "Verze rozlišení", "Druh ocenění", "Pol.prod.dokladu", "Datum pořízení", "Oblast hosp.výsl.", "V měně transakce", "Druh záznamu", "Prodejní kancelář", "Dodavatel", "Statist.ukazatel", "Odpisová oblast", "Partner.společnost", "Číslo účtu", "Klíč nemovitostí", "Zakázka", "Odběratel", "Znak Má dáti/Dal", "Dokl.je stornov.dokl.", "Nákupní doklad", "Skupina prodeje", "Druh dokl.", "Nákl.středisko", "Automatický znak", "Funkční obl.partnera", "Účetní období", "Funkční oblast", "Prvek SPP", "Materiál", "Datum valuty", "Dr.pohybu na IM", "Pracovní úsek", "Oper.ref.dokl.", "Profit centrum", "V měně účetního okruhu", "Dr.objektu příjemce", "Text účtů", "Jméno uživatele", "Zákl.měrná jednotka"]
    columnnames = []
    for line in listus:
        if line in cur.execute('SELECT name FROM PRAGMA_TABLE_INFO("{}")'.format("db1")):
            pass
        else:
            columnnames.append(line)
    
    for line in columnnames:
        try:
            cur.execute("ALTER TABLE db1 ADD [{0}]".format(line))
        except:
            pass

    return columnnames


def sort(indexus,loaded_sql,sheet):
    ii = 0
    sqldic = {}
    for line in loaded_sql:
        if ii == 0:
            col = line
            ii += 1
            index_sql = [col.index(j) for j in indexus]
        sqldic["".join(str(line[i]) for i in index_sql)] = line
    
    ii = 0
    exceldic = {}
    for line in sheet.iter_rows(values_only=True):
        if ii == 0:
            col = line
            ii += 1
            index = [col.index(j) for j in indexus]
        exceldic["".join(line[i] for i in index)] = line
    
    
    to_write = {}
    for key in exceldic.keys():
        if key not in sqldic:
            to_write[key] = exceldic[key]
    return to_write

def write(cur,to_write,listus):
    for key,line in to_write.items():
        a = "("+"?,"*(len(line)-1) + "?)"
        col = "({})".format(",".join([("[{}]".format(i)) for i in listus]))
        ins_val = []
        [ins_val.append(str(i)) for i in line]
        try:
            cur.execute("INSERT INTO db1 {0} VALUES {1}".format(col, a), ins_val)
        except:
            continue

def find_unknown(dodavatele, db_name, cur):
    strsql = 'SELECT dodavatel FROM {}'.format(db_name)
    all_sup = set(str(int(i[0])) for i in cur.execute(strsql) if i[0])
    sup_dif = [x for x in list(all_sup.difference(set(dodavatele.keys())))]
    return sup_dif

标签: pythonpython-3.xfunctionsqlite

解决方案


在您的主程序中,您有一行

write(cur, to_write, listus)

但那里没有to_write定义变量。我认为您的意图是:

to_write = sort(indexus, loaded_sql, sheet)
write(cur, to_write, listus)

作为旁注,根据PEP 8 ,所有导入都应位于文件顶部。否则代码很难阅读。


推荐阅读