salve a tutti,
ho un archivio dbf di circa 300 righe, tra i vari campi ci sono alcuni campi memo che contengono istruzioni fivewin / xharbour che vengono eseguite da una apposita funzione.
questo archivio è indicizzato su un campo numerico che da una priorità di esecuzione, in uso ho anche la classe tOdbc con select che leggono altri archivi.
il problema è che a volte alcune righe del file dbf non vengono eseguite, mentre magari ripetendo l'esecuzione le vengono eseguite tutte.
penso che se fosse un errore di programmazione si ripeterebbe ogni volta, forse è un problema di memoria.
uso i driver standard dbfntx, dbfdbt, potrebbe essere il caso di cambiare la gestione degli indici e dei campi memo?
quale driver rdd mi conviene provare? dbfcdx?
grazie, marzio
problema con archivio dbf
Moderator: Enrico Maria Giordano
- Enrico Maria Giordano
- Posts: 7355
- Joined: Thu Oct 06, 2005 8:17 pm
- Location: Roma - Italia
- Contact:
Re: problema con archivio dbf
In che senso le righe non vengono eseguite? Fammi un esempio di come "esegui" le righe.
EMG
EMG
- Enrico Maria Giordano
- Posts: 7355
- Joined: Thu Oct 06, 2005 8:17 pm
- Location: Roma - Italia
- Contact:
fivewin 7.1 con xHarbour 0.99.71
non volevo stressarti con le ricerca di un possiblile errore, inserirò ulteriori punti di controllo con salvataggio dati in un file log poi magari più avanti ci risentiamo.
il mio dubbio è dato dal fatto che partendo da comtmp vuoto e ripetendo più volte la stessa procedura non ottengo sempre lo stesso risultato.
come ti dicevo Aggcomm() è la funzione chiamata dai campi memo, di circa 300 righe di codice, con diverse select odbc di controllo, che chiama in diversi punti la funzione qui sotto che aggiunge righe al file comtmp dove io ho il risultato finale.
DbSelectArea("ComTmp")
DbGoBottom()
WHILE aComTes[1] == comtmp->idcomtes .AND. !Bof() // controllo se esiste su tutto il file, stesso numero commessa.
IF comtmp->idartico = oArtico:id .AND. cGruppo = __gruppi__ .AND. (cSttGrp = NIL .OR. (cSttGrp # NIL .AND. cSttGrp = __sttgrp__))
lExist := .t.
EXIT
ENDIF
DbSkip(-1)
END
IF lExist // componente già aggiunto da prec. calcolo.
IF RecLock(1, "comtmp")
comtmp->__qtaord__ += nQuantPri
comtmp->qta1 := comtmp->__qtaord__ + (comtmp->__qtaord__ * nQtaPlus / 100)
DbUnLock()
ELSE
DbSetOrder(nOrdine)
Return(lExist)
ENDIF
ELSE
comtmp->(DbAppend())
comtmp->__gruppi__ := cGruppo
comtmp->__qtaord__ := nQuantPri
comtmp->__codart__ := If(oArtico:codice = NIL, "", oArtico:codice)
comtmp->__idarti__ := If(oArtico:id = NIL, 0, oArtico:id)
comtmp->__idlots__ := IdArt2IdLot(comtmp->__idarti__)
oSelect := oOdbc:Query( "SELECT CAST(prezzo * 10000.0 AS BigInt) / 10000.0 AS prezzo, " +;
"idlistes FROM lisrig WHERE idlistes = " + cValToChar(aComTes[7]) +;
"AND idartico = " + cValToChar(comtmp->__idlots__) ); oSelect:Open()
IF oSelect:RecCount() = 0
cText := LoadValue(1180, CH) + AllTrim(oArtico:codice) + " (" +; // "Manca articolo in riga di listino (LisRig): "
cValToChar(aComTes[8]) + " " + dToc(cTod(DT_1899) + aComTes[9]) + " " + dToc(cTod(DT_1899) + aComTes[10]) + ")" + CRLF
ENDIF
comtmp->prezzo := oSelect:prezzo
comtmp->idlistes:= oSelect:idlistes
oSelect:End(); DbSelectArea("ComTmp")
comtmp->idcomtes:= aComTes[1]
comtmp->idartico:= comtmp->__idarti__
comtmp->idiva := aComTes[5]
comtmp->qta1 := nQuantPri + (nQuantPri * nQtaPlus / 100)
comtmp->oripre := If(oArtico:oripre = NIL, "", oArtico:oripre)
ENDIF
non volevo stressarti con le ricerca di un possiblile errore, inserirò ulteriori punti di controllo con salvataggio dati in un file log poi magari più avanti ci risentiamo.
il mio dubbio è dato dal fatto che partendo da comtmp vuoto e ripetendo più volte la stessa procedura non ottengo sempre lo stesso risultato.
come ti dicevo Aggcomm() è la funzione chiamata dai campi memo, di circa 300 righe di codice, con diverse select odbc di controllo, che chiama in diversi punti la funzione qui sotto che aggiunge righe al file comtmp dove io ho il risultato finale.
DbSelectArea("ComTmp")
DbGoBottom()
WHILE aComTes[1] == comtmp->idcomtes .AND. !Bof() // controllo se esiste su tutto il file, stesso numero commessa.
IF comtmp->idartico = oArtico:id .AND. cGruppo = __gruppi__ .AND. (cSttGrp = NIL .OR. (cSttGrp # NIL .AND. cSttGrp = __sttgrp__))
lExist := .t.
EXIT
ENDIF
DbSkip(-1)
END
IF lExist // componente già aggiunto da prec. calcolo.
IF RecLock(1, "comtmp")
comtmp->__qtaord__ += nQuantPri
comtmp->qta1 := comtmp->__qtaord__ + (comtmp->__qtaord__ * nQtaPlus / 100)
DbUnLock()
ELSE
DbSetOrder(nOrdine)
Return(lExist)
ENDIF
ELSE
comtmp->(DbAppend())
comtmp->__gruppi__ := cGruppo
comtmp->__qtaord__ := nQuantPri
comtmp->__codart__ := If(oArtico:codice = NIL, "", oArtico:codice)
comtmp->__idarti__ := If(oArtico:id = NIL, 0, oArtico:id)
comtmp->__idlots__ := IdArt2IdLot(comtmp->__idarti__)
oSelect := oOdbc:Query( "SELECT CAST(prezzo * 10000.0 AS BigInt) / 10000.0 AS prezzo, " +;
"idlistes FROM lisrig WHERE idlistes = " + cValToChar(aComTes[7]) +;
"AND idartico = " + cValToChar(comtmp->__idlots__) ); oSelect:Open()
IF oSelect:RecCount() = 0
cText := LoadValue(1180, CH) + AllTrim(oArtico:codice) + " (" +; // "Manca articolo in riga di listino (LisRig): "
cValToChar(aComTes[8]) + " " + dToc(cTod(DT_1899) + aComTes[9]) + " " + dToc(cTod(DT_1899) + aComTes[10]) + ")" + CRLF
ENDIF
comtmp->prezzo := oSelect:prezzo
comtmp->idlistes:= oSelect:idlistes
oSelect:End(); DbSelectArea("ComTmp")
comtmp->idcomtes:= aComTes[1]
comtmp->idartico:= comtmp->__idarti__
comtmp->idiva := aComTes[5]
comtmp->qta1 := nQuantPri + (nQuantPri * nQtaPlus / 100)
comtmp->oripre := If(oArtico:oripre = NIL, "", oArtico:oripre)
ENDIF