problema con archivio dbf

Moderator: Enrico Maria Giordano

Post Reply
marzio
Posts: 129
Joined: Wed Apr 04, 2007 6:54 am

problema con archivio dbf

Post by marzio »

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
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: problema con archivio dbf

Post by Enrico Maria Giordano »

In che senso le righe non vengono eseguite? Fammi un esempio di come "esegui" le righe.

EMG
marzio
Posts: 129
Joined: Wed Apr 04, 2007 6:54 am

Post by marzio »

all'interno del campo memo ci sono istruzioni del tipo:
AggComm("GR02009", nVal * nCap, "1B")
una funzione che è nel mio eseguibile che aggiunge righe ad un'altro dbase, è in questo nuovo dbase che a volte mi mancano alcune righe.
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Post by Enrico Maria Giordano »

Purtroppo senza un microesempio del problema non è possibile aiutarti. Però mi sento di escludere che la causa sia nell'RDD (a meno che tu non stia utilizzando una versione preistorica di xHarbour).

EMG
marzio
Posts: 129
Joined: Wed Apr 04, 2007 6:54 am

Post by marzio »

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
Post Reply