Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [Oracle] Struttura query per csv

    ciao!

    allora, da questa query:
    codice:
    SELECT 'T' TESTATA,
      TRIM(MD.CONTO) CODICE_CLIENTE,
      MD.NPUDSTF NPU,
      TRIM(MD.NUMERAT_C4) TIPO_DOC,
      TRIM(MD.SERIE_C4)
      || '/'
      || TRIM(MD.NUM_C4)
      || '/'
      || TRIM(MD.PERIODO_C4) NUM_DOC,
      MD.DATDOC DATA_DOCUMENTO,
      'R' RIGA,
      TRIM(MD.NPAM) NPAM,
      MD.QUANTI QTA,
      MD.SCONTO1 SC1,
      MD.SCONTO2 SC2,
      MD.SCONTO3 SC3,
      MD.PREZZO PREZZO_UNI,
      MD.IMPORTO IMP_RIGA
    FROM MOV_MAG_DETT MD
    WHERE MD.FVL       = ' '
    AND MD.DITTA       = 'XXL'
    AND MD.CONTO       = 'CLMT500532'
    AND MD.NUMERAT_C4 IN ('NF', 'NC')
    AND TRIM(MD.SERIE_C4)
      || '/'
      || TRIM(MD.NUM_C4)
      || '/'
      || TRIM(MD.PERIODO_C4) = 'V1/111/2222' ;
    estraggo un csv in questo formato:
    codice:
    T;CLMT500532;NF;V1/111/2222;2022-01-25 00:00:00;R;3VXH;1;10;0;0;47;47
    T;CLMT500532;NF;V1/111/2222;2022-01-25 00:00:00;R;3VXH;1;10;0;0;47;47
    mi hanno chiesto di strutturare il csv in questa maniera:
    codice:
    T;CLMT500532;NF;V1/111/2222;2022-01-25;
    R;3VXH;1.00000;10.00;0.00;0.00;47.00000;47.00000
    R;3VXH;1.00000;10.00;0.00;0.00;47.00000;47.00000
    è una cosa che posso risolvere usando solo l'SQL?
    o devo elaborarlo da programma??

  2. #2
    la query estrae una sola riga di testata (T) e n righe di dettaglio (R) o è possibile che estragga più testate ognuna con i suoi dettagli?

  3. #3
    Quote Originariamente inviata da optime Visualizza il messaggio
    la query estrae una sola riga di testata (T) e n righe di dettaglio (R) o è possibile che estragga più testate ognuna con i suoi dettagli?
    eh infatti hai ragione.
    quella è una fattura singola, ma in verità la query estrarrà per periodo.
    quindi il file diventerà una cosa così:
    codice:
    T;CLMT500532;NF;V1/111/2222;2022-01-25;
    R;3VXH;1.00000;10.00;0.00;0.00;47.00000;47.00000
    R;3VXH;1.00000;10.00;0.00;0.00;47.00000;47.00000
    T;CLMT50089;NF;V1/112/2222;2022-01-26;
    R;3VXU;1.00000;10.00;0.00;0.00;47.00000;47.00000
    R;3VXU;1.00000;10.00;0.00;0.00;47.00000;47.00000
    quindi ad esempio due testate con sotto le relative righe!

  4. #4
    la scrittura del csv la fa direttamente oracle o la fai tu da codice?

  5. #5
    no la faccio da codice.
    sono tutta una serie di script in python che creano dei csv da passare ad un altro programma.
    script che andranno richiamati in automatico con cron o qualcusa di simile.

    quindi da script, eseguo quella query e metto il risultato dentro al csv.

  6. #6
    e allora non capisco la domanda: continuerai a farlo da codice

  7. #7
    Quote Originariamente inviata da optime Visualizza il messaggio
    e allora non capisco la domanda: continuerai a farlo da codice
    scusa ma non capisco le domande tue allora .

    io da codice creo un csv lanciando quella query.
    ma crea un csv prendendo in automatico i campi che mi tira fuori dandogli quella struttura.

    qui eseguo la query:
    codice:
    from utils import *
    
    def fatture():
        cmd = """
            SELECT 'T' TESTATA,
                TRIM(CONTO) CODICE_CLIENTE,
                MD.NPUDSTF NPU,
                TRIM(MD.NUMERAT_C4) TIPO_DOC,
                TRIM(MD.SERIE_C4)
                || '/'
                || TRIM(MD.NUM_C4)
                || '/'
                || TRIM(MD.PERIODO_C4) NUM_DOC,
                MD.DATDOC DATA_DOCUMENTO,
                'R' RIGA,
                TRIM(MD.NPAM) NPAM,
                MD.QUANTI QTA,
                MD.SCONTO1 SC1,
                MD.SCONTO2 SC2,
                MD.SCONTO3 SC3,
                MD.PREZZO PREZZO_UNI,
                MD.IMPORTO IMP_RIGA
            FROM MOV_MAG_DETT MD
            WHERE MD.FVL       = ' '
                AND MD.DITTA       = 'XXL'
                AND MD.CONTO       = 'CLMT500532'
                AND MD.NUMERAT_C4 IN ('NF', 'NC')
                AND TRIM(MD.SERIE_C4)
                || '/'
                || TRIM(MD.NUM_C4)
                || '/'
                || TRIM(MD.PERIODO_C4) = 'V1/111/2222' ;
    """
        create_csv('fatture.csv', cmd)
    qui creo il csv:
    codice:
    import pyodbc
    import csv
    
    def conn():
        cnxn = pyodbc.connect("...........")
        return cnxn
    
    def create_csv(nome, cmd):
        cursor = conn().cursor()
        rows = cursor.execute(cmd)
        with open('csv/' + nome, 'w', newline='') as csvfile:
            writer = csv.writer(csvfile, delimiter=';')
            for row in rows:
                writer.writerow(row)
    ora la mia domanda è: è possibile strutturare la query per dare un'altra struttura al csv senza toccare la funzione create_csv??
    oppure devo cambiare la struttura della funzione??

    come vedi questa funzione si limita a prendere i campi e metterli nel file.
    invece a me serve un'altra struttura csv.
    da qui la domanda sopra.

  8. #8
    ok, adesso con tutte le info è più chiaro; secondo me non si riesce cambiando la query (ma magari qualche guru di Oracle lo sa fare); potresti pensare a una UNION, ma il problema è che il numero di colonne tra "T" e "R" è diverso. Credo che dovrai cambiare la funzione

  9. #9

  10. #10
    grazie per il link!

    sto provando ma senza molto successo.
    in pratica mi tira fuori prima tutti i dati con T (per intenderci).
    e poi tutte i dati con R.
    quindi non rispecchia la struttura richiesta.

    penso dovrò agire da codice .

    grazie per l'aiuto!!

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.