cs_erwinn
Messages postés3Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention29 mai 2007
-
29 mai 2007 à 10:37
panterga
Messages postés67Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention 5 février 2012
-
14 mai 2008 à 12:47
Bonjour,
Je travaille avec foxpro 8.0
Existe-t-il un moyen de faire un update sur un nombre limité de ligne. (je veux juste mettre à jour la première ligne remplissant ma clause where)
Certaines bases supportent le :
Update table set bla=blabla where ... limit row_count
mais malheureusement la clause limit n'est pas supporté par ma base.
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 29 mai 2007 à 20:56
Bonjour,
tu travailles sur des données dans des dbf, ou bien tu attaques un serveur SQL Server?
pour un serveur SQL Server (donc en transact SQL), je ferais qqchose comme update blabla WHERE mavaleur IN (SELECT monchamp TOP 1 from... order by monchamp)
panterga
Messages postés67Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention 5 février 20121 3 mai 2008 à 09:39
bonjour
michelatoutfox je reviens vers vous car vous m'avez beaucoup aidé mais là je bloque depuis hier soir j'ai réussi à me connecter à une base oracle XE en locale
si j'utilise le designer j'arrive à lire ma table et récuperer ; pas de probleme; mais je voudrais essayer de me connecter et lire la table par prog voici ce que j'ai écrit :
STORE SQLSTRINGCONNECT('dsn=XE;uid=HR;pwd=hr') TO gnConnHandle
IF gnConnHandle < 0
= MESSAGEBOX('PAS OK', 16, 'SQL Connection Error')
ELSE
= MESSAGEBOX('OK', 48, 'SQL Connection Message')
STORE SQLTABLES(gnConnHandle, 'TABLEPANT' ,"mycursor") TO nTables
IF nTables = 1
SELECT * FROM mycursor
= SQLDISCONNECT(gnConnHandle)
ENDIF
mais j'obtiens une liste de table dans mon cursor , je vois bien la table qui m'interesse (tablepant) (dans un champ: table_name) mais je ne sais pas comment recuperer les données
qui sont dedans ( champ :nom et ville) afin de les transferer dans une table foxpro .....
d'ailleurs est on obligé de passer par un cursor ?
merci infinimment pour votre aide précieuse ....
De plus je vais devoir me connecter à une base distante par TCP (dont j'ai le HOST,le PORT) mais puis je tester avec les mêmes codes en local sur une base oracle XE ?
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 3 mai 2008 à 12:29
Bonjour,
tu établis ta connexion correctement, et tu récupères le handle de connexion comme il faut (gnConnHandle).
quand tu fais un SQLTABLES(), ça te donne la liste des tables disponibles par cette connexion
Si tu fais un SQLCOLUMNS(gnConnHandle, <le_nom_de_ta_table>,<le_nom_du_curseur_de_retour>), tu obtiendras la litse des champs de cette table.
pour obtenir tes données, c'est l'instruction SQLEXEC que tu dois utiliser:
tu prépares la commande SQL dans une variable chaine, par exemple:
local lcSQL as string, lnResult as integer
store "SELECT champ1, champ2 from ma_table" to lcSQL
lnResult=SQLEXEC(gnConnHandle, lcSQL, "curseur_resultat")
Oui, tu es obligé de passer par un curseur, c'est l'objet utilisé par VFP pour stocker et manipuler des jeux d'enregistrements (c'est d'ailleurs très exactement ce que signifie le mot cursor). En VFP9, tu pourrais aussi utiliser un CursorAdapter, qui est une forme plus évoluée du curseur.
L'avantage de la technique que tu utilises (le SQL Pass-Through), c'est justement que ce que tu écris seras réutilisable sans rien changer quand tu te connecteras par TCP. Tu n'auras que la connectstring à modifier, voire même simplement le DSN.
Est-ce plus clair maintenant?
Vous n’avez pas trouvé la réponse que vous recherchez ?
panterga
Messages postés67Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention 5 février 20121 3 mai 2008 à 13:53
merci pour tes précisions ,
par contre j'obtiens un mess d'erreur sur SQLCOLUMNS(gnConnHandle,"TABLEPANT","mycursor2") (invalid column....)
et je ne trouve rien concernant l'aide sur SQLCOLUMNS ds vfp9 ?
voici mon prg :
STORE SQLSTRINGCONNECT('dsn= XE;uid=HR;pwd=hr',.T.) TO gnConnHandle
IF gnConnHandle < 0
= MESSAGEBOX('PAS OK', 16, 'SQL Connection Error')
= SQLDISCONNECT(0)
ELSE
= MESSAGEBOX('OK', 48, 'SQL Connection Message')
STORE SQLTABLES(gnConnHandle, 'TABLEPANT' ,"mycursor") TO nTables
SELECT mycursor
browse
A ce niveau j'obtiens la liste de toute les tables d'oracle dont la table TABLEPANT que j'avais créé sous oracle XE
=SQLCOLUMNS(gnConnHandle,"TABLEPANT","mycursor2")
A ce niveau j'ai l'erreur : incorrect column format
SELECT mycursor2
BROWSE
LOCAL lcSQL as String, inresult as integer
STORE "SELECT NOM,VILLE from TABLEPANT" TO lcSQL
inresult= SQLEXEC(gnConnHandle,lcSQL,"mycursor3")
SELECT mycursor3
browse
lors d'une fin d'appel de fonction SQL perd t'on la connexion ?
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 3 mai 2008 à 15:40
Oupss! désolé pour SQLCOLUMNS... j'ai oublié de te préciser que si tu renseignes le paramètre "curseur_retour", il faut en réalité passer tous les paramètres: le 1er est le handle de connexion, le 2ème c'est le nom de la table, mais le 3ème doit être soit "NATIVE" soit "FOXPRO", et le 4ème le nom du curseur de résultat.
si tu choisis NATIVE, tu as le type de données sur le serveur, si tu choisis FOXPRO, tu auras le type de données qui sera mappé dans ton curseur.
Il y a un certain nombre de fonctions qui sont mal indexées dans l'aide de VFP9, et SQLCOLUMNS en fait partie; tu la trouveras en passant par SQLTABLES et en regardant le "See Also".
Celà dit, si tu connais déjà le nom de ta table et le nom des colonnes que tu veux récupérer, tu as seulement besoin de SQLEXEC.
Et pour SQLEXEC, je te conseille d'utiliser le 4ème paramètre (aCountInfo), qui va te créer un tableau du même nom qui contiendra des informations qui peuvent être bien utiles. Regarde l'aide pour les détails.
Et enfin, non, la déconnexion n'est pas automatique à la fin de la fonction SQLxxx. Tu dois passer par un SQLDISCONNECT(gnHandle).
panterga
Messages postés67Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention 5 février 20121 3 mai 2008 à 16:01
merci beaucoup
entre temps j'avais progressé , il ne me reste plus qu'à comprendre la différence entre ceci :
STORE SQLSTRINGCONNECT('Driver= {Microsoft ODBC for Oracle};Server=XE;Uid=HR;Pwd=hr') TO gnConnHandle
cela fonctionne
et
STORE SQLSTRINGCONNECT('Driver ={Microsoft ODBC for Oracle};server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=apex)(PORT=8080))(CONNECT_DATA=(SID=XE)));uid=HR;pwd=hr') TO gnConnHandle
cela ne fonctionne pas !!
je n'arrive pas à comprendre la différence et où trouver le HOST et le PORT sur mon oracle XE mais bon je te remercie encore à bientôt bon week end
panterga
Messages postés67Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention 5 février 20121 14 mai 2008 à 12:47
merci
j'utilise update en sql cela à l'air de fonctionner pour un ajout d'enreg je n'ai pas essayé pour une modif , je pense que cela doit être identique .
encore merci ...