FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index All products support problema con archivio dbf
Posts: 193
Joined: Wed Apr 04, 2007 06:54 AM
problema con archivio dbf
Posted: 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

Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: problema con archivio dbf
Posted: Fri Nov 09, 2007 11:15 AM

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

EMG

Posts: 193
Joined: Wed Apr 04, 2007 06:54 AM
problema con archivio dbf
Posted: Mon Nov 12, 2007 07: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.

Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
problema con archivio dbf
Posted: Mon Nov 12, 2007 09: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

Posts: 193
Joined: Wed Apr 04, 2007 06:54 AM
problema con archivio dbf
Posted: Tue Nov 13, 2007 08: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

Continue the discussion