Newsgroup: it.comp.lang.vo-clipper
Titolo: INDICI DANNEGGIATI DOPO RICOSTRUZIONE

Grazie mille per le risposte alla domanda di ieri.
Mi trovo ad avere questo problema. Dopo diversi anni che l'applicativo
Clipper gira in ambiente Novell senza problemi, da quest'anno hanno
cominciato a presentarsi abbastanza frequentemente problemi di indici
danneggiati subito dopo la loro ricostruzione.
La prima cosa che viene da chiedersi è: "cosa è cambiato ?".
Quello che sono riuscito a sapere è che hanno fatto degli aggiornamenti
sul sistema di rete Novell (i client sono Windows 95/98).
Purtroppo la ricostruzione dell'indice termina apparentemente bene senza
messaggi di errore, e te ne accorgi solo quando vai ad usarlo perchè il
programma che lo usa dà dei risultati strani.
Dalle ricerche fatte in questi giorni ho ricevuto tre ipotesi di causa:
1) La lentezza dei client (sono molto lenti)
2) L'utilizzo non corretto della memoria estesa sul client durante le
elaborazioni (il mio eseguibile è compilato con rtlink 5.2)
3) Le permission non corrette sulle directory che il server Novell usa
per i file temporanei e per lo swap.
Che valutazioni si possono fare ??
Grazie.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 per i file temporanei e per lo swap.
ma l'applicazione e strutturata come client-server oppure e' la solita
applicazione che gestische i records con lo schema di lock-unlock?
Credo che sia il secondo caso e quindi la lentezza e' una costante alla
quale non ti puoi sottrarre. In questo caso la creazione dell'indice e'
preferibile farla direttamente nel server quando le macchine client sono
inattive e il client sono scollegati.

 La prima cosa che viene da chiedersi è: "cosa è cambiato ?".
Potrebbe benissimo non essere cambiato niente nell'ambiente ma solo nel
numero di record indicizzati. Potresti, infatti, essere incappato in uno
di quei maledetti "magic number bug" che si manifestano solo se, ad
esempio, un indice contiene un numero di record che va da tot a tot. Se
hai la possibilità, prova con un altro RDD. Se usi Clipper 5.2e ti
consiglio caldamente il Comix.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 ha scritto nel
messaggio news:3D2C04ED...@emagsoftware.it...


 3) Le permission non corrette sulle directory che il server Novell usa
dai il comando RIGHTS dalla dir in cui ci sono i files dbf e fpt =?
Prova a creare un indice sul server, uno in locale (della stess tabella) e
fai un FC file1.cdx e file2.cdx
Cosa ti segnala?
Mi tagli e incolli il pezzo di codice in cui ci sono le istruzioni per la
creazione dell'indice per favore
Se mi scrivi tutte queste indicazioni per favore e poi ne discutiamo?
Ciao

 qualche domanda?
certo, mi sto attivando per recuperare le informazioni che hai chiesto.
chiedo scusa per la mia ignoranza non so cosa sono gli RDD.


 chiedo scusa per la mia ignoranza non so cosa sono gli RDD.
Più semplicemente, quali indici usi? Gli NTX, i CDX? Un RDD (Replaceable
Database Driver) è una libreria che ti consente di gestire gli indici
(DBFNTX.LIB per gli NTX, DBFCDX.LIB per i CDX e così via).


 EMG
             Grazie.


 creazione dell'indice per favore
....
....
PIANI910(.F.,.T.)
....
.....
FUNCTION PIANI910(lControllo,lPianifica)
//------------------------------------------------------------------------------
USE &xpiani\DBF\DBF_NTX ALIAS DBFNTX READONLY SHARED NEW
IF TEST_FILE("DBF_NTX");RETURN .F.;ENDIF
SET INDEX TO &xpiani\DBF\DBF_NTX
//------------------------------------------------------------------------------
GO TOP
IF lPianifica
  RigAll(lControllo,lPianifica,.T.)
ELSE
....
.....
....
FUNCTION RigAll(lControllo,lPianifica,lAll,lPack)
LOCAL nTotRec,nElabRec,cBar,nPercOld:=0
PRIVATE nNumArc:=1
PRIVATE nVolte:=0
PRIVATE cNomeDBF
PRIVATE cNomeNTX
PRIVATE cDirDBF
PRIVATE cDirNTX
PRIVATE cOldName
PRIVATE cKey
PRIVATE cDbf
nIndex:=NIL
IF lPack==NIL
  lPack:=.F.
ENDIF
IF lControllo
  IF !INDEXFREE()
    RETURN NIL
  ENDIF
ENDIF
sIndex:=SAVESCREEN(0,0,24,79)
MASCHERA("Rigenerazione Indici","Avanzamento:")
SCRIVI(4,2,"Nome Archivio                      Indice
Avanzamento","N/W")
//
012345678901234567890123456789012345678901234567890123456789012345678901234567890
//                  1         2         3         4         5         6
7         8
MESSAGGIO("Rigenerazione Indici *.NTX ...")
nTotRec:=LASTREC()
IF nTotRec<1
  nTotRec:=1
ENDIF
nElabRec:=0
SCRIVI(2,30,"[                               ]","B/W")
//           012345678901234567890123456789012345678901234567890
//           3         4         5         6         7         8
SET CONSOLE OFF
SET PRINTER TO C:\REINDEX.TXT
SET PRINTER ON
SET DEVI TO PRINT
IF lPack
  @ PROW()+1,0 SAY "PROCEDURA RIGENERAZIONE INDICI: "+DTOC(Date())
ENDIF
GO TOP
cOldName:=" "
DO WHILE !EOF()
  lMakePack:=.F.
  cNomeDBF:=DBFNTX->nomedbf
  cDirDBF:=DBFNTX->dirdbf
  IF
(lAll.OR.(!lAll.AND.UPPER(ALLTRIM(cNomeDBF))==UPPER(ALLTRIM(aDBFNTX[nChoice,1])).AND.UPPER(ALLTRIM(cDirDBF))==UPPER(ALLTRIM(aDBFNTX[nChoice,2]))))
    cDir2:=ALLTRIM(cDirDBF)
    cDbf:=&cDir2+"\"+UPPER(ALLTRIM(cNomeDBF))
    IF nNumArc-nVolte>17
      MESSAGGIO("Premere un Tasto per Proseguire...")
      IF lControllo
        INKEY(60)
      ENDIF
      @ 5,1 CLEAR TO 21,78
      nVolte:=nNumArc-1
      MESSAGGIO("Rigenerazione Indici *.NTX ...")
      SCRIVI(4+nNumArc-nVolte,2,cDbf+".DBF","B/W")
    ENDIF
    IF (!lPianifica.OR.(lPianifica.AND.DBFNTX->pianifica))
      IF cOldName!=cDbf
        SCRIVI(4+nNumArc-nVolte,2,cDbf+".DBF","B/W")
        MESSAGGIO("Creazione Archivio di Backup ...")
        DELETE FILE &xlav\BACKUP.DBF
        COPY FILE &cDbf..DBF TO &xlav\BACKUP.DBF
        cOldName:=cDbf
        lMakePack:=.T.
        IF lPack
          @ PROW()+2,0 SAY Time()+" - Apertura Archivio: "+cDbf
        ENDIF
      ENDIF
      SCRIVI(4+nNumArc-nVolte,37,DBFNTX->nomentx,"B/W")
      IF FILE(cDbf+".DBF")
        cDirNTX:=ALLTRIM(DBFNTX->dirntx)
        cNomeNTX:=&cDirNTX+"\"+ALLTRIM(DBFNTX->nomentx)
        cKey:=ALLTRIM(DBFNTX->keyntx)
        MESSAGGIO("Apertura Archivio ...")
        IF DBFNTX->nomedbfrel!=Space(8)
          cDbfRel:=Upper(AllTrim(DBFNTX->nomedbfrel))
          cDirDRel:=AllTrim(DBFNTX->dirdbfrel)
          cDbfRel:=&cDirDRel+"\"+cDbfRel
          cNtxRel:=Upper(AllTrim(DBFNTX->nomentxrel))
          cDirNRel:=AllTrim(DBFNTX->dirntxrel)
          cNtxRel:=&cDirNRel+"\"+cNtxRel
          cAliasRel:=AllTrim(DBFNTX->aliasrel)
          cRelation:=AllTrim(DBFNTX->relation)
          USE &cDbfRel ALIAS &cAliasRel READONLY SHARED NEW
          SET INDEX TO &cNtxRel
        ENDIF
        USE &cDbf ALIAS DBF EXCLUSIVE NEW
        IF NetErr()
          //ERRORE
          IF lPack
            @ PROW()+1,0 SAY Time()+" - Impossibile Aprire l'Archivio:
"+cDbf
          ELSE
            ERR_MSG(10,20,15,60,"Impossibile Aprire l'Archivio: ",cDbf)
          ENDIF
        ELSE
          IF lPack.AND.lMakePack.AND.DBFNTX->pack
            MESSAGGIO("Compattazione Archivio ...")
            @ PROW()+1,0 SAY Time()+" - Compattazione Archivio: "+cDbf
            PACK
            @ PROW(),PCol() SAY " - "+Time()
          ENDIF
          nPercOld:=AvIndici(100 * ++nElabRec / nTotRec,nPercOld)
SCRIVI(4+nNumArc-nVolte,46,"[鞍鞍鞍鞍鞍北北北北北膊膊膊膊膊]","B+/W")
          //
67890123456789012345678901234567890123456789012
          //                         4   5      6         7
          MESSAGGIO("Generazione Indice ...")
          IF lPack
            @ PROW()+1,0 SAY Time()+" - Generazione Indice: "+cNomeNTX
          ENDIF
          IF DBFNTX->nomedbfrel!=Space(8)
            SET RELATION TO &cRelation INTO &cAliasRel
          ENDIF
          INDEX ON &cKey TO &cNomeNTX EVAL Meter3(4+nNumArc-nVolte)
          SCRIVI(4+nNumArc-nVolte,47,"哪哪哪哪哪哪  OK
 哪哪哪哪哪哪","G/W")
          IF lPack
            @ PROW(),PCol() SAY " - "+Time()
          ENDIF
          CLOSE DBF
          IF DBFNTX->nomedbfrel!=Space(8)
            CLOSE &cAliasRel
          ENDIF
        ENDIF
      ELSE
        ERR_MSG(10,20,15,60,"BISOGNA FARE LA RIGENERAZIONE ARCHIVI","")
        EXIT
      ENDIF
      nNumArc++
    ENDIF
  ENDIF
  SELECT("DBFNTX")
  SKIP
ENDDO
MESSAGGIO("Premere un Tasto per Terminare...")
IF lControllo
  INKEY(0)
ENDIF
if lall
  xPianific:=xPlanom:=xOrprod:="N"
endif
SAVE ALL LIKE x* TO &xlav\&cwwdrive
FCLOSE(nIndex)
RESTSCREEN(0,0,24,79,sIndex)
IF lPack
  @PROW()+2,0 SAY "PROCEDURA TERMINATA CORRETTAMENTE - "+Time()
ENDIF
DELETE FILE &xlav\BACKUP.DBF
SET PRINTER TO
SET PRINTER TO "LPT"+xLptPrn
SET PRINTER OFF
SET CONSOLE ON
SET DEVI TO SCREEN
RETURN NIL


 Controlla con load monitor.nlm File Open/Lock Activity
Penso che dal codice sorgente puoi vedere che lo apro in esclusivo.
Se non č cosě potresti darmi maggiori ragguagli o riferimenti per come
devo fare a utilizzare load monitor.nlm ?


Versione Server Netware=
Versione Client (winxx) =
Versione Intranetware Client=
Novel Client Properties, Advanced Settings=
Memoria libera=
SET CLIPPER=
Versione clipper=Clipper (R) 5.2e
Versione Linker=.RTLink for Clipper  Dynamic Overlay Linker / Pre-Linker
                 Version 3.14B
RDD usati=.NTX
Gli altri parametri li ho richiesti perchè il sistema Novell su cui gira
l'applicativo è in una filiale a cui non posso accedere direttamente
e la persona che mi può rispondere attualmente è assente per motivi 
personali.
Io sviluppo su un client WIN98 all'interno di una rete NT.


> Sono sempre lenti o sono lenti solo dopo la ricostruzione degli indici?
Per farti un esempio un programma di utilità che ho costruito per
analizzare la situazione, da me(client win98 in rete NT) dura 1 o 2
minuti (file di 200.000 record), da loro dura 2 ore e mezzo(client
win98 in rete Novell).


 Cosa ti segnala?
Questa richiesta l'ho girata al referente della filiale dove c'è la rete
Novell su cui gira l'applicatico Clipper.
Appena la ricevo te la giro.


 programma che lo usa dà dei risultati strani.
Mi sembra di ricordare che per utilizzare correttamente Windows 9x con reti
Novell occorre installare il Client di novell per windows 9x altrimenti il
minimo che possa accadere è il non corretto funzionamento dei DBF.
A volte però occorre installare delle Patch di Novell anche nel server se
non Upgradare a Novell 3.12 o superiore.
Nella nostra realta' aziendale ci siamo scontrati ormai con tutte le
combinazioni di Client e Server possibili e i problemi si risolvono solo
allineando le versioni del Client a quelle del Server.
Ciao,
       Fabrizio Malaguti
P.S.
     Per non avere problemi le combinazioni migliori di Client e Server
sono:
     Windows NT 4  e superiori lato Client e Novell o Windows NT server
(client e server allineati). Per tutte le altre combinazioni auguri.


 devo fare a utilizzare load monitor.nlm ?
LOAD MONITOR
Connection information
selezionare l'utente
analizzare i files aperti dall'utente in quel preciso momento
Controlla se ci sono files temporanei che vengono creati e controlla
soprattutto
Kilobytes Read
Kilobytes Written
durante l'indicizzazione
La percentuale di Cpu% del server si alza molto?

 ha scritto nel messaggio
news:a1c9f872fce1160542f...@mygate.mailgate.org...


 win98 in rete Novell).
e' molto strano allora e il clipper non c'entra niente
La configurazione (Server+cablaggio+client) non è delle migliori.
Dove sarà il collo di bottiglia?
Puoi fare un COPY di un file di circa 5 Mb da un disco locale ad un volume
Novell e viceversa?
(da me ci mette < 1 secondo nei due sensi)


Aspettiamo allora, nel pomeriggio non ci sono, a domani.
Dammi anche gli altri dati relativi a CPU server, schede e cablaggio.


 Clipper gira in ambiente Novell senza problemi,
..................................
Sembra che il problema si manifesti con gli indici più grandi (oltre 200.000
record nel DBF).
Non mi sembrano molti 200.000 record, però il problema attanaglia questi
DBF.
Non ho ancora tutte le risposte definitive, però sembra che ricostruendo gli
indici senza la EVAL  i programmi funzionano bene.
Senza la EVAL la dimensione dell'indice si dimezza quasi, mi chiedo perchè
succede questo ridimensionamento dell'indice.
La EVAL la usavamo per "passare la palla" ad una nostra funzione che
visualizzava  con una barra di avanzamento a che punto era la ricostruzione.
Gli indici sono NTX.

 succede questo ridimensionamento dell'indice.
E' un bug degli NTX. Forse se passassi a Comix risolveresti tutti i tuoi
problemi.



Tecnicamente cosa devo fare per passare a Comix ?

INDEX ON &cKey TO &cNomeNTX EVAL Meter3(4+nNumArc-nVolte)
Non so darti indicazioni sul motivo degli indici danneggiati, ma mi ha
colpito l'uso intensivo dell'operatore di macro &.
Se usi Clipper 5.2e (dei precedenti non mi ricordo...) è sufficiente
scrivere:
INDEX ON ( cKey ) TO ( cNomeNTX ) EVAL Meter3(4+nNumArc-nVolte)
racchiudendo tra parentesi una variabile, passi il contenuto della
variabile...
ricordo che questa dovrebbe essere una sintassi preferibile e,
probabilmente, più efficiente.
ciao

INDEX ON &cKey TO &cNomeNTX EVAL Meter3(4+nNumArc-nVolte)
Non so darti indicazioni sul motivo degli indici danneggiati, ma mi ha


 Tecnicamente cosa devo fare per passare a Comix ?
Acquistare la libreria, linkarla al tuo eseguibile e ricostruire gli
indici. Questo è il minimo. Il massimo dipende molto da come hai scritto
il programma. Se non hai fatto cose strane dovrebbe bastare.
