+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: transazioni con ADO

  1. #1
    Monti non è in linea Scolaretto
    Luogo
    Lecce
    Post
    71

    transazioni con ADO

    buongiorno a tutti,
    problema con le TRANSAZIONI:

    modulo Fatture, click sul' NUOVA' button
    codice:
          if EmesseBox.ItemIndex = 5 then begin  //.....fattura libera
             NewFattComm := False;
             FattCommEmessa := False;
             NewFattCosti74t := False;
             NewFattCostiOrd := False;
             //
             with PmMasterData do begin
                FiltroBase := ADOCausaContab.Filter;
                ADOCausaContab.Filtered := False;
                PmMasterData.ADOCausaContab.Filter := FiltroBase +' and '+
                                         '[Tipo registro] ='+'1'+' and '+
                                         '[Numero registro] ='+''''+'01'+'''';
                ADOCausaContab.Filtered := True;
    
                ADOClienteMastroQry.Close;
                ADOFornitoriMastroQry.Close;
                ADOCliente.Open;
                ADOFornitori.Open;
                ADOCliente.IndexFieldNames := 'RagioneSociale';
                ADOFornitori.IndexFieldNames := 'RagioneSociale';
                ADOFornitori.Filtered := False;
                ADOFornitori.Filter := '';
                //
                ADORemConnection.beginTrans;
    
                ADOFattLibTesta.Insert;
                ADOFattLibTestaFILIALE.Value := RegPnConfigFILINUSE.Value;
                ADOFattLibTestaDATADOCUMENTO.Value := StrToDate(FORMATDateTime('dd/mm/yyyy', now));
                ADOFattLibTestaANNO.Value := FORMATdateTime('yyyy', ADOFattLibTestaDATADOCUMENTO.Value);
                if ADOAnagFil.Locate('Azienda', RegPnConfigFILINUSE.Value, []) then
                   ADOFattLibTestaBARRATO.Value := ADOAnagFilBARRATO.Value;
                ADOFattLibTesta.UpdateBatch(arAll);
                ADOFattLibTesta.Edit;
                //
                GenericClose(GenVend);
                GenVend.Open;
                GenVend.Insert;
                DBLookUpComboBox2.ListSource := PmMasterData.ADOCodIvaSrc;
                DBLookUpComboBox2.DataSource := PmMasterData.GenVendSrc;
                DBLookUpComboBox3.ListSource := QRYPcontiRicSrc;
             end;
             //
             VisualPanel.Visible := False;
             FattLibPanel.Visible := True;
             FattCommPanel.Visible := False;
             //
             MasterPanel.Enabled := False;
    
             Edit7.Visible := False;
             DBComboBox1.Visible := True;
             Edit8.Visible := False;
             DBLookUpComboBox3.Visible := True;
             NewFattLib := True;
             FattLibEmessa := False;
             InsVoiceBtn.Caption := 'Inserisci Voce';
             NewVoiceFattLib := True;
             SEmaforoFattLib;
             DBedit5.SetFocus;
          end;
    e faccio il primo 'UpdateBatch' perché il campo 'IDfattura' è un AUTOINC e funge da MAsterField
    alla tabella ADOFattLibCorpo con i righi della fattura,
    a questo punto entro nella maschera e aggiorno manualmente i campi contabili
    (codiceCliente, descrizione, etc.etc...)

    quindi creo i righi
    codice:
          with FattureForm do
          if NewVoiceFattLib then
             ADOFattLibCorpo.Insert
            else
             ADOFattLibCorpo.Edit;
    
          ADOFattLibCorpoIDFATTURA.Value := ADOFattLibTestaIDFATTURA.Value;
          ADOFattLibCorpoCPARTITA_RIGA.Value := GenVendTEXT01.Value;
          ADOFattLibCorpoDESCRIZIONERIGA.Value := GenVendTEXT02.Value;
          ADOFattLibCorpoCODICEIVA.Value := GenVendTEXT03.Value;
          ADOFattLibCorpoIMPORTO.Value := GenVendIMPORTO01.Value;
    
          ADOFattLibCorpo.UpdateBatch(arALl);
    
          CalcolaTotaliTesta(ADOFattLibTesta);
    ad uno ad uno e contemporaneamente lancio il calcolo dei totali
    che aggiorna ancora la tabella ADOFattLibTesta...

    il problema nasce quando lancio il comando 'EMETTI'
    codice:
          if not ForzaturaProtocollo then begin  //...aggiorna Contatore
             ADORegIva.Edit;
             ADORegIva['DATAULTIMOPROTOCOLLO'] := ADOFattLibTesta['DATADOCUMENTO'];
             ADORegIvaULTIMOPROTOCOLLO.Value := ADORegIvaULTIMOPROTOCOLLO.Value+1;
             ADORegIva.UpdateBatch(arAll);
          end;
    
          ADOFattLibTestaANNO.Value := FORMATdateTime('yyyy', ADOFattLibTestaDATADOCUMENTO.Value);
          ADOFattLibTesta.UpdateBatch(arAll);
    
          ADORemConnection.CommitTrans;
    dove il comando CommitTrans 'fallisce' col messaggio che '...il valori del record sono cambiati dall'ultima lettura...'

    dove sbaglio ??

  2. #2
    Monti non è in linea Scolaretto
    Luogo
    Lecce
    Post
    71
    o meglio...
    si possono fare più 'Updatebatch' sulla stessa tabella prima del 'CommitTrans' ?

  3. #3
    Monti non è in linea Scolaretto
    Luogo
    Lecce
    Post
    71

    isolato il problema

    .....credo di aver scovato il problema !
    semplicemente 'pasticciavo' con le transazioni annidate...
    e con la sequenza di aggiornamento della varie tabelle.

    A questo proposito,
    mentre con l'evento
    codice:
    procedure TPmMasterData.ADORemConnectionBeginTransComplete(
      Connection: TADOConnection; TransactionLevel: Integer;
      const Error: Error; var EventStatus: TEventStatus);
    begin
       Form1.Label1.caption := IntToStr(TransactionLevel);
    end;
    la variabile 'transactionLevel' mi restituisce il numero preciso di transazioni
    aperte in quel momento

    Come rilevo la stessa informazione in un punto qualsiasi del codice ?
    so che c'è una proprietà specifica, ma la memoria non mi aiuta.

  4. #4
    L'avatar di sspintux
    sspintux non è in linea Very Important Person Ultimo blog: SqlServer AlwaysOn ed account di accesso
    Luogo
    Lazio
    Post
    1,570
    Blogs
    18
    ... errata indicazione
    Ultima modifica di sspintux; 11-03-2018 11:26  Motivo: errata indicazione
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  5. #5
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,764
    Blogs
    5
    Scusa sspintux ... quello non è l' IsolationLevel ?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  6. #6
    L'avatar di sspintux
    sspintux non è in linea Very Important Person Ultimo blog: SqlServer AlwaysOn ed account di accesso
    Luogo
    Lazio
    Post
    1,570
    Blogs
    18
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Scusa sspintux ... quello non è l' IsolationLevel ?
    Si,
    infatti ho cancellato il messsaggio
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  7. #7
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    15,764
    Blogs
    5
    Non c'era bisogno di cancellarlo ... bastava aggiungere una correzione alla fine ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  8. #8
    Monti non è in linea Scolaretto
    Luogo
    Lecce
    Post
    71
    Scusate...
    Che mi sono perso ?

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi