Visualizzazione dei risultati da 1 a 10 su 10

Discussione: IBM as400 - sql

  1. #1

    IBM as400 - sql

    ciao a tutti,
    ho un problemino in quanto non riesco ancora a lavorare in modo ottimale con le sql fatte tramite collegamento odbc su ibm iseris as400...

    ho questa quey in una pagina php

    codice:
    $result=odbc_exec($conn,"SELECT SUM(QTMOV) AS QTATOT, SUM(MEVAL)
    AS VALTOT, substring(DAMOV,2,4) AS MESE from MAGMAXNEW WHERE (cdmag='02'
    or cdmag='08') GROUP BY substring(DAMOV,2,4) ORDER BY MESE");
    in pratica mi restituisce la somma delle qtà e valori per mese, e funziona. Il problema è che alcuni valori del campo "MEVAL" (rientranti nella somma totale dei valori) devono essere considerati negativi nel caso in cui un'altro campo ("CDCAU") fosse uguale a '74' o 'V-'. Con access usavo un "iif" direttamente nell'sql ma qui sembra non funzionare. Possibile?

    Sempre in merito, non capisco una cosa (sono nuovo di php): è meglio fare una sql che mi estre tutto e poi lavorare con il php per la selezione o fare sql anche più complesse ed avere già il risultato corretto?

    Spero di essere stato abbastanza chiaro.......

    intanto grazie mille!

  2. #2
    devi usare gli switch/case

    non è esattamente per la stessa versione, ma funziona
    http://publib.boulder.ibm.com/infoce...ref/psmcse.htm

  3. #3

    Re: IBM as400 - sql

    Originariamente inviato da snaker81
    Sempre in merito, non capisco una cosa (sono nuovo di php): è meglio fare una sql che mi estre tutto e poi lavorare con il php per la selezione o fare sql anche più complesse ed avere già il risultato corretto?
    dipende dai casi! non esiste una regola assoluta

  4. #4
    Originariamente inviato da daniele_dll
    devi usare gli switch/case

    non è esattamente per la stessa versione, ma funziona
    http://publib.boulder.ibm.com/infoce...ref/psmcse.htm
    grazie x la risp.
    in effetti potrebbe fare al caso mio ma putroppo pago la mia ignoranza in merito di php, come posso inserire tutto il codice delle istruzioni slq nel codice php? perchè mi trovo un po' legato avendo la stringa inglobata nel comando odbc_exec, non so come comportarmi a livello di forma.

    non so come spiegarmi........

    chiedo troppo se potresti modificare a titolo di esempio il mio codice inserendo il case su cdcau?


  5. #5
    non è codice php ... ma sql ... ti ho linkato appositamente una pagina dal sito dell'ibm per questo

    la query la puoi riscrivere così
    codice:
    SELECT
        SUM(QTMOV) AS QTATOT,
        SUM((CASE CDCAU WHEN '76' THEN MEVAL * -1 WHEN 'V-' THEN MEVAL * -1 ELSE MEVAL END CASE)) AS VALTOT,
        substring(DAMOV,2,4) AS MESE
    
    FROM
        MAGMAXNEW
    
    WHERE
        cdmag='02'
        OR
        cdmag='08'
    
    GROUP BY
        substring(DAMOV,2,4)
    
    ORDER BY
        MESE
    fai qualche prova perché (per mia fortuna) non ho un as400 a disposizione (ho smesso di metterci le mani ^^)

  6. #6
    Intanto grazie per il chiarimento. Ho provato ad inserirla in questo modo:

    codice:
    $result=odbc_exec($conn,"
    		SELECT
    			SUM(QTMOV) AS QTATOT,
    			SUM(CASE CDCAU WHEN 'V-' THEN MEVAL*-1 WHEN '74' THEN MEVAL*-1 WHEN 'R-' THEN MEVAL*-1 ELSE MEVAL END CASE) AS VALTOT,
    			substring(DAMOV,2,4) AS MESE
    		FROM
    			FERFQRY.MAGMAXNEW
    		WHERE
    			(CDCAU='01' OR cdcau='V+' OR cdcau='V-' OR CDCAU='74' OR CDCAU='R+' OR CDCAU='R-')
    			AND
    			(CDMAG='02' OR CDMAG='08')
    		GROUP BY
    			substring(DAMOV,2,4)
    		ORDER BY
    			MESE
    		");
    Sul CASE però mi dà errore:

    Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0199 - Parola chiave CASE non prevista. Token validi: ) ,., SQL state 37000 in SQLExecDirect in

    mmm...

  7. #7
    mmm, guarda è qualcosa che ho usato spesso

    questo è un pezzo di una query nel quale ho usato il case su as400

    codice:
                        WITH CONTEGGI AS
                        (
                            SELECT
                                COUNT(movca1.MCCDI) AS MOVIMENTI_1_SEMESTRE,
                                COUNT(movca2.MCCDI) AS MOVIMENTI_2_SEMESTRE,
                                SUM
                                (
                                    CASE WHEN movca1.MCCDI != '' AND movca2.MCCDI != ''
                                        THEN
                                            1
                                        ELSE
                                            0
                                    END
                                ) AS MOVIMENTI_AMBO_SEMESTRI,
                                SUM
                                (
                                    CASE WHEN movca1.MCCDI != '' OR movca2.MCCDI != ''
                                        THEN
                                            1
                                        ELSE
                                            0
                                    END
                                ) AS MOVIMENTI_TOTALI
    (non la posto tutta perché è lunga un centinaio di righe errotti )

  8. #8
    Risolto !

    come sempre quando l'errore è piccolo piccolo non si trova mai.....in pratica non mi accetta "END CASE" alla fine ma solo "END" (a differenza di quanto indicato nella guida Ibm, forse come dici te è un problema di versioni).

    Il CASE in errore che mi segnalava è infatti quello che avevo messo dopo l'END.

    posto la query finale che ho usato se può essere utile...

    codice:
    $result=odbc_exec($conn,"
    		SELECT
    			SUM(CASE CDCAU
    				WHEN 'V-' THEN QTMOV*-1
    				WHEN '74' THEN QTMOV*-1
    				WHEN 'R-' THEN QTMOV*-1
    				ELSE QTMOV
    				END) AS QTATOT,
    			SUM(CASE CDCAU
    				WHEN 'V-' THEN MEVAL*-1
    				WHEN '74' THEN MEVAL*-1
    				WHEN 'R-' THEN MEVAL*-1
    				ELSE MEVAL
    				END) AS VALTOT,
    			substring(DAMOV,2,4) AS MESE
    		FROM
    			FERFQRY.MAGMAXNEW
    		WHERE
    			(CDCAU='01' OR cdcau='V+' OR cdcau='V-' OR CDCAU='74' OR CDCAU='R+' OR CDCAU='R-')
    			AND
    			(CDMAG='02' OR CDMAG='08')
    		GROUP BY
    			substring(DAMOV,2,4)
    		ORDER BY
    			MESE
    		");
    Grazie mille, sei stato di grande aiuto.

  9. #9
    se la vuoi accorciare, anche per questioni di semplicità, puoi usare la sintassi alternativa ovvero quella CASE WHEN condizione ...mettendo al posto di condizion CDCAU = 'V-' OR CDCAU = '74' OR CDCAU = 'R-'

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    29
    per lavorare sui dati(parlavi di if) puoi farlo direttamente da PHP..
    per quanto riguarda la query ti conviene fare una query piu' complessa per evitare cosi il caricamento di dati inutili, che diminuiscono le prestazioni

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.