problema con archivio dbf

Moderator: Enrico Maria Giordano

problema con archivio dbf

Postby marzio » Fri Nov 09, 2007 11:12 am

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
marzio
 
Posts: 129
Joined: Wed Apr 04, 2007 6:54 am

Re: problema con archivio dbf

Postby Enrico Maria Giordano » Fri Nov 09, 2007 11:15 am

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

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8715
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Postby marzio » Mon Nov 12, 2007 7:44 am

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.
marzio
 
Posts: 129
Joined: Wed Apr 04, 2007 6:54 am

Postby Enrico Maria Giordano » Mon Nov 12, 2007 9:34 am

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

Postby marzio » Tue Nov 13, 2007 8:46 am

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
marzio
 
Posts: 129
Joined: Wed Apr 04, 2007 6:54 am


Return to All products support

Who is online

Users browsing this forum: No registered users and 30 guests