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

    [MySQL + PHP] - Incrementare un contatore fatture

    Salve,

    ho realizzato un gestionale che si occupa di emisione DDT/ Fatture ect....

    L'applicativo è fruibile su diverse piattaforme, dall'IPAD , PC , smartphone etc...

    e oggi è successo che ci siamo ritrovati con alcuni documenti con lo stesso numero progressivo.

    la cronologia delle query per l'attribuzione del num. progressivo all'interno dello script php avviene in questo modo:

    Codice PHP:
    //carico la numerazione progressiva corrente
    1"SELECT indice as num_prog FROM index_progressive WHERE tipoDoc='DDT' LIMIT 1";
       ......
        
    $contatore $row['num_prog'];
        
    $contatore++;
       ......

    //inserisco il documento nell'archvio associato al numero_progressivo
    2"INSERT INTO registro (numDoc,campo2, campo3, ecc) VALUES ($contatore, e altri valori  campi)

    //incremento la numerazione progressiva
    3) "
    UPDATE index_progressive SET indice=indice+1 WHERE tipoDoc='DDT'
    Tutto questo può avvenire anche simultaneamente, e credo che mentre si sta per scrivere un RECORD può accadere che un altro operatore possa svolgere la medesima operazione caricando lo stesso numero progressivo ed avendo come risultato due DDT con lo stesso numero.

    Credo che sia meglio caricare la numerazione progressiva ed incremetarla da subito.
    Ma ho dei dubbi anche in questo modo....

    Che tipo di precauzione potrei aggiungere allo script che si occupa di memorizzare il documento????

    Vi ringrazio per qualsiasi suggerimento...
    IMPOSSIBLE IS NOTHING - LOOK BEFORE YOU LEAP !!!

  2. #2
    Forse non ho capito bene io....
    ma non era sufficiente creare la tabella "registro" con il campo "numDoc" unique e AUTO_INCREMENT???

  3. #3
    Utente bannato
    Registrato dal
    Nov 2011
    Messaggi
    150
    non è una grandissima idea usare campi autoincrementanti per numerare i documenti fiscali.

    devi LOCKare la tabella, impedendo così la scrittura da parte di altri.
    Sì lo so è brutto, e non funziona bene se hai tantissimi client contemporanei, ma è il modo più indolore, se non vuoi creare una transazione ACID (che però... non so ancora fare)

  4. #4
    Vi ringrazio per i suggerimenti, ma poco si adattano alle mie esigenze e non conviene di certo affidare la numerazione all'autoincrement.

    La soluzione è molto semplice, l'abbiamo testata cercando di generare documenti su un database di test, in contemporanea con + operatori da dispositivi diversi.

    Abbiamo numerato ogni form con un timestamp e poi un controllo a monte che ne verifica la consistenza in una tabella associata.
    In conclusione il controllo è questo : se il timestamp esiste in archvio vuol dire che il form è stato già processato e salvato, di conseguenza la numerazione si sposta in avanti di un punto.

    tutto qui.

    grazie ancora
    IMPOSSIBLE IS NOTHING - LOOK BEFORE YOU LEAP !!!

  5. #5
    Utente bannato
    Registrato dal
    Nov 2011
    Messaggi
    150
    Ahem... secondo i sacri testi è una soluzione sbagliata.
    C'è tutta una teoria sulla sincronizzazione degli orologi, o meglio impossibilità di sincronizzare gli orologi, che determina che la vostra soluzione solo apparentemente funziona.

    L'unica che funziona davvero è quella di aver un blocco atomico (... sarà una bomba H? ) su una tabella (mio primo suggerimento) o avere una transazione con BEGIN TRANSACTION e livello massimo (serializable o qualcosa del genere), che in sostanza fa la stessa cosa (seconda soluzione).
    Non è che sia farina del mio sacco (... magari...) è solo che (da quanto leggo) non ci sono alternative. Anzi sì, ce ne sarebbe una, ma non l'ho capita tanto bene (riguarda un problema dei generali bizantini o solcazzo con spedizione di messaggi o qualcosa del genere).

    (vabbè un paio di libri di mysql e php li sto leggendo)

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.