kiratme
Messages postés5Date d'inscriptionsamedi 8 avril 2006StatutMembreDernière intervention28 août 2006
-
19 août 2006 à 16:31
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 2013
-
26 oct. 2006 à 09:10
Bonjour TOUT le monde
j'ai une tres grosse BD ( 2.000.000 records) et je l'ai repassé (importer dans un serveur sql server)
ceci m'a resolu pas mal de problemes
mais voila j'ai un problermr technique j'aimerai acceder a des tables
et les parcourir (pour des maj ) genre :
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 27 août 2006 à 15:19
Quelle technique veux-tu utilser ? les vues ou bien SQL Pass-through?
Pour les vues, il te faut créer un database. Dans ce database, tu ne crées pas de table, mais une connexion à ton serveur SQL (l'assistant va très bien pour ça dans un premier temps). Ensuite (toujours avec l'assistant), tu crées dans ce database tes vues sur les tables de ta base de donnée SQL. Ces vues "contiennent" la requète SQL (le query), et portent un nom que tu vas utiliser exactement comme si c'était une table :
use mon_dbc!ma_vue alias toto in 0
select toto
scan
...<tout ce que tu veux>...
endscan
par sécurité (par exemple si tu utilises une identification user dans SQL, et que tu ne veux pas stocker de pw dans ton dbc fox), tu peux utilser une autre connexion que celle qui est définie dans ton dbc avec USE ma_vue CONNSTRING...
Avec SQL Pass-through, les choses sont une peu plus compliquées à écrire, parce que tu vas stocker ta requète dans une chaine de caractère, que tu vas "passer" à ton serveur SQL par la commande SQLEXEC ; ton serveur SQL va exécuter cette requète et te retourne le résultat dans un curseur dont le nom est le 3ème paramètre de la commande SQLEXEC. Tu fais ce que tu veux ensuite sur ce curseur..
Quelques exemples tirés de l'aide deVFP9:
******************
CLEAR
LOCAL lnConn
LOCAL lnPercent AS Int && Input parameters must be typed.
LOCAL lnOutput
lnPercent = 50
lnOutput = 0
* Make connection, assuming a local trusted connection.
lnConn = SQLCONNECT('local')
IF m.lnConn > 0 && Success.
* Set the active database to PUBS.
SQLEXEC(m.lnConn, 'use pubs')
* Execute INSERT statement, get value of identity field.
SQLEXEC(m.lnConn, "INSERT INTO JOBS (job_desc, min_lvl, max_lvl);
VALUES ('Developer',75,150)")
SQLEXEC(m.lnConn, "SELECT SCOPE_IDENTITY()", "job_id")
? "ID for added Job is " + LTRIM(STR(job_id.exp))
* Execute DELETE statement. Get number of records affected.
SQLEXEC(m.lnConn, "DELETE FROM JOBS WHERE job_desc ='Developer'")
SQLEXEC(m.lnConn, "SELECT @@ROWCOUNT", 'rowcount')
? rowcount.exp, "record(s) deleted"
* Call a stored procedure with no parameters.
SQLEXEC(m.lnConn, 'sp_who', 'activeusers')
BROWSE
* Execute stored procedure with an INPUT parameter.
SQLEXEC(m.lnConn, 'exec byroyalty ?lnPercent','HalfOffAuthors')
* Create temp stored procedure with OUTPUT parameter and call it.
SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc @outparam int OUTPUT AS;
SELECT @outparam=100")
SQLEXEC(m.lnConn, "exec #myProc [mailto:?@lnOutput ?@lnOutput]")
? m.lnOutput
* Create a temp stored procedure with INPUT and OUTPUT parameters
* and call it.
SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc2 " + ;
"@inputparam INT, " + ;
"@outparam int OUTPUT " + ;
"AS SET @outparam=@inputparam*10")
SQLEXEC(m.lnConn, "exec #myProc2 ?lnPercent, [mailto:?@lnOutput ?@lnOutput]")
? m.lnOutput
* Get version information.
SQLEXEC(m.lnConn, 'SELECT @@VERSION','SQLVersion1')
? STRTRAN(SQLVersion1.Exp,CHR(0))
* Disconnect.
SQLDISCONNECT(m.lnConn)
ELSE
? "Unable to connect to SQL Server"
ENDIF
RETURN
*********************
Il existe un excellent livre sur la question "Taming Visual FoxPro'SQL" que l'association AtoutFox vient de traduire en français. Tu le trouveras ici: http://www.hentzenwerke.com
ATTENTION AU LOOP DANS LE SCAN ! ça n'est pas une faute de syntaxe, mais je ne suis pas certain que tu en aies vraiment besoin (tu veux vraiment réexécuter tes instructions sur le même enregistrement??)
Vous n’avez pas trouvé la réponse que vous recherchez ?
kiratme
Messages postés5Date d'inscriptionsamedi 8 avril 2006StatutMembreDernière intervention28 août 2006 28 août 2006 à 18:05
Hi
j'ai essaye la connexion via odbc (vue) c'est effectivement très facile
le seul hic : impossible de faire des maj type ::
replace all Adresse wtih 'A'
ou
scatter memvar
&& calcul
.
.
.
.
gather memvar
les info sont accessible en mode Read
<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /??>
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"> </v:shapetype>
, pas moyen de faire des update
je vais essaye de faire un essai avec SQL Pass-through et mettre des "stored procedure" pour faire les update
@+<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
azraelinou
Messages postés16Date d'inscriptionmercredi 12 mars 2003StatutMembreDernière intervention 1 octobre 2008 25 oct. 2006 à 20:02
Euh, bonjour tout d'abord, et si je peux me permettre, il suffit de faire des SQLEXEC(Handle (Integer), Query (String)) pour faire un update des données et surtout, faire autre chose que de simples requêtes de SELECT. par exemple tout simplement appeler une SP, une vue ou meme modifier la structure d'une table...
En éspérant que malgré mon retard dans le sujet, ça puisse aider quelqu'un dans un futur ou quelqu'un utilisera encore Fox ;-)...
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 26 oct. 2006 à 09:10
Bonjour Azraelinou,
et merci de tes conseils.... mais dis moi, Visual FoxPro, tu connais vraiment? Et les settings de SQLSETPROP qui permettent d'aller au delà du "il suffit de..?"
Et oui, dans le futur de SQL server, on utilisera encore beacoup FoxPro, parceque c'est le frontal d'accès le plus rapide pour accéder aux données.