[SQL] Update

cs_erwinn Messages postés 3 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 29 mai 2007 - 29 mai 2007 à 10:37
panterga Messages postés 67 Date d'inscription dimanche 27 mars 2005 Statut Membre Derniè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.

Quelqu'un à une petite idée?

Merci

10 réponses

michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
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)
0
cs_erwinn Messages postés 3 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 29 mai 2007
29 mai 2007 à 23:09
Je travaille sur des dbf.
L'utilisation des recno à permis de solutionner mon problème
ex :
update matable set champ1 '1' where recno() X...
0
panterga Messages postés 67 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 5 février 2012 1
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 ?
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
panterga Messages postés 67 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 5 février 2012 1
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 ? 

merci de ton aide vraiment précieuse ........
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
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).

Bon courage pour la suite
0
panterga Messages postés 67 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 5 février 2012 1
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
0
panterga Messages postés 67 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 5 février 2012 1
13 mai 2008 à 21:42
bonjour
est il possible d'ecrire dans une base oracle à partir de foxpro ?
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
14 mai 2008 à 11:53
Oui, bien sur, si tu as la bonne chaine de connexion.
http://www.connectionstrings.com/?carrier=oracle

Ensuite, si tu utilises SPT (comme tu le fais), il te faut vérifier que tes requètes respectent bien les particularités du SQL pour Oracle.
0
panterga Messages postés 67 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 5 février 2012 1
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 ...
0