Почему цикл запускается более одного раза? - PullRequest
0 голосов
/ 04 декабря 2011

Я прошу прощения за публикацию такого большого количества кода, я не смог повторить поведение в обобщенной упрощенной программе, поэтому мне пришлось опубликовать реальный код.

Цель - содержимое cart таблица для размещения в таблицах orders и odetails.

На самом деле происходит следующее: если в корзине есть одна запись, в таблицах заказов будет более десяти записей.Я вижу, что циклы for, которые выполняются после insertSql, состоят в том, что он будет проходить через весь цикл один раз и завершаться в разрыве.То есть он выполняет insertSql, затем извлекает номер заказа ono, затем устанавливает атрибут класса orderNumber для полученного номера заказа ono и устанавливает корзину пустой.Чего мне не хватает?

Я использую Python 2.7 и модули cmd и cx_Oracle.

def oneClick(self,userLoggedIn):

    #this checks if there is a credit card available, if there isn't it denies one click check out
    sql = """
SELECT creditcardnumber, creditcardtype
FROM bs_members
WHERE userid = :userid
    """
    ds.execute(sql,userid=userLoggedIn)

    for row in ds:
        if row == (None,None):
            print """
One click check out is not available if you do not have a credit card on file.
"""

        else:
            break

    #this checks to see if the user has anything in the cart
    cartSql = """
SELECT DISTINCT userid FROM bs_cart WHERE userid = :userid
    """
    ds.execute(cartSql,userid=userLoggedIn)

    #this places the contents of the cart into the order tables
    insertSql = """
BEGIN
    INSERT INTO bs_orders (userid, ono, timePurchased)
        VALUES (:userid, orderNum_seq.NEXTVAL,(SELECT current_timestamp FROM dual));

    COMMIT;

    UPDATE bs_orders
        SET shipaddress = (SELECT address FROM bs_members WHERE userid = :userid)
            , shipcity = (SELECT city FROM bs_members WHERE userid = :userid)
            , shipstate = (SELECT state FROM bs_members WHERE userid = :userid)
            , shipzip = (SELECT zip FROM bs_members WHERE userid = :userid)
        WHERE userid = :userid
        AND timePurchased IN 
            (
            SELECT MAX(timePurchased)
                FROM bs_orders
                WHERE userid = :userid
                GROUP BY userid
            );

    INSERT INTO bs_odetails (ono, isbn, qty, price)
        SELECT orderNum_seq.CURRVAL, bs_cart.isbn, bs_cart.qty, bs_books.price
            FROM bs_orders, bs_cart, bs_books
            WHERE bs_orders.userid = :userid
            AND bs_cart.userid = :userid
            AND bs_books.isbn = bs_cart.isbn;

    DELETE FROM bs_cart
        WHERE userid = :userid;
END;
        """
    #if the cart has contents this for loop is executed

    for row in ds:
        ds.execute(insertSql,userid=userLoggedIn)
        sql = """
SELECT ono
    FROM bs_orders
    WHERE userid = :userid
    AND timePurchased IN
        (
        SELECT MAX(timePurchased)
            FROM bs_orders
            WHERE userid = :userid
            GROUP BY userid
        )
        """

        ds.execute(sql,userid=userLoggedIn)
        for row in ds:
            self.orderNumber = ''.join(str(i) for i in row)
            self.cartIsEmpty = False
        break

    #if the cart does not have any contents the user is told to try again
    else:
        print """
You have nothing in your cart!
            """
        self.cartIsEmpty = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...