Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Problemas con sql en python.
#1
hola francisco, retomando python y sql.
tabla1-> asignatur: codigoAsig, nombresC, nombre, nPeriodos, nomProfesor
codisgoAsig(ee111), nombresC(Enfermeria), nombre(auxiliar 1), nPeriodos(2), nomProfesor(Jose 1)

tabla2-> malla: nomCar1, nomAlu1, listaNomAsig2
nomCar1(Enfermeria), nomAlu1(Maria 1), listaNomAsig2(ee111 - auxiliar 1)

Lo que debe hacer:
Selecciono de un combobox1 una carrera ejemplo "Enfermeria", en el
otro combobox2 selecciono "Maria 1" (que pertenece a enfermeria).
luego hago click en un command button1 que muestra en listbox1
los posibles ramos que debo tomar (para Enfermeria), luego
hago click en command button2 de listbox1 pasa a listbox2(donde
queda el ramo tomado) en el listbox2 muestra el ramo
tomado (para Enfermeria).

Problema 1: Mi consulta sql11Z muestra en el listbox1 los ramos de
todas las carreras (enfermeria, medicina, psicologia y otros).
Y deberia solo mostrar los ramos de enfermeria

En listbox2 mi consulta sqlZZ2 muestra el ramo tomado

az=seleccionZ.get()#combobox1 ejemplo enfermeria
bz=seleccion2Z.get()#combobox2 ejemplo Maria 1 (que pertenece a enfermeria)

Aqui lleno listbox2:
sqlZZ2 = "SELECT listaNomAsig2 FROM malla \
    WHERE nomCar1='{}' and nomAlu1='{}';" \
    .format(az, bz)

################################################################
################################################################
El codigo sql11Z que escribo a continuacion.
Llena listbox1:
Este es el problema(sql11Z)!!! muestra los ramos de todas las carreras
(Enfermeria(ee222 - auxiliar 2, menos el ramo que tomé, que es ee111 - auxiliar 1),
en medicina(muestra todos), psicologia(muestra todos).
Osea No muestra el ramo tomado.
En listbox2 muestra (ee111 - auxiliar 1)Eso lo hace bien el sqlZZ2 de listbox2

Aqui sql11Z es el problema descrito anteriormente
sql11Z="SELECT CONCAT(codigoAsig,' - ',nombre) FROM asignatur\
        EXCEPT SELECT listaNomAsig2 FROM malla \
        WHERE nomAlu1='"+(bz)+"'"

sql11Z='''SELECT CONCAT(codigoAsig,' - ',nombre) FROM asignatur\
        EXCEPT SELECT listaNomAsig2 FROM malla \
    WHERE nomAlu1=("%s")''' % (bz)

sql11Z="SELECT CONCAT(codigoAsig,' - ',nombre) FROM asignatur\
    EXCEPT SELECT listaNomAsig2 FROM malla \
    WHERE nomAlu1 LIKE '%"+bz+"%';"

sql11Z="SELECT CONCAT(codigoAsig,' - ',nombre) FROM asignatur \
            EXCEPT SELECT listaNomAsig2 FROM malla \
            WHERE nomCar1='{}' and nomAlu1='{}';" \
            .format(az, bz)

sql11Z="SELECT CONCAT(codigoAsig,' - ',nombre) FROM asignatur \
            EXCEPT SELECT listaNomAsig2 FROM malla \
            WHERE nomCar1='{}' and nomAlu1='{}';" \
            .format(seleccionZ.get(), seleccion2Z.get())

############################################################################
Con este codigo sql11Z que escribo a continuacion.
Muestra bien solo enfermeria.
Cuando selecciono otra carrera(ejemplo medicina)
muestra los ramos que no tome de enfermeria en el listbox1 (eso esta mal),
pero no muestra los ramos de medicina que ya tomé en el listbox1,
en el listbox2 muestra los ramos que si tome de medicina.

el sql11Z no muestra los ramos de otras carreras que el alumnoX no ha tomado de
las otras carreras(ejemplo psicologia),

listbox2 muestra bien los ramos tomados del sqlZZ2.

sql11Z="SELECT CONCAT(codigoAsig,' - ',nombre) FROM asignatur\
        EXCEPT SELECT listaNomAsig2 FROM malla"

sql11Z="SELECT concat(codigoAsig,' - ',nombre) \
    FROM asignatur LEFT JOIN malla ON \
    concat(codigoAsig,' - ',nombre) = listaNomAsig2 \
    WHERE malla.listaNomAsig2 IS NULL"

sql11Z="SELECT CONCAT(codigoAsig,' - ',nombre) \
    FROM asignatur \
    WHERE CONCAT(codigoAsig,' - ',nombre) NOT IN\
    (SELECT listaNomAsig2 FROM malla)"

sql11Z="SELECT DISTINCT CONCAT(codigoAsig,' - ',nombre) \
        FROM asignatur \
        EXCEPT SELECT listaNomAsig2 FROM malla;"
Responder
#2
#habia quedado en deuda con el foro, espero que sea un pequeño aporte

Código:
import tkinter as tk
from tkinter import ttk
import mysql.connector
import time

db = mysql.connector.connect(
    host="localhost",
    user="root",
    password="mi_password",
    database="mi_database"
)
cursor = db.cursor()


root = tk.Tk()
root.title("Gestor de Carreras, Alumnos y Asignaturas")


def cargar_nombres_carreras():
    cursor.execute("SELECT nombresC FROM carrera")
    carreras = [carrera[0] for carrera in cursor.fetchall()]
    combo_carrera['values'] = carreras

def cargar_nombres_alumnos(event):
    selected_carrera = combo_carrera.get()
    cursor.execute("SELECT nombres, apellidos FROM alumnos WHERE nombresC=%s", (selected_carrera,))
    alumnos = [f"{alumno[0]} {alumno[1]}" for alumno in cursor.fetchall()]
    combo_alumnos['values'] = alumnos


def mostrar_info():
    l1 = list()
    l2 = list()

    selected_carrera = combo_carrera.get()  
    selected_alumno = combo_alumnos.get().split()  
    
    cursor.execute("SELECT * FROM asignatur WHERE nombresC=%s", (selected_carrera,))
    asignatura_info = cursor.fetchall()

    listbox_info.delete(0, tk.END)  
    for i, info in enumerate(asignatura_info):
        record = f"{info[0]} - {info[2]}"
        l1.append(record)  
        listbox_info.insert(tk.END, record)
        #print(f"Insertar registro {i + 1}: {record}")

    cursor.execute("SELECT nomCar1, nomAlu1, listaNomAsig2 FROM malla WHERE nomCar1=%s", (selected_carrera,))
    malla = cursor.fetchall()
    
    listbox_malla.delete(0, tk.END)
    for item in malla:
        listbox_malla.insert(tk.END, f"{item[2]}")
        l2.append(f"{item[2]}")  
        #print("MALLA codigoAsig nombre l2-->", item[2])

    
    l1 = [record for record in l1 if record not in l2]
    listbox_info.delete(0, tk.END)
    for record in l1:
        listbox_info.insert(tk.END, record)


combo_carrera = ttk.Combobox(root, state="readonly")
combo_carrera.grid(row=0, column=0, padx=10, pady=10)
combo_carrera.bind("<<ComboboxSelected>>", cargar_nombres_alumnos)

combo_alumnos = ttk.Combobox(root, state="readonly")
combo_alumnos.grid(row=0, column=1, padx=10, pady=10)

button_mostrar_info = ttk.Button(root, text="Asignatura posible", command=mostrar_info)
button_mostrar_info.grid(row=1, column=0, columnspan=2, pady=10)

listbox_info = tk.Listbox(root)
listbox_info.grid(row=2, column=0, columnspan=2, padx=10, pady=10)

listbox_malla = tk.Listbox(root)
listbox_malla.grid(row=4, column=0, columnspan=2, padx=10, pady=10)


def mostrar_seleccion():
    selected_index = listbox_info.curselection()
    if selected_index:
        selected_item = listbox_info.get(selected_index)
        listbox_info.delete(selected_index)
        listbox_malla.insert(tk.END, selected_item)
        


button_mostrar_seleccion = tk.Button(root, text="Seleccionar asignatura", command=mostrar_seleccion)
button_mostrar_seleccion.grid(row=3, column=0, columnspan=2, padx=10, pady=10)


cargar_nombres_carreras()


root.mainloop()


cursor.close()
db.close()
Responder
#3
Gracias Smile
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 3 invitado(s)