Newsgroup: it.comp.lang.vo-clipper
Titolo: Windows 7 e ODBC (MySQL)

Cari amici... ogni tanto mi faccio sentire. Scusatemi se per un p� sono
stato latitante ma il lavoro mi assorbe tutto il tempo necessario per fare
altre cose (come ad es. andare avanti con Vulcan)  pazienza ! verranno
tempi migliori.
Detto questo , passo subito al mio problema che penso sia un problema
anche di altri che usano VO 28 MySQL e Report pro.
Nelle applicazioni che noi usiamo in Accademia, viene usato Report Pro per
le stampe. Come vi � noto esso usa Driver ODBC per la connesisone alle
basi di dati SQL (e non). Nelle nostre applicazioni stiamo usando una
comodissima funzione "SettaODBC" ideata dal mitico Danilo che
scrive/riscrive nel registry di Windows il DSN ODBC relativo alla
connessione. Questo ci serve perch� quando l'applicazione cerca dei dati
nei DB degli anni precedenti, tramite questa funzione � possibile cambiare
il nome del DB MySQL restando invariate tutte le altre caratteristiche
(nome DSN, indirizzo IP ecc...) 
Per scrivere nel registry, per�, bisogna che l'utente abbia
l'autorizzazione necessaria. 
Con Windows XP bastava che esso fosse Administrator e tutto si risolveva,
con Windows 7 evidentemente non basta pi� !!! Poi c'� il fatto che gli
amministratori della rete MARINA a ROMA non vogliono assolutamente (per
evidenti questioni di sicurezza) che gli utenti della rete siano
amministratori dei PC, quindi bisogna trovare un profilo utente oppure un
espediente per scrivere nel registry di Windows.  
Qualcuno ci pu� aiutare ?
Grazie ragazzi ... attendiamo con ansia
Enio Donci  
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it




Enio, perch� non usi un approccio diverso, come ti ho consigliato da 
moltissimo tempo?
Esporta i dati in DBF e poi costruisci il report con i dbf e mandi a 
"fanbicchiere" gli odbc?
Una cosa in meno da installare.
I files DBF di stampa vengono per default costruiti nella cartella temp 
dell'utente collegato al PC (vedi WorkUserDir() ), per cui nessun problema, 
l� pu� scrivere, leggere, cancellare senza limiti.
Danilo
FUNCTION Export2Dbf(cQuery,cNome)
// cQuery: la query fonte dei dati da stampare:
// es:
// cQuery := [SELECT * FROM ana_fat,fatture ]+;
//			[LEFT JOIN clienti ON fatture.cliente = clienti.codice ]+;
//			[LEFT JOIN banche  ON fatture.banca = banche.row_id ]+;
//			[WHERE ana_fat.num_fat="]+SELF:oDCNUM_FAT:Value+["]+;
//			[ and ana_fat.num_fat = fatture.num_fat]
//
// cNome il nome del file DBF in cui esportare i dati. Per default 
Stampa.DBF
LOCAL oServer AS MySqlTable
LOCAL n,i AS DWORD
LOCAL aStruct AS ARRAY
LOCAL cFildName AS STRING
LOCAL nVal AS DWORD
LOCAL nRec AS DWORD
IF IsNil(cNome)
	cNome := WorkUserDir()+"stampa"
ELSE
	cNome := WorkUserDir()+cNome
ENDIF
IF File(cNome+".DBF")
	nVal := 0
	DO WHILE !CanOpen(cNome+".DBF")
		Sleep(2000)
		++nVal
		IF nVal > 60
			RETURN FALSE
		ENDIF
	ENDDO
ENDIF
IF File(cNome+".DBF") .AND. !DeleteFile(String2Psz(cNome+".DBF"))
	DBCLOSEALL()
	IF !DeleteFile(String2Psz(cNome+".DBF"))
		Mostra("Attenzione non � stato possibile aggiornare i dati di 
stampa;"+CRLF+;
				"Chiudi tutte le applicazioni prima di riavviare il 
programma.",cNome+".DBF")
	ENDIF
	RETURN FALSE
ENDIFDeleteFile(String2Psz(cNome+".FPT"))
IF IsString(cQuery)
	oServer := MySqlSelect{cQuery}
ELSEIF IsObject(cQuery)
	oServer := cQuery
	nRec := oServer:RecNo
	oServer:GoTop()
ENDIF
IF oServer:Used
	aStruct := oServer:DBStruct
	FOR n := 1 UPTO ALen(aStruct)
		IF SLen(aStruct[n,1]) > 12
			cFildName := Left(aStruct[n,1],12)
			i := 0
			DO WHILE aMscan(aStruct,cFildName) > 0
				cFildName := Left(cFildName,11)+NTrim(i)
				++i
			ENDDO
			AFill(aStruct[n],cFildName,1,1)
		ENDIF
		IF aStruct[n,2]	= "O"
			AFill(aStruct[n],"M",2,1)
		ENDIF
	NEXT
	DBCREATE(cNome,aStruct,"DBFCDX")
	IF DBUSEAREA(FALSE,"DBFCDX",cNome)
		DO WHILE !oServer:EOF
			DBAPPEND()
			FOR n := 1 UPTO oServer:FCount
				FIELDPUT(n,oServer:FIELDGET(n))
			NEXT			oServer:Skip(1)
		ENDDO
		IF RECCOUNT() = 0
			DBAPPEND()
		ENDIF
	ENDIF
	DBCLOSEAREA()
	IF IsString(cQuery)
		oServer:Close()
	ELSE
		oServer:GoTo(nRec)
	ENDIF
ENDIF
RETURN TRUE
FUNCTION CanOpen(cFile AS STRING) AS LOGIC
LOCAL  siHandle AS PTR
LOCAL  lRet := FALSE AS LOGIC
siHandle := FOpen(cFile,FO_EXCLUSIVE)
IF !(siHandle == F_ERROR)
	lRet := TRUE
	FClose(siHandle)
ENDIF
RETURN lRet
FUNCtion WorkUserDir() as string
local cPath as string
cPath := TempDirectory()+SQLConn():cUser+"\"
DirMake(String2Psz(cPath))
return cPath
FUNCTION TempDirectory AS STRING
LOCAL pszBuffer AS PSZ
LOCAL cWinDir AS STRING
pszBuffer := MemAlloc( 128 )
GetTempPath(128,pszBuffer)
cWinDir := Psz2String(pszBuffer)
MemFree( pszBuffer )
RETURN cWinDir
_DLL FUNC GetTempPath(nBufferLength AS DWORD, lpBuffer AS PSZ);
	AS DWORD PASCAL:KERNEL32.GetTempPathA