• User

    Problema inserimento record doppi

    Ciao a tutti.

    Avrei messo a punto una semplice procedura asp con la quale si fa l'upload di un file csv in un server e si registrano i dati in esso contenuti in una tabella di un database mysql.

    Per evitare di caricare record doppi o non conformi alle condizioni previste nella procedura, ho messo un controllo sui record già esistenti nella tabella prima dell'inserimento nel db.

    Mi sono accorto però che quando riprovo ad inserire lo stesso file csv i dati che prima erano stati esclusi mi vengono aggiunti.

    Ad esempio nel file csv ho le seguenti righe:

    riga 1 = PIPPO, 25/07/2008, 11:50, XXXZZZ, UTENTE
    riga 2 = PIPPO, 26/07/2008, 01:50, XXXZZZ, UTENTE
    riga 3 = CAIO, 25/07/2008, 17:50, XXXYYY, NEWBIE
    riga 4 = TIZIO, 26/07/2008, 10:05, YYYZZZ, ADMIN

    La prima volta che carico il file csv nel db mi ritrovo con le righe 1-3 e 4.

    La seconda volta che carico lo stesso file csv mi ritrovo nel db anche la riga 2 che il primo inserimento aveva escluso perchè riga simile alla riga 1.

    Questo è il codice ASP:

     
    PercorsoCSV = "D:\Inetpub\wwwroot\CSV\file1.csv "
     
      Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
      strURL = percorsoCSV 
     
      Set objFile = objFSO.OpenTextFile(strURL)  
      objFile.SkipLine()  
     
      strVariabile = ""
      Do While Not objFile.AtEndOfStream
     
       strText = objFile.readLine   
       arrText = split(strText, ",", 17)
     
    'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE
    SQL = " SELECT * " 
    SQL = SQL & " FROM "  
    SQL = SQL & " tabellaCSV " 
    SQL = SQL & " WHERE "
    SQL = SQL & " NOME = '" & replace(arrText(0), """", "") & "' " 
    SQL = SQL & " AND "  
    SQL = SQL & " DATA = " & formatDBDate(replace(arrText(2), """", ""), "mysql") & " " 
    SQL = SQL & " AND "  
    SQL = SQL & " ORA = '" & replace(arrText(3), """", "") & "' "
    SQL = SQL & " AND " 
    SQL = SQL & " CODICE_PERSONALE = '" & replace(arrText(7), """", "") & "' "
    SQL = SQL & " AND " 
    SQL = SQL & " DESCRIZIONE = '" & replace(arrText(8), """", "") & "' "
    Set objRS = Server.CreateObject("ADODB.Recordset")
    objRS.open SQL, cn
     
    'APERTURA PRIMO IF E CONTROLLO SU objRS
    if objRS.eof then
     
    'QUI CONTROLLO LE RIGHE SIMILI ED INSERISCO NEL DB MYSQL
    if objRS("CODICE_PERSONALE") <> strVariabile  then
     
    strSql = "INSERT INTO tabellaCSV ... " 
    cn.execute(strSql)
     
      strVariabile = objRS("CODICE_PERSONALE")
     
     end if
     
    'ALTRIMENTI SU PRIMO IF     
    else
     
      response.write "record già presente!<br>"
     
    'CHIUSURA PRIMO IF
    end if
      Loop
     
      objRS.Close()
      Set objRS = Nothing 
     
      cn.Close()
      Set cn = nothing
     
    Set fsoMyFile = CreateObject("Scripting.FileSystemObject")
     
    if fsoMyFile.FileExists (PercorsoCSV) then
       fsoMyFile.DeleteFile PercorsoCSV
    end if
     
    Set fsoMyFile = Nothing 
    Set objFSO = Nothing
    
    

    Sapete darmi qualche buon consiglio per ovviare al problema?
    Grazie


  • Super User

    Scusami, ma le righe devono essere uguali o simili? Perchè tu escludi le righe identiche, perchè usi tutti AND nella query. in teoria dovrebbe inserire la riga anche la prima volta, a meno che la stessa riga sia già dentro. Altrimenti, il codice fa bene a inserire tutte e 4 le righe perchè hanno data diversa.


  • User

    @cali1981 said:

    Scusami, ma le righe devono essere uguali o simili? Perchè tu escludi le righe identiche, perchè usi tutti AND nella query. in teoria dovrebbe inserire la riga anche la prima volta, a meno che la stessa riga sia già dentro. Altrimenti, il codice fa bene a inserire tutte e 4 le righe perchè hanno data diversa.

    Grazie.

    Il criterio di esclusione è che la riga attuale letta dal file csv sia simile a quella precedente: se è così va esclusa dalla query di inserimento dati.

    Infatti alla prima lettura del file csv:

    • il primo IF controlla che non ci siano record-righe uguali già registrate nel db mysql;

    • il secondo IF mette a confronto i due CODICI PERSONALI, quello letto e quello della riga precedente del file csv e se sono diversi li registra nel db:

    'QUI CONTROLLO LE RIGHE SIMILI ED INSERISCO NEL DB MYSQL
    if objRS("CODICE_PERSONALE") <> strVariabile  then
     
    strSql = "INSERT INTO tabellaCSV ... " 
    cn.execute(strSql)
     
      strVariabile = objRS("CODICE_PERSONALE")
     
    end if
    

    Il problema è nel primo IF perchè in un' eventuale seconda lettura dello stesso file csv, non trova la riga esclusa in prima lettura e la inserisce nel db.

    Mi segui?


  • Super User

    Ok, allora il problema è che strVariabile = objRS("CODICE_PERSONALE")
    lo fa solo se la riga non è presente nel db, quindi lui la prima volta inseirsce la riga 1, strvariabile diventa uguale a quel codice e la seconda non la inserisce. La seconda volta invece strvaribile non lo valorizza perchè non entra nell'if. Giusto?


  • User

    @cali1981 said:

    Ok, allora il problema è che strVariabile = objRS("CODICE_PERSONALE")
    lo fa solo se la riga non è presente nel db, quindi lui la prima volta inseirsce la riga 1, strvariabile diventa uguale a quel codice e la seconda non la inserisce. La seconda volta invece strvaribile non lo valorizza perchè non entra nell'if. Giusto?

    Giustissimo.


  • User

    @cali1981 said:

    Ok, allora il problema è che strVariabile = objRS("CODICE_PERSONALE")
    lo fa solo se la riga non è presente nel db, quindi lui la prima volta inseirsce la riga 1, strvariabile diventa uguale a quel codice e la seconda non la inserisce. La seconda volta invece strvaribile non lo valorizza perchè non entra nell'if. Giusto?

    Scusa non ho capito se mi hai dato la soluzione al problema o hai chiesto semplicemente conferma del tuo ragionamento al riguardo...:dull:


  • Super User

    Beh questa è una cosa che non va bene, quindi devi trovare un altro modo per farlo. Ad esempio, strvariabile = arrText(7)


  • User

    @cali1981 said:

    Beh questa è una cosa che non va bene, quindi devi trovare un altro modo per farlo. Ad esempio, strvariabile = arrText(7)

    Scusa non ho capito. 😞


  • Super User

    Invece di fare:

    strVariabile = objRS("CODICE_PERSONALE")

    lo toglie e metti

    strvariabile = arrText(7)

    prima della riga con il commento:
    'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE


  • User

    @cali1981 said:

    Invece di fare:

    strVariabile = objRS("CODICE_PERSONALE")

    lo toglie e metti

    strvariabile = arrText(7)

    prima della riga con il commento:
    'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE

    Ho provato ma con questa modifica non inserisce più nulla nel db mysql. 😞
    Fatico a seguirti, sorry.


  • Super User

    No il resto è tutto uguale. In pratica, nel tuo script tu fai la query per vedere se il record c'è già, se non c'è lo inserisci e poi salvi il codice per controllarlo rispetto al successivo. Il problema è che se il record c'è già tu nn ti salvi il codice e perciò al secondo inserimento il record 2 lo inserisce! Invece facendo come ti ho detto io tu il codice lo salvi prima in ogni caso, quindi stavolta il record 2 non lo inserirà.


  • User

    Ho provato ma con questa modifica non inserisce più nulla nel db mysql. 😞


  • Super User

    Scrivi qui il nuovo codice


  • User

    Questo è il nuovo codice ASP:

     
    PercorsoCSV = "D:\Inetpub\wwwroot\CSV\file1.csv "
     
      Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
      strURL = percorsoCSV 
     
      Set objFile = objFSO.OpenTextFile(strURL)  
      objFile.SkipLine()  
     
      strVariabile = ""
      Do While Not objFile.AtEndOfStream
     
       strText = objFile.readLine   
       arrText = split(strText, ",", 17)
     
      strVariabile = arrText(7)
     
    'CONTROLLO NEL DB L'ESISTENZA DELLA RIGA UGUALE
    SQL = " SELECT * " 
    SQL = SQL & " FROM "  
    SQL = SQL & " tabellaCSV " 
    SQL = SQL & " WHERE "
    SQL = SQL & " NOME = '" & replace(arrText(0), """", "") & "' " 
    SQL = SQL & " AND "  
    SQL = SQL & " DATA = " & formatDBDate(replace(arrText(2), """", ""), "mysql") & " " 
    SQL = SQL & " AND "  
    SQL = SQL & " ORA = '" & replace(arrText(3), """", "") & "' "
    SQL = SQL & " AND " 
    SQL = SQL & " CODICE_PERSONALE = '" & replace(arrText(7), """", "") & "' "
    SQL = SQL & " AND " 
    SQL = SQL & " DESCRIZIONE = '" & replace(arrText(8), """", "") & "' "
    Set objRS = Server.CreateObject("ADODB.Recordset")
    objRS.open SQL, cn
     
    'APERTURA PRIMO IF E CONTROLLO SU objRS
    if objRS.eof then
     
    'QUI CONTROLLO LE RIGHE SIMILI ED INSERISCO NEL DB MYSQL
    if objRS("CODICE_PERSONALE") <> strVariabile  then
     
    strSql = "INSERT INTO tabellaCSV ... " 
    cn.execute(strSql)
     
     end if
     
    'ALTRIMENTI SU PRIMO IF     
    else
     
      response.write "record già presente!<br>"
     
    'CHIUSURA PRIMO IF
    end if
      Loop
     
      objRS.Close()
      Set objRS = Nothing 
     
      cn.Close()
      Set cn = nothing
     
    Set fsoMyFile = CreateObject("Scripting.FileSystemObject")
     
    if fsoMyFile.FileExists (PercorsoCSV) then
       fsoMyFile.DeleteFile PercorsoCSV
    end if
     
    Set fsoMyFile = Nothing 
    Set objFSO = Nothing
    
    

  • Super User

    giusto scusa, rimetti strvariabile come era all'inizio e aggiunge quella che ti ho detto ora, strVariabile = arrText(7) prima di response.write "record già presente!<br>" e dopo 'ALTRIMENTI SU PRIMO IF
    else


  • User

    @cali1981 said:

    giusto scusa, rimetti strvariabile come era all'inizio e aggiunge quella che ti ho detto ora, strVariabile = arrText(7) prima di response.write "record già presente!<br>" e dopo 'ALTRIMENTI SU PRIMO IF
    else

    Mitico, grande !!!
    Adesso si funziona!!!
    1000 grazie

    :ciauz:


  • Super User

    di niente!
    Ciao