Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [MariaDB] Problema con check variabile booleana

    forse sta settimana è stata stancante e sono un pò rinco, ma anche oggi vi pongo una domanda sicuramente banale.
    ad una stored procedure gli passo un valore BOOLEAN, e devo controllare se è true o false.
    ma non riesco, in quanto o non entra proprio nella IF, o si comporta come se fosse sempre false.

    questo l'ultimo tentativo fatto:
    codice:
    DELIMITER //
    DROP PROCEDURE IF EXISTS add_preventivo //
    CREATE PROCEDURE add_preventivo(
        IN numero INT,
        IN operazione INT,
        IN anag INT,
        IN gruppo INT,
        IN data_scadenza DATE,
        IN anno YEAR(4),
        IN is_accettato BOOLEAN,
        IN is_fatturato BOOLEAN,
        IN fattura VARCHAR(255),
        IN note TEXT
    )
        NO SQL
    BEGIN
        IF numero = 0 THEN
            SET @last_numero = (SELECT MAX(prev_numero) FROM preventivi WHERE prev_anno = anno);
    
            IF @last_numero IS NOT NULL THEN
                SET @numero = @last_numero + 1;
            ELSE
                SET @numero = 1;
            END IF;
        ELSE
            SET @numero = numero;
        END IF;
    
        IF is_accettato = 'true' THEN
            IF operazione = 0 THEN
                SET @max_op = (SELECT MAX(prev_operazione) FROM preventivi);
    
                IF @max_op <> 0 THEN
                    SET @operazione = 1;
                ELSE
                    SET @operazione = @max_op + 1;
                END IF;
            END IF;
        ELSE
            SET @operazione = 120;
        END IF;
    
        INSERT INTO preventivi
        VALUES (NULL, @numero, @operazione, anag, gruppo, data_scadenza, anno, is_accettato, is_fatturato, fattura, note,
                NOW(), NOW())
        ON DUPLICATE KEY UPDATE prev_operazione    = @operazione,
                                prev_anag_fk       = anag,
                                prev_gruppo_fk     = gruppo,
                                prev_data_scadenza = data_scadenza,
                                prev_anno          = anno,
                                prev_is_accettato  = is_accettato,
                                prev_is_fatturato  = is_fatturato,
                                prev_fattura       = fattura,
                                prev_note          = note,
                                prev_data_modifica = NOW();
    
        SELECT prev_id AS last FROM preventivi WHERE prev_numero = @numero AND prev_anno = anno;
    END
    il pezzo di codice in questione è questo:
    codice:
        IF is_accettato = 'true' THEN
            IF operazione = 0 THEN
                SET @max_op = (SELECT MAX(prev_operazione) FROM preventivi);
    
                IF @max_op <> 0 THEN
                    SET @operazione = 1;
                ELSE
                    SET @operazione = @max_op + 1;
                END IF;
            END IF;
        ELSE
            SET @operazione = 120;
        END IF;
    mi mette sempre 120.

    precedentemente avevo anche provato con:
    codice:
    IF is_accettato = true
    oppure:
    codice:
    IF is_accettato = 1

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Quote Originariamente inviata da fermat Visualizza il messaggio
    forse sta settimana è stata stancante e sono un pò rinco, ma anche oggi vi pongo una domanda sicuramente banale.
    ad una stored procedure gli passo un valore BOOLEAN, e devo controllare se è true o false.
    ma non riesco, in quanto o non entra proprio nella IF, o si comporta come se fosse sempre false.

    questo l'ultimo tentativo fatto:
    codice:
    DELIMITER //
    DROP PROCEDURE IF EXISTS add_preventivo //
    CREATE PROCEDURE add_preventivo(
        IN numero INT,
        IN operazione INT,
        IN anag INT,
        IN gruppo INT,
        IN data_scadenza DATE,
        IN anno YEAR(4),
        IN is_accettato BOOLEAN,
        IN is_fatturato BOOLEAN,
        IN fattura VARCHAR(255),
        IN note TEXT
    )
        NO SQL
    BEGIN
        IF numero = 0 THEN
            SET @last_numero = (SELECT MAX(prev_numero) FROM preventivi WHERE prev_anno = anno);
    
            IF @last_numero IS NOT NULL THEN
                SET @numero = @last_numero + 1;
            ELSE
                SET @numero = 1;
            END IF;
        ELSE
            SET @numero = numero;
        END IF;
    
        IF is_accettato = 'true' THEN
            IF operazione = 0 THEN
                SET @max_op = (SELECT MAX(prev_operazione) FROM preventivi);
    
                IF @max_op <> 0 THEN
                    SET @operazione = 1;
                ELSE
                    SET @operazione = @max_op + 1;
                END IF;
            END IF;
        ELSE
            SET @operazione = 120;
        END IF;
    
        INSERT INTO preventivi
        VALUES (NULL, @numero, @operazione, anag, gruppo, data_scadenza, anno, is_accettato, is_fatturato, fattura, note,
                NOW(), NOW())
        ON DUPLICATE KEY UPDATE prev_operazione    = @operazione,
                                prev_anag_fk       = anag,
                                prev_gruppo_fk     = gruppo,
                                prev_data_scadenza = data_scadenza,
                                prev_anno          = anno,
                                prev_is_accettato  = is_accettato,
                                prev_is_fatturato  = is_fatturato,
                                prev_fattura       = fattura,
                                prev_note          = note,
                                prev_data_modifica = NOW();
    
        SELECT prev_id AS last FROM preventivi WHERE prev_numero = @numero AND prev_anno = anno;
    END
    il pezzo di codice in questione è questo:
    codice:
        IF is_accettato = 'true' THEN
            IF operazione = 0 THEN
                SET @max_op = (SELECT MAX(prev_operazione) FROM preventivi);
    
                IF @max_op <> 0 THEN
                    SET @operazione = 1;
                ELSE
                    SET @operazione = @max_op + 1;
                END IF;
            END IF;
        ELSE
            SET @operazione = 120;
        END IF;
    mi mette sempre 120.

    precedentemente avevo anche provato con:
    codice:
    IF is_accettato = true
    oppure:
    codice:
    IF is_accettato = 1
    Ciao,
    devi controllare IF is_accettato = true e non 'true'

  3. #3
    Quote Originariamente inviata da Joe Taras Visualizza il messaggio
    Ciao,
    devi controllare IF is_accettato = true e non 'true'
    ciao!

    eh ma come ho detto a fine post, ho già fatto quella prova.
    ti riposto la SP:
    codice:
    DELIMITER //
    DROP PROCEDURE IF EXISTS add_preventivo //
    CREATE PROCEDURE add_preventivo(
        IN numero INT,
        IN operazione INT,
        IN anag INT,
        IN gruppo INT,
        IN data_scadenza DATE,
        IN anno YEAR(4),
        IN is_accettato BOOLEAN,
        IN is_fatturato BOOLEAN,
        IN fattura VARCHAR(255),
        IN note TEXT
    )
        NO SQL
    BEGIN
        IF numero = 0 THEN
            SET @last_numero = (SELECT MAX(prev_numero) FROM preventivi WHERE prev_anno = anno);
    
            IF @last_numero IS NOT NULL THEN
                SET @numero = @last_numero + 1;
            ELSE
                SET @numero = 1;
            END IF;
        ELSE
            SET @numero = numero;
        END IF;
    
        IF is_accettato = true THEN
            IF operazione = 0 THEN
                SET @max_op = (SELECT MAX(prev_operazione) FROM preventivi);
    
                IF @max_op <> 0 THEN
                    SET @operazione = 1;
                ELSE
                    SET @operazione = @max_op + 1;
                END IF;
            END IF;
        ELSE
            SET @operazione = 0;
        END IF;
    
        INSERT INTO preventivi
        VALUES (NULL, @numero, @operazione, anag, gruppo, data_scadenza, anno, is_accettato, is_fatturato, fattura, note,
                NOW(), NOW())
        ON DUPLICATE KEY UPDATE prev_operazione    = @operazione,
                                prev_anag_fk       = anag,
                                prev_gruppo_fk     = gruppo,
                                prev_data_scadenza = data_scadenza,
                                prev_anno          = anno,
                                prev_is_accettato  = is_accettato,
                                prev_is_fatturato  = is_fatturato,
                                prev_fattura       = fattura,
                                prev_note          = note,
                                prev_data_modifica = NOW();
    
        SELECT prev_id AS last FROM preventivi WHERE prev_numero = @numero AND prev_anno = anno;
    END

  4. #4
    a scanso di equivoci, ho provato a richiamarla direttamente così invece che da programma:
    codice:
    CALL add_preventivo(1, 0, 5, 4, '2022-11-05', '2022', true, false, '', 'test');
    mi fa l'update di tutti i campi, tranne operazione che rimane sempre a null.

  5. #5
    ok capito il problema:
    codice:
    IF @max_op <> 0 THEN --> IF @max_op != 0 THEN
    adesso funziona!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.